ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGYxMmM4Li4wMDAwMDAwCi0tLSBhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgImNhbWVyYSIsCi0gICAgImRybS8qIiwKLSAgICAibWVkaWEvKiIsCi0gICAgInNlcnZpY2VzLyoiLAotICAgICJzb3VuZHRyaWdnZXIiLAotXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDc5M2NiZjQuLmU1ODRmZmIgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTgxLDYgKzgxLDcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMC5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfc29mdF8qKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi92bmRrL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWcqKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiLAorICAgIGphdmFfbGliczogWyJ1cGRhdGFibGUtbWVkaWEiXSwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBmaXJzdDogeworICAgICAgICAgICAgLy8gRXh0cmFjdG9yIHByb2Nlc3MgcnVucyBvbmx5IHdpdGggdGhlIHByaW1hcnkgQUJJLgorICAgICAgICAgICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdG9yIHBsdWdpbnMKKyAgICAgICAgICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGliYW1yZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1pZGlleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJta3ZleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcDNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm9nZ2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisgICAgcHJlYnVpbHRzOiBbCisgICAgICAgICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAorICAgIF0sCisgICAga2V5OiAiY29tLmFuZHJvaWQubWVkaWEua2V5IiwKKyAgICBjZXJ0aWZpY2F0ZTogIjpjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisKKyAgICAvLyBVc2UgYSBjdXN0b20gQW5kcm9pZE1hbmlmZXN0LnhtbCB1c2VkIGZvciBBUEkgdGFyZ2V0aW5nLgorICAgIGFuZHJvaWRNYW5pZmVzdDogIjpjb20uYW5kcm9pZC5tZWRpYS1hbmRyb2lkTWFuaWZlc3QiLAorfQorCithcGV4IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtYW5kcm9pZE1hbmlmZXN0IiwKKyAgICBzcmNzOiBbIkFuZHJvaWRNYW5pZmVzdC1tZWRpYS54bWwiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1hbmRyb2lkTWFuaWZlc3QiLAorICAgIHNyY3M6IFsiQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIl0sCit9CisKK2FwZXhfZGVmYXVsdHMgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIiwKKyAgICBiaW5hcmllczogWworICAgICAgICAibWVkaWFzd2NvZGVjIiwKKyAgICBdLAorICAgIHByZWJ1aWx0czogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1sZC5jb25maWcudHh0IiwKKyAgICAgICAgIm1lZGlhc3djb2RlYy5wb2xpY3kiLAorICAgICAgICAibWVkaWFzd2NvZGVjLnhtbCIsCisgICAgXSwKKyAgICB1c2VfdmVuZG9yOiB0cnVlLAorICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMua2V5IiwKKyAgICBjZXJ0aWZpY2F0ZTogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmNlcnRpZmljYXRlIiwKKworICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCisgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtYW5kcm9pZE1hbmlmZXN0IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgIHNyYzogIm1lZGlhc3djb2RlYy5yYyIsCisgICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCisgICAgc3JjOiAibGQuY29uZmlnLnR4dCIsCisgICAgZmlsZW5hbWU6ICJsZC5jb25maWcudHh0IiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogIm1hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKK30KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkiLAorICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEucGVtIiwKK30KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgcHVibGljX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IiwKKyAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIiwKK30KKworYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKK30KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbCBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY0NTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhIj4KKyAgPCEtLSBBUEVYIGRvZXMgbm90IGhhdmUgY2xhc3Nlcy5kZXggLS0+CisgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorICA8IS0tIFNldHRpbmcgbWF4U2RrIHRvIGxvY2sgdGhlIG1vZHVsZSB0byBRLiBtaW5TZGsgaXMgYXV0by1zZXQgYnkgYnVpbGQgc3lzdGVtIC0tPgorICA8dXNlcy1zZGsKKyAgICAgIGFuZHJvaWQ6bWF4U2RrVmVyc2lvbj0iMjkiCisgICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI5IgorICAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIGIvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MDg2NAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiPgorICA8IS0tIEFQRVggZG9lcyBub3QgaGF2ZSBjbGFzc2VzLmRleCAtLT4KKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgIDwhLS0gU2V0dGluZyBtYXhTZGsgdG8gbG9jayB0aGUgbW9kdWxlIHRvIFEuIG1pblNkayBpcyBhdXRvLXNldCBieSBidWlsZCBzeXN0ZW0gLS0+CisgIDx1c2VzLXNkaworICAgICAgYW5kcm9pZDptYXhTZGtWZXJzaW9uPSIyOSIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiCisgIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBleC9PV05FUlMgYi9hcGV4L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg3ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjaHpAZ29vZ2xlLmNvbQorZHdrYW5nQGdvb2dsZS5jb20KK2ppeW9uZ0Bnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvYXBleC9URVNUX01BUFBJTkcgYi9hcGV4L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmU5OGNjCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJpbXBvcnRzIjogWworICAgIHsKKyAgICAgICJwYXRoIjogInN5c3RlbS9hcGV4L3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM4ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wZW0gYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktBSUJBQUtDQWdFQTA2ZEtpRit4UXAzNlhjb3NtYWMrRHpKVFhDOW5iSHkwWXFmeSt6RUM1aGx3WGJIWgorMWdBWlp1OHpMOXA3a2JCa210U0N1bFUwTStjVEhyNzRna0c5VURrTS9TN1orOTU3RnpITXFXWFkwM2d1cEZQNworbGNDbkt0cGt6c3lRckFCYXZ5bm94eVk2ZGZtS1pOdEVGUXJpa0sxenM4MENwcFJvTXdaUzJkTG9nWDhxTzVMVQorZ0xlNy8wUFpCZGJRU1ZBNUFBUkUrQU82cFI1UHgvOFFBZXJlOVRDTGNtMWFLOUJVVk9KdmFBWkFmN2JEMmY4cworM0ovbEFOUTF0dlhYWnJGTDFpMjZINnNOamExMXU1L00wb2RnM1NmcUtJMHgvMzE3bkxrWXg4UVNTSFZLRWpCcworbnpzeW9Gcnk0SU5FaC9xN3pTRVg1K1MxVkE2T1JqeW9mM3U3Q3JHYXZyWXdJMms2eDN0K0RrYzJkZk5EYU5ZOQorOXZHWUQxbk15UnFVelNJcWFPejhxNzh0YzFBMzkxTHVhOFNCMUUwVHgvRm5zUGp4UGVlMHdaMXRhR2Rka1p4RAorY3ZNZFFKaEx5RTZFbG9pbUZpT2hrVmpuQW5sUFlpaVBFUWt3Sm9tRTlrQ3NQOWFNbXlod0JPcGJiUklTajF1YQorZWRFU3JwVEM1REhwdDFvd2p0QWZIdkQ4VGZtUFdUMUtTTjFpQ1FBdWg1aG5FTTVMTERsamMvQVl2SlY0TDV1UgorbC82dDVkRThkZWc5a3NZNmxWUnJVd0hzWHhVdEJQaE04MlBXU3JwQVBOSkNITHVCQlZ4K3pERC8va09tdDVvZQorT3lZSjJSY0RzbkxtRGZGTEhiUGNBd3V5Zm14UStwYkZCZmlMNE5hS29VV1J5MHZpUjQvM3p1bHlzQ3NDQXdFQQorQVFLQ0FnQXBoYU5JbDhWVnRWcGR0Z0VENzl4cjdNcVB4amo2L29nQTVzUHpaWTBWQ1I2VE13WHlScmkxQ2U0MworMEJ2MzIrd1F0K29obGYrVXd4dHNKN2puRFBDUDRYRmI1aW9ia0cwRGd1Q014dzgvaFU5Wks2U3FuMDNzU1VZSAorai9nOTFoLzNhc2hnOFczOG9RVDJmbEdmOHkrNWhGMnpnMSttd0d5a3ZmUFpDZGhWTjFaWXM1aCszQXpFcWxIVQorSkcxZVJKKzZFaHhacjVtWk5SWWZ2VGt0dHg4Z2FQS2ljek9DYnU5c2E3UEJhNkNSclpCRW54djArR1Zid1VYOAorYThSalFCc0puSlRzQzRtd0pyeDNINFYyTTlyYjZDMjI0T1JUSkJIeEVCcjliY2pNY0Q0a3pWMHg2OUlseFZIcQorbTdZQkd6NW1vcnhtNE9aMTVCa2pURmtlRVc4QzhiZHBScllvWThvY215YldVZjZnNUl4cEUzM002OTlsV3pkbgorK3h3UGxvSk9BNXNxc0RJWEdYdDQrS1BiMmhqSExwcVM0VjlSdzFKUUVyQmdCOS8wRUhxSzR1MWt3STEvZGplYQorTnkyNmVzR2dqbXVwcStNK0czdlF5c0tFWDhtL0toWVpLdzh5cUc0THJ6VUtwMXVvc0VYRWVFK0ZCblBXMWZ3VQorT2FwSlRBS0xEQWVJdHoyWXNaKzgyb1RNUkVLUjZnTm9BdzN5RjNkeG8vRTRzazNJREc0eTN3N0E4RDVkbEJCTQoraHgyZkRxbmllUy9PZmZHbmRiYmJJSUdIMFNiMU1CVVJObFpsWHdYejFoYkFDYzhGTVltbjRpeVFVSmZLbENmVQorUnAxak9SNHNpbEZ4RUdZaFNpMEp3NytBSmUxcHJaUnlaWXAyWlFRK3RyR3ZxUU5od1FLQ0FRRUE3Q3NhRHh2UAorTDlHSTh5RlZ6bkFHNVNadkl1dDMvbExBN2hkNEYwTEtKMjc3aFc4WU1FTkxqdm1ydEVRVzFkeVFxUVhWK0NwTAorUUVydmdSdVZqOUR5VjZxT0tEaW1tcHFoVCtZWmxieHA5OE45QmE4Uko0Y2t3MDd2UE52Z2xUakFlSVp5VWJSUAorVlg1T25yL09GdzY2R0x6T0loc09uUmxxdmlPS2cyd20xa2ZCRjNPQkF3VmN6cWg0UEo0Z2MzcmJXOWpQTjNwbgorZWFvdVY0Q2RHSW9vWGNrVjZYdFFDR2pXRk5OenhtdWtubjFHYkxiSHNsR3VEVVg4OXJRc1JzazlxWkdwaTFNMQorQ2YyeWFRWTBkK0FqRGRQc2xYS1o5MkViREFtbzNLR3RveHkyaFdXeXRaSGJVaHRXZ2d1RXd4RE1rSmhKMHlDTQorWlNMUVoyVFhsQy9pQ3dLQ0FRRUE1VzB4dU5Ub3piMlVyd3FFYURDa29neGdkdjVOZFF2bHZCTTcrZkQ0UnBPWQorSXRERmN1ZGh1YXBucHhkYlByZGwzRjViZ1RYWko0aktNSUtlUFZ2ZXVnSTd3TkNRWDdhU0VUM1UwUWo0N1J6QQordlZWSGIwSzNTWnNpY3BLN0swNjdFamsxZXN4clByZWFUblVqMTRqVWxlMjBDcSszaXlzSm53TUZzMkRrbUUxQgorVUs2TWlCSjErTWJGdUJBVHc3VFd4dTh5UHlmYTNKelVBRXNmUDhOcXFJbFhySzI2RGRHZWZkOEMwaHlzaXE0WAorM21hdFozU0RjazFtQ2s0TFM5UENaWmxEcWR4TE02L1VJb3k0Y2owcWJTUGRGTW9wOHpqQjhsRi8xT0FCb3drVAorZS85TDBkcEcwOEczNWFFSko2dktTR25GTGJzdGdseTE2NVBsR2FwZVlRS0NBUUVBd29TaHV3NEJzWFlaSVlBMAorWjRzWDhzZWNSQnZEd29Ld2k2cGk3RzNEaVlVOHYyT0lmYi8vek94UmczR05pV3BZOEE1eGRTeUl2SlM3L2hBVgorT05ZMXRRVXlmMmhodVBkaHBDaDJyRUQ2MnVwMTRDZVlyb0QrUTZ1Ukd3UlRUelRtT3A4cUs2ZWlyRjBUTG1mMgordkVFU0FHd0tNRWN1MnpCakhlYXlJSnNFeGZ0bHpBWURuZFJkNDQwWk0zeGVhQjhwNjlXQW4wWS9VaE5jaGcvVgorMUs5K25maVJCclRkYjMvQnpIZDVaVldseWpDT3Y5NHdUdXc5dW9zSjFyMEJ0dS9yek8yL3dwU3ZHK0tNZnpwdworSHNoS3R3bjFWQWFIVUJ6NEpRc1R2VjJoWWJhMWt0djN2TnM4MUx6Vm5Oa1Y2WUM5ck43eDkyWlluTGgzQktJbgorZWRPU2p3S0NBUUFQNTF6ZUFpeE5Mc29peENqZmpCZXRnQXdqMDRjTkNSRVkwNENCMS9sdDh3ZEZ5cEVWWVFLKworT3hqS1ZXMG0wTkhIeithcDgxQ2xVKzhvSTdYU2JRN29lQVVxWFlyVWg3UmlhNVhZRTdZbHdhdCt0RzJxUWNhdworM0ljcnlBNGZkMnF5WGJMZVcxTkgyclJnb2ZBbEhjQVcwSTU5ZXliUEIrRzMyeDdIQzMxdExWWE13UHpPNWZDMQorbVJuVm80K3JMbHNCR1UyellSRGo0QjgyRWY4TmpYOVVSWWtGV0ZtZ1lacUtBUzZSNEJqNTJBMmhoaDZaSUZPSQorVmVNdjdhOE14NVlmTXR1azU3ZHkwc3B5eHF4Mmh0VHRFZUplY1pFczRnOVh1OXlQcGlPVzZLY29IazlrTWF4ZAorTzMyQzlvSEs5VGFsaEdkOXZ3N3RqWDJ5NGVLc3Y4bWhBb0lCQUJFdEpTalE1NzFZVWJFTHZKZ25WSUxXS0V4agorblVSbmJROEMyajJsTGRiMjBmaThVR0pEZWk5ZzJiMm9DczNTZkNhTWNScW9PczR1eThaSnpvZlBlbHdXWTFCNworU1plem4vMmQxUS9jWHBhWGV3KytrcmhGdkpGVnh5YTZlTEQ3cHZFVlFBc0d0a3A5QlRpMkNGSWhjR281VVFkYworcHltN1hqRnNXMExDSThtT0FsZXVZZTdERXBFVTc5UmRzZnhnUXBlaDFOZ0ZKUnB1cEhUNkkyQmtWaWpEL1RJNAora2J3ejExU3V6bmtVVEI0UWVQSXduRXpWK2dxRHRsbnk0TTFRdnNrOGhxY1U2SlVPdStNT1QxcW5JNlpHU3NkUworRDZSaFB1a29yZEM5eS9jYmlWNnFxS0JWWjM5Tzh5ZFd2cHRvL2c3RzdmU0w1U2RkRnVWUm53QVY3Vmc9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY3NDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3OWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktnSUJBQUtDQWdFQXZCNmxPRUVPUjU4S01jRmxheUVaanNYdVBnY2ZIaS9PUHhjdmZwaUdMQ3BPY0szbAorT1BDaFdVdkRSY0lITUI3Qk8rQ3NmeHMwSGdzSHZ2WmZOeW9OSW05OVdjakZiYm9pTzdXckJCQXJJc3pQcjE0WAorY2ZZMk54elQ5TEJqK0VxQW5iZEwrNE9RVzEvbnBMSE5FMHF0RGN4TDcxaXBialN1S05iNThFOXFHTDBLd3ZrUworZnd3dWVXaisrYmcvaXo3ZHEwbXo3aUtwbnhZc2NObTRSaEpqcWNHMlVzbWc0RWpocjhoNVVtT1VtVEpiT2JDLwordnpDbFhRcWVldXpTOE5UdEdWZ1EvQ0k5Z0MyV045dXBxMnAvMlQ3UDRVM28zQ1d2Qnl0VW9MS1IwVXlDODNleQorUzhYSmdPYTQydVdSM1QvZUpPSTFaUzRINlNyZzFvMlhDOFliOEVwckZJL05NNi8rLzVEWC9GZ0RpbXNzbEFQNgorUXE0K3BTdGU5di9GaldHcXk3UUJRYWVmRlJHUnVTNjN4SGNTWmhYQzlKMkNGZG54bzgrNjVRVDhyNHlmUUVlaQorQXgvMFE5NHlCN1ZJTDFwSUp4SEVvbktqdGQzaUtkRkVLUXpBREozZWRzbXRIeWJFUmRKS0N4Y205UUlyRENzQworNFlWVDluWDBPb0M5UkQ1ZDVFVkQ3VzVJNmVFblJ1NmlncktJS2dVVnBwZVlGUU5aRCtvK2VpTkphNHlvZ2dSbAoraDhzVDAveExLak1SeEFRN2ZhZmkxaitMQjJPN1VnSm1JRERBbmlkcThBb3o3aDNwTmkxMzlyTldyak5md2h1cworbk1jWnZMOWRUVnYyNkpXZUVTSFAvekFmQVg3ajFyZmtEd1IwMm9jUkxxdXdFVXMxK1VIQTI3V2kxYk1DQXdFQQorQVFLQ0FnQU8zUFQ4M3RiNy9hcldoNHMxemFXeFRCNG90SE5XOVR2OGJCNktpQTZCeXMzcnhUR0pNQ252WGpjTgorZWVrTGVrS1dNb2d1ZXIzQmFlbXd3dEovRDBsK1lRU3NaVnFEOHVMbGlOTDhQVExMU3hkVnFiOThkNUdOQlRBUgorOHlYUzVrQUhOZ1pBMXdJKzFmTDlaamJud1V5dS9HYzdmK3ZURTBKM1k1VFgwYzUyS2VtQndpQWQvWjVtWlU5UAorOTZpOW5iZng0cDdldjhwYkVXdHRkeVpDRXczZ3liZFlEeW93emxGV2pDWlp4aGhsaWo3KzdlSVlmd1Z4dG5jVAorQzBjWFZCdHZseSt3WEJ3ejFtWTUvNWNHUGlIZnprQ3FjbmRsZld5NHlrbWpjTGhvcXZ6bHM1MVlzMFhhYzJCRAorbTBQTkVWREI1VVdHdXY1UkE5eEQxMmdKdkJ0VTNEN2dnTXc2QzVSY1hKVCtqU1ltU0Z0RDJrbFdpK0l0OEEvTgorSHY0MnNvS3NrdDZKcVlBV0UxY3ZKM1BFcUg5QVNFSk5xMlIwWi9QbXVNMDAwVUp5elU5S0lkM1NOd2pYQTFYYworS245aFJnYTR1ZjllbEhUamtURHQ3OS84K1h2N2hqZXI5c0YvUy9ucDdnMDRyVWpJV2t1RmtDLzdOSzJ0UVNoMQorbWxqVjFzRDlTRjREUGZWSzc1THdKSmFRVWxJN1R0R2Q1S0o3Rnpad3ZiK3c4T0RycFczaGt0NkZjSTZLd0UvYQorUVQxVDJaOURrblhKU1lOZFdHcmo2dk1Ic1lNaXl6OElkQUhTQ3JPQjZlWENReHBpdGJuNlc3MVJhdzdmOVVhWgorVkRLNUFoVFU0OTNoa0dqMW5vNGNKd2VjWEluTWlnZy9jNHl3azJJYmg2SVY4TzBua1FLQ0FRRUEyK2RRUTBJRgordnZWZ21RMld4SEJEN00ybWJPeWY0M1lCWTZLYTZvUEJOR1BWcFpFOFg4TG9UYXZRTFYrU2dDa0g4VDZnWTdYUworNUw0WmUwSkZ4ZnVhMG8xcm02K0wyWHJPeDVGL0EyWTQwWWNQY2xFaWs1aDF3b1N3SC9KMWlIR2lFaFk4TnFldQorOUdDdmpRb2prZ1h4L1JuM056K2xwdlozMjlPM0g4NVJXV0dGMGw2MFJ3TE9raWcwWndVYjYxOXQ4YWZmbUdJbAorc3hkRHYybmZ5N090Slg4aUdEdWE3S2Y2NGR2VldRS0t0QUNXa0FScmxrY1dYM3VvRVN4a3BTRHh1ZSt6N25kSAorbzd1SExmTThUeCtSbitRdllXdVJXNVRQTGJFRE1iSVlyWDY1SVN0MnIvVDd2LzA0WGRBQzhZcENRUnl0bHFQSQorZnBEbTE1aHR5SEJpelFLQ0FRRUEydis1b3RSb1k1NkpkdUlTYVZHbHNKL0lidkt6REFJeVdtTTE0RXBSQ1I1RQorbHUrTXBUY1JBaUZRQWJIR1hyMXRNbFRGZFZGRDA5MFdBeklLYUt0QURGVkxYb2JJSGVHc3BuUkNxNU9wVnA5VworUnZMdFZ3THhmbEhBYzJ5TjkvTE50bkJxSFVndCtTMDFMQlBFbHliZEdIUVJUdHFBS1hoa3AzMXNNMjFPMzRHbworUHJpL0l4Z3VwV3h5a01hVzQ0S2lnMUNyNURLdmM4Y3dVc0d1eURkSm04b0JRZU5QVE1XcVNuWHRxb1RXU2FZZworMmt4aU1URm9rcmtTWGd1ZmI4d25nNk9YdC9RZWx5d3JoRzNoQXNsZFBPM0dkS2lkRFN4aFdaU2dwVVhYRmRBWAoreTRHTzBJY1JKQkYvV0p0WVRZdFIrbDg0blFBMi8xWWU0dWpGbFQwYWZ3S0NBUUVBbVhyWHBTbTJjdkkyQ256VworaHFKSWRrV09hNlczYm4xVk9PSXJ0NVJmeTU0R1pubDRwdW1WVTJpZ2NwcXEySEpLemRERkJ2TEhqOGt5WmJuNgora3RVcDJOekZoeks5cS91dnlOQSswdk9Nb29qZWVnNHcwTXp2RytXYU82SHc4RnRISDlLUEVpSjAxTEdLdFNpbgorYk9walhDQzhUNzVIY3NIQkpCZWZUejZqdm50M2VEMkxHNmpVM21QYk55LzByWkc4WFphcVUyUGxKaHNOdU5JLworVmFCQkw5T015MWNHcVRnUXZZUytZbEtJMWxzMnVxdXJINGJjRWFadnhoU3k1aUdaTlFvZERrb0lJVG5vZm1TdQorNmhhQmdCUTJFWXVQTjFra1JLS3dOUVkxZlJuZVFrMWdtQ3luYlBkaVdPK3Vya0N1UDEyeHRscjN1NGFNNTFyRworL01lYjNRS0NBUUVBMTJTeFptOVhoTE9ITElCSjc0QTRZTEdtNTBpWnhYUGJwbjd4bkhvN25hWkJlOXA4RUh0SworcFRleWd4Z2dyVW5PUHJTVnlUOTJZTWlRUC9CVndJQythK0x3VURac1dNZC9rZS9ES3hIK2VZNFp3NHBtMlMreAorNmJYcWZSd0Z2aHIzTFRyL2czRmNsamxhbE5HVWg3M1hzNWRrOXBOOWZreEZZMTYrcnc0UmgwNzA5VXVyNG82RQorUW51WmFyK0g1SmkxMGtYajZudlhpUjRlYnliRUMzUWxWNjZrOGZMcUtlNDRBU2hmNjFqZmtteHMzNGhGQTNFLworRXlBbjZvdXY4cnR2R2RBckJ1aDV0ZUhobzB5WEJMQ2NuYktYZ0dIZXBmaENmMkxwWmVSOUdaMGo2aXF4Rm5QaAorN2dHdnFLeVJleU5PSzl5L3g5dFFQRzZ0eml0M09jTnhiUUtDQVFFQXVEaGVET1NrWFBvcFhNdkxBS09IQklkWgorcmJRN29GVERIdDU5Z2J1Y003VTgvbDJZdGF4dUtPUUZCTG56UWEvYW1Ja2tydGtsWXdPc3o4RTI0ZDdObTM5dworeWtMSHdYMFhybWpBbTZNNFhLbUR2NjZhK2tTblNWNkxFYktaZGp2WFAwMkRWK3RHZVo1VnNuTnZKRHF1eE1zRAorZnZSVHNwQjhqOENwVTk2c3pla3hsL3RDUmhxYmR3LzRrVlRTajVCRisrT2FSUmNKckF5ajFCMnFmMXluQVpFMQorZ1V2VlBrRVlhOTE0emNyeGc5WElYVDRNN3lxQjdpOEtKZWdPdE90Y1dqSjd1VGlQKzYzOEF2eWdKTE1KblNyVgorK0hqRlpXRzZQOWJ0Wm1MSFNFQlJ2d0dPQWlscDBxZWpYbzg2NmwwZm1ubEd5N2VoS3o4dTNQenZubFBZalE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I5YjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCkBAIC0wLDAgKzEsMzQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjNqQ0NBOGFnQXdJQkFnSUpBSU03MkpwRDR2NlhNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERWlNQ0FHQTFVRQorQXd3WlkyOXRMbUZ1WkhKdmFXUXViV1ZrYVdFdWMzZGpiMlJsWXpBZ0Z3MHhPVEF5TVRFd01qRXhNVEZhR0E4MAorTnpVM01ERXdOekF5TVRFeE1Wb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eQorYm1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBdworRGdZRFZRUUxEQWRCYm1SeWIybGtNU0l3SUFZRFZRUUREQmxqYjIwdVlXNWtjbTlwWkM1dFpXUnBZUzV6ZDJOdgorWkdWak1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc3FYRTBBSVdwTFc5VGdxMgorblFHcGg3S1o2TDJROW94dmlxQ1ZIeElhUHFmaE0yU3dUYnljQURJUWVxcnJsUnhoZGRWa2pMdU1Va0phN21ldgorZkVSbWdwaU9mblBJbEdLNlBUczJnbGpDa3NrWmhGM2JnZmV5dUh0MHRzWU8rVWFOOE1Wb1pENy9RZGlFNDZ3MgorT01EQ2xHMVVxZ2lxT0JoTFRFTi9jSFhPYm5VaWlWWFVZcU44YVlaZjZMNkZzM3lRaTJaWmdmYnhUVkZld3FkdgorYUxMT3FDWW5WWVhaSCtaeGJYRVNBME0rV1hLZ1JLc1lUajJHWXMzZWtvMXJGaTRZNnVIVkx4NDV5YW9UNXUvaQorU3hQRWtvY3lNQ0t2R0pXdTRYbFNPZDNFalNPTWFxQ09ZVnlHTHhkbG5RV1FVN1BaRHFCU0owU3lzV2dwRkhwQgorSTE1YzJqaFJkWE9DZlE5WnREZlBaa0UwYTJBOGtKREFvRjFtelRwNkl2QkFXVXNsNW5IUHc1Q1drRnBOYWQvaAordHFxR0NTY1diaUtadXZyUTQvUlFObTNmMUsrbXhYOVRyakZpZ3BxTk82ZDRwR0FvMWZhNnNIUjN4V1B3L215cQoraDVaSmpWblhVNVlxNjRTNHhXT3NzZmpwT2c3UmZOdXZ6dWszb2szTVlzMW1ieDN2aFpPajVrbTFmM3FyZ1g5YworbVhqWW55WEQwakpCbTR1QUpXWExkSzlQbFp2bFhienRNQ3pZajgzMklvNHBGTEN0U3hrelg3NXQxZW0zNk52MAorbU5wNk50U1N5NlNGU3E4bDdJc1hWMkZOeVVpeUhXeFMvVVFtOHBZZzVRNWRXSHZFRUY3OFA2bFYwd1JhNkZRbAorQkJTZ3BxVEFJMDkyS0lqRER0QjdHUUNnVjVFQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZBRklkRlRERURmdAorZXdTU0FTN0ZhM09aNVRYek1COEdBMVVkSXdRWU1CYUFGQUZJZEZUREVEZnRld1NTQVM3RmEzT1o1VFh6TUE4RworQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQzVlM3pYeXRoSkNHbXoxRm1BVgorOFkvVUkrR2xnNkcweC9rMDRXYVJHMERQTExqbEoxRjBMTTEvSVJlQlNnWGNZQUwwQ0FnUHljZi9yR1BPZ01GbQordFF4WXlqQlV4S2RqcElxVTVESm9WMWZlYW5HdmVJUnB0bzFZUktOZ0h1ekc5clpHUjRBZ1BudDZYNFl4bHEwNAorbEk3UXBXYWRYZTFteUFSSmhqM25pU05ZOSsyd0VJbmt4NFp1Q08xTHRJR3FuYmRjOGpROFlvVnFJRTVONGt1TQorY2N5UFlnc2RBQnRvcGJqTjkycnVldThzZkY4UjZST3krdE5nYjZPanBBQWV2dG5CZloyTFhxZk9iS2lySENLKworazZ3NFdTQjFVVW9aM1hnejhzSnRYZ29rdlllSW5rTjh0SHVUYWdIWVUyVlFUY0EwcmRCR01OLzFPbGpKcFdsTgorMFVVcTRmQVlVNmNONGxIeHIyTE05SWY0V3ZBemRMQVd2YUlackRxYVU0aS96WVQ5bDZyUjRsQzJLVzNFSFdvdgorblBYZmdFSko4QVAxaVJHaWJ2ZXczaTNTQjZYVFdGUVlUVUlCZUpmRHovS0RYUWFiUCt5elhXSVNkWkNVTVVweAorZitSYXFzYjVNb0thSmRWZ25TTDBtQnVuakN5SkR6emczNEo3b0d4Ni9CbndvaU9yd0xONFFhejVVOGpiclBTeAorcDlMZmxlQ2NPN1pkZUU4R0txeDBYMVQ0ZDd0cmFkdG14T1M4SXdyNG5pc2trSEdSa3pvenZWdnV5R0ttb04yaworMTYyVmZqcStkZGo3cUVwU2gzQlM2aEhVK3ZsTWJDOUwwdHJHeFB4RkVBSERyd3UwS3dHTmR1VGtpdS8zanZmQgorSlRnSDhQOW1EMWxvWXhSZG8rdmV0OGVRCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpAQCAtMCwwICsxLDMzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ6RENDQTdTZ0F3SUJBZ0lKQU8wNURCQnVzYWFMTUEwR0NTcUdTSWIzRFFFQkN3VUFNSG94Q3pBSkJnTlYKK0JBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQlcKK2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3RGdZRFZRUUxEQWRCYm1SeWIybGtNUm93R0FZRFZRUUQKK0RCRmpiMjB1WVc1a2NtOXBaQzV0WldScFlUQWdGdzB4T1RBeE1qVXhOekUzTVRkYUdBODBOelUyTVRJeU1URTMKK01UY3hOMW93ZWpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RmpBVUJnTlYKK0JBY01EVTF2ZFc1MFlXbHVJRlpwWlhjeEVEQU9CZ05WQkFvTUIwRnVaSEp2YVdReEVEQU9CZ05WQkFzTUIwRnUKK1pISnZhV1F4R2pBWUJnTlZCQU1NRVdOdmJTNWhibVJ5YjJsa0xtMWxaR2xoTUlJQ0lqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW1Oa1Z4VWJwL2JMYmVHYnZLcVlYendCeWNTRHBtT2hoLy8vbE5HWVEKKy9BTVVEMHE2RWFaelUyYmQ0YUwwck9HcWZvWWxoS2Qwa01WbU1VbWZkRTlPREFmS3hsZUVlRWFSbDJHSlM4YTkKK0FCaTc3MGwzR0hiQjJ4TUkyc0VXZU9EOXhzUEZGNitCeVBabW9VdU5oTXI0cFViWHNEcEUzaDhsanJnWEh0SWcKK2JoN29mYnZkZHJ1d0JWMGxTMWs5T1o5alBWR2hFS2tKbmhnUWE2N2N3Z2RqaXpBTWJJMERjejlndE1NYXdzRGoKK1oyYVFkMXIrdnhnaDEvWGtJL05NbVhDbkcyRVJ5dFhjSmVDNVM0Z0V0SGZUVFBvUDBGdVZnU0I2eTZkYWxNdVoKK0YwTkJadzhNdmdkeTNRSmlwMHVOYTM2SjYzQ01aS1RKV2JUZGxGcFBMMmhrMFBnYVl2amU4QzVYdGs1Mjgyd1QKK2RNb2NjOG4yeklYYnpiblNYR3ZqY05aaWIzUGZ1NTVZVW5YNmVUcVoxQnhsSjBGSFpBc0M0cXVGRldYeFlCWUQKK0xDUm9OTkZFdElEUXB1dnVIRjJEdUhORFVMcEFRankyeTYrN2VvdDBLRXNWb0RtWjRIOEJwdUFWVnUyU3hZTmIKK2dZZmxSOVNtTTB0bVllQWNSVDQ4cTN4cm9jR3lFSE1xdmdRUlVwUGZ2Y3QvOGw4eFZjRHpPSS9zSlZEcW1Zek0KK3UwQ2ozZmtTeXBHREpPTUYvZXNGU21Wdm9JMDF0UzdrYU5TNXZ2dEtZaWIvL3hxS1JDOWYwZENzR2ZGTG51VUsKK280S1liWVdZd015SnFFZC81L1p2WHlLSVBBRWVKTDE3NEw5K3dUa2MzY1Fwb0J3Sk40dCsyRTVNbmhPRXE2ZG8KKzVMMENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUI4R0ExVWQKK0l3UVlNQmFBRkhqTksvR1prbzFSZFpwKzhpYXZXWEw1eHo5d01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFTEJRQURnZ0lCQUNtUFFNa3N1THJOVjF2Ykk0NFMxZjcwSTBGSGRCeGNoRkdCMzl6dUxiY24KK1NzWW9tL0xQdFlKaUQwRGw0YkI0ZWIrWm54a1FQMlhlUDZweWNtVUgyajFFV2V4Rnd2ZFV2bGZlOFF6K3dBZWMKK2FwNEF4aVg0WjJLZTJpdllvdElaRlVIZFpPTGtYMjBqczhXZXgxbXpZNDNNTFFuNUFQbDlnSzFWWlR4RGdnZVIKK0VPYkgxUytKVmpHd1FxWVpqMmU2Z05aSDM0UTI1TlE2OThSTDg1R0RrWXRTSVNBaWZKdGFKc1UvQjN2S204MkkKK2s5eE1pQ29vQ0g2YlJkR0hHMWp6ZTRTUnBpZGp4RW04Y3hraWFRYWdmY3VYZUNMemlYSnIzcUFNS1lpRVk2YnAKKzArYkFxQ3QzUzhPcnJOM1JRWmZRcm5sd2l0c00xakpKLytDK1dvRGc0ZVk1QUZyWERMdk5lS2gxcU8vZjh4disKK2ZDWGtRUGNWVnBoTGZSSDlveE5yU2dPV0JQNS9xSURINHMxWVVMOWx1R1Q2SCswOGRsdWUzUmtiekRiQnFzUXUKKzdmUS9CYnJJRy9HdVZLZ3lFTSthN0M5Z3Y3emM4NllsdWVWWUpFeXhLaWRubjdSeE9xeURCcXl5ZlhBM3p2bWUKK1Jybzd4SXJNSFBMN051M0FXandqWHpicC93MHordEVGUHNmVkIrT09IS3NXUGNVRzBIVVRKR2t5ZU8vdUhSak4KK3FQRWtrZjdCSEhVTzRWMmdqT0lkQ3NFTHhLd0hmN3ZzWlRPazQwRVY3NTFmWjdGREhNcjFlZGRRa2dINGVxQWIKK0RCNzl1UCtTTGZVbys0Mm40cTZlTW1vcXc4ZDc2YkJYUm9VaElvL01zNHNlYmhWMHNSdEFTNjdPUWlvYzlVVWcKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvbGQuY29uZmlnLnR4dCBiL2FwZXgvbGQuY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkzN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9sZC5jb25maWcudHh0CkBAIC0wLDAgKzEsMTMxIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIEJpb25pYyBsb2FkZXIgY29uZmlnIGZpbGUgZm9yIHRoZSBtZWRpYSBzd2NvZGVjIEFQRVguCisjCisjIFRoZXJlIGFyZSBubyB2ZXJzaW9uZWQgQVBFWCBwYXRocyBoZXJlIC0gdGhpcyBBUEVYIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0CisjIGhhdmluZyBzZXZlcmFsIHZlcnNpb25zIG1vdW50ZWQuCisKK2Rpci5zd2NvZGVjID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vCisKK1tzd2NvZGVjXQorYWRkaXRpb25hbC5uYW1lc3BhY2VzID0gcGxhdGZvcm0sc3BoYWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiZGVmYXVsdCIgbmFtZXNwYWNlCisjCisjIFRoaXMgbmFtZXNwYWNlIGlzIGZvciB0aGUgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBvbiB0aGUgc3djb2RlYyBBUEVYLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UuZGVmYXVsdC5pc29sYXRlZCA9IHRydWUKK25hbWVzcGFjZS5kZWZhdWx0LnZpc2libGUgPSB0cnVlCisKK25hbWVzcGFjZS5kZWZhdWx0LnNlYXJjaC5wYXRocyAgICAgID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4uc2VhcmNoLnBhdGhzID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQubGlua3MgPSBwbGF0Zm9ybQorCisjIFRPRE86IHJlcGxhY2UgdGhlIGZvbGxvd2luZyB3aGVuIGFwZXggaGFzIGEgd2F5IHRvIGF1dG8tZ2VuZXJhdGUgdGhpcyBsaXN0CisjIG5hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgID0gJUxMTkRLX0xJQlJBUklFUyUKKyMgbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyArPSAlU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSSUVTJQorbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyA9IGxpYkVHTC5zbzpsaWJHTEVTdjFfQ00uc286bGliR0xFU3YyLnNvOmxpYkdMRVN2My5zbzpsaWJSUy5zbzpsaWJhbmRyb2lkX25ldC5zbzpsaWJjLnNvOmxpYmNncm91cHJjLnNvOmxpYmNsYW5nX3J0LmFzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4tYXJtLWFuZHJvaWQuc286bGliY2xhbmdfcnQuaHdhc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWk2ODYtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLXg4Nl82NC1hbmRyb2lkLnNvOmxpYmRsLnNvOmxpYmZ0Mi5zbzpsaWJsb2cuc286bGlibS5zbzpsaWJtZWRpYW5kay5zbzpsaWJuYXRpdmV3aW5kb3cuc286bGlibmV1cmFsbmV0d29ya3Muc286bGlic3luYy5zbzpsaWJ2bmRrc3VwcG9ydC5zbzpsaWJkbF9hbmRyb2lkLnNvOmxpYnZ1bGthbi5zbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJwbGF0Zm9ybSIgbmFtZXNwYWNlCisjCisjIFRoaXMgbmFtZXNwYWNlIGlzIGZvciBsaW5raW5nIHRvIExMTkRLIGFuZCBBU0FOIGxpYnJhcmllcyBvbiB0aGUgc3lzdGVtLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UucGxhdGZvcm0uaXNvbGF0ZWQgPSB0cnVlCisKK25hbWVzcGFjZS5wbGF0Zm9ybS5zZWFyY2gucGF0aHMgPSAvc3lzdGVtLyR7TElCfQorbmFtZXNwYWNlLnBsYXRmb3JtLmFzYW4uc2VhcmNoLnBhdGhzICA9IC9kYXRhL2FzYW4vc3lzdGVtLyR7TElCfQorbmFtZXNwYWNlLnBsYXRmb3JtLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvc3lzdGVtLyR7TElCfQorCisjIC9zeXN0ZW0vbGliL2xpYmMuc28sIGV0YyBhcmUgc3ltbGlua3MgdG8gL2FwZXgvY29tLmFuZHJvaWQubGliL2xpYi9iaW9uaWMvbGliYy5zbywgZXRjLgorIyBBZGQgL2FwZXgvLi4uIHBhdCB0byB0aGUgcGVybWl0dGVkIHBhdGhzIGJlY2F1c2UgbGlua2VyIHVzZXMgcmVhbHBhdGgoMykKKyMgdG8gY2hlY2sgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGxpYi4gV2UgY291bGQgYWRkIHRoaXMgdG8gc2VhcmNoLnBhdGhzCisjIGluc3RlYWQgYnV0IHRoYXQgbWFrZXMgdGhlIHJlc29sdXRpb24gb2YgYmlvbmljIGxpYnMgYmUgZGVwZW5kZW50IG9uCisjIHRoZSBvcmRlciBvZiAvc3lzdGVtL2xpYiBhbmQgL2FwZXgvLi4uIGluIHNlYXJjaC5wYXRocy4gSWYgL2FwZXgvLi4uCisjIGlzIGFmdGVyIC9zeXN0ZW0vbGliLCB0aGVuIC9hcGV4Ly4uLiBpcyBuZXZlciB0cmllZCBiZWNhdXNlIGxpYmMuc28KKyMgaXMgYWx3YXlzIGZvdW5kIGluIC9zeXN0ZW0vbGliIGJ1dCBmYWlscyB0byBwYXNzIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3QKKyMgYmVjYXVzZSBvZiBpdHMgcmVhbHBhdGguICBJdCdzIGJldHRlciB0byBub3QgZGVwZW5kIG9uIHRoZSBvcmRlcmluZyBpZgorIyBwb3NzaWJsZS4KK25hbWVzcGFjZS5wbGF0Zm9ybS5wZXJtaXR0ZWQucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfS9iaW9uaWMKK25hbWVzcGFjZS5wbGF0Zm9ybS5hc2FuLnBlcm1pdHRlZC5wYXRocyA9IC9hcGV4L2NvbS5hbmRyb2lkLnJ1bnRpbWUvJHtMSUJ9L2Jpb25pYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJzcGhhbCIgbmFtZXNwYWNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCituYW1lc3BhY2Uuc3BoYWwuaXNvbGF0ZWQgPSB0cnVlCituYW1lc3BhY2Uuc3BoYWwudmlzaWJsZSA9IHRydWUKKworIyBLZWVwIHRoZSBiZWxvdyBpbiBzeW5jIHdpdGggInNwaGFsIiBuYW1lc3BhY2UgaW4gc3lzdGVtJ3MgL2V0Yy9sZC5jb25maWcudHh0CisjIENvZGVjMiBoYXMgZGVwZW5kZW5jaWVzIG9uIHNvbWUgU1AtaGFscyAoZWcuIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCkKKyMgVGhlc2UgYXJlIGRsb3BlbidlZCBieSBsaWJ2bmRrc3VwcG9ydC5zby4KK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgID0gL29kbS8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyAgPSAvb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9odworbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvc3lzdGVtL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICA9IC9kYXRhL2FzYW4vb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvdmVuZG9yLyR7TElCfQorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgID0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC9vZG0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9CisKKyMgS2VlcCB0aGUgYmVsb3cgaW4gc3luYyB3aXRoICJ2bmRrIiBuYW1lc3BhY2UgaW4gc3lzdGVtJ3MgL2V0Yy9sZC5jb25maWcudHh0CisjIFN5c3RlbSdzIHNwaGFsIG5hbWVzcGFjZSBsaW5rcyB0byB2bmRrIG5hbWVzcGFjZSBmb3IgJVZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTJSwKKyMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGF1dG8tZXhwYW5kICVWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUyUsCisjIHdlJ2xsIGFkZCB0aGUgdm5kayBwYXRocyBiZWxvdy4KKworbmFtZXNwYWNlLnNwaGFsLnNlYXJjaC5wYXRocyArPSAvb2RtLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuc2VhcmNoLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgKz0gL3N5c3RlbS8ke0xJQn0vdm5kay1zcCR7Vk5ES19WRVJ9CisKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL29kbS8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL29kbS8ke0xJQn0vZWdsCituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvc3lzdGVtL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3N5c3RlbS92ZW5kb3IvJHtMSUJ9L2VnbAorIyBUaGlzIGlzIGV4Y2VwdGlvbmFsbHkgcmVxdWlyZWQgc2luY2UgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC5zbyBpcyBoZXJlCituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfS9odworCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0vdm5kay1zcAorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL3N5c3RlbS8ke0xJQn0vdm5kay1zcCR7Vk5ES19WRVJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gICAgICAgICAgIC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfQorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC9vZG0vJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfS9lZ2wKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0vZWdsCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9L2VnbAorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfS9odworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvc3lzdGVtLyR7TElCfS92bmRrLXNwJHtWTkRLX1ZFUn0vaHcKKworIyBPbmNlIGluIHRoaXMgbmFtZXNwYWNlLCBhY2Nlc3MgdG8gbGlicmFyaWVzIGluIC9zeXN0ZW0vbGliIGlzIHJlc3RyaWN0ZWQuIE9ubHkKKyMgbGlicyBsaXN0ZWQgaGVyZSBjYW4gYmUgdXNlZC4KK25hbWVzcGFjZS5zcGhhbC5saW5rcyA9IHBsYXRmb3JtCisKKyMgVE9ETzogcmVwbGFjZSB0aGUgZm9sbG93aW5nIHdoZW4gYXBleCBoYXMgYSB3YXkgdG8gYXV0by1nZW5lcmF0ZSB0aGlzIGxpc3QKKyMgbmFtZXNwYWNlLnNwaGFsLmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgID0gJUxMTkRLX0xJQlJBUklFUyUKKyMgbmFtZXNwYWNlLnNwaGFsLmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgKz0gJVNBTklUSVpFUl9SVU5USU1FX0xJQlJBUklFUyUKK25hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzID0gbGliRUdMLnNvOmxpYkdMRVN2MV9DTS5zbzpsaWJHTEVTdjIuc286bGliR0xFU3YzLnNvOmxpYlJTLnNvOmxpYmFuZHJvaWRfbmV0LnNvOmxpYmMuc286bGliY2dyb3VwcmMuc286bGliY2xhbmdfcnQuYXNhbi1hYXJjaDY0LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi1hcm0tYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5od2FzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4taTY4Ni1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4teDg2XzY0LWFuZHJvaWQuc286bGliZGwuc286bGliZnQyLnNvOmxpYmxvZy5zbzpsaWJtLnNvOmxpYm1lZGlhbmRrLnNvOmxpYm5hdGl2ZXdpbmRvdy5zbzpsaWJuZXVyYWxuZXR3b3Jrcy5zbzpsaWJzeW5jLnNvOmxpYnZuZGtzdXBwb3J0LnNvOmxpYnZ1bGthbi5zbworCisjIEFkZCBhIGxpbmsgZm9yIGxpYnouc28gd2hpY2ggaXMgbGxuZGsgb24gZGV2aWNlcyB3aGVyZSBWTkRLIGlzIG5vdCBlbmZvcmNlZC4KK25hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICs9IGxpYnouc28KZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3QuanNvbiBiL2FwZXgvbWFuaWZlc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDExZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMjkwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhNTE3OAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMjkwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIG92ZXJyaWRlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWNlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4IHsKKyAgICBuYW1lOiAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0Lmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBmaWxlX2NvbnRleHRzOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24gYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMzAwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzIwZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMzAwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IDI0YjM5MTguLjI4MDA1OTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC0xMiw4ICsxMiw2IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3ViZGlycyA9IFsibmRrIl0KLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJjYW1lcmFfY2xpZW50IiwKIApAQCAtNDMsNiArNDEsNyBAQAogICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIiwKICAgICAgICAgImNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAiLAorICAgICAgICAiY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAiLAogICAgICAgICAiY2FtZXJhMi9TdWJtaXRJbmZvLmNwcCIsCiAgICAgICAgICJDYW1lcmFCYXNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFVdGlscy5jcHAiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZTE0M2UwNS4uOTJmZTg0YiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MDksNiArNDA4LDc5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdGFnc1JlbW92ZWQpIHsKKyAgICB1aW50MzJfdCB0YWdDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3NUb1JlbW92ZTsKKworICAgIGlmICh0YWdzUmVtb3ZlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdlRhZ3MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgaWYgKChudWxscHRyID09IHZUYWdzLmdldCgpKSB8fCAoMCA+PSB2VGFncy0+Z2V0VGFnQ291bnQoKSkpIHsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBjYWNoZSA9CisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZS5nZXQoKSkgeworICAgICAgICAgICAgY2FjaGUtPmdldFZlbmRvclRhZ0Rlc2NyaXB0b3IodmVuZG9ySWQsICZ2VGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG51bGxwdHIgIT0gdlRhZ3MuZ2V0KCkpICYmICh2VGFncy0+Z2V0VGFnQ291bnQoKSA+IDApKSB7CisgICAgICAgIHRhZ0NvdW50ID0gdlRhZ3MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHVpbnQzMl90ICp2ZW5kb3JUYWdzID0gbmV3IHVpbnQzMl90W3RhZ0NvdW50XTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gdmVuZG9yVGFncykgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICB2VGFncy0+Z2V0VGFnQXJyYXkodmVuZG9yVGFncyk7CisKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnQ291bnQpOworICAgICAgICB0YWdzVG9SZW1vdmUuaW5zZXJ0KHRhZ3NUb1JlbW92ZS5iZWdpbigpLCB2ZW5kb3JUYWdzLCB2ZW5kb3JUYWdzICsgdGFnQ291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSB2ZW5kb3JUYWdzOworICAgICAgICB0YWdDb3VudCA9IDA7CisgICAgfQorCisgICAgYXV0byB0YWdzTmVlZGluZ1Blcm1pc3Npb24gPSBnZXRfY2FtZXJhX21ldGFkYXRhX3Blcm1pc3Npb25fbmVlZGVkKCZ0YWdDb3VudCk7CisgICAgaWYgKHRhZ0NvdW50ID4gMCkgeworICAgICAgICB0YWdzVG9SZW1vdmUucmVzZXJ2ZSh0YWdzVG9SZW1vdmUuY2FwYWNpdHkoKSArIHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuZW5kKCksIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICB0YWdzTmVlZGluZ1Blcm1pc3Npb24gKyB0YWdDb3VudCk7CisgICAgfQorCisgICAgdGFnc1JlbW92ZWQtPnJlc2VydmUodGFnc1RvUmVtb3ZlLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICBpZiAoZXhpc3RzKGl0KSkgeworICAgICAgICAgICAgYXV0byByYyA9IGVyYXNlKGl0KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGVyYXNlIHRhZzogJXgiLCBfX2Z1bmNfXywgaXQpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5wdXNoX2JhY2soaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBhdmFpbGFibGUgY2hhcmFjdGVyc3RpY3MgYWNjb3JkaW5nbHkKKyAgICBpZiAoZXhpc3RzKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjdXJyZW50S2V5czsKKworICAgICAgICBzdGQ6OnNvcnQodGFnc1JlbW92ZWQtPmJlZ2luKCksIHRhZ3NSZW1vdmVkLT5lbmQoKSk7CisgICAgICAgIGF1dG8ga2V5cyA9IGZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIGN1cnJlbnRLZXlzLnJlc2VydmUoa2V5cy5jb3VudCk7CisgICAgICAgIGN1cnJlbnRLZXlzLmluc2VydChjdXJyZW50S2V5cy5lbmQoKSwga2V5cy5kYXRhLmkzMiwga2V5cy5kYXRhLmkzMiArIGtleXMuY291bnQpOworICAgICAgICBzdGQ6OnNvcnQoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld0tleXMoa2V5cy5jb3VudCk7CisgICAgICAgIGF1dG8gZW5kID0gc3RkOjpzZXRfZGlmZmVyZW5jZShjdXJyZW50S2V5cy5iZWdpbigpLCBjdXJyZW50S2V5cy5lbmQoKSwgdGFnc1JlbW92ZWQtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgdGFnc1JlbW92ZWQtPmVuZCgpLCBuZXdLZXlzLmJlZ2luKCkpOworICAgICAgICBuZXdLZXlzLnJlc2l6ZShlbmQgLSBuZXdLZXlzLmJlZ2luKCkpOworCisgICAgICAgIHVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBuZXdLZXlzLmRhdGEoKSwgbmV3S2V5cy5zaXplKCkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogdm9pZCBDYW1lcmFNZXRhZGF0YTo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKG1CdWZmZXIsIGZkLCB2ZXJib3NpdHksIGluZGVudGF0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcAppbmRleCA5MjhhNmJjLi4xZDhlOGM0IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0zOSw2ICszOSwxNiBAQAogICAgIHBhcmNlbC0+cmVhZEludDY0KCZmcmFtZU51bWJlcik7CiAgICAgcGFyY2VsLT5yZWFkSW50MzIoJnBhcnRpYWxSZXN1bHRDb3VudCk7CiAgICAgcGFyY2VsLT5yZWFkSW50MzIoJmVycm9yU3RyZWFtSWQpOworICAgIGF1dG8gcGh5c2ljYWxDYW1lcmFJZFByZXNlbnQgPSBwYXJjZWwtPnJlYWRCb29sKCk7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWRQcmVzZW50KSB7CisgICAgICAgIFN0cmluZzE2IGNhbWVyYUlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmY2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBjYW1lcmEgaWQ6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlcnJvclBoeXNpY2FsQ2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC01Niw2ICs2NiwxNiBAQAogICAgIHBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZU51bWJlcik7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKHBhcnRpYWxSZXN1bHRDb3VudCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGVycm9yU3RyZWFtSWQpOworICAgIGlmIChlcnJvclBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBwYXJjZWwtPndyaXRlQm9vbCh0cnVlKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KGVycm9yUGh5c2ljYWxDYW1lcmFJZCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBjYW1lcmEgSUQgdG8gcGFyY2VsOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwYXJjZWwtPndyaXRlQm9vbChmYWxzZSk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggMThhY2ZlZS4uZDZiOTVkYSAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC0xLDYgKzEsOCBAQAotY3ljaGVuQGdvb2dsZS5jb20KIGVwZWV2QGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KK2pjaG93ZGhhcnlAZ29vZ2xlLmNvbQogc2h1emhlbndhbmdAZ29vZ2xlLmNvbQogeWluY2hpYXllaEBnb29nbGUuY29tCisjIGJhY2t1cCBvd25lcgorY3ljaGVuQGdvb2dsZS5jb20KIHpoaWp1bmhlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCA0YzI4Nzg5Li5kNzEzZDJkIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC0zMTUsNiArMzE1LDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFNlY3Rpb25JbmRleCh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworfQorCiB2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKIAogICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CkBAIC00MDcsNiArNDExLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpIHsKKyAgICByZXR1cm4gbVZlbmRvck1hcDsKK30KKwogaW50IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VGFnQ291bnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgaWQpIGNvbnN0IHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBhdXRvIGRlc2MgPSBtVmVuZG9yTWFwLmZpbmQoaWQpOwpAQCAtNTY2LDcgKzU3NSw3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4odGFnQ291bnQpOyArK2kpIHsKICAgICAgICAgdWludDMyX3QgdGFnID0gdGFnQXJyYXlbaV07Ci0gICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IHRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CiAKICAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gc2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uU3RyaW5nKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCA5YzBmMjhiLi4zZTg5OTJhIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgKgogICAgICAqIEFsc28gcmV0dXJucyB0aGUgc2V0IG9mIGN1cnJlbnRseS1rbm93biBjYW1lcmEgSURzIGFuZCBzdGF0ZSBvZiBlYWNoIGRldmljZS4KICAgICAgKiBBZGRpbmcgYSBsaXN0ZW5lciB3aWxsIHRyaWdnZXIgdGhlIHRvcmNoIHN0YXR1cyBsaXN0ZW5lciB0byBmaXJlIGZvciBhbGwKLSAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQKKyAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQuCiAgICAgICovCiAgICAgQ2FtZXJhU3RhdHVzW10gYWRkTGlzdGVuZXIoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApAQCAtMTYwLDYgKzE2MiwyOCBAQAogICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7Ci0gICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOworICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBzZXQgb2YgbmV3IGZvcmVncm91bmQgdXNlciBJRHMuCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgorICAgICAqCisgICAgICogbmV3U3RhdGUgaXMgYSBiaXRmaWVsZCBjb25zaXN0aW5nIG9mIERFVklDRV9TVEFURV8qIHZhbHVlcyBjb21iaW5lZCB0b2dldGhlci4gVmFsaWQgc3RhdGUKKyAgICAgKiBjb21iaW5hdGlvbnMgYXJlIGRldmljZS1zcGVjaWZpYy4gQXQgZGV2aWNlIHN0YXJ0dXAsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGV2aWNlCisgICAgICogc3RhdGUgaXMgTk9STUFMIHVudGlsIG90aGVyd2lzZSBub3RpZmllZC4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShsb25nIG5ld1N0YXRlKTsKKworICAgIC8vIEJpdGZpZWxkIGNvbnN0YW50cyBmb3Igbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UKKyAgICAvLyBBbGwgYml0cyA+PSAzMiBhcmUgZm9yIGN1c3RvbSB2ZW5kb3Igc3RhdGVzCisgICAgLy8gV3JpdHRlbiBhcyBpbnRzIHNpbmNlIEFJREwgZG9lcyBub3Qgc3VwcG9ydCBsb25nIGNvbnN0YW50cy4KKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX05PUk1BTCA9IDA7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQgPSAxOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCA9IDI7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9GT0xERUQgPSA0OworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfTEFTVF9GUkFNRVdPUktfQklUID0gMHg4MDAwMDAwMDsgLy8gMSA8PCAzMTsKKwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAppbmRleCBmODcxY2U0Li5lOWRjYmRiIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbApAQCAtNzYsNCArNzYsMTEgQEAKICAgICBjb25zdCBpbnQgVE9SQ0hfU1RBVFVTX1VOS05PV04gPSAtMTsKIAogICAgIG9uZXdheSB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGludCBzdGF0dXMsIFN0cmluZyBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgcmVnaXN0ZXJlZCBjbGllbnRzIGFib3V0IGNhbWVyYSBhY2Nlc3MgcHJpb3JpdHkgY2hhbmdlcy4KKyAgICAgKiBDbGllbnRzIHdoaWNoIHdlcmUgcHJldmlvdXNseSB1bmFibGUgdG8gb3BlbiBhIGNlcnRhaW4gY2FtZXJhIGRldmljZQorICAgICAqIGNhbiByZXRyeSBhZnRlciByZWNlaXZpbmcgdGhpcyBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCmluZGV4IDRjZWQwOGMuLjQ5ZGZkZTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlNlc3Npb25Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi51dGlscy5TdWJtaXRJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC04Myw2ICs4NCwxNiBAQAogICAgICAqLwogICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLCBpbiBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBzZXNzaW9uUGFyYW1zKTsKIAorICAgIC8qKgorICAgICAgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gaGFzIGNhbWVyYSBkZXZpY2UKKyAgICAgICogc3VwcG9ydC4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHNlc3Npb25Db25maWd1cmF0aW9uIFNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbiB0byBiZSB2ZXJpZmllZC4KKyAgICAgICogQHJldHVybiB0cnVlICAtIGluIGNhc2UgdGhlIHN0cmVhbSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgICAqICAgICAgICAgZmFsc2UgLSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRldmljZSBzdXBwb3J0LgorICAgICAgKi8KKyAgICBib29sZWFuIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoaW4gU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24pOworCiAgICAgdm9pZCBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtczsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFNlc3Npb25Db25maWd1cmF0aW9uIGNwcF9oZWFkZXIgImNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmgiOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCBmZWIwNGMyLi40ZTliMjdkIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMTY3LDE0ICsxNjcsMjQgQEAKIH0KIAogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbElkLAogICAgICAgICBpbnQgc3VyZmFjZVNldElELCBib29sIGlzU2hhcmVkKSB7CiAgICAgbUdicHMucHVzaF9iYWNrKGdicCk7CiAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CiAgICAgbVN1cmZhY2VTZXRJRCA9IHN1cmZhY2VTZXRJRDsKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOworICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKIH0KIAorT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgIGludCByb3RhdGlvbiwgY29uc3QgU3RyaW5nMTYmIHBoeXNpY2FsQ2FtZXJhSWQsIGludCBzdXJmYWNlU2V0SUQsICBpbnQgc3VyZmFjZVR5cGUsCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzU2hhcmVkKQorICA6IG1HYnBzKGdicHMpLCBtUm90YXRpb24ocm90YXRpb24pLCBtU3VyZmFjZVNldElEKHN1cmZhY2VTZXRJRCksIG1TdXJmYWNlVHlwZShzdXJmYWNlVHlwZSksCisgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtSXNEZWZlcnJlZChmYWxzZSksIG1Jc1NoYXJlZChpc1NoYXJlZCksCisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeyB9CisKIHN0YXR1c190IE91dHB1dENvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKIAogICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxYTMzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlNlc3Npb25Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50IG9wZXJhdGluZ01vZGUgPSAwOworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmb3BlcmF0aW5nTW9kZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3BlcmF0aW5nIG1vZGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dFdpZHRoID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dFdpZHRoKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCB3aWR0aCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0SGVpZ2h0ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgaGVpZ2h0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRGb3JtYXQgPSAtMTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgZm9ybWF0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRTdHJlYW1zOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3Rvcigmb3V0cHV0U3RyZWFtcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3V0cHV0IGNvbmZpZ3VyYXRpb25zIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtT3BlcmF0aW5nTW9kZSA9IG9wZXJhdGluZ01vZGU7CisgICAgbUlucHV0V2lkdGggPSBpbnB1dFdpZHRoOworICAgIG1JbnB1dEhlaWdodCA9IGlucHV0SGVpZ2h0OworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIGZvciAoYXV0byYgc3RyZWFtIDogb3V0cHV0U3RyZWFtcykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisKKyAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0V2lkdGgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0SGVpZ2h0KTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1PdXRwdXRTdHJlYW1zKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uOjpvdXRwdXRzRXF1YWwoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIG90aGVyT3V0cHV0U3RyZWFtcyA9CisgICAgICAgICAgICBvdGhlci5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSAhPSAgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLnNpemUoKSA8IG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXNbaV0gPCBvdGhlck91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhYmEzYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2ZXIiLAorCisgICAgc3JjczogWyJtYWluX2NhbWVyYXNlcnZlci5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJjYW1lcmFzZXJ2ZXIucmMiXSwKKworICAgIHZpbnRmX2ZyYWdtZW50czogWworICAgICAgICAibWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM5NGU2Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmNhbWVyYXNlcnZpY2UgXAotCWxpYmxvZyBcCi0JbGlidXRpbHMgXAotCWxpYnVpIFwKLQlsaWJndWkgXAotCWxpYmJpbmRlciBcCi0JbGliaGlkbHRyYW5zcG9ydCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCi0KLUxPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZlcgotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1MT0NBTF9JTklUX1JDIDo9IGNhbWVyYXNlcnZlci5yYwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKaW5kZXggMzk3MjQzNi4uNTNiM2Q4NCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKQEAgLTI2LDggKzI2LDkgQEAKIHsKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKLSAgICAvLyBTZXQgMyB0aHJlYWRzIGZvciBISURMIGNhbGxzCi0gICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMywgLyp3aWxsam9pbiovIGZhbHNlKTsKKyAgICAvLyBTZXQgNSB0aHJlYWRzIGZvciBISURMIGNhbGxzLiBOb3cgY2FtZXJhc2VydmVyIHdpbGwgc2VydmUgSElETCBjYWxscyBpbgorICAgIC8vIGFkZGl0aW9uIHRvIGNvbnN1bWluZyB0aGVtIGZyb20gdGhlIENhbWVyYSBIQUwgYXMgd2VsbC4KKyAgICBoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg1LCAvKndpbGxqb2luKi8gZmFsc2UpOwogCiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+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+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICB9CisgICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDkwN2RlYmMuLmQyNGNiODEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTIwLDE2ICsyMCwyMSBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKICNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKworQUNhbWVyYURldmljZTo6fkFDYW1lcmFEZXZpY2UoKSB7CisgICAgbURldmljZS0+c3RvcExvb3BlcigpOworfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKQEAgLTM5LDEwICs0NCwxMiBAQAogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlcXVlc3RLZXkgPSAiQ2FwdHVyZVJlcXVlc3QiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprVGltZVN0YW1wS2V5ICAgICAgPSAiVGltZVN0YW1wIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXN1bHRLZXkgID0gIkNhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5ID0gIlBoeXNpY2FsQ2FwdHVyZVJlc3VsdCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlRmFpbHVyZUtleSA9ICJDYXB0dXJlRmFpbHVyZSI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXF1ZW5jZUlkS2V5ICAgICA9ICJTZXF1ZW5jZUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0ZyYW1lTnVtYmVyS2V5ICAgID0gIkZyYW1lTnVtYmVyIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Fud0tleSAgICAgICAgICAgID0gIkFudyI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZD0gIkZhaWxpbmdQaHlzaWNhbENhbWVyYUlkIjsKIAogLyoqCiAgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KQEAgLTUwLDExICs1NywxMSBAQAogQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCiAgICAgICAgIGNvbnN0IGNoYXIqIGlkLAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpIDoKICAgICAgICAgbUNhbWVyYUlkKGlkKSwKICAgICAgICAgbUFwcENhbGxiYWNrcygqY2IpLAotICAgICAgICBtQ2hhcnMoc3RkOjptb3ZlKGNoYXJzKSksCisgICAgICAgIG1DaGFycyhjaGFycyksCiAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sobmV3IFNlcnZpY2VDYWxsYmFjayh0aGlzKSksCiAgICAgICAgIG1XcmFwcGVyKHdyYXBwZXIpLAogICAgICAgICBtSW5FcnJvcihmYWxzZSksCkBAIC03NCw3ICs4MSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKICAgICB9Ci0gICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKGlkKTsKICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOwpAQCAtOTUsNiArMTAyLDE0IEBACiAgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOwogICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKICAgICB9CisKKyAgICBzaXplX3QgcGh5c2ljYWxJZENudCA9IDA7CisgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgaWYgKG1DaGFycy0+aXNMb2dpY2FsTXVsdGlDYW1lcmEoJnBoeXNpY2FsSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbElkQ250OyBpKyspIHsKKyAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0pOworICAgICAgICB9CisgICAgfQogfQogCiAvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KQEAgLTEwNSwxNCArMTIwLDEwIEBACiAgICAgICAgIGlmICghaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgZGlzY29ubmVjdExvY2tlZChzZXNzaW9uKTsKICAgICAgICAgfQorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYkxvb3BlciAhPSBudWxscHRyLAorICAgICAgICAgICAgICAgICJDYW1lcmFEZXZpY2UgbG9vcGVyIHNob3VsZCd2ZSBiZWVuIHN0b3BwZWQgYmVmb3JlIH5DYW1lcmFEZXZpY2UiKTsKICAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKLSAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOwotICAgICAgICB9CiAgICAgfQotICAgIG1DYkxvb3Blci5jbGVhcigpOwotICAgIG1IYW5kbGVyLmNsZWFyKCk7CiB9CiAKIHZvaWQKQEAgLTEyNyw4ICsxMzgsMjkgQEAKIGNhbWVyYV9zdGF0dXNfdAogQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+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+c2V0T2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgZmFpbHVyZSk7CiAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwpAQCAtODgyLDYgKzg5MiwxOSBAQAogICAgIHJldHVybjsKIH0KIAordm9pZCBDYW1lcmFEZXZpY2U6OnN0b3BMb29wZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpIDogbUlkKGlkKSB7Cit9CisKIHZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKQEAgLTg5MCw3ICs5MTMsOSBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKQEAgLTk2MCw3ICs5ODUsOSBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKQEAgLTk3Nyw3ICsxMDA0LDkgQEAKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKQEAgLTEwMjAsNyArMTA0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvblN0YXJ0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNDMsMTEgKzEwNzIsNjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvblJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGxvZ2ljYWxDYW1lcmEgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgcGh5c2ljYWwgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHQtPm1QaHlzaWNhbFJlc3VsdEluZm87CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxBQ2FtZXJhTWV0YWRhdGE+PiBwaHlzaWNhbE1ldGFkYXRhQ29weTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxJZDgocGh5c2ljYWxSZXN1bHRJbmZvW2ldLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbElkOC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmUgPSBwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsUmVzdWx0LT5tRnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFU1VMVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weS5wdXNoX2JhY2sobWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRQdHJzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBBQ2FtZXJhTWV0YWRhdGEqPiBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkUHRycy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMucHVzaF9iYWNrKHBoeXNpY2FsTWV0YWRhdGFDb3B5W2ldLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKQEAgLTEwNjksMTEgKzExNTYsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOwogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgZmFpbHVyZTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICYmICFwaHlzaWNhbENhbWVyYUlkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5jYXB0dXJlRmFpbHVyZSA9ICpmYWlsdXJlU3A7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsICZmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBvblNlcUVuZDsKQEAgLTExNDYsNyArMTI2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTU4LDEyICsxMjc4LDM2IEBACiB9CiAKIENhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAotICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKLSAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCi0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAotICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksIG1DYWxsYmFja3MoZmlsbENiKGNicykpIHt9CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgIH0KK30KIAogdm9pZAogQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCkBAIC0xMTgwLDkgKzEzMjQsOSBAQAogICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKICAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjawogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwogICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9IGVsc2UgewpAQCAtMTIzMCw5ICsxMzc0LDkgQEAKICAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOwogICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBsYXN0RnJhbWVOdW1iZXIpOwogCkBAIC0xMjkwLDE2ICsxNDM0LDIxIEBACiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGVycm9yIGZyb20gY2FtZXJhIGRldmljZTogJWQiLCBlcnJvckNvZGUpOwotICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKICAgICAgICAgY2FzZSBFUlJPUl9DQU1FUkFfREVWSUNFOgogICAgICAgICBjYXNlIEVSUk9SX0NBTUVSQV9TRVJWSUNFOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGlzIHN3aXRjaCBzaW5jZSB0aGlzIGJsb2NrIG1pZ2h0IGJlIGVuY291bnRlcmVkIHdpdGgKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBqdXN0IDIgc3RhdGVzLiBUaGUgZGVmYXVsdCBmYWxsdGhyb3VnaCBjb3VsZCBoYXZlIHVzCisgICAgICAgICAgICAvLyBoYW5kbGluZyBtb3JlIHVubWF0Y2hlZCBlcnJvciBjYXNlcy4KICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9DQU1FUkFfREVWSUNFOgogICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRVJST1JfQ0FNRVJBX1NFUlZJQ0U6CiAgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOwpAQCAtMTMwOSw3ICsxNDU4LDcgQEAKICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM4NCw3ICsxNTMzLDcgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTEzOTMsNyArMTU0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwpAQCAtMTQwOCw3ICsxNTU3LDYgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7Ci0gICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTQ0NCw5ICsxNTkyLDYgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPwotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNDU2LDEzICsxNjAxLDI3IEBACiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhwaHlzaWNhbFJlc3VsdEluZm9zLCBmcmFtZU51bWJlcikpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlUmVzdWx0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KIApAQCAtMTUwOCw1ICsxNjY3LDUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0KK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDEzNjkxNDguLjdhMzViZjAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgpAQCAtNDEsMTQgKzQzLDI1IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTU2LDYgKzY5LDcgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCiAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKQEAgLTY0LDYgKzc4LDkgQEAKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOwogCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0OworCiAgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKICAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIHsKICAgICAgIHB1YmxpYzoKQEAgLTkyLDYgKzEwOSw5IEBACiAKICAgICBpbmxpbmUgQUNhbWVyYURldmljZSogZ2V0V3JhcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1XcmFwcGVyOyB9OwogCisgICAgLy8gU3RvcCB0aGUgbG9vcGVyIHRocmVhZCBhbmQgdW5yZWdpc3RlciB0aGUgaGFuZGxlcgorICAgIHZvaWQgc3RvcExvb3BlcigpOworCiAgIHByaXZhdGU6CiAgICAgZnJpZW5kIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjsKICAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CkBAIC0xMDgsMTkgKzEyOCwyMiBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CiAKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmVMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKICAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCiAgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKQEAgLTEzMCw3ICsxNTMsOCBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4mIG91dFJlcSk7CiAKLSAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSk7CisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlSWQpOwogICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CiAKICAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKQEAgLTE1Niw3ICsxODAsNyBAQAogICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CiAgICAgY29uc3QgU3RyaW5nOCBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcwogICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKICAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKIApAQCAtMTkxLDcgKzIxNSw5IEBACiAgICAgICAgIC8vIENhcHR1cmUgY2FsbGJhY2tzCiAgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0LCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVGYWlsLCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKICAgICAgICAga1doYXRDYXB0dXJlQnVmZmVyTG9zdCwvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CkBAIC0yMDYsMTYgKzIzMiwyMCBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZDsKIAogICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrSGFuZGxlcihjb25zdCBjaGFyKiBpZCk7CiAgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOwogCiAgICAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBtSWQ7CiAgICAgICAgIC8vIFRoaXMgaGFuZGxlciB3aWxsIGNhY2hlIGFsbCBjYXB0dXJlIHNlc3Npb24gc3AgdW50aWwga1doYXRDbGVhblVwU2Vzc2lvbnMKICAgICAgICAgLy8gaXMgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWQgdG8gZ3VhcmFudGVlIHRoZSBsYXN0IHNlc3Npb24gcmVmZXJlbmNlIGlzIGFsd2F5cwogICAgICAgICAvLyBiZWluZyByZW1vdmVkIGluIGNhbGxiYWNrIHRocmVhZCB3aXRob3V0IGhvbGRpbmcgY2FtZXJhIGRldmljZSBsb2NrCkBAIC0yNDQsMTkgKzI3NCw0NyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKIAotICAgICAgICBzdGF0aWMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgZmlsbENiKAotICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIHsKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHZvaWQgaW5pdENhcHR1cmVDYWxsYmFja3MoVCogY2JzKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBudWxscHRyOwogICAgICAgICAgICAgaWYgKGNicyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICpjYnM7CisgICAgICAgICAgICAgICAgbUNvbnRleHQgPSBjYnMtPmNvbnRleHQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBjYnMtPm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBjYnMtPm9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gY2JzLT5vbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZUJ1ZmZlckxvc3QgPSBjYnMtPm9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geyBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyIH07CiAgICAgICAgIH0KLQogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CiAgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiBtUmVxdWVzdHM7CiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNSZXBlYXRpbmc7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYWxsYmFja3M7CisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2s7CisKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgbU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgfTsKICAgICAvLyBzZXF1ZW5jZSBpZCAtPiBjYWxsYmFja3MgbWFwCiAgICAgc3RkOjptYXA8aW50LCBDYWxsYmFja0hvbGRlcj4gbVNlcXVlbmNlQ2FsbGJhY2tNYXA7CkBAIC0yODMsOSArMzQxLDExIEBACiAgICAgLy8gTWlzYyB2YXJpYWJsZXMKICAgICBpbnQzMl90IG1TaGFkaW5nTWFwU2l6ZVsyXTsgICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogICAgIGludDMyX3QgbVBhcnRpYWxSZXN1bHRDb3VudDsgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbElkczsgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKIAogfTsKIAorfSAvLyBuYW1lc3BhY2UgYWNhbTsKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8qKgpAQCAtMjk0LDEwICszNTQsMTAgQEAKICAqLwogc3RydWN0IEFDYW1lcmFEZXZpY2UgewogICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKLSAgICAgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgY2hhcnMsIHRoaXMpKSB7fQogCi0gICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKKyAgICB+QUNhbWVyYURldmljZSgpOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioKICAgICAgKiBOREsgcHVibGljIEFQSXMgKgpAQCAtMzA2LDggKzM2Niw5IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiAgICAgfQogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKApAQCAtMzE4LDYgKzM3OSwxMSBAQAogICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CiAgICAgfQogCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbk91dHB1dENvbnRhaW5lcik7CisgICAgfQorCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogRGV2aWNlIGludGVyYWwgQVBJcyAqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzMxLDcgKzM5Nyw3IEBACiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5pbmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+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+PSAyOQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGNhbWVyYSBpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqCisgKiA8cD4gQ2hlY2sgd2hldGhlciBhIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBiYXNlZCBvbiBpdHMKKyAqIHN0YXRpYyBtZXRhZGF0YS4gSWYgaXQgaXMsIGFsc28gcmV0dXJucyBpdHMgcGh5c2ljYWwgc3ViIGNhbWVyYSBJZHMuPC9wPgorICoKKyAqIEBwYXJhbSBzdGF0aWNNZXRhZGF0YSB0aGUgc3RhdGljIG1ldGFkYXRhIG9mIHRoZSBjYW1lcmEgYmVpbmcgY2hlY2tlZC4KKyAqIEBwYXJhbSBudW1QaHlzaWNhbENhbWVyYXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYXMuCisgKiBAcGFyYW0gcGh5c2ljYWxDYW1lcmFJZHMgcmV0dXJucyB0aGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElkcyBiYWNraW5nIHRoaXMgbG9naWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYSBkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHN0YXRpY01ldGFkYXRhIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCmluZGV4IGJlZTFhNDYuLjhkZDZlMDAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaApAQCAtNzEsNiArNzEsOCBAQAogICAgIEFDQU1FUkFfREVQVEgsCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQSwKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKKyAgICBBQ0FNRVJBX0hFSUMsCisgICAgQUNBTUVSQV9IRUlDX0lORk8sCiAgICAgQUNBTUVSQV9TRUNUSU9OX0NPVU5ULAogCiAgICAgQUNBTUVSQV9WRU5ET1IgPSAweDgwMDAKQEAgLTExMiw2ICsxMTQsOCBAQAogICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX1NUQVJUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgICAgICAgICAgICAgPSBBQ0FNRVJBX0hFSUMgICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfSEVJQ19JTkZPX1NUQVJUICAgICAgICA9IEFDQU1FUkFfSEVJQ19JTkZPICAgICAgICAgPDwgMTYsCiAgICAgQUNBTUVSQV9WRU5ET1JfU1RBUlQgICAgICAgICAgID0gQUNBTUVSQV9WRU5ET1IgICAgICAgICAgICA8PCAxNgogfSBhY2FtZXJhX21ldGFkYXRhX3NlY3Rpb25fc3RhcnRfdDsKIApAQCAtMTkxMiw2ICsxOTE2LDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+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+VGhlIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHRhZ3MgcmVxdWlyZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgY2FtZXJhCisgICAgICogZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBjYXBhYmlsdGl0eS4gT24gdGhlIG90aGVyCisgICAgICogaGFuZCwgdGhlIHVzZSBvZiBtYW51YWwgY2FwdHVyZSBjb250cm9scyAoc2Vuc29yIG9yIHBvc3QtcHJvY2Vzc2luZykgd2l0aCBhCisgICAgICogbG9naWNhbCBjYW1lcmEgbWF5IHJlc3VsdCBpbiB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gdGhlIEhBTCBkZWNpZGVzIHRvIHN3aXRjaAorICAgICAqIGJldHdlZW4gcGh5c2ljYWwgY2FtZXJhcyB3aXRoIGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3MgdW5kZXIgdGhlIGhvb2QuIEZvciBleGFtcGxlLAorICAgICAqIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG1hbnVhbGx5IHNldHMgZXhwb3N1cmUgdGltZSBhbmQgc2Vuc2l0aXZpdHkgd2hpbGUgem9vbWluZyBpbiwKKyAgICAgKiB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgY2FtZXJhIGltYWdlcyBtYXkgc3VkZGVubHkgY2hhbmdlIGJlY2F1c2UgSEFMIHN3aXRjaGVzIGZyb20gb25lCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHRvIHRoZSBvdGhlci48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lECiAgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVECisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEgICAgICA9IDExLAogCiAgICAgLyoqCiAgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKLSAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogYW5kIGZvciBZVVZfNDIwXzg4OCBzdHJlYW0sIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIDxwPkEgTU9OT0NIUk9NRSBjYW1lcmEgbXVzdCBzdXBwb3J0IHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yCisgICAgICogaXRzIGRldmljZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLiBBZGRpdGlvbmFsbHksIGlmIHRoZSBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBzdXBwb3J0cyBZOCBmb3JtYXQsIGFsbCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyByZWxhdGVkIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSBhcHBseQorICAgICAqIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBhcyB3ZWxsLiBUaGVyZSBhcmUgbm8KKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyB3aXRoIHJlZ2FyZCB0bworICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBmb3IgQmF5ZXIgY2FtZXJhIGRldmljZXMuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGUgU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UIG9mIGEgTU9OT0NIUk9NRQorICAgICAqIGNhbWVyYSB3aWxsIGJlIGVpdGhlciBNT05PIG9yIE5JUi48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGltYWdlIGRhdGEgaW50byBhIHJlZ2lvbiBvZiBtZW1vcnkKKyAgICAgKiBpbmFjY2Vzc2libGUgdG8gQW5kcm9pZCB1c2Vyc3BhY2Ugb3IgdGhlIEFuZHJvaWQga2VybmVsLCBhbmQgb25seSBhY2Nlc3NpYmxlIHRvCisgICAgICogdHJ1c3RlZCBleGVjdXRpb24gZW52aXJvbm1lbnRzIChURUUpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQSAgICAgICAgID0gMTMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKIApAQCAtNzMwMCw2ICs3Nzc2LDgxIEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdDsKIAorLy8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IG11c3Qgb25seSBpbmNsdWRlIG5vbi1zdGFsbGluZyBwcm9jZXNzZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaWtlCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSwKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFIH0sIGV0Yy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyByZWNvcmQgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IG1hdGNoIHRoZSBhZHZlcnRpc2VkCisgICAgICogc3VwcG9ydGVkIG1lZGlhIHByb2ZpbGVzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gd2l0aAorICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gc25hcHNob3QgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhdCBsZWFzdCBhcyBiaWcgYXMKKyAgICAgKiB0aGUgbWF4aW11bSBSRUNPUkQgcmVzb2x1dGlvbnMgYW5kIG9ubHkgd2l0aAorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgSlBFRyBvdXRwdXQgZm9ybWF0fS4KKyAgICAgKiBBZGRpdGlvbmFsbHkgdGhlIGNvbmZpZ3VyYXRpb25zIHNob3VsZG4ndCBjYXVzZSBwcmV2aWV3IGdsaXRjaGVzIGFuZCBhbHNvIGJlIGFibGUgdG8KKyAgICAgKiBydW4gYXQgMzAgZnBzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZJREVPX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzbmFwc2hvdCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSB3aXRoCisgICAgICogc2l6ZSBjbG9zZSB0byBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIGFuZAorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgSlBFRyBvdXRwdXQgZm9ybWF0fS4KKyAgICAgKiBUYWtpbmcgaW50byBhY2NvdW50IHJlc3RyaWN0aW9ucyBvbiBhc3BlY3QgcmF0aW8sIGFsaWdubWVudCBldGMuIHRoZSBhcmVhIG9mIHRoZQorICAgICAqIG1heGltdW0gc3VnZ2VzdGVkIHNpemUgc2hvdWxkbuKAmXQgYmUgbGVzcyB0aGFuIDk3JSBvZiB0aGUgc2Vuc29yIGFycmF5IHNpemUgYXJlYS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgYmUgYWR2ZXJ0aXNlZCB3aXRoCisgICAgICogWlNMIGFsb25nIHdpdGggb3RoZXIgcHJvY2Vzc2VkIGFuZC9vciBzdGFsbGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19aU0wgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgcmF3IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgaW5jbHVkZSBSQVcgYmFzZWQKKyAgICAgKiBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SQVcgICA9IDB4NSwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgdGhlIHJlY29tbWVuZGVkIGxvdyBsYXRlbmN5IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGhhdmUKKyAgICAgKiBlbmQtdG8tZW5kIGxhdGVuY3kgdGhhdCBkb2VzIG5vdCBleGNlZWQgMjAwIG1zLiB1bmRlciBzdGFuZGFyZCBvcGVyYXRpbmcgY29uZGl0aW9ucworICAgICAqIChyZWFzb25hYmxlIGxpZ2h0IGxldmVscywgbm90IGxvYWRlZCBzeXN0ZW0pIGFuZCB1c2luZyB0ZW1wbGF0ZQorICAgICAqIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUuIFRoaXMgaXMgcHJpbWFyaWx5IGZvciBsaXN0aW5nIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgb3V0cHV0IGZvcm1hdH0KKyAgICAgKiBob3dldmVyIG90aGVyIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0cyBjYW4gYmUgYWRkZWQgYXMgd2VsbC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19MT1dfTEFURU5DWV9TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2LAorCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QVUJMSUNfRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcsCisKKyAgICAvKioKKyAgICAgKiA8cD5WZW5kb3IgZGVmaW5lZCB1c2UgY2FzZXMuIFRoZXNlIGRlcGVuZCBvbiB0aGUgdmVuZG9yIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZFTkRPUl9TVEFSVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCiAKIC8vIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NlbnNvcl9yZWZlcmVuY2VfaWxsdW1pbmFudDEgewpAQCAtNzQ3Niw2ICs4MDI3LDIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfUkdCICAgICAgICAgICAgICAgICA9IDQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgZG9lc24ndCBoYXZlIGFueSBCYXllciBjb2xvciBmaWx0ZXIuCisgICAgICogU3VjaCBzZW5zb3IgY2FwdHVyZXMgdmlzaWJsZSBsaWdodCBpbiBtb25vY2hyb21lLiBUaGUgZXhhY3Qgd2VpZ2h0aW5nIGFuZAorICAgICAqIHdhdmVsZW5ndGhzIGNhcHR1cmVkIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgb25seSBpbmNsdWRlcyB0aGUgdmlzaWJsZQorICAgICAqIGZyZXF1ZW5jaWVzLiBUaGlzIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTyAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgaGFzIGEgbmVhciBpbmZyYXJlZCBmaWx0ZXIgY2FwdHVyaW5nIGxpZ2h0IHdpdGggd2F2ZWxlbmd0aCBiZXR3ZWVuCisgICAgICogcm91Z2hseSA3NTBubSBhbmQgMTQwMG5tLCBhbmQgdGhlIHNhbWUgZmlsdGVyIGNvdmVycyB0aGUgd2hvbGUgc2Vuc29yIGFycmF5LiBUaGlzCisgICAgICogdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9OSVIgICAgICAgICAgICAgICAgID0gNiwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdDsKIAogLy8gQUNBTUVSQV9TRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFCkBAIC03NzY0LDYgKzgzMzAsNyBAQAogICAgICAqIGZpcmUgdGhlIGZsYXNoIGZvciBmbGFzaCBwb3dlciBtZXRlcmluZyBkdXJpbmcgcHJlY2FwdHVyZSwgYW5kIHRoZW4gZmlyZSB0aGUgZmxhc2gKICAgICAgKiBmb3IgdGhlIGZpbmFsIGNhcHR1cmUsIGlmIGEgZmxhc2ggaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgYW5kIHRoZSBBRSBtb2RlIGlzIHNldCB0bwogICAgICAqIGVuYWJsZSB0aGUgZmxhc2guPC9wPgorICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC9WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtNzkwNCw2ICs4NDcxLDE2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3Q7CiAKKy8vIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlIHsKQEAgLTc5NDcsNiArODUyNCwxNiBAQAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZV90OwogCiAKKy8vIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCisKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorI2RlZmluZSBfTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICisKKy8qKgorICogQGFkZHRvZ3JvdXAgQ2FtZXJhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrQ2FtZXJhV2luZG93VHlwZS5oCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aW5kb3cgdHlwZSB1c2VkIGJ5IE5ESyBhbmQgdGhlIFZOREsgdmFyaWFudHMgb2YgdGhlCisgKiBjYW1lcmEyIE5ESy4gVGhpcyBlbmFibGVzIHVzIHRvIHNoYXJlIHRoZSBhcGkgZGVmaW5pdGlvbiBoZWFkZXJzIGFuZCBhdm9pZAorICogY29kZSBkdXBsaWNhdGlvbiAoc2luY2UgdGhlIFZOREsgdmFyaWFudCBkb2Vzbid0IHVzZSBBTmF0aXZlV2luZG93IHVubGlrZSB0aGUKKyAqIE5ESyB2YXJpYW50KS4KKyAqLworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgordHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7CisjZWxzZQorI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgordHlwZWRlZiBBTmF0aXZlV2luZG93IEFDYW1lcmFXaW5kb3dUeXBlOworI2VuZGlmCisKKyNlbmRpZiAvL19OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAppbmRleCA0OTYxY2UzLi5kM2Y4ODI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCkBAIC0zNSw5ICszNSw5IEBACiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQVBUVVJFX1JFUVVFU1RfSAogI2RlZmluZSBfTkRLX0NBUFRVUkVfUkVRVUVTVF9ICkBAIC0xMDEsNyArMTAxLDggQEAKICAqCiAgKiBAc2VlIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQKICAqLwotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dHB1dCk7CitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBGcmVlIGEgQUNhbWVyYU91dHB1dFRhcmdldCBvYmplY3QuCkBAIC0xMTAsNyArMTExLDcgQEAKICAqCiAgKiBAc2VlIEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlCiAgKi8KLXZvaWQgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKEFDYW1lcmFPdXRwdXRUYXJnZXQqIG91dHB1dCk7Cit2b2lkIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogQWRkIGFuIHtAbGluayBBQ2FtZXJhT3V0cHV0VGFyZ2V0fSBvYmplY3QgdG8ge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0uCkBAIC0xMjMsNyArMTI0LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQoQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICBjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpOworICAgICAgICBjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUmVtb3ZlIGFuIHtAbGluayBBQ2FtZXJhT3V0cHV0VGFyZ2V0fSBvYmplY3QgZnJvbSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS4KQEAgLTEzOCw3ICsxMzksNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3Igb3V0cHV0IGlzIE5VTEwuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldChBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsCi0gICAgICAgIGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQqIG91dHB1dCk7CisgICAgICAgIGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBHZXQgYSBtZXRhZGF0YSBlbnRyeSBmcm9tIGlucHV0IHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9LgpAQCAtMTU4LDcgKzE1OSw3IEBACiAgKiAgICAgICAgICAgICBlbnRyeSBvZiBpbnB1dCB0YWcgdmFsdWUuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnkoCi0gICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkqIGVudHJ5KTsKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qCiAgKiBMaXN0IGFsbCB0aGUgZW50cnkgdGFncyBpbiBpbnB1dCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS4KQEAgLTE3OSw3ICsxODAsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRBbGxUYWdzKAotICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki9pbnQzMl90KiBudW1UYWdzLCAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKTsKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovaW50MzJfdCogbnVtVGFncywgLypvdXQqL2NvbnN0IHVpbnQzMl90KiogdGFncykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHVuc2lnbmVkIDggYml0cyBkYXRhIHR5cGUuCkBAIC0xOTgsNyArMTk5LDcgQEAKICAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbi48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfdTgoCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgdWludDhfdCogZGF0YSk7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgdWludDhfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHNpZ25lZCAzMiBiaXRzIGRhdGEgdHlwZS4KQEAgLTIxNyw3ICsyMTgsNyBAQAogICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzIoCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50MzJfdCogZGF0YSk7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50MzJfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIGZsb2F0IGRhdGEgdHlwZS4KQEAgLTIzNiw3ICsyMzcsNyBAQAogICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdCgKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBmbG9hdCogZGF0YSk7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgZmxvYXQqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgNjQgYml0cyBkYXRhIHR5cGUuCkBAIC0yNTUsNyArMjU2LDcgQEAKICAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbi48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0KAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGludDY0X3QqIGRhdGEpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGludDY0X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBkb3VibGUgZGF0YSB0eXBlLgpAQCAtMjc0LDcgKzI3NSw3IEBACiAgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24uPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2RvdWJsZSgKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBkb3VibGUqIGRhdGEpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGRvdWJsZSogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHJhdGlvbmFsIGRhdGEgdHlwZS4KQEAgLTI5NCwxNCArMjk1LDE0IEBACiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWwoCiAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwKLSAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKiBkYXRhKTsKKyAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEZyZWUgYSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBzdHJ1Y3R1cmUuCiAgKgogICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IHRvIGJlIGZyZWVkLgogICovCi12b2lkIEFDYXB0dXJlUmVxdWVzdF9mcmVlKEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCk7Cit2b2lkIEFDYXB0dXJlUmVxdWVzdF9mcmVlKEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCkBAIC0zMjUsNyArMzI2LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IGlzIE5VTEwuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldFVzZXJDb250ZXh0KAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHZvaWQqIGNvbnRleHQpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHZvaWQqIGNvbnRleHQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogR2V0IHRoZSB1c2VyIGNvbnRleHQgcG9pbnRlciBvZiB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0KQEAgLTM0MSw3ICszNDIsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3QgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQoCi0gICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3ZvaWQqKiBjb250ZXh0KTsKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovdm9pZCoqIGNvbnRleHQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQ3JlYXRlIGEgY29weSBvZiBpbnB1dCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS4KQEAgLTM1MywxMCArMzU0LDIyMyBAQAogICoKICAqIEByZXR1cm4gYSB2YWxpZCBBQ2FwdHVyZVJlcXVlc3QgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBpbnB1dCByZXF1ZXN0IGNhbm5vdCBiZSBjb3BpZWQuCiAgKi8KLUFDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpOworQUNhcHR1cmVSZXF1ZXN0KiBBQ2FwdHVyZVJlcXVlc3RfY29weShjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNyYykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogR2V0IGEgbWV0YWRhdGEgZW50cnkgZnJvbSBpbnB1dCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIGJhY2tpbmcgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeSwgZXhjZXB0IHRoYXQgaWYgdGhlIGtleSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIHRoZSBlbnRyeSBzZXQgYnkgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhXyogY2xhc3Mgb2YKKyAqIGZ1bmN0aW9ucyBvbiB0aGUgcGFydGljdWxhciBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfQorICogICAgICAgICAgICB0aGF0IGlzIHNldCBieSBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfKiBjbGFzcyBvZiBmdW5jdGlvbnMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgbWV0YWRhdGEsIHBoeXNpY2FsSWQsIG9yIGVudHJ5IGlzIE5VTEwsCisgKiAgICAgICAgIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlCisgKiAgICAgICAgIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubyBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9NRVRBREFUQV9OT1RfRk9VTkR9IGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgZG9lcyBub3QgY29udGFpbiBhbgorICogICAgICAgICAgICAgZW50cnkgb2YgaW5wdXQgdGFnIHZhbHVlLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5X3BoeXNpY2FsQ2FtZXJhKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5KiBlbnRyeSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHVuc2lnbmVkIDggYml0cyBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHVuc2lnbmVkIDggYml0cywKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfdTgoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgdWludDhfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHNpZ25lZCAzMiBiaXRzIGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2kzMiwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCBzaWduZWQgMzIgYml0cywKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTMyKAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGludDMyX3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBmbG9hdCBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCBmbG9hdCwKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZmxvYXQoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgZmxvYXQqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgNjQgYml0cyBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pNjQsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3Qgc2lnbmVkIDY0IGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2k2NCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQ2NF90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZG91YmxlIGRhdGEgdHlwZSBmb3IKKyAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2RvdWJsZSwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCBkb3VibGUsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2RvdWJsZSgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBkb3VibGUqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCByYXRpb25hbCBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9yYXRpb25hbCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCByYXRpb25hbCwKKyAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbiwgcGh5c2ljYWxJZCBpcyBub3Qgb25lIG9mIHRoZSBJZHMgdXNlZAorICogICAgICAgICAgICAgaW4gY3JlYXRpbmcgdGhlIHJlcXVlc3QsIG9yIGlmIHRoZSBjYXB0dXJlIHJlcXVlc3QgaXMgYSByZWd1bGFyIHJlcXVlc3Qgd2l0aCBubworICogICAgICAgICAgICAgcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfcmF0aW9uYWwoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBUFRVUkVfUkVRVUVTVF9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dCBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CmluZGV4IGQxNzlhYTAuLmI2ZjE1NTMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CisrKyBiL2NhbWVyYS9uZGsvbGliY2FtZXJhMm5kay5tYXAudHh0CkBAIC0yLDE1ICsyLDE5IEBACiAgIGdsb2JhbDoKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fYWJvcnRDYXB0dXJlczsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZTsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RvcFJlcGVhdGluZzsKLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CiAgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdDsKKyAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkczsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbjsKLSAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzOworICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnM7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYURldmljZV9nZXRJZDsKICAgICBBQ2FtZXJhTWFuYWdlcl9jcmVhdGU7CiAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlOwpAQCAtMjAsMzQgKzI0LDQ1IEBACiAgICAgQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYTsKICAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrOwogICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjazsKKyAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOQorICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhTWV0YWRhdGFfY29weTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0QWxsVGFnczsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeTsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0OwotICAgIEFDYXB0dXJlUmVxdWVzdF9jb3B5OworICAgIEFDYXB0dXJlUmVxdWVzdF9jb3B5OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0QWxsVGFnczsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeTsKLSAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQ7CisgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnlfcGh5c2ljYWxDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQorICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRVc2VyQ29udGV4dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldDsKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlOworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZmxvYXQ7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzI7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTY0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWw7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfdTg7Ci0gICAgQUNhcHR1cmVSZXF1ZXN0X3NldFVzZXJDb250ZXh0OworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV91ODsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldFVzZXJDb250ZXh0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX3JlbW92ZTsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlOwotICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGU7Ci0gICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZDsKLSAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOworICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQ7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWU7CiAgIGxvY2FsOgogICAgICo7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWY4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtV2luZG93ID09IG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPCBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKKyAgICBzdGQ6OnNldDxhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOworICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CisgICAgc3RkOjpzdHJpbmcgbVBoeXNpY2FsQ2FtZXJhSWQ7Cit9OworCisKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjODM1NQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTcxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYURldmljZVZlbmRvciIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorCisjZGVmaW5lIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCBzdGF0dXMsIGNhbGxOYW1lKSBcCisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7IFwKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBkdXJpbmcgJXMgY2FsbCAlcyIsIF9fRlVOQ1RJT05fXywgY2FsbE5hbWUsIFwKKyAgICAgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOyBcCisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047IFwKKyAgICB9IFwKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsgXAorICAgICAgICBBTE9HRSgiJXM6ICVzIGNhbGwgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBjYWxsTmFtZSk7IFwKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsgXAorICAgIH0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0FDYW1lcmFEZXZpY2U6On5BQ2FtZXJhRGV2aWNlKCkgeworICAgIG1EZXZpY2UtPnN0b3BMb29wZXIoKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIFNlc3Npb25Db25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTZXNzaW9uQ29uZmlndXJhdGlvbjsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtFcnJvckNvZGVLZXkgICAgICA9ICJFcnJvckNvZGUiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FsbGJhY2tGcEtleSAgICAgPSAiQ2FsbGJhY2siOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2Vzc2lvblNwS2V5ICAgICAgPSAiU2Vzc2lvblNwIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXF1ZXN0S2V5ID0gIkNhcHR1cmVSZXF1ZXN0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1RpbWVTdGFtcEtleSAgICAgID0gIlRpbWVTdGFtcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVzdWx0S2V5ICA9ICJDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSA9ICJQaHlzaWNhbENhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtBbndLZXkgICAgICAgICAgICA9ICJBbnciOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQ9ICJGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZCI7CisKKy8qKgorICogQ2FtZXJhRGV2aWNlIEltcGxlbWVudGF0aW9uCisgKi8KK0NhbWVyYURldmljZTo6Q2FtZXJhRGV2aWNlKAorICAgICAgICBjb25zdCBjaGFyKiBpZCwKKyAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpIDoKKyAgICAgICAgbUNhbWVyYUlkKGlkKSwKKyAgICAgICAgbUFwcENhbGxiYWNrcygqY2IpLAorICAgICAgICBtQ2hhcnMoc3RkOjptb3ZlKGNoYXJzKSksCisgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sobmV3IFNlcnZpY2VDYWxsYmFjayh0aGlzKSksCisgICAgICAgIG1XcmFwcGVyKHdyYXBwZXIpLAorICAgICAgICBtSW5FcnJvcihmYWxzZSksCisgICAgICAgIG1FcnJvcihBQ0FNRVJBX09LKSwKKyAgICAgICAgbUlkbGUodHJ1ZSksCisgICAgICAgIG1DdXJyZW50U2Vzc2lvbihudWxscHRyKSB7CisgICAgbUNsb3NpbmcgPSBmYWxzZTsKKyAgICAvLyBTZXR1cCBsb29wZXIgdGhyZWFkIHRvIHBlcmZyb20gZGV2aWNlIGNhbGxiYWNrcyB0byBhcHAKKyAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2JMb29wZXItPnNldE5hbWUoIkMyTi1kZXYtbG9vcGVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIC8qcnVuT25DYWxsaW5nVGhyZWFkKi9mYWxzZSwKKyAgICAgICAgICAgIC8qY2FuQ2FsbEphdmEqLyAgICAgICB0cnVlLAorICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICB9CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKGlkKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMSkgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHBhcnRpYWwgcmVzdWx0IGNvdW50IiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QYXJ0aWFsUmVzdWx0Q291bnQgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBzaGFkaW5nIG1hcCBzaXplIiwgX19GVU5DVElPTl9fLCBlbnRyeS5jb3VudCk7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IDA7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVsxXSA9IGVudHJ5LmRhdGEuaTMyWzFdOworICAgIH0KK30KKworLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCitDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgICAgIGlmICghaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgZGlzY29ubmVjdExvY2tlZChzZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYkxvb3BlciAhPSBudWxscHRyLAorICAgICAgICAgICAgIkNhbWVyYURldmljZSBsb29wZXIgc2hvdWxkJ3ZlIGJlZW4gc3RvcHBlZCBiZWZvcmUgfkNhbWVyYURldmljZSIpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtc2cuY2xlYXIoKTsKKyAgICBzcDxBTWVzc2FnZT4gY2xlYW51cE1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsZWFuVXBTZXNzaW9ucywgbUhhbmRsZXIpOworICAgIGNsZWFudXBNc2ctPnBvc3QoKTsKK30KKworLy8gVE9ETzogY2FjaGVkIGNyZWF0ZWQgcmVxdWVzdD8KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3UmVxdWVzdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICBbJnN0YXR1cywgJnJhd1JlcXVlc3RdKGF1dG8gcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SICYmIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdSZXF1ZXN0KSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgc3RhdHVzLCAiY3JlYXRlRGVmYXVsdFJlcXVlc3QoKSIpCisgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQorICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqcmVxdWVzdCA9IG91dFJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChjdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGN1cnJlbnRTZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgIHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG5ld1Nlc3Npb24gPSBuZXcgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgbU5leHRTZXNzaW9uSWQrKywgb3V0cHV0cywgY2FsbGJhY2tzLCB0aGlzKTsKKworICAgIC8vIHNldCBuZXcgc2Vzc2lvbiBhcyBjdXJyZW50IHNlc3Npb24KKyAgICBuZXdTZXNzaW9uLT5pbmNTdHJvbmcoKHZvaWQgKikgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbik7CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAqc2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWc7CisgICAgc2Vzc2lvbkNvbmZpZy5pbnB1dFdpZHRoID0gMDsKKyAgICBzZXNzaW9uQ29uZmlnLmlucHV0SGVpZ2h0ID0gMDsKKyAgICBzZXNzaW9uQ29uZmlnLmlucHV0Rm9ybWF0ID0gLTE7CisgICAgc2Vzc2lvbkNvbmZpZy5vcGVyYXRpb25Nb2RlID0gU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOworICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtcy5yZXNpemUoc2Vzc2lvbk91dHB1dENvbnRhaW5lci0+bU91dHB1dHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgb3V0cHV0IDogc2Vzc2lvbk91dHB1dENvbnRhaW5lci0+bU91dHB1dHMpIHsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS5yb3RhdGlvbiA9IHV0aWxzOjpjb252ZXJ0VG9IaWRsKG91dHB1dC5tUm90YXRpb24pOworICAgICAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXNbaW5kZXhdLndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQubVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtc1tpbmRleF0ud2luZG93SGFuZGxlc1swXSA9IG91dHB1dC5tV2luZG93OworICAgICAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXNbaW5kZXhdLnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXQubVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgYm9vbCBjb25maWdTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uQ29uZmlnLAorICAgICAgICBbJnN0YXR1cywgJmNvbmZpZ1N1cHBvcnRlZF0oYXV0byBzLCBhdXRvIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGNvbmZpZ1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgfSk7CisKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgc3RhdHVzLCAiaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgpIik7CisgICAgcmV0dXJuIGNvbmZpZ1N1cHBvcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1NUUkVBTV9DT05GSUdVUkVfRkFJTDsKK30KKworc3RhdGljIHZvaWQgYWRkTWV0YWRhdGFUb1BoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKm1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSAqbWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNhbWVyYV9tZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5yZWxlYXNlKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFfbWV0YWRhdGEsICZoQ2FtZXJhTWV0YWRhdGEsIC8qc2hvdWxkT3duKi8gdHJ1ZSk7CisgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+c2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmlkID0gY2FtZXJhSWQ7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjphZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpIHsKKyAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxICsgYUNhcHR1cmVSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLnNpemUoKSk7CisgICAgYWRkTWV0YWRhdGFUb1BoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoJihhQ2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSksIGdldElkKCksCisgICAgICAgICAgICAgICAgICAgICYocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXSkpOworICAgIHNpemVfdCBpID0gMTsKKyAgICBmb3IgKGF1dG8gJnBoeXNpY2FsU2V0dGluZyA6IGFDYXB0dXJlUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBhZGRNZXRhZGF0YVRvUGh5c2ljYWxDYW1lcmFTZXR0aW5ncygmKHBoeXNpY2FsU2V0dGluZy5zZWNvbmQtPmdldEludGVybmFsRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmcuZmlyc3QsICYocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpXSkpOworICAgICAgICBpKys7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoa3ZQYWlyLnNlY29uZC5maXJzdCwgb3V0cHV0LT5tV2luZG93KSkgeworICAgICAgICAgICAgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RyZWFtSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogSW52YWxpZCBvdXRwdXQgY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdXOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZyA9IG91dENvbmZpZ1cubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgb3V0Q29uZmlnLnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0cHV0LT5tUm90YXRpb24pOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIG91dENvbmZpZy5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBpbnQgaSA9IDE7CisgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzW2krK10gPSBhbnc7CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRDb25maWcpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIHVwZGF0aW5nIE91dHB1dENvbmZpZ3VyYXRpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbW90ZVJldCkgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgb3BlcmF0aW9uIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgb3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGFkZCBzaGFyZWQgb3V0cHV0IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6YWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+ICZvdXRSZXEpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxICsgcmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncy5zaXplKCkpOworCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBhbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzW2luZGV4KytdLCBtQ2FtZXJhSWQsIHJlcXVlc3QtPnNldHRpbmdzKTsKKworICAgIGZvciAoYXV0byYgcGh5c2ljYWxFbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaW5kZXgrK10sCisgICAgICAgICAgICAgICAgcGh5c2ljYWxFbnRyeS5maXJzdCwgcGh5c2ljYWxFbnRyeS5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdHJlYW1JZHhMaXN0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdXJmYWNlSWR4TGlzdDsKKyAgICBmb3IgKGF1dG8gb3V0cHV0VGFyZ2V0IDogcmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICByZXEtPm1TdXJmYWNlTGlzdC5wdXNoX2JhY2soYW53KTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciYgb3V0Q29uZmlnID0ga3ZQYWlyLnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0Q29uZmlnLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgICAgICBmb3IgKGludCBzdXJmYWNlSWQgPSAwOyBzdXJmYWNlSWQgPCAoaW50KSB3aW5kb3dIYW5kbGVzLnNpemUoKTsgc3VyZmFjZUlkKyspIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0d28gbmF0aXZlIGhhbmRsZXMgYXJlIGVxdWl2YWxlbnQsIHNvIGFyZSB0aGVpciBzdXJmYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1tzdXJmYWNlSWRdLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW53KSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlZCBvdXRwdXQgdGFyZ2V0ICVwIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBhbncpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnJlc2l6ZShyZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLnN0cmVhbUlkID0gcmVxdWVzdFN0cmVhbUlkeExpc3RbaV07CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS53aW5kb3dJZCA9IHJlcXVlc3RTdXJmYWNlSWR4TGlzdFtpXTsKKyAgICB9CisgICAgb3V0UmVxID0gcmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkIENhbWVyYURldmljZTo6YWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzJiBjYW1lcmFTZXR0aW5ncywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+JiBtZXRhZGF0YSkgeworICAgIGNhbWVyYVNldHRpbmdzLmlkID0gaWQ7CisgICAgLy8gVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gY29weSB0aGUgbWV0YWRhdGEgaGVyZSA/CisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5ID0gbWV0YWRhdGEtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFNZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5yZWxlYXNlKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFNZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSwgdHJ1ZSk7CisgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oaENhbWVyYU1ldGFkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBmaWVsZCBvZiB0aGUgdW5pb24gd291bGQndmUgYmVlbiBkZXN0cnVjdHVlZCwgc28gbm8gbmVlZAorICAgICAgICAgICAgLy8gdG8gcmUtc2l6ZSBpdC4KKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZShoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGbXEgd3JpdGUgY2FwdHVyZSByZXN1bHQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiKTsKKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLm1ldGFkYXRhKHN0ZDo6bW92ZShoQ2FtZXJhTWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitBQ2FwdHVyZVJlcXVlc3QqCitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLCBjb25zdCBjaGFyKiBkZXZpY2VJZCkgeworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uaWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lOworICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uc2V0dGluZ3MubWV0YWRhdGEoKSwgJmNsb25lKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNsb25lcCA9IGNsb25lLnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKGlkID09IGRldmljZUlkKSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lcCwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5nc1tyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldLmlkXSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmVwLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCBvdXRwdXRUYXJnZXQoYW53KTsKKyAgICAgICAgcFJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzLmluc2VydChvdXRwdXRUYXJnZXQpOworICAgIH0KKyAgICByZXR1cm4gcFJlcXVlc3Q7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqIHJlcSkgeworICAgIGlmIChyZXEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICBkZWxldGUgcmVxLT50YXJnZXRzOworICAgIGRlbGV0ZSByZXE7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6bm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBpZiAoaXNDbG9zZWQoKSkgeworICAgICAgICAvLyBEZXZpY2UgaXMgY2xvc2luZyBhbHJlYWR5LiBkbyBub3RoaW5nCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworCisgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KKyAgICBpZiAoIXNlc3Npb24tPm1Jc0Nsb3NlZCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IHVuY2xvc2VkIHNlc3Npb24gJXAgcmVhY2hlcyBlbmQgb2YgbGlmZSEiLCBzZXNzaW9uKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlIHN0cmVhbSBmYWlsZWQuIERldmljZSBtaWdodCBzdGlsbCBiZSBjb25maWd1cmVkISByZXQgJWQiLCByZXQpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBpZiAobUNsb3NpbmcuZXhjaGFuZ2UodHJ1ZSkpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBjbG9zaW5nLCBqdXN0IHJldHVybgorICAgICAgICBBTE9HVygiQ2FtZXJhIGRldmljZSAlcyBpcyBhbHJlYWR5IGNsb3NpbmcuIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgZGlzY29ubmVjdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUmVtb3RlID0gbnVsbHB0cjsKKworICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OnN0b3BSZXBlYXRpbmdMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IG1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShTdGF0dXMgcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZW1vdGVSZXQsIHN0YXR1cywgImNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoKSIpOworICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgYWJvcnQgY2FwdHVyZXMgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQorICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KKyAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgorICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmcpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBpcyBhbHJlYWR5IGFib3J0aW5nIGNhcHR1cmVzIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIG1GbHVzaGluZyA9IHRydWU7CisKKyAgICAvLyBTZW5kIG9uQWN0aXZlIGNhbGxiYWNrIHRvIGd1YXJhbnRlZSB0aGVyZSBpcyBhbHdheXMgYWN0aXZlLT5yZWFkeSB0cmFuc2l0aW9uCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgLy8gSWYgZGV2aWNlIGlzIGFscmVhZHkgaWRsaW5nLCBzZW5kIGNhbGxiYWNrIGFuZCBleGl0IGVhcmx5CisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OlVOS05PV05fRVJST1I7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5mbHVzaChbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oYXV0byBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCBzdGF0dXMsICJmbHVzaCgpIikKKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChtUmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjp3YWl0VW50aWxJZGxlTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIldhaXQgdW50aWwgY2FtZXJhICVzIGlkbGUgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd29uJ3QgZ28gdG8gaWRsZSB3aGVuIHRoZXJlIGlzIHJlcGVhdGluZyByZXF1ZXN0ISIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAid2FpdFVudGlsSWRsZSgpIikKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gb3V0cHV0U2V0OworICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdJbnNlcnRXOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRDb25maWdJbnNlcnQgPSBvdXRDb25maWdJbnNlcnRXLm1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBvdXRDb25maWdJbnNlcnQucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRDb25maWcubVJvdGF0aW9uKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXMucmVzaXplKG91dENvbmZpZy5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXNbMF0gPSBhbnc7CisgICAgICAgIG91dENvbmZpZ0luc2VydC5waHlzaWNhbENhbWVyYUlkID0gb3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHdyYXAoYW53KTsKKyAgICAgICAgb3V0cHV0U2V0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihhbncsIG91dENvbmZpZ0luc2VydFcpKTsKKyAgICB9CisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc3RyZWFtcyBuZWVkIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHRvIGJlIGRlbGV0ZWQKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICBhdXRvJiBvdXRwdXRQYWlyID0ga3ZQYWlyLnNlY29uZDsKKyAgICAgICAgaWYgKG91dHB1dFNldC5jb3VudChvdXRwdXRQYWlyKSkgeworICAgICAgICAgICAgZGVsZXRlTGlzdC5wdXNoX2JhY2soc3RyZWFtSWQpOyAvLyBOZWVkIHRvIGRlbGV0ZSBhIG5vIGxvbmdlciBuZWVkZWQgc3RyZWFtCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRTZXQuZXJhc2Uob3V0cHV0UGFpcik7ICAgICAgICAvLyBObyBuZWVkIHRvIGFkZCBhbHJlYWR5IGV4aXN0aW5nIHN0cmVhbQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gd2FpdFVudGlsSWRsZUxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3YWl0IHVudGlsIGlkbGUgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFNlbmQgb25SZWFkeSB0byBwcmV2aW91cyBzZXNzaW9uCisgICAgLy8gQ3VycmVudFNlc3Npb24gd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGNvbmZpZ3VyZVN0cmVhbUxvY2tlZCwgc28gaGVyZQorICAgIC8vIG1DdXJyZW50U2Vzc2lvbiBpcyB0aGUgc2Vzc2lvbiB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzZXNzaW9uCisgICAgaWYgKCFtSWRsZSAmJiBtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1c3lTZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIG1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBtQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gdHJ1ZTsKKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAiYmVnaW5Db25maWd1cmUoKSIpCisKKyAgICAvLyBkZWxldGUgdG8tYmUtZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogZGVsZXRlTGlzdCkgeworICAgICAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgICAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAiZGVsZXRlU3RyZWFtKCkiKQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuZXJhc2Uoc3RyZWFtSWQpOworICAgIH0KKworICAgIC8vIGFkZCBuZXcgc3RyZWFtcworICAgIGZvciAoYXV0byBvdXRwdXRQYWlyIDogYWRkU2V0KSB7CisgICAgICAgIGludCBzdHJlYW1JZDsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0UGFpci5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc3RyZWFtSWRdKFN0YXR1cyBzLCBhdXRvIHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZXQsIHN0YXR1cywgImNyZWF0ZVN0cmVhbSgpIikKKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdHJlYW1JZCwgb3V0cHV0UGFpcikpOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIHBhcmFtczsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbFBhcmFtczsKKyAgICBpZiAoKHNlc3Npb25QYXJhbWV0ZXJzICE9IG51bGxwdHIpICYmIChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnBhcmFtc19tZXRhZGF0YSA9IHBhcmFtcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHBhcmFtc19tZXRhZGF0YSwgJmhpZGxQYXJhbXMpOworICAgICAgICBwYXJhbXMudW5sb2NrKHBhcmFtc19tZXRhZGF0YSk7CisgICAgfQorICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUsIGhpZGxQYXJhbXMpOworICAgIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCByZW1vdGVSZXQsICJlbmRDb25maWd1cmUoKSIpCisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIG1SZW1vdGUgPSByZW1vdGU7Cit9CisKK2Jvb2wKK0NhbWVyYURldmljZTo6c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBBTE9HRSgibVJlbW90ZSBtdXN0IG5vdCBiZSBudWxsIHdoaWxlIHRyeWluZyB0byBmZXRjaCBtZXRhZGF0YSBxdWV1ZXMiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiAmcmVxUXVldWUgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgWyZyZXFRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXFRdWV1ZS0+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+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OnN0b3BMb29wZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKKy8qKgorICAqIENhbWVyYSBzZXJ2aWNlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICovCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25EZXZpY2VFcnJvcigKKyAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQUxPR0QoIkRldmljZSBlcnJvciByZWNlaXZlZCwgY29kZSAlZCwgZnJhbWUgbnVtYmVyICUiIFBSSWQ2NCAiLCByZXF1ZXN0IElEICVkLCBzdWJzZXEgSUQgJWQiCisgICAgICAgICAgICAiIHBoeXNpY2FsIGNhbWVyYSBJRCAlcyIsIGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAorICAgICAgICAgICAgcmVzdWx0RXh0cmFzLmJ1cnN0SWQsIHJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGRldi0+bUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENhbWVyYSBpcyBkaXNjb25uZWN0ZWQsIGNsb3NlIHRoZSBzZXNzaW9uIGFuZCBleHBlY3Qgbm8gbW9yZSBjYWxsYmFja3MKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25EaXNjb25uZWN0ZWQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRGlzY29ubmVjdGVkKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGVycm9yIGZyb20gY2FtZXJhIGRldmljZTogJWQiLCBlcnJvckNvZGUpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGlzIHN3aXRjaCBzaW5jZSB0aGlzIGJsb2NrIG1pZ2h0IGJlIGVuY291bnRlcmVkIHdpdGgKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBqdXN0IDIgc3RhdGVzLiBUaGUgZGVmYXVsdCBmYWxsdGhyb3VnaCBjb3VsZCBoYXZlIHVzCisgICAgICAgICAgICAvLyBoYW5kbGluZyBtb3JlIHVubWF0Y2hlZCBlcnJvciBjYXNlcy4KKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25FcnJvciwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25FcnJvcik7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKGtFcnJvckNvZGVLZXksIGVycm9yVmFsKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICBkZXYtPm9uQ2FwdHVyZUVycm9yTG9ja2VkKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25EZXZpY2VJZGxlKCkgeworICAgIEFMT0dWKCJDYW1lcmEgaXMgbm93IGlkbGUiKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tSWRsZSkgeworICAgICAgICAvLyBBbHJlYWR5IGluIGlkbGUgc3RhdGUuIFBvc3NpYmx5IG90aGVyIHRocmVhZCBkaWQgd2FpdFVudGlsSWRsZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJvbkRldmljZUlkbGUgc2VuZGluZyBzdGF0ZSBjYiIpOworICAgICAgICBpZiAoZGV2LT5tQnVzeVNlc3Npb24gIT0gZGV2LT5tQ3VycmVudFNlc3Npb24pIHsKKyAgICAgICAgICAgIEFMT0dFKCJDdXJyZW50IHNlc3Npb24gIT0gYnVzeSBzZXNzaW9uIik7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGRldi0+bUJ1c3lTZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBzcCBmaXJzdCBzbyB0aGUgc2Vzc2lvbiBkZXN0cnVjdG9yIGNhbgorICAgICAgICAvLyBvbmx5IGhhcHBlbiBvbiBoYW5kbGVyIHRocmVhZCAod2hlcmUgd2UgZG9uJ3QgaG9sZCBkZXZpY2Uvc2Vzc2lvbiBsb2NrKQorICAgICAgICBkZXYtPm1CdXN5U2Vzc2lvbi5jbGVhcigpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBkZXYtPm1JZGxlID0gdHJ1ZTsKKyAgICBkZXYtPm1GbHVzaGluZyA9IGZhbHNlOworICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkNhcHR1cmVTdGFydGVkKAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBib29sICAgIGlzUGFydGlhbFJlc3VsdCA9IChyZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgZGV2LT5tUGFydGlhbFJlc3VsdENvdW50KTsKKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIEFMT0dWKCJTZXFJZCAlZCBmcmFtZSAlIiBQUklkNjQgIiByZXN1bHQgYXJyaXZlLiIsIHNlcXVlbmNlSWQsIGZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQKKyAgICB9CisKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWFybHkgcmV0dXJuIHRvIGF2b2lkIGNhbGxiYWNrIHNlbnQgdG8gY2xvc2VkIGRldmljZXMKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHk7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShyZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgICAgIGRldi0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLmdldCgpLCAmbWV0YWRhdGFDb3B5KTsKKyAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXN1bHQgbWV0YWRhdGEgY291bGRuJ3QgYmUgY29udmVydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUsIGRldi0+bVNoYWRpbmdNYXBTaXplLCAvKmRhdGFfY291bnQqLzIpOworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwgJmZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChuZXcgQUNhbWVyYU1ldGFkYXRhKAorICAgICAgICAgICAgICAgIG1ldGFkYXRhQ29weS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFU1VMVCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4gbG9jYWxQaHlzaWNhbFJlc3VsdDsKKyAgICAgICAgbG9jYWxQaHlzaWNhbFJlc3VsdC5yZXNpemUocGh5c2ljYWxSZXN1bHRJbmZvcy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mb3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGxvY2FsUGh5c2ljYWxSZXN1bHRbaV0ucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsUmVzdWx0SW5mb3NbaV0ucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShwaHlzaWNhbFJlc3VsdEluZm9zW2ldLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIGRldi0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAmbG9jYWxQaHlzaWNhbFJlc3VsdFtpXS5waHlzaWNhbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhsb2NhbFBoeXNpY2FsUmVzdWx0LCBmcmFtZU51bWJlcikpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQgOiBrV2hhdENhcHR1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOworICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVQcm9ncmVzc2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksIHBoeXNpY2FsUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIGRldi0+Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgdWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLCBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworCisgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgIGlmIChzdG9wcGVkU2VxdWVuY2VJZCA9PSByZXBlYXRpbmdTZXF1ZW5jZUlkKSB7CisgICAgICAgIGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisgICAgfQorCisgICAgZGV2LT5jaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6cmVhZE9uZVJlc3VsdE1ldGFkYXRhKAorICAgICAgICBjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgZm1xU2l6ZU9yTWV0YWRhdGEsIFJlc3VsdE1ldGFkYXRhUXVldWUqIG1ldGFkYXRhUXVldWUsCisgICAgICAgIENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgeworICAgIGlmIChtZXRhZGF0YVF1ZXVlID09IG51bGxwdHIgfHwgbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgYm9vbCBjb252ZXJ0ZWQ7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICBpZiAoZm1xU2l6ZU9yTWV0YWRhdGEuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgaENhbWVyYU1ldGFkYXRhLnJlc2l6ZShmbXFTaXplT3JNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgIGJvb2wgcmVhZCA9IG1ldGFkYXRhUXVldWUtPnJlYWQoCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLmRhdGEoKSwgZm1xU2l6ZU9yTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYXB0dXJlIHJlcXVlc3Qgc2V0dGluZ3MgY291bGQndCBiZSByZWFkIGZyb20gZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogRG8gd2UgYWN0dWFsbHkgbmVlZCB0byBjbG9uZSBoZXJlID8KKyAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChoQ2FtZXJhTWV0YWRhdGEsIG1ldGFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGZtcVNpemVPck1ldGFkYXRhLm1ldGFkYXRhKCksIG1ldGFkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydGVkID8gQUNBTUVSQV9PSyA6IEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjhhODUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTAsMCArMSw0MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfQUNBTUVSQV9ERVZJQ0VfSAorI2RlZmluZSBfQUNBTUVSQV9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBJQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgRm1xU2l6ZU9yTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOwordXNpbmcgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgdXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI7Cit1c2luZyB1dGlsczo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyB1dGlsczo6T3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI7CisKKy8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IENhbWVyYUNhcHR1cmVGYWlsdXJlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgeyB9OworCisvLyBXcmFwIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gc28gdGhhdCBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWwgeworICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxNZXRhZGF0YTsKK307CisKK3N0cnVjdCBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzogcHVibGljIFJlZkJhc2UgeworICAgIEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4mIGluZm8sCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSA6CisgICAgICAgIG1QaHlzaWNhbFJlc3VsdEluZm8oaW5mbyksIG1GcmFtZU51bWJlcihmcmFtZU51bWJlcikge30KKworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKK2NsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcik7CisgICAgfkNhbWVyYURldmljZSgpOworCisgICAgaW5saW5lIGNvbnN0IGNoYXIqIGdldElkKCkgY29uc3QgeyByZXR1cm4gbUNhbWVyYUlkLmNfc3RyKCk7IH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxDYW1lcmFJZExpc3QsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSBjb25zdDsKKworICAgIC8vIENhbGxiYWNrcyBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgY2xhc3MgU2VydmljZUNhbGxiYWNrIDogcHVibGljIElDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFNlcnZpY2VDYWxsYmFjayhDYW1lcmFEZXZpY2UqIGRldmljZSkgOiBtRGV2aWNlKGRldmljZSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUVycm9yKEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IodWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIG92ZXJyaWRlOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgZm1xU2l6ZU9yTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKTsKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIH07CisgICAgaW5saW5lIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICB9OworCisgICAgLy8gQ2FtZXJhIGRldmljZSBpcyBvbmx5IGZ1bmN0aW9uYWwgYWZ0ZXIgcmVtb3RlIGJlaW5nIHNldAorICAgIHZvaWQgc2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpOworCisgICAgYm9vbCBzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIGlubGluZSBBQ2FtZXJhRGV2aWNlKiBnZXRXcmFwcGVyKCkgY29uc3QgeyByZXR1cm4gbVdyYXBwZXI7IH07CisKKyAgICAvLyBTdG9wIHRoZSBsb29wZXIgdGhyZWFkIGFuZCB1bnJlZ2lzdGVyIHRoZSBoYW5kbGVyCisgICAgdm9pZCBzdG9wTG9vcGVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOworCisgICAgY2FtZXJhX3N0YXR1c190IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0OworCisgICAgLy8gZGV2aWNlIGdvZXMgaW50byBmYXRhbCBlcnJvciBzdGF0ZSBhZnRlciB0aGlzCisgICAgdm9pZCBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpOworCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKKworICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgd2FpdFVudGlsSWRsZUxvY2tlZCgpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOworCisgICAgdm9pZCBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpOworCisgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpOworCisgICAgLy8gU2luY2UgdGhpcyB3cml0ZXMgdG8gSUNhbWVyYURldmljZVVzZXIncyBmbXEsIGNsaWVudHMgbXVzdCB0YWtlIGNhcmUgdGhhdDoKKyAgICAvLyAgIGEpIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHNlcmlhbGx5LgorICAgIC8vICAgYikgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIElDYW1lcmFEZXZpY2VVc2VyLnN1Ym1pdFJlcXVlc3RMaXN0LAorICAgIC8vICAgICAgb3RoZXJ3aXNlLCB0aGUgd3JvbmcgY2FwdHVyZSByZXF1ZXN0IG1pZ2h0IGhhdmUgdGhlIHdyb25nIHNldHRpbmdzCisgICAgLy8gICAgICBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgY2FtZXJhX3N0YXR1c190IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHNwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKTsKKyAgICB2b2lkIGFsbG9jYXRlT25lQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YSgKKyAgICAgICAgICAgIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MmIGNhbWVyYVNldHRpbmdzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+JiBtZXRhZGF0YSk7CisKKyAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3QgY2hhciogZGV2aWNlSWQpOworICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CisKKyAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKKyAgICAvLyBBbHdheXMgZ3JhYiBkZXZpY2UgbG9jayBiZWZvcmUgZ3JhYmJpbmcgc2Vzc2lvbiBsb2NrCisgICAgdm9pZCBsb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpIGNvbnN0IHsgbURldmljZUxvY2subG9jaygpOyB9OworICAgIHZvaWQgdW5sb2NrRGV2aWNlKCkgY29uc3QgeyBtRGV2aWNlTG9jay51bmxvY2soKTsgfTsKKworICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQorICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKworICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCisgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKKyAgICBjb25zdCBoaWRsX3N0cmluZyBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKKyAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAorICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOworICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOworCisgICAgLy8gc3RyZWFtIGlkIC0+IHBhaXIgb2YgKEFDYW1lcmFXaW5kb3dUeXBlKiBmcm9tIGFwcGxpY2F0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uIHVzZWQgZm9yCisgICAgLy8gY2FtZXJhIHNlcnZpY2UpCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBtQ29uZmlndXJlZE91dHB1dHM7CisKKyAgICAvLyBUT0RPOiBtYXliZSBhIGJvb2wgd2lsbCBzdWZmaWNlIGZvciBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICBzdGQ6OmF0b21pY19ib29sIG1DbG9zaW5nOworICAgIGlubGluZSBib29sIGlzQ2xvc2VkKCkgeyByZXR1cm4gbUNsb3Npbmc7IH0KKworICAgIGJvb2wgbUluRXJyb3IgPSBmYWxzZTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgbUVycm9yID0gQUNBTUVSQV9PSzsKKyAgICB2b2lkIG9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICBib29sIG1JZGxlID0gdHJ1ZTsKKyAgICAvLyBUaGlzIHdpbGwgYXZvaWQgYSBidXN5IHNlc3Npb24gYmVpbmcgZGVsZXRlZCBiZWZvcmUgaXQncyBiYWNrIHRvIGlkbGUgc3RhdGUKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1CdXN5U2Vzc2lvbjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBtUmVtb3RlOworCisgICAgLy8gTG9vcGVyIHRocmVhZCB0byBoYW5kbGUgY2FsbGJhY2sgdG8gYXBwCisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyOworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICAvLyBEZXZpY2Ugc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0T25EaXNjb25uZWN0ZWQsICAgLy8gb25EaXNjb25uZWN0ZWQKKyAgICAgICAga1doYXRPbkVycm9yLCAgICAgICAgICAvLyBvbkVycm9yCisgICAgICAgIC8vIFNlc3Npb24gc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKKyAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWwsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Vycm9yQ29kZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXNzaW9uU3BLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkOworCisgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tIYW5kbGVyKGNvbnN0IGNoYXIgKmlkKTsKKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1JZDsKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDYXB0dXJlIHNlc3Npb24gcmVsYXRlZCBtZW1iZXJzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gVGhlIGN1cnJlbnQgYWN0aXZlIHNlc3Npb24KKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKKyAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOworCisgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKKyAgICAvLyBUT0RPOiBtaWdodCBuZWVkIGFub3RoZXIgbG9vcGVyL2hhbmRsZXIgdG8gaGFuZGxlIGNhbGxiYWNrcyBmcm9tIHNlcnZpY2UKKworICAgIHN0YXRpYyBjb25zdCBpbnQgUkVRVUVTVF9JRF9OT05FID0gLTE7CisgICAgaW50IG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgLy8gc2VxdWVuY2UgaWQgLT4gbGFzdCBmcmFtZSBudW1iZXIgbWFwCisgICAgc3RkOjptYXA8aW50MzJfdCwgaW50NjRfdD4gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwOworCisgICAgc3RydWN0IENhbGxiYWNrSG9sZGVyIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiYgIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKKyAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICB9OworICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKKyAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5PX0ZSQU1FU19DQVBUVVJFRCA9IC0xOworICAgIGNsYXNzIEZyYW1lTnVtYmVyVHJhY2tlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIC8vIFRPRE86IENhbGxlZCBpbiBvblJlc3VsdFJlY2VpdmVkIGFuZCBvbkNhcHR1cmVFcnJvckxvY2tlZAorICAgICAgICB2b2lkIHVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKTsKKyAgICAgICAgaW5saW5lIGludDY0X3QgZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKSB7IHJldHVybiBtQ29tcGxldGVkRnJhbWVOdW1iZXI7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlKCk7CisgICAgICAgIHZvaWQgdXBkYXRlQ29tcGxldGVkRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgaW50NjRfdCBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBOT19GUkFNRVNfQ0FQVFVSRUQ7CisgICAgICAgIExpc3Q8aW50NjRfdD4gbVNraXBwZWRGcmFtZU51bWJlcnM7CisgICAgICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1GdXR1cmVFcnJvclNldDsKKyAgICB9OworICAgIEZyYW1lTnVtYmVyVHJhY2tlciBtRnJhbWVOdW1iZXJUcmFja2VyOworCisgICAgdm9pZCBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKworICAgIC8vIE1pc2MgdmFyaWFibGVzCisgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFEZXZpY2Ugb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKKyAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorCisgICAgfkFDYW1lcmFEZXZpY2UoKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcGh5c2ljYWxDYW1lcmFJZExpc3QsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uT3V0cHV0Q29udGFpbmVyKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykKK3sKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKKyAgICBzdGQ6OnZlY3RvcjxmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiByZXF1ZXN0c1Y7CisgICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIGFmdGVyIHN1Ym1pdFJlcXVlc3RMaXN0IGlzIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUgbWlnaHQgaGF2ZSByZW1vdmVkIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgLy8gbWV0YWRhdGEuIFRoZXJlZm9yZSB3ZSBzaW1wbHkgYWRkIHRoZSBtZXRhZGF0YSB0byBpdHMgd3JhcHBlciBjbGFzcywKKyAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyLgorICAgICAgICBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBjYXB0dXJlIHJlcXVlc3QgdG8gaW50ZXJuYWwgZm9ybWF0IGZhaWx1cmUhIHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2sodXRpbHM6OmNvbnZlcnRUb0hpZGwocmVxLmdldCgpKSk7CisgICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKyAgICB9CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdWJtaXRJbmZvIGluZm87CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5mb10oYXV0byBzLCBhdXRvICZzdWJtaXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc3VibWl0SW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGZvciBzdWJtaXRSZXF1ZXN0TGlzdCBjYWxsOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSBpbmZvLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGluZm8ubGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM4ODdhCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKKy8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIHZlbmRvciBhdmFpbGFibGUgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZCBieQorICogZGVmYXVsdCBIQUwgaW1wbGVtZW50YXRpb24gY29kZSBhcyB3ZWxsLgorICovCitjbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKTsKK307CisKK3N0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gJnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpIHsKKyAgICBpbnQgdGFnQ291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgdGFnQ291bnQgKz0gdnRzW3NdLnRhZ3Muc2l6ZSgpOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3IgdGFnIHNlY3Rpb25zIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiB0YWdBcnJheTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhZ0FycmF5LnJlc2l6ZSh0YWdDb3VudCkgIT0gdGFnQ291bnQsCisgICAgICAgICAgICAiJXM6IHRvbyBtYW55ICgldSkgdmVuZG9yIHRhZ3MgZGVmaW5lZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKworICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1TZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKyAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKKyAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuZW1wbGFjZSh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVzYy0+bVNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOworICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworCisgICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKKyAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7CisgICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOworICAgIH0KKworICAgICpkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbCYKK0NhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCogaW5zdGFuY2UgPSBzSW5zdGFuY2U7CisgICAgaWYgKGluc3RhbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FtZXJhTWFuYWdlckdsb2JhbCgpOworICAgICAgICBzSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuICppbnN0YW5jZTsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbDo6fkNhbWVyYU1hbmFnZXJHbG9iYWwoKSB7CisgICAgLy8gY2xlYXIgc0luc3RhbmNlIHNvIG5leHQgZ2V0SW5zdGFuY2UgY2FsbCBrbm93cyB0byBjcmVhdGUgYSBuZXcgb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzTG9jayk7CisgICAgc0luc3RhbmNlID0gbnVsbHB0cjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIpOworICAgIH0KKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c2V0dXBWZW5kb3JUYWdzKCkgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBwcm92aWRlcklkc0FuZFZ0czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhbJnN0YXR1cywgJnByb3ZpZGVySWRzQW5kVnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZJZHNBbmRWdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkc0FuZFZ0cyA9IElkc0FuZFZ0czsgfSk7CisKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBWZW5kb3JUYWdTZWN0aW9ucyAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENvbnZlcnQgZWFjaCBwcm92aWRlcnMgVmVuZG9yVGFnU2VjdGlvbnMgaW50byBhIFZlbmRvclRhZ0Rlc2NyaXB0b3IgYW5kCisgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZQorICAgIGZvciAoYXV0byAmcHJvdmlkZXJJZEFuZFZ0cyA6IHByb3ZpZGVySWRzQW5kVnRzKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGlmIChIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHByb3ZpZGVySWRBbmRWdHMudmVuZG9yVGFnU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZW5kb3JUYWdEZXNjcmlwdG9yKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IGZyb20gSGlkbDogVmVuZG9yVGFnRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVySWRBbmRWdHMucHJvdmlkZXJJZCwgdmVuZG9yVGFnRGVzY3JpcHRvcik7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncworICAgICAgICBpZiAoIXNldHVwVmVuZG9yVGFncygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGMgOiBjYW1lcmFTdGF0dXNlcykgeworICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKSB7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICAodm9pZCkgd2hvOworICAgIEFMT0dFKCJDYW1lcmEgc2VydmljZSBiaW5kZXJEaWVkISIpOworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKGNtLT5tTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgICAgICAgIH0KKyAgICAgICAgY20tPm1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyByZS1jb25uZWN0IGNhbGwgaGVyZT8KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6cmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIGF1dG8gcGFpciA9IG1DYWxsYmFja3MuaW5zZXJ0KGNiKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgY2FsbGJhY2tzIGlmIGNhbGxiYWNrIGlzIG5ld2x5IHJlZ2lzdGVyZWQKKyAgICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2IgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlIDogY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2FsbGJhY2stPmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4qIGNhbWVyYUlkcykgeworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgZm9yKGF1dG8mIGRldmljZVN0YXR1cyA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgaWYgKGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQgfHwKKyAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFJZHMtPnB1c2hfYmFjayhkZXZpY2VTdGF0dXMuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6aXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoa0NhbWVyYUlkS2V5LCAmY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIElEISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1c0FuZElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgc3RhdHVzIGNoYW5nZS4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKHN0YXR1c0FuZElkKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWRMb2NrZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIGhpZGxfc3RyaW5nIGNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQ7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0FuZElkLmRldmljZVN0YXR1czsKKyAgICBpZiAoIXZhbGlkU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG9sZFN0YXR1cyA9IGZpcnN0U3RhdHVzID8KKyAgICAgICAgICAgIHN0YXR1cyA6IC8vIGZpcnN0IHN0YXR1cworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF07CisKKyAgICBpZiAoIWZpcnN0U3RhdHVzICYmCisgICAgICAgICAgICBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID09IGlzU3RhdHVzQXZhaWxhYmxlKG9sZFN0YXR1cykpIHsKKyAgICAgICAgLy8gTm8gc3RhdHVzIHVwZGF0ZS4gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBzdGF0dXM7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiRnAgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICBjYi5tQXZhaWxhYmxlIDogY2IubVVuYXZhaWxhYmxlOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8qKgorICogQUNhbWVyYU1hbmdlciBJbXBsZW1lbnRhdGlvbgorICovCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gaWRMaXN0OworICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhSWRMaXN0KCZpZExpc3QpOworCisgICAgaW50IG51bUNhbWVyYXMgPSBpZExpc3Quc2l6ZSgpOworICAgIEFDYW1lcmFJZExpc3QgKm91dCA9IG5ldyBBQ2FtZXJhSWRMaXN0OworICAgIGlmICghb3V0KSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgb3V0LT5udW1DYW1lcmFzID0gbnVtQ2FtZXJhczsKKyAgICBvdXQtPmNhbWVyYUlkcyA9IG5ldyBjb25zdCBjaGFyKltudW1DYW1lcmFzXTsKKyAgICBpZiAoIW91dC0+Y2FtZXJhSWRzKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlkTGlzdFtpXS5jX3N0cigpOworICAgICAgICBzaXplX3QgZHN0U2l6ZSA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciogZHN0ID0gbmV3IGNoYXJbZHN0U2l6ZV07CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgc3RybGNweShkc3QsIHNyYywgZHN0U2l6ZSk7CisgICAgICAgIG91dC0+Y2FtZXJhSWRzW2ldID0gZHN0OworICAgIH0KKyAgICAqY2FtZXJhSWRMaXN0ID0gb3V0OworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitBQ2FtZXJhTWFuYWdlcjo6ZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgeworICAgIGlmIChjYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkczsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgY2FtZXJhSWRMaXN0OworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+ICpjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3TWV0YWRhdGE7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0KKyAgICAgICAgY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJhd01ldGFkYXRhXSAoYXV0byBzICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgIHJhd01ldGFkYXRhLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fQ0hBUkFDVEVSSVNUSUNTKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6b3BlbkNhbWVyYSgKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKHJhd0NoYXJzKSk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworCisgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCisgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFRPRE86IENvbnZlcnQgc2VydmljZVJldCB0byBjYW1lcmFfc3RhdHVzX3QKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGRldmljZVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCEgcmVtb3RlIGRldmljZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgZGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UoZGV2aWNlUmVtb3RlKTsKKyAgICBkZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgKm91dERldmljZSA9IGRldmljZTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6Z2V0VGFnRnJvbU5hbWUoY29uc3QgY2hhciAqY2FtZXJhSWQsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90ICp0YWcpIHsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJhd0NoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlcywgQ2Fubm90IHJldHJpZXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX01FVEFEQVRBX05PVF9GT1VORDsKKyAgICB9CisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gcmF3Q2hhcnMtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IG1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JUYWdJZCA9IGdldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKHJhd01ldGFkYXRhKTsKKyAgICBtZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdnRDYWNoZSA9IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKTsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2VGFncyA9IG51bGxwdHI7CisgICAgdnRDYWNoZS0+Z2V0VmVuZG9yVGFnRGVzY3JpcHRvcih2ZW5kb3JUYWdJZCwgJnZUYWdzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM9IG1ldGFkYXRhLmdldFRhZ0Zyb21OYW1lKG5hbWUsIHZUYWdzLmdldCgpLCB0YWcpOworICAgIHJldHVybiBzdGF0dXMgPT0gT0sgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9NRVRBREFUQV9OT1RfRk9VTkQ7Cit9CisKK0FDYW1lcmFNYW5hZ2VyOjp+QUNhbWVyYU1hbmFnZXIoKSB7CisKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjJkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQUNBTUVSQV9NQU5BR0VSX0gKKyNkZWZpbmUgX0FDQU1FUkFfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBJQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBWZW5kb3JUYWdTZWN0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBJQmFzZSA9IGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8qKgorICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgorICogaW5zdGFuY2VzLiBDcmVhdGVkIHdoZW4gZmlyc3QgQUNhbWVyYU1hbmFnZXIgaXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdoZW4KKyAqIGFsbCBBQ2FtZXJhTWFuYWdlciBpbnN0YW5jZXMgYXJlIGRlbGV0ZWQuCisgKgorICogVE9ETzogbWF5YmUgQ2FtZXJhTWFuYWdlckdsb2JhbCBpcyBiZXR0ZXIgc3VpdGVkIGluIGxpYmNhbWVyYWNsaWVudD8KKyAqLworY2xhc3MgQ2FtZXJhTWFuYWdlckdsb2JhbCBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsJiBnZXRJbnN0YW5jZSgpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICB2b2lkIHJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworCisgICAgdm9pZCByZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogLypjYWxsYmFjayovKSB7fQorICAgIHZvaWQgdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogLypjYWxsYmFjayovKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKKyAgICAgKi8KKyAgICB2b2lkIGdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gKmNhbWVyYUlkcyk7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gbUNhbWVyYVNlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgIGtDYW1lcmFTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgTXV0ZXggICAgICAgICAgICAgIG1Mb2NrOworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgRGVhdGhOb3RpZmllcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcjsKKworICAgIGNsYXNzIENhbWVyYVNlcnZpY2VMaXN0ZW5lciBmaW5hbCA6IHB1YmxpYyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FtZXJhU2VydmljZUxpc3RlbmVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgb3ZlcnJpZGU7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8Q2FtZXJhU2VydmljZUxpc3RlbmVyPiBtQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCisgICAgLy8gV3JhcHBlciBvZiBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mgc28gd2UgY2FuIHN0b3JlIGl0IGluIHN0ZDo6c2V0CisgICAgc3RydWN0IENhbGxiYWNrIHsKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2soY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUpLAorICAgICAgICAgICAgbVVuYXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYVVuYXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtQXZhaWxhYmxlID09IG90aGVyLm1BdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbVVuYXZhaWxhYmxlID09IG90aGVyLm1VbmF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKKyAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbUF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbVVuYXZhaWxhYmxlOworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICB9OworICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOworCisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbWVyYUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FsbGJhY2tGcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkge30KKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgfTsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyOworICAgIHNwPEFMb29wZXI+ICAgICAgICAgbUNiTG9vcGVyOyAvLyBMb29wZXIgdGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhY3R1YWxseSBoYXBwZW4gb24KKworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICBib29sIHNldHVwVmVuZG9yVGFncygpOworCisgICAgLy8gVXRpbHMgZm9yIHN0YXR1cworICAgIHN0YXRpYyBib29sIHZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBib29sIGlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOworCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgaGlkbF9zdHJpbmcmIGEsIGNvbnN0IGhpZGxfc3RyaW5nJiBiKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBhVWludCA9IDAsIGJVaW50ID0gMDsKKyAgICAgICAgICAgIGJvb2wgYUlzVWludCA9IGJhc2U6OlBhcnNlVWludChhLmNfc3RyKCksICZhVWludCk7CisgICAgICAgICAgICBib29sIGJJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYi5jX3N0cigpLCAmYlVpbnQpOworCisgICAgICAgICAgICAvLyBVaW50IGRldmljZSBJRHMgZmlyc3QKKyAgICAgICAgICAgIGlmIChhSXNVaW50ICYmIGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYVVpbnQgPCBiVWludDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYUlzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2ltcGxlIHN0cmluZyBjb21wYXJlIGlmIGJvdGggaWQgYXJlIG5vdCB1aW50CisgICAgICAgICAgICByZXR1cm4gYSA8IGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwIGNhbWVyYV9pZCAtPiBzdGF0dXMKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgQ2FtZXJhRGV2aWNlU3RhdHVzLCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CisKKyAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQorICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCogc0luc3RhbmNlOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwoKSB7fTsKKyAgICB+Q2FtZXJhTWFuYWdlckdsb2JhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYU1hbmFnZXIgb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CisgICAgQUNhbWVyYU1hbmFnZXIoKSA6CisgICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgIH5BQ2FtZXJhTWFuYWdlcigpOworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CisgICAgc3RhdGljIHZvaWQgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpOworCisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOworCisgICAgY2FtZXJhX3N0YXR1c190IG9wZW5DYW1lcmEoY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRUYWdGcm9tTmFtZShjb25zdCBjaGFyICpjYW1lcmFJZCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgKnRhZyk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQorICAgIH07CisgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKK307CisKKyNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKK307CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmYjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYVZlbmRvclV0aWxzIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0Citjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCkgeworICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgaENhcHR1cmVSZXF1ZXN0OworICAgIGhDYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgIGhDYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkczsKKyAgICByZXR1cm4gaENhcHR1cmVSZXF1ZXN0OworfQorCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pIHsKKyAgICBIUm90YXRpb24gaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMDsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhSb3RhdGlvbjsKK30KKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpidWZmZXIgPSAoY2FtZXJhX21ldGFkYXRhX3QqKShtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICpyYXdNZXRhZGF0YSA9IGJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBjYWxsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIGRzdCBvd25zIG1lbW9yeSBpZiBzaG91bGRPd24gaXMgc2V0CisvLyAgICAgICB0byB0cnVlLgordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0LCBib29sIHNob3VsZE93bikgeworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBzaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNyYyk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSwgc2hvdWxkT3duKTsKKyAgICByZXR1cm47Cit9CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpSRUNPUkQ7CisgICAgICAgIGNhc2UgVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpNQU5VQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UFJFVklFVzsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ0FNRVJBX09LOworICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfTUFYX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpERVBSRUNBVEVEX0hBTDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSBzaW5jZSB3ZSBmaWx0ZXJlZCBsZWdhY3kgSEFMcyBlYXJsaWVyCisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNBQkxFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpQRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAobmgxLT5udW1GZHMgIT0wIHx8IG5oMi0+bnVtRmRzICE9MCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB3aW5kb3cgbmF0aXZlIGhhbmRsZXMgYmVpbmcgY29tcGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT52ZXJzaW9uICE9IG5oMi0+dmVyc2lvbiB8fCBuaDEtPm51bUZkcyAhPSBuaDItPm51bUZkcyB8fAorICAgICAgICBuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZihuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAoaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gbmgxLT5udW1JbnRzIDwgbmgyLT5udW1JbnRzOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBuaDEtPmRhdGFbaV0gPCBuaDItPmRhdGFbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG5oMSwgbmgyKSAmJiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMik7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGVzMVtpXSwgaGFuZGxlczJbaV0pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlczEuc2l6ZSgpIDwgaGFuZGxlczIuc2l6ZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMSA9IGhhbmRsZXMxW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTIgPSBoYW5kbGVzMltpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZTEsIGhhbmRsZTIpKSB7CisgICAgICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihoYW5kbGUxLCBoYW5kbGUyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg5ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorCisjaWZuZGVmIENBTUVSQV9OREtfVkVORE9SX0gKKyNkZWZpbmUgQ0FNRVJBX05ES19WRU5ET1JfSAorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYU1ldGFkYXRhICA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOwordXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhSb3RhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb247Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoYXQgQ2FwdHVyZVJlcXVlc3QgY2FuIGJlIHN0b3JlZCBieSBzcDw+CitzdHJ1Y3QgQ2FwdHVyZVJlcXVlc3QgOiBwdWJsaWMgUmVmQmFzZSB7CisgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgbUNhcHR1cmVSZXF1ZXN0OworICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gbVN1cmZhY2VMaXN0OworICAvL1BoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBzdG9yZWQgaGVyZSwgc2luY2UgdGhlIGNhcHR1cmUgcmVxdWVzdAorICAvL21pZ2h0IG5vdCBjb250YWluIGl0LiBUaGF0J3Mgc2luY2UsIGZtcSBtaWdodCBoYXZlIGNvbnN1bWVkIGl0LgorICBoaWRsX3ZlYzxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK307CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbiBhbmQgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbAorYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhlIG5hdGl2ZV9oYW5kbGVfdCBjYW4gYmUgY29tcGFyZWQgd2l0aCAgaXRzIGNvbnRlbnRzIGluc3RlYWQKKy8vIG9mIGp1c3QgcmF3IHBvaW50ZXIgY29tcGFyaXNvbnMuCitzdHJ1Y3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB7CisgICAgbmF0aXZlX2hhbmRsZV90ICptV2luZG93ID0gbnVsbHB0cjsKKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIobmF0aXZlX2hhbmRsZV90ICpuaCkgOiBtV2luZG93KG5oKSB7IH0KKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBvcGVyYXRvciBuYXRpdmVfaGFuZGxlX3QgKigpIGNvbnN0IHsgcmV0dXJuIG1XaW5kb3c7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKK307CisKKy8vIFdyYXBwZXIgYXJvdW5kIE91dHB1dENvbmZpZ3VyYXRpb24uIFRoaXMgaXMgbmVlZGVkIHNpbmNlIEhJREwKKy8vIE91dHB1dENvbmZpZ3VyYXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgYW5kIG1hcmtlZCBmaW5hbC4gVGhlcmVmb3JlLCBvcGVyYXRvcgorLy8gb3ZlcmxvYWRzIG91dHNpZGUgdGhlIGNsYXNzLCB3aWxsIG5vdCBnZXQgcGlja2VkIGJ5IGNsYW5nIHdoaWxlIHRyeWluZyB0bworLy8gc3RvcmUgT3V0cHV0Q29uZmlndXJhdGlvbiBpbiBtYXBzL3NldHMuCitzdHJ1Y3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gbU91dHB1dENvbmZpZ3VyYXRpb247CisKKyAgICBvcGVyYXRvciBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcigpIHsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24gPSBPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjA7CisgICAgICAgIC8vIFRoZSBuZGsgY3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCBkZWZlcnJlZCBzdXJmYWNlcworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5pc0RlZmVycmVkID0gZmFsc2U7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLndpZHRoID0gMDsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24uaGVpZ2h0ID0gMDsKKyAgICAgICAgLy8gbmRrIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlciBPdXRwdXRDb25maWd1cmF0aW9uIGJ1ZmZlciBzaGFyaW5nLgorICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkID0gLTE7CisgICAgfTsKKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICA6IG1PdXRwdXRDb25maWd1cmF0aW9uKChvdXRwdXRDb25maWd1cmF0aW9uKSkgeyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIHNlbGYucm90YXRpb24gPT0gb3RoZXIucm90YXRpb24gJiYgc2VsZi53aW5kb3dHcm91cElkID09IG90aGVyLndpbmRvd0dyb3VwSWQgJiYKKyAgICAgICAgICAgICAgICBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCAmJiBzZWxmLndpZHRoID09IG90aGVyLndpZHRoICYmCisgICAgICAgICAgICAgICAgc2VsZi5oZWlnaHQgPT0gb3RoZXIuaGVpZ2h0ICYmIHNlbGYuaXNEZWZlcnJlZCA9PSBvdGhlci5pc0RlZmVycmVkICYmCisgICAgICAgICAgICAgICAgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIGlmIChzZWxmLndpbmRvd0dyb3VwSWQgIT0gb3RoZXIud2luZG93R3JvdXBJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2luZG93R3JvdXBJZCA8IG90aGVyLndpbmRvd0dyb3VwSWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi53aWR0aCAhPSBvdGhlci53aWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2lkdGggPCBvdGhlci53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmhlaWdodCAhPSBvdGhlci5oZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhlaWdodCA8IG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnJvdGF0aW9uICE9IG90aGVyLnJvdGF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlbGYucm90YXRpb24pIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG90aGVyLnJvdGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmlzRGVmZXJyZWQgIT0gb3RoZXIuaXNEZWZlcnJlZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXNEZWZlcnJlZCA8IG90aGVyLmlzRGVmZXJyZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5waHlzaWNhbENhbWVyYUlkICE9IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPCBvdGhlci5waHlzaWNhbENhbWVyYUlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyKSAmJiAhKCp0aGlzIDwgb3RoZXIpOworICAgIH0KK307CisKKy8vIENvbnZlcnQgQ2FwdHVyZVJlcXVlc3Qgd3JhcHBhYmxlIGJ5IHNwPD4gdG8gaGlkbCBDYXB0dXJlUmVxdWVzdC4KK2ZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpOworCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pOworCitib29sIGNvbnZlcnRGcm9tSGlkbENsb25lZChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBDYW1lcmFNZXRhZGF0YSAqcmF3TWV0YWRhdGEpOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QsIGJvb2wgc2hvdWxkT3duID0gZmFsc2UpOworCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpOworCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0FNRVJBX05ES19WRU5ET1JfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGUzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKQEAgLTAsMCArMSw4MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0R1bW15RmVuY2VGZCA9IC0xOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0VXMgPSAxMDAgKiAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0UmV0cnkgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrVGVzdEltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKKworY2xhc3MgQ2FtZXJhSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFIZWxwZXIoY29uc3QgY2hhciogaWQsIEFDYW1lcmFNYW5hZ2VyICptYW5hZ2VyKSA6CisgICAgICAgICAgICBtSW1nUmVhZGVyQW53KG51bGxwdHIpLCBtQ2FtZXJhSWQoaWQpLCBtQ2FtZXJhTWFuYWdlcihtYW5hZ2VyKSB7fQorICAgIH5DYW1lcmFIZWxwZXIoKSB7IGNsb3NlQ2FtZXJhKCk7IH0KKworICAgIHN0cnVjdCBQaHlzaWNhbEltZ1JlYWRlckluZm8geworICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICB9OworICAgIGludCBpbml0Q2FtZXJhKG5hdGl2ZV9oYW5kbGVfdCogaW1nUmVhZGVyQW53LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiYgcGh5c2ljYWxJbWdSZWFkZXJzLAorICAgICAgICAgICAgYm9vbCB1c2VQaHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGlmIChpbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlzQ2FtZXJhUmVhZHkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0Q2FtZXJhIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgbUltZ1JlYWRlckFudyA9IGltZ1JlYWRlckFudzsKKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsICZtRGV2aWNlQ2IsICZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gY2FtZXJhLCByZXQ9JWQsIG1EZXZpY2U9JXAuIiwgcmV0LCBtRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgmbU91dHB1dHMpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgbUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGlkUG9pbnRlckxpc3Q7CisgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxTdHJlYW0gOiBwaHlzaWNhbEltZ1JlYWRlcnMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogc2Vzc2lvbk91dHB1dCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkLCAmc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uUGh5c2ljYWxPdXRwdXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChtT3V0cHV0cywgc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV4dHJhT3V0cHV0cy5wdXNoX2JhY2soc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBhdCBtb3N0IG9uZSBwaHlzaWNhbCBzdHJlYW0gcGVyIHBoeXNpY2FsIGNhbWVyYS4KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxTdHJlYW0ucGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICBpZFBvaW50ZXJMaXN0LnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhSWRMaXN0IGNhbWVyYUlkTGlzdDsKKyAgICAgICAgY2FtZXJhSWRMaXN0Lm51bUNhbWVyYXMgPSBpZFBvaW50ZXJMaXN0LnNpemUoKTsKKyAgICAgICAgY2FtZXJhSWRMaXN0LmNhbWVyYUlkcyA9IGlkUG9pbnRlckxpc3QuZGF0YSgpOworCisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtRGV2aWNlLCBtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSyAmJiByZXQgIT0gQUNBTUVSQV9FUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24obURldmljZSwgbU91dHB1dHMsICZtU2Vzc2lvbkNiLCAmbVNlc3Npb24pOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgaWYgKHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzKG1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZjYW1lcmFJZExpc3QsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJm1TdGlsbFJlcXVlc3QpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKG1JbWdSZWFkZXJBbncsICZtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgbVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0VGFyZ2V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKHBoeXNpY2FsU3RyZWFtLmFudywgJm91dHB1dFRhcmdldCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQobVN0aWxsUmVxdWVzdCwgb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSB0cnVlOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAgIGJvb2wgaXNDYW1lcmFSZWFkeSgpIHsgcmV0dXJuIG1Jc0NhbWVyYVJlYWR5OyB9CisKKyAgICB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAobVJlcUltZ1JlYWRlck91dHB1dCkgeworICAgICAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKG1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBvdXRwdXRUYXJnZXQgOiBtUmVxRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUob3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBtUmVxRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtU3RpbGxSZXF1ZXN0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZShtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgICAgIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSBzZXNzaW9uCisgICAgICAgIGlmIChtU2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2xvc2UobVNlc3Npb24pOworICAgICAgICAgICAgbVNlc3Npb24gPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgICAgIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byYgZXh0cmFPdXRwdXQgOiBtRXh0cmFPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShleHRyYU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhT3V0cHV0cy5jbGVhcigpOworICAgICAgICBpZiAobU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlKG1PdXRwdXRzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBkZXZpY2UKKyAgICAgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIH0KKworICAgIGludCB0YWtlUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrcywgMSwgJm1TdGlsbFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxSWQpOworICAgIH0KKworICAgIGludCB0YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUobVNlc3Npb24sICZtTG9naWNhbENhcHR1cmVDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgMSwgJm1TdGlsbFJlcXVlc3QsICZzZXFJZCk7CisgICAgfQorCisgICAgYm9vbCBjaGVja0NhbGxiYWNrcyhpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIGlmIChtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQgIT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGVkIGNhcHR1cmUgY2FsbGFiYWNrIGNvdW50IG5vdCBhcyBleHBlY3RlZC4gZXhwZWN0ZWQgJWQgYWN0dWFsICVkIiwKKyAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCwgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZURpc2Nvbm5lY3RlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25EZXZpY2VFcnJvcih2b2lkKiAvKm9iaiovLCBBQ2FtZXJhRGV2aWNlKiAvKmRldmljZSovLCBpbnQgLyplcnJvckNvZGUqLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkNsb3NlZCh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uUmVhZHkodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvbkFjdGl2ZSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICBwcml2YXRlOgorICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbURldmljZUNie3RoaXMsIG9uRGV2aWNlRGlzY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGV2aWNlRXJyb3J9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyBtU2Vzc2lvbkNieworICAgICAgICB0aGlzLCBvblNlc3Npb25DbG9zZWQsIG9uU2Vzc2lvblJlYWR5LCBvblNlc3Npb25BY3RpdmV9OworCisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsgIC8vIG5vdCBvd25lZCBieSB1cy4KKworICAgIC8vIENhbWVyYSBkZXZpY2UKKyAgICBBQ2FtZXJhRGV2aWNlKiBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHNlc3Npb24KKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYXB0dXJlU2Vzc2lvbk91dHB1dCo+IG1FeHRyYU91dHB1dHM7CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHJlcXVlc3QKKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG1TdGlsbFJlcXVlc3QgPSBudWxscHRyOworICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqIG1SZXFJbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIHN0ZDo6dmVjdG9yPEFDYW1lcmFPdXRwdXRUYXJnZXQqPiBtUmVxRXh0cmFPdXRwdXRzOworCisgICAgYm9vbCBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIqIG1DYW1lcmFJZDsKKyAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXI7CisgICAgaW50IG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCA9IDA7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyBtTG9naWNhbENhcHR1cmVDYWxsYmFja3MgPSB7CisgICAgICAgIC8vIFRPRE86IEFkZCB0ZXN0cyBmb3Igb3RoZXIgY2FsbGJhY2tzCisgICAgICAgIHRoaXMsIC8vIGNvbnRleHQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU3RhcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEgKiwgc2l6ZV90IHBoeXNpY2FsUmVzdWx0Q291bnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgQVNTRVJUX0VRKHBoeXNpY2FsUmVzdWx0Q291bnQsIGNoLT5tUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxDYW1lcmFJZHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocGh5c2ljYWxSZXN1bHRzW2ldICE9IG51bGxwdHIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShzdGQ6OmZpbmQoY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxDYW1lcmFJZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5lbmQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgZnJhbWVOdW1iZXIgYW5kIHNlbnNvclRpbWVzdGFtcCBleGlzdCBpbiBwaHlzaWNhbAorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBtZXRhZGF0YQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0c1tpXSwgQUNBTUVSQV9TWU5DX0ZSQU1FX05VTUJFUiwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NFTlNPUl9USU1FU1RBTVAsICZlbnRyeSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVudHJ5LmNvdW50LCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgW10gKHZvaWQgKiAvKmN0eCovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovLCBBQ2FwdHVyZVJlcXVlc3QqIC8qcmVxdWVzdCovLAorICAgICAgICAgICAgICAgIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUpIHsKKyAgICAgICAgICAgIGlmIChmYWlsdXJlLT5waHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBQaHlzaWNhbCBjYW1lcmEgaWQ6ICVzIHJlc3VsdCBmYWlsdXJlIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS0+cGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgICAgfTsKK307CisKK2NsYXNzIEltYWdlUmVhZGVyVGVzdENhc2UgeworICAgcHVibGljOgorICAgIEltYWdlUmVhZGVyVGVzdENhc2UoaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc3luYykKKyAgICAgICAgOiBtV2lkdGgod2lkdGgpLAorICAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVVzYWdlKHVzYWdlKSwKKyAgICAgICAgICBtTWF4SW1hZ2VzKG1heEltYWdlcyksCisgICAgICAgICAgbUFzeW5jKGFzeW5jKSB7fQorCisgICAgfkltYWdlUmVhZGVyVGVzdENhc2UoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyQW53KSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKG1JbWdSZWFkZXIpOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjYWxsIG5hdGl2ZV9oYW5kbGVfdF9yZWxlYXNlIG9uIGltYWdlUmVhZGVyQW53CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaW5pdEltYWdlUmVhZGVyKCkgeworICAgICAgICBpZiAobUltZ1JlYWRlciAhPSBudWxscHRyIHx8IG1JbWdSZWFkZXJBbncgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZS1pbml0YWxpemUgaW1hZ2UgcmVhZGVyLCBtSW1nUmVhZGVyPSVwLCBtSW1nUmVhZGVyQW53PSVwIiwgbUltZ1JlYWRlciwKKyAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Vc2FnZSwgbU1heEltYWdlcywgJm1JbWdSZWFkZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlcj0lcCIsIHJldCwgbUltZ1JlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckF2YWlsYWJsZUNiKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckRldGFjaGVkQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYnVmZmVyIGRldGFjaGluZyBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShtSW1nUmVhZGVyLCAmbUltZ1JlYWRlckFudyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgbmF0aXZlX2hhbmRsZV90IGZyb20gQUltYWdlUmVhZGVyLCByZXQ9JWQsIG1JbWdSZWFkZXJBbnc9JXAuIiwgcmV0LAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGdldE5hdGl2ZVdpbmRvdygpIHsgcmV0dXJuIG1JbWdSZWFkZXJBbnc7IH0KKworICAgIGludCBnZXRBY3F1aXJlZEltYWdlQ291bnQoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHJldHVybiBtQWNxdWlyZWRJbWFnZUNvdW50OworICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgICAgICBBSW1hZ2UqIG91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0OworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBBSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBnb2VzIG91dCBvZgorICAgICAgICAvLyBzY29wZS4KKyAgICAgICAgYXV0byBpbWFnZURlbGV0ZXIgPSBbdGhpc10oQUltYWdlKiBpbWcpIHsKKyAgICAgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlQXN5bmMoaW1nLCBrRHVtbXlGZW5jZUZkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUltYWdlX2RlbGV0ZShpbWcpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICBpZiAobUFzeW5jKSB7CisgICAgICAgICAgICBpbnQgb3V0RmVuY2VGZCA9IDA7CisgICAgICAgICAgICAvLyBWZXJpdHkgdGhhdCBvdXRGZW5jZUZkJ3MgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIGJ5CisgICAgICAgICAgICAvLyBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jLgorICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYyhyZWFkZXIsICZvdXRJbWFnZSwgJm91dEZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0ciB8fCBvdXRGZW5jZUZkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgaW1hZ2UsIHJldD0lZCwgb3V0SWFtZ2U9JXAsIG91dEZlbmNlRmQ9JWQuIiwgcmV0LCBvdXRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRGZW5jZUZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UocmVhZGVyLCAmb3V0SW1hZ2UpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcC4iLCByZXQsIG91dEltYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBvdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZCB0byBnZXQgaGFyZHdhcmUgYnVmZmVyLCByZXQ9JWQsIG91dEJ1ZmZlcj0lcC4iLCByZXQsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHJlbGVhc2UgQUhhcmR3YXJlQnVmZmVyLCBzaW5jZSB3ZSBkb24ndCBhY3F1aXJlIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGl0LgorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBvdXREZXNjOworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUob3V0QnVmZmVyLCAmb3V0RGVzYyk7CisgICAgICAgIGludDMyX3QgaW1hZ2VXaWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaW1hZ2VIZWlnaHQgPSAwOworICAgICAgICBpbnQzMl90IGJ1ZmZlcldpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy53aWR0aCk7CisgICAgICAgIGludDMyX3QgYnVmZmVySGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy5oZWlnaHQpOworCisgICAgICAgIEFJbWFnZV9nZXRXaWR0aChvdXRJbWFnZSwgJmltYWdlV2lkdGgpOworICAgICAgICBBSW1hZ2VfZ2V0SGVpZ2h0KG91dEltYWdlLCAmaW1hZ2VIZWlnaHQpOworICAgICAgICBpZiAoaW1hZ2VXaWR0aCAhPSBtV2lkdGggfHwgaW1hZ2VIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGltYWdlIGRpbWVuc2lvbjogZXhwZWN0ZWQ9JWR4JWQsIGFjdHVhbD0lZHglZCIsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCWF84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQl81NjUgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBX0ZQMTYgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1k4KSB7CisgICAgICAgICAgICAvLyBDaGVjayBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbiBmb3IgY2VydGFpbiBmb3JtYXRzLiBEb24ndCBkbyB0aGlzIGZvciBibG9iIGJhc2VkCisgICAgICAgICAgICAvLyBmb3JtYXRzLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcldpZHRoICE9IG1XaWR0aCB8fCBidWZmZXJIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3V0RGVzYy51c2FnZSAmIG1Vc2FnZSkgIT0gbVVzYWdlKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgYnVmZmVyIHVzYWdlOiBhY3R1YWwgKCUiIFBSSXU2NCAiKSwgZXhwZWN0ZWQgKCUiIFBSSXU2NCAiKSIsCisgICAgICAgICAgICAgICAgICBvdXREZXNjLnVzYWdlLCBtVXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldFBsYW5lRGF0YShpbWcuZ2V0KCksIDAsICZkYXRhLCAmZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChtVXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4pIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBDUFVfUkVBRF9PRlRFTiB1c2FnZSBiaXRzLCB3ZSBjYW4gbG9jayB0aGUgaW1hZ2UuCisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBkYXRhID09IG51bGxwdHIgfHwgZGF0YUxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX0lNR1JFQURFUl9DQU5OT1RfTE9DS19JTUFHRSB8fCBkYXRhICE9IG51bGxwdHIgfHwgZGF0YUxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBPbmx5IGluY3JlYXNlIG1BY3F1aXJlZEltYWdlQ291bnQgaWYgYWxsIGNoZWNrcyBwYXNzLgorICAgICAgICBtQWNxdWlyZWRJbWFnZUNvdW50Kys7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkKiBvYmosIEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRoaXogPSByZWludGVycHJldF9jYXN0PEltYWdlUmVhZGVyVGVzdENhc2UqPihvYmopOworICAgICAgICB0aGl6LT5IYW5kbGVJbWFnZUF2YWlsYWJsZShyZWFkZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgb25CdWZmZXJSZW1vdmVkKHZvaWQqIC8qb2JqKi8sIEFJbWFnZVJlYWRlciogLypyZWFkZXIqLywgQUhhcmR3YXJlQnVmZmVyKiAvKmJ1ZmZlciovKSB7CisgICAgICAgIC8vIE5vLW9wLCBqdXN0IHRvIGNoZWNrIHRoZSBsaXN0ZW5lciBjYW4gYmUgc2V0IHByb3Blcmx5LgorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtRm9ybWF0OworICAgIHVpbnQ2NF90IG1Vc2FnZTsKKyAgICBpbnQzMl90IG1NYXhJbWFnZXM7CisgICAgYm9vbCBtQXN5bmM7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBpbnQgbUFjcXVpcmVkSW1hZ2VDb3VudHswfTsKKworICAgIEFJbWFnZVJlYWRlciogbUltZ1JlYWRlciA9IG51bGxwdHI7CisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsKKworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG1SZWFkZXJBdmFpbGFibGVDYnt0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIG1SZWFkZXJEZXRhY2hlZENie3RoaXMsIG9uQnVmZmVyUmVtb3ZlZH07Cit9OworCisKK2NsYXNzIEFJbWFnZVJlYWRlclZlbmRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCk7CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBBQ2FtZXJhTWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3QobUNhbWVyYU1hbmFnZXIsICZtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjYW1lcmFJZExpc3Q6IHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQWRkIG1vcmUgcmlnb3JvdXMgdGVzdHMgZm9yIHZlbmRvciB0YWdzCisgICAgICAgIEFTU0VSVF9ORShWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCksIG51bGxwdHIpOworICAgICAgICBpZiAobUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhcyA8IDEpIHsKKyAgICAgICAgICAgIEFMT0dXKCJEZXZpY2UgaGFzIG5vIGNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBtYW5hZ2VyCisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0KSB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGVDYW1lcmFJZExpc3QobUNhbWVyYUlkTGlzdCk7CisgICAgICAgICAgICBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbWVyYU1hbmFnZXIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZShtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHRha2VQaWN0dXJlcyhjb25zdCBjaGFyKiBpZCwgdWludDY0X3QgcmVhZGVyVXNhZ2UsIGludCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICBib29sIHJlYWRlckFzeW5jLCBpbnQgcGljdHVyZUNvdW50KSB7CisgICAgICAgIGludCByZXQgPSAwOworCisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UgdGVzdENhc2UoCisgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jKTsKKyAgICAgICAgcmV0ID0gdGVzdENhc2UuaW5pdEltYWdlUmVhZGVyKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgSW1hZ2VSZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYUhlbHBlciBjYW1lcmFIZWxwZXIoaWQsIG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLmluaXRDYW1lcmEodGVzdENhc2UuZ2V0TmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAge30vKnBoeXNpY2FsSW1hZ2VSZWFkZXJzKi8sIGZhbHNlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBoZWxwZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlKCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdGFrZSBwaWN0dXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQgJiYKKyAgICAgICAgICAgICAgICBjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KTsKKyAgICB9CisKKyAgICBib29sIHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY29uc3QgY2hhciogaWQpIHsKKyAgICAgICAgZm9yIChhdXRvJiByZWFkZXJVc2FnZSA6CisgICAgICAgICAgICAge0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn0pIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyTWF4SW1hZ2VzIDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJBc3luYyA6IHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwaWN0dXJlQ291bnQgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFrZVBpY3R1cmVzKGlkLCByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUZXN0IHRha2VQaWN0dXJlcyBmYWlsZWQgZm9yIHRlc3QgY2FzZSB1c2FnZT0lIiBQUkl1NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhJbWFnZXM9JWQsIGFzeW5jPSVkLCBwaWN0dXJlQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYW1lcmEgbWFuYWdlcgorICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisKKyAgICBib29sIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdCBjYXApIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeSgKKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLCBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLnU4W2ldID09IGNhcCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY0luZm8sCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeShzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gZm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krM10gPT0gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsxXSA9PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzJdID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKGNvbnN0IGNoYXIgKipjYW1lcmFJZCwKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSoqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KiBjYW5kaWRhdGVQaHlzaWNhbElkcykgeworICAgICAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSBsb2dpY2FsIGNhbWVyYQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSwgc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICBBU1NFUlRfTkUoKnN0YXRpY01ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgaWYgKCFpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoKnN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkpIHsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZSgqc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICpzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHJldHVybmVkIHBoeXNpY2FsIGNhbWVyYSBJZHMgYXJlIHZhbGlkCisgICAgICAgICAgICBzaXplX3QgcGh5c2ljYWxDYW1lcmFJZENudCA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKmNvbnN0KiBwaHlzaWNhbENhbWVyYUlkcyA9IG51bGxwdHI7CisgICAgICAgICAgICBib29sIGlzTG9naWNhbENhbWVyYSA9IEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYSgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYUlkQ250LCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXNMb2dpY2FsQ2FtZXJhKTsKKyAgICAgICAgICAgIEFTU0VSVF9HRShwaHlzaWNhbENhbWVyYUlkQ250LCAyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGh5c2ljYWxDYW1lcmFJZENudCAmJiBjYW5kaWRhdGVQaHlzaWNhbElkcy0+c2l6ZSgpIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0dUKHN0cmxlbihwaHlzaWNhbENhbWVyYUlkc1tqXSksIDApOworICAgICAgICAgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBwaHlzaWNhbENhbWVyYUlkc1tqXSwgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1NpemVTdXBwb3J0ZWRGb3JGb3JtYXQocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwga1Rlc3RJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICpjYW1lcmFJZCA9IG1DYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqY2FtZXJhSWQgPSBudWxscHRyOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdm9pZCB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGJvb2wgdXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZHM7CisKKyAgICAgICAgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoJmNhbWVyYUlkLCAmc3RhdGljTWV0YWRhdGEsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGlmIChjYW1lcmFJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGxvZ2ljYWwgY2FtZXJhIHRvIHRlc3QKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3Qgc3RyZWFtaW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYQorICAgICAgICB1aW50NjRfdCByZWFkZXJVc2FnZSA9IEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTjsKKyAgICAgICAgaW50MzJfdCByZWFkZXJNYXhJbWFnZXMgPSA4OworICAgICAgICBib29sIHJlYWRlckFzeW5jID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGludCBwaWN0dXJlQ291bnQgPSA2OworICAgICAgICBzdGQ6OnZlY3RvcjxJbWFnZVJlYWRlclRlc3RDYXNlKj4gdGVzdENhc2VzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGVzdENhc2UgPSBuZXcgSW1hZ2VSZWFkZXJUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0LCBrVGVzdEltYWdlRm9ybWF0LCByZWFkZXJVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYyk7CisgICAgICAgICAgICBBU1NFUlRfRVEodGVzdENhc2UtPmluaXRJbWFnZVJlYWRlcigpLCAwKTsKKyAgICAgICAgICAgIHRlc3RDYXNlcy5wdXNoX2JhY2sodGVzdENhc2UpOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihjYW1lcmFJZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICBzdGQ6OnZlY3RvcjxDYW1lcmFIZWxwZXI6OlBoeXNpY2FsSW1nUmVhZGVySW5mbz4gcGh5c2ljYWxJbWdSZWFkZXJJbmZvOworICAgICAgICBwaHlzaWNhbEltZ1JlYWRlckluZm8ucHVzaF9iYWNrKHtwaHlzaWNhbENhbWVyYUlkc1swXSwgdGVzdENhc2VzWzFdLT5nZXROYXRpdmVXaW5kb3coKX0pOworICAgICAgICBwaHlzaWNhbEltZ1JlYWRlckluZm8ucHVzaF9iYWNrKHtwaHlzaWNhbENhbWVyYUlkc1sxXSwgdGVzdENhc2VzWzJdLT5nZXROYXRpdmVXaW5kb3coKX0pOworCisgICAgICAgIGludCByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZXNbMF0tPmdldE5hdGl2ZVdpbmRvdygpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mbywgdXNlUGh5c2ljYWxTZXR0aW5ncyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworCisgICAgICAgIGlmICghY2FtZXJhSGVscGVyLmlzQ2FtZXJhUmVhZHkoKSkgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSAiCisgICAgICAgICAgICAgICAgICAib24gYm9hcmQgbGFja3MgQkFDS1dBUkRTX0NPTVBBVElCTEUgY2FwYWJpbGl0eSBvciB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgImNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlTG9naWNhbENhbWVyYVBpY3R1cmUoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2FwdHVyZVdhaXRSZXRyeSAqIHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1c2xlZXAoa0NhcHR1cmVXYWl0VXMpOworICAgICAgICAgICAgaWYgKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1swXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMV0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgICAgICBBU1NFUlRfRVEodGVzdENhc2VzWzJdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSwgcGljdHVyZUNvdW50KTsKKyAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCkpOworCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKKyAgICB9Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gV2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgY2FtZXJhLgorICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUlkICE9IG51bGxwdHIpOworCisgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhKTsKKyAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICBBU1NFUlRfTkUoc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgYm9vbCBpc0JDID0gaXNDYXBhYmlsaXR5U3VwcG9ydGVkKHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSk7CisKKyAgICB1aW50MzJfdCBuYW1lZFRhZyA9IDA7CisgICAgLy8gVGVzdCB0aGF0IEFDYW1lcmFNZXRhZGF0YV9nZXRUYWdGcm9tTmFtZSB3b3JrcyBhcyBleHBlY3RlZCBmb3IgcHVibGljIHRhZworICAgIC8vIG5hbWVzCisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IEFDYW1lcmFNYW5hZ2VyX2dldFRhZ0Zyb21OYW1lKG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVNb2RlIiwgJm5hbWVkVGFnKTsKKworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFDQU1FUkFfT0spOworICAgIEFTU0VSVF9FUShuYW1lZFRhZywgQUNBTUVSQV9DT05UUk9MX0FFX01PREUpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworCisgICAgaWYgKCFpc0JDKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBCQUNLV0FSRF9DT01QQVRJQkxFLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUodGVzdFRha2VQaWN0dXJlc05hdGl2ZShjYW1lcmFJZCkpOworfQorCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7CisgICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShmYWxzZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKKyAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawppbmRleCA2NTk0ODRmLi5lNWMxNjMxIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5taworKysgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTksNyArMTksOCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCVZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAgXAogCUNhbWVyYUJpbmRlclRlc3RzLmNwcCBcCi0JQ2FtZXJhWlNMVGVzdHMuY3BwCisJQ2FtZXJhWlNMVGVzdHMuY3BwIFwKKwlDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJsb2cgXApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKaW5kZXggMWRlNzAxMy4uOGZlMDI5YSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CkBAIC00MCw2ICs0MSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CiAKICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC01NSw2ICs1Nyw4IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlRGVmYXVsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOwogCiAjZGVmaW5lIEFTU0VSVF9OT1RfTlVMTCh4KSBcCiAgICAgQVNTRVJUX1RSVUUoKHgpICE9IG51bGxwdHIpCkBAIC04Niw2ICs5MCwxMSBAQAogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfTsKIAorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKwogICAgIGJvb2wgd2FpdEZvck51bUNhbWVyYXMoc2l6ZV90IG51bSkgY29uc3QgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTQ3Niw3ICs0ODUsOCBAQAogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoZ2JQcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL2ZhbHNlKSk7CiAKLSAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCk7CisgICAgICAgIFN0cmluZzE2IG5vUGh5c2ljYWxJZDsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCwgbm9QaHlzaWNhbElkKTsKIAogICAgICAgICAvLyBDYW4gd2UgY29uZmlndXJlPwogICAgICAgICByZXMgPSBkZXZpY2UtPmJlZ2luQ29uZmlndXJlKCk7CkBAIC00OTAsNiArNTAwLDE5IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKKyAgICAgICAgLy8gU2Vzc2lvbiBjb25maWd1cmF0aW9uIG11c3QgYWxzbyBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBjYXNlCisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uID0geyAvKmlucHV0V2lkdGgqLyAwLCAvKmlucHV0SGVpZ2h0Ki8wLAorICAgICAgICAgICAgICAgIC8qaW5wdXRGb3JtYXQqLyAtMSwgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERX07CisgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmFkZE91dHB1dENvbmZpZ3VyYXRpb24ob3V0cHV0KTsKKyAgICAgICAgYm9vbCBxdWVyeVN0YXR1czsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25Db25maWd1cmF0aW9uLCAmcXVlcnlTdGF0dXMpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgKHJlcy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PSBJQ2FtZXJhU2VydmljZURlZmF1bHQ6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSkKKyAgICAgICAgICAgICAgICA8PCByZXM7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShxdWVyeVN0YXR1cyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBDYW4gd2UgbWFrZSByZXF1ZXN0cz8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVxdWVzdFRlbXBsYXRlOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KC8qcHJldmlldyB0ZW1wbGF0ZSovMSwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKKworY2xhc3MgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorCisgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbigpIDogbnVtQ2FtZXJhcygwKXt9CisgICAgLy9HdGVzdCBpbnRlcmZhY2UKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgaW50MzJfdCBudW1DYW1lcmFzOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKK307CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6U2V0VXAoKSB7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyByYzsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgbUNhbWVyYVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZT4oYmluZGVyKTsKKyAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkNBTUVSQV9UWVBFX0FMTCwgJm51bUNhbWVyYXMpOworICAgIEVYUEVDVF9UUlVFKHJjLmlzT2soKSk7Cit9CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6VGVhckRvd24oKSB7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworLy8gUmV2b2tpbmcgYW5kIGFjcXVpcmluZyBwZXJtaXNzaW9ucyBhdXRvbWF0aWNhbGx5IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4KKy8vIFRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHJlbW92YWwgb2YgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nCisvLyBhIGNhbWVyYSBwZXJtaXNzaW9uLgorVEVTVF9GKENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24sIFRlc3RDYW1lcmFQZXJtaXNzaW9uKSB7CisgICAgZm9yIChpbnQzMl90IGNhbWVyYUlkID0gMDsgY2FtZXJhSWQgPCBudW1DYW1lcmFzOyBjYW1lcmFJZCsrKSB7CisKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWRTdHIgPSBTdHJpbmcxNihTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpKTsKKyAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBhdXRvIHJjID0gbUNhbWVyYVNlcnZpY2UtPnN1cHBvcnRzQ2FtZXJhQXBpKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMiwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdGFnc05lZWRpbmdQZXJtaXNzaW9uOworICAgICAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsICZtZXRhZGF0YSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHJjLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtZXRhZGF0YS5pc0VtcHR5KCkpOworICAgICAgICBFWFBFQ1RfRVEobWV0YWRhdGEucmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lELAorICAgICAgICAgICAgICAgICAgICAmdGFnc05lZWRpbmdQZXJtaXNzaW9uKSwgTk9fRVJST1IpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIEVYUEVDVF9UUlVFKDAgPCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBhdmFpbGFibGVLZXlzOworICAgICAgICBhdmFpbGFibGVLZXlzLnJlc2VydmUoYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKyAgICAgICAgYXZhaWxhYmxlS2V5cy5pbnNlcnQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmRhdGEuaTMyICsgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IHRhZ3NOZWVkaW5nUGVybWlzc2lvbikgeworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG1ldGFkYXRhLmV4aXN0cyhrZXkpKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVLZXlzLmVuZCgpLCBrZXkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXQgPT0gYXZhaWxhYmxlS2V5cy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQ3NmNkCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJzY3JlZW5yZWNvcmQiLAorCisgICAgc3JjczogWworICAgICAgICAic2NyZWVucmVjb3JkLmNwcCIsCisgICAgICAgICJFZ2xXaW5kb3cuY3BwIiwKKyAgICAgICAgIkZyYW1lT3V0cHV0LmNwcCIsCisgICAgICAgICJUZXh0UmVuZGVyZXIuY3BwIiwKKyAgICAgICAgIk92ZXJsYXkuY3BwIiwKKyAgICAgICAgIlByb2dyYW0uY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYkVHTCIsCisgICAgICAgICJsaWJHTEVTdjIiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgIC8vIi1VTkRFQlVHIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4M2VkNi4uMDAwMDAwMAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0Jc2NyZWVucmVjb3JkLmNwcCBcCi0JRWdsV2luZG93LmNwcCBcCi0JRnJhbWVPdXRwdXQuY3BwIFwKLQlUZXh0UmVuZGVyZXIuY3BwIFwKLQlPdmVybGF5LmNwcCBcCi0JUHJvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLQlsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIGxpYkVHTCBsaWJHTEVTdjIKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotCWV4dGVybmFsL2pwZWcKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgotI0xPQ0FMX0NGTEFHUyArPSAtVU5ERUJVRwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9NT0RVTEU6PSBzY3JlZW5yZWNvcmQKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBkMTg1OWQxLi43YWE2NTVmIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgpAQCAtNTgsNyArNTksMzUgQEAKICNpbmNsdWRlICJPdmVybGF5LmgiCiAjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBhbmRyb2lkOjpBQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6QUxvb3BlcjsKK3VzaW5nIGFuZHJvaWQ6OkFNZXNzYWdlOwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OkRpc3BsYXlJbmZvOwordXNpbmcgYW5kcm9pZDo6RnJhbWVPdXRwdXQ7Cit1c2luZyBhbmRyb2lkOjpJQmluZGVyOwordXNpbmcgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFuZHJvaWQ6OklTdXJmYWNlQ29tcG9zZXI7Cit1c2luZyBhbmRyb2lkOjpNZWRpYUNvZGVjOwordXNpbmcgYW5kcm9pZDo6TWVkaWFDb2RlY0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6Ok1lZGlhTXV4ZXI7Cit1c2luZyBhbmRyb2lkOjpPdmVybGF5OwordXNpbmcgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2U7Cit1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7Cit1c2luZyBhbmRyb2lkOjpSZWN0OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlN1cmZhY2VDb21wb3NlckNsaWVudDsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OnNwOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CisKK3VzaW5nIGFuZHJvaWQ6OkRJU1BMQVlfT1JJRU5UQVRJT05fMDsKK3VzaW5nIGFuZHJvaWQ6OkRJU1BMQVlfT1JJRU5UQVRJT05fMTgwOwordXNpbmcgYW5kcm9pZDo6RElTUExBWV9PUklFTlRBVElPTl85MDsKK3VzaW5nIGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OOwordXNpbmcgYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQ7Cit1c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKK3VzaW5nIGFuZHJvaWQ6OlVOS05PV05fRVJST1I7CiAKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluQml0UmF0ZSA9IDEwMDAwMDsgICAgICAgICAvLyAwLjFNYnBzCiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heEJpdFJhdGUgPSAyMDAgKiAxMDAwMDAwOyAgLy8gMjAwTWJwcwpAQCAtNzMsNyArMTAyLDcgQEAKIHN0YXRpYyBib29sIGdNb25vdG9uaWNUaW1lID0gZmFsc2U7ICAgICAvLyB1c2Ugc3lzdGVtIG1vbm90b25pYyB0aW1lIGZvciB0aW1lc3RhbXBzCiBzdGF0aWMgYm9vbCBnUGVyc2lzdGVudFN1cmZhY2UgPSBmYWxzZTsgLy8gdXNlIHBlcnNpc3RlbnQgc3VyZmFjZQogc3RhdGljIGVudW0gewotICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUworICAgIEZPUk1BVF9NUDQsIEZPUk1BVF9IMjY0LCBGT1JNQVRfV0VCTSwgRk9STUFUXzNHUFAsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCiB9IGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OyAgICAgICAgICAgLy8gZGF0YSBmb3JtYXQgZm9yIG91dHB1dAogc3RhdGljIEFTdHJpbmcgZ0NvZGVjTmFtZSA9ICIiOyAgICAgICAgIC8vIGNvZGVjIG5hbWUgb3ZlcnJpZGUKIHN0YXRpYyBib29sIGdTaXplU3BlY2lmaWVkID0gZmFsc2U7ICAgICAvLyB3YXMgc2l6ZSBleHBsaWNpdGx5IHJlcXVlc3RlZD8KQEAgLTgzLDYgKzExMiw3IEBACiBzdGF0aWMgdWludDMyX3QgZ1ZpZGVvSGVpZ2h0ID0gMDsKIHN0YXRpYyB1aW50MzJfdCBnQml0UmF0ZSA9IDIwMDAwMDAwOyAgICAgLy8gMjBNYnBzCiBzdGF0aWMgdWludDMyX3QgZ1RpbWVMaW1pdFNlYyA9IGtNYXhUaW1lTGltaXRTZWM7CitzdGF0aWMgdWludDMyX3QgZ0JmcmFtZXMgPSAwOwogCiAvLyBTZXQgYnkgc2lnbmFsIGhhbmRsZXIgdG8gc3RvcCByZWNvcmRpbmcuCiBzdGF0aWMgdm9sYXRpbGUgYm9vbCBnU3RvcFJlcXVlc3RlZCA9IGZhbHNlOwpAQCAtMTU0LDE1ICsxODQsMjAgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgZ1ZpZGVvV2lkdGgpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIGdWaWRlb0hlaWdodCk7Ci0gICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBrTWltZVR5cGVBdmMpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgZ0JpdFJhdGUpOwotICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBkaXNwbGF5RnBzKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBnVmlkZW9XaWR0aCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBnVmlkZW9IZWlnaHQpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBrTWltZVR5cGVBdmMpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0JJVF9SQVRFLCBnQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRGbG9hdChLRVlfRlJBTUVfUkFURSwgZGlzcGxheUZwcyk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgMTApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX01BWF9CX0ZSQU1FUywgZ0JmcmFtZXMpOworICAgIGlmIChnQmZyYW1lcyA+IDApIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfUFJPRklMRSwgQVZDUHJvZmlsZU1haW4pOworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9MRVZFTCwgQVZDTGV2ZWw0MSk7CisgICAgfQogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zZXROYW1lKCJzY3JlZW5yZWNvcmRfbG9vcGVyIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogICAgIEFMT0dWKCJDcmVhdGluZyBjb2RlYyIpOwpAQCAtMjM1LDEwICsyNzAsMTAgQEAKIAogICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKICAgICAvLyBjYXNlIGlzICJhbGwgb2YgaXQiLgotICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCk7CisgICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGRpc3BsYXkuCi0gICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8uaCAvIChmbG9hdCkgbWFpbkRweUluZm8udzsKKyAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydEggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0VzsKIAogCiAgICAgLy8gU2V0IHRoZSB3YXkgd2UgbWFwIHRoZSBvdXRwdXQgb250byB0aGUgZGlzcGxheSBzdXJmYWNlICh3aGljaCB3aWxsCkBAIC0zMTUsMjIgKzM1MCw2IEBACiB9CiAKIC8qCi0gKiBTZXQgdGhlIG1haW4gZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSBhY3R1YWwgd2lkdGggYW5kIGhlaWdodAotICovCi1zdGF0aWMgc3RhdHVzX3QgZ2V0QWN0dWFsRGlzcGxheVNpemUoY29uc3Qgc3A8SUJpbmRlcj4mIG1haW5EcHksIERpc3BsYXlJbmZvKiBtYWluRHB5SW5mbykgewotICAgIFJlY3Qgdmlld3BvcnQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5Vmlld3BvcnQobWFpbkRweSwgJnZpZXdwb3J0KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBnZXQgZGlzcGxheSB2aWV3cG9ydFxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1haW5EcHlJbmZvLT53ID0gdmlld3BvcnQud2lkdGgoKTsKLSAgICBtYWluRHB5SW5mby0+aCA9IHZpZXdwb3J0LmhlaWdodCgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKgogICogUnVucyB0aGUgTWVkaWFDb2RlYyBlbmNvZGVyLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIE1lZGlhTXV4ZXIuICBUaGUKICAqIGlucHV0IGZyYW1lcyBhcmUgY29taW5nIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhcyBmYXN0IGFzIFN1cmZhY2VGbGluZ2VyCiAgKiB3YW50cyB0byBzZW5kIHRoZW0uCkBAIC00MDAsMjIgKzQxOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2VmdWwgc3R1ZmYgaXMgaGFyZCB0byBnZXQgYXQgd2l0aG91dCBhIERhbHZpayBWTS4KICAgICAgICAgICAgICAgICAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5SW5mbyhtYWluKSBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ3Miw3ICs0ODMsNyBAQAogICAgICAgICBjYXNlIC1FQUdBSU46ICAgICAgICAgICAgICAgICAgICAgICAvLyBJTkZPX1RSWV9BR0FJTl9MQVRFUgogICAgICAgICAgICAgQUxPR1YoIkdvdCAtRUFHQUlOLCBsb29waW5nIik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTkZPX0ZPUk1BVF9DSEFOR0VEOiAgICAgICAgICAgLy8gSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpJTkZPX0ZPUk1BVF9DSEFOR0VEOiAgICAvLyBJTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBpbmNsdWRlcyBDU0QsIHdoaWNoIHdlIG11c3QgcHJvdmlkZSB0byBtdXhlci4KICAgICAgICAgICAgICAgICBBTE9HVigiRW5jb2RlciBmb3JtYXQgY2hhbmdlZCIpOwpAQCAtNDg5LDcgKzUwMCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOiAgIC8vIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRAorICAgICAgICBjYXNlIGFuZHJvaWQ6OklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDogICAvLyBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQKICAgICAgICAgICAgIC8vIE5vdCBleHBlY3RlZCBmb3IgYW4gZW5jb2RlcjsgaGFuZGxlIGl0IGFueXdheS4KICAgICAgICAgICAgIEFMT0dWKCJFbmNvZGVyIGJ1ZmZlcnMgY2hhbmdlZCIpOwogICAgICAgICAgICAgZXJyID0gZW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmYnVmZmVycyk7CkBAIC01ODAsOCArNTkxLDEyIEBACiAgICAgc2VsZi0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICAvLyBHZXQgbWFpbiBkaXNwbGF5IHBhcmFtZXRlcnMuCi0gICAgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbik7CisgICAgY29uc3Qgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICBpZiAobWFpbkRweSA9PSBudWxscHRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGRpc3BsYXlcbiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCiAgICAgRGlzcGxheUluZm8gbWFpbkRweUluZm87CiAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LCAmbWFpbkRweUluZm8pOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTU4OSwyNSArNjA0LDE5IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gZ2V0QWN0dWFsRGlzcGxheVNpemUobWFpbkRweSwgJm1haW5EcHlJbmZvKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCiAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgIHByaW50ZigiTWFpbiBkaXNwbGF5IGlzICVkeCVkIEAlLjJmZnBzIChvcmllbnRhdGlvbj0ldSlcbiIsCi0gICAgICAgICAgICAgICAgbWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCwgbWFpbkRweUluZm8uZnBzLAorICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLnZpZXdwb3J0VywgbWFpbkRweUluZm8udmlld3BvcnRILCBtYWluRHB5SW5mby5mcHMsCiAgICAgICAgICAgICAgICAgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwogICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICB9CiAKICAgICAvLyBFbmNvZGVyIGNhbid0IHRha2Ugb2RkIG51bWJlciBhcyBjb25maWcKICAgICBpZiAoZ1ZpZGVvV2lkdGggPT0gMCkgewotICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLncpOworICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0Vyk7CiAgICAgfQogICAgIGlmIChnVmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby5oKTsKKyAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRIKTsKICAgICB9CiAKICAgICAvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBlbmNvZGVyLgpAQCAtNjg1LDcgKzY5NCw5IEBACiAgICAgc3A8TWVkaWFNdXhlcj4gbXV4ZXIgPSBOVUxMOwogICAgIEZJTEUqIHJhd0ZwID0gTlVMTDsKICAgICBzd2l0Y2ggKGdPdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBGT1JNQVRfTVA0OiB7CisgICAgICAgIGNhc2UgRk9STUFUX01QNDoKKyAgICAgICAgY2FzZSBGT1JNQVRfV0VCTToKKyAgICAgICAgY2FzZSBGT1JNQVRfM0dQUDogewogICAgICAgICAgICAgLy8gQ29uZmlndXJlIG11eGVyLiAgV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgQ1NEIGJsb2IgZnJvbSB0aGUgZW5jb2RlcgogICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGNhbiBzdGFydCBpdC4KICAgICAgICAgICAgIGVyciA9IHVubGluayhmaWxlTmFtZSk7CkBAIC02OTgsNyArNzA5LDEzIEBACiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGRuJ3Qgb3BlbiBmaWxlXG4iKTsKICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX01QNCkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfV0VCTSkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfV0VCTSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGlmIChnUm90YXRlKSB7CiAgICAgICAgICAgICAgICAgbXV4ZXItPnNldE9yaWVudGF0aW9uSGludCg5MCk7ICAvLyBUT0RPOiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/CkBAIC05NDgsNiArOTY1LDcgQEAKICAgICAgICAgeyAiY29kZWMtbmFtZSIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnTicgfSwKICAgICAgICAgeyAibW9ub3RvbmljLXRpbWUiLCAgICAgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAnbScgfSwKICAgICAgICAgeyAicGVyc2lzdGVudC1zdXJmYWNlIiwgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAncCcgfSwKKyAgICAgICAgeyAiYmZyYW1lcyIsICAgICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnQicgfSwKICAgICAgICAgeyBOVUxMLCAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICBOVUxMLCAwIH0KICAgICB9OwogCkBAIC0xMDE4LDYgKzEwMzYsMTAgQEAKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImgyNjQiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9IMjY0OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAid2VibSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX1dFQk07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICIzZ3BwIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfM0dQUDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImZyYW1lcyIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0ZSQU1FUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgInJhdy1mcmFtZXMiKSA9PSAwKSB7CkBAIC0xMDM2LDYgKzEwNTgsMTEgQEAKICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICBnUGVyc2lzdGVudFN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgaWYgKHBhcnNlVmFsdWVXaXRoVW5pdChvcHRhcmcsICZnQmZyYW1lcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggYzc2MTlhZi4uNmViMmU5ZiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtOCw3ICs4LDcgQEAKICAgICAgICAgU2luZVNvdXJjZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJtZWRpYWV4dHJhY3RvciBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKICAgICAgICAgbGliaGlkbGJhc2UgXAogICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICByZWNvcmQuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgcmVjb3JkdmlkZW8uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgYXVkaW9sb29wLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCkBAIC0xMTEsNyArMTExLDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlidWkgbGliZ3VpIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xOTEsNyArMTkxLDYgQEAKIExPQ0FMX01PRFVMRTo9IG1lZGlhZmlsdGVyCiAKIExPQ0FMX1NBTklUSVpFIDo9IGNmaQotTE9DQUxfU0FOSVRJWkVfRElBRyA6PSBjZmkKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKQEAgLTIwNCw3ICsyMDMsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliY3V0aWxzIGxpYmMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGliY3V0aWxzIGxpYmMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IDZhNTg0NjcuLmU1YTQzMzcgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogICAgIENIRUNLKCFzdGF0ZUJ5VHJhY2suaXNFbXB0eSgpKTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtMzY2LDEzICszNjYsMTMgQEAKICAgICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCA9IHRydWU7CisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJlbmRlclN1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1c2VTdXJmYWNlID0gdHJ1ZTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKQEAgLTQxMSwxMCArNDExLDEyIEBACiAgICAgICAgIGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIHNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgICAgICBjb25zdCBzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgICAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgICAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggZjI0ZDJkZC4uMmNmNjk1NSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGJvb2wgcmVuZGVyU3VyZmFjZSwKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZpbHRlclN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICBmaWx0ZXJTdGF0ZS0+bVNhd091dHB1dEVPUyA9IGZhbHNlOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC02NDMsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAsICZzdGFydFRpbWVSZW5kZXIpOwogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC03MDYsMTMgKzcwNiwxMyBAQAogICAgICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmVuZGVyU3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVzZVN1cmZhY2UgPSB0cnVlOwpAQCAtNzM3LDcgKzczNyw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBhbmRyb2lkOjpzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBhbmRyb2lkOjpzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNzQ4LDEwICs3NDgsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7CiAKLSAgICAgICAgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDQ0YjAwMTUuLjk1YTE2ZjMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI4LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggNjFmYzg5Ny4uYmYzNmJlMCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC00Nyw5ICs0NiwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpAQCAtNzgsNiArNzksNyBAQAogc3RhdGljIGJvb2wgZ1BsYXliYWNrQXVkaW87CiBzdGF0aWMgYm9vbCBnV3JpdGVNUDQ7CiBzdGF0aWMgYm9vbCBnRGlzcGxheUhpc3RvZ3JhbTsKK3N0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7CiBzdGF0aWMgYm9vbCBzaG93UHJvZ3Jlc3MgPSB0cnVlOwogc3RhdGljIFN0cmluZzggZ1dyaXRlTVA0RmlsZW5hbWU7CiBzdGF0aWMgU3RyaW5nOCBnQ29tcG9uZW50TmFtZU92ZXJyaWRlOwpAQCAtMTU5LDYgKzE2MSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbWV0YS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICB9CisKICAgICAgICAgQ0hFQ0tfRVEoCiAgICAgICAgICAgICAgICAgZndyaXRlKChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgIDEsCkBAIC0yMTgsMTEgKzIyNSwxNSBAQAogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOwogICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIAotICAgICAgICBwbGF5ZXItPnN0YXJ0KHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOworICAgICAgICBlcnIgPSBwbGF5ZXItPnN0YXJ0KHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwogCi0gICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICB3aGlsZSAoIXBsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMDAwbGwpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKKyAgICAgICAgICAgIHdoaWxlICghcGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDAwbGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gc3RhcnQgcGxheWJhY2sgZXJyPSVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CiAgICAgICAgIH0KIAogICAgICAgICBkZWxldGUgcGxheWVyOwpAQCAtMzQ4LDcgKzM1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBkZWNvZGVUaW1lc1VzLnB1c2goZGVsYXlEZWNvZGVVcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIlbGQgc2FtcGxlIGZvcm1hdDogJXNcbiIsIG51bUZyYW1lcywgbWV0YS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc5LDEyICs1OTMsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQ0hFQ0soYnVmZmVyICE9IE5VTEwpOworCiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyICE9IE5VTEwpOwotCiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIH0KQEAgLTYxNSw3ICs2MjksNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1sKGlzdCkgY29tcG9uZW50c1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW0gbWF4LW51bWJlci1vZi1mcmFtZXMtdG8tZGVjb2RlIGluIGVhY2ggcGFzc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWIgYnVnIHRvIHJlcHJvZHVjZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXAocm9maWxlcykgZHVtcCBkZWNvZGVyIHByb2ZpbGVzIHN1cHBvcnRlZFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkobmZvKSBkdW1wIGNvZGVjIGluZm8gKHByb2ZpbGVzIGFuZCBjb2xvciBmb3JtYXRzIHN1cHBvcnRlZCwgZGV0YWlscylcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1zKG9mdHdhcmUpIHByZWZlciBzb2Z0d2FyZSBjb2RlY1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXIoaGFyZHdhcmUpIGZvcmNlIHRvIHVzZSBoYXJkd2FyZSBjb2RlY1xuIik7CkBAIC02MzAsNTUgKzY0NCwxMzQgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtVCBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlIHRleHR1cmVcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1kKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChyYXcgc3RyZWFtIGRhdGEgdG8gYSBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLUQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKGRlY29kZWQgUENNIGRhdGEgdG8gYSBmaWxlKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXYgYmUgbW9yZSB2ZXJib3NlXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZHVtcENvZGVjUHJvZmlsZXMoYm9vbCBxdWVyeURlY29kZXJzKSB7Ci0gICAgY29uc3QgY2hhciAqa01pbWVUeXBlc1tdID0gewotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OCi0gICAgfTsKLQotICAgIGNvbnN0IGNoYXIgKmNvZGVjVHlwZSA9IHF1ZXJ5RGVjb2RlcnM/ICJkZWNvZGVyIiA6ICJlbmNvZGVyIjsKLSAgICBwcmludGYoIiVzIHByb2ZpbGVzOlxuIiwgY29kZWNUeXBlKTsKK3N0YXRpYyB2b2lkIGR1bXBDb2RlY0RldGFpbHMoYm9vbCBxdWVyeURlY29kZXJzKSB7CisgICAgY29uc3QgY2hhciAqY29kZWNUeXBlID0gcXVlcnlEZWNvZGVycz8gIkRlY29kZXIiIDogIkVuY29kZXIiOworICAgIHByaW50ZigiXG4lcyBpbmZvcyBieSBtZWRpYSB0eXBlczpcbiIKKyAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBjb2RlY1R5cGUpOwogCiAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CiAgICAgc2l6ZV90IG51bUNvZGVjcyA9IGxpc3QtPmNvdW50Q29kZWNzKCk7CiAKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsgKytrKSB7Ci0gICAgICAgIHByaW50ZigidHlwZSAnJXMnOlxuIiwga01pbWVUeXBlc1trXSk7CisgICAgLy8gZ2F0aGVyIGFsbCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgY29kZWMgY2xhc3MsIGFuZCBsaW5rIHRvIGNvZGVjcyB0aGF0IHN1cHBvcnQgdGhlbQorICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+PiBhbGxNZWRpYVR5cGVzOworICAgIGZvciAoc2l6ZV90IGNvZGVjX2l4ID0gMDsgY29kZWNfaXggPCBudW1Db2RlY3M7ICsrY29kZWNfaXgpIHsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oY29kZWNfaXgpOworICAgICAgICBpZiAoaW5mby0+aXNFbmNvZGVyKCkgPT0gIXF1ZXJ5RGVjb2RlcnMpIHsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBzdXBwb3J0ZWRNZWRpYVR5cGVzOworICAgICAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmc3VwcG9ydGVkTWVkaWFUeXBlcyk7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnRlZE1lZGlhVHlwZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBtZWRpYSB0eXBlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUgOiBzdXBwb3J0ZWRNZWRpYVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxNZWRpYVR5cGVzLmluZGV4T2ZLZXkobWVkaWFUeXBlKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1lZGlhVHlwZXMuYWRkKG1lZGlhVHlwZSwgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWxsTWVkaWFUeXBlcy5lZGl0VmFsdWVGb3IobWVkaWFUeXBlKS5hZGQoaW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBudW1Db2RlY3M7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChpbmZvID09IE5VTEwgfHwgaW5mby0+aXNFbmNvZGVyKCkgIT0gIXF1ZXJ5RGVjb2RlcnMpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3Ioa01pbWVUeXBlc1trXSk7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgYm9vbD4gdmlzaXRlZENvZGVjczsKKyAgICBmb3IgKHNpemVfdCB0eXBlX2l4ID0gMDsgdHlwZV9peCA8IGFsbE1lZGlhVHlwZXMuc2l6ZSgpOyArK3R5cGVfaXgpIHsKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlID0gYWxsTWVkaWFUeXBlcy5rZXlBdCh0eXBlX2l4KTsKKyAgICAgICAgcHJpbnRmKCJcbk1lZGlhIHR5cGUgJyVzJzpcbiIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgICAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IGFsbE1lZGlhVHlwZXMudmFsdWVBdCh0eXBlX2l4KSkgeworICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAoY2FwcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlcyBkb2VzIG5vdCBoYXZlIGNhcGFiaWxpdGllcyBmb3IgdHlwZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpLCBtZWRpYVR5cGUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiAgJXMgJyVzJyBzdXBwb3J0cyAiLAorICAgICAgICAgICAgcHJpbnRmKCIgICVzIFwiJXNcIiBzdXBwb3J0c1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlLCBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CiAKLSAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOwotICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZUxldmVscy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiTk9USElORy5cbiIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXV0byBwcmludExpc3QgPSBbXShjb25zdCBjaGFyICp0eXBlLCBjb25zdCBWZWN0b3I8QVN0cmluZz4gJnZhbHVlcyl7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgJXM6IFsiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZhbHVlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgICAgJXMlcyIsIHZhbHVlc1tqXS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPT0gdmFsdWVzLnNpemUoKSAtIDEgPyAiICIgOiAiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIl1cbiIpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKHZpc2l0ZWRDb2RlY3MuaW5kZXhPZktleShpbmZvLT5nZXRDb2RlY05hbWUoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgdmlzaXRlZENvZGVjcy5hZGQoaW5mby0+Z2V0Q29kZWNOYW1lKCksIHRydWUpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGFsaWFzZXM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldEFsaWFzZXMoJmFsaWFzZXMpOworICAgICAgICAgICAgICAgICAgICAvLyBxdW90ZSBhbGlhcworICAgICAgICAgICAgICAgICAgICBmb3IgKEFTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMuaW5zZXJ0KCJcIiIsIDEsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMuYXBwZW5kKCciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJhbGlhc2VzIiwgYWxpYXNlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXR0cnMgPSBpbmZvLT5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJlbmNvZGVyOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyKSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJ2ZW5kb3I6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50Zigic29mdHdhcmUtb25seTogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5KSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJody1hY2NlbGVyYXRlZDogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRMaXN0KEFTdHJpbmdQcmludGYoImF0dHJpYnV0ZXM6ICUjeCIsIGF0dHJzKS5jX3N0cigpLCBsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICBvd25lcjogXCIlc1wiXG4iLCBpbmZvLT5nZXRPd25lck5hbWUoKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgcmFuazogJXVcbiIsIGluZm8tPmdldFJhbmsoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIGFsaWFzZXMsIGF0dHJpYnV0ZXMsIG93bmVyLCByYW5rOiBzZWUgYWJvdmVcbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHByb2ZpbGVMZXZlbHMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPSBwcm9maWxlTGV2ZWxzW2pdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoJnByb2ZpbGVMZXZlbHMpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbCAmcGwgOiBwcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5pY2VQcm9maWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX0FVRElPX0FBQykgICA/IGFzU3RyaW5nX0FBQ09iamVjdChwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzIpID8gYXNTdHJpbmdfTVBFRzJQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IMjYzKSAgPyBhc1N0cmluZ19IMjYzUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzQpID8gYXNTdHJpbmdfTVBFRzRQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVkMpICAgPyBhc1N0cmluZ19BVkNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICAgPyBhc1N0cmluZ19WUDhQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IRVZDKSAgPyBhc1N0cmluZ19IRVZDUHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA5KSAgID8gYXNTdHJpbmdfVlA5UHJvZmlsZShwbC5tUHJvZmlsZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVYxKSAgID8gYXNTdHJpbmdfQVYxUHJvZmlsZShwbC5tUHJvZmlsZSkgOiI/PyI7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5pY2VMZXZlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHMikgPyBhc1N0cmluZ19NUEVHMkxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fSDI2MykgID8gYXNTdHJpbmdfSDI2M0xldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fTVBFRzQpID8gYXNTdHJpbmdfTVBFRzRMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWQykgICA/IGFzU3RyaW5nX0FWQ0xldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA4KSAgID8gYXNTdHJpbmdfVlA4TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IRVZDKSAgPyBhc1N0cmluZ19IRVZDVGllckxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fVlA5KSAgID8gYXNTdHJpbmdfVlA5TGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVjEpICAgPyBhc1N0cmluZ19BVjFMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICI/PyI7CiAKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzJXUvJXUiLCBqID4gMCA/ICIsICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbC5tUHJvZmlsZSwgcHJvZmlsZUxldmVsLm1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoIiUgNXUvJSA1dSAoJXMvJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbC5tUHJvZmlsZSwgcGwubUxldmVsLCBuaWNlUHJvZmlsZSwgbmljZUxldmVsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TGlzdCgicHJvZmlsZS9sZXZlbHMiLCBsaXN0KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBsaXN0OworICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JzOworICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygmY29sb3JzKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbG9yIDogY29sb3JzKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoIiUjeCAoJXMpIiwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmdfQ29sb3JGb3JtYXQoKGludDMyX3QpY29sb3IpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TGlzdCgiY29sb3JzIiwgbGlzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50ZigiICAgIGRldGFpbHM6ICVzXG4iLCBjYXBzLT5nZXREZXRhaWxzKCktPmRlYnVnU3RyaW5nKDYpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjg4LDcgKzc4MSw3IEBACiAKICAgICBib29sIGF1ZGlvT25seSA9IGZhbHNlOwogICAgIGJvb2wgbGlzdENvbXBvbmVudHMgPSBmYWxzZTsKLSAgICBib29sIGR1bXBQcm9maWxlcyA9IGZhbHNlOworICAgIGJvb2wgZHVtcENvZGVjSW5mbyA9IGZhbHNlOwogICAgIGJvb2wgZXh0cmFjdFRodW1ibmFpbCA9IGZhbHNlOwogICAgIGJvb2wgc2Vla1Rlc3QgPSBmYWxzZTsKICAgICBib29sIHVzZVN1cmZhY2VBbGxvYyA9IGZhbHNlOwpAQCAtNzA1LDEwICs3OTgsMTAgQEAKICAgICBnV3JpdGVNUDQgPSBmYWxzZTsKICAgICBnRGlzcGxheUhpc3RvZ3JhbSA9IGZhbHNlOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlcjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgInZoYXFuOmxtOmI6aXRzcm93OmtOOnhTVGQ6RDoiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC03NzgsOSArODcxLDkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkdW1wUHJvZmlsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGR1bXBDb2RlY0luZm8gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC04MzIsNiArOTI1LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdWZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC05MTUsOSArMTAxNCw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChkdW1wUHJvZmlsZXMpIHsKLSAgICAgICAgZHVtcENvZGVjUHJvZmlsZXModHJ1ZSAvKiBxdWVyeURlY29kZXJzICovKTsKLSAgICAgICAgZHVtcENvZGVjUHJvZmlsZXMoZmFsc2UgLyogcXVlcnlEZWNvZGVycyAqLyk7CisgICAgaWYgKGR1bXBDb2RlY0luZm8pIHsKKyAgICAgICAgZHVtcENvZGVjRGV0YWlscyh0cnVlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOworICAgICAgICBkdW1wQ29kZWNEZXRhaWxzKGZhbHNlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOwogICAgIH0KIAogICAgIGlmIChsaXN0Q29tcG9uZW50cykgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCmluZGV4IGIwMTk5ZDguLjM1YmRiYzAgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTMyLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzE4LDEwICszMTgsMTIgQEAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDE1NTJjM2YuLjI3MjY4NGMgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vQW5kcm9pZC5icAorKysgYi9kcm0vY29tbW9uL0FuZHJvaWQuYnAKQEAgLTM1LDcgKzM1LDcgQEAKIAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJiaW5kZXIiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJiaW5kZXIiXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcCBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKaW5kZXggZjczNDkwNS4uYWVjNTk1OSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcAorKysgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCkBAIC03OSwxMiArNzksMTIgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHJldHVybiBvbkNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgcmV0dXJuIG9uU2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiB9CiAKQEAgLTEyMCw3ICsxMjAsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKQEAgLTEzMSw3ICsxMzEsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgaWYgKCFtaW1lIHx8IG1pbWVbMF0gPT0gJ1wwJykgewogICAgICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSk7CkBAIC0xMzksMzMgKzEzOSwzMyBAQAogICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpLCBtaW1lKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZiwgbWltZVR5cGUpOwogfQogCi1zdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgcmV0dXJuIG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgcmV0dXJuIG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZGVjcnlwdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICByZXR1cm4gb25EZWNyeXB0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHJldHVybiBvbkZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCiBzc2l6ZV90IERybUVuZ2luZUJhc2U6OnByZWFkKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICByZXR1cm4gb25QcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDQ0Zjk4ZGQuLmE2ZDMzYjAgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgdm9pZCB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoCi0gICAgICAgIGNvbnN0IERlY3J5cHRIYW5kbGUqIGhhbmRsZSwgUGFyY2VsKiBkYXRhKSB7CisgICAgICAgIGNvbnN0IHNwPERlY3J5cHRIYW5kbGU+JiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgewogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SWQpOwogICAgIGRhdGEtPndyaXRlU3RyaW5nOChoYW5kbGUtPm1pbWVUeXBlKTsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOwpAQCAtNjcsNyArNjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKICAgICBpZiAoMCA9PSBkYXRhLmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05OSw3ICs5OSw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoRGVjcnlwdEhhbmRsZSogaGFuZGxlKSB7CitzdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSkgewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDE0LDcgKzQxNCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoImNvbnN1bWVSaWdodHMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigic2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02MjEsNyArNjIxLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02MjksNyArNjI5LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uOiBtaW1lPSVzIiwgbWltZT8gbWltZTogIk5VTEwiKTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZPUl9TVFJFQU1JTkcsIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjgzLDcgKzY4Myw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02OTgsNyArNjk4LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBBTE9HVigiaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzE4LDcgKzcxOCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoImRlY3J5cHQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03NTQsNyArNzU0LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoImZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTc3MCw3ICs3NzAsNyBAQAogfQogCiBzc2l6ZV90IEJwRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJyZWFkIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTEyOCwxNiArMTEyOCwxNiBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgYWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgYm9vbCByZXNlcnZlID0gc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBoYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTExNDgsMTYgKzExNDgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IHBsYXliYWNrU3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgJmhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTMyOSwxMyArMTMyOSwxMyBAQAogICAgICAgICBjb25zdCBvZmY2NF90IGxlbmd0aCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlCiAgICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTEzNDksMTMgKzEzNDksMTMgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCB1cmkgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzczLDEzICsxMzczLDEyIEBACiAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOwogCiAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzkzLDcgKzEzOTIsNyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSk7CkBAIC0xNDA4LDggKzE0MDcsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKQEAgLTE0MTcsMTcgKzE0MTYsMTcgQEAKICAgICAgICAgY29uc3QgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChidWZmZXJTaXplID4gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogICAgICAgICBEcm1CdWZmZXIqIGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICBoZWFkZXJJbmZvID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIGhlYWRlckluZm87IGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTE0MzksOCArMTQzOCw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGU7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQ1MCw3ICsxNDQ5LDcgQEAKICAgICAgICAgICAgIGRlY0J1ZmZlclNpemUgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNDcwLDcgKzE0NjksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGRlY3J5cHQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOworICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOwogCiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKQEAgLTE0ODAsNyArMTQ3OSw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGUoZGVjQnVmZmVyLT5kYXRhLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBlbmNCdWZmZXI7IGVuY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBkZWNCdWZmZXI7IGRlY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXI7IGJ1ZmZlciA9IE5VTEw7CkBAIC0xNDk1LDEzICsxNDk0LDEzIEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCi0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xNTEyLDggKzE1MTEsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCB1aW50MzJfdCBudW1CeXRlcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChudW1CeXRlcyA+IE1BWF9CSU5ERVJfVFJBTlNBQ1RJT05fU0laRSkgewpAQCAtMTUyNCwxMyArMTUyMywxMyBAQAogCiAgICAgICAgIGNvbnN0IG9mZjY0X3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50NjQoKTsKIAotICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCAmaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCBoYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgIGlmICgwIDwgcmVzdWx0KSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGUoYnVmZmVyLCByZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlciwgYnVmZmVyID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAppbmRleCA0MTcxMDdmLi43M2YxMWE0IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKQEAgLTU5LDEwICs1OSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTgwLDI3ICs4MSwyOCBAQAogICAgIERybVN1cHBvcnRJbmZvKiBnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiBwcm90ZWN0ZWQ6CkBAIC0yNjUsNyArMjY3LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKQEAgLTI4MCw3ICsyODIsOCBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArNDAxLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgaW50IC8qIGZkICovLCBvZmY2NF90IC8qIG9mZnNldCAqLywgb2ZmNjRfdCAvKiBsZW5ndGggKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBtaW1lICovKSB7CiAKQEAgLTQxNSw3ICs0MTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpID0gMDsKIAogICAgIC8qKgpAQCAtNDMwLDcgKzQzMyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHVyaSAqLywgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ0Nyw3ICs0NTAsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIC8qIGJ1ZiAqLywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qIG1pbWVUeXBlICovKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ2MSw3ICs0NjQsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTQ3Myw3ICs0NzYsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC00OTMsNyArNDk2LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICAvKioKQEAgLTUwNiw3ICs1MDksNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC01MTksNyArNTIyLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAppbmRleCBhY2M4ZWQ5Li4xODM3YTExIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbmZvcm1zIHRoZSBEUk0gRW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKICAgICAvKioKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC00MTEsNyArNDExLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTQyNCw3ICs0MjQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDAzNzZiNDkuLjgzNmFlMGEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTExNSwxMCArMTE1LDExIEBACiAgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKQEAgLTEzOCwyOCArMTM5LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCkBAIC0yMDMsMTAgKzIwNCwxMCBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0yMjUsMjggKzIyNiwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCBiZjA0YTg5Li5hZmJjYjM5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTI2Nyw3ICsyNjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjb25zdW1lUmlnaHRzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0zOTYsMTUgKzM5NiwxNSBAQAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDIwLDE5ICs0MjAsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ0OCwyMCArNDQ4LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDc3LDIwICs0NzcsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgQUxPR1YoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKLSAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQgJiYgTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAucmVtb3ZlSXRlbShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtNDk4LDcgKzQ5Nyw4IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MDgsNyArNTA4LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogCkBAIC01MjIsNyArNTIyLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHNzaXplX3QgcmVzdWx0ID0gREVDUllQVF9GSUxFX0VSUk9SOwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCmluZGV4IGU3Y2RkMzYuLjI2MjIyYmMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCkBAIC04OSwxMCArODksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMDksMjUgKzExMCwyNiBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCBkYWQ1OTliLi4yNjAwYTJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtNTgsMjIgKzU4LDI2IEBACiAgICAgcmV0dXJuIGRybV9wZXJtX2xhYmVsc1tpbmRleF07CiB9CiAKLWJvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSkgeworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKSB7CiAgICAgaWYgKHNlbGludXhfZW5hYmxlZCA8PSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGNoYXIgKnNjdHg7CisgICAgY2hhciAqc2N0eCA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2VsaW51eF9jbGFzcyA9ICJkcm1zZXJ2aWNlIjsKICAgICBjb25zdCBjaGFyICpzdHJfcGVybSA9IGdldF9wZXJtX2xhYmVsKHBlcm0pOwogCi0gICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgewotICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3NpZCA9PSBOVUxMKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTIxMDM1MDQyIik7CisKKyAgICAgICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlNFTGludXg6IGdldHBpZGNvbihwaWQ9JWQpIGZhaWxlZC5cbiIsIHNwaWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBhbGxvd2VkID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LCBzZWxpbnV4X2NsYXNzLAotICAgICAgICAgICAgc3RyX3Blcm0sIE5VTEwpID09IDApOworICAgIGJvb2wgYWxsb3dlZCA9IChzZWxpbnV4X2NoZWNrX2FjY2Vzcyhzc2lkID8gc3NpZCA6IHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LAorICAgICAgICAgICAgc2VsaW51eF9jbGFzcywgc3RyX3Blcm0sIE5VTEwpID09IDApOwogICAgIGZyZWVjb24oc2N0eCk7CiAKICAgICByZXR1cm4gYWxsb3dlZDsKQEAgLTg2LDEwICs5MCwxMSBAQAogICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CiAgICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKICAgICBwaWRfdCBzcGlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBjaGFyKiBzc2lkID0gaXBjU3RhdGUtPmdldENhbGxpbmdTaWQoKTsKIAogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHJ1c3RlZFVpZHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHRydXN0ZWRVaWRzW2ldID09IHVpZCkgewotICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHBlcm0pOworICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHNzaWQsIHBlcm0pOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTk3LDcgKzEwMiw5IEBACiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewogICAgIEFMT0dWKCJpbnN0YW50aWF0ZSIpOwotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKSk7CisgICAgc3A8RHJtTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPSBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKTsKKyAgICBzZXJ2aWNlLT5zZXRSZXF1ZXN0aW5nU2lkKHRydWUpOworICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBzZXJ2aWNlKTsKIAogICAgIGlmICgwID49IHRydXN0ZWRVaWRzLnNpemUoKSkgewogICAgICAgICAvLyBUT0RPCkBAIC0yMDYsNyArMjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNvbnN1bWVSaWdodHMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoQ09OU1VNRV9SSUdIVFMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTIxNSw3ICsyMjIsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFNFVF9QTEFZQkFDS19TVEFUVVMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTI2Miw3ICsyNjksNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yNzIsNyArMjc5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIHdpdGggdXJpIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yODIsNyArMjg5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIGZvciBzdHJlYW1pbmciKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI5Miw3ICsyOTksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDTE9TRV9ERUNSWVBUX1NFU1NJT04pKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMwMCw3ICszMDcsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIEFMT0dWKCJFbnRlcmluZyBpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoSU5JVElBTElaRV9ERUNSWVBUX1VOSVQpKSB7CkBAIC0zMTAsNyArMzE3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGRlY3J5cHQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoREVDUllQVCkpIHsKQEAgLTMyMCw3ICszMjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoRklOQUxJWkVfREVDUllQVF9VTklUKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0zMjgsNyArMzM1LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCi1zc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBwcmVhZCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChQUkVBRCkpIHsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCA0NWNlZTJlLi4yZTI3YTNjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC02MCw3ICs2MCw3IEBACiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Blcm1fbGFiZWwoZHJtX3Blcm1fdCBwZXJtKTsKIAotICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSk7CisgICAgc3RhdGljIGJvb2wgc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKTsKIAogICAgIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoZHJtX3Blcm1fdCBwZXJtKTsKIApAQCAtOTUsMTAgKzk1LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTExNSwyNiArMTE2LDI3IEBACiAKICAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAppbmRleCA0M2JhNzJiLi45NDBjMTdkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCkBAIC0zOSw0ICszOSwzIEBACiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIH0KIAotc3ViZGlycyA9IFsicGx1Z2lucy8qIl0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKaW5kZXggYzA0N2ViMS4uYjBhNDQxYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNjcsNyArMjY3LDcgQEAKIHNwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoTlVMTCAhPSB1cmkpIHsKICAgICAgICAgaGFuZGxlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmksIG1pbWUpOwogICAgIH0KQEAgLTI4NCw3ICsyODQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGhlYWRlckluZm8pKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKICAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgc3NpemVfdCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gYnVmZmVyKSAmJiAoMCA8IG51bUJ5dGVzKSkgewogICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJlYWQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgfQogICAgIHJldHVybiByZXRDb2RlOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNlNTdmLi4wMDAwMDAwCi0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbInV0aWwiXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg0YzE0Li4wMDAwMDAwCi0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAiRndkTG9ja0VuZ2luZSIsCi0gICAgImludGVybmFsLWZvcm1hdCIsCi1dCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCmluZGV4IDI4YTc4YWEuLmJiOWQ3ZWMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCkBAIC0yOSw4ICsyOSw3IEBACiAgICAgc3JjczogWyJzcmMvRndkTG9ja0VuZ2luZS5jcHAiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJpY3VpMThuIiwKLSAgICAgICAgImxpYmljdXVjIiwKKyAgICAgICAgImxpYmFuZHJvaWRpY3UiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmRsIiwKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBhNTcxYjNhLi5iNjJkZGI5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbik7CiAjZWxzZQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CiAjZW5kaWYKQEAgLTMzMCwxMSArMzMwLDExIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogI2Vsc2UKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAjZW5kaWYKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpOwogCiAvKioKQEAgLTM2MCw3ICszNjAsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KQEAgLTM3Myw3ICszNzMsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwogc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CkBAIC00MTYsNyArNDE2LDcgQEAKICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwotc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCkBAIC00MzAsNyArNDMwLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKIC8qKgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCiAgKi8KIHNzaXplX3Qgb25SZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOwogCkBAIC00NjMsMTIgKzQ2MywxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIG9mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbHNlCiBvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZW5kaWYKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKICNlbHNlCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDczZWVhODkuLjc2OWRlMGMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ29uc3VtZVJpZ2h0cyhpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYWN0aW9uICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogcmVzZXJ2ZSAqLykgewogICAgIC8vIE5vIHJpZ2h0cyBjb25zdW1wdGlvbgpAQCAtMzcyLDExICszNzIsMTMgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywKKyAgICAgICAgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgewogI2Vsc2UKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwpAQCAtNDcwLDEzICs0NzIsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgLyogbGVuZ3RoICovKSB7CiAjZWxzZQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsZW5ndGggKi8pIHsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgotICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoIWRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSB7CiAgICAgICAgIGZpbGVEZXNjID0gZHVwKGZkKTsKICAgICB9IGVsc2UgewpAQCAtNTMzLDEyICs1MzUsMTIgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKICAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CiAgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CiAKQEAgLTU2MiwxMSArNTY0LDExIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKHNlc3Npb24tPmZpbGVEZXNjKTsKQEAgLTU3Niw3ICs1NzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKQEAgLTU4NCw5ICs1ODYsNyBAQAogCiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmV4dGVuZGVkRGF0YS5jbGVhcigpOwotCi0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOwotICAgICAgICBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBoZWFkZXJJbmZvICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCgKICAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8sCkBAIC02MTMsNyArNjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLykgewpAQCAtNjIyLDE5ICs2MjIsMTkgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25SZWFkKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgewogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYKICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CkBAIC02NTQsMTUgKzY1NCwxNSBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLW9mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2Vsc2UKLW9mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbmRpZgogICAgIG9mZl90IG9mZnZhbCA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKQEAgLTY3NSwxMyArNjc1LDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CiAjZWxzZQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgewpAQCAtNjkwLDcgKzY5MCw3IEBACiAKICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVyU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKE5VTEwgIT0gKGRlY29kZXJTZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgJiYKICAgICAgICAgKE5VTEwgIT0gYnVmZmVyKSAmJgogICAgICAgICAobnVtQnl0ZXMgPiAtMSkgJiYKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU4ZTI2Li4wMDAwMDAwCi0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgImNvbW1vbiIsCi0gICAgImNvbnZlcnRlciIsCi0gICAgImRlY29kZXIiLAotXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKaW5kZXggN2I2NmRjNy4uNGFiNTI3MiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCkBAIC01MywxMCArNTMsMTEgQEAKIAogICAgIGludCBvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCBvblZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtNzQsMjYgKzc1LDI1IEBACiAgICAgRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOwogCi0gICAgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwotCi1wcml2YXRlOgotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbkltcGwoKTsKIH07CiAKIH07CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCmluZGV4IGQ3ZjJkMjguLjBmYTM0NzggMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwCkBAIC0xODMsMTMgKzE4MywxMyBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLyphY3Rpb24qLywgYm9vbCAvKnJlc2VydmUqLykgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLyphY3Rpb24qLywgYm9vbCAvKnJlc2VydmUqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qcGxheWJhY2tTdGF0dXMqLywgaW50NjRfdCAvKnBvc2l0aW9uKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qcGxheWJhY2tTdGF0dXMqLywgaW50NjRfdCAvKnBvc2l0aW9uKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CkBAIC0yMzYsNyArMjM2LDggQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgLypmZCovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sIG9mZjY0X3QgLypsZW5ndGgqLykgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLAorICAgICAgICAgICAgb2ZmNjRfdCAvKmxlbmd0aCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAKICNpZmRlZiBFTkFCTEVfUEFTU1RIUlVfREVDUllQVElPTgpAQCAtMjQ2LDM2ICsyNDcsMzggQEAKICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICNlbHNlCi0gICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUpOyAvLyB1bnVzZWQKKyAgICAodm9pZCkoZGVjcnlwdEhhbmRsZS5nZXQoKSk7IC8vIHVudXNlZAogI2VuZGlmCiAKICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKnVuaXF1ZUlkKi8sIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CisgICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGNvbnN0IGNoYXIqIC8qdXJpKi8pIHsKICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7Ci0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOyBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKLSAgICAgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiAvKmhlYWRlckluZm8qLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAorICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogLypJViovKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAorICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsCisgICAgICAgIERybUJ1ZmZlciogLypJViovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIC8qKgogICAgICAqIEFzIGEgd29ya2Fyb3VuZCBpbXBsZW1lbnRhdGlvbiBwYXNzdGhydSB3b3VsZCBjb3B5IHRoZSBnaXZlbgpAQCAtMjk2LDEyICsyOTksMTIgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmRlY3J5cHRVbml0SWQqLykgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmRlY3J5cHRVbml0SWQqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1zc2l6ZV90IERybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCitzc2l6ZV90IERybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLAogICAgICAgICAgICAgdm9pZCogLypidWZmZXIqLywgc3NpemVfdCAvKm51bUJ5dGVzKi8sIG9mZjY0X3QgLypvZmZzZXQqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCmluZGV4IDQ5OTFlNTAuLmQ2ZGIxZDQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCkBAIC0yNywxMSArMjcsMTEgQEAKICAgICAgICAgImxpYm1lZGlhZHJtbWV0cmljc19saXRlIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLApAQCAtNTksMjAgKzU5LDE4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAotICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKICAgICAgICAgLy8gd2l0aCB0aGUgd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICAgICAgIi1Xbm8tZXJyb3IiLAogICAgIF0sCiB9CiAKQEAgLTkyLDYgKzkwLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLApAQCAtMTA1LDcgKzEwNCw2IEBACiAgICAgICAgIC8vIFN1cHByZXNzIHVudXNlZCBwYXJhbWV0ZXIgYW5kIG5vIGVycm9yIG9wdGlvbnMuIFRoZXNlIGNhdXNlIHByb2JsZW1zCiAgICAgICAgIC8vIHdoZW4gdXNpbmcgdGhlIG1hcCB0eXBlIGluIGEgcHJvdG8gZGVmaW5pdGlvbi4KICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV25vLWVycm9yIiwKICAgICBdLAogfQogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCmluZGV4IDMwMzVjNWEuLmQ2MmNjZDYgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCkBAIC0zMCwxNiArMzAsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbC5oPgogCit1c2luZyBkcm06OlYxXzA6OkJ1ZmZlclR5cGU7Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6TW9kZTsKK3VzaW5nIGRybTo6VjFfMDo6UGF0dGVybjsKK3VzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6Ok1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlBhdHRlcm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKQEAgLTUwLDYgKzUwLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03Niw2ICs3NywxOCBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURTs7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cykpOworICAgIH0KK30KIAogc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgewogICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKQEAgLTE5Niw2ICsyMDksOSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKICAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlQ3J5cHRvUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjE2LDYgKzIzMiw3IEBACiAgICAgfQogCiAgICAgbVBsdWdpbi5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yODQsNyArMzAxLDcgQEAKICAgICBzc2l6ZV90IG9mZnNldDsKICAgICBzaXplX3Qgc2l6ZTsKIAotICAgIGlmIChtZW1vcnkgPT0gTlVMTCAmJiBidWZmZXIgPT0gTlVMTCkgeworICAgIGlmIChtZW1vcnkgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOwogICAgIH0KIApAQCAtMzg5LDIxICs0MDYsMzMgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CiAKLSAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmRlY3J5cHQoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksIGhNb2RlLAotICAgICAgICAgICAgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgZXJyID0gREVBRF9PQkpFQ1Q7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5kZWNyeXB0XzFfMihzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKKyAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmRlY3J5cHQoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksCisgICAgICAgICAgICAgICAgaE1vZGUsIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKICAgICB9CiAKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IGNmMDg2MTAuLjkxOWY0ZWUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9FdmVudE1ldHJpYy5oPgpAQCAtNDAsMTUgKzQwLDE3IEBACiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KIAogdXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKLXVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7CiB1c2luZyBkcm06OlYxXzA6OktleVR5cGU7CiB1c2luZyBkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7OwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwogdXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTU5LDYgKzYxLDEwIEBACiB1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgSGRjcExldmVsX1YxXzI7CisKIG5hbWVzcGFjZSB7CiAKIC8vIFRoaXMgY29uc3RhbnQgY29ycmVzcG9uZHMgdG8gdGhlIFBST1BFUlRZX0RFVklDRV9VTklRVUVfSUQgY29uc3RhbnQKQEAgLTEzOSwyNiArMTQ1LDU1IEBACiAgICAgfQogfQogCi1zdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CitzdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0hpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgewogICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PTkU6CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlRGVjb2RlOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE87CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQWxsOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgdG9PZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaChsaWNlbnNlU3RhdGUpIHsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpJTkFDVElWRToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVSZWxlYXNlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsX1YxXzIgbGV2ZWwpIHsKKyAgICBzd2l0Y2gobGV2ZWwpIHsKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTm9uZTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMToKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YxOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjI6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjI7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMToKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzE6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8yOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMjoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8yOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PX09VVFBVVDoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzM6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PX09VVFBVVDoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb091dHB1dDsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKICAgICB9CiB9Ci0KLQogc3RhdGljIDo6S2V5ZWRWZWN0b3IgdG9IaWRsS2V5ZWRWZWN0b3IoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mCiAgICAgICAgIGtleWVkVmVjdG9yKSB7CiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IHN0ZEtleWVkVmVjdG9yOwpAQCAtMTk5LDYgKzIzNCwxNSBAQAogICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOwogfQogCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvS2V5U2V0SWRzKGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiYKKyAgICAgICAgaEtleVNldElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBrZXlTZXRJZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoS2V5U2V0SWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaEtleVNldElkc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4ga2V5U2V0SWRzOworfQorCiBzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUKFN0YXR1cyBzdGF0dXMpIHsKICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgIGNhc2UgU3RhdHVzOjpPSzoKQEAgLTIxNyw3ICsyNjEsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIzOCw2ICsyODIsMTkgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1RfMV8yKFN0YXR1c19WMV8yIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQorCiAKIE11dGV4IERybUhhbDo6bUxvY2s7CiAKQEAgLTI5NywzOSArMzU0LDUxIEBACiAKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLQotICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVBsdWdpbi5jbGVhcigpOwogICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKIH0KIAogVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gRHJtSGFsOjptYWtlRHJtRmFjdG9yaWVzKCkgewogICAgIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IGZhY3RvcmllczsKIAotICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CiAKICAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICk7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQ0OCw2ICs1MTcsMTcgQEAKIH0KIAogUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzA+JiBrZXlTdGF0dXNMaXN0X1YxXzAsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7CisgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlTdGF0dXNWZWM7CisgICAgZm9yIChjb25zdCBhdXRvICZrZXlTdGF0dXNfVjFfMCA6IGtleVN0YXR1c0xpc3RfVjFfMCkgeworICAgICAgICBrZXlTdGF0dXNWZWMucHVzaF9iYWNrKHtrZXlTdGF0dXNfVjFfMC5rZXlJZCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxLZXlTdGF0dXNUeXBlPihrZXlTdGF0dXNfVjFfMC50eXBlKX0pOworICAgIH0KKyAgICBoaWRsX3ZlYzxLZXlTdGF0dXM+IGtleVN0YXR1c0xpc3RfVjFfMihrZXlTdGF0dXNWZWMpOworICAgIHJldHVybiBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0X1YxXzIsIGhhc05ld1VzYWJsZUtleSk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgewogCiAgICAgbUV2ZW50TG9jay5sb2NrKCk7CkBAIC00NzcsNiArNTU3LDkgQEAKICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORzoKICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9TdGF0dXNQZW5kaW5nOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRToKKyAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGVJbkZ1dHVyZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUjoKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfSW50ZXJuYWxFcnJvcjsKQEAgLTUwMSwzMiArNTg0LDgwIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAotYm9vbCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK1JldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgUGFyY2VsIG9iajsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkob2JqLCBzZXNzaW9uSWQpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uTG9zdFN0YXRlLCAwLCAmb2JqKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworc3RhdHVzX3QgRHJtSGFsOjptYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBjYXNlcworICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bikgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPGRybTo6VjFfMjo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8yID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnlWMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnlWMV8yLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwKKyAgICAgICAgICAgICAgICBtaW1lVHlwZS5zdHJpbmcoKSwgdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBpZiAobWltZVR5cGUgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZS5zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLAorICAgICAgICAgICAgICAgICAgICB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTM0LDEzICs2NjUsMjIgQEAKICAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgewogICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICB9CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKQEAgLTU1NCwzMCArNjk0LDE1IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsOworICAgIFNlY3VyaXR5TGV2ZWwgaFNlY3VyaXR5TGV2ZWwgPSB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKICAgICBib29sIHNldFNlY3VyaXR5TGV2ZWwgPSB0cnVlOwogCi0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4OgorICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4KSB7CiAgICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChoU2VjdXJpdHlMZXZlbCA9PSBTZWN1cml0eUxldmVsOjpVTktOT1dOKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0dXNfdCAgZXJyID0gVU5LTk9XTl9FUlJPUjsKQEAgLTY1Nyw2ICs3ODIsMzkgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCisgICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB0b0tleVJlcXVlc3RUeXBlKHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiBzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAogICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKQEAgLTY4Myw3MyArODQxLDUxIEBACiAgICAgOjpLZXllZFZlY3RvciBoT3B0aW9uYWxQYXJhbWV0ZXJzID0gdG9IaWRsS2V5ZWRWZWN0b3Iob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCiAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCiAgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpOT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlVQREFURToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGUoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIGtleVJlcXVlc3RUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKQEAgLTgzMSwxOCArOTY3LDMzIEBACiAgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKKyAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgfQogCiAgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CkBAIC05ODgsMjIgKzExMzksMzEgQEAKICAgICB9CiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIAotICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KICAgICAqY29ubmVjdGVkID0gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKICAgICAqbWF4ID0gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgSGRjcExldmVsJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWwmIGhNYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoaE1heCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRIZGNwTGV2ZWxzXzFfMigKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsX1YxXzImIGhNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgSGRjcExldmVsJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWwmIGhNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhDb25uZWN0ZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaE1heCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CiAKICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKIH0KQEAgLTEwNjUsNiArMTIyNSw3MyBAQAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQogCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGtleVNldElkcyA9IHRvS2V5U2V0SWRzKGhLZXlTZXRJZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlU3RhdGUodG9IaWRsVmVjKGtleVNldElkKSwKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShoTGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwobmFtZSwgdmFsdWUpOwpAQCAtMTM0MywyMiArMTU3MCwyMiBAQAogCiB2b2lkIERybUhhbDo6cmVwb3J0RnJhbWV3b3JrTWV0cmljcygpIGNvbnN0CiB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGl0ZW0oIm1lZGlhZHJtIik7Ci0gICAgaXRlbS5nZW5lcmF0ZVNlc3Npb25JRCgpOwotICAgIGl0ZW0uc2V0UGtnTmFtZShtTWV0cmljcy5HZXRBcHBQYWNrYWdlTmFtZSgpLmNfc3RyKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoIm1lZGlhZHJtIikpOworICAgIGl0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgaXRlbS0+c2V0UGtnTmFtZShtTWV0cmljcy5HZXRBcHBQYWNrYWdlTmFtZSgpLmNfc3RyKCkpOwogICAgIFN0cmluZzggdmVuZG9yOwogICAgIFN0cmluZzggZGVzY3JpcHRpb247CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHZlbmRvciBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKICAgICB9IGVsc2UgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOwogICAgIH0KICAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKQEAgLTEzNjksOSArMTU5Niw5IEBACiAgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKHNlcmlhbGl6ZWRNZXRyaWNzLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1ldHJpY3Muc2l6ZSgpKTsKICAgICBpZiAoIWI2NEVuY29kZWRNZXRyaWNzLmVtcHR5KCkpIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7CiAgICAgfQotICAgIGlmICghaXRlbS5zZWxmcmVjb3JkKCkpIHsKKyAgICBpZiAoIWl0ZW0tPnNlbGZyZWNvcmQoKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCmluZGV4IDRmZWQ3MDcuLjMwODA4MDIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCmluZGV4IDUwOTk2MWYuLjUxMjc0ZDEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKQEAgLTYxLDcgKzYxLDEwIEBACiAgICAgR0VUX05VTUJFUl9PRl9TRVNTSU9OUywKICAgICBHRVRfU0VDVVJJVFlfTEVWRUwsCiAgICAgUkVNT1ZFX1NFQ1VSRV9TVE9QLAotICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMKKyAgICBHRVRfU0VDVVJFX1NUT1BfSURTLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywKKyAgICBSRU1PVkVfT0ZGTElORV9MSUNFTlNFLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUKIH07CiAKIHN0cnVjdCBCcERybSA6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtPiB7CkBAIC04MCwxOCArODMsMjIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wgKmlzU3VwcG9ydGVkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUodXVpZCwgMTYpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsZXZlbCk7CisKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0NSWVBUT19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZDogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CisgICAgICAgICppc1N1cHBvcnRlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKIAotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCkBAIC0xMjAsMTEgKzEyNywxMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZWN1cml0eUxldmVsKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKIAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0zNzYsNiArMzgzLDUyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJmtleVNldElkcykgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBrZXlTZXRJZHMuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBrZXlTZXRJZCk7CisgICAgICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX09GRkxJTkVfTElDRU5TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU6OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZT4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNzE5LDcgKzc3MiwxMiBAQAogICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKICAgICAgICAgICAgIGRhdGEucmVhZCh1dWlkLCBzaXplb2YodXVpZCkpOwogICAgICAgICAgICAgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKSk7CisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUsIGxldmVsLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCkBAIC05ODAsNiArMTAzOCw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IGtleVNldElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBrZXlTZXRJZHMuc2l6ZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY291bnQpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IGtleVNldElkcy5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUoaXRlciAhPSBrZXlTZXRJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfT0ZGTElORV9MSUNFTlNFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCAmc3RhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihzdGF0ZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1BST1BFUlRZX1NUUklORzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAppbmRleCA1Y2I0OGJmLi44Y2Q2Zjk2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCkBAIC0zNCwxNyArMzQsMTcgQEAKIHN0YXR1c190IHJlcG9ydFZlbmRvck1ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0obmFtZS5jX3N0cigpKTsKLSAgICBhbmFseXRpY3NJdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gYW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShuYW1lLmNfc3RyKCkpKTsKKyAgICBhbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOwogCiAgICAgc3RkOjpzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShhcHBQYWNrYWdlTmFtZS5jX3N0cigpLCBhcHBQYWNrYWdlTmFtZS5zaXplKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICBhbmFseXRpY3NJdGVtLT5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOwogICAgIGlmIChtZXRyaWNzLnNpemUoKSA+IDApIHsKLSAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBhbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOwogICAgIH0KIAotICAgIGlmICghYW5hbHl0aWNzSXRlbS5zZWxmcmVjb3JkKCkpIHsKLSAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS5nZXRTZXNzaW9uSUQoKSk7CisgICAgaWYgKCFhbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCkpIHsKKyAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS0+Z2V0U2Vzc2lvbklEKCkpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjZjOTA2Zi4uOWUwMTE1ZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgImxpYmJpbmRlciIsCiAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgImxpYmxvZyIsCkBAIC0zMyw3ICszNCw2IEBACiAgICAgICAgIC8vIFN1cHByZXNzIHVudXNlZCBwYXJhbWV0ZXIgYW5kIG5vIGVycm9yIG9wdGlvbnMuIFRoZXNlIGNhdXNlIHByb2JsZW1zCiAgICAgICAgIC8vIHdoZW4gdXNpbmcgdGhlIG1hcCB0eXBlIGluIGEgcHJvdG8gZGVmaW5pdGlvbi4KICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV25vLWVycm9yIiwKICAgICBdCiB9CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKaW5kZXggNjRhYTlkMC4uNWM4YTFiMCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6ZHJtX21ldHJpY3M6OkRybUZyYW1ld29ya01ldHJpY3M7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwogdXNpbmcgOjphbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGU7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggMTU1OGU4Yi4uYmYzNTIyNCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtNjUsNyArNjUsMjAgQEAKICAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKICAgICByZXR1cm4gT0s7CiB9Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXR1c190IENsZWFyS2V5Q2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgeworICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnBsdWdpbiA9IG5ldyBDbGVhcktleUNhc1BsdWdpbihhcHBEYXRhLCBjYWxsYmFjayk7CisgICAgcmV0dXJuIE9LOworfQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIGJvb2wgQ2xlYXJLZXlEZXNjcmFtYmxlckZhY3Rvcnk6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoCiAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkKSBjb25zdCB7CiAgICAgcmV0dXJuIENBX3N5c3RlbV9pZCA9PSBzQ2xlYXJLZXlTeXN0ZW1JZDsKQEAgLTg0LDcgKzk3LDEzIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBDbGVhcktleUNhc1BsdWdpbjo6Q2xlYXJLZXlDYXNQbHVnaW4oCiAgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgeworICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUNhbGxiYWNrRXh0KE5VTEwpLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgQUxPR1YoIkNUT1IiKTsKK30KKworQ2xlYXJLZXlDYXNQbHVnaW46OkNsZWFyS2V5Q2FzUGx1Z2luKAorICAgICAgICB2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaykKKyAgICA6IG1DYWxsYmFjayhOVUxMKSwgbUNhbGxiYWNrRXh0KGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgewogICAgIEFMT0dWKCJDVE9SIik7CiB9CiAKQEAgLTE2NywxMSArMTg2LDMwIEBACiAgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgogICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgogICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtQ2FsbGJhY2soKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwgZXZlbnREYXRhLnNpemUoKSk7CisgICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0V4dCAhPSBOVUxMKSB7CisgICAgICAgIG1DYWxsYmFja0V4dCgodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2l6ZSgpLCBOVUxMKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6c2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGludDMyX3QgZXZlbnQsCisgICAgICAgIGludCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgeworICAgIEFMT0dWKCJzZW5kU2Vzc2lvbkV2ZW50OiBzZXNzaW9uSWQ9JXMsIGV2ZW50PSVkLCBhcmc9JWQiLAorICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGV2ZW50LCBhcmcpOworICAgIC8vIEVjaG8gdGhlIHJlY2VpdmVkIGV2ZW50IHRvIHRoZSBjYWxsYmFjay4KKyAgICAvLyBDbGVhciBrZXkgcGx1Z2luIGRvZXNuJ3QgdXNlIGFueSBldmVudCwgZWNobydpbmcgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksICZzZXNzaW9uSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2xlYXJLZXlDYXNQbHVnaW46OnByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIHsKICAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBzdHIuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1LZXlGZXRjaGVyTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaAppbmRleCAzODllMTcyLi5mNDhkNWIxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAgICAgICAgICAgICB2b2lkICphcHBEYXRhLAogICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgQ2xlYXJLZXlEZXNjcmFtYmxlckZhY3RvcnkgOiBwdWJsaWMgRGVzY3JhbWJsZXJGYWN0b3J5IHsKQEAgLTYzLDYgKzY4LDcgQEAKIGNsYXNzIENsZWFyS2V5Q2FzUGx1Z2luIDogcHVibGljIENhc1BsdWdpbiB7CiBwdWJsaWM6CiAgICAgQ2xlYXJLZXlDYXNQbHVnaW4odm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIENsZWFyS2V5Q2FzUGx1Z2luKHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIH5DbGVhcktleUNhc1BsdWdpbigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcml2YXRlRGF0YSgKQEAgLTg1LDYgKzkxLDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kRXZlbnQoCiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWZyZXNoRW50aXRsZW1lbnRzKApAQCAtOTQsNiArMTA0LDcgQEAKICAgICBNdXRleCBtS2V5RmV0Y2hlckxvY2s7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEtleUZldGNoZXI+IG1LZXlGZXRjaGVyOwogICAgIENhc1BsdWdpbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBtQ2FsbGJhY2tFeHQ7CiAgICAgdm9pZCogbUFwcERhdGE7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCA4NDA0YTgzLi4yOTY0NzkxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTYwLDYgKzYwLDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgdm9pZCogLyphcHBEYXRhKi8sCisgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IC8qY2FsbGJhY2sqLywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IE1vY2tDYXNQbHVnaW4oKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBNb2NrRGVzY3JhbWJsZXJGYWN0b3J5Ojppc1N5c3RlbUlkU3VwcG9ydGVkKGludDMyX3QgQ0Ffc3lzdGVtX2lkKSBjb25zdCB7CkBAIC0xNzAsNiArMTgzLDE2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKKyAgICBBTE9HVigic2VuZFNlc3Npb25FdmVudDogc2Vzc2lvbklkPSVzLCBldmVudD0lZCIsCisgICAgICAgICAgYXJyYXlUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBldmVudCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSB7CiAgICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgc3RyLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCmluZGV4IDgxMDY5OTAuLjc0YjU0MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCkBAIC00Miw2ICs0MiwxMSBAQAogICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrLAorICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIE1vY2tEZXNjcmFtYmxlckZhY3RvcnkgOiBwdWJsaWMgRGVzY3JhbWJsZXJGYWN0b3J5IHsKQEAgLTgwLDcgKzg1LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kRXZlbnQoCiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKKworICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWZyZXNoRW50aXRsZW1lbnRzKAogICAgICAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmMDdmMS4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbInBsdWdpbnMvKiJdCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAppbmRleCA5M2M2NDNiLi5kNDhiMGE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKQEAgLTI3LDQgKzI3LDE4IEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhDaGFyc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgLy8gRWFjaCBpbnB1dCBieXRlIGNyZWF0ZXMgdHdvIG91dHB1dCBoZXggY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXRfYnVmZmVyKGxlbmd0aCAqIDIsICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBjaGFyIGJ5dGUgPSBpbl9idWZmZXJbaV07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKV0gPSBrSGV4Q2hhcnNbKGJ5dGUgPj4gNCkgJiAweGZdOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMikgKyAxXSA9IGtIZXhDaGFyc1tieXRlICYgMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9idWZmZXI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCmluZGV4IDI1NDMxMjQuLmFhNTcxYzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApAQCAtMTcsMTQgKzE3LDE2IEBACiAjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCiAjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCiAvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwCmluZGV4IDdiYTU3MDguLjk4MDNkMzIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTYxLDcgKzYxLDMgQEAKICAgICB9LAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8gQnVpbGQgdW5pdCB0ZXN0cwotCi1zdWJkaXJzID0gWyJ0ZXN0cyJdCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKaW5kZXggMmZjZTA3OTAuLjBhYzg3OWMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOwpAQCAtNzksNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCmluZGV4IDhmZmIwNWMuLmZkYjE4ZDAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKQEAgLTE0LDggKzE0LDggQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKICAgICB2ZW5kb3I6IHRydWUsCiAKICAgICBzcmNzOiBbCkBAIC0yNSwyNCArMjUsMjQgQEAKICAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAogICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAogICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEZXZpY2VGaWxlcy5jcHAiLAogICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAogICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCiAgICAgICAgICJJbml0RGF0YVBhcnNlci5jcHAiLAogICAgICAgICAiSnNvbldlYktleS5jcHAiLAorICAgICAgICAiTWVtb3J5RmlsZVN5c3RlbS5jcHAiLAogICAgICAgICAiU2Vzc2lvbi5jcHAiLAogICAgICAgICAiU2Vzc2lvbkxpYnJhcnkuY3BwIiwKLSAgICAgICAgInNlcnZpY2UuY3BwIiwKICAgICBdLAogCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAogCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiLCAiLVd0aHJlYWQtc2FmZXR5Il0sCiAKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKQEAgLTUwLDExICs1MCwxMyBAQAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjbGVhcmtleWNvbW1vbiIsCisgICAgICAgICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCiAgICAgICAgICJsaWJqc21uIiwKICAgICBdLAogCkBAIC02Niw0ICs2OCwyNiBAQAogICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAogICAgIH0sCiB9CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKKyAgICB2ZW5kb3I6IHRydWUsCiAKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc3JjczogWyJwcm90b3MvRGV2aWNlRmlsZXMucHJvdG8iXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJzZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSJdLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNlcnZpY2VMYXp5LmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCmluZGV4IGMyZWQ3NTEuLjY1N2E0MmYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAppbmRleCBlNThmNThhLi43NWY4Mzk1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMWJhNWM2YS4uMTQxMGQ3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogZXh0ZXJuICJDIiB7CkBAIC0zOCw3ICszOCw3IEBACiB9IC8vIGV4dGVybiAiQyIKIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IDA4NDhjZWYuLjJhNDhkYjYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKApAQCAtNjAsNyArNjAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGNhNTRhZTguLjMwMmRkMzkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKQEAgLTQ0LDEwICs0NCw0MCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCisgICAgYm9vbCBzZWN1cmUsCisgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIGtleUlkLAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiBpdiwKKyAgICBNb2RlIG1vZGUsCisgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgc291cmNlLAorICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgZGVjcnlwdF9jYiBfaGlkbF9jYikgeworCisgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gZGVjcnlwdF8xXzIoCisgICAgICBzZWN1cmUsIGtleUlkLCBpdiwgbW9kZSwgcGF0dGVybiwgc3ViU2FtcGxlcywgc291cmNlLCBvZmZzZXQsIGRlc3RpbmF0aW9uLAorICAgICAgWyZdKFN0YXR1c19WMV8yIGhTdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgIHN0YXR1cyA9IHRvU3RhdHVzXzFfMChoU3RhdHVzKTsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9IGhEZXRhaWxlZEVycm9yOworICAgICAgfQorICAgICk7CisKKyAgc3RhdHVzID0gaFJlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICBfaGlkbF9jYihzdGF0dXMsIGJ5dGVzV3JpdHRlbiwgZGV0YWlsZWRFcnJvcik7CisgIHJldHVybiBWb2lkKCk7Cit9CisKIC8vIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvciBjb2RlIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHRoZSBzaXplIG9mCiAvLyBkZWNyeXB0ZWQgZGF0YS4gIEluIHRoZW9yeSwgdGhlIG91dHB1dCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgaW5wdXQKIC8vIHNpemUsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciBBRVMtQ1RSLgotUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHRfMV8yKAogICAgICAgICBib29sIHNlY3VyZSwKICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JVl9TSVpFPiYgaXYsCkBAIC01NywxOCArODcsMTggQEAKICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCiAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAotICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKHBhdHRlcm4pOwogCiAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gc2hhcmVkX2J1ZmZlcl9sb2NrKG1TaGFyZWRCdWZmZXJMb2NrKTsKICAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKHNvdXJjZS5idWZmZXJJZCkgPT0gbVNoYXJlZEJ1ZmZlck1hcC5lbmQoKSkgewotICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKICAgICAgICAgICAgICAgICJzb3VyY2UgZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0Iik7CiAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTc2LDE5ICsxMDYsMTkgQEAKICAgICBpZiAoZGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CiAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3QgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CiAgICAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3QuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0Iik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgc3A8SU1lbW9yeT4gc291cmNlQmFzZSA9IG1TaGFyZWRCdWZmZXJNYXBbc291cmNlLmJ1ZmZlcklkXTsKICAgICBpZiAoc291cmNlQmFzZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJzb3VyY2UgaXMgYSBudWxscHRyIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKQEAgLTk3LDcgKzEyNyw3IEBACiAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3codG90YWxTaXplLCBzb3VyY2Uuc2l6ZSwgJnRvdGFsU2l6ZSkgfHwKICAgICAgICAgdG90YWxTaXplID4gc291cmNlQmFzZS0+Z2V0U2l6ZSgpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc2NDk2MTYwIik7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKQEAgLTEwOSwxNiArMTM5LDE3IEBACiAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OwogICAgIHNwPElNZW1vcnk+IGRlc3RCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtkZXN0QnVmZmVyLmJ1ZmZlcklkXTsKICAgICBpZiAoZGVzdEJhc2UgPT0gbnVsbHB0cikgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGJhc2UgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KHN0YXRpY19jYXN0PHZvaWQgKj4oZGVzdEJhc2UtPmdldFBvaW50ZXIoKSkpOworCiAgICAgdG90YWxTaXplID0gMDsKICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZXN0QnVmZmVyLm9mZnNldCwgZGVzdEJ1ZmZlci5zaXplLCAmdG90YWxTaXplKSB8fAogICAgICAgICB0b3RhbFNpemUgPiBkZXN0QmFzZS0+Z2V0U2l6ZSgpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTc2NDQ0NjIyIik7Ci0gICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KICAgICBkZXN0UHRyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2UgKyBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkub2Zmc2V0KTsKQEAgLTEzNSwxMiArMTY2LDEyIEBACiAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSAmc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdFNpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhLCAmZGVzdFNpemUpIHx8CiAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNyY1NpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhLCAmc3JjU2l6ZSkpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCAwLCAic3Vic2FtcGxlIGNsZWFyIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCAwLCAic3Vic2FtcGxlIGNsZWFyIHNpemUgb3ZlcmZsb3ciKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdFNpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJmRlc3RTaXplKSB8fAogICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhzcmNTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEsICZzcmNTaXplKSkgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIDAsICJzdWJzYW1wbGUgZW5jcnlwdGVkIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCAwLCAic3Vic2FtcGxlIGVuY3J5cHRlZCBzaXplIG92ZXJmbG93Iik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CkBAIC0xNDksMTMgKzE4MCwxMyBAQAogICAgIH0KIAogICAgIGlmIChkZXN0U2l6ZSA+IGRlc3RCdWZmZXIuc2l6ZSB8fCBzcmNTaXplID4gc291cmNlLnNpemUpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIDAsICJzdWJzYW1wbGUgc3VtIHRvbyBsYXJnZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgMCwgInN1YnNhbXBsZSBzdW0gdG9vIGxhcmdlIik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCiAgICAgaWYgKG1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKICAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkIGRhdGEuIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CkBAIC0xNzEsMjIgKzIwMiwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCksICIiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTW9kZTo6QUVTX0NUUikgewogICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7Ci0gICAgICAgIFN0YXR1cyByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAorICAgICAgICBTdGF0dXNfVjFfMiByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkZXN0UHRyKSwgdG9WZWN0b3Ioc3ViU2FtcGxlcyksICZieXRlc0RlY3J5cHRlZCk7Ci0gICAgICAgIGlmIChyZXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CisgICAgICAgIGlmIChyZXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKSwgIiIpOwogICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyksCi0gICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICBfaGlkbF9jYihyZXMsIDAsICJEZWNyeXB0aW9uIEVycm9yIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNIFBsdWdpbi4iKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CkBAIC0yMDYsNyArMjM2LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisvLyBQcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3Nlcy4KK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpPZmZsaW5lRmlsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpIYXNoZWRGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga0xpY2Vuc2VGaWxlTmFtZUV4dFtdID0gIi5saWMiOworCitib29sIEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHN0ZDo6c3RyaW5nKiBoYXNoKSB7CisgICAgaWYgKCFoYXNoKSByZXR1cm4gZmFsc2U7CisKKyAgICBoYXNoLT5yZXNpemUoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhLmRhdGEoKSk7CisgICAgdW5zaWduZWQgY2hhciogb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJigqaGFzaClbMF0pOworICAgIFNIQTI1NihpbnB1dCwgZGF0YS5zaXplKCksIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGljZW5zZVJlc3BvbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGZpbGUuc2V0X3R5cGUoT2ZmbGluZUZpbGU6OkxJQ0VOU0UpOworICAgIGZpbGUuc2V0X3ZlcnNpb24oT2ZmbGluZUZpbGU6OlZFUlNJT05fMSk7CisKKyAgICBMaWNlbnNlKiBsaWNlbnNlID0gZmlsZS5tdXRhYmxlX2xpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkUpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfc3RhdGUoTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9saWNlbnNlKGxpY2Vuc2VSZXNwb25zZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJTdG9yZUxpY2Vuc2U6IFVua25vd24gbGljZW5zZSBzdGF0ZTogJXUiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEZpbGU7CisgICAgZmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVdpdGhIYXNoKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgc2VyaWFsaXplZEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKHNlcmlhbGl6ZWRGaWxlLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVdpdGhIYXNoOiBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGhhc2hGaWxlLnNldF9maWxlKHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBoYXNoRmlsZS5zZXRfaGFzaChoYXNoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVSYXcoZmlsZU5hbWUsIHNlcmlhbGl6ZWRIYXNoRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkSGFzaEZpbGUpIHsKKyAgICBNZW1vcnlGaWxlU3lzdGVtOjpNZW1vcnlGaWxlIG1lbUZpbGU7CisgICAgbWVtRmlsZS5zZXRGaWxlTmFtZShmaWxlTmFtZSk7CisgICAgbWVtRmlsZS5zZXRDb250ZW50KHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgbWVtRmlsZS5zZXRGaWxlU2l6ZShzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKTsKKyAgICBzaXplX3QgbGVuID0gbUZpbGVIYW5kbGUuV3JpdGUoZmlsZU5hbWUsIG1lbUZpbGUpOworCisgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVSYXc6IEZhaWxlZCB0byB3cml0ZSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiBleHBlY3RlZD0lemQsIGFjdHVhbD0lenUiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBsZW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogd3JvdGUgJXp1IGJ5dGVzIHRvICVzIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlTGljZW5zZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSkgeworCisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBpZiAoIVJldHJpZXZlSGFzaGVkRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudHlwZSgpICE9IE9mZmxpbmVGaWxlOjpMSUNFTlNFKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB0eXBlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS52ZXJzaW9uKCkgIT0gT2ZmbGluZUZpbGU6OlZFUlNJT05fMSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmaWxlLmhhc19saWNlbnNlKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogTGljZW5zZSBub3QgcHJlc2VudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTGljZW5zZSBsaWNlbnNlID0gZmlsZS5saWNlbnNlKCk7CisgICAgc3dpdGNoIChsaWNlbnNlLnN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlQWN0aXZlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlJldHJpZXZlTGljZW5zZTogVW5yZWNvZ25pemVkIGxpY2Vuc2Ugc3RhdGU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24pOworICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKm9mZmxpbmVMaWNlbnNlID0gbGljZW5zZS5saWNlbnNlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlQWxsTGljZW5zZXMoKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUFsbEZpbGVzKCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkxpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERldmljZUZpbGVzOjpMaXN0TGljZW5zZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VzID0gbUZpbGVIYW5kbGUuTGlzdEZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaWNlbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyYgbGljZW5zZSA9IGxpY2Vuc2VzW2ldOworICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5zdWJzdHIoMCwgbGljZW5zZS5zaXplKCkgLSBzdHJsZW4oa0xpY2Vuc2VGaWxlTmFtZUV4dCkpOworICAgIH0KKyAgICByZXR1cm4gbGljZW5zZXM7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogJXMgZG9lcyBub3QgZXhpc3QiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXMgPSBHZXRGaWxlU2l6ZShmaWxlTmFtZSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHNpemU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgc2VyaWFsaXplZEhhc2hGaWxlLnJlc2l6ZShieXRlcyk7CisgICAgYnl0ZXMgPSBtRmlsZUhhbmRsZS5SZWFkKGZpbGVOYW1lLCAmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIGlmIChieXRlcyAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGV4cGVjdGVkOiAlemQsIGFjdHVhbDogJXpkIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgYnl0ZXMpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogcmVhZCAlemQgZnJvbSAlcyIsIGJ5dGVzLCBmaWxlTmFtZS5jX3N0cigpKTsKKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaWYgKCFoYXNoRmlsZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZEhhc2hGaWxlKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgaGFzaCBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goaGFzaEZpbGUuZmlsZSgpLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoYXNoICE9IGhhc2hGaWxlLmhhc2goKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIG1pc21hdGNoIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlLT5QYXJzZUZyb21TdHJpbmcoaGFzaEZpbGUuZmlsZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGZpbGVOYW1lKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShmaWxlTmFtZSk7Cit9CisKK3NzaXplX3QgRGV2aWNlRmlsZXM6OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5HZXRGaWxlU2l6ZShmaWxlTmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcAppbmRleCA3NzU1N2Y5Li45ZmI1YmJlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTMwLDEwICszMCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCiBSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC00MSw2ICs0MiwxMyBAQAogICAgIHJldHVybiBjbGVhcmtleWRybTo6aXNDbGVhcktleVVVSUQodXVpZC5kYXRhKCkpOwogfQogCitSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgJiYgaXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZSkgJiYKKyAgICAgICAgICAgIGxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87Cit9CisKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkgewogICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBtaW1lVHlwZXMgaGFuZGVkIGJ5IEluaXREYXRhUGFyc2VyLgogICAgIHJldHVybiBtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKQEAgLTcxLDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAppbmRleCAwNzM3ODUxLi5mMzNiNjQ4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCkBAIC0yNSwxMSArMjUsMTUgQEAKICNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKyNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7CiBjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZSgiXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIiIpOwogY29uc3Qgc3RkOjpzdHJpbmcga1RydWUoIlRydWUiKTsKIAogY29uc3Qgc3RkOjpzdHJpbmcga1F1ZXJ5S2V5TGljZW5zZVR5cGUoIkxpY2Vuc2VUeXBlIik7CkBAIC01NCwxOCArNTgsMzEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKK0tleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVUERBVEU6CisgICAgICByZXR1cm4gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpOworICB9Cit9CisKIERybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAogICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAotICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCkgeworICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCksCisgICAgICAgICAgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHsKICAgICBtUGxheVBvbGljeS5jbGVhcigpOwogICAgIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbVJlbGVhc2VLZXlzTWFwLmNsZWFyKCk7CisgICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUobnVsbHB0cikpOwogfQogCiB2b2lkIERybVBsdWdpbjo6aW5pdFByb3BlcnRpZXMoKSB7CkBAIC03NSw2ICs5Miw3IEBACiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba1BsdWdpbkRlc2NyaXB0aW9uS2V5XSA9IGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlOwogICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBbGdvcml0aG1zVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldID0ga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XSA9IGtEcm1FcnJvclRlc3RWYWx1ZTsKIAogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlVmVjdG9yOwogICAgIHZhbHVlVmVjdG9yLmNsZWFyKCk7CkBAIC0xMDMsNiArMTIxLDcgQEAKIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgcHJvY2Vzc01vY2tFcnJvcihzZXNzaW9uKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKIAogICAgIFN0YXR1cyBzdGF0dXMgPSBzZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTyk7CkBAIC0xMTQsNiArMTMzLDcgQEAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46Om9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgIG9wZW5TZXNzaW9uXzFfMV9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBzZWN1cml0eUxldmVsKTsKQEAgLTEyOSw2ICsxNDksMTAgQEAKIAogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOwogICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHNlbmRTZXNzaW9uTG9zdFN0YXRlKHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfQogICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOwogICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOwogICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKQEAgLTEzNywzNSArMTYxLDc2IEBACiAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKIH0KIAotU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCitTdGF0dXNfVjFfMiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RDb21tb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJlcXVlc3QsCi0gICAgICAgIEtleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqa2V5UmVxdWVzdFR5cGUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKSB7CiAgICAgICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCisgICAgLy8gR2V0S2V5UmVxdWVzdE9mZmxpbmVLZXlUeXBlTm90U3VwcG9ydGVkKCkgaW4gdnRzIDEuMCBhbmQgMS4xIGV4cGVjdHMKKyAgICAvLyBLZXlUeXBlOjpPRkZMSU5FIHRvIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSBpbiBjbGVhcmtleSBwbHVnaW4uCisgICAgLy8gVGhvc2UgdGVzdHMgcGFzcyBpbiBhbiBlbXB0eSBpbml0RGF0YSwgd2UgdXNlIHRoZSBlbXB0eSBpbml0RGF0YSB0bworICAgIC8vIHNpZ25hbCBzdWNoIHNwZWNpZmljIHVzZSBjYXNlLgorICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6Ok9GRkxJTkUgJiYgMCA9PSBpbml0RGF0YS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKICAgICAqZGVmYXVsdFVybCA9ICIiOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgKnJlcXVlc3QgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOwogCi0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJgorICAgICAgICAgICAga2V5VHlwZSAhPSBLZXlUeXBlOjpPRkZMSU5FICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6OlJFTEVBU0UpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6QkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb247CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6U1RSRUFNSU5HIHx8IGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpJTklUSUFMOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7Ci0gICAgfQorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPigKKyAgICAgICAgICAgIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCByZXF1ZXN0KSk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIHJlcXVlc3QpOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOworICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdFN0cmluZyhyZXF1ZXN0LT5iZWdpbigpLCByZXF1ZXN0LT5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CisgICAgICAgICAgICBpZiAoIW1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZShrZXlTZXRJZFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgIGVtcHR5UmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlByb2JsZW0gcmVsZWFzaW5nIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbGVhc2VLZXlzTWFwLmZpbmQoa2V5U2V0SWRTdHJpbmcpID09IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICBtUmVsZWFzZUtleXNNYXBba2V5U2V0SWRTdHJpbmddID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCJrZXkgaXMgaW4gdXNlLCBpZ25vcmUgcmVsZWFzZSByZXF1ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiT2ZmbGluZSBsaWNlbnNlIG5vdCBmb3VuZCwgbm90aGluZyB0byByZWxlYXNlIik7CisgICAgICAgIH0KKyAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6UkVMRUFTRTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTc4LDE1ICsyNDMsMTUgQEAKICAgICAgICAgZ2V0S2V5UmVxdWVzdF9jYiBfaGlkbF9jYikgewogICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCi0gICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OwotICAgIFN0YXR1cyBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCiAgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CiAKLSAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhyZXF1ZXN0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSwKKyAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAoc3RhdHVzKSwgdG9IaWRsVmVjKHJlcXVlc3QpLAorICAgICAgICAgICAgdG9LZXlSZXF1ZXN0VHlwZV9WMV8wKGtleVJlcXVlc3RUeXBlKSwKICAgICAgICAgICAgIGhpZGxfc3RyaW5nKGRlZmF1bHRVcmwpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpAQCAtMjAwLDEwICsyNjUsMzEgQEAKICAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAotICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKLSAgICBTdGF0dXMgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOworCisgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKHN0YXR1cyksIHRvSGlkbFZlYyhyZXF1ZXN0KSwKKyAgICAgICAgICAgIGtleVJlcXVlc3RUeXBlLCBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdF8xXzIoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGdldEtleVJlcXVlc3RfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCiAgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CiAKQEAgLTIyOCw2ICszMTQsMzEgQEAKICAgICBtUGxheVBvbGljeS5wdXNoX2JhY2socG9saWN5KTsKIH0KIAorYm9vbCBEcm1QbHVnaW46Om1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpIHsKKyAgICBpZiAoIWtleVNldElkKSB7CisgICAgICAgIEFMT0dFKCJrZXlTZXRJZCBkZXN0aW5hdGlvbiBub3QgcHJvdmlkZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrc2lkKGtLZXlTZXRJZFByZWZpeC5iZWdpbigpLCBrS2V5U2V0SWRQcmVmaXguZW5kKCkpOworICAgIGtzaWQucmVzaXplKGtLZXlTZXRJZExlbmd0aCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmFuZG9tRGF0YSgoa0tleVNldElkTGVuZ3RoIC0ga0tleVNldElkUHJlZml4LnNpemUoKSkgLyAyLCAwKTsKKworICAgIHdoaWxlIChrZXlTZXRJZC0+ZW1wdHkoKSkgeworICAgICAgICBmb3IgKGF1dG8gaXRyID0gcmFuZG9tRGF0YS5iZWdpbigpOyBpdHIgIT0gcmFuZG9tRGF0YS5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgICAgICppdHIgPSBzdGQ6OnJhbmQoKSAlIDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgKmtleVNldElkID0ga0tleVNldElkUHJlZml4ICsgQnl0ZUFycmF5VG9IZXhTdHJpbmcoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpLCByYW5kb21EYXRhLnNpemUoKSk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CisgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKKyAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQorICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKKyAgICAgICAgICAgIGtleVNldElkLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtMjM4LDI4ICszNDksMTI3IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IHRvVmVjdG9yKHNjb3BlKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgYm9vbCBpc1JlbGVhc2UgPSAobWVtY21wKHNjb3BlSWQuZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSA9PSAwKTsKKyAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgIGtleVNldElkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworCisgICAgICAgIGF1dG8gaXRlciA9IG1SZWxlYXNlS2V5c01hcC5maW5kKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSk7CisgICAgICAgIGlmIChpdGVyICE9IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihpdGVyLT5zZWNvbmQuYmVnaW4oKSwgaXRlci0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgLy8gbm9uIG9mZmxpbmUgbGljZW5zZSByZXR1cm5zIGVtcHR5IGtleVNldElkCisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVELCBoaWRsX3ZlYzx1aW50OF90PigpKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0KICAgICBzZXRQbGF5UG9saWN5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KLSAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIDAsIHNjb3BlKTsKLSAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICAgICAgaWYgKGlzT2ZmbGluZUxpY2Vuc2UpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ha2VLZXlTZXRJZCgma2V5U2V0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04sIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IG1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZXNwb25zZS5iZWdpbigpLCByZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzX1YxXzI+IGtleXNTdGF0dXM7CisgICAgICAgIEtleVN0YXR1c19WMV8yIGtleVN0YXR1czsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDEgPSB7IDB4QSwgMHhCLCAweEMgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQxOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzI6OktleVN0YXR1c1R5cGU6OlVTQUJMRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDIgPSB7IDB4RCwgMHhFLCAweEYgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzI6OktleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0geyAweDAsIDB4MSwgMHgyIH07CisgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMzsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8yOjpLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlzU3RhdHVzLCB0cnVlKTsKKworICAgICAgICBpbnN0YWxsU2VjdXJlU3RvcChzZXNzaW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcm92aWRlS2V5UmVzcG9uc2UgcmV0dXJucyBlcnJvcj0lZCIsIHN0YXR1cyk7CiAgICAgfQogCi0gICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2NvcGUpOwotCi0gICAgLy8gUmV0dXJucyBzdGF0dXMgYW5kIGVtcHR5IGtleVNldElkCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWRWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9mZmxpbmVMaWNlbnNlOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUZpbGVIYW5kbGVMb2NrKTsKKyAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2Uoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpLAorICAgICAgICAgICAgICAgICZsaWNlbnNlU3RhdGUsICZvZmZsaW5lTGljZW5zZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZyA9PSBsaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIH0KKworICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShzdGQ6OnZlY3Rvcjx1aW50OF90PihvZmZsaW5lTGljZW5zZS5iZWdpbigpLAorICAgICAgICAgICAgICAgIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnN0cmluZyBuYW1lKHByb3BlcnR5TmFtZS5jX3N0cigpKTsKQEAgLTI3NSw2ICs0ODUsOCBAQAogICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XTsKICAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkpIHsKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHN0cmluZyBwcm9wZXJ0eSAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsICIiKTsKQEAgLTMxOSw2ICs1MzEsMjAgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrTG9zdFN0YXRlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrRnJhbWVUb29MYXJnZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSAgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKICAgICBtU3RyaW5nUHJvcGVydGllc1trZXldID0gc3RkOjpzdHJpbmcodmFsdWUuY19zdHIoKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CkBAIC0zMjksNiArNTU1LDkgQEAKICAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgewogICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0NsaWVudElkS2V5XSA9IHRvVmVjdG9yKHZhbHVlKTsKKyAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgIH0KIAogICAgLy8gU2V0dGluZyBvZiB1bmRlZmluZWQgcHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkCkBAIC00NjcsNiArNjk2LDY0IEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaWNlbnNlTmFtZXMgPSBtRmlsZUhhbmRsZS5MaXN0TGljZW5zZXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxLZXlTZXRJZD4ga2V5U2V0SWRzOworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAobU1vY2tFcnJvciksIGtleVNldElkcyk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IGxpY2Vuc2VOYW1lcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCkpOworICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICB9CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywga2V5U2V0SWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoY29uc3QgS2V5U2V0SWQmIGtleVNldElkKSB7CisgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1c18xXzAobU1vY2tFcnJvcik7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRmlsZUhhbmRsZUxvY2spOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCwKKyAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GaWxlSGFuZGxlTG9jayk7CisKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZTsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpLCBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOKTsKKyAgICB9IGVsc2UgaWYgKG1GaWxlSGFuZGxlLlJldHJpZXZlTGljZW5zZShsaWNlbnNlTmFtZSwgJnN0YXRlLCAmbGljZW5zZSkpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVVbmtub3duOgorICAgICAgICAgICAgaExpY2Vuc2VTdGF0ZSA9IE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBoTGljZW5zZVN0YXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjp2ZWN0b3I8U2VjdXJlU3RvcD4gc3RvcHM7CiAgICAgZm9yIChhdXRvIGl0ciA9IG1TZWN1cmVTdG9wcy5iZWdpbigpOyBpdHIgIT0gbVNlY3VyZVN0b3BzLmVuZCgpOyArK2l0cikgewpAQCAtNTc0LDcgKzg2MSw3IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCmluZGV4IGUyYmI2NTEuLmI5ODhjZTAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgewpAQCAtNDUsMjEgKzQ1LDIyIEBACiB9CiAKIFN0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgewogICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CiAKLSAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgaWYgKG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZS5jX3N0cigpIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtJc29CbWZmQXVkaW9NaW1lVHlwZS5jX3N0cigpIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtDZW5jSW5pdERhdGFGb3JtYXQuY19zdHIoKSkgewogICAgICAgICBTdGF0dXMgcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQpIHsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZS5jX3N0cigpIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZS5jX3N0cigpIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQuY19zdHIoKSkgewogICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECiAgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgewogICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CkBAIC02OSw4ICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICB9CiAKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgIC8vIHJlc3RvcmUga2V5CisgICAgfQorCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKLSAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlJZHMpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleVR5cGUsIGtleUlkcyk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdEpzb25WZWMgPSBTdHJUb1ZlY3RvcihyZXF1ZXN0SnNvbik7CiAKICAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKQEAgLTEzMSw5ICsxMzYsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KIAotc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworc3RkOjpzdHJpbmcgSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5U2Vzc2lvbigiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50U2Vzc2lvbigiXSxcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwifSIpOwogCiAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CiAgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOwpAQCAtMTQ3LDcgKzE1NCwxMiBAQAogICAgICAgICByZXF1ZXN0LmFwcGVuZChlbmNvZGVkSWQpOwogICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKICAgICB9Ci0gICAgcmVxdWVzdC5hcHBlbmQoa1JlcXVlc3RTdWZmaXgpOworICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrVGVtcG9yYXJ5U2Vzc2lvbik7CisgICAgfSBlbHNlIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6Ok9GRkxJTkUgfHwKKyAgICAgICAgICAgICAgICAgICBrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtQZXJzaXN0ZW50U2Vzc2lvbik7CisgICAgfQogCiAgICAgLy8gQW5kcm9pZCdzIEJhc2U2NCBlbmNvZGVyIHByb2R1Y2VzIHBhZGRpbmcuIEVNRSBmb3JiaWRzIHBhZGRpbmcuCiAgICAgY29uc3QgY2hhciBrQmFzZTY0UGFkZGluZyA9ICc9JzsKQEAgLTE1Nyw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKaW5kZXggY2NjYjQxZS4uZDkzNzc3ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0yMiwxOCArMjIsMjEgQEAKICNpbmNsdWRlICJCYXNlNjQuaCIKIAogbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5c1RhZygia2V5cyIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVR5cGVUYWcoImt0eSIpOwotY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUYWcoImsiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlJZFRhZygia2lkIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOworY29uc3Qgc3RkOjpzdHJpbmcga01lZGlhU2Vzc2lvblR5cGUoInR5cGUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtQZXJzaXN0ZW50TGljZW5zZVNlc3Npb24oInBlcnNpc3RlbnQtbGljZW5zZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlU2Vzc2lvbigidGVtcG9yYXJ5Iik7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEpzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7CkBAIC0yNjgsNyArMjcxLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOWFjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3N0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBpZiAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKGluZGV4KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpOworfQorCitzc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NZW1vcnlGaWxlU3lzdGVtTG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmaWxlbmFtZSA6IG1NZW1vcnlGaWxlU3lzdGVtKSB7CisgICAgICAgIGxpc3QucHVzaF9iYWNrKGZpbGVuYW1lLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK3NpemVfdCBNZW1vcnlGaWxlU3lzdGVtOjpSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogYnVmZmVyKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZSA9IHJlc3VsdC0+c2Vjb25kLmdldENvbnRlbnQoKTsKKyAgICAgICAgYnVmZmVyLT5hc3NpZ24oc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci0+c2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OldyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWVtb3J5RmlsZVN5c3RlbUxvY2spOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShyZXN1bHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgbGljZW5zZSB0byByZW1vdmU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlQWxsRmlsZXMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOworICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKaW5kZXggMDdjOTI2OS4uYTlkNzAxNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCkBAIC0yOCw3ICsyOCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwpAQCAtNDIsOSArNDIsMTAgQEAKIFN0YXR1cyBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgewogICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKLSAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5UmVxdWVzdCk7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIGtleVJlcXVlc3QpOwogfQogCiBTdGF0dXMgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgewpAQCAtNjcsMjkgKzY4LDM0IEBACiAgICAgfQogfQogCi1TdGF0dXMgU2Vzc2lvbjo6ZGVjcnlwdCgKK1N0YXR1c19WMV8yIFNlc3Npb246OmRlY3J5cHQoCiAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICB1aW50OF90KiBkZXN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CiAKKyAgICBpZiAoZ2V0TW9ja0Vycm9yKCkgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIHJldHVybiBnZXRNb2NrRXJyb3IoKTsKKyAgICB9CisKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZFZlY3RvcjsKICAgICBrZXlJZFZlY3Rvci5jbGVhcigpOwogICAgIGtleUlkVmVjdG9yLmluc2VydChrZXlJZFZlY3Rvci5lbmQoKSwga2V5SWQsIGtleUlkICsga0Jsb2NrU2l6ZSk7CiAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0cjsKICAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOwogICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOwotICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICBTdGF0dXMgc3RhdHVzID0gZGVjcnlwdG9yLmRlY3J5cHQoCiAgICAgICAgICAgICBpdHItPnNlY29uZCAvKmtleSovLCBpdiwgc3JjUHRyLCBkZXN0UHRyLCBzdWJTYW1wbGVzLAogICAgICAgICAgICAgc3ViU2FtcGxlcy5zaXplKCksIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KHN0YXR1cyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGI0MzE5ZTYuLjk5ZmIzMGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTU5LDcgKzU5LDggQEAKIAogICAgIG1TZXNzaW9ucy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAogICAgICAgICAgICAgc3A8U2Vzc2lvbj4gPihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC03MCw3ICs3MSw4IEBACiBzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC04NCw3ICs4Niw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlODU2YS4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleQotICAgIGNsYXNzIGhhbAotICAgIHVzZXIgbWVkaWEKLSAgICBncm91cCBtZWRpYSBtZWRpYWRybQotICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmQzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTAsMCArMSwxNCBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTIgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGRpc2FibGVkCisgICAgb25lc2hvdAorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYSBtZWRpYWRybQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhNjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKQEAgLTAsMCArMSwxMiBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTIgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAppbmRleCAwYzdlZjIwLi43MjFmNGMwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTQyLDcgKzQyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKaW5kZXggNGEzODViZC4uZWMzMGNjMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTM4LDcgKzM4LDcgQEAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAppbmRleCA1YmJiMjhhLi5jNDk3ZTM3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAppbmRleCBkNjViMjVjLi5iODNjZTY5IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCkBAIC0yMiwzMCArMjIsNDAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yS2V5KCJ2ZW5kb3IiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yVmFsdWUoIkdvb2dsZSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uS2V5KCJ2ZXJzaW9uIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4xIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uS2V5KCJkZXNjcmlwdGlvbiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlKCJDbGVhcktleSBDRE0iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc0tleSgiYWxnb3JpdGhtcyIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zVmFsdWUoIiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KCJsaXN0ZW5lclRlc3RTdXBwb3J0Iik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZSgidHJ1ZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEcm1FcnJvclRlc3RLZXkoImRybUVycm9yVGVzdCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEcm1FcnJvclRlc3RWYWx1ZSgiIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1Jlc291cmNlQ29udGVudGlvblZhbHVlKCJyZXNvdXJjZUNvbnRlbnRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTG9zdFN0YXRlVmFsdWUoImxvc3RTdGF0ZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGcmFtZVRvb0xhcmdlVmFsdWUoImZyYW1lVG9vTGFyZ2UiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSW52YWxpZFN0YXRlVmFsdWUoImludmFsaWRTdGF0ZSIpOwogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RldmljZUlkS2V5KCJkZXZpY2VJZCIpOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3REZXZpY2VJZERhdGFbXSA9CiAgICAgICAgIHsweDAsIDB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweDYsIDB4NywKICAgICAgICAgIDB4OCwgMHg5LCAweGEsIDB4YiwgMHhjLCAweGQsIDB4ZSwgMHhmfTsKKworLy8gc2V0dGFibGUgYnl0ZSBhcnJheSBwcm9wZXJ0eQorc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtDbGllbnRJZEtleSgiY2xpZW50SWQiKTsKKwogLy8gVE9ETyBzdHViIG91dCBtZXRyaWNzIGZvciBudwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtNZXRyaWNzS2V5KCJtZXRyaWNzIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrTWV0cmljc0RhdGFbXSA9IHsgMCB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKaW5kZXggNDZjYjVlNC4uMDNjNDM0ZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCkBAIC0xNywxNyArMTcsMTggQEAKICNpZm5kZWYgQ0xFQVJLRVlfTUFDUk9TX0hfCiAjZGVmaW5lIENMRUFSS0VZX01BQ1JPU19IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIAogY29uc3QgdWludDhfdCBrQmxvY2tTaXplID0gMTY7IC8vQUVTX0JMT0NLX1NJWkU7CkBAIC00Nyw3ICs0OCw3IEBACiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKaW5kZXggOTk1MjAyNy4uNjM2OGYzZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKIAogZXh0ZXJuICJDIiB7CiAgICAgSURybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKTsKQEAgLTM1LDcgKzM1LDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCmluZGV4IDE3NWFiNzYuLjIwM2JiMmQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUyLDcgKzUyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKaW5kZXggMWY5YTA2Zi4uMjNhNjRmYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlIDxtdXRleD4KQEAgLTM0LDE2ICszNCwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUzLDcgKzU0LDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBJQ3J5cHRvUGx1Z2luIHsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK3N0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luIHsKICAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgICAgICBtSW5pdFN0YXR1cyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KQEAgLTgwLDcgKzgzLDE5IEBACiAgICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKICAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVM7IC8vIHVzZSB1bmlxdWVfbG9jaworICAgICAgICAgICAgZGVjcnlwdF9jYiBfaGlkbF9jYik7CisKKyAgICBSZXR1cm48dm9pZD4gZGVjcnlwdF8xXzIoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lEX1NJWkU+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgICAgIE1vZGUgbW9kZSwKKyAgICAgICAgICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgICAgICBkZWNyeXB0XzFfMl9jYiBfaGlkbF9jYikgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUzsgLy8gdXNlIHVuaXF1ZV9sb2NrCiAKICAgICBSZXR1cm48dm9pZD4gc2V0U2hhcmVkQnVmZmVyQmFzZShjb25zdCBoaWRsX21lbW9yeSYgYmFzZSwKICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcklkKTsKQEAgLTk5LDcgKzExNCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTRhZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInByb3Rvcy9EZXZpY2VGaWxlcy5wYi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2NsYXNzIERldmljZUZpbGVzIHsKKyBwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24sCisgICAgICAgIGtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmcsCisgICAgfSBMaWNlbnNlU3RhdGU7CisKKyAgICBEZXZpY2VGaWxlcygpIHt9OworICAgIHZpcnR1YWwgfkRldmljZUZpbGVzKCkge307CisKKyAgICB2aXJ0dWFsIGJvb2wgU3RvcmVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVJlc3BvbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBSZXRyaWV2ZUxpY2Vuc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3NldF9pZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKTsKKworICAgIHZpcnR1YWwgYm9vbCBMaWNlbnNlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0TGljZW5zZXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVMaWNlbnNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlQWxsTGljZW5zZXMoKTsKKworIHByaXZhdGU6CisgICAgYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgYm9vbCBSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSk7CisKKyAgICBib29sIFJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKTsKKyAgICBib29sIFN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSk7CisKKyAgICBNZW1vcnlGaWxlU3lzdGVtIG1GaWxlSGFuZGxlOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERldmljZUZpbGVzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAppbmRleCA2ZjU4MTk1Li40Y2E4NTZkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKQEAgLTE3LDE1ICsxNywxNSBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwpAQCAtMzksNiArMzksMTAgQEAKICAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpCiAgICAgICAgICAgICBvdmVycmlkZTsKIAorICAgIFJldHVybjxib29sPiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUxldmVsIGxldmVsKSBvdmVycmlkZTsKKwogICAgIFJldHVybjxib29sPiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkKICAgICAgICAgICAgIG92ZXJyaWRlOwogCkBAIC01Miw3ICs1Niw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCmluZGV4IDdkOTY1MGYuLjdlYTU4ZTAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKQEAgLTE3LDMyICsxNyw0MiBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdGRpby5oPgogCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCisjaW5jbHVkZSAiRGV2aWNlRmlsZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2Vzc2lvbklkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkV2ZW50VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwordXNpbmcgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgZHJtOjpWMV8wOjpTZXNzaW9uSWQ7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OklEcm1QbHVnaW47Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwpAQCAtNTAsMTAgKzYwLDE2IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Cit0eXBlZGVmIGRybTo6VjFfMjo6SURybVBsdWdpbkxpc3RlbmVyIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OktleVN0YXR1cyBLZXlTdGF0dXNfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCiBzdHJ1Y3QgRHJtUGx1Z2luIDogcHVibGljIElEcm1QbHVnaW4gewogICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpOwogCi0gICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7IG1GaWxlSGFuZGxlLkRlbGV0ZUFsbExpY2Vuc2VzKCk7IH0KIAogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCkBAIC03Nyw2ICs5MywxNCBAQAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gcHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTkxLDEzICsxMTUsNyBAQAogCiAgICAgUmV0dXJuPFN0YXR1cz4gcmVzdG9yZUtleXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotCi0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9CisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgb3ZlcnJpZGU7CiAKICAgICBSZXR1cm48dm9pZD4gcXVlcnlLZXlTdGF0dXMoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xMTUsNiArMTMzLDE4IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2VydGlmaWNhdGVBdXRob3JpdHksCisgICAgICAgIGdldFByb3Zpc2lvblJlcXVlc3RfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZVR5cGUpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVBdXRob3JpdHkpOworCisgICAgICAgIGhpZGxfc3RyaW5nIGRlZmF1bHRVcmw7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgaGlkbF92ZWM8dWludDhfdD4oKSwgZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLAogICAgICAgICBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VfY2IgX2hpZGxfY2IpIHsKQEAgLTEzNCw2ICsxNjQsMTMgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0SGRjcExldmVsc18xXzIoZ2V0SGRjcExldmVsc18xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgY29ubmVjdGVkTGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOworICAgICAgICBIZGNwTGV2ZWxfVjFfMiBtYXhMZXZlbCA9IEhkY3BMZXZlbF9WMV8yOjpIRENQX05PX09VVFBVVDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6Ok9LLCBjb25uZWN0ZWRMZXZlbCwgbWF4TGV2ZWwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBnZXROdW1iZXJPZlNlc3Npb25zKGdldE51bWJlck9mU2Vzc2lvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKQEAgLTE0MSw2ICsxNzgsMTMgQEAKIAogICAgIFJldHVybjx2b2lkPiBnZXRNZXRyaWNzKGdldE1ldHJpY3NfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkICZrZXlTZXRJZCkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQsCisgICAgICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKwogICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCiAgICAgICAgIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKQEAgLTI0OCwxMiArMjkyLDE3IEBACiAKICAgICBSZXR1cm48dm9pZD4gc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybVBsdWdpbkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lclYxXzIgPSBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjo6Y2FzdEZyb20obGlzdGVuZXIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH07CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudCgKKyAgICAgICAgICAgIEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV2ZW50KGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBkYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjYxLDggKzMxMCwxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yNzAsOSArMzIzLDEyIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kS2V5c0NoYW5nZShzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CkBAIC0yODAsNiArMzM2LDIzIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlXzFfMigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMj4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRLZXlzQ2hhbmdlXzFfMihzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3QsIGhhc05ld1VzYWJsZUtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZFNlc3Npb25Mb3N0U3RhdGUoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJWMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lclYxXzItPnNlbmRTZXNzaW9uTG9zdFN0YXRlKHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJlU3RvcHMoZ2V0U2VjdXJlU3RvcHNfY2IgX2hpZGxfY2IpOwogCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlY3VyZVN0b3BJZCwKQEAgLTMwMCwxOCArMzczLDE5IEBACiBwcml2YXRlOgogICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKICAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIGJvb2wgbWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCk7CiAgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CiAKICAgICBSZXR1cm48U3RhdHVzPiBzZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBTZWN1cml0eUxldmVsIGxldmVsKTsKIAotICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICBTdGF0dXNfVjFfMiBnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJlcXVlc3QsCi0gICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqZ2V0S2V5UmVxdWVzdFR5cGUsCisgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICpnZXRLZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKTsKIAogICAgIHN0cnVjdCBDbGVhcmtleVNlY3VyZVN0b3AgewpAQCAtMzIzLDggKzM5NywxMCBAQAogICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBtUGxheVBvbGljeTsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1TdHJpbmdQcm9wZXJ0aWVzOwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1SZWxlYXNlS2V5c01hcDsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD4gbVNlY3VyaXR5TGV2ZWw7CiAgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyX1YxXzI+IG1MaXN0ZW5lclYxXzI7CiAgICAgU2Vzc2lvbkxpYnJhcnkgKm1TZXNzaW9uTGlicmFyeTsKICAgICBpbnQ2NF90IG1PcGVuU2Vzc2lvbk9rQ291bnQ7CiAgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uT2tDb3VudDsKQEAgLTMzMiwxMSArNDA4LDIyIEBACiAgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CiAgICAgYW5kcm9pZDo6TXV0ZXggbVBsYXlQb2xpY3lMb2NrOwogCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3IobU1vY2tFcnJvcik7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CisgICAgfQorCisgICAgTXV0ZXggbUZpbGVIYW5kbGVMb2NrOworICAgIERldmljZUZpbGVzIG1GaWxlSGFuZGxlIEdVQVJERURfQlkobUZpbGVIYW5kbGVMb2NrKTsKKwogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTl9BTkRfTkVXKERybVBsdWdpbik7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAppbmRleCAzMTg5YzRhLi44ODlmNTExIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC0zNCw3ICszNCw4IEBACiAgICAgSW5pdERhdGFQYXJzZXIoKSB7fQogCiAgICAgU3RhdHVzIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKIAogcHJpdmF0ZToKQEAgLTQzLDEyICs0NCwxMiBAQAogICAgIFN0YXR1cyBwYXJzZVBzc2goY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOwogCi0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KAorICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdChWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKaW5kZXggNGFiMDM0Yy4uZTU3NDcwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCkBAIC0yMyw3ICsyMyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBjbGFzcyBKc29uV2ViS2V5IHsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWMwZTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisjaWZuZGVmIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXworI2RlZmluZSBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU1lbW9yeUZpbGVTeXN0ZW1Mb2NrOworCisgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAorICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKKyAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtIEdVQVJERURfQlkobU1lbW9yeUZpbGVTeXN0ZW1Mb2NrKTsKKworICAgIHN0ZDo6c3RyaW5nIEdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZW1vcnlGaWxlU3lzdGVtKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAppbmRleCBjZGRmY2E1Li5hMTU5ZTVhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKQEAgLTI3LDQzICsyNyw1MyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwogCiBjbGFzcyBTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKLSAgICAgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpIHt9CisgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykge30KICAgICB2aXJ0dWFsIH5TZXNzaW9uKCkge30KIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CiAKICAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtaW1lVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0OwogCiAgICAgU3RhdHVzIHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSk7CiAKLSAgICBTdGF0dXMgZGVjcnlwdCgKKyAgICBTdGF0dXNfVjFfMiBkZWNyeXB0KAogICAgICAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzcmNQdHIsCiAgICAgICAgICAgICB1aW50OF90KiBkc3RQdHIsIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3ViU2FtcGxlcywKICAgICAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpOwogCisgICAgdm9pZCBzZXRNb2NrRXJyb3IoU3RhdHVzX1YxXzIgZXJyb3IpIHttTW9ja0Vycm9yID0gZXJyb3I7fQorICAgIFN0YXR1c19WMV8yIGdldE1vY2tFcnJvcigpIGNvbnN0IHtyZXR1cm4gbU1vY2tFcnJvcjt9CisKIHByaXZhdGU6CiAgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOwogCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKICAgICBLZXlNYXAgbUtleU1hcDsKICAgICBNdXRleCBtTWFwTG9jazsKKworICAgIC8vIEZvciBtb2NraW5nIGVycm9yIHJldHVybiBzY2VuYXJpb3MKKyAgICBTdGF0dXNfVjFfMiBtTW9ja0Vycm9yOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKaW5kZXggMzI2YTBjMS4uMWU1NjdiOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01OCw3ICs1OCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAppbmRleCBjYzA2MzI5Li5iMGY4NjA3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTY4LDggKzY4LDE5IEBACiAgICAgcmV0dXJuIHZlYzsKIH0KIAoraW5saW5lIFN0YXR1cyB0b1N0YXR1c18xXzAoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8gYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTExZjBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KQEAgLTAsMCArMSw0NyBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGV2aWNlX2ZpbGVzLnByb3RvCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vICAgRm9ybWF0IG9mIHZhcmlvdXMgZmlsZXMgc3RvcmVkIGF0IHRoZSBkZXZpY2UuCisvLworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5kcm0uVjFfMi5jbGVhcmtleTsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBMaWNlbnNlIHsKKyAgZW51bSBMaWNlbnNlU3RhdGUgeworICAgIEFDVElWRSA9IDE7CisgICAgUkVMRUFTSU5HID0gMjsKKyAgfQorCisgIG9wdGlvbmFsIExpY2Vuc2VTdGF0ZSBzdGF0ZSA9IDE7CisgIG9wdGlvbmFsIGJ5dGVzIGxpY2Vuc2UgPSAyOworfQorCittZXNzYWdlIE9mZmxpbmVGaWxlIHsKKyAgZW51bSBGaWxlVHlwZSB7CisgICAgTElDRU5TRSA9IDE7CisgIH0KKworICBlbnVtIEZpbGVWZXJzaW9uIHsKKyAgICBWRVJTSU9OXzEgPSAxOworICB9CisKKyAgb3B0aW9uYWwgRmlsZVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEZpbGVWZXJzaW9uIHZlcnNpb24gPSAyIFtkZWZhdWx0ID0gVkVSU0lPTl8xXTsKKyAgb3B0aW9uYWwgTGljZW5zZSBsaWNlbnNlID0gMzsKKworfQorCittZXNzYWdlIEhhc2hlZEZpbGUgeworICBvcHRpb25hbCBieXRlcyBmaWxlID0gMTsKKyAgLy8gQSByYXcgKG5vdCBoZXgtZW5jb2RlZCkgU0hBMjU2LCB0YWtlbiBvdmVyIHRoZSBieXRlcyBvZiAnZmlsZScuCisgIG9wdGlvbmFsIGJ5dGVzIGhhc2ggPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKaW5kZXggNmE5N2I3Mi4uYjM5ZWEwMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCkBAIC0xMywzMiArMTMsMjQgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0jZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IgotCiAjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgogI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbExhenlVdGlscy5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7Ci0KK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwogCiBpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKLSAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkgc3RhcnRpbmcuLi4iKTsKLQotICAgIC8vIFRoZSBEUk0gSEFMIG1heSBjb21tdW5pY2F0ZSB0byBvdGhlciB2ZW5kb3IgY29tcG9uZW50cyB2aWEKLSAgICAvLyAvZGV2L3ZuZGJpbmRlcgotICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7Ci0KICAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OwogICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlTGF6eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZDg4MwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbExhenlVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6TGF6eVNlcnZpY2VSZWdpc3RyYXI7CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIHNwPElEcm1GYWN0b3J5PiBkcm1GYWN0b3J5ID0gbmV3IERybUZhY3Rvcnk7CisgICAgc3A8SUNyeXB0b0ZhY3Rvcnk+IGNyeXB0b0ZhY3RvcnkgPSBuZXcgQ3J5cHRvRmFjdG9yeTsKKworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woOCwgdHJ1ZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKKyAgICAvLyBTZXR1cCBod2JpbmRlciBzZXJ2aWNlCisgICAgTGF6eVNlcnZpY2VSZWdpc3RyYXIgc2VydmljZVJlZ2lzdHJhcjsKKworICAgIC8vIFNldHVwIGh3YmluZGVyIHNlcnZpY2UKKyAgICBDSEVDS19FUShzZXJ2aWNlUmVnaXN0cmFyLnJlZ2lzdGVyU2VydmljZShkcm1GYWN0b3J5LCAiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgRmFjdG9yeSBIQUwiOworICAgIENIRUNLX0VRKHNlcnZpY2VSZWdpc3RyYXIucmVnaXN0ZXJTZXJ2aWNlKGNyeXB0b0ZhY3RvcnksICJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBDcnlwdG8gIEhBTCI7CisKKyAgICBqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suaCBiL2luY2x1ZGUvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDczZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lDT01NT05DTE9DS19ICi0jZGVmaW5lIEFORFJPSURfSUNPTU1PTkNMT0NLX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSUNvbW1vbkNsb2NrTGlzdGVuZXIgOiBwdWJsaWMgSUludGVyZmFjZSB7Ci0gIHB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENvbW1vbkNsb2NrTGlzdGVuZXIpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uVGltZWxpbmVDaGFuZ2VkKHVpbnQ2NF90IHRpbWVsaW5lSUQpID0gMDsKLX07Ci0KLWNsYXNzIEJuQ29tbW9uQ2xvY2tMaXN0ZW5lciA6IHB1YmxpYyBCbkludGVyZmFjZTxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4gewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLWNsYXNzIElDb21tb25DbG9jayA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKLSAgcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ29tbW9uQ2xvY2spOwotCi0gICAgLy8gTmFtZSBvZiB0aGUgSUNvbW1vbkNsb2NrIHNlcnZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlIG1hbmFnZXIuCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IGtTZXJ2aWNlTmFtZTsKLQotICAgIC8vIGEgcmVzZXJ2ZWQgaW52YWxpZCB0aW1lbGluZSBJRAotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrSW52YWxpZFRpbWVsaW5lSUQ7Ci0KLSAgICAvLyBhIHJlc2VydmVkIGludmFsaWQgZXJyb3IgZXN0aW1hdGUKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRXJyb3JFc3RpbWF0ZVVua25vd247Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgLy8gdGhlIGRldmljZSBqdXN0IGNhbWUgdXAgYW5kIGlzIHRyeWluZyB0byBkaXNjb3ZlciB0aGUgbWFzdGVyCi0gICAgICAgIFNUQVRFX0lOSVRJQUwsCi0KLSAgICAgICAgLy8gdGhlIGRldmljZSBpcyBhIGNsaWVudCBvZiBhIG1hc3RlcgotICAgICAgICBTVEFURV9DTElFTlQsCi0KLSAgICAgICAgLy8gdGhlIGRldmljZSBpcyBhY3RpbmcgYXMgbWFzdGVyCi0gICAgICAgIFNUQVRFX01BU1RFUiwKLQotICAgICAgICAvLyB0aGUgZGV2aWNlIGhhcyBsb3N0IGNvbnRhY3Qgd2l0aCBpdHMgbWFzdGVyIGFuZCBuZWVkcyB0byBwYXJ0aWNpcGF0ZQotICAgICAgICAvLyBpbiB0aGUgZWxlY3Rpb24gb2YgYSBuZXcgbWFzdGVyCi0gICAgICAgIFNUQVRFX1JPTklOLAotCi0gICAgICAgIC8vIHRoZSBkZXZpY2UgaXMgd2FpdGluZyBmb3IgYW5ub3VuY2VtZW50IG9mIHRoZSBuZXdseSBlbGVjdGVkIG1hc3RlcgotICAgICAgICBTVEFURV9XQUlUX0ZPUl9FTEVDVElPTiwKLSAgICB9OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpc0NvbW1vblRpbWVWYWxpZChib29sKiB2YWxpZCwgdWludDMyX3QqIHRpbWVsaW5lSUQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1vblRpbWVUb0xvY2FsVGltZShpbnQ2NF90IGNvbW1vblRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbG9jYWxUaW1lKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2NhbFRpbWVUb0NvbW1vblRpbWUoaW50NjRfdCBsb2NhbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogY29tbW9uVGltZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29tbW9uVGltZShpbnQ2NF90KiBjb21tb25UaW1lKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb21tb25GcmVxKHVpbnQ2NF90KiBmcmVxKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2NhbFRpbWUoaW50NjRfdCogbG9jYWxUaW1lKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2NhbEZyZXEodWludDY0X3QqIGZyZXEpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVzdGltYXRlZEVycm9yKGludDMyX3QqIGVzdGltYXRlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lbGluZUlEKHVpbnQ2NF90KiBpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RhdGUoU3RhdGUqIHN0YXRlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJBZGRyKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyTGlzdGVuZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyTGlzdGVuZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSA9IDA7Ci0KLSAgICAvLyBTaW1wbGUgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvbm5lY3QgdG8gdGhlIENvbW1vbkNsb2NrIHNlcnZpY2UuCi0gICAgc3RhdGljIGlubGluZSBzcDxJQ29tbW9uQ2xvY2s+IGdldEluc3RhbmNlKCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKAotICAgICAgICAgICAgICAgIElDb21tb25DbG9jazo6a1NlcnZpY2VOYW1lKTsKLSAgICAgICAgc3A8SUNvbW1vbkNsb2NrPiBjbGsgPSBpbnRlcmZhY2VfY2FzdDxJQ29tbW9uQ2xvY2s+KGJpbmRlcik7Ci0gICAgICAgIHJldHVybiBjbGs7Ci0gICAgfQotfTsKLQotY2xhc3MgQm5Db21tb25DbG9jayA6IHB1YmxpYyBCbkludGVyZmFjZTxJQ29tbW9uQ2xvY2s+IHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0lDT01NT05DTE9DS19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1vbl90aW1lL0lDb21tb25UaW1lQ29uZmlnLmggYi9pbmNsdWRlL2NvbW1vbl90aW1lL0lDb21tb25UaW1lQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5N2I2NjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb21tb25fdGltZS9JQ29tbW9uVGltZUNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQ09NTU9OVElNRUNPTkZJR19ICi0jZGVmaW5lIEFORFJPSURfSUNPTU1PTlRJTUVDT05GSUdfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmcxNjsKLQotY2xhc3MgSUNvbW1vblRpbWVDb25maWcgOiBwdWJsaWMgSUludGVyZmFjZSB7Ci0gIHB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENvbW1vblRpbWVDb25maWcpOwotCi0gICAgLy8gTmFtZSBvZiB0aGUgSUNvbW1vblRpbWVDb25maWcgc2VydmljZSByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZpY2UKLSAgICAvLyBtYW5hZ2VyLgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBrU2VydmljZU5hbWU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckVsZWN0aW9uUHJpb3JpdHkodWludDhfdCAqcHJpb3JpdHkpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlckVsZWN0aW9uUHJpb3JpdHkodWludDhfdCBwcmlvcml0eSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyRWxlY3Rpb25Hcm91cElkKHVpbnQ2NF90ICppZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyRWxlY3Rpb25Hcm91cElkKHVpbnQ2NF90IGlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnRlcmZhY2VCaW5kaW5nKFN0cmluZzE2JiBpZmFjZU5hbWUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEludGVyZmFjZUJpbmRpbmcoY29uc3QgU3RyaW5nMTYmIGlmYWNlTmFtZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyQW5ub3VuY2VJbnRlcnZhbChpbnQgKmludGVydmFsKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJBbm5vdW5jZUludGVydmFsKGludCBpbnRlcnZhbCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2xpZW50U3luY0ludGVydmFsKGludCAqaW50ZXJ2YWwpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENsaWVudFN5bmNJbnRlcnZhbChpbnQgaW50ZXJ2YWwpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhbmljVGhyZXNob2xkKGludCAqdGhyZXNob2xkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYW5pY1RocmVzaG9sZChpbnQgdGhyZXNob2xkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdXRvRGlzYWJsZShib29sICphdXRvRGlzYWJsZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXV0b0Rpc2FibGUoYm9vbCBhdXRvRGlzYWJsZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZm9yY2VOZXR3b3JrbGVzc01hc3Rlck1vZGUoKSA9IDA7Ci0KLSAgICAvLyBTaW1wbGUgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvbm5lY3QgdG8gdGhlIENvbW1vblRpbWVDb25maWcgc2VydmljZS4KLSAgICBzdGF0aWMgaW5saW5lIHNwPElDb21tb25UaW1lQ29uZmlnPiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZSgKLSAgICAgICAgICAgICAgICBJQ29tbW9uVGltZUNvbmZpZzo6a1NlcnZpY2VOYW1lKTsKLSAgICAgICAgc3A8SUNvbW1vblRpbWVDb25maWc+IGNsayA9IGludGVyZmFjZV9jYXN0PElDb21tb25UaW1lQ29uZmlnPihiaW5kZXIpOwotICAgICAgICByZXR1cm4gY2xrOwotICAgIH0KLX07Ci0KLWNsYXNzIEJuQ29tbW9uVGltZUNvbmZpZyA6IHB1YmxpYyBCbkludGVyZmFjZTxJQ29tbW9uVGltZUNvbmZpZz4gewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSUNPTU1PTlRJTUVDT05GSUdfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9jY19oZWxwZXIuaCBiL2luY2x1ZGUvY29tbW9uX3RpbWUvY2NfaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGQ1YzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb21tb25fdGltZS9jY19oZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQ0NfSEVMUEVSX0hfXwotI2RlZmluZSBfX0NDX0hFTFBFUl9IX18KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGNvbW1vbl90aW1lL0lDb21tb25DbG9jay5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBDQ0hlbHBlciBpcyBhIHNpbXBsZSB3cmFwcGVyIGNsYXNzIHRvIGhlbHAgd2l0aCBjZW50cmFsaXppbmcgYWNjZXNzIHRvIHRoZQotLy8gQ29tbW9uIENsb2NrIHNlcnZpY2UgYW5kIGltcGxlbWVudGluZyBsaWZldGltZSBtYW5hZ21lbnQsIGFzIHdlbGwgYXMgdG8KLS8vIGltcGxlbWVudCBhIHNpbXBsZSBwb2xpY3kgb2YgbWFraW5nIGEgYmFzaWMgYXR0ZW1wdCB0byByZWNvbm5lY3QgdG8gdGhlCi0vLyBjb21tb24gY2xvY2sgc2VydmljZSB3aGVuIHRoaW5ncyBnbyB3cm9uZy4KLS8vCi0vLyBPbiBwbGF0Zm9ybXMgd2hpY2ggcnVuIHRoZSBuYXRpdmUgY29tbW9uX3RpbWUgc2VydmljZSBpbiBhdXRvLWRpc2FibGUgbW9kZSwKLS8vIHRoZSBzZXJ2aWNlIHdpbGwgZ28gaW50byBuZXR3b3JrbGVzcyBtb2RlIHdoZW5ldmVyIGl0IGhhcyBubyBhY3RpdmUgY2xpZW50cy4KLS8vIEl0IHRyYWNrcyBhY3RpdmUgY2xpZW50cyB1c2luZyByZWdpc3RlcmVkIENvbW1vbkNsb2NrTGlzdGVuZXJzICh0aGUgY2FsbGJhY2sKLS8vIGludGVyZmFjZSBmb3Igb25UaW1lbGluZUNoYW5nZWQpIHNpbmNlIHRoaXMgcHJvdmlkZXMgYSBjb252aWVuZW50IGRlYXRoCi0vLyBoYW5kbGVyIG5vdGlmaWNhdGlvbiBmb3Igd2hlbiB0aGUgc2VydmljZSdzIGNsaWVudHMgZGllIHVuZXhwZWN0ZWRseS4gIFRoaXMKLS8vIG1lYW5zIHRoYXQgdXNlcnMgb2YgdGhlIGNvbW1vbiB0aW1lIHNlcnZpY2Ugc2hvdWxkIHJlYWxseSBhbHdheXMgaGF2ZSBhCi0vLyBDb21tb25DbG9ja0xpc3RlbmVyLCB1bmxlc3MgdGhleSBrbm93IHRoYXQgdGhlIHRpbWUgc2VydmljZSBpcyBub3QgcnVubmluZyBpbgotLy8gYXV0byBkaXNhYmxlZCBtb2RlLCBvciB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciByZWdpc3RlcmVkIGxpc3RlbmVyCi0vLyBhY3RpdmUgaW4gdGhlIHN5c3RlbS4gIFRoZSBDQ0hlbHBlciBtYWtlcyB0aGlzIGEgbGl0dGxlIGVhc2llciBieSBzaGFyaW5nIGEKLS8vIHJlZiBjb3VudGVkIElDb21tb25DbG9jayBpbnRlcmZhY2UgYWNyb3NzIGFsbCBjbGllbnRzIGFuZCBhdXRvbWF0aWNhbGx5Ci0vLyByZWdpc3RlcmluZyBhbmQgdW5yZWdpc3RlcmluZyBhIGxpc3RlbmVyIHdoZW5ldmVyIHRoZXJlIGFyZSBDQ0hlbHBlcgotLy8gaW5zdGFuY2VzIGFjdGl2ZSBpbiB0aGUgcHJvY2Vzcy4KLWNsYXNzIENDSGVscGVyIHsKLSAgcHVibGljOgotICAgIENDSGVscGVyKCk7Ci0gICAgfkNDSGVscGVyKCk7Ci0KLSAgICBzdGF0dXNfdCBpc0NvbW1vblRpbWVWYWxpZChib29sKiB2YWxpZCwgdWludDMyX3QqIHRpbWVsaW5lSUQpOwotICAgIHN0YXR1c190IGNvbW1vblRpbWVUb0xvY2FsVGltZShpbnQ2NF90IGNvbW1vblRpbWUsIGludDY0X3QqIGxvY2FsVGltZSk7Ci0gICAgc3RhdHVzX3QgbG9jYWxUaW1lVG9Db21tb25UaW1lKGludDY0X3QgbG9jYWxUaW1lLCBpbnQ2NF90KiBjb21tb25UaW1lKTsKLSAgICBzdGF0dXNfdCBnZXRDb21tb25UaW1lKGludDY0X3QqIGNvbW1vblRpbWUpOwotICAgIHN0YXR1c190IGdldENvbW1vbkZyZXEodWludDY0X3QqIGZyZXEpOwotICAgIHN0YXR1c190IGdldExvY2FsVGltZShpbnQ2NF90KiBsb2NhbFRpbWUpOwotICAgIHN0YXR1c190IGdldExvY2FsRnJlcSh1aW50NjRfdCogZnJlcSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBjbGFzcyBDb21tb25DbG9ja0xpc3RlbmVyIDogcHVibGljIEJuQ29tbW9uQ2xvY2tMaXN0ZW5lciB7Ci0gICAgICBwdWJsaWM6Ci0gICAgICAgIHZvaWQgb25UaW1lbGluZUNoYW5nZWQodWludDY0X3QgdGltZWxpbmVJRCk7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBib29sIHZlcmlmeUNsb2NrX2woKTsKLQotICAgIHN0YXRpYyBNdXRleCBsb2NrXzsKLSAgICBzdGF0aWMgc3A8SUNvbW1vbkNsb2NrPiBjb21tb25fY2xvY2tfOwotICAgIHN0YXRpYyBzcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4gY29tbW9uX2Nsb2NrX2xpc3RlbmVyXzsKLSAgICBzdGF0aWMgdWludDMyX3QgcmVmX2NvdW50XzsKLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSNlbmRpZiAgLy8gX19DQ19IRUxQRVJfSF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmggYi9pbmNsdWRlL2NvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NGMzZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBfX0xPQ0FMX0NMT0NLX0hfXwotI2RlZmluZSBfX0xPQ0FMX0NMT0NLX0hfXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9sb2NhbF90aW1lX2hhbC5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBMb2NhbENsb2NrIHsKLSAgcHVibGljOgotICAgIExvY2FsQ2xvY2soKTsKLQotICAgIGJvb2wgaW5pdENoZWNrKCk7Ci0KLSAgICBpbnQ2NF90ICBnZXRMb2NhbFRpbWUoKTsKLSAgICB1aW50NjRfdCBnZXRMb2NhbEZyZXEoKTsKLSAgICBzdGF0dXNfdCBzZXRMb2NhbFNsZXcoaW50MTZfdCByYXRlKTsKLSAgICBpbnQzMl90ICBnZXREZWJ1Z0xvZyhzdHJ1Y3QgbG9jYWxfdGltZV9kZWJ1Z19ldmVudCogcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JlY29yZHMpOwotCi0gIHByaXZhdGU6Ci0gICAgc3RhdGljIE11dGV4IGRldl9sb2NrXzsKLSAgICBzdGF0aWMgbG9jYWxfdGltZV9od19kZXZpY2VfdCogZGV2XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYgIC8vIF9fTE9DQUxfQ0xPQ0tfSF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yN2JhNDcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hZTdjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDU1ODY1N2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWE5OTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0jZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gbWFzdGVyaW5nX2luZGljYXRpb24gewotICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAotICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCi0gICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAotICAgIE1BU1RFUkVEX0ZPUl8zRCwKLSAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAotfTsKLQotc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGludDMyX3QgbVByZXNlbnRhdGlvbklkOwotICAgIGludDMyX3QgbVByb2dyYW1JZDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFiZWxzOwotICAgIFN0cmluZzggbUxhbmd1YWdlOwotICAgIGludDMyX3QgbU1hc3RlcmluZ0luZGljYXRpb247Ci0gICAgYm9vbCBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZTsKLSAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGU7Ci0gICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZTsKLQotICAgIEF1ZGlvUHJlc2VudGF0aW9uKCkgewotICAgICAgICBtUHJlc2VudGF0aW9uSWQgPSAtMTsKLSAgICAgICAgbVByb2dyYW1JZCA9IC0xOwotICAgICAgICBtTGFuZ3VhZ2UgPSAiIjsKLSAgICAgICAgbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKLSAgICAgICAgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOwotICAgIH0KLX07Ci0KLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvUHJlc2VudGF0aW9uPj4gQXVkaW9QcmVzZW50YXRpb25zOwotCi1jbGFzcyBBdWRpb1ByZXNlbnRhdGlvbkluZm8gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gcHVibGljOgotICAgIEF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgfkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgdm9pZCBhZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbik7Ci0KLSAgICBzaXplX3QgY291bnRQcmVzZW50YXRpb25zKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gZ2V0UHJlc2VudGF0aW9uKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAgIEF1ZGlvUHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42YmZhZjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDZmMWM5OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAppbmRleCA5MDViZWMxLi4xOThiMjdlIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitzdGFnZWZyaWdodC9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKaW5kZXggNTRjODA0Ny4uZDJhYjJmMSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaCBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YjJjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlMmRkMDgyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNGIzNWZlMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NDcyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVRyYWNrOworY2xhc3MgTWV0YURhdGFCYXNlOworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitleHRlcm4gIkMiIHsKKworc3RydWN0IENEYXRhU291cmNlIHsKKyAgICBzc2l6ZV90ICgqcmVhZEF0KSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgKCpnZXRTaXplKSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmhhbmRsZSApOworICAgIGJvb2wgKCpnZXRVcmkpKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisgICAgdm9pZCAqaGFuZGxlOworfTsKKworZW51bSBDTWVkaWFUcmFja1JlYWRPcHRpb25zIDogdWludDMyX3QgeworICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IDAsCisgICAgU0VFS19ORVhUX1NZTkMgPSAxLAorICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gMiwKKyAgICBTRUVLX0NMT1NFU1QgPSAzLAorICAgIFNFRUtfRlJBTUVfSU5ERVggPSA0LAorICAgIFNFRUsgPSA4LAorICAgIE5PTkJMT0NLSU5HID0gMTYKK307CisKKy8qKgorICogb25seSB1c2UgQ01lZGlhQnVmZmVyIGFsbG9jYXRlZCBmcm9tIHRoZSBDTWVkaWFCdWZmZXJHcm91cCB0aGF0IGlzCisgKiBwcm92aWRlZCB0byBDTWVkaWFUcmFjazo6c3RhcnQoKQorICovCitzdHJ1Y3QgQ01lZGlhQnVmZmVyIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCogKCpkYXRhKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnNpemUpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2Vfb2Zmc2V0KSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX2xlbmd0aCkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkICgqc2V0X3JhbmdlKSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworICAgIEFNZWRpYUZvcm1hdCogKCptZXRhX2RhdGEpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhQnVmZmVyR3JvdXAgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBib29sICgqaW5pdCkodm9pZCAqaGFuZGxlLCBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworICAgIHZvaWQgKCphZGRfYnVmZmVyKSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmFjcXVpcmVfYnVmZmVyKSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKTsKKyAgICBib29sICgqaGFzX2J1ZmZlcnMpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhVHJhY2sgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0b3ApKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0Rm9ybWF0KSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpyZWFkKSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKTsKKyAgICBib29sICAgICAoKnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3IgeworICAgIHZvaWQgKmRhdGE7CisKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisgICAgc2l6ZV90ICgqY291bnRUcmFja3MpKHZvaWQgKmRhdGEpOworICAgIENNZWRpYVRyYWNrKiAoKmdldFRyYWNrKSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0VHJhY2tNZXRhRGF0YSkoCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldE1ldGFEYXRhKSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqc2V0TWVkaWFDYXMpKHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7CisgICAgY29uc3QgY2hhciAqICgqbmFtZSkodm9pZCAqZGF0YSk7Cit9OworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Cit0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOworCisvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKy8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKKy8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCit0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jIENyZWF0b3JGdW5jOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90IGJbMTZdOworfSBtZWRpYV91dWlkX3Q7CisKK3N0cnVjdCBFeHRyYWN0b3JEZWYgeworICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247CisKKyAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICBtZWRpYV91dWlkX3QgZXh0cmFjdG9yX3V1aWQ7CisKKyAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgLy8gYmUgdXNlZC4KKyAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOworCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU25pZmZlckZ1bmMgc25pZmY7CisgICAgICAgIH0gdjI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgICAgIC8vIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgY29udGFpbmVyIG1pbWUgdHlwZXMgYW5kL29yIGZpbGUgZXh0ZW5zaW9ucworICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cworICAgICAgICAgICAgY29uc3QgY2hhciAqKnN1cHBvcnRlZF90eXBlczsKKyAgICAgICAgfSB2MzsKKyAgICB9IHU7Cit9OworCisvLyB0aGUgQysrIGJhc2VkIEFQSSB3aGljaCBmaXJzdCBzaGlwcGVkIGluIFAgYW5kIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0xFR0FDWSA9IDE7CisKKy8vIHRoZSBmaXJzdCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSA9IDI7CisKKy8vIHRoZSBzZWNvbmQgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIgPSAzOworCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMjsKKworLy8gZWFjaCBwbHVnaW4gbGlicmFyeSBleHBvcnRzIG9uZSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUKK3R5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOworCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXI7CisKK2NsYXNzIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKik7CisgICAgQ01lZGlhQnVmZmVyICptQnVmZmVyOworcHVibGljOgorICAgIE1lZGlhQnVmZmVySGVscGVyKENNZWRpYUJ1ZmZlciAqYnVmKSB7CisgICAgICAgIG1CdWZmZXIgPSBidWY7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1CdWZmZXItPnJlbGVhc2UobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnNpemUobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9vZmZzZXQobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9sZW5ndGgobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKG1CdWZmZXItPmhhbmRsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+bWV0YV9kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cEhlbHBlciB7Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgc3RkOjptYXA8Q01lZGlhQnVmZmVyKiwgTWVkaWFCdWZmZXJIZWxwZXIqPiBtQnVmZmVySGVscGVyczsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKENNZWRpYUJ1ZmZlckdyb3VwICpncm91cCkgeworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICB9CisgICAgfk1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoKSB7CisgICAgICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXAKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmdyb3VwICVwIG1hcCBoYXMgJXp1IGVudHJpZXMiLCB0aGlzLCBtQnVmZmVySGVscGVycy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVySGVscGVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySGVscGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aW5pdChtR3JvdXAtPmhhbmRsZSwgYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICB9CisgICAgdm9pZCBhZGRfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKSB7CisgICAgICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCAmYnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIGhlbHBlciA9IG1CdWZmZXJIZWxwZXJzLmZpbmQoYnVmKTsKKyAgICAgICAgICAgIGlmIChoZWxwZXIgPT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogbmV3SGVscGVyID0gbmV3IE1lZGlhQnVmZmVySGVscGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckhlbHBlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJ1ZiwgbmV3SGVscGVyKSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ld0hlbHBlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGhlbHBlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYm9vbCBoYXNfYnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aGFzX2J1ZmZlcnMobUdyb3VwLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXIgeworcHVibGljOgorICAgIE1lZGlhVHJhY2tIZWxwZXIoKSA6IG1CdWZmZXJHcm91cChudWxscHRyKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgfQorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gZmFsc2U7IH0KK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKK307CisKK2lubGluZSBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIGlmICh0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlciA9IChDTWVkaWFUcmFjayopIG1hbGxvYyhzaXplb2YoQ01lZGlhVHJhY2spKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0YXJ0ID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIGlmICgoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGhhbmRsZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIGRlbGV0ZSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoYnVmZmVyR3JvdXApOworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RhcnQoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0b3AgPSBbXSh2b2lkICpkYXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPmdldEZvcm1hdChtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnJlYWQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsICB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykKKyAgICAgICAgICAgIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgb3B0cyhvcHRpb25zLCBzZWVrUG9zVXMpOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmID0gTlVMTDsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+cmVhZCgmYnVmLCAmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gYnVmLT5tQnVmZmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCA9IFtdKHZvaWQgKmRhdGEpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKworLy8gZXh0cmFjdG9yIHBsdWdpbnMgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgd2hpY2ggbG9va3MgcmVtYXJrYWJseQorLy8gbGlrZSBNZWRpYUV4dHJhY3RvciBhbmQgY2FuIGJlIGVhc2lseSB3cmFwcGVkIGluIHRoZSByZXF1aXJlZCBDIEFQSQorY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcihjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworfTsKKworaW5saW5lIENNZWRpYUV4dHJhY3RvciAqd3JhcChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqZXh0cmFjdG9yKSB7CisgICAgQ01lZGlhRXh0cmFjdG9yICp3cmFwcGVyID0gKENNZWRpYUV4dHJhY3RvciopIG1hbGxvYyhzaXplb2YoQ01lZGlhRXh0cmFjdG9yKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IGV4dHJhY3RvcjsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmNvdW50VHJhY2tzID0gW10odm9pZCAqZGF0YSkgLT4gc2l6ZV90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5jb3VudFRyYWNrcygpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2sgPSBbXSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpIC0+IENNZWRpYVRyYWNrKiB7CisgICAgICAgIHJldHVybiB3cmFwKCgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFjayhpbmRleCkpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2tNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFja01ldGFEYXRhKG1ldGEsIGluZGV4LCBmbGFncyk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldE1ldGFEYXRhKG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+ZmxhZ3MgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5mbGFncygpOworICAgIH07CisgICAgd3JhcHBlci0+c2V0TWVkaWFDYXMgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPnNldE1lZGlhQ2FzKGNhc1Rva2VuLCBzaXplKTsKKyAgICB9OworICAgIHdyYXBwZXItPm5hbWUgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IGNvbnN0IGNoYXIgKiB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+bmFtZSgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKy8qIGFkZHMgc29tZSBjb252aWVuY2UgbWV0aG9kcyAqLworY2xhc3MgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgeworICAgICAgICBtU291cmNlID0gc291cmNlLT5tU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkobVNvdXJjZS0+aGFuZGxlLCB1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5mbGFncyhtU291cmNlLT5oYW5kbGUpOworICAgIH0KKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDMpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgMTYpIHwgKGJ5dGVbMV0gPDwgOCkgfCBieXRlWzJdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9obCh0bXApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoKHVpbnQ2NF90KW50b2hsKHRtcCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHRtcCA+PiAzMik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKKworCisvLyBoZWxwZXJzIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwKKworLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgorLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCitpbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgeworICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKKyAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NvbnN0ZXhwciBtZWRpYV91dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgbWVkaWFfdXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBtZWRpYV91dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmNzU3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCmluZGV4IDJlMTQ3YzQuLjM0YmY2NWQgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVhNjMyODdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2ViYTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworc3RydWN0IENNZWRpYVRyYWNrOworCitjbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKK3N0cnVjdCBNZWRpYVRyYWNrCisvLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCit7CisgICAgTWVkaWFUcmFjaygpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgeworICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCwKKyAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVggPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1PcHRpb25zID0gMDsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOworICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCkgeworICAgICAgICAgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKKworICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCisgICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgeworICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZW51bSBPcHRpb25zIHsKKyAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKKworICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKKyAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAvLyBpcyByZWFjaGVkLgorICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCisgICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKKyAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCisgICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8cmVhZHwgc3VwcG9ydHMgbm9uYmxvY2tpbmcgb3B0aW9uLCBvdGhlcndpc2UgZmFsc2UuCisgICAgLy8gfHJlYWRNdWx0aXBsZXwgaWYgc3VwcG9ydGVkLCBhbHdheXMgYWxsb3dzIHRoZSBub25ibG9ja2luZyBvcHRpb24uCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOworICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOworfTsKKworY2xhc3MgTWVkaWFUcmFja0NVbndyYXBwZXIgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgc3RhdGljIE1lZGlhVHJhY2tDVW53cmFwcGVyICpjcmVhdGUoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tDVW53cmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgTWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworICAgIENNZWRpYVRyYWNrICp3cmFwcGVyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmJhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKGFuZHJvaWQ6OnN0YXR1c190KTsKKworYW5kcm9pZDo6c3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QpOworCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9QUklWX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGE0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTWVzc2FnZT4gbUZvcm1hdDsKKyAgICBhbmRyb2lkOjpTdHJpbmc4IG1EZWJ1ZzsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCmluZGV4IGUzZWYxMzQuLjg1ZTE3ZjkgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmggYi9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCmluZGV4IGEzYWFlY2UuLjc5YWZkNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaApAQCAtNTUxLDcgKzU1MSw3IEBACiAKICAgICBzdGF0aWMgaW50NjRfdCBjb252ZXJ0VGltZXNwZWNUb1VzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCiAgICAgewotICAgICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CisgICAgICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwMDAwTEwgKyB0di50dl9uc2VjIC8gMTAwMDsKICAgICB9CiAKICAgICAvLyBjdXJyZW50IG1vbm90b25pYyB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFkYWE0ODkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmggYi9pbmNsdWRlL21lZGlhZHJtL0NyeXB0by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA5YWY2NDk1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0by5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYWRybS9Ecm0uaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFjNjAwMDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYWRybS9Ecm0uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCBjYTExOWQ1Li41ZjE5Zjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTUzOCw2ICs1MzgsMTAgQEAKICAgICAgICAgbVRpbWVzdGFtcE11dGF0b3IucHVzaCh0aW1lc3RhbXApOwogICAgIH0KIAorICAgIHZpcnR1YWwgRXh0ZW5kZWRUaW1lc3RhbXAgZ2V0VGltZXN0YW1wKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRpbWVzdGFtcE11dGF0b3IubGFzdCgpOworICAgIH0KKwogICAgIC8vIEZsdXNoZXMgdGhlIHNoYXJlZCByaW5nIGJ1ZmZlciBpZiB0aGUgY2xpZW50IGhhZCByZXF1ZXN0ZWQgaXQgdXNpbmcgbVN0cmVhbWluZy5tRmx1c2guCiAgICAgLy8gSWYgZmx1c2ggb2NjdXJzIHRoZW46CiAgICAgLy8gICBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250LCBTZXJ2ZXJQcm94eTo6bUZsdXNoIGFuZCBTZXJ2ZXJQcm94eTo6bUZsdXNoZWQgd2lsbCBiZSBtb2RpZmllZApAQCAtNTUxLDYgKzU1NSw5IEBACiAgICAgLy8gVG90YWwgY291bnQgb2YgdGhlIG51bWJlciBvZiBmbHVzaGVkIGZyYW1lcyBzaW5jZSBjcmVhdGlvbiAobmV2ZXIgcmVzZXQpLgogICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZnJhbWVzRmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaGVkOyB9CiAKKyAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB3aXRoIG5vIHNpZGUgZWZmZWN0cy4KKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0ID0gMDsKKwogICAgIC8vIEdldCBkeW5hbWljIGJ1ZmZlciBzaXplIGZyb20gdGhlIHNoYXJlZCBjb250cm9sIGJsb2NrLgogICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKChpbnQzMl90ICopJm1DYmxrLT5tQnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTU4OCw4ICs1OTUsNyBAQAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHkoKTsKIAotICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHVzZWQgYnkgZHVtcCgpIC0gdGhpcyBoYXMgbm8gc2lkZSBlZmZlY3RzLgotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Q7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IHNlcnZlci4KIAogICAgIC8vIEN1cnJlbnRseSBBdWRpb0ZsaW5nZXIgd2lsbCBjYWxsIGZyYW1lc1JlYWR5KCkgZm9yIGEgZmFzdCB0cmFjayBmcm9tIHR3byB0aHJlYWRzOgogICAgIC8vIEZhc3RNaXhlciB0aHJlYWQsIGFuZCBub3JtYWwgbWl4ZXIgdGhyZWFkLiAgVGhpcyBpcyBkYW5nZXJvdXMsIGFzIHRoZSBwcm94eSBpcyBpbnRlbmRlZApAQCAtNjkzLDYgKzY5OSw4IEBACiAgICAgICAgIHJldHVybiBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOyAvLyBGb3IgY29tcGxldGVuZXNzIG9ubHk7IG1SZWFyIHdyaXR0ZW4gYnkgc2VydmVyLgogICAgIH0KIAorICAgIHNpemVfdCBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsgLy8gZnJhbWVzIGF2YWlsYWJsZSB0byByZWFkIGJ5IGNsaWVudC4KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkU2VydmVyUHJveHkoKSB7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKaW5kZXggNWZkOGViMi4uYzM1N2NhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtNDAsNiArNDAsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggYWUwY2IwMS4uMWZhZWIwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMzMsMTIgKzMzLDE0IEBACiAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckh3U2VydmljZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKaW5kZXggN2EyOWUzMS4uY2NjNjFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKQEAgLTM2LDEwICszNiwxMiBAQAogCiAgICAgdmlydHVhbCB+U291bmRUcmlnZ2VyKCk7CiAKLSAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgIHN0YXRpYyAgc3RhdHVzX3QgbGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKLSAgICBzdGF0aWMgIHNwPFNvdW5kVHJpZ2dlcj4gYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXRpYyAgc3A8U291bmRUcmlnZ2VyPiBhdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAogICAgIHN0YXRpYyAgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKTsKIApAQCAtNTIsNiArNTQsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICAgICAgIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggZDQ5ZWI4ZC4uMWFmYzI1MyAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtMSw5ICsxLDEyIEBACithbmRyZXdsZXdpc0Bnb29nbGUuY29tCiBjaHpAZ29vZ2xlLmNvbQogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCitqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KQEAgLTE1LDUgKzE4LDYgQEAKIHJhY2hhZEBnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KIHJvYmVydHNoaWhAZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KIHdqaWFAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDcwYzI4MWEuLjMzYjM2YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtNCw3ICs0LDYgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAltYWluX2F1ZGlvc2VydmVyLmNwcCBcCi0JLi4vbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmFhdWRpb3NlcnZpY2UgXApAQCAtMTMsMTMgKzEyLDE3IEBACiAJbGliYmluZGVyIFwKIAlsaWJjdXRpbHMgXAogCWxpYmxvZyBcCisJbGliaGlkbGJhc2UgXAogCWxpYmhpZGx0cmFuc3BvcnQgXAogCWxpYmh3YmluZGVyIFwKIAlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKKwlsaWJtZWRpYXV0aWxzIFwKIAlsaWJuYmFpbyBcCisJbGlibmJsb2cgXAogCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAotCWxpYnV0aWxzCisJbGlidXRpbHMgXAorCWxpYnZpYnJhdG9yCiAKICMgVE9ETyBvYm9lc2VydmljZSBpcyB0aGUgb2xkIGZvbGRlciBuYW1lIGZvciBhYXVkaW9zZXJ2aWNlLiBJdCB3aWxsIGJlIGNoYW5nZWQuCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKQEAgLTQwLDkgKzQzLDYgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKLUxPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKLQogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCkBAIC01NCwxMyArNTQsOSBAQAogIyAgIGJvdGggICAgdG8gYnVpbGQgYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBsaWJyYXJpZXMsCiAjICAgICAgICAgICBhbmQgdXNlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoMzIgb3IgNjQpIGZvciBhdWRpb3NlcnZlci4KICMgICBmaXJzdCAgIHRvIGJ1aWxkIGxpYnJhcmllcyBhbmQgYXVkaW9zZXJ2ZXIgZm9yIHRoZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgb25seS4KLSMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIDMyIGJpdCBhdWRpb3NlcnZlci4KKyMgICA8ZW1wdHk+IHRvIGJ1aWxkIGJvdGggMzIgYW5kIDY0IGJpdCBsaWJyYXJpZXMgYW5kIHByaW1hcnkgdGFyZ2V0IGF1ZGlvc2VydmVyLgogCi1pZmVxICgkKHN0cmlwICQoQVVESU9TRVJWRVJfTVVMVElMSUIpKSwpCi1MT0NBTF9NVUxUSUxJQiA6PSAzMgotZWxzZQogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLWVuZGlmCiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgogCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCmluZGV4IDc1Njc1YTkuLmRmYjFhM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjCkBAIC0yLDEwICsyLDEyIEBACiAgICAgY2xhc3MgY29yZQogICAgIHVzZXIgYXVkaW9zZXJ2ZXIKICAgICAjIG1lZGlhIGdpZCBuZWVkZWQgZm9yIC9kZXYvZm0gKHJhZGlvKSBhbmQgZm9yIC9kYXRhL21pc2MvbWVkaWEgKHRlZSkKLSAgICBncm91cCBhdWRpbyBjYW1lcmEgZHJtcnBjIGluZXQgbWVkaWEgbWVkaWFkcm0gbmV0X2J0IG5ldF9idF9hZG1pbiBuZXRfYndfYWNjdAorICAgIGdyb3VwIGF1ZGlvIGNhbWVyYSBkcm1ycGMgaW5ldCBtZWRpYSBtZWRpYWRybSBuZXRfYnQgbmV0X2J0X2FkbWluIG5ldF9id19hY2N0IHdha2Vsb2NrCisgICAgY2FwYWJpbGl0aWVzIEJMT0NLX1NVU1BFTkQKICAgICBpb3ByaW8gcnQgNAogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MgL2Rldi9zdHVuZS9mb3JlZ3JvdW5kL3Rhc2tzCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIHVwZ3JhZGluZwogICAgICMgTy1NUjEgZGV2aWNlcyB3aXRoIGZyYW1ld29yay1vbmx5LgogICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKQEAgLTE0LDMgKzE2LDYgQEAKICAgICBzdG9wIGF1ZGlvc2VydmVyCiBvbiBwcm9wZXJ0eTp2dHMubmF0aXZlX3NlcnZlci5vbj0wCiAgICAgc3RhcnQgYXVkaW9zZXJ2ZXIKKworb24gaW5pdAorICAgIG1rZGlyIC9kZXYvc29ja2V0L2F1ZGlvc2VydmVyIDA3NzUgYXVkaW9zZXJ2ZXIgYXVkaW9zZXJ2ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRmYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiBmbXFEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoJmNvbm5lY3Rpb24sICZjb25uZWN0aW9uSWQsICZmbXFEZXNjLCBmYWxzZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCAqZm1xRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQWNjZXNzb3I6OkFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgIDogbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQWNjZXNzb3I6On5BY2Nlc3NvcigpIHsKK30KKworYm9vbCBBY2Nlc3Nvcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gKGJvb2wpbUltcGw7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QodGhpcywgY29ubmVjdGlvbiwgcENvbm5lY3Rpb25JZCwgZm1xRGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg2ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IEFjY2Vzc29yOworc3RydWN0IENvbm5lY3Rpb247CisKKy8qKgorICogUmVjZWl2ZXMgZGVhdGggbm90aWZpY2F0aW9ucyBmcm9tIHJlbW90ZSBjb25uZWN0aW9ucy4KKyAqIE9uIGRlYXRoIG5vdGlmaWNhdGlvbnMsIHRoZSBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCB1c2VkIHJlc291cmNlcworICogYXJlIHJlbGVhc2VkLgorICovCitzdHJ1Y3QgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3bHkgY29ubmVjdGVkIGNvbm5lY3Rpb24gZnJvbSByZW1vdGUgcHJvY2Vzc2VzLgorICAgICAqLworICAgIHZvaWQgYWRkKGludDY0X3QgY29ubmVjdGlvbklkLCBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZvaWQgYWRkQ29va2llVG9Db25uZWN0aW9uKHVpbnQ2NF90IGNvb2tpZSwgaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxpbnQ2NF90Pj4gIG1Db29raWVUb0Nvbm5lY3Rpb25zOworICAgIHN0ZDo6bWFwPGludDY0X3QsIHVpbnQ2NF90PiBtQ29ubmVjdGlvblRvQ29va2llOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gbUFjY2Vzc29yczsKK307CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCBlbmFibGVzIGEgYnVmZmVyIHBvb2wgdG8gY29tbXVuaWNhdGUgd2l0aCBidWZmZXIKKyAqIHBvb2wgY2xpZW50cy4gMToxIGNvcnJlc3BvbmRlbnNlIGhvbGRzIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgYW4gYWNjZXNzb3IuCisgKi8KK3N0cnVjdCBBY2Nlc3NvciA6IHB1YmxpYyBJQWNjZXNzb3IgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IG1hZGUuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE3ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCituYW1lc3BhY2UgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSA1MDAwMDA7IC8vIFRPRE8gdHVuZSAwLjUgc2VjCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtMb2dEdXJhdGlvblVzID0gNTAwMDAwMDsgLy8gNSBzZWNzCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gNDA7Cit9CisKKy8vIEJ1ZmZlciBzdHJ1Y3R1cmUgaW4gYnVmZmVycG9vbCBwcm9jZXNzCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXIgeworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBzaXplX3QgbU93bmVyQ291bnQ7CisgICAgc2l6ZV90IG1UcmFuc2FjdGlvbkNvdW50OworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgY29uc3Qgc2l6ZV90IG1BbGxvY1NpemU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUNvbmZpZzsKKworICAgIEludGVybmFsQnVmZmVyKAorICAgICAgICAgICAgQnVmZmVySWQgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYWxsb2NDb25maWcpCisgICAgICAgICAgICA6IG1JZChpZCksIG1Pd25lckNvdW50KDApLCBtVHJhbnNhY3Rpb25Db3VudCgwKSwKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwgbUFsbG9jU2l6ZShhbGxvY1NpemUpLCBtQ29uZmlnKGFsbG9jQ29uZmlnKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIGZtcURlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSB7fQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wgJXAgIgorICAgICAgICAgICJjYWNoZWQ6ICV6dS8lenVNLCAlenUvJWQlJSBpbiB1c2U7ICIKKyAgICAgICAgICAiYWxsb2NzOiAlenUsICVkJSUgcmVjeWNsZWQ7ICIKKyAgICAgICAgICAidHJhbnNmZXJzOiAlenUsICVkJSUgdW5mZXRjZWQiLAorICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkID4+IDIwLAorICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBwZXJjZW50YWdlKG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucyksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycywKKyAgICAgICAgICBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMgLSBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycykpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbCAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytmcmVlSXQ7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjkgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxMjM5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQoKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7IC8vIFRPRE86IGltcGxlbWVudAorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSW52YWxpZGF0ZWQoZmFsc2UpLCBtSGFzQ2FjaGUoZmFsc2UpLAorICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgICh2b2lkKW1JbnZhbGlkYXRlZDsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICpmbXFEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIHRydWUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpmbXFEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRDaGFubmVsXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciYgZGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KGRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZighdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInN5bmMgZnJvbSBjbGllbnQgJWxsZCBmYWlsZWQ6IGJ1ZmZlcnBvb2wgcHJvY2VzcyBkaWVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgIH0KKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlCisgKiBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEFuIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcworICogYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg5NzAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICAgICAgICAgICAgICBidWZmZXIuaWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgICAgICBidWZmZXIuYnVmZmVyID0gaGFuZGxlOworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICBidWZmZXIuaWQgPSAwOworICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworCisgICAgX2hpZGxfY2Ioc3RhdHVzLCBidWZmZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTljYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBmMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgUXVldWVEZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1Nzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTY4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2ViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I0NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCk7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIHVpbnQzMl90IG1zZ0lkOworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqIGZtcURlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciogaW52RGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIGZhbHNlLCAmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJm1zZ0lkLCAmZm1xRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgbXNnSWQsICpmbXFEZXNjLCAqaW52RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLCAwLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yVW5zeW5jPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZsdXNoKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLCBib29sIGxvY2FsLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KAorICAgICAgICAgICAgICAgIHRoaXMsIG9ic2VydmVyLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBwTXNnSWQsCisgICAgICAgICAgICAgICAgc3RhdHVzRGVzY1B0ciwgaW52RGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgb3duZWQgYnkgYnVmZmVycG9vbCAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVyICAgICAgY2xpZW50IG9ic2VydmVyIGZvciBidWZmZXIgaW52YWxpZGF0aW9uCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcE1zZ0lkICAgICAgICB0aGUgaWQgb2YgdGhlIHJlY2VudCBidWZmZXIgcG9vbCBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXR1c0Rlc2NQdHIgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludkRlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGZyb20gYSBidWZmZXIgcG9vbCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZjAwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw4NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworICAgIGJvb2wgbUludmFsaWRhdGVkOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpLAorICAgICAgICAgICAgbUludmFsaWRhdGVkKGZhbHNlKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtSW52YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBzdGF0dXNEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICAqcE1zZ0lkID0gbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbkNoYW5uZWwuZ2V0RGVzYyhpbnZEZXNjUHRyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ29ubmVjdChpZCwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBBTE9HVigiY29ubmVjdGlvbiBjbG9zZSAlbGxkOiAldSIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkLCBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JZCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmZsdXNoKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuZmx1c2goc2hhcmVkX2Zyb21fdGhpcygpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aGFuZGxlSW52YWxpZGF0ZUFjaygpIHsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG9ic2VydmVyczsKKyAgICB1aW50MzJfdCBpbnZhbGlkYXRpb25JZDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uSGFuZGxlQWNrKCZvYnNlcnZlcnMsICZpbnZhbGlkYXRpb25JZCk7CisgICAgfQorICAgIC8vIERvIG5vdCBob2xkIGxvY2sgZm9yIHNlbmQgaW52YWxpZGF0aW9ucworICAgIHNpemVfdCBkZWFkQ2xpZW50cyA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gb2JzZXJ2ZXJzLmJlZ2luKCk7IGl0ICE9IG9ic2VydmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBvYnNlcnZlci0+b25NZXNzYWdlKGl0LT5maXJzdCwgaW52YWxpZGF0aW9uSWQpOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICArK2RlYWRDbGllbnRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkZWFkQ2xpZW50cyA+IDApIHsKKyAgICAgICAgQUxPR0QoIkR1cmluZyBpbnZhbGlkYXRpb24gZm91bmQgJXp1IGRlYWQgY2xpZW50cyIsIGRlYWRDbGllbnRzKTsKKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJQb29sLmlzVmFsaWQoKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApLAorICAgICAgbVN0YXJ0U2VxKDApIHsKKyAgICBtVmFsaWQgPSBtSW52YWxpZGF0aW9uQ2hhbm5lbC5pc1ZhbGlkKCk7Cit9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6c0ludlNlcUlkKDApOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sMiAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25Db25uZWN0KAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyKSB7CisgICAgbUFja3NbY29uSWRdID0gbUludmFsaWRhdGlvbklkOyAvLyBzdGFydHMgZnJvbSBjdXJyZW50IGludmFsaWRhdGlvbklkCisgICAgbU9ic2VydmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIG9ic2VydmVyKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpIHsKKyAgICBtQWNrcy5lcmFzZShjb25JZCk7CisgICAgbU9ic2VydmVycy5lcmFzZShjb25JZCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25BY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwKKyAgICAgICAgdWludDMyX3QgbXNnSWQpIHsKKyAgICBhdXRvIGl0ID0gbUFja3MuZmluZChjb25JZCk7CisgICAgaWYgKGl0ID09IG1BY2tzLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCJBQ0sgZnJvbSBpbmNvbnNpc3RlbnQgY29ubmVjdGlvbiEgJWxsZCIsIChsb25nIGxvbmcpY29uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc01lc3NhZ2VMYXRlcihtc2dJZCwgaXQtPnNlY29uZCkpIHsKKyAgICAgICAgbUFja3NbY29uSWRdID0gbXNnSWQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdzLmJlZ2luKCk7IGl0ICE9IG1QZW5kaW5ncy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGl0LT5pc0ludmFsaWRhdGVkKGJ1ZmZlcklkKSkgeworICAgICAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgICAgICAgICAgaWYgKGl0LT5tTmVlZHNBY2spIHsKKyAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgaXQtPm1Gcm9tLCBpdC0+bVRvKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywKKyAgICAgICAgdWludDMyX3QgZnJvbSwKKyAgICAgICAgdWludDMyX3QgdG8sCisgICAgICAgIHNpemVfdCBsZWZ0LAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICBpZiAobmVlZHNBY2spIHsKKyAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiYnVmZmVycG9vbDIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcXVldWVkIik7CisgICAgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICBjaGFubmVsLnBvc3RJbnZhbGlkYXRpb24obXNnSWQsIGZyb20sIHRvKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBzZW5kaW5nIGhpbnQgbWVzc2FnZT8KKyAgICAgICAgQUxPR1YoImJ1ZmZlcnBvbzIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcGVuZGluZyIpOworICAgICAgICBQZW5kaW5nIHBlbmRpbmcobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBpbXBsKTsKKyAgICAgICAgbVBlbmRpbmdzLnB1c2hfYmFjayhwZW5kaW5nKTsKKyAgICB9CisgICAgc0ludmFsaWRhdG9yLT5hZGRBY2Nlc3NvcihtSWQsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSGFuZGxlQWNrKAorICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCkgeworICAgIGlmIChtSW52YWxpZGF0aW9uSWQgIT0gMCkgeworICAgICAgICAqaW52YWxpZGF0aW9uSWQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIHN0ZDo6c2V0PGludD4gZGVhZHM7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY2tzLmJlZ2luKCk7IGl0ICE9IG1BY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZCAhPSBtSW52YWxpZGF0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gbU9ic2VydmVyc1tpdC0+Zmlyc3RdOworICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMtPmVtcGxhY2UoaXQtPmZpcnN0LCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb25uZWN0aW9uICVsbGQgd2lsbCBjYWxsIG9ic2VydmVyICgldTogJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdC0+Zmlyc3QsIGl0LT5zZWNvbmQsIG1JbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE4uQjogb25NZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGxhdGVyLiBpZ25vcmUgcG9zc2liaWxpdHkgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gb25NZXNzYWdlIyBvbmV3YXkgY2FsbCBiZWluZyBsb3N0LgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kID0gbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXJwb29sMiBvYnNlcnZlciBkaWVkICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIGRlYWRzLmluc2VydChpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZGVhZHMuYmVnaW4oKTsgaXQgIT0gZGVhZHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBvbkNsb3NlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1QZW5kaW5ncy5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBBbGwgaW52YWxpZGF0aW9uIElkcyBhcmUgc3luY2VkIGFuZCBubyBtb3JlIHBlbmRpbmcgaW52YWxpZGF0aW9ucy4KKyAgICAgICAgc0ludmFsaWRhdG9yLT5kZWxBY2Nlc3NvcihtSWQpOworICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChtZXNzYWdlLmJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s6CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkFjayhtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HVygiYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbHVyZSAtIG1lc3NhZ2UgOiAlZCBjb25uZWN0aW9uIDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cywgKGxvbmcgbG9uZyltZXNzYWdlLmNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZXMuY2xlYXIoKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIC8vIENsZWFuaW5nIGJ1ZmZlcnMKKyAgICBhdXRvIGJ1ZmZlcnMgPSBtVXNpbmdCdWZmZXJzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoYnVmZmVycyAhPSBtVXNpbmdCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgQnVmZmVySWQmIGJ1ZmZlcklkIDogYnVmZmVycy0+c2Vjb25kKSB7CisgICAgICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVVzaW5nQnVmZmVycy5lcmFzZShidWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbmluZyB0cmFuc2FjdGlvbnMKKyAgICBhdXRvIHBlbmRpbmcgPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKHBlbmRpbmcgIT0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBUcmFuc2FjdGlvbklkJiB0cmFuc2FjdGlvbklkIDogcGVuZGluZy0+c2Vjb25kKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gaXRlci0+c2Vjb25kLT5tQnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Z2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGF1dG8gYnVmZmVySXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKDtidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7ICsrYnVmZmVySXQpIHsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSAqYnVmZmVySXQ7CisgICAgICAgIGlmIChhbGxvY2F0b3ItPmNvbXBhdGlibGUocGFyYW1zLCBtQnVmZmVyc1tidWZmZXJJZF0tPm1Db25maWcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gKmJ1ZmZlckl0OworICAgICAgICBtRnJlZUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXQpOworICAgICAgICBtU3RhdHMub25CdWZmZXJSZWN5Y2xlZChtQnVmZmVyc1tpZF0tPm1BbGxvY1NpemUpOworICAgICAgICAqaGFuZGxlID0gbUJ1ZmZlcnNbaWRdLT5oYW5kbGUoKTsKKyAgICAgICAgKnBJZCA9IGlkOworICAgICAgICBBTE9HVigicmVjeWNsZSBhIGJ1ZmZlciAldSAlcCIsIGlkLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjphZGROZXdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKworICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gbVNlcSsrOworICAgIGlmIChtU2VxID09IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgbVNlcSA9IDA7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW50ZXJuYWxCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGF1dG8gcmVzID0gbUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoYnVmZmVyKSkpOworICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyQWxsb2NhdGVkKGFsbG9jU2l6ZSk7CisgICAgICAgICAgICAqaGFuZGxlID0gYWxsb2MtPmhhbmRsZSgpOworICAgICAgICAgICAgKnBJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzKSB7CisgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtTGFzdExvZ1VzID0gbVRpbWVzdGFtcFVzOworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlcnBvb2wyICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjppbnZhbGlkYXRlKAorICAgICAgICBib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgKmZyZWVJdCkpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytmcmVlSXQ7CisgICAgfQorCisgICAgc2l6ZV90IGxlZnQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sIGl0LT5maXJzdCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICsrbGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW52YWxpZGF0aW9uLm9uSW52YWxpZGF0aW9uUmVxdWVzdChuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIG1JbnZhbGlkYXRpb25DaGFubmVsLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Zmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIEJ1ZmZlcklkIGZyb20gPSBtU3RhcnRTZXE7CisgICAgQnVmZmVySWQgdG8gPSBtU2VxOworICAgIG1TdGFydFNlcSA9IG1TZXE7CisgICAgLy8gVE9ETzogbmVlZHNBY2sgcGFyYW1zIAorICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIHJlcXVlc3QgYnA6JXUgJXUgJXUiLCBtSW52YWxpZGF0aW9uLm1JZCwgZnJvbSwgdG8pOworICAgIGlmIChmcm9tICE9IHRvKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSwgZnJvbSwgdG8sIGltcGwpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgICAgIGJvb2wgJnJlYWR5KSB7CisgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IGNvcGllZDsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGlmICghcmVhZHkpIHsKKyAgICAgICAgICAgICAgICBjdi53YWl0KGxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29waWVkLmluc2VydChhY2Nlc3NvcnMuYmVnaW4oKSwgYWNjZXNzb3JzLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Omxpc3Q8Q29ubmVjdGlvbklkPiBlcmFzZWQ7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvcGllZC5iZWdpbigpOyBpdCAhPSBjb3BpZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gaW1wbCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFpbXBsKSB7CisgICAgICAgICAgICAgICAgZXJhc2VkLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbXBsLT5oYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGVyYXNlZC5iZWdpbigpOyBpdCAhPSBlcmFzZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NvcnMuZXJhc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRyYWluaW5nIGNwdS4KKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpBY2Nlc3NvckludmFsaWRhdG9yKCkgOiBtUmVhZHkoZmFsc2UpIHsKKyAgICBzdGQ6OnRocmVhZCBpbnZhbGlkYXRvcigKKyAgICAgICAgICAgIGludmFsaWRhdG9yVGhyZWFkLAorICAgICAgICAgICAgc3RkOjpyZWYobUFjY2Vzc29ycyksCisgICAgICAgICAgICBzdGQ6OnJlZihtTXV0ZXgpLAorICAgICAgICAgICAgc3RkOjpyZWYobUN2KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1SZWFkeSkpOworICAgIGludmFsaWRhdG9yLmRldGFjaCgpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjphZGRBY2Nlc3NvcigKKyAgICAgICAgdWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBib29sIG5vdGlmeSA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoYWNjZXNzb3JJZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBpZiAoIW1SZWFkeSkgeworICAgICAgICAgICAgbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWNjZXNzb3JJZCwgaW1wbCkpOworICAgICAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBhZGRlZCBicDoldSAlZCIsIGFjY2Vzc29ySWQsIG5vdGlmeSk7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisgICAgaWYgKG5vdGlmeSkgeworICAgICAgICBtQ3Yubm90aWZ5X29uZSgpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6ZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3NvcklkKTsKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBkZWxldGVkIGJwOiV1IiwgYWNjZXNzb3JJZCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+IEFjY2Vzc29yOjpJbXBsOjpzSW52YWxpZGF0b3I7CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIGlmICghc0ludmFsaWRhdG9yKSB7CisgICAgICAgIHNJbnZhbGlkYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTcyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbAorICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QWNjZXNzb3I6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgdm9pZCBoYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJJZCBtU3RhcnRTZXE7CisgICAgICAgIGJvb2wgbVZhbGlkOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgbUludmFsaWRhdGlvbkNoYW5uZWw7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICBzdHJ1Y3QgSW52YWxpZGF0aW9uIHsKKyAgICAgICAgICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBzSW52U2VxSWQ7CisKKyAgICAgICAgICAgIHN0cnVjdCBQZW5kaW5nIHsKKyAgICAgICAgICAgICAgICBib29sIG1OZWVkc0FjazsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJvbTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtVG87CisgICAgICAgICAgICAgICAgc2l6ZV90IG1MZWZ0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+IG1JbXBsOworICAgICAgICAgICAgICAgIFBlbmRpbmcoYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbU5lZWRzQWNrKG5lZWRzQWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyb20oZnJvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ubyh0byksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0KGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbChpbXBsKQorICAgICAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgICAgICBib29sIGlzSW52YWxpZGF0ZWQodWludDMyX3QgYnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzQnVmZmVySW5SYW5nZShtRnJvbSwgbVRvLCBidWZmZXJJZCkgJiYgLS1tTGVmdCA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxQZW5kaW5nPiBtUGVuZGluZ3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHVpbnQzMl90PiBtQWNrczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gbU9ic2VydmVyczsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JZDsKKworICAgICAgICAgICAgSW52YWxpZGF0aW9uKCkgOiBtSW52YWxpZGF0aW9uSWQoMCksIG1JZChzSW52U2VxSWQuZmV0Y2hfYWRkKDEpKSB7fQorCisgICAgICAgICAgICB2b2lkIG9uQ29ubmVjdChDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgICAgICAgICAgdm9pZCBvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25BY2soQ29ubmVjdGlvbklkIGNvbklkLCB1aW50MzJfdCBtc2dJZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpOworCisgICAgICAgICAgICB2b2lkIG9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICAgICAgdm9pZCBvbkhhbmRsZUFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpOworICAgICAgICB9IG1JbnZhbGlkYXRpb247CisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludmFsaWRhdGUoYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIGludmFsaWRhdGUgYWxsIGN1cnJlbnQKKyAgICAgICAgICogZnJlZSBidWZmZXJzLiBBY3RpdmUgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgYmVpbmcgaW5hY3RpdmUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworCisgICAgc3RydWN0ICBBY2Nlc3NvckludmFsaWRhdG9yIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBtQWNjZXNzb3JzOworICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUN2OworICAgICAgICBib29sIG1SZWFkeTsKKworICAgICAgICBBY2Nlc3NvckludmFsaWRhdG9yKCk7CisgICAgICAgIHZvaWQgYWRkQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworICAgICAgICB2b2lkIGRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpOworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29ySW52YWxpZGF0b3I+IHNJbnZhbGlkYXRvcjsKKworICAgIHN0YXRpYyB2b2lkIGludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgIGJvb2wgJnJlYWR5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzFhYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisgICAgc3JjczogWworICAgICAgICAiQWNjZXNzb3IuY3BwIiwKKyAgICAgICAgIkFjY2Vzc29ySW1wbC5jcHAiLAorICAgICAgICAiQnVmZmVyUG9vbENsaWVudC5jcHAiLAorICAgICAgICAiQnVmZmVyU3RhdHVzLmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJPYnNlcnZlci5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJmZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw4NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSUQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKHVpbnQzMl90IG1zZ0lkID0gMCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCk7CisKKyAgICB2b2lkIGludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0byk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4gbUludmFsaWRhdGlvbkxpc3RlbmVyOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgUmVsZWFzZUNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGVJZDsgLy8gVE9ETzogaW52YWxpZGF0aW9uIEFDSyB0byBidWZmZXJwb29sCisgICAgICAgIGJvb2wgbUludmFsaWRhdGVBY2s7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKworICAgICAgICBSZWxlYXNlQ2FjaGUoKSA6IG1JbnZhbGlkYXRlSWQoMCksIG1JbnZhbGlkYXRlQWNrKHRydWUpIHt9CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUhhc0NhY2hlKGZhbHNlKSwgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLAorICAgICAgICAgICAgICBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCdWZmZXJJZCBpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAqc3RhdHVzRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICppbnZEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCB0cnVlLAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgJnN0YXR1c0Rlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqc3RhdHVzRGVzYyk7CisgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oKmludkRlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHVpbnQzMl90JiBvdXRNc2dJZCA9IG1SZWxlYXNpbmcubUludmFsaWRhdGVJZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+JiBvdXRPYnNlcnZlciA9CisgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRNc2dJZCwgJm91dENoYW5uZWwsICZvdXRPYnNlcnZlcl0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCwKKyAgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yJiBzdGF0dXNEZXNjLAorICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3ImIGludkRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRNc2dJZCA9IG1zZ0lkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihzdGF0dXNEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPihpbnZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciAmJiBvdXRPYnNlcnZlci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgIHN5bmNSZWxlYXNlZChtZXNzYWdlSWQpOworICAgIC8vIFRPRE86IGV2aWN0IGNhY2hlIHJlcXVpcmVkPworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Zmx1c2goKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIHJldHVybiBtTG9jYWxDb25uZWN0aW9uLT5mbHVzaCgpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGRvbid0IG5lZWQgdG8gY2FsbCBzeW5jUmVsZWFzZWQgZXZlcnkgdGltZQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICB9CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic3luYyBmcm9tIGNsaWVudCAlbGxkIGZhaWxlZDogYnVmZmVycG9vbCBwcm9jZXNzIGRpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQodWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgYm9vbCBjbGVhcmVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IGludmFsaWRhdGlvbnM7CisgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5nZXRJbnZhbGlkYXRpb25zKGludmFsaWRhdGlvbnMpOworICAgIHVpbnQzMl90IGxhc3RNc2dJZCA9IDA7CisgICAgaWYgKGludmFsaWRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKGF1dG8gaXQgPSBpbnZhbGlkYXRpb25zLmJlZ2luKCk7IGl0ICE9IGludmFsaWRhdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+bWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0TXNnSWQgPSBpdC0+bWVzc2FnZUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5mcm9tQnVmZmVySWQgPT0gaXQtPnRvQnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJvbUJ1ZmZlcklkID0gVUlOVDMyX01BWAorICAgICAgICAgICAgICAgIGludmFsaWRhdGVCdWZmZXIoaXQtPmZyb21CdWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSYW5nZShpdC0+ZnJvbUJ1ZmZlcklkLCBpdC0+dG9CdWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKGxhc3RNc2dJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobGFzdE1zZ0lkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbGFzdE1zZ0lkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgLy8gbWVzc2FnZXMgYXJlIGRyYWluZWQuCisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobWVzc2FnZUlkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbWVzc2FnZUlkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaykgeworICAgICAgICAgICAgLy8gcG9zdCBBQ0sKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgJWxsZCBpbnZhbGlkYXRlaW9uIGFjayAoJWQpICV1IiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaywgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xlYXJlZDsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCkgeworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlkID09IGl0LT5zZWNvbmQtPmlkKCkpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiBidWZmZXIgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5jb25zaXRlbnQgaW52YWxpZGF0aW9uICVsbGQgOiBhY3RpdmVyIGJ1ZmZlciEhICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsICh1bnNpZ25lZCBpbnQpaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pIHsKKyAgICBzaXplX3QgaW52YWxpZGF0ZWQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgQnVmZmVySWQgYmlkID0gaXQtPnNlY29uZC0+aWQoKTsKKyAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgJiYgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCB8fCBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6ICMgb2YgaW52YWxpZGF0ZWQgJXp1IiwKKyAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGludmFsaWRhdGVkKTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpIHsKKyAgICBBTE9HVigiYnVmZmVycG9vbDIgY2xpZW50IHJlY3YgaW52ICV1IiwgbXNnSWQpOworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgbUltcGwtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmZsdXNoKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDlhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKyAgICBmcmllbmQgc3RydWN0IE9ic2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0MDJmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisvLyBUaGlzIGlzIGFkZGVkIHRvIHByZXNlcnZlIEFCSSBmb3IgYi8xODQ5NjMzODUKK3RlbXBsYXRlIGJvb2wgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTwKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OkJ1ZmZlclN0YXR1c01lc3NhZ2UsCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OjoKKyAgICB3cml0ZSgKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpCdWZmZXJTdGF0dXNNZXNzYWdlICosCisgICAgICAgIHNpemVfdCBjb3VudCk7CisjaWZuZGVmIF9fYWFyY2g2NF9fCit0ZW1wbGF0ZSBib29sIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8CisgICAgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlLAorICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjprVW5zeW5jaHJvbml6ZWRXcml0ZT46OgorICAgIHdyaXRlKGNvbnN0IGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UgKiwKKyAgICAgICAgICBzaXplX3QgY291bnQpOworI2VuZGlmCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCkgeworICAgIHJldHVybiBjdXJNc2dJZCAhPSBwcmV2TXNnSWQgJiYgY3VyTXNnSWQgLSBwcmV2TXNnSWQgPCBwcmV2TXNnSWQgLSBjdXJNc2dJZDsKK30KKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCAmJiBidWZmZXJJZCA8IHRvOworICAgIH0gZWxzZSB7IC8vIHdyYXAgaGFwcGVucworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCB8fCBidWZmZXJJZCA8IHRvOworICAgIH0KK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmICEqaW52YWxpZGF0ZWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGludmFsaWRhdGVJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworICAgIC8vIGRyYWluIHByZXZpb3VzIG1lc3NhZ2VzCisgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6Z2V0SW52YWxpZGF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgLy8gVHJ5IHR3aWNlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAgLy8gVE9ETzogaGFuZGxpbmcgb3ZlcmZsb3cgdGhvdWdoIGl0IG1heSBub3QgaGFwcGVuLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnJlc2VydmUobWVzc2FnZXMuc2l6ZSgpICsgYXZhaWwpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHRlbXAuYmVnaW4oKTsgaXQgIT0gdGVtcC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6QnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpCisgICAgOiBtVmFsaWQodHJ1ZSksCisgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUoCisgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUsIHRydWUpKSB7CisgICAgaWYgKCFtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgfHwgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+Z2V0RGVzYygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6cG9zdEludmFsaWRhdGlvbigKKyAgICAgICAgdWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCkgeworICAgIEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZTsKKworICAgIG1lc3NhZ2UubWVzc2FnZUlkID0gbXNnSWQ7CisgICAgbWVzc2FnZS5mcm9tQnVmZmVySWQgPSBmcm9tSWQ7CisgICAgbWVzc2FnZS50b0J1ZmZlcklkID0gdG9JZDsKKyAgICAvLyBUT0RPOiBoYW5kbGUgZmFpbHVyZSAoaXQgZG9lcyBub3QgaGFwcGVuIG5vcm1hbGx5LikKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPndyaXRlKCZtZXNzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjU4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCk7CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlcgorICogb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzCisgKiBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YKKyAgICAgKiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlhZGF0aW9uIG1lc3NnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVJZCAgaW52YWxpZGF0aW9uIGFjayB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZGF0aW9uIGlkIGlzIHplcm8sIHRoZSBhY2sgd2lsbCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVkICAgc2V0cyB7QGNvZGUgdHJ1ZX0gb25seSB3aGVuIHRoZSBpbnZhbGlkYXRpb24gYWNrIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHZpYSB0aGUgZm1xIGZyb20gdGhlIGJ1ZmZlciBwb29sLiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgaGFuZGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lciB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEludmFsaWRhdGlvbnMoc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIEEgYnVmZmVyIHBvb2wgd2lsbCBzZW5kIGJ1ZmZlcgorICogaW52YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnRzIHZpYSB0aGUgRk1RLiBUaGUgRk1RIGlzIHNoYXJlZCBhbW9uZworICogYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0b3Igb2YgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUS4gdGhlIGRlc2NyaXB0b3IgbWF5CisgICAgICogYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIGdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpOworCisgICAgLyoqIFBvc3RzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBmb3IgaW52YWxpZGF0ZWQgYnVmZmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2dJZCAgICAgSW52YWxpZGF0aW9uIG1lc3NhZ2UgaWQgd2hpY2ggaXMgdXNlZCB3aGVuIGNsaWVudHMgc2VuZAorICAgICAqICAgICAgICAgICAgICAgICAgYWNrcyBiYWNrIHZpYSBCdWZmZXJTdGF0dXNNZXNzYWdlCisgICAgICogQHBhcmFtIGZyb21JZCAgICBUaGUgc3RhcnQgYnVmZmVyaWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqIEBwYXJhbSB0b0lkICAgICAgVGhlIGVuZCBidWZmZXJJZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICovCisgICAgdm9pZCBwb3N0SW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWQzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIHNwPE9ic2VydmVyPiBtT2JzZXJ2ZXI7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpCisgICAgOiBtT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCkpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBUT0RPOiBvYnNlcnZlciBpcyBsb2NhbC4gdXNlIGRpcmVjdCBjYWxsIGluc3RlYWQgb2YgaGlkbCBjYWxsLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbG9zaW5nID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NrMi51bmxvY2soKTsKKyAgICAgICAgbG9jazEudW5sb2NrKCk7CisgICAgICAgIGNsb3NpbmctPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmZsdXNoKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpOworICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Zmx1c2goY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2QwYzdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorUmV0dXJuPHZvaWQ+IENvbm5lY3Rpb246OmZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIGlmIChidWZmZXJJZCAhPSBTWU5DX0JVRkZFUklEKSB7CisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWNjZXNzb3ItPmZldGNoKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBCdWZmZXIgYnVmZmVyID0ge307CisgICAgICAgICAgICAgICAgYnVmZmVyLmlkID0gYnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IGhhbmRsZTsKKyAgICAgICAgICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCdWZmZXIgYnVmZmVyID0ge307CisgICAgYnVmZmVyLmlkID0gMDsKKyAgICBidWZmZXIuYnVmZmVyID0gbnVsbHB0cjsKKworICAgIF9oaWRsX2NiKHN0YXR1cywgYnVmZmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitDb25uZWN0aW9uOjpDb25uZWN0aW9uKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtQ29ubmVjdGlvbklkKC0xTEwpIHt9CisKK0Nvbm5lY3Rpb246On5Db25uZWN0aW9uKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiYgYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjpmbHVzaCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA3NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgYWN0aXZlIGFuZC9vciBhcmUgcmVhZHkgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIzMTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitPYnNlcnZlcjo6T2JzZXJ2ZXIoKSB7Cit9CisKK09ic2VydmVyOjp+T2JzZXJ2ZXIoKSB7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBPYnNlcnZlcjo6b25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNsaWVudC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBPYnNlcnZlcjo6YWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLmxvY2soKSB8fCBpdC0+Zmlyc3QgPT0gY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICBpdCA9IG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgd2NsaWVudCkpOworCit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZDdjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgT2JzZXJ2ZXIgOiBwdWJsaWMgSU9ic2VydmVyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IG9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIG92ZXJyaWRlOworCisgICAgfk9ic2VydmVyKCk7CisKKyAgICB2b2lkIGFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpOworCisgICAgdm9pZCBkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKK3ByaXZhdGU6CisgICAgT2JzZXJ2ZXIoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PiBtQ2xpZW50czsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MDZjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGEgeworICAgIC8vIEZvciBsb2NhbCB1c2UsIHRvIHNwZWNpZnkgYSBidWZmZXJwb29sIChjbGllbnQgY29ubmVjdGlvbikgZm9yIGJ1ZmZlcnMuCisgICAgLy8gUmV0dXJuIHZhbHVlIGZyb20gY29ubmVjdCNJQWNjZXNzb3IoYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCkuCisgICAgaW50NjRfdCBtQ29ubmVjdGlvbklkOworICAgIC8vIEJ1ZmZlcklkCisgICAgdWludDMyX3QgbUlkOworCisgICAgQnVmZmVyUG9vbERhdGEoKSA6IG1Db25uZWN0aW9uSWQoMCksIG1JZCgwKSB7fQorCisgICAgQnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSB7fQorCisgICAgfkJ1ZmZlclBvb2xEYXRhKCkge30KK307CisKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprVW5zeW5jaHJvbml6ZWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgU3RhdHVzRGVzY3JpcHRvcjsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UsIGtVbnN5bmNocm9uaXplZFdyaXRlPgorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKK3R5cGVkZWYgQnVmZmVySW52YWxpZGF0aW9uUXVldWU6OkRlc2NyaXB0b3IgSW52YWxpZGF0aW9uRGVzY3JpcHRvcjsKKworLyoqCisgKiBBbGxvY2F0aW9uIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitzdHJ1Y3QgQnVmZmVyUG9vbEFsbG9jYXRpb24geworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZTsKKyAgICB9CisKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSkge30KKworICAgIH5CdWZmZXJQb29sQWxsb2NhdGlvbigpIHt9OworfTsKKworLyoqCisgKiBBbGxvY2F0b3Igd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYW4gYWxsb2NhdGlvbihidWZmZXIpIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGFsbG9jICAgICBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgb2YgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIG9sZCBhbGxvY2F0aW9uIGFyZQorICAgICAqIGNvbXBhdGlibGUgd2l0aCBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2MzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJCdWZmZXJQb29sVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENsaWVudE1hbmFnZXIgOiBwdWJsaWMgSUNsaWVudE1hbmFnZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiByZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqIEdldHMgYW4gaW5zdGFuY2UuICovCisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IGdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYWwgY29ubmVjdGlvbiB3aXRoIGEgbmV3bHkgY3JlYXRlZCBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgICAgIGZvciBuZXcgYnVmZmVyIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgSWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbi4gVGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS13aWRlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBwb29sIGFuZCBhIGxvY2FsIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjcmVhdGVkIGNvbm5lY3Rpb24gYXMgc2VuZGVyIGZvciByZW1vdGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlciAgICAgIFRoZSByZW1vdGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHNlbmRlcklkICAgICAgQSBsb2NhbCBjb25uZWN0aW9uIHdoaWNoIHdpbGwgc2VuZCBidWZmZXJzIHRvLgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIElkIG9mIHRoZSBjcmVhdGVkIHJlY2VpdmluZyBjb25uZWN0aW9uIG9uIHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9uIHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kZXIgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQUxSRUFEWV9FWElTVFMgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdHMgY2FjaGVkIGFsbG9jYXRpb25zLiBJZiBpdCdzIGxvY2FsIGNvbm5lY3Rpb24sIHJlbGVhc2UgdGhlCisgICAgICogcHJldmlvdXMgYWxsb2NhdGlvbnMgYW5kIGRvIG5vdCByZWN5Y2xlIGN1cnJlbnQgYWN0aXZlIGFsbG9jYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgcmVzZXR0ZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIFRoZSBpZCBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIFRoZSBpZCBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgaXMgYmVpbmcgc2VudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSByZWNlaXZlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBTZW5kcyBhIGJ1ZmZlcgorICAgICAqIHRvIG90aGVyIHJlbW90ZSBjbGllbnRzKGNvbm5lY3Rpb24pIGFmdGVyIHRoaXMgY2FsbCBoYXMgYmVlbiBzdWNjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0cmFuc2FjdGlvbiBpcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLyoqCisgICAgICogIFRpbWUgb3V0IGluYWN0aXZlIGxpbmdlcmluZyBjb25uZWN0aW9ucyBhbmQgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKCk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIHRoZSBtYW5hZ2VyIG9mIGJ1ZmZlciBwb29sIGNsaWVudHMuICAqLworICAgIH5DbGllbnRNYW5hZ2VyKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBzSW5zdGFuY2U7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0luc3RhbmNlTG9jazsKKworICAgIGNsYXNzIEltcGw7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworCisgICAgQ2xpZW50TWFuYWdlcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0U2luZ2xlVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJzaW5nbGUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAibXVsdGkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VuaW9uIFBhcmFtcyB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FwYWNpdHk7CisgIH0gZGF0YTsKKyAgdWludDhfdCBhcnJheVswXTsKKyAgUGFyYW1zKCkgOiBkYXRhezB9IHt9CisgIFBhcmFtcyh1aW50MzJfdCBzaXplKQorICAgICAgOiBkYXRhe3NpemV9IHt9Cit9OworCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBIYW5kbGVBc2htZW0gOiBwdWJsaWMgbmF0aXZlX2hhbmRsZV90IHsKKyAgSGFuZGxlQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IHNpemUpCisgICAgOiBuYXRpdmVfaGFuZGxlX3QoY0hlYWRlciksCisgICAgbUZkc3sgYXNobWVtRmQgfSwKKyAgICBtSW50c3sgaW50IChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHt9CisKKyAgaW50IGFzaG1lbUZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQXNobWVtOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCB7CisgICAgaW50IG1Bc2htZW07CisgIH0gbUZkczsKKyAgc3RydWN0IHsKKyAgICBpbnQgbVNpemVMbzsKKyAgICBpbnQgbVNpemVIaTsKKyAgICBpbnQgbU1hZ2ljOworICB9IG1JbnRzOworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBrTWFnaWMgPSAnYWhtXHgwMCcsCisgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICB2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkKKyAgfTsKKyAgY29uc3Qgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCBjSGVhZGVyOworfTsKKworY29uc3QgbmF0aXZlX2hhbmRsZV90IEhhbmRsZUFzaG1lbTo6Y0hlYWRlciA9IHsKKyAgSGFuZGxlQXNobWVtOjp2ZXJzaW9uLAorICBIYW5kbGVBc2htZW06Om51bUZkcywKKyAgSGFuZGxlQXNobWVtOjpudW1JbnRzLAorICB7fQorfTsKKworYm9vbCBIYW5kbGVBc2htZW06OmlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3QgbykgeworICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihvKTsKKyAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitjbGFzcyBBbGxvY2F0aW9uQXNobWVtIHsKK3ByaXZhdGU6CisgIEFsbG9jYXRpb25Bc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3QgY2FwYWNpdHksIGJvb2wgcmVzKQorICAgIDogbUhhbmRsZShhc2htZW1GZCwgY2FwYWNpdHkpLAorICAgICAgbUluaXQocmVzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY2F0aW9uQXNobWVtICpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciAqa0FsbG9jYXRpb25UYWcgPSAiYnVmZmVycG9vbF90ZXN0IjsKKyAgICBpbnQgYXNobWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihrQWxsb2NhdGlvblRhZywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBBbGxvY2F0aW9uQXNobWVtKGFzaG1lbUZkLCBzaXplLCBhc2htZW1GZCA+PSAwKTsKKyAgfQorCisgIH5BbGxvY2F0aW9uQXNobWVtKCkgeworICAgIGlmIChtSW5pdCkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorICB9CisKKyAgY29uc3QgSGFuZGxlQXNobWVtICpoYW5kbGUoKSB7CisgICAgcmV0dXJuICZtSGFuZGxlOworICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZUFzaG1lbSBtSGFuZGxlOworICBib29sIG1Jbml0OworICAvLyBUT0RPOiBtYXBwaW5nIGFuZCBtYXAgZmQKK307CisKK3N0cnVjdCBBbGxvY2F0aW9uRHRvciB7CisgIEFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiAmYWxsb2MpCisgICAgICA6IG1BbGxvYyhhbGxvYykge30KKworICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IG1BbGxvYzsKK307CisKK30KKworCitSZXN1bHRTdGF0dXMgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtczsKKyAgbWVtY3B5KCZhc2htZW1QYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IGFzaG1lbUFsbG9jID0KKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPigKKyAgICAgICAgICBBbGxvY2F0aW9uQXNobWVtOjpBbGxvYyhhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eSkpOworICBpZiAoYXNobWVtQWxsb2MpIHsKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGFzaG1lbUFsbG9jLT5oYW5kbGUoKSk7CisgICAgaWYgKHB0cikgeworICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPihwdHIsIEFsbG9jYXRpb25EdG9yKGFzaG1lbUFsbG9jKSk7CisgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgKmFsbG9jU2l6ZSA9IGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5OworICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgfQorICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSB7CisgIHNpemVfdCBuZXdTaXplID0gbmV3UGFyYW1zLnNpemUoKTsKKyAgc2l6ZV90IG9sZFNpemUgPSBvbGRQYXJhbXMuc2l6ZSgpOworICBpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyArK2kpIHsKKyAgICAgIGlmIChuZXdQYXJhbXNbaV0gIT0gb2xkUGFyYW1zW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIHB0cltpXSA9IHZhbDsKKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChwdHJbaV0gIT0gdmFsKSB7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQga0FsbG9jYXRpb25TaXplID0gMTAyNCAqIDEwOworICBQYXJhbXMgYXNobWVtUGFyYW1zKGtBbGxvY2F0aW9uU2l6ZSk7CisKKyAgcGFyYW1zLT5hc3NpZ24oYXNobWVtUGFyYW1zLmFycmF5LCBhc2htZW1QYXJhbXMuYXJyYXkgKyBzaXplb2YoYXNobWVtUGFyYW1zKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODFkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisjZGVmaW5lIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yOworCisvLyBidWZmZXIgYWxsb2NhdG9yIGZvciB0aGUgdGVzdHMKK2NsYXNzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSB7fQorCisgIH5UZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIEZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworfTsKKworLy8gcmV0cmlldmUgYnVmZmVyIGFsbG9jYXRvciBwYXJhbXRlcnMKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworI2VuZGlmICAvLyBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNjk5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklUX09LID0gMCwKKyAgICBJTklUX0VSUk9SLAorICAgIFNFTkQsCisgICAgUkVDRUlWRV9PSywKKyAgICBSRUNFSVZFX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCAgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgIHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUoCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsICZyaGFuZGxlLCAmcmJ1ZmZlcik7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICBpZiAoc3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJoYW5kbGUsIDB4NzcpKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sTXVsdGlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBQaXBlTWVzc2FnZSBtZXNzYWdlOworCisgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworCisgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICBBU1NFUlRfVFJVRSgoYm9vbClyZWNlaXZlcik7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoc2hhbmRsZSwgMHg3NykpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ZWRjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1BbGxvY2F0aW9uVGVzdCA9IDM7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciByZWN5Y2xpbmcgdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1SZWN5Y2xlVGVzdCA9IDM7CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbFNpbmdsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJgorICAgICAgICAgICAgICAgIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCit9OworCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGgKKy8vIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcltrTnVtQWxsb2NhdGlvblRlc3RdOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgeworICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyW2ldLT5tSWQgIT0gYnVmZmVyW2pdLT5tSWQpOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtQWxsb2NhdGlvblRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBCdWZmZXJJZCBiaWRba051bVJlY3ljbGVUZXN0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICB9CisgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bVJlY3ljbGVUZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBidWZmZXIgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlciwgcmJ1ZmZlcjsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqcmVjdkhhbmRsZSA9IG51bGxwdHI7CisKKyAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICBpbnQ2NF90IHBvc3RVczsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzYnVmZmVyKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgc2J1ZmZlci0+bUlkLCBwb3N0VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDczOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERPQ1VNRU5UQVRJT04gR0VORVJBVElPTgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQzJfUk9PVCA6PSAkKGNhbGwgbXktZGlyKQorCitDMl9ET0NTX1JPT1QgOj0gJChPVVRfRElSKS90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyCisKK0MyX09VVF9URU1QIDo9ICQoUFJPRFVDVF9PVVQpL2dlbi9FVEMvQ29kZWMyLWRvY3NfaW50ZXJtZWRpYXRlcworCitDMl9ET1hZIDo9ICQob3IgJChzaGVsbCBjb21tYW5kIC12IGRveHlnZW4pLFwKKwkJJChzaGVsbCBjb21tYW5kIC12IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2RveHlnZW4pKQorCisuUEhPTlk6IGNoZWNrLWRveHlnZW4KK2NoZWNrLWRveHlnZW46CitpZm5kZWYgQzJfRE9YWQorCSQoZXJyb3IgJ2RveHlnZW4gaXMgbm90IGF2YWlsYWJsZScpCitlbmRpZgorCiskKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCSMgb25seSBkb2N1bWVudCBpbmNsdWRlIGRpcmVjdG9yeSwgbm8gaW50ZXJuYWwgc2VjdGlvbnMKKwlzZWQgJ3MvXCheSU5QVVQgKj0uKlwpL1wxaW5jbHVkZVwvLzsgXAorCXMvXCheSU5URVJOQUxfRE9DUyAqPSAqXCkuKi9cMU5PLzsgXAorCXMvXCheRU5BQkxFRF9TRUNUSU9OUyAqPS4qXClJTlRFUk5BTFwoLipcKS4qL1wxXDIvOyBcCisJczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0OlwxJyQoT1VUX0RJUiknOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCXNlZCAnczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0XCguKlwpYXBpOlwxJyQoT1VUX0RJUiknXDJpbnRlcm5hbDo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKy5QSE9OWTogZG9jcy1hcGkKK2RvY3MtYXBpOiAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gQVBJIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9hcGkKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2FwaQorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9hcGkKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZworCisuUEhPTlk6IGRvY3MtaW50ZXJuYWwKK2RvY3MtaW50ZXJuYWw6ICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEludGVybmFsIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnCisKKy5QSE9OWTogZG9jcy1hbGwKK2RvY3MtYWxsOiBkb2NzLWFwaSBkb2NzLWludGVybmFsCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChjYWxsIG15LWRpcikpCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2E1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdEFhY0RlYy5jcHAiLAorICAgICAgICAiRHJjUHJlc01vZGVXcmFwLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QWFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGUxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApAQCAtMCwwICsxLDkyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNEZWMuaCIKKworI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTIDIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIC0xNi4wICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoMC4yNSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBYWNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgydSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQ29tcHJlc3NNb2RlLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0NvbXByZXNzTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVll9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQ29tcHJlc3NNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNUYXJnZXRSZWZMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjVGFyZ2V0UmVmTGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY1RhcmdldFJlZkxldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFbmNUYXJnZXRMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNFbmNUYXJnZXRMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRW5jVGFyZ2V0TGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0Jvb3N0RmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0Jvb3N0RmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0Jvb3N0RmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQXR0ZW51YXRpb25GYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQXR0ZW51YXRpb25GYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VmZmVjdFR5cGUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNFZmZlY3RUeXBlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT059KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRWZmZWN0VHlwZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRBYWNEZWM6OkMyU29mdEFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRGVjb2RlcihudWxscHRyKSwKKyAgICAgIG1TdHJlYW1JbmZvKG51bGxwdHIpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRBYWNEZWM6On5DMlNvZnRBYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgLy8gVG8gbWFrZSB0aGUgY29kZWMgYmVoYXZlIHRoZSBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgYSByZXNldCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZQorICAgIC8vIHN0cmVhbWluZm8gc3RydWN0LiBUaGlzIGRvZXMgdGhhdDoKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQUFDRGVjb2RlcikgeworICAgICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgbUFBQ0RlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIG1BQUNEZWNvZGVyID0gYWFjRGVjb2Rlcl9PcGVuKFRUX01QNF9BRElGLCAvKiBudW0gbGF5ZXJzICovIDEpOworICAgIGlmIChtQUFDRGVjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdHJlYW1JbmZvID0gYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgaWYgKG1TdHJlYW1JbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworCisgICAgaWYgKG1BQUNEZWNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGlzIG51bGwuIFRPRE86IENhbiBub3QgY2FsbCBhYWNEZWNvZGVyX1NldFBhcmFtIGluIHRoZSBmb2xsb3dpbmcgY29kZSIpOworICAgIH0KKworICAgIC8vYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwgMCk7CisKKyAgICAvL2luaXQgRFJDIHdyYXBwZXIKKyAgICBtRHJjV3JhcC5zZXREZWNvZGVySGFuZGxlKG1BQUNEZWNvZGVyKTsKKyAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKworICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4gYnkgcGxhdGZvcm0gcHJvcGVydGllcworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgRFJDIHNldHRpbmdzIGRlcGVuZGluZyBvbiBhdWRpbyBvdXRwdXQgZGV2aWNlIHR5cGUgKEhETUksIGxvYWRzcGVha2VyLCBoZWFkcGhvbmUpCisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgKHVuc2lnbmVkKXRhcmdldFJlZkxldmVsKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SCisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCAodW5zaWduZWQpYXR0ZW51YXRpb25GYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgKHVuc2lnbmVkKWJvb3N0RmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCAodW5zaWduZWQpY29tcHJlc3NNb2RlKTsKKworICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGludDMyX3QgZW5jVGFyZ2V0TGV2ZWwgPSBtSW50Zi0+Z2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZW5jb2Rlci1zaWRlIERSQyByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCBlbmNUYXJnZXRMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCAodW5zaWduZWQpZW5jVGFyZ2V0TGV2ZWwpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgZWZmZWN0VHlwZSk7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwuCisgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAorICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwgbnVtU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgT1ZFUkZMT1ciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrXSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkIC09IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGJvb2wgZW9zKSB7CisgICAgd2hpbGUgKCFtQnVmZmVyc0luZm8uZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgID49IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgSW5mbyAmb3V0SW5mbyA9IG1CdWZmZXJzSW5mby5mcm9udCgpOworICAgICAgICBBTE9HVigib3V0SW5mby5mcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBvdXRJbmZvLmZyYW1lSW5kZXgpOworICAgICAgICBpbnQgc2FtcGxlc2l6ZSBfX3VudXNlZCA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3V0SW5mby5kZWNvZGVkU2l6ZXMuc2l6ZSgpOworICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQgc2FtcGxlcyBhdmFpbGFibGUgKCVkKSwgb3IgJWQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IGZpbGxXb3JrID0KKyAgICAgICAgICAgIFsmYmxvY2ssIG51bVNhbXBsZXMsIHBvb2wsIHRoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgLT4gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IHsKKyAgICAgICAgICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLCBjMl9zdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgICAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX09LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gZmV0Y2ggYSBsaW5lYXIgYmxvY2sgKCVkKSIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX05PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4od1ZpZXcuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KCk7CisKKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG91dEluZm8uZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluaXNoKG91dEluZm8uZnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG91dEluZm8udGltZXN0YW1wLCBibG9jayA/IGJsb2NrLT5jYXBhY2l0eSgpIDogMCk7CisgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVDSEFSKiBpbkJ1ZmZlcltGSUxFUkVBRF9NQVhfTEFZRVJTXTsKKyAgICBVSU5UIGluQnVmZmVyTGVuZ3RoW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworICAgIFVJTlQgYnl0ZXNWYWxpZFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKworICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgLy9UT0RPCisjaWYgMAorICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVygiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIEZMQUdfQ09ERUNfQ09ORklHIHNldCIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGNvZGVjQ29uZmlnICYmIHNpemUgPiAwdSkgeworICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImFhY0RlY29kZXJfQ29uZmlnUmF3IGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbmZvIGluSW5mbzsKKyAgICBpbkluZm8uZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGluSW5mby50aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIGluSW5mby5idWZmZXJTaXplID0gc2l6ZTsKKyAgICBpbkluZm8uZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CisKKyAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOworICAgICAgICBzaXplIC09IGluQnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgb2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPAorICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYnVmZmVyCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlcyAtIG51bUNvbnN1bWVkOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wdXNoX2JhY2sobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ5dGVzVmFsaWRbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSBidWZmZXJTaXplIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBkZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuYmVnaW4oKSwgaW5JbmZvLmRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAoKG1JbnB1dEJ1ZmZlckNvdW50ID4gMikgJiYgKG1PdXRwdXRCdWZmZXJDb3VudCA8PSAxKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgYWx0ZXJlZCBkdXJpbmcgY29uZmlnLgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOworICAgIH0KKworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICBtQnVmZmVyc0luZm8ucHVzaF9iYWNrKHN0ZDo6bW92ZShpbkluZm8pKTsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIGlmICghZW9zICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgLy8gZGlzY2FyZCBvdXRwdXREZWxheSBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpZiAoZGlzY2FyZCA+IHRvQ29tcGVuc2F0ZSkgeworICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRpc2NhcmRlZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgZGlzY2FyZCk7CisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBmYWxzZSAvKiBub3QgRU9TICovKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBib29sIGVvcyA9IChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKworICAgIGRyYWluRGVjb2RlcigpOworICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBlb3MpOworCisgICAgaWYgKGVvcykgeworICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgfTsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXJzSW5mby5zaXplKCkgPiAxdSkgeworICAgICAgICAgICAgZmluaXNoKG1CdWZmZXJzSW5mby5mcm9udCgpLmZyYW1lSW5kZXgsIGZpbGxFbXB0eVdvcmspOworICAgICAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgaW50IGF2YWlsOworICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBhdmFpbCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgYXZhaWwpOworICAgICAgICBpZiAobnMgIT0gYXZhaWwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLy8gZmx1c2ggZGVjb2RlciB1bnRpbCBvdXRwdXREZWxheSBpcyBjb21wZW5zYXRlZAorICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0QWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFhY0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtQUFDRGVjb2RlcjsKKyAgICBDU3RyZWFtSW5mbyAqbVN0cmVhbUluZm87CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlY29kZWRTaXplczsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxJbmZvPiBtQnVmZmVyc0luZm87CisKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyIG1EcmNXcmFwOworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBkcmFpbkRlY29kZXIoKTsKKworICAgIHZvaWQgZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgYm9vbCBlb3MpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzODUyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCkBAIC0wLDAgKzEsNjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QWFjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgNil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4QnVmU2l6ZUNhbGN1bGF0b3IsIG1DaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TQlJNb2RlLCBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmc6OmlucHV0KDB1LCBBQUNfU0JSX0FVVE8pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNCUk1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19TQlJfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfU0JSX1NJTkdMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfU0JSX0RVQUxfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TQlJNb2RlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldFNCUk1vZGUoKSBjb25zdCB7IHJldHVybiBtU0JSTW9kZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGVMZXZlbC0+cHJvZmlsZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhCdWZTaXplQ2FsY3VsYXRvcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiAmY2hhbm5lbENvdW50KSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDEwMjQgKiBzaXplb2Yoc2hvcnQpICogY2hhbm5lbENvdW50LnYudmFsdWU7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOjppbnB1dD4gbVNCUk1vZGU7Cit9OworCitDMlNvZnRBYWNFbmM6OkMyU29mdEFhY0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUoMHUpLAorICAgICAgbU91dEJ1ZmZlclNpemUoMHUpLAorICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCisgICAgICBtSW5wdXRUaW1lU2V0KGZhbHNlKSwKKyAgICAgIG1JbnB1dFNpemUoMCksCisgICAgICBtSW5wdXRUaW1lVXMoMCksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdEFhY0VuYzo6fkMyU29mdEFhY0VuYygpIHsKKyAgICBvblJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jT3BlbigmbUFBQ0VuY29kZXIsIDAsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHNldEF1ZGlvUGFyYW1zKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25TdG9wKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1JbnB1dFRpbWVVcyA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBhYWNFbmNDbG9zZSgmbUFBQ0VuY29kZXIpOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIC8vIG5vLW9wCit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICBtSW5wdXRUaW1lVXMgPSAwOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIENIQU5ORUxfTU9ERSBnZXRDaGFubmVsTW9kZSh1aW50MzJfdCBuQ2hhbm5lbHMpIHsKKyAgICBDSEFOTkVMX01PREUgY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIHN3aXRjaCAobkNoYW5uZWxzKSB7CisgICAgICAgIGNhc2UgMTogY2hNb2RlID0gTU9ERV8xOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBjaE1vZGUgPSBNT0RFXzI7IGJyZWFrOworICAgICAgICBjYXNlIDM6IGNoTW9kZSA9IE1PREVfMV8yOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBjaE1vZGUgPSBNT0RFXzFfMl8xOyBicmVhazsKKyAgICAgICAgY2FzZSA1OiBjaE1vZGUgPSBNT0RFXzFfMl8yOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiBjaE1vZGUgPSBNT0RFXzFfMl8yXzE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiBjaE1vZGU7Cit9CisKK3N0YXRpYyBBVURJT19PQkpFQ1RfVFlQRSBnZXRBT1RGcm9tUHJvZmlsZSh1aW50MzJfdCBwcm9maWxlKSB7CisgICBpZiAocHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMpIHsKKyAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKyAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUpIHsKKyAgICAgICByZXR1cm4gQU9UX1NCUjsKKyAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMpIHsKKyAgICAgICByZXR1cm4gQU9UX1BTOworICAgfSBlbHNlIGlmIChwcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCkgeworICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0xEOworICAgfSBlbHNlIGlmIChwcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQpIHsKKyAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19FTEQ7CisgICB9IGVsc2UgeworICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBBQUMgcHJvZmlsZSAtIGRlZmF1bHRpbmcgdG8gQUFDLUxDIik7CisgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0VuYzo6c2V0QXVkaW9QYXJhbXMoKSB7CisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCisgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCisgICAgaW50MzJfdCBzYnJSYXRpbyA9IDA7CisgICAgdWludDMyX3Qgc2JyTW9kZSA9IG1JbnRmLT5nZXRTQlJNb2RlKCk7CisgICAgaWYgKHNick1vZGUgPT0gQUFDX1NCUl9TSU5HTEVfUkFURSkgc2JyUmF0aW8gPSAxOworICAgIGVsc2UgaWYgKHNick1vZGUgPT0gQUFDX1NCUl9EVUFMX1JBVEUpIHNiclJhdGlvID0gMjsKKworICAgIEFMT0dWKCJzZXRBdWRpb1BhcmFtczogJXUgSHosICV1IGNoYW5uZWxzLCAldSBicHMsICVpIHNiciBtb2RlLCAlaSBzYnIgcmF0aW8iLAorICAgICAgICAgbUludGYtPmdldFNhbXBsZVJhdGUoKSwgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpLAorICAgICAgICAgc2JyTW9kZSwgc2JyUmF0aW8pOworCisgICAgdWludDMyX3QgYWFjUHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlKCk7CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQU9ULCBnZXRBT1RGcm9tUHJvZmlsZShhYWNQcm9maWxlKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQU1QTEVSQVRFLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19DSEFOTkVMTU9ERSwKKyAgICAgICAgICAgIGdldENoYW5uZWxNb2RlKG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1RSQU5TTVVYLCBUVF9NUDRfUkFXKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChzYnJNb2RlICE9IC0xICYmIGFhY1Byb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgeworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgc2JyTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU0JSIHJhdGlvIHBhcmFtZXRlciBjb25maWd1cmF0aW9uczoKKyAgICAgICAwOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlcmVpbiBTQlIgcmF0aW8gaXMgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgYnkKKyAgICAgICAgICB0aGUgRkRLLgorICAgICAgIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKQorICAgICAgIDI6IER1YWxyYXRlIFNCUiAoZGVmYXVsdCBmb3IgSEUtQUFDKQorICAgICAqLworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9SQVRJTywgc2JyUmF0aW8pKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCk7CisKKyAgICBpZiAoIW1TZW50Q29kZWNTcGVjaWZpY0RhdGEpIHsKKyAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljCisgICAgICAgIC8vIGRhdGEuCisKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZW5jb2RlciBmb3IgcHJvZmlsZSAvIHNhbXBsZS1yYXRlIC8gYml0LXJhdGUgLyBjaGFubmVscyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgICAgICB1aW50MzJfdCBhY3R1YWxCaXRSYXRlID0gYWFjRW5jb2Rlcl9HZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUpOworICAgICAgICBpZiAoYml0cmF0ZSAhPSBhY3R1YWxCaXRSYXRlKSB7CisgICAgICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGJpdHJhdGUgJXUgdW5zdXBwb3J0ZWQsIHVzaW5nICV1IiwgYml0cmF0ZSwgYWN0dWFsQml0UmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0luZm8obUFBQ0VuY29kZXIsICZlbmNJbmZvKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgQUFDIGVuY29kZXIgaW5mbyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoZW5jSW5mby5jb25mU2l6ZSwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBlbmNJbmZvLmNvbmZCdWYsIGVuY0luZm8uY29uZlNpemUpOworICAgICAgICBBTE9HVigicHV0IGNzZCIpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgaGV4ZHVtcChjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworI2VuZGlmCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBtT3V0QnVmZmVyU2l6ZSA9IGVuY0luZm8ubWF4T3V0QnVmQnl0ZXM7CisgICAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUgPSBlbmNJbmZvLmZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgdGVtcFsxXTsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gdGVtcDsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGRhdGEgPSB2aWV3LmRhdGEoKTsKKyAgICAgICAgY2FwYWNpdHkgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorICAgIGlmICghbUlucHV0VGltZVNldCAmJiBjYXBhY2l0eSA+IDApIHsKKyAgICAgICAgbUlucHV0VGltZVVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIG1JbnB1dFRpbWVTZXQgPSB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSAoY2FwYWNpdHkgKyBtSW5wdXRTaXplICsgKGVvcyA/IG1OdW1CeXRlc1BlcklucHV0RnJhbWUgLSAxIDogMCkpCisgICAgICAgICAgICAvIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgQUxPR1YoImNhcGFjaXR5ID0gJXp1OyBtSW5wdXRTaXplID0gJXp1OyBudW1GcmFtZXMgPSAlenUgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9ICV1IiwKKyAgICAgICAgICBjYXBhY2l0eSwgbUlucHV0U2l6ZSwgbnVtRnJhbWVzLCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXcml0ZVZpZXc+IHdWaWV3OworICAgIHVpbnQ4X3QgKm91dFB0ciA9IHRlbXA7CisgICAgc2l6ZV90IG91dEF2YWlsYWJsZSA9IDB1OworICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKworICAgIEFBQ0VOQ19JbkFyZ3MgaW5hcmdzOworICAgIEFBQ0VOQ19PdXRBcmdzIG91dGFyZ3M7CisgICAgbWVtc2V0KCZpbmFyZ3MsIDAsIHNpemVvZihpbmFyZ3MpKTsKKyAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCogaW5CdWZmZXJbXSAgICAgICAgPSB7ICh1bnNpZ25lZCBjaGFyICopZGF0YSB9OworICAgIElOVCAgIGluQnVmZmVySWRzW10gICAgID0geyBJTl9BVURJT19EQVRBIH07CisgICAgSU5UICAgaW5CdWZmZXJTaXplW10gICAgPSB7IChJTlQpY2FwYWNpdHkgfTsKKyAgICBJTlQgICBpbkJ1ZmZlckVsU2l6ZVtdICA9IHsgc2l6ZW9mKGludDE2X3QpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBpbkJ1ZkRlc2M7CisgICAgaW5CdWZEZXNjLm51bUJ1ZnMgICAgICAgICAgID0gc2l6ZW9mKGluQnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgaW5CdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmaW5CdWZmZXI7CisgICAgaW5CdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gaW5CdWZmZXJJZHM7CisgICAgaW5CdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gaW5CdWZmZXJTaXplOworICAgIGluQnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IGluQnVmZmVyRWxTaXplOworCisgICAgdm9pZCogb3V0QnVmZmVyW10gICAgICAgPSB7IG91dFB0ciB9OworICAgIElOVCAgIG91dEJ1ZmZlcklkc1tdICAgID0geyBPVVRfQklUU1RSRUFNX0RBVEEgfTsKKyAgICBJTlQgICBvdXRCdWZmZXJTaXplW10gICA9IHsgMCB9OworICAgIElOVCAgIG91dEJ1ZmZlckVsU2l6ZVtdID0geyBzaXplb2YoVUNIQVIpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBvdXRCdWZEZXNjOworICAgIG91dEJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2Yob3V0QnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgb3V0QnVmRGVzYy5idWZzICAgICAgICAgICAgICA9ICh2b2lkKiopJm91dEJ1ZmZlcjsKKyAgICBvdXRCdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gb3V0QnVmZmVySWRzOworICAgIG91dEJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBvdXRCdWZmZXJTaXplOworICAgIG91dEJ1ZkRlc2MuYnVmRWxTaXplcyAgICAgICAgPSBvdXRCdWZmZXJFbFNpemU7CisKKyAgICBBQUNFTkNfRVJST1IgZW5jb2RlckVyciA9IEFBQ0VOQ19PSzsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICB3aGlsZSAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0sgJiYgaW5hcmdzLm51bUluU2FtcGxlcyA+IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyAmJiAhYmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3Vmlldy5yZXNldChuZXcgQzJXcml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKSk7CisgICAgICAgICAgICBvdXRQdHIgPSB3Vmlldy0+ZGF0YSgpOworICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gd1ZpZXctPnNpemUoKTsKKyAgICAgICAgICAgIC0tbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworCisgICAgICAgIG91dEJ1ZmZlclswXSA9IG91dFB0cjsKKyAgICAgICAgb3V0QnVmZmVyU2l6ZVswXSA9IG91dEF2YWlsYWJsZTsKKworICAgICAgICBlbmNvZGVyRXJyID0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YXJncyk7CisKKyAgICAgICAgaWYgKGVuY29kZXJFcnIgPT0gQUFDRU5DX09LKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtSW5wdXRUaW1lVXM7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtT3V0Qnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVkID0gKGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpKSAtIGluYXJncy5udW1JblNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0YXJncy5udW1JblNhbXBsZXM7CisgICAgICAgICAgICAgICAgbUlucHV0VGltZVVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKGNvbnN1bWVkICogMTAwMDAwMGxsIC8gY2hhbm5lbENvdW50IC8gc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRhcmdzLm51bU91dEJ5dGVzKTsKKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgICAgICAgICAgICAgaGV4ZHVtcChvdXRQdHIsIHN0ZDo6bWluKG91dGFyZ3MubnVtT3V0Qnl0ZXMsIDI1NikpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb3V0UHRyID0gdGVtcDsKKyAgICAgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSAwOworICAgICAgICAgICAgICAgIGJsb2NrLnJlc2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbnB1dFNpemUgKz0gb3V0YXJncy5udW1JblNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRhcmdzLm51bUluU2FtcGxlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IChpbnQxNl90ICopaW5CdWZmZXJbMF0gKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclNpemVbMF0gLT0gb3V0YXJncy5udW1JblNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyAtPSBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZW5jb2RlckVyciA9ICVkIG1JbnB1dFNpemUgPSAlenUgaW5hcmdzLm51bUluU2FtcGxlcyA9ICVkLCBtSW5wdXRUaW1lVXMgPSAlbGxkIiwKKyAgICAgICAgICAgICAgZW5jb2RlckVyciwgbUlucHV0U2l6ZSwgaW5hcmdzLm51bUluU2FtcGxlcywgbUlucHV0VGltZVVzLnBlZWtsbCgpKTsKKyAgICB9CisKKyAgICBpZiAoZW9zICYmIGluQnVmZmVyU2l6ZVswXSA+IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyAmJiAhYmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3Vmlldy5yZXNldChuZXcgQzJXcml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKSk7CisgICAgICAgICAgICBvdXRQdHIgPSB3Vmlldy0+ZGF0YSgpOworICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gd1ZpZXctPnNpemUoKTsKKyAgICAgICAgICAgIC0tbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworCisgICAgICAgIG91dEJ1ZmZlclswXSA9IG91dFB0cjsKKyAgICAgICAgb3V0QnVmZmVyU2l6ZVswXSA9IG91dEF2YWlsYWJsZTsKKworICAgICAgICAvLyBGbHVzaAorICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gLTE7CisKKyAgICAgICAgKHZvaWQpYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKyAgICB9CisKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICBGaWxsV29yaygoQzJGcmFtZURhdGE6OmZsYWdzX3QpKGVvcyA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwKKyAgICAgICAgICAgICBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgTk9fRFJBSU46CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIERSQUlOX0NIQUlOOgorICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgICh2b2lkKXBvb2w7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFRpbWVTZXQgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgbUlucHV0VGltZVVzID0gMDsKKworICAgIC8vIFRPRE86IHdlIGRvbid0IGhhdmUgYW55IHBlbmRpbmcgd29yayBhdCB0aGlzIHRpbWUgdG8gZHJhaW4uCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QWFjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBYWNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzhiZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiYWFjZW5jX2xpYi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFhY0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDRU5DT0RFUiBtQUFDRW5jb2RlcjsKKworICAgIFVJTlQgbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBVSU5UIG1PdXRCdWZmZXJTaXplOworCisgICAgYm9vbCBtU2VudENvZGVjU3BlY2lmaWNEYXRhOworICAgIGJvb2wgbUlucHV0VGltZVNldDsKKyAgICBzaXplX3QgbUlucHV0U2l6ZTsKKyAgICBjMl9jbnRyNjRfdCBtSW5wdXRUaW1lVXM7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QYXJhbXMoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWFlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNDAKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTAgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTI1YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3NyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFNUk5CIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yTmJFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJXYkVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc4YWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgQU1STkIKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yTmJEZWMiCisjZWxzZQorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJXYkRlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJEZWMuaCIKKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisjaWZkZWYgQU1STkIKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiOworI2Vsc2UKKyAgY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRBbXJEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CCisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgorI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDE2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbygxNjAwMCl9KQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA0NzUwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0NzUwLCAxMjIwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2NjAwLCAyMzg1MCl9KQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJEZWM6OkMyU29mdEFtckRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQW1ySGFuZGxlKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0ciksCisgICAgICBtRGVjb2RlckNvb2tpZShudWxscHRyKSB7CisjaWZkZWYgQU1STkIKKyAgICBtSXNXaWRlID0gZmFsc2U7CisjZWxzZQorICAgIG1Jc1dpZGUgPSB0cnVlOworI2VuZGlmCit9CisKK0MyU29mdEFtckRlYzo6fkMyU29mdEFtckRlYygpIHsKKyAgICAodm9pZClvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25TdG9wKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChtQW1ySGFuZGxlKSB7CisgICAgICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgbURlY29kZXJDb29raWUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChpbnQ4X3QgKikiQU1STkJEZWNvZGVyIikpCisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbUFtckhhbmRsZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZNKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0geworICAgICAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgIDUsIDYsIDUsIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbMTZdID0geworICAgICAgICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLAorICAgICAgICA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworCisgICAgaWYgKEZNID4gMTUgfHwgKGlzV2lkZSAmJiBGTSA+IDkgJiYgRk0gPCAxNCkgfHwgKCFpc1dpZGUgJiYgRk0gPiAxMSAmJiBGTSA8IDE1KSkgeworICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgbW9kZSAlZCIsIEZNKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFkZCAxIGZvciBoZWFkZXIgYnl0ZQorICAgIHJldHVybiAoaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZNXSA6IGtGcmFtZVNpemVOQltGTV0pICsgMTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU51bUZyYW1lcyhjb25zdCB1aW50OCAqaW5wdXQsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmZyYW1lU2l6ZUxpc3QsIGJvb2wgaXNXaWRlKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBpblNpemU7KSB7CisgICAgICAgIGludDE2X3QgRk0gPSAoKGlucHV0WzBdID4+IDMpICYgMHgwZik7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGTSk7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpblNpemUgLSBrKSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGlucHV0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGsgKz0gZnJhbWVTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGZyYW1lU2l6ZUxpc3QtPnB1c2hfYmFjayhmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVMaXN0OworICAgIGlmIChPSyAhPSBjYWxjdWxhdGVOdW1GcmFtZXMoclZpZXcuZGF0YSgpICsgaW5PZmZzZXQsIGluU2l6ZSwgJmZyYW1lU2l6ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZyYW1lU2l6ZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgc2l6ZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCBvdXRTYW1wbGVzID0gbUlzV2lkZSA/IGtOdW1TYW1wbGVzUGVyRnJhbWVXQiA6IGtOdW1TYW1wbGVzUGVyRnJhbWVOQjsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZSA9IG91dFNhbXBsZXMgKiBmcmFtZVNpemVMaXN0LnNpemUoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBhdXRvIGl0ID0gZnJhbWVTaXplTGlzdC5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGZyYW1lU2l6ZUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoKmlucHV0ID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQgPSBBTVJEZWNvZGUobUFtckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGcmFtZV9UeXBlXzNHUFApIEZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyAxLCBvdXRwdXQsIE1JTUVfSUVURik7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQgKyAxKSAhPSAqaXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChGTSA+PSA5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGluc3RlYWQgb2YgY29tZm9ydCBub2lzZSBhbmQgZm9yCisgICAgICAgICAgICAgICAgLy8gc3BlZWNoIGxvc3Qvbm8gZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MTZfdCBGVDsKKyAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IG51bVJlY1NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBtaW1lX3Vuc29ydGluZyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsICZGVCwgJkZNLCAxLCAmcnhfc3RhdGUpOworICAgICAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYihGTSwgbUlucHV0U2FtcGxlQnVmZmVyLCBvdXRwdXQsICZudW1SZWNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgRlQsIG1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUmVjU2FtcGxlcyAhPSBvdXRTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgb3V0cHV0IHBlciBmcmFtZSBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgb3V0cHV0KSAqLworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVjU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtpXSAmPSAweGZmZkM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluUG9zICs9ICppdDsKKyAgICAgICAgb3V0cHV0ICs9IG91dFNhbXBsZXM7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBTVJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QU1SRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFtckRlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBTVJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFtckRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBbXJEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZU5CICAgPSAxNjAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVXQiAgID0gMzIwLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQgKm1BbXJIYW5kbGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgYm9vbCBtSXNXaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkOGNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJOYkVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yTmJFbmM6OkMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRW5jU3RhdGUobnVsbHB0ciksCisgICAgICBtU2lkU3RhdGUobnVsbHB0cikgeworfQorCitDMlNvZnRBbXJOYkVuYzo6fkMyU29mdEFtck5iRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25Jbml0KCkgeworICAgIGJvb2wgZHR4X2VuYWJsZSA9IGZhbHNlOworCisgICAgaWYgKEFNUkVuY29kZUluaXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSwgZHR4X2VuYWJsZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAvLyBUT0RPOiBnZXQgbW9kZSBkaXJlY3RseSBmcm9tIGNvbmZpZworICAgIHN3aXRjaChtSW50Zi0+Z2V0Qml0cmF0ZSgpKSB7CisgICAgICAgIGNhc2UgNDc1MDogbU1vZGUgPSBNUjQ3NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxNTA6IG1Nb2RlID0gTVI1MTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OTAwOiBtTW9kZSA9IE1SNTk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NzAwOiBtTW9kZSA9IE1SNjc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3NDAwOiBtTW9kZSA9IE1SNzQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OTUwOiBtTW9kZSA9IE1SNzk1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAyMDA6IG1Nb2RlID0gTVIxMDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjIwMDogbU1vZGUgPSBNUjEyMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBtTW9kZSA9IE1SNzk1OworICAgIH0KKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jU3RhdGUpIHsKKyAgICAgICAgQU1SRW5jb2RlRXhpdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlKTsKKyAgICAgICAgbUVuY1N0YXRlID0gbVNpZFN0YXRlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvblN0b3AoKSB7CisgICAgaWYgKEFNUkVuY29kZVJlc2V0KG1FbmNTdGF0ZSwgbVNpZFN0YXRlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0ga051bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtRmlsbGVkTGVuICsgaW5TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBvdXRwdXRCbG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZvdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3Qgb3V0UG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgaW50IHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywKKyAgICAgICAgICAgICAgICAgICAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIGluUG9zICs9IChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsIChpblNpemUgLSBpblBvcykpOworICAgICAgICAgICAgbUZpbGxlZExlbiArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgMCwgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlOworICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBBTVJFbmNvZGUobUVuY1N0YXRlLCBtU2lkU3RhdGUsIG1Nb2RlLCBtSW5wdXRGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LmRhdGEoKSArIG91dFBvcywgJmZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9UWF9XTUYpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwIHx8IG51bUVuY0J5dGVzID4gKChpbnQpb3V0Q2FwYWNpdHkgLSAoaW50KW91dFBvcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVGcmFtZSBjYWxsIGZhaWxlZCwgc3RhdGUgWyVkICV6dSAlenVdIiwgbnVtRW5jQnl0ZXMsIG91dFBvcywgb3V0Q2FwYWNpdHkpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0IGhlYWRlciBieXRlIGZyb20gV01GIHRvIElFVEYgZm9ybWF0LgorICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPiAwKQorICAgICAgICAgICAgd1ZpZXcuZGF0YSgpW291dFBvc10gPSAoKHdWaWV3LmRhdGEoKVtvdXRQb3NdIDw8IDMpIHwgNCkgJiAweDdjOworICAgICAgICBvdXRQb3MgKz0gbnVtRW5jQnl0ZXM7CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IGtOdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgIG1GaWxsZWRMZW4gPSAwOworICAgIH0KKyAgICBBTE9HVigiY2F1c2FsIHNhbXBsZSBzaXplICVkIiwgbUZpbGxlZExlbik7CisgICAgaWYgKG1Jc0ZpcnN0ICYmIG91dFBvcyAhPSAwKSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgfQorICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dFBvcyAhPSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoc3RkOjptb3ZlKG91dHB1dEJsb2NrKSwgMCwgb3V0UG9zKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgaWYgKG1GaWxsZWRMZW4pIEFMT0dWKCJEaXNjYXJkaW5nIHRyYWlsaW5nICVkIGJ5dGVzIiwgbUZpbGxlZExlbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBvbkZsdXNoX3NtKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBbXJOYkVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW1yTmJFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFtck5iRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiMTRkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiZ3NtYW1yX2VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFtck5iRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgIHB1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBbXJOYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtck5iRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNhbXBsZXNQZXJGcmFtZSA9IExfRlJBTUU7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkICptRW5jU3RhdGU7CisgICAgdm9pZCAqbVNpZFN0YXRlOworICAgIE1vZGUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtck5iRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWU0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCkBAIC0wLDAgKzEsNDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJXYkVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtcldiRW5jLmgiCisjaW5jbHVkZSAiY21uTWVtb3J5LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2NjAwLCAyMzg1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJXYkVuYzo6QzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNvZGVySGFuZGxlKG51bGxwdHIpLAorICAgICAgbUFwaUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1NZW1PcGVyYXRvcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFtcldiRW5jOjp+QzJTb2Z0QW1yV2JFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDY2MDA6IG1Nb2RlID0gVk9BTVJXQl9NRDY2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODg1MDogbU1vZGUgPSBWT0FNUldCX01EODg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI2NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDEyNjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDI1MDogbU1vZGUgPSBWT0FNUldCX01EMTQyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE4MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTk4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzMDUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUFwaUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICAgICAgbUFwaUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtTWVtT3BlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKKyAgICAgICAgbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvblN0b3AoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlc1BlckZyYW1lOyBpKyspIHsKKyAgICAgICAgbUlucHV0RnJhbWVbaV0gPSAweDAwMDg7IC8qIEVIRl9NQVNLICovCisgICAgfQorICAgIHVpbnQ4X3Qgb3V0QnVmZmVyW2tOdW1CeXRlc1BlcklucHV0RnJhbWVdOworICAgICh2b2lkKSBlbmNvZGVJbnB1dChvdXRCdWZmZXIsIGtOdW1CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgaWYgKCFtTWVtT3BlcmF0b3IpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KAorICAgICAgICAgICAgICAgICZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgVk9BTVJXQkZSQU1FVFlQRSB0eXBlID0gVk9BTVJXQl9SRkMzMjY3OworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0KKyAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICAmbU1vZGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1Nb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQzJTb2Z0QW1yV2JFbmM6OmVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworCisgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwKKyAgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbnB1dERhdGEpKTsKKworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBidWZmZXI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBsZW5ndGg7CisgICAgVk9fVTMyIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEoCisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBpZiAocmV0ICE9IFZPX0VSUl9OT05FICYmIHJldCAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKSB7CisgICAgICAgIEFMT0dEKCJlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgZW5jb2RlIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGF0YS5MZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBlbmNvZGVJbnB1dCgod1ZpZXcuZGF0YSgpICsgb3V0UG9zKSwgb3V0Q2FwYWNpdHkgLSBvdXRQb3MpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtcldiRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtcldiRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJXYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY29kZXJIYW5kbGU7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SICptTWVtT3BlcmF0b3I7CisgICAgVk9BTVJXQk1PREUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgaW50IGVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtcldiRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYmY1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTg5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMCwwICsxLDgxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW9tRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBb21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBb21EZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICBoZWxwZXIsIENPTVBPTkVOVF9OQU1FLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7CisgICAgICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIHNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLgorICAgICAgICAvLyBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworfTsKKworQzJTb2Z0QW9tRGVjOjpDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpeworCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitDMlNvZnRBb21EZWM6On5DMlNvZnRBb21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIFRyeSB0byBoYXJkIHJlc2V0IGRlY29kZXIuIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoYW9tX2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgYW9tX2NvZGVjX2N0eF90OworICAgIH0KKworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIEFMT0dFKCJtQ29kZWNDdHggaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGFvbV9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YoYW9tX2NvZGVjX2RlY19jZmdfdCkpOworICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgY2ZnLmFsbG93X2xvd2JpdGRlcHRoID0gMTsKKworICAgIGFvbV9jb2RlY19mbGFnc190IGZsYWdzOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZihhb21fY29kZWNfZmxhZ3NfdCkpOworCisgICAgYW9tX2NvZGVjX2Vycl90IGVycjsKKyAgICBpZiAoKGVyciA9IGFvbV9jb2RlY19kZWNfaW5pdChtQ29kZWNDdHgsIGFvbV9jb2RlY19hdjFfZHgoKSwgJmNmZywgMCkpKSB7CisgICAgICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkZXN0cm95RGVjb2RlcigpIHsKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIGFvbV9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFvbURlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXgsIGludGYgPSB0aGlzLT5tSW50Zl0oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworCisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbTogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0ICpoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkZyb20ocGFyYW0uZ2V0KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBvdXRQYXJhbSA9IEMyUGFyYW06OkNvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW0uZ2V0KCksIHRydWUgLypvdXRwdXQqLywgcGFyYW0tPnN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgb3V0UGFyYW0uZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqb3V0UGFyYW0uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmaW5pc2hXb3JrOiBDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBb21EZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPQorICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90KiBiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7CisgICAgICAgIGludDMyX3QgZGVsYXkgPSAwOworCisgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgYml0c3RyZWFtLCBpblNpemUpOworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisKKyAgICAgICAgYW9tX2NvZGVjX2Vycl90IGVyciA9CisgICAgICAgICAgICBhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgYml0c3RyZWFtLCBpblNpemUsICZmcmFtZUluZGV4KTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0ZCBkZWxheT0lNGRcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKKworICAgICAgICBpZiAoZXJyICE9IEFPTV9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUgZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgKHZvaWQpb3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspOworCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWluU2l6ZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCisgICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHVpbnQ4X3QqIGRzdFN0YXJ0ID0gZHN0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9Citib29sIEMyU29mdEFvbURlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIGFvbV9pbWFnZV90KiBpbWcgPSBhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDSyhpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwIHx8IGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOworCisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworCisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgKGludCkqKGludDY0X3QqKWltZy0+dXNlcl9wcml2KTsKKworICAgIHVpbnQ4X3QqIGRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ldOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ZdOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgICAgICAgICBkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCooaW50NjRfdCopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIGJsb2NrID0gbnVsbHB0cjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbkludGVybmFsKAorICAgIHVpbnQzMl90IGRyYWluTW9kZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYgd29yayAmJgorICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBb21GYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgQzJTb2Z0QW9tRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBb21EZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFvbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21GYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBb21GYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlICJhb20vYW9tX2RlY29kZXIuaCIKKyNpbmNsdWRlICJhb20vYW9tZHguaCIKKworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFvbURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW9tRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBhb21fY29kZWNfY3R4X3QqIG1Db2RlY0N0eDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgICNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworICAgICNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jayk7CisgICAgYm9vbCBvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBb21EZWMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgIndlYm0iCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC90ZW1wL2F2MSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJhdjEiCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsIG1UaW1lU3RhcnQudHZfc2VjLCBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobU91dEZpbGUsICIlc18lbGQuJWxkLiVzIiwgT1VUUFVUX0RVTVBfUEFUSCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCisgICAgfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRHVtcCB0byBmaWxlISIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgICAgICBpZiAoZnAgIT0gTlVMTCkgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRGVjLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0VuYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDE1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtMCwwICsxLDEwMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QXZjRGVjLmgiCisjaW5jbHVkZSAiaWgyNjRkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEF2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDh1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBjb2RlZCBhbmQgb3V0cHV0IHBpY3R1cmUgc2l6ZSBpcyB0aGUgc2FtZSBmb3IgdGhpcyBjb2RlYworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0h9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ180LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ181LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA4MHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA4MHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDE5Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0QXZjRGVjOjpDMlNvZnRBdmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7CisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6fkMyU29mdEF2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIMjY0RF9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3Rmcl9jaGFyczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLCBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGNsb25lQW5kU2VuZCBjYW4gYmUgYXZvaWRlZCBieSB0cmFja2luZyBudW1iZXIgb2YgZnJhbWVzIHJlbWFpbmluZworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbU91dEluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgIG1PdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEF2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIHsKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIGlmIChJU19JVkRfRkFUQUxfRVJST1Ioc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR042NChzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8IHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKWdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlZTU4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloMjY0ZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaDI2NGRfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWgyNjRkX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL2F2Y2RfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJoMjY0IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMICYmIG1fb2Zmc2V0ID09IDApIHsgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCkgbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGZwID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSwgbV9vZmZzZXQpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisKK2NsYXNzIEMyU29mdEF2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QXZjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpOworICAgIHZvaWQgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNDE5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCkBAIC0wLDAgKzEsMTc2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QXZjRW5jLmgiCisjaW5jbHVkZSAiaWgyNjRlLmgiCisjaW5jbHVkZSAiaWgyNjRlX2Vycm9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrTWluT3V0QnVmZmVyU2l6ZSA9IDUyNDI4ODsKK3ZvaWQgUGFyc2VHb3AoCisgICAgICAgIGNvbnN0IEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQgJmdvcCwKKyAgICAgICAgdWludDMyX3QgKnN5bmNJbnRlcnZhbCwgdWludDMyX3QgKmlJbnRlcnZhbCwgdWludDMyX3QgKm1heEJmcmFtZXMpIHsKKyAgICB1aW50MzJfdCBzeW5jSW50ID0gMTsKKyAgICB1aW50MzJfdCBpSW50ID0gMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdvcC5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEMyR29wTGF5ZXJTdHJ1Y3QgJmxheWVyID0gZ29wLm0udmFsdWVzW2ldOworICAgICAgICBpZiAobGF5ZXIuY291bnQgPT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgc3luY0ludCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3luY0ludCA8PSBVSU5UMzJfTUFYIC8gKGxheWVyLmNvdW50ICsgMSkpIHsKKyAgICAgICAgICAgIHN5bmNJbnQgKj0gKGxheWVyLmNvdW50ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsYXllci50eXBlXyAmIElfRlJBTUUpID09IDApIHsKKyAgICAgICAgICAgIGlmIChsYXllci5jb3VudCA9PSBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgaUludCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlJbnQgPD0gVUlOVDMyX01BWCAvIChsYXllci5jb3VudCArIDEpKSB7CisgICAgICAgICAgICAgICAgaUludCAqPSAobGF5ZXIuY291bnQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUgfCBCX0ZSQU1FKSAmJiBtYXhCZnJhbWVzKSB7CisgICAgICAgICAgICAqbWF4QmZyYW1lcyA9IGxheWVyLmNvdW50OworICAgICAgICB9CisgICAgfQorICAgIGlmIChzeW5jSW50ZXJ2YWwpIHsKKyAgICAgICAgKnN5bmNJbnRlcnZhbCA9IHN5bmNJbnQ7CisgICAgfQorICAgIGlmIChpSW50ZXJ2YWwpIHsKKyAgICAgICAgKmlJbnRlcnZhbCA9IGlJbnQ7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QXZjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjU2MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Hb3AsIEMyX1BBUkFNS0VZX0dPUCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsZXhDb3VudCAqLywgMHUgLyogc3RyZWFtICovKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Hb3AsIG0udmFsdWVzWzBdLnR5cGVfKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1Hb3AsIG0udmFsdWVzWzBdLmNvdW50KS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoR29wU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0KERFRkFVTFRfQl9GUkFNRVMpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFjdHVhbElucHV0RGVsYXksIHZhbHVlKS5pblJhbmdlKDAsIE1BWF9CX0ZSQU1FUyl9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoSW5wdXREZWxheVNldHRlciwgbUdvcCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUludHJhUmVmcmVzaCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIDAuKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW50cmFSZWZyZXNoLCBtb2RlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgcGVyaW9kKS5hbnkoKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSW50cmFSZWZyZXNoU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBMRVZFTF9BVkNfNF8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMUIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzMsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180LAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNSwKKyAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplLCBtRnJhbWVSYXRlLCBtQml0cmF0ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBJbnB1dERlbGF5U2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiAmZ29wKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICB1aW50MzJfdCBtYXhCZnJhbWVzID0gMDsKKyAgICAgICAgUGFyc2VHb3AoZ29wLnYsIG51bGxwdHIsIG51bGxwdHIsICZtYXhCZnJhbWVzKTsKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSBtYXhCZnJhbWVzOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJmJpdHJhdGUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IExldmVsTGltaXRzIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsOworICAgICAgICAgICAgZmxvYXQgbWJzUGVyU2VjOworICAgICAgICAgICAgdWludDY0X3QgbWJzOworICAgICAgICAgICAgdWludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsTGltaXRzIGtMaW1pdHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzEsICAgICAxNDg1LCAgICA5OSwgICAgIDY0MDAwIH0sCisgICAgICAgICAgICAvLyBEZWNvZGVyIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBsZXZlbCAxYi4KKyAgICAgICAgICAgIC8vIHsgTEVWRUxfQVZDXzFCLCAgICAxNDg1LCAgIDk5LCAgIDEyODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8xLCAgIDMwMDAsICAgMzk2LCAgICAxOTIwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMiwgICA2MDAwLCAgIDM5NiwgICAgMzg0MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsICAxMTg4MCwgICAzOTYsICAgIDc2ODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMiwgICAgMTE4ODAsICAgMzk2LCAgIDIwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMSwgIDE5ODAwLCAgIDc5MiwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsICAyMDI1MCwgIDE2MjAsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMywgICAgNDA1MDAsICAxNjIwLCAgMTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMSwgMTA4MDAwLCAgMzYwMCwgIDE0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDIxNjAwMCwgIDUxMjAsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNCwgICAyNDU3NjAsICA4MTkyLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMSwgMjQ1NzYwLCAgODE5MiwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDUyMjI0MCwgIDg3MDQsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNSwgICA1ODk4MjQsIDIyMDgwLCAxMzUwMDAwMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50NjRfdCBtYnMgPSB1aW50NjRfdCgoc2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChzaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpOworICAgICAgICBmbG9hdCBtYnNQZXJTZWMgPSBmbG9hdChtYnMpICogZnJhbWVSYXRlLnYudmFsdWU7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1cHBsaWVkIGxldmVsIG1lZXRzIHRoZSBNQiAvIGJpdHJhdGUgcmVxdWlyZW1lbnRzLiBJZgorICAgICAgICAvLyBub3QsIHVwZGF0ZSB0aGUgbGV2ZWwgd2l0aCB0aGUgbG93ZXN0IGxldmVsIG1lZXRpbmcgdGhlIHJlcXVpcmVtZW50cy4KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQgbmVlZHNVcGRhdGUgPSBmYWxzZSBpbiBjYXNlIHRoZSBzdXBwbGllZCBsZXZlbCBkb2VzIG1lZXQKKyAgICAgICAgLy8gdGhlIHJlcXVpcmVtZW50cy4gRm9yIExldmVsIDFiLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgbGV2ZWwgYW55d2F5LAorICAgICAgICAvLyBzbyB3ZSBzZXQgaXQgdG8gdHJ1ZSBpbiB0aGF0IGNhc2UuCisgICAgICAgIGJvb2wgbmVlZHNVcGRhdGUgPSAobWUudi5sZXZlbCA9PSBMRVZFTF9BVkNfMUIpOworICAgICAgICBmb3IgKGNvbnN0IExldmVsTGltaXRzICZsaW1pdCA6IGtMaW1pdHMpIHsKKyAgICAgICAgICAgIGlmIChtYnMgPD0gbGltaXQubWJzICYmIG1ic1BlclNlYyA8PSBsaW1pdC5tYnNQZXJTZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS52LnZhbHVlIDw9IGxpbWl0LmJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBhbmQgaWYKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHNlZW4gdGhlIHN1cHBsaWVkIGxldmVsIHlldCwgdGhhdCBtZWFucyB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICBpZiAobmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkdpdmVuIGxldmVsICV4IGRvZXMgbm90IGNvdmVyIGN1cnJlbnQgY29uZmlndXJhdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0aW5nIHRvICV4IiwgbWUudi5sZXZlbCwgbGltaXQubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IGxpbWl0LmxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWUudi5sZXZlbCA9PSBsaW1pdC5sZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHRoZSBsb3dlc3QgZmVhc2libGUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZC4gVGhlIGZhY3QgdGhhdCB3ZSdyZSBoZXJlIG1lYW5zIHRoYXQgb3VyIGxldmVsIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBtZWV0IHRoZSByZXF1aXJlbWVudCBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgLy8gV2Ugc2V0IHRvIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsZXZlbC4KKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfQVZDXzU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSW50cmFSZWZyZXNoU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnBlcmlvZCA8IDEpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1vZGUgPSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRDsKKyAgICAgICAgICAgIG1lLnNldCgpLnBlcmlvZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBvbmx5IHN1cHBvcnQgYXJiaXRyYXJ5IG1vZGUgKGN5Y2xpYyBpbiBvdXIgY2FzZSkKKyAgICAgICAgICAgIG1lLnNldCgpLm1vZGUgPSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9BUkJJVFJBUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEdvcFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lLnYuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJHb3BMYXllclN0cnVjdCAmbGF5ZXIgPSBtZS52Lm0udmFsdWVzWzBdOworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FIHwgQl9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXIuY291bnQgPiBNQVhfQl9GUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tLnZhbHVlc1tpXS5jb3VudCA9IE1BWF9CX0ZSQU1FUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIElWX1BST0ZJTEVfVCBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0JBU0VMSU5FOiByZXR1cm4gSVZfUFJPRklMRV9CQVNFOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX01BSU46ICAgICByZXR1cm4gSVZfUFJPRklMRV9NQUlOOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIElWX1BST0ZJTEVfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGF2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgIDEwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xQiwgICA5IH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsIDExIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsIDEyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsIDEzIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgIDIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsIDIxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsIDIyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDMxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDMyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDQwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDQxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDQyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDUwIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5hdmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDQxOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZF9sKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGdldEludHJhUmVmcmVzaF9sKCkgY29uc3QgeyByZXR1cm4gbUludHJhUmVmcmVzaDsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gZ2V0R29wX2woKSBjb25zdCB7IHJldHVybiBtR29wOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBtR29wOworfTsKKworI2RlZmluZSBpdmVfYXBpX2Z1bmN0aW9uICBpaDI2NGVfYXBpX2Z1bmN0aW9uCisKK25hbWVzcGFjZSB7CisKKy8vIEZyb20gZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIvaWgyNjRlX2JpdHN0cmVhbS5oCitjb25zdGV4cHIgdWludDMyX3QgTUlOX1NUUkVBTV9TSVpFID0gMHg4MDA7CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDMlNvZnRBdmNFbmM6OkMyU29mdEF2Y0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtSXZWaWRlb0NvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1BVkNFbmNQcm9maWxlKElWX1BST0ZJTEVfQkFTRSksCisgICAgICBtQVZDRW5jTGV2ZWwoNDEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0ciksCisgICAgICBtT3V0QmxvY2sobnVsbHB0ciksCisgICAgICBtT3V0QnVmZmVyU2l6ZShrTWluT3V0QnVmZmVyU2l6ZSkgeworCisgICAgLy8gSWYgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKworQzJTb2Z0QXZjRW5jOjp+QzJTb2Z0QXZjRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25TdG9wKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVzZXQoKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX1JFU0VUPworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkICBDMlNvZnRBdmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWcgPSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBOworICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKKyAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90IHNfZGltZW5zaW9uc19pcDsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3Qgc19kaW1lbnNpb25zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZGltZW5zaW9uc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1TaXplLT53aWR0aDsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE51bUNvcmVzKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX251bV9jb3Jlc19pcDsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX251bV9jb3Jlc19vcDsKKyAgICBzX251bV9jb3Jlc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKworICAgIHNfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX2lwLCAodm9pZCAqKSAmc19udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9jZXNzb3IgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3QpOworICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfcmF0ZV9pcCwgJnNfZnJhbWVfcmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHJhdGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2NvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS0+dmFsdWU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19iaXRyYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90KTsKKyAgICBzX2JpdHJhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2JpdHJhdGVfaXAsICZzX2JpdHJhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBiaXQgcmF0ZSA9IDB4JXhcbiIsIHNfYml0cmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRRcCgpIHsKKyAgICBpdmVfY3RsX3NldF9xcF9pcF90IHNfcXBfaXA7CisgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfcXBfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3FwX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9RUDsKKworICAgIHNfcXBfaXAudTRfaV9xcCA9IERFRkFVTFRfSV9RUDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcXBfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9pcF90KTsKKyAgICBzX3FwX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcXBfaXAsICZzX3FwX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcXAgMHgleFxuIiwgc19xcF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQlYgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRBaXJQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90IHNfYWlyX2lwOworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCBzX2Fpcl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2Fpcl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYWlyX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9BSVJfUEFSQU1TOworCisgICAgc19haXJfaXAuZV9haXJfbW9kZSA9CisgICAgICAgIChtSW50cmFSZWZyZXNoLT5tb2RlID09IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEIHx8IG1JbnRyYVJlZnJlc2gtPnBlcmlvZCA8IDEpCisgICAgICAgICAgICA/IElWRV9BSVJfTU9ERV9OT05FIDogSVZFX0FJUl9NT0RFX0NZQ0xJQzsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtSW50cmFSZWZyZXNoLT5wZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRNZVBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3Qgc19tZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3Qgc19tZV9wYXJhbXNfb3A7CisKKyAgICBzX21lX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbWVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9NRV9QQVJBTVM7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfZmFzdF9zYWQgPSBtRW5hYmxlRmFzdFNhZDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfYWx0X3JlZiA9IG1FbmFibGVBbHRSZWY7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfaHBlbCA9IG1IYWxmUGVsRW5hYmxlOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9xcGVsID0gREVGQVVMVF9RUEVMOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X21lX3NwZWVkX3ByZXNldCA9IERFRkFVTFRfTUVfU1BFRUQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeCA9IERFRkFVTFRfU1JDSF9STkdfWDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ195ID0gREVGQVVMVF9TUkNIX1JOR19ZOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90KTsKKyAgICBzX21lX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19tZV9wYXJhbXNfaXAsICZzX21lX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IG1lIHBhcmFtcyA9IDB4JXhcbiIsIHNfbWVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgR09QIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UHJvZmlsZVBhcmFtcygpIHsKKyAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgaWYgKHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID09IElWX1BST0ZJTEVfQkFTRSkgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IDE7CisgICAgfQorICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90KTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERlYmxvY2tQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3Qgc19kZWJsb2NrX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90IHNfZGVibG9ja19wYXJhbXNfb3A7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfREVCTE9DS19QQVJBTVM7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X2Rpc2FibGVfZGVibG9ja19sZXZlbCA9IG1EaXNhYmxlRGVibGtMZXZlbDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90KTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGVibG9ja19wYXJhbXNfaXAsICZzX2RlYmxvY2tfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBkZWJsb2NrIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHUxX3ZlcnNpb24gPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSAmc19jdGxfaXAsICh2b2lkICopICZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbjogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZW5jb2RlciB2ZXJzaW9uOiAlcyIsIChjaGFyICopc19jdGxfaXAucHUxX3ZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiBsZXZlbDsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnJUeXBlID0gQzJfT0s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gZ29wOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIG1BVkNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICAgICAgbUlEUkludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIGdvcCA9IG1JbnRmLT5nZXRHb3BfbCgpOworICAgIH0KKyAgICBpZiAoZ29wICYmIGdvcC0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN5bmNJbnRlcnZhbCA9IDE7CisgICAgICAgIHVpbnQzMl90IGlJbnRlcnZhbCA9IDE7CisgICAgICAgIHVpbnQzMl90IG1heEJmcmFtZXMgPSAwOworICAgICAgICBQYXJzZUdvcCgqZ29wLCAmc3luY0ludGVydmFsLCAmaUludGVydmFsLCAmbWF4QmZyYW1lcyk7CisgICAgICAgIGlmIChzeW5jSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICBBTE9HRCgiVXBkYXRpbmcgSURSIGludGVydmFsIGZyb20gR09QOiBvbGQgJXUgbmV3ICV1IiwgbUlEUkludGVydmFsLCBzeW5jSW50ZXJ2YWwpOworICAgICAgICAgICAgbUlEUkludGVydmFsID0gc3luY0ludGVydmFsOworICAgICAgICB9CisgICAgICAgIGlmIChpSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICBBTE9HRCgiVXBkYXRpbmcgSSBpbnRlcnZhbCBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1JSW50ZXJ2YWwsIGlJbnRlcnZhbCk7CisgICAgICAgICAgICBtSUludGVydmFsID0gaUludGVydmFsOworICAgICAgICB9CisgICAgICAgIGlmIChtQmZyYW1lcyAhPSBtYXhCZnJhbWVzKSB7CisgICAgICAgICAgICBBTE9HRCgiVXBkYXRpbmcgbWF4IEIgZnJhbWVzIGZyb20gR09QOiBvbGQgJXUgbmV3ICV1IiwgbUJmcmFtZXMsIG1heEJmcmFtZXMpOworICAgICAgICAgICAgbUJmcmFtZXMgPSBtYXhCZnJhbWVzOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICBtU3RyaWRlID0gd2lkdGg7CisKKyAgICAvLyBBc3N1bWUgd29yc3QgY2FzZSBvdXRwdXQgYnVmZmVyIHNpemUgdG8gYmUgZXF1YWwgdG8gbnVtYmVyIG9mIGJ5dGVzIGluIGlucHV0CisgICAgbU91dEJ1ZmZlclNpemUgPSBzdGQ6Om1heCh3aWR0aCAqIGhlaWdodCAqIDMgLyAyLCBrTWluT3V0QnVmZmVyU2l6ZSk7CisKKyAgICAvLyBUT0RPCisgICAgbUl2VmlkZW9Db2xvckZvcm1hdCA9IElWX1lVVl80MjBQOworCisgICAgQUxPR0QoIlBhcmFtcyB3aWR0aCAlZCBoZWlnaHQgJWQgbGV2ZWwgJWQgY29sb3JGb3JtYXQgJWQgYmZyYW1lcyAlZCIsIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LCBtQVZDRW5jTGV2ZWwsIG1JdlZpZGVvQ29sb3JGb3JtYXQsIG1CZnJhbWVzKTsKKworICAgIC8qIEdldHRpbmcgTnVtYmVyIG9mIE1lbVJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X251bV9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfbnVtX21lbV9yZWNfaXAsICZzX251bV9tZW1fcmVjX29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJHZXQgbnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisKKyAgICAgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFycmF5IHRvIGhvbGQgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBpZiAobU51bU1lbVJlY29yZHMgPiBTSVpFX01BWCAvIHNpemVvZihpdl9tZW1fcmVjX3QpKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgbWVtb3J5IHNpemUgaXMgdG9vIGJpZy4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190ICopbWFsbG9jKG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChudWxscHRyID09IG1NZW1SZWNvcmRzKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob2xkIG1lbW9yeSByZWNvcmRzOiBTaXplICV6dSIsCisgICAgICAgICAgICAgICAgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+ZV9tZW1fdHlwZSA9IElWX05BX01FTV9UWVBFOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXR0aW5nIE1lbVJlY29yZHMgQXR0cmlidXRlcyAqLworICAgIHsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9yZWNfaXA7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fcmVjX29wOworCisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF93ZCA9IHdpZHRoOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jb2xvcl9mb3JtYXQgPSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX2ZpbGxfbWVtX3JlY19pcCwgJnNfZmlsbF9tZW1fcmVjX29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGaWxsIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRpbmcgTWVtb3J5IGZvciBNZW0gUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgV09SRDMyIHRvdGFsX3NpemU7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgdG90YWxfc2l6ZSA9IDA7CisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmVfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW0gcmVjb3JkIGlkICV6dSBzaXplICV1XG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gcHNfbWVtX3JlYy0+dTRfbWVtX3NpemU7CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvZGVjIEluc3RhbmNlIENyZWF0aW9uICovCisgICAgeworICAgICAgICBpdmVfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICAgICAgaXZlX2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gKHZvaWQgKilpdmVfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X2lwX3QpOworICAgICAgICBzX2luaXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9vcF90KTsKKworICAgICAgICBzX2luaXRfaXAuZV9jbWQgPSBJVl9DTURfSU5JVDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2luaXRfaXAuZV9pbnBfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgICAgICBpZiAobVJlY29uRW5hYmxlIHx8IG1QU05SRW5hYmxlKSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAwOworICAgICAgICB9CisgICAgICAgIHNfaW5pdF9pcC5lX3JlY29uX2NvbG9yX2ZtdCA9IERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUOworICAgICAgICBzX2luaXRfaXAuZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2ZyYW1lcmF0ZSA9IERFRkFVTFRfTUFYX0ZSQU1FUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9iZnJhbWVzID0gbUJmcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC5lX2NvbnRlbnRfdHlwZSA9IElWX1BST0dSRVNTSVZFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKyAgICAgICAgc19pbml0X2lwLmVfc2xpY2VfbW9kZSA9IG1TbGljZU1vZGU7CisgICAgICAgIHNfaW5pdF9pcC51NF9zbGljZV9wYXJhbSA9IG1TbGljZVBhcmFtOworICAgICAgICBzX2luaXRfaXAuZV9hcmNoID0gbUFyY2g7CisgICAgICAgIHNfaW5pdF9pcC5lX3NvYyA9IERFRkFVTFRfU09DOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pbml0X2lwLCAmc19pbml0X29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbml0IGVuY29kZXIgZmFpbGVkID0gMHgleFxuIiwgc19pbml0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCBDb2RlYyBWZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogc2V0IHByb2Nlc3NvciBkZXRhaWxzICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIGRpbWVuc2lvbnMgKi8KKyAgICBzZXREaW1lbnNpb25zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSByYXRlcyAqLworICAgIHNldEZyYW1lUmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgSVBFIFBhcmFtcyAqLworICAgIHNldElwZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQml0cmF0ZSAqLworICAgIHNldEJpdFJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFFQICovCisgICAgc2V0UXAoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEFJUiBwYXJhbXMgKi8KKyAgICBzZXRBaXJQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFZCViBwYXJhbXMgKi8KKyAgICBzZXRWYnZQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IE1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtcyAqLworICAgIHNldE1lUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBHT1AgcGFyYW1zICovCisgICAgc2V0R29wUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBEZWJsb2NrIHBhcmFtcyAqLworICAgIHNldERlYmxvY2tQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFByb2ZpbGUgcGFyYW1zICovCisgICAgc2V0UHJvZmlsZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgaW4gRW5jb2RlIGhlYWRlciBtb2RlICovCisgICAgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfSEVBREVSKTsKKworICAgIEFMT0dWKCJpbml0X2NvZGVjIHN1Y2Nlc3NmdWxsIik7CisKKyAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzID0gSVZfU1VDQ0VTUzsKKyAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3Qgc19yZXRyaWV2ZV9tZW1faXA7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19vcF90IHNfcmV0cmlldmVfbWVtX29wOworICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNfcmV0cmlldmVfbWVtX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfcmV0cmlldmVfbWVtX3JlY19pcF90KTsKKyAgICBzX3JldHJpZXZlX21lbV9vcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1faXAuZV9jbWQgPSBJVl9DTURfUkVUUklFVkVfTUVNUkVDOworICAgIHNfcmV0cmlldmVfbWVtX2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19yZXRyaWV2ZV9tZW1faXAsICZzX3JldHJpZXZlX21lbV9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byByZXRyaWV2ZSBtZW1vcnkgcmVjb3JkcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLyogRnJlZSBtZW1vcnkgcmVjb3JkcyAqLworICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNfcmV0cmlldmVfbWVtX29wLnU0X251bV9tZW1fcmVjX2ZpbGxlZDsgaSsrKSB7CisgICAgICAgIGlmIChwc19tZW1fcmVjKSBpdmVfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtZW1vcnkgcmVjb3JkIGlzIG51bGwuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICB9CisKKyAgICBpZiAobU1lbVJlY29yZHMpIGZyZWUobU1lbVJlY29yZHMpOworCisgICAgLy8gY2xlYXIgb3RoZXIgcG9pbnRlcnMgaW50byB0aGUgc3BhY2UgYmVpbmcgZnJlZSgpZAorICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY29kZUFyZ3MoCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpIHsKKyAgICBpdl9yYXdfYnVmX3QgKnBzX2lucF9yYXdfYnVmOworICAgIG1lbXNldChwc19lbmNvZGVfaXAsIDAsIHNpemVvZigqcHNfZW5jb2RlX2lwKSk7CisgICAgbWVtc2V0KHBzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKCpwc19lbmNvZGVfb3ApKTsKKworICAgIHBzX2lucF9yYXdfYnVmID0gJnBzX2VuY29kZV9pcC0+c19pbnBfYnVmOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnB2X2J1ZiA9IGJhc2U7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnl0ZXMgPSAwOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J1ZnNpemUgPSBjYXBhY2l0eTsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9pcF90KTsKKyAgICBwc19lbmNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9vcF90KTsKKworICAgIHBzX2VuY29kZV9pcC0+ZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0VOQ09ERTsKKyAgICBwc19lbmNvZGVfaXAtPnB2X2J1ZnMgPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfbWJfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9waWNfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT51NF9tYl9pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfcGljX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gd29ya0luZGV4ID4+IDMyOworICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IHdvcmtJbmRleCAmIDB4RkZGRkZGRkY7CisgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYucHZfYnVmID0gbnVsbHB0cjsKKworICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLworICAgIG1lbXNldChwc19pbnBfcmF3X2J1ZiwgMCwgc2l6ZW9mKGl2X3Jhd19idWZfdCkpOworICAgIHBzX2lucF9yYXdfYnVmLT51NF9zaXplID0gc2l6ZW9mKGl2X3Jhd19idWZfdCk7CisgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJ3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsIGlucHV0LT53aWR0aCgpLCBpbnB1dC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSBpbnB1dC0+bGF5b3V0KCk7CisgICAgdWludDhfdCAqeVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICp1UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKnZQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBBTE9HVigieVBsYW5lU2l6ZSA9ICV6dSIsIHlQbGFuZVNpemUpOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKmlucHV0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JdlZpZGVvQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwUDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnN0IGJ1dCBJdHRpYW0gQVBJIHdhbnRzIGJhcmUgcG9pbnRlci4KKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1syXSA9IHZQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMl0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMl0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsyXSA9IHZTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0gcHUxX2J1ZjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBtV2lkdGggKiAyOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IG1IZWlnaHQ7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSBtU3RyaWRlICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OmZpbmlzaFdvcmsodWludDY0X3Qgd29ya0luZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKG1PdXRCbG9jaywgMCwgcHNfZW5jb2RlX29wLT5zX291dF9idWYudTRfYnl0ZXMpOworICAgIGlmIChJVl9JRFJfRlJBTUUgPT0gcHNfZW5jb2RlX29wLT51NF9lbmNvZGVkX2ZyYW1lX3R5cGUpIHsKKyAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgIH0KKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3Qod29ya0luZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2god29ya0luZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgdGltZURlbGF5ID0gMDsKKyAgICBXT1JEMzIgdGltZVRha2VuID0gMDsKKyAgICB1aW50NjRfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIGMyX3N0YXR1c190IGVycm9yOworICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7CisgICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7CisKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgeworICAgICAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlYWRlckxlbmd0aCA9IE1JTl9TVFJFQU1fU0laRTsKKyAgICAgICAgdWludDhfdCBoZWFkZXJba0hlYWRlckxlbmd0aF07CisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgbnVsbHB0ciwgaGVhZGVyLCBrSGVhZGVyTGVuZ3RoLCB3b3JrSW5kZXgpOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZDogJWQiLCBlcnJvcik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBoZWFkZXIgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkJ5dGVzIEdlbmVyYXRlZCBpbiBoZWFkZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIHNldEJpdFJhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRyYVJlZnJlc2ggIT0gbUludHJhUmVmcmVzaCkgeworICAgICAgICAgICAgbUludHJhUmVmcmVzaCA9IGludHJhUmVmcmVzaDsKKyAgICAgICAgICAgIHNldEFpclBhcmFtcygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3RTeW5jICE9IG1SZXF1ZXN0U3luYykgeworICAgICAgICAgICAgLy8gd2UgY2FuIGhhbmRsZSBJRFIgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0U3luYy0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnNldCByZXF1ZXN0CisgICAgICAgICAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQgY2xlYXJTeW5jKDB1LCBDMl9GQUxTRSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyAmY2xlYXJTeW5jIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IHN5bmMgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIHNldEZyYW1lVHlwZShJVl9JRFJfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgfQorCisgICAgLyogSW4gbm9ybWFsIG1vZGUsIHN0b3JlIGlucHV0QnVmZmVySW5mbyBhbmQgdGhpcyB3aWxsIGJlIHJldHVybmVkCisgICAgICAgd2hlbiBlbmNvZGVyIGNvbnN1bWVzIHRoaXMgaW5wdXQgKi8KKyAgICAvLyBpZiAoIW1JbnB1dERhdGFJc01ldGEgJiYgKGlucHV0QnVmZmVySW5mbyAhPSBOVUxMKSkgeworICAgIC8vICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUzsgaSsrKSB7CisgICAgLy8gICAgICAgICBpZiAoTlVMTCA9PSBtSW5wdXRCdWZmZXJJbmZvW2ldKSB7CisgICAgLy8gICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXSA9IGlucHV0QnVmZmVySW5mbzsKKyAgICAvLyAgICAgICAgICAgICBicmVhazsKKyAgICAvLyAgICAgICAgIH0KKyAgICAvLyAgICAgfQorICAgIC8vIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgdmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmICh2aWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyAmJiB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIGJyZWFrOworICAgICAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaCBsaW5lYXIgYmxvY2sgZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZXJyID0gJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCB2aWV3LmdldCgpLCB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIHdvcmtJbmRleCk7CisgICAgICAgIGlmIChlcnJvciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIDogJWQiLCBlcnJvcik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyb3I7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRFVNUF9UT19GSUxFKAorICAgICAgICAvLyAgICAgICAgIG1JbkZpbGUsIHNfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSwKKyAgICAgICAgLy8gICAgICAgICAobUhlaWdodCAqIG1TdHJpZGUgKiAzIC8gMikpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmICgoc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpID09IElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0dFVEJVRklORk8gZm9yIHByb3BlciBtYXggaW5wdXQgc2l6ZT8KKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSB3aGlsZSAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpOworCisgICAgLy8gSG9sZCBpbnB1dCBidWZmZXIgcmVmZXJlbmNlCisgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgIG1CdWZmZXJzW3NfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXV0gPSBpbnB1dEJ1ZmZlcjsKKyAgICB9CisKKyAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisKKyAgICB2b2lkICpmcmVlZCA9IHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKKyAgICAvKiBJZiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCisgICAgaWYgKGZyZWVkICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1CdWZmZXJzLmNvdW50KGZyZWVkKSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBub3QgdHJhY2tlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVsZWFzZSBpbnB1dCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShmcmVlZCk7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZShmcmVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc19lbmNvZGVfb3Aub3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgaWYgKCFzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvcjogT3V0cHV0IHByZXNlbnQgYnV0IGJ5dGVzIGdlbmVyYXRlZCBpcyB6ZXJvIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2xvdzsKKyAgICAgICAgZmluaXNoV29yayh3b3JrSWQsIHdvcmssICZzX2VuY29kZV9vcCk7CisgICAgfQorICAgIGlmIChtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKKyAgICAgICAgaWYgKEMyX09LICE9IHNldEVuY29kZUFyZ3MoJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LmJhc2UoKSwgd1ZpZXcuY2FwYWNpdHkoKSwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCBmb3IgZHJhaW5JbnRlcm5hbCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKWl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KKyAgICAgICAgaWYgKGZyZWVkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIG5vdCB0cmFja2VkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZShmcmVlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc19lbmNvZGVfb3Aub3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHdvcmtJZCA9ICgodWludDY0X3Qpc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2xvdzsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsod29ya0lkLCB3b3JrLCAmc19lbmNvZGVfb3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDF1KSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBdmNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QXZjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QXZjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBdmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUwNTViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYyLmgiCisjaW5jbHVkZSAiaXZlMi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICAgICAgICAgIDQKKyNkZWZpbmUgTEVOX1NUQVRVU19CVUZGRVIgICAgICAgICgxMCAgKiAxMDI0KQorI2RlZmluZSBNQVhfVkJWX0JVRkZfU0laRSAgICAgICAgKDEyMCAqIDE2Mzg0KQorI2RlZmluZSBNQVhfTlVNX0lPX0JVRlMgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX0JfRlJBTUVTICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKKyNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjQwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWCAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9GUkFNRVJBVEUgICAgICAgMTIwMDAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfTlVNX0NPUkVTX1BSRV9FTkMgICAwCisjZGVmaW5lIERFRkFVTFRfRlBTICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0VOQ19TUEVFRCAgICAgICAgICAgSVZFX05PUk1BTAorCisjZGVmaW5lIERFRkFVTFRfTUVNX1JFQ19DTlQgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkVDT05fRU5BQkxFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfQ0hLU1VNX0VOQUJMRSAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1RBUlRfRlJNICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTlVNX0ZSTVMgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIERFRkFVTFRfSU5QX0NPTE9SX0ZPUk1BVCAgICAgICBJVl9ZVVZfNDIwU1BfVlUKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9DT0xPUl9GT1JNQVQgICAgIElWX1lVVl80MjBQCisjZGVmaW5lIERFRkFVTFRfTE9PUEJBQ0sgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU1JDX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX1RHVF9GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9NQVhfV0QgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfSFQgICAgICAgICAgICAgIDE5MjAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTEVWRUwgICAgICAgICAgIDQxCisjZGVmaW5lIERFRkFVTFRfU1RSSURFICAgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfV0QgICAgICAgICAgICAgICAgICAxMjgwCisjZGVmaW5lIERFRkFVTFRfSFQgICAgICAgICAgICAgICAgICA3MjAKKyNkZWZpbmUgREVGQVVMVF9QU05SX0VOQUJMRSAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9NRV9TUEVFRCAgICAgICAgICAgIDEwMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRCAgICAgMAorI2RlZmluZSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JDX01PREUgICAgICAgICAgICAgSVZFX1JDX1NUT1JBR0UKKyNkZWZpbmUgREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgIDYwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9JX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0lfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9QX1FQICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIERFRkFVTFRfUF9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9CX1FQICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NQVggICAgICAgICAgICBERUZBVUxUX1FQX01BWAorI2RlZmluZSBERUZBVUxUX0JfUVBfTUlOICAgICAgICAgICAgREVGQVVMVF9RUF9NSU4KKyNkZWZpbmUgREVGQVVMVF9BSVIgICAgICAgICAgICAgICAgIElWRV9BSVJfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfQUlSX1JFRlJFU0hfUEVSSU9EICAzMAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1ggICAgICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19ZICAgICAgICAgIDQ4CisjZGVmaW5lIERFRkFVTFRfSV9JTlRFUlZBTCAgICAgICAgICAzMAorI2RlZmluZSBERUZBVUxUX0lEUl9JTlRFUlZBTCAgICAgICAgMTAwMAorI2RlZmluZSBERUZBVUxUX0JfRlJBTUVTICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUwgMAorI2RlZmluZSBERUZBVUxUX0hQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX1FQRUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0k0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX0VQUk9GSUxFICAgICAgICAgICAgSVZfUFJPRklMRV9CQVNFCisjZGVmaW5lIERFRkFVTFRfRU5UUk9QWV9NT0RFICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfTU9ERSAgICAgICAgICBJVkVfU0xJQ0VfTU9ERV9OT05FCisjZGVmaW5lIERFRkFVTFRfU0xJQ0VfUEFSQU0gICAgICAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9BUkNIICAgICAgICAgICAgICAgIEFSQ0hfQVJNX0E5UQorI2RlZmluZSBERUZBVUxUX1NPQyAgICAgICAgICAgICAgICAgU09DX0dFTkVSSUMKKyNkZWZpbmUgREVGQVVMVF9JTlRSQTR4NCAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RSTEVOR1RIICAgICAgICAgICAgICAgICAgIDUwMAorI2RlZmluZSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBICAgMAorCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpKT8gKGEpIDogKGIpCisjZGVmaW5lIEFMSUdOMTYoeCkgKCgoKHgpICsgMTUpID4+IDQpIDw8IDQpCisjZGVmaW5lIEFMSUdOMTI4KHgpICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKKyNkZWZpbmUgQUxJR040MDk2KHgpICgoKCh4KSArIDQwOTUpID4+IDEyKSA8PCAxMikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNkZWZpbmUgaXZlX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmVfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKK3N0cnVjdCBDMlNvZnRBdmNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QXZjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyU29mdEF2Y0VuYygpOworCitwcml2YXRlOgorICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CisgICAgICAgIGludDMyX3QgbUZsYWdzOworICAgIH0gSW5wdXRCdWZmZXJJbmZvOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIGludDMyX3QgbVN0cmlkZTsKKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworCisgICAgSVZfUFJPRklMRV9UIG1BVkNFbmNQcm9maWxlIF9fdW51c2VkOworICAgIFdPUkQzMiAgIG1BVkNFbmNMZXZlbDsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisKKyAgICBib29sICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgICAgIG1JbnRyYTR4NDsKKyAgICBib29sICAgICBtRW5hYmxlRmFzdFNhZDsKKyAgICBib29sICAgICBtRW5hYmxlQWx0UmVmOworICAgIGJvb2wgICAgIG1SZWNvbkVuYWJsZTsKKyAgICBib29sICAgICBtUFNOUkVuYWJsZTsKKyAgICBib29sICAgICBtRW50cm9weU1vZGU7CisgICAgYm9vbCAgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnOworICAgIElWRV9TUEVFRF9DT05GSUcgICAgIG1FbmNTcGVlZDsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSBjb2RlYworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHVzZWQgYnkgdGhlIGNvZGVjCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dEJsb2NrOworCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworICAgIFVXT1JEMzIgbUJmcmFtZXM7CisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIGMyX3N0YXR1c190IHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UXAoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIGMyX3N0YXR1c190IHNldERpbWVuc2lvbnMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIGMyX3N0YXR1c190IHNldEZyYW1lUmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldElwZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEJpdFJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRBaXJQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRNZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEdvcFBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHdvcmtJbmRleCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IHdvcmtJbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3ApOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwodWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0VuYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvbWVkaWEvYXZjZV9pbnB1dCIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICAgICIvc2RjYXJkL21lZGlhL2F2Y2Vfb3V0cHV0IgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgICAgICJoMjY0IgorCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICBPVVRQVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwODM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApAQCAtMCwwICsxLDEzNCBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyX3NvZnQtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMyQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJTaW1wbGVDMkludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAgICAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBNdXRleGVkCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiY29kZWMyX3NvZnRfZXhwb3J0cyIsCisgICAgc3JjczogWyAiZXhwb3J0cy5sZHMiIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkgYXMgaXRzIHN0YWJpbGl0eSBpcyBub3QgZ3VhcmFudGVlZAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZlcnNpb25fc2NyaXB0OiAiOmNvZGVjMl9zb2Z0X2V4cG9ydHMiLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLCAvLyBmb3IgSW1hZ2VDb3B5CisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwgLy8gZm9yIENvbG9yVXRpbHMgYW5kIE1JTUUKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNmYmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZUMyQ29tcG9uZW50IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwb3BfZnJvbnQoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHN0ZDo6bW92ZShtUXVldWUuZnJvbnQoKS53b3JrKTsKKyAgICBtUXVldWUucG9wX2Zyb250KCk7CisgICAgcmV0dXJuIHdvcms7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgc3RkOjptb3ZlKHdvcmspLCBOT19EUkFJTiB9KTsKK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjplbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmVtcHR5KCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6Y2xlYXIoKSB7CisgICAgbVF1ZXVlLmNsZWFyKCk7Cit9CisKK3VpbnQzMl90IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmRyYWluTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVF1ZXVlLmZyb250KCkuZHJhaW5Nb2RlOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6Om1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpIHsKKyAgICBtUXVldWUucHVzaF9iYWNrKHsgbnVsbHB0ciwgZHJhaW5Nb2RlIH0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OldvcmtIYW5kbGVyKCkgOiBtUnVubmluZyhmYWxzZSkge30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeikgeworICAgIG1UaGl6ID0gdGhpejsKK30KKworc3RhdGljIHZvaWQgUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgKmVyciA9IG51bGxwdHIpIHsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCAqZXJyKTsKKyAgICB9CisgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiB0aGl6ID0gbVRoaXoubG9jaygpOworICAgIGlmICghdGhpeikgeworICAgICAgICBBTE9HRCgiY29tcG9uZW50IG5vdCB5ZXQgc2V0OyBtc2cgPSAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgICAgIGlmIChtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlkKSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgcmVwbHktPnBvc3RSZXBseShyZXBseUlkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UHJvY2VzczogeworICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXotPnByb2Nlc3NRdWV1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZXNzLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgcHJvY2VzcyBtZXNzYWdlIGFzIHdlJ3JlIG5vdCBydW5uaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0SW5pdDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vbkluaXQoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OiB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RvcDogeworICAgICAgICAgICAgaW50MzJfdCBlcnIgPSB0aGl6LT5vblN0b3AoKTsKKyAgICAgICAgICAgIFJlcGx5KG1zZywgJmVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVzZXQ6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVzZXQoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2U6IHsKKyAgICAgICAgICAgIHRoaXotPm9uUmVsZWFzZSgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIG1zZzogJWQiLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQ6OkJsb2NraW5nQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBCbG9ja2luZ0Jsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBiYXNlKTogbUJhc2V7YmFzZX0ge30KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldExvY2FsSWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmdldEFsbG9jYXRvcklkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoQ2lyY3VsYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4qIGJsb2NrKSB7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RhdHVzID0gbUJhc2UtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2spOworICAgICAgICB9IHdoaWxlIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1CYXNlOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IER1bW15UmVhZFZpZXcgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgRHVtbXlSZWFkVmlldygpIDogQzJSZWFkVmlldyhDMl9OT19JTklUKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1NpbXBsZUMyQ29tcG9uZW50OjpTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikKKyAgICA6IG1EdW1teVJlYWRWaWV3KER1bW15UmVhZFZpZXcoKSksCisgICAgICBtSW50ZihpbnRmKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbUhhbmRsZXIobmV3IFdvcmtIYW5kbGVyKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZShpbnRmLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfVklERU8pOworfQorCitTaW1wbGVDMkNvbXBvbmVudDo6flNpbXBsZUMyQ29tcG9uZW50KCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAodm9pZCltTG9vcGVyLT5zdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUhhbmRsZXItPnNldENvbXBvbmVudChzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAoIW1heUJsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUtPm1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIC8vIFRPRE86IHdhaXQgZm9yIGxpc3RlbmVyIGNoYW5nZSB0byBoYXZlIHRha2VuIHBsYWNlIGJlZm9yZSByZXR1cm5pbmcKKyAgICAvLyAoZS5nLiBpZiB0aGVyZSBpcyBhbiBvbmdvaW5nIGxpc3RlbmVyIGNhbGxiYWNrKQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKiBjb25zdCBpdGVtcykgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBxdWV1ZVdhc0VtcHR5ID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWVXYXNFbXB0eSA9IHF1ZXVlLT5lbXB0eSgpOworICAgICAgICB3aGlsZSAoIWl0ZW1zLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+cHVzaF9iYWNrKHN0ZDo6bW92ZShpdGVtcy0+ZnJvbnQoKSkpOworICAgICAgICAgICAgaXRlbXMtPnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChxdWV1ZVdhc0VtcHR5KSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UHJvY2VzcywgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50Ojphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICAodm9pZClpdGVtczsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmZsdXNoX3NtKAorICAgICAgICBmbHVzaF9tb2RlX3QgZmx1c2hNb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKWZsdXNoTW9kZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5pbmNHZW5lcmF0aW9uKCk7CisgICAgICAgIC8vIFRPRE86IHF1ZXVlLT5zcGxpY2VkQnkoZmx1c2hlZFdvcmssIGZsdXNoZWRXb3JrLT5lbmQoKSk7CisgICAgICAgIHdoaWxlICghcXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIXF1ZXVlLT5wZW5kaW5nKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUocXVldWUtPnBlbmRpbmcoKS5iZWdpbigpLT5zZWNvbmQpKTsKKyAgICAgICAgICAgIHF1ZXVlLT5wZW5kaW5nKCkuZXJhc2UocXVldWUtPnBlbmRpbmcoKS5iZWdpbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmRyYWluX25iKGRyYWluX21vZGVfdCBkcmFpbk1vZGUpIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgcXVldWUtPm1hcmtEcmFpbihkcmFpbk1vZGUpOworICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgfQorICAgIGJvb2wgbmVlZHNJbml0ID0gKHN0YXRlLT5tU3RhdGUgPT0gVU5JTklUSUFMSVpFRCk7CisgICAgc3RhdGUudW5sb2NrKCk7CisgICAgaWYgKG5lZWRzSW5pdCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0SW5pdCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0YXJ0LCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHN0YXRlLmxvY2soKTsKKyAgICBzdGF0ZS0+bVN0YXRlID0gUlVOTklORzsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgICAgIHF1ZXVlLT5wZW5kaW5nKCkuY2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0U3RvcCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICBpbnQzMl90IGVycjsKKyAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gKGMyX3N0YXR1c190KWVycjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgQUxPR1YoInJlc2V0Iik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlc2V0LCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoInJlbGVhc2UiKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZWxlYXNlLCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBTaW1wbGVDMkNvbXBvbmVudDo6aW50ZigpIHsKKyAgICByZXR1cm4gbUludGY7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gdmVjKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiByZXQ7CisgICAgcmV0LnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIHJldHVybiByZXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpmaW5pc2goCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+cGVuZGluZygpLmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocXVldWUtPnBlbmRpbmcoKS5hdChmcmFtZUluZGV4KSk7CisgICAgICAgIHF1ZXVlLT5wZW5kaW5nKCkuZXJhc2UoZnJhbWVJbmRleCk7CisgICAgfQorICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyBwZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmNsb25lQW5kU2VuZCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICBpZiAoY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBmcmFtZUluZGV4KSB7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gY3VycmVudFdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gY3VycmVudFdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+cGVuZGluZygpLmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gcXVldWUtPnBlbmRpbmcoKS5hdChmcmFtZUluZGV4KS0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBxdWV1ZS0+cGVuZGluZygpLmF0KGZyYW1lSW5kZXgpLT5pbnB1dC5vcmRpbmFsOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigiY2xvbmVkIGFuZCBzZW5kaW5nIHdvcmsiKTsKKyAgICB9Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OnByb2Nlc3NRdWV1ZSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHVpbnQ2NF90IGdlbmVyYXRpb247CisgICAgaW50MzJfdCBkcmFpbk1vZGU7CisgICAgYm9vbCBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIGJvb2wgaGFzUXVldWVkV29yayA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGlvbiA9IHF1ZXVlLT5nZW5lcmF0aW9uKCk7CisgICAgICAgIGRyYWluTW9kZSA9IHF1ZXVlLT5kcmFpbk1vZGUoKTsKKyAgICAgICAgaXNGbHVzaFBlbmRpbmcgPSBxdWV1ZS0+cG9wUGVuZGluZ0ZsdXNoKCk7CisgICAgICAgIHdvcmsgPSBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgIGhhc1F1ZXVlZFdvcmsgPSAhcXVldWUtPmVtcHR5KCk7CisgICAgfQorICAgIGlmIChpc0ZsdXNoUGVuZGluZykgeworICAgICAgICBBTE9HVigicHJvY2Vzc2luZyBwZW5kaW5nIGZsdXNoIik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZsdXNoIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbU91dHB1dEJsb2NrUG9vbCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3QgdXNlIHF1ZXJ5X3ZiCisgICAgICAgICAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb3V0cHV0Rm9ybWF0KDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgeyAmb3V0cHV0Rm9ybWF0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInF1ZXJ5IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDCisgICAgICAgICAgICAgICAgICAgICAgICA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBpZiAocGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCAqb3V0cHV0UG9vbHMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9vbHMgJiYgb3V0cHV0UG9vbHMtPmZsZXhDb3VudCgpID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbElkID0gb3V0cHV0UG9vbHMtPm0udmFsdWVzWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgICAgICAgICBlcnIgPSBHZXRDb2RlYzJCbG9ja1Bvb2wocG9vbElkLCBzaGFyZWRfZnJvbV90aGlzKCksICZibG9ja1Bvb2wpOworICAgICAgICAgICAgQUxPR0QoIlVzaW5nIG91dHB1dCBibG9jayBwb29sIHdpdGggcG9vbElEICVsbHUgPT4gZ290ICVsbHUgLSAlZCIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJsb2NrUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QmxvY2tpbmdCbG9ja1Bvb2w+KGJsb2NrUG9vbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9KCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghd29yaykgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBkcmFpbihkcmFpbk1vZGUsIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB1cGRhdGVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW06IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdXBkYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmKCktPmNvbmZpZ192Yih1cGRhdGVzLCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiYXBwbGllZCAlenUgY29uZmlnVXBkYXRlcyA9PiAlcyAoJWQpIiwgdXBkYXRlcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic3RhcnQgcHJvY2Vzc2luZyBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgLy8gSWYgaW5wdXQgYnVmZmVyIGxpc3QgaXMgbm90IGVtcHR5LCBpdCBtZWFucyB3ZSBoYXZlIHNvbWUgaW5wdXQgdG8gcHJvY2VzcyBvbi4KKyAgICAvLyBIb3dldmVyLCBpbnB1dCBjb3VsZCBiZSBhIG51bGwgYnVmZmVyLiBJbiBzdWNoIGNhc2UsIGNsZWFyIHRoZSBidWZmZXIgbGlzdAorICAgIC8vIGJlZm9yZSBtYWtpbmcgY2FsbCB0byBwcm9jZXNzKCkuCisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkgJiYgIXdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pIHsKKyAgICAgICAgQUxPR0QoIkVuY291bnRlcmVkIG51bGwgaW5wdXQgYnVmZmVyLiBDbGVhcmluZyB0aGUgaW5wdXQgYnVmZmVyIik7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB9CisgICAgcHJvY2Vzcyh3b3JrLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICBBTE9HVigicHJvY2Vzc2VkIGZyYW1lICMlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICBpZiAocXVldWUtPmdlbmVyYXRpb24oKSAhPSBnZW5lcmF0aW9uKSB7CisgICAgICAgIEFMT0dEKCJ3b3JrIGZvcm0gb2xkIGdlbmVyYXRpb246IHdhcyAlIiBQUkl1NjQgIiBub3cgJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgIHF1ZXVlLT5nZW5lcmF0aW9uKCksIGdlbmVyYXRpb24pOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgIHF1ZXVlLnVubG9jaygpOworCisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgIH0KKyAgICBpZiAod29yay0+d29ya2xldHNQcm9jZXNzZWQgIT0gMHUpIHsKKyAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHRoaXMgd29yayIpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlIHBlbmRpbmcgd29yayIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHVuZXhwZWN0ZWQ7CisKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICBpZiAocXVldWUtPnBlbmRpbmcoKS5jb3VudChmcmFtZUluZGV4KSAhPSAwKSB7CisgICAgICAgICAgICB1bmV4cGVjdGVkID0gc3RkOjptb3ZlKHF1ZXVlLT5wZW5kaW5nKCkuYXQoZnJhbWVJbmRleCkpOworICAgICAgICAgICAgcXVldWUtPnBlbmRpbmcoKS5lcmFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICAodm9pZClxdWV1ZS0+cGVuZGluZygpLmluc2VydCh7IGZyYW1lSW5kZXgsIHN0ZDo6bW92ZSh3b3JrKSB9KTsKKworICAgICAgICBxdWV1ZS51bmxvY2soKTsKKyAgICAgICAgaWYgKHVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHBlbmRpbmcgd29yayIpOworICAgICAgICAgICAgdW5leHBlY3RlZC0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHVuZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzUXVldWVkV29yazsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLCBjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKGNyb3AsIDo6QzJGZW5jZSgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkludGVyZmFjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8gdXNlIE1lZGlhRGVmcyBoZXJlIHZzLiBNZWRpYUNvZGVjQ29uc3RhbnRzIGFzIHRoaXMgaXMgbm90IE1lZGlhQ29kZWMgc3BlY2lmaWMvZGVwZW5kZW50CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogU2ltcGxlSW50ZXJmYWNlICovCisKK1NpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6QmFzZVBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMpCisgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTmFtZSwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX05BTUUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnROYW1lU2V0dGluZz4obmFtZS5jX3N0cigpKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGlmIChhbGlhc2VzLnNpemUoKSkgeworICAgICAgICBDMlN0cmluZyBqb2luZWQ7CisgICAgICAgIGZvciAoY29uc3QgQzJTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGpvaW5lZCArPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqb2luZWQgKz0gYWxpYXM7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BbGlhc2VzLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4oam9pbmVkLmNfc3RyKCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtS2luZCwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50S2luZFNldHRpbmcoa2luZCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG9tYWluLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudERvbWFpblNldHRpbmcoZG9tYWluKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNpbXBsZSBpbnRlcmZhY2VzIGhhdmUgc2luZ2xlIHN0cmVhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzZXQgdXAgYnVmZmVyIGZvcm1hdHMgYW5kIGFsbG9jYXRvcnMKKworICAgIC8vIGRlZmF1bHQgdG8gbGluZWFyIGJ1ZmZlcnMgYW5kIG5vIG1lZGlhIHR5cGUKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJTdHJpbmcgcmF3TWVkaWFUeXBlOworICAgIEMyQWxsb2NhdG9yOjppZF90IHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgY29kZWRCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgY29kZWRBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBjb2RlZFBvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U6CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkZWZpbmUgcmF3IGltYWdlPyBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRpbWVzdGFtcCBoYW5kbGluZworICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQzsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJvb2wgaXNFbmNvZGVyID0ga2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworCisgICAgLy8gaGFuZGxlIHJhdyBkZWNvZGVycworICAgIGlmIChtZWRpYVR5cGUgPT0gcmF3TWVkaWFUeXBlKSB7CisgICAgICAgIGNvZGVkQnVmZmVyVHlwZSA9IHJhd0J1ZmZlclR5cGU7CisgICAgICAgIGNvZGVkQWxsb2NhdG9yID0gcmF3QWxsb2NhdG9yOworICAgICAgICBjb2RlZFBvb2xJZCA9IHJhd1Bvb2xJZDsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyByYXdCdWZmZXJUeXBlIDogY29kZWRCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IHJhd01lZGlhVHlwZSA6IG1lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyBjb2RlZEJ1ZmZlclR5cGUgOiByYXdCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IG1lZGlhVHlwZSA6IHJhd01lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBpbnB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IHJhd0FsbG9jYXRvciA6IGNvZGVkQWxsb2NhdG9yIH07CisgICAgQzJBbGxvY2F0b3I6OmlkX3Qgb3V0cHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRBbGxvY2F0b3IgOiByYXdBbGxvY2F0b3IgfTsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZFBvb2xJZCA6IHJhd1Bvb2xJZCB9OworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoaW5wdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQb29sSWRzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRQb29sSWRzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gYWRkIHN0YXRlbGVzcyBwYXJhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlcykuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLyogVE9ETworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUN1cnJlbnRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfQ1VSUkVOVF9XT1JLKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkN1cnJlbnRXb3JrVHVuaW5nKCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyQ3VycmVudFdvcmtUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX0lOUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9PVVRQVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisKKyAgICAqLworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1BpcGVsaW5lTGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUHJpdmF0ZUJ1ZmZlcnMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFByaXZhdGVCdWZmZXJDb3VudCwgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZVBvb2xJZHMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1RpbWVTdHJldGNoKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1UaW1lU3RyZXRjaCwgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nKDEuZikpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKKy8qCisgICAgQ2xpZW50cyBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGJhc2UgcGFyYW1zIGR1ZSB0byBjdXN0b20gZGVwZW5kZW5jeS4KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworCisqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2V4cG9ydHMubGRzIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDFiYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIENyZWF0ZUNvZGVjMkZhY3Rvcnk7CisgICAgICAgIERlc3Ryb3lDb2RlYzJGYWN0b3J5OworICAgIGxvY2FsOiAqOworfTsKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKyNkZWZpbmUgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTaW1wbGVDMkNvbXBvbmVudAorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U2ltcGxlQzJDb21wb25lbnQ+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpOworICAgIHZpcnR1YWwgflNpbXBsZUMyQ29tcG9uZW50KCk7CisKKyAgICAvLyBDMkNvbXBvbmVudAorICAgIC8vIEZyb20gQzJDb21wb25lbnQKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBmb3IgaGFuZGxlcgorICAgIGJvb2wgcHJvY2Vzc1F1ZXVlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUgY29uZmlnIHNldAorICAgICAqIGluIHRoZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0KCksIGJ1dCBvbmx5IGF0IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9yCisgICAgICogYWZ0ZXIgcmVzZXQoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uSW5pdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uU3RvcCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVsZWFzZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgPSAwOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZ2l2ZW4gd29yayBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdICAgd29yayAgICB0aGUgd29yayB0byBwcm9jZXNzCisgICAgICogXHBhcmFtW2luXSAgICAgICBwb29sICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEcmFpbiB0aGUgY29tcG9uZW50IGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGRyYWluTW9kZSAgIG1vZGUgb2YgZHJhaW4uCisgICAgICogXHBhcmFtW2luXSAgIHBvb2wgICAgICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIFRoZSBjb21wb25lbnQgaGFzIGRyYWluZWQgYWxsIHBlbmRpbmcgb3V0cHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgICAgIFVuc3VwcG9ydGVkIG1vZGUgKGUuZy4gRFJBSU5fQ0hBSU4pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8vIGZvciBkZXJpdmVkIGNsYXNzZXMKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggcGVuZGluZyB3b3JrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgcGVuZGluZyB3b3JrIGFjY29yZGluZyB0byB8ZnJhbWVJbmRleHwgYW5kCisgICAgICogZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wgbXVzdCBiZQorICAgICAqICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHBlbmRpbmcgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaCh1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworICAgIC8qKgorICAgICAqIENsb25lIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFuZCBzZW5kIHRoZSB3b3JrIGJhY2sgdG8gY2xpZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbmQgY2xvbmUgdGhlIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFjY29yZGluZworICAgICAqIHRvIHxmcmFtZUluZGV4fCBhbmQgZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wKKyAgICAgKiBtdXN0IGJlICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZQorICAgICAqIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgY3VycmVudFdvcmsgICB0aGUgY3VycmVudCB3b3JrIHVuZGVyIHByb2Nlc3NpbmcKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZjcm9wKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTk9fRFJBSU4gPSB+MHU7CisKKyAgICBDMlJlYWRWaWV3IG1EdW1teVJlYWRWaWV3OworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisKKyAgICBjbGFzcyBXb3JrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIGtXaGF0UHJvY2VzcywKKyAgICAgICAgICAgIGtXaGF0SW5pdCwKKyAgICAgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgICAgICBrV2hhdFJlc2V0LAorICAgICAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICB9OworCisgICAgICAgIFdvcmtIYW5kbGVyKCk7CisgICAgICAgIH5Xb3JrSGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OndlYWtfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiBtVGhpejsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIFNUT1BQRUQsCisgICAgICAgIFJVTk5JTkcsCisgICAgfTsKKworICAgIHN0cnVjdCBFeGVjU3RhdGUgeworICAgICAgICBFeGVjU3RhdGUoKSA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7fQorCisgICAgICAgIGludCBtU3RhdGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPiBtRXhlY1N0YXRlOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxXb3JrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICBjbGFzcyBXb3JrUXVldWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBQZW5kaW5nV29yazsKKworICAgICAgICBpbmxpbmUgV29ya1F1ZXVlKCkgOiBtRmx1c2goZmFsc2UpLCBtR2VuZXJhdGlvbigwdWwpIHt9CisKKyAgICAgICAgaW5saW5lIHVpbnQ2NF90IGdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtR2VuZXJhdGlvbjsgfQorICAgICAgICBpbmxpbmUgdm9pZCBpbmNHZW5lcmF0aW9uKCkgeyArK21HZW5lcmF0aW9uOyBtRmx1c2ggPSB0cnVlOyB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gcG9wX2Zyb250KCk7CisgICAgICAgIHZvaWQgcHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspOworICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSgpIGNvbnN0OworICAgICAgICB2b2lkIG1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpOworICAgICAgICBpbmxpbmUgYm9vbCBwb3BQZW5kaW5nRmx1c2goKSB7CisgICAgICAgICAgICBib29sIGZsdXNoID0gbUZsdXNoOworICAgICAgICAgICAgbUZsdXNoID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmx1c2g7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAgICBQZW5kaW5nV29yayAmcGVuZGluZygpIHsgcmV0dXJuIG1QZW5kaW5nV29yazsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGU7CisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtRmx1c2g7CisgICAgICAgIHVpbnQ2NF90IG1HZW5lcmF0aW9uOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1RdWV1ZTsKKyAgICAgICAgUGVuZGluZ1dvcmsgbVBlbmRpbmdXb3JrOworICAgIH07CisgICAgTXV0ZXhlZDxXb3JrUXVldWU+IG1Xb3JrUXVldWU7CisKKyAgICBjbGFzcyBCbG9ja2luZ0Jsb2NrUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QmxvY2tpbmdCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7CisKKyAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTFkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisjZGVmaW5lIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXAgYSBjb21tb24gaW50ZXJmYWNlIG9iamVjdCAoc3VjaCBhcyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSwgb3IgQzJJbnRlcmZhY2VIZWxwZXIgaW50bworICogYSBDMkNvbXBvbmVudEludGVyZmFjZS4KKyAqCisgKiBccGFyYW0gVCBjb21tb24gaW50ZXJmYWNlIHR5cGUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgU2ltcGxlQzJJbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gJmltcGwpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW1wbChpbXBsKSB7CisgICAgfQorCisgICAgflNpbXBsZUMySW50ZXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gRnJvbSBDMkNvbXBvbmVudEludGVyZmFjZQorICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTmFtZTsgfQorICAgIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JZDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIG1heUJsb2NrLCBoZWFwUGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgY29uc3QgYzJfbm9kZV9pZF90IG1JZDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gbUltcGw7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3NlcyBmb3IgY29tbW9uIGludGVyZmFjZXMuCisgKi8KK3RlbXBsYXRlPD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlPHZvaWQ+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCYXNlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhbGwgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQmFzZVBhcmFtcyA6IEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgZXhwbGljaXQgQmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIsCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMgPSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4oKSk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIGlucHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBvdXRwdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIHBpcGVsaW5lIGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgYW5kIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZy4KKyAgICAgICAgdm9pZCBub1BpcGVsaW5lTGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBuZWVkIGZvciBwcml2YXRlIGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZywgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZyBhbmQKKyAgICAgICAgLy8vIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmcuCisgICAgICAgIHZvaWQgbm9Qcml2YXRlQnVmZmVycygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gaW5wdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBvdXRwdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgZG9lcyBub3Qgc3RyZXRjaCB0aW1lLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZy4KKyAgICAgICAgdm9pZCBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtTGV2ZWxTZXR0aW5nPiBtUGxhdGZvcm1MZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1GZWF0dXJlc1NldHRpbmc+IG1QbGF0Zm9ybUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPiBtTmFtZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+IG1BbGlhc2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRLaW5kU2V0dGluZz4gbUtpbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudERvbWFpblNldHRpbmc+IG1Eb21haW47CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZz4gbVRpbWVTdHJldGNoOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0PiBtUmVxdWVzdGVkSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0ZWRPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZz4gbVJlcXVlc3RlZFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dD4gbUFjdHVhbElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0PiBtQWN0dWFsT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1BY3R1YWxQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nPiBtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQ+IG1JbnB1dFN0cmVhbUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dD4gbU91dHB1dFN0cmVhbUNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDdXJyZW50V29ya1R1bmluZz4gbUN1cnJlbnRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0PiBtTGFzdElucHV0UXVldWVkV29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+IG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWw7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBtSW5wdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc+IG1Qcml2YXRlQWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gbU91dHB1dFBvb2xJZHM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nPiBtUHJpdmF0ZVBvb2xJZHM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisgICAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyBTaW1wbGVJbnRlcmZhY2UgPSBTaW1wbGVDMkludGVyZmFjZTxUPjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKGxlbiwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChzdHIubGVuZ3RoKCkgKyAxLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2V0dGVyIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSB0eXBlOworCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIHJlcy5wbHVzKG1lLkYobWUudi5tLnZhbHVlc1tpeF0pLnZhbGlkYXRlUG9zc2libGUobWUudi5tLnZhbHVlc1tpeF0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm9sZCwKKyAgICAgICAgICAgIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi52YWx1ZSkuc3VwcG9ydHNOb3cobWUudi52YWx1ZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gb2xkLnYudmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjY4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMycGxheSIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjMi5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZjU0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMiIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgeworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKHsgYmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpIH0pIHt9Cit9OworCitjbGFzcyBMaXN0ZW5lcjsKKworY2xhc3MgU2ltcGxlUGxheWVyIHsKK3B1YmxpYzoKKyAgICBTaW1wbGVQbGF5ZXIoKTsKKyAgICB+U2ltcGxlUGxheWVyKCk7CisKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcyk7CisgICAgdm9pZCBvblRyaXBwZWQoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KTsKKyAgICB2b2lkIG9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpOworCisgICAgdm9pZCBwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICAgc3A8SVByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisgICAgc3RkOjphdG9taWNfaW50IG1MaW5lYXJQb29sSWQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY0lvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6Om11dGV4IG1Qcm9jZXNzZWRMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Qcm9jZXNzZWRDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtUHJvY2Vzc2VkV29yazsKKworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb250cm9sPiBtQ29udHJvbDsKK307CisKK2NsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGlzdGVuZXIoU2ltcGxlUGxheWVyICp0aGl6KSA6IG1UaGlzKHRoaXopIHt9CisgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uV29ya0RvbmUoY29tcG9uZW50LCBzdGQ6Om1vdmUod29ya0l0ZW1zKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25UcmlwcGVkKGNvbXBvbmVudCwgc2V0dGluZ1Jlc3VsdCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25FcnJvcihjb21wb25lbnQsIGVycm9yQ29kZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNpbXBsZVBsYXllciAqIGNvbnN0IG1UaGlzOworfTsKKworCitTaW1wbGVQbGF5ZXI6OlNpbXBsZVBsYXllcigpCisgICAgOiBtTGlzdGVuZXIobmV3IExpc3RlbmVyKHRoaXMpKSwKKyAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBEdW1teVByb2R1Y2VyTGlzdGVuZXIpLAorICAgICAgbUxpbmVhclBvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAorICAgICAgbUNvbXBvc2VyQ2xpZW50KG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQpIHsKKyAgICBDSEVDS19FUShtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJm1BbGxvY0lvbiksIEMyX09LKTsKKyAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKTsKKworICAgIG1Db250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgU3RyaW5nOCgiQSBTdXJmYWNlIiksCisgICAgICAgICAgICAxMjgwLAorICAgICAgICAgICAgODAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKKyAgICAgICAgICAgIC8vUElYRUxfRk9STUFUX1JHQl81NjUpOworCisgICAgQ0hFQ0sobUNvbnRyb2wgIT0gbnVsbHB0cik7CisgICAgQ0hFQ0sobUNvbnRyb2wtPmlzVmFsaWQoKSk7CisKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgIC5zZXRMYXllcihtQ29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgIC5zaG93KG1Db250cm9sKQorICAgICAgICAgICAgLmFwcGx5KCk7CisKKyAgICBtU3VyZmFjZSA9IG1Db250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgQ0hFQ0sobVN1cmZhY2UgIT0gbnVsbHB0cik7CisgICAgbVN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ1BVLCBtUHJvZHVjZXJMaXN0ZW5lcik7Cit9CisKK1NpbXBsZVBsYXllcjo6flNpbXBsZVBsYXllcigpIHsKKyAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpvbldvcmtEb25lIik7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICBmb3IgKGF1dG8gJiBpdGVtIDogd29ya0l0ZW1zKSB7CisgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbSkpOworICAgIH0KKyAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uVHJpcHBlZCgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIHNldHRpbmdSZXN1bHQ7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIGVycm9yQ29kZTsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6OnBsYXkiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICh2b2lkKSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlLT5nZXRGb3JtYXQoKSwgJmZvcm1hdCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QwLCBjc2QxOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmY3NkMCk7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKTsKKworICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAodm9pZClzdG9yZS0+Y3JlYXRlQ29tcG9uZW50KCJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIiwgJmNvbXBvbmVudCk7CisKKyAgICAodm9pZCljb21wb25lbnQtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgQzJfRE9OVF9CTE9DSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbHMgPQorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgKHVpbnQ2NF90KUMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIH0pOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHQ7CisgICAgKHZvaWQpY29tcG9uZW50LT5pbnRmKCktPmNvbmZpZ192Yih7cG9vbHMuZ2V0KCl9LCBDMl9ET05UX0JMT0NLLCAmcmVzdWx0KTsKKyAgICBjb21wb25lbnQtPnN0YXJ0KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICB9CisKKyAgICBzdGQ6OmF0b21pY19ib29sIHJ1bm5pbmcodHJ1ZSk7CisgICAgc3RkOjp0aHJlYWQgc3VyZmFjZVRocmVhZChbdGhpcywgJnJ1bm5pbmddKCkgeworICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmaWdicCA9IG1TdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Qcm9jZXNzZWRXb3JrLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsb3Q7CisgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2U7CisgICAgICAgICAgICBBTE9HVigiUmVuZGVyOiBGcmFtZSAjJWxsZCIsIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCkpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF07CisgICAgICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBibG9jayA9IG91dHB1dC0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KUdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpKSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IHFiaSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKiAxMDAwbGwpLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0KGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgICAgICAgICAgICAgZXJyID0gaWdicC0+cXVldWVCdWZmZXIoc2xvdCwgcWJpLCAmcWJvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZW5kZXIgbG9vcCBmaW5pc2hlZCIpOworICAgIH0pOworCisgICAgbG9uZyBudW1GcmFtZXMgPSAwOworICAgIG1MaW5lYXJQb29sLnJlc2V0KG5ldyBDMlBvb2xlZEJsb2NrUG9vbChtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKykpOworCisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgICAgICB2b2lkICpkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwdTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgIGlmIChjc2QwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDA7CisgICAgICAgICAgICBjc2QwID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjc2QxICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDE7CisgICAgICAgICAgICBjc2QxID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXIgPT0gbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXApKTsKKworICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNzZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gY3NkLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIHdoaWxlICghd29yaykgeworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbnVtRnJhbWVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgbUxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmYmxvY2spOworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBBTE9HVigiRnJhbWUgIyVsZCBzaXplID0gJXp1IiwgbnVtRnJhbWVzLCBzaXplKTsKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIGNvbXBvbmVudC0+cXVldWVfbmIoJml0ZW1zKTsKKworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICArK251bUZyYW1lczsKKyAgICB9CisgICAgQUxPR1YoIm1haW4gbG9vcCBmaW5pc2hlZCIpOworICAgIHNvdXJjZS0+c3RvcCgpOworICAgIHJ1bm5pbmcuc3RvcmUoZmFsc2UpOworICAgIHN1cmZhY2VUaHJlYWQuam9pbigpOworCisgICAgY29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0X2ZpbGVuYW1lXVxuIiwgbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1oKGVscClcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoIikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIFNpbXBsZVBsYXllciBwbGF5ZXI7CisKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2MgJiYgZXJyID09IE9LOyArK2spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOworCisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkobnVsbHB0ciAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPElNZWRpYVNvdXJjZT4gPiBtZWRpYVNvdXJjZXM7CisgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CisKKyAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKKworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworCisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJleHRyYWN0b3IgZGlkIG5vdCBwcm92aWRlIE1JTUUgdHlwZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgeworICAgICAgICAgICAgbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpLCAwKTsKKworICAgICAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBhbGxvd2luZyBBVkMgb25seSBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvL2F2YyIsIDkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGEgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBBVkMgdHJhY2sgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1lZGlhU291cmNlID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgaWYgKG1lZGlhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdG90YWwgdHJhY2tzICV6dS5cbiIsIGksIG51bVRyYWNrcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwbGF5ZXIucGxheShtZWRpYVNvdXJjZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYjUxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJGTEFDLWhlYWRlcnMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzOWI5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEZsYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEZsYWNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNzY4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAyMTAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyNzY4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICAvLyBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgaW50MzJfdCBnZXRQY21FbmNvZGluZ0luZm8oKSBjb25zdCB7IHJldHVybiBtUGNtRW5jb2RpbmdJbmZvLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdEZsYWNEZWM6OkMyU29mdEZsYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZMQUNEZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0RlYzo6fkMyU29mdEZsYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZXNldCgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIG1GTEFDRGVjb2RlciA9IG51bGxwdHI7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSB7CisgICAgICAgIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgfQorICAgIG1GTEFDRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKKyAgICBpZiAoIW1GTEFDRGVjb2RlcikgeworICAgICAgICBBTE9HRSgiaW5pdERlY29kZXI6IGZhaWxlZCB0byBjcmVhdGUgRkxBQ0RlY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtSGFzU3RyZWFtSW5mbyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCisvLyAoVE9ETykgYWRkIG11bHRpZnJhbWUgc3VwcG9ydCwgaW4gcGx1Z2luIGFuZCBGTEFDRGVjb2Rlci5jcHAKK3ZvaWQgQzJTb2Z0RmxhY0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIWNvZGVjQ29uZmlnKSB7CisgICAgICAgIEFMT0dWKCJGaXJzdCBmcmFtZSBoYXMgdG8gaW5jbHVkZSBjb25maWd1cmF0aW9uLCBmb3JjaW5nIGNvbmZpZyIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKGlucHV0LCBpblNpemUpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSyAmJiBkZWNvZGVyRXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgcGFyc2VNZXRhRGF0YSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJwcm9jZXNzOiBwYXJzZU1ldGFkYXRhIGlzIEJsb2NraW5nLCBDb250aW51ZSAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0cmVhbUluZm8gPSBtRkxBQ0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSAmJiBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICYmCisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBtSGFzU3RyZWFtSW5mbyA9IHRydWU7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oCisgICAgICAgICAgICAgICAgICAgIDB1LCBtU3RyZWFtSW5mby5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgicHJvY2VzczogZGVjb2RlciBjb25maWd1cmF0aW9uIDogJWQgSHosICVkIGNoYW5uZWxzLCAlZCBzYW1wbGVzLCIKKyAgICAgICAgICAgICAgICAgICIgJWQgYmxvY2sgc2l6ZSIsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlLCBtU3RyZWFtSW5mby5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgIChpbnQpbVN0cmVhbUluZm8udG90YWxfc2FtcGxlcywgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgb3V0cHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihzaG9ydCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBtSGFzU3RyZWFtSW5mbyA/CisgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzYW1wbGVTaXplCisgICAgICAgICAgOiBrTWF4QmxvY2tTaXplICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNhbXBsZVNpemU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBpblNpemUsIHdWaWV3LmRhdGEoKSwgJm91dFNpemUsIG91dHB1dEZsb2F0KTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDkxYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEZsYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhCbG9ja1NpemUgICA9IDQwOTYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUhhc1N0cmVhbUluZm87CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOGRiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RmxhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0RmxhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29tcGxleGl0eSwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0KDB1LAorICAgICAgICAgICAgICAgICAgICBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNvbXBsZXhpdHksIHZhbHVlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01JTiwgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNDYwOCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICAvLyBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiBtQ29tcGxleGl0eS0+dmFsdWU7IH0KKyAgICBpbnQzMl90IGdldFBjbUVuY29kaW5nSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1QY21FbmNvZGluZ0luZm8tPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0PiBtUGNtRW5jb2RpbmdJbmZvOworfTsKKworQzJTb2Z0RmxhY0VuYzo6QzJTb2Z0RmxhY0VuYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRmxhY1N0cmVhbUVuY29kZXIobnVsbHB0ciksCisgICAgICBtSW5wdXRCdWZmZXJQY20zMihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNFbmM6On5DMlNvZnRGbGFjRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvbkluaXQoKSB7CisgICAgbUZsYWNTdHJlYW1FbmNvZGVyID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfbmV3KCk7CisgICAgaWYgKCFtRmxhY1N0cmVhbUVuY29kZXIpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgIGtJbkJsb2NrU2l6ZSAqIGtNYXhOdW1DaGFubmVscyAqIHNpemVvZihGTEFDX19pbnQzMikpOworICAgIGlmICghbUlucHV0QnVmZmVyUGNtMzIpIHJldHVybiBDMl9OT19NRU1PUlk7CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBtSGVhZGVyT2Zmc2V0ID0gMDsKKyAgICBtV3JvdGVIZWFkZXIgPSBmYWxzZTsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfZGVsZXRlKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlclBjbTMyKSB7CisgICAgICAgIGZyZWUobUlucHV0QnVmZmVyUGNtMzIpOworICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBkcmFpbihEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBudWxscHRyKTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSByZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIGlmIChlcnIgIT0gT0spIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIGlmIChtSXNGaXJzdEZyYW1lICYmIGluU2l6ZSkgeworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtSXNGaXJzdEZyYW1lID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtV3JvdGVIZWFkZXIpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShtSGVhZGVyT2Zmc2V0LCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG1IZWFkZXIsIG1IZWFkZXJPZmZzZXQpOworICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBtSGVhZGVyT2Zmc2V0KTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgIG1Xcm90ZUhlYWRlciA9IHRydWU7CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1JbnRmLT5nZXRQY21FbmNvZGluZ0luZm8oKSA9PSBDMkNvbmZpZzo6UENNX0ZMT0FUOworICAgIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCB1bnNpZ25lZCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzYW1wbGVTaXplOworICAgIGNvbnN0IHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGluU2l6ZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtQmxvY2tTaXplICogZnJhbWVTaXplOworCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gdHJ1ZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHByb2Nlc3NTaXplID0gTUlOKGtJbkJsb2NrU2l6ZSAqIGZyYW1lU2l6ZSwgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBwcm9jZXNzU2l6ZSAvIGZyYW1lU2l6ZTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBwcm9jZXNzU2l6ZSAvIHNhbXBsZVNpemU7CisKKyAgICAgICAgQUxPR1YoImFib3V0IHRvIGVuY29kZSAlenUgYnl0ZXMiLCBwcm9jZXNzU2l6ZSk7CisgICAgICAgIGlmIChpbnB1dEZsb2F0KSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqIGNvbnN0IHBjbUZsb2F0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgICAgIG1lbWNweV90b19xOF8yM19mcm9tX2Zsb2F0X3dpdGhfY2xhbXAobUlucHV0QnVmZmVyUGNtMzIsIHBjbUZsb2F0LCBuYklucHV0U2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2X3QgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmJJbnB1dFNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKAorICAgICAgICAgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMzIsIG5iSW5wdXRGcmFtZXMpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gcHJvY2Vzc1NpemU7CisgICAgfQorICAgIGlmIChlb3MgJiYgKEMyX09LICE9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCkpKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZW5jb2RpbmciKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChtRW5jb2RlclJldHVybmVkTmJCeXRlcyAhPSAwKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShtT3V0cHV0QmxvY2spLCAwLCBtRW5jb2RlclJldHVybmVkTmJCeXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJlbmNvZGVyIHByb2Nlc3NfaW50ZXJsZWF2ZWQgcmV0dXJuZWQgd2l0aG91dCBkYXRhIHRvIHdyaXRlIik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICAodm9pZCkgY3VycmVudF9mcmFtZTsKKyAgICBBTE9HVigiJXMgKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLCBfX2Z1bmNfXywgYnl0ZXMsIHNhbXBsZXMsCisgICAgICAgICAgY3VycmVudF9mcmFtZSk7CisKKyAgICBpZiAoc2FtcGxlcyA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKKyAgICAgICAgbWVtY3B5KG1IZWFkZXIgKyBtSGVhZGVyT2Zmc2V0LCBidWZmZXIsIGJ5dGVzKTsKKyAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgaWYgKChzYW1wbGVzID09IDApIHx8ICFtRW5jb2RlcldyaXRlRGF0YSkgeworICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIGVuY29kZXIgYmVjYXVzZSB0aGVyZSdzIGhlYWRlciBkYXRhIHRvIHNhdmUsIGJ1dCBpdCdzIG5vdCB0aGUgcm9sZQorICAgICAgICAvLyBvZiB0aGlzIGNvbXBvbmVudCAodW5sZXNzIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUiBpcyBkZWZpbmVkKQorICAgICAgICBBTE9HVigiaWdub3JpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBlbmNvZGVkIGRhdGEKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgdWludDhfdCogb3V0RGF0YSA9IHdWaWV3LmRhdGEoKTsKKyAgICBBTE9HVigid3JpdGluZyAlenUgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCIsIGJ5dGVzKTsKKyAgICAvLyBpbmNyZW1lbnQgbVByb2Nlc3NlZFNhbXBsZXMgdG8gbWFpbnRhaW4gYXVkaW8gc3luY2hyb25pemF0aW9uIGR1cmluZworICAgIC8vIHBsYXkgYmFjaworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IHNhbXBsZXM7CisgICAgaWYgKGJ5dGVzICsgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPiBtT3V0cHV0QmxvY2stPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV6dSBieXRlcyIsIGJ5dGVzKTsKKyAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKyAgICBtZW1jcHkob3V0RGF0YSArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyArPSBieXRlczsKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworfQorCisKK3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmNvbmZpZ3VyZUVuY29kZXIoKSB7CisgICAgQUxPR1YoIiVzIG51bUNoYW5uZWw9JWQsIHNhbXBsZVJhdGU9JWQiLCBfX2Z1bmNfXywgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgIW1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBBTE9HRSgiY2FuJ3QgY29uZmlndXJlIGVuY29kZXI6IG5vIGVuY29kZXIgb3IgaW52YWxpZCBzdGF0ZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCBpbnQgYml0c1BlclNhbXBsZSA9IGlucHV0RmxvYXQgPyAyNCA6IDE2OworICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NoYW5uZWxzKG1GbGFjU3RyZWFtRW5jb2RlciwgbUludGYtPmdldENoYW5uZWxDb3VudCgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zYW1wbGVfcmF0ZShtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIGJpdHNQZXJTYW1wbGUpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmdldENvbXBsZXhpdHkoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG9rICY9IEZMQUNfX1NUUkVBTV9FTkNPREVSX0lOSVRfU1RBVFVTX09LID09CisgICAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9pbml0X3N0cmVhbShtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjayAgICAvKndyaXRlX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLypzZWVrX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyp0ZWxsX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyptZXRhZGF0YV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0aGlzIC8qY2xpZW50X2RhdGEqLyk7CisKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtQmxvY2tTaXplID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2Jsb2Nrc2l6ZShtRmxhY1N0cmVhbUVuY29kZXIpOworCisgICAgQUxPR1YoImVuY29kZXIgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQiKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICosCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSkgeworICAgIHJldHVybiAoKEMyU29mdEZsYWNFbmMqKSBjbGllbnRfZGF0YSktPm9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBidWZmZXIsIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgTk9fRFJBSU46CisgICAgICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGZsYWcgaXMgbm90IGJlaW5nIHNlbnQgYmFjayB0byB0aGUgY2xpZW50CisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpdGVtcyBpbiBQZW5kaW5nV29yayBxdWV1ZSBhcyBhbGwgdGhlCisgICAgICAgICAgICAvLyBpbnB1dHMgYXJlIGJlaW5nIHNlbnQgYmFjayB3aXRoIGVtcHR5d29yayBvciB2YWxpZCBlbmNvZGVkIGRhdGEKKyAgICAgICAgICAgIC8vIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2gobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICBpZiAoIW9rKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YwMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2VuY29kZXIuaCIKKworI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01JTiAgICAgMAorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAorCisjZGVmaW5lIEZMQUNfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAxMjgKKworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXIsIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIG9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtJbkJsb2NrU2l6ZSA9IDExNTI7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhOdW1DaGFubmVscyA9IDI7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlciogbUZsYWNTdHJlYW1FbmNvZGVyOworICAgIEZMQUNfX2ludDMyKiBtSW5wdXRCdWZmZXJQY20zMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dHB1dEJsb2NrOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50MzJfdCBtQmxvY2tTaXplOworICAgIGJvb2wgbUlzRmlyc3RGcmFtZTsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIC8vIHNob3VsZCB0aGUgZGF0YSByZWNlaXZlZCBieSB0aGUgY2FsbGJhY2sgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHBvcnQKKyAgICBib29sIG1FbmNvZGVyV3JpdGVEYXRhOworICAgIHNpemVfdCBtRW5jb2RlclJldHVybmVkTmJCeXRlczsKKyAgICB1bnNpZ25lZCBtSGVhZGVyT2Zmc2V0OworICAgIGJvb2wgbVdyb3RlSGVhZGVyOworICAgIGNoYXIgbUhlYWRlcltGTEFDX0hFQURFUl9TSVpFXTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFMQVciLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I4NDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RzcxMURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBBTEFXCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciI7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEc3MTFEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorI2lmZGVmIEFMQVcKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbyg2NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0RzcxMURlYzo6QzJTb2Z0RzcxMURlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRHNzExRGVjOjp+QzJTb2Z0RzcxMURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBpbnQgb3V0U2l6ZSA9IGluU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0cHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDE2X3QgKm91dHB1dHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworCisjaWZkZWYgQUxBVworICAgIERlY29kZUFMYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbHNlCisgICAgRGVjb2RlTUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2VuZGlmCisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKyNpZmRlZiBBTEFXCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZUFMYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisjZWxzZQordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVNTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IChtYW50aXNzYSA+PiA0KSAmIDc7CisgICAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7CisKKyAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorfQorI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHNzExRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHNzExRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZThmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEc3MTFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RzcxMURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyNpZmRlZiBBTEFXCisgICAgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2Vsc2UKKyAgICB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZW5kaWYKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEc3MTFEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0R3NtRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2NmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0R3NtRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHc21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0R3NtRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCAxMzIwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTMyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxMDI0IC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fSU5fRlJNX1NaKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEdzbURlYzo6QzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtR3NtKG51bGxwdHIpIHsKK30KKworQzJTb2Z0R3NtRGVjOjp+QzJTb2Z0R3NtRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uSW5pdCgpIHsKKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25TdG9wKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgc2l6ZV90IGRlY29kZUdTTShnc20gaGFuZGxlLCBpbnQxNl90ICpvdXQsIHNpemVfdCBvdXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgc2l6ZV90IG91dFNpemUgPSAwOworCisgICAgaWYgKGluU2l6ZSAlIE1TR1NNX0lOX0ZSTV9TWiA9PSAwCisgICAgICAgICAgICAmJiAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZigqb3V0KQorICAgICAgICAgICAgICAgICAgICA8PSBvdXRDYXBhY2l0eSkpIHsKKyAgICAgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXRTaXplICogc2l6ZW9mKGludDE2X3QpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKSAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3QgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IGRlY29kZUdTTShtR3NtLCBvdXRwdXQsIG91dENhcGFjaXR5LCBpbnB1dCwgaW5TaXplKTsKKyAgICBpZiAoIW91dFNpemUpIHsKKyAgICAgICAgQUxPR0UoImVuY291bnRlcmVkIGltcHJvcGVyIGluc2l6ZSBvciBvdXRzaXplIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0R1NNRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEdTTURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHc21EZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEdTTURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgImdzbS5oIgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaICAgICAgICAgICAgIDMzCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xICAgICAzMgorI2RlZmluZSBGUkdTTV9PVVRfRlJNX1NaICAgICAgICAgICAgMTYwCisjZGVmaW5lIE1TR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAoRlJHU01fSU5fRlJNX1NaICsgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEpCisjZGVmaW5lIE1TR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAoRlJHU01fT1VUX0ZSTV9TWiAqIDIpCisKK3N0cnVjdCBDMlNvZnRHc21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEdzbURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgZ3NtIG1Hc207CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0R3NtRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjliZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZW5jIl0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzI1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCkBAIC0wLDAgKzEsMTAyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEhldmNEZWMuaCIKKyNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IFByb3BlciBzdXBwb3J0IGZvciByZW9yZGVyIGRlcHRoLgorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDh1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0gQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICB7QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKX0sIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0SGV2Y0RlYzo6QzJTb2Z0SGV2Y0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSwKKyAgICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdEhldmNEZWM6On5DMlNvZnRIZXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJGbHVzaCA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKG51bGxwdHIsIDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdEhldmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworICAgIHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQgPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIRVZDRF9DWEFfQ01EX0NUTF9HRVRfVlVJX1BBUkFNUzsKKyAgICBzX2dldF92dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLCBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGNsb25lQW5kU2VuZCBjYW4gYmUgYXZvaWRlZCBieSB0cmFja2luZyBudW1iZXIgb2YgZnJhbWVzIHJlbWFpbmluZworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbU91dEluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgIG1PdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRIZXZjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgPT0gbUhlYWRlckRlY29kZWQpIHsKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICB9CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0KKyAgICAgICAgICAgICAgICAgICAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIGlmIChJU19JVkRfRkFUQUxfRVJST1Ioc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR042NChzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZCkgZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRIZXZjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0SGV2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEhldmNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NjRlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworCitzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciBjb2xvckFzcGVjdHMgZnVuY3Rpb25zLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBib29sIGNvbG9yQXNwZWN0c0RpZmZlcihjb25zdCBDb2xvckFzcGVjdHMgJmEsIGNvbnN0IENvbG9yQXNwZWN0cyAmYik7CisgICAgdm9pZCB1cGRhdGVGaW5hbENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgIGNvbnN0IENvbG9yQXNwZWN0cyAmb3RoZXJBc3BlY3RzLCBjb25zdCBDb2xvckFzcGVjdHMgJnByZWZlcnJlZEFzcGVjdHMpOworICAgIHN0YXR1c190IGhhbmRsZUNvbG9yQXNwZWN0c0NoYW5nZSgpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUhlYWRlckRlY29kZWQ7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyOWIxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTAsMCArMSw5NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml0dF92aWRlb19hcGkuaCIKKyNpbmNsdWRlICJpaGV2Y2VfYXBpLmgiCisjaW5jbHVkZSAiaWhldmNlX3BsdWdpbi5oIgorI2luY2x1ZGUgIkMyU29mdEhldmNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIjsKKworfSAvLyBuYW1lcHNhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9CX0ZSQU1FUyArIERFRkFVTFRfUkNfTE9PS0FIRUFEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BY3R1YWxJbnB1dERlbGF5LCB2YWx1ZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgMCwgTUFYX0JfRlJBTUVTICsgTUFYX1JDX0xPT0tBSEVBRCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1BY3R1YWxJbnB1dERlbGF5KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIG1hdGNoZXMgc2l6ZSBsaW1pdHMgaW4gY29kZWMgbGlicmFyeQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIGxpbWl0cyBpbiBjb2RlYyBsaWJyYXJ5CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlTW9kZSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQml0cmF0ZU1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIGxldmVscyBhbGxvd2VkIHdpdGhpbiBjb2RlYyBsaWJyYXJ5CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29tcGxleGl0eSwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0KDB1LCAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Db21wbGV4aXR5LCB2YWx1ZSkuaW5SYW5nZSgwLCAxMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNvbXBsZXhpdHkpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVF1YWxpdHksIEMyX1BBUkFNS0VZX1FVQUxJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dCgwdSwgODApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVF1YWxpdHksIHZhbHVlKS5pblJhbmdlKDAsIDEwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVF1YWxpdHkpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0hFVkNfTUFJTiwgTEVWRUxfSEVWQ19NQUlOXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAub25lT2Yoe0MyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vbmVPZih7TEVWRUxfSEVWQ19NQUlOXzEsIExFVkVMX0hFVkNfTUFJTl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fMl8xLCBMRVZFTF9IRVZDX01BSU5fMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzNfMSwgTEVWRUxfSEVWQ19NQUlOXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl80XzEsIExFVkVMX0hFVkNfTUFJTl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fNV8xLCBMRVZFTF9IRVZDX01BSU5fNV8yfSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplLCBtRnJhbWVSYXRlLCBtQml0cmF0ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDwgNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJnNpemUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+ICZmcmFtZVJhdGUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IRVZDX01BSU47CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3RleHByIExldmVsTGltaXRzIGtMaW1pdHNbXSA9IHsKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzEsICAgICAgIDU1Mjk2MCwgICAgMzY4NjQsICAgIDEyODAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAzNjg2NDAwLCAgIDEyMjg4MCwgICAxNTAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yXzEsICAgIDczNzI4MDAsICAgMjQ1NzYwLCAgIDMwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAxNjU4ODgwMCwgICA1NTI5NjAsICAgNjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgIDMzMTc3NjAwLCAgIDk4MzA0MCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80LCAgICAgNjY4NDY3MjAsICAyMjI4MjI0LCAgMTIwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzRfMSwgIDEzMzY5MzQ0MCwgIDIyMjgyMjQsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAgMjY3Mzg2ODgwLCAgODkxMjg5NiwgIDI1MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzEsICA1MzQ3NzM3NjAsICA4OTEyODk2LCAgNDAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMiwgMTA2OTU0NzUyMCwgIDg5MTI4OTYsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxMDY5NTQ3NTIwLCAzNTY1MTU4NCwgIDYwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzEsIDIxMzkwOTUwNDAsIDM1NjUxNTg0LCAxMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMiwgNDI3ODE5MDA4MCwgMzU2NTE1ODQsIDI0MDAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IHNhbXBsZXMgPSBzaXplLnYud2lkdGggKiBzaXplLnYuaGVpZ2h0OworICAgICAgICB1aW50NjRfdCBzYW1wbGVzUGVyU2VjID0gc2FtcGxlcyAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuCisgICAgICAgIGJvb2wgbmVlZHNVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyA8PSBsaW1pdC5zYW1wbGVzICYmIHNhbXBsZXNQZXJTZWMgPD0gbGltaXQuc2FtcGxlc1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IRVZDX01BSU5fNV8yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMOiByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgaGV2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgNjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzJfMSwgIDYzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICA5MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgOTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzQsICAgMTIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsIDEyMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAxNTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMSwgMTUzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDE1NiB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxODAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMSwgMTgzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDE4NiB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuaGV2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gMTU2OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fAorICAgICAgICAgICAgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lUmF0ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gZ2V0Qml0cmF0ZU1vZGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CaXRyYXRlTW9kZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJpdHJhdGU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0U3luYzsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBnZXRDb21wbGV4aXR5X2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29tcGxleGl0eTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUXVhbGl0eVR1bmluZzo6b3V0cHV0PiBnZXRRdWFsaXR5X2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUXVhbGl0eTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dD4gbVF1YWxpdHk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDA7CisKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorCisgICAgaWYgKGNwdUNvcmVDb3VudCA8IDEpCisgICAgICAgIGNwdUNvcmVDb3VudCA9IDE7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitDMlNvZnRIZXZjRW5jOjpDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtSGV2Y0VuY1Byb2ZpbGUoMSksCisgICAgICBtSGV2Y0VuY0xldmVsKDMwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZChmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0SGV2Y0VuYzo6fkMyU29mdEhldmNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6b25SZXNldCgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJTaWduYWxsaW5nIEVPUyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIGludCBnZXRRcEZyb21RdWFsaXR5KGludCBxdWFsaXR5KSB7CisgICAgaW50IHFwOworI2RlZmluZSBNSU5fUVAgNAorI2RlZmluZSBNQVhfUVAgNTAKKyAgICAvKiBRdWFsaXR5OiAxMDAgLT4gUXAgOiBNSU5fUVAKKyAgICAgKiBRdWFsaXR5OiAwIC0+IFFwIDogTUFYX1FQCisgICAgICogUXAgPSAoKE1JTl9RUCAtIE1BWF9RUCkgKiBxdWFsaXR5IC8gMTAwKSArIE1BWF9RUDsKKyAgICAgKi8KKyAgICBxcCA9ICgoTUlOX1FQIC0gTUFYX1FQKSAqIHF1YWxpdHkgLyAxMDApICsgTUFYX1FQOworICAgIHFwID0gc3RkOjptaW4ocXAsIE1BWF9RUCk7CisgICAgcXAgPSBzdGQ6Om1heChxcCwgTUlOX1FQKTsKKyAgICByZXR1cm4gcXA7Cit9CitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU51bUNvcmVzID0gc3RkOjptaW4oR2V0Q1BVQ29yZUNvdW50KCksIChzaXplX3QpIENPREVDX01BWF9DT1JFUyk7CisgICAgbWVtc2V0KCZtRW5jUGFyYW1zLCAwLCBzaXplb2YoaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QpKTsKKworICAgIC8vIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX3NldF9kZWZfcGFyYW1zKCZtRW5jUGFyYW1zKTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZGVmYXVsdCBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8vIHVwZGF0ZSBjb25maWd1cmF0aW9uCisgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X3dpZHRoID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9oZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbSA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X2ZybV9yYXRlX251bSA9CisgICAgICAgIG1GcmFtZVJhdGUtPnZhbHVlICogbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X2ZybV9yYXRlX2Rlbm9tOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1A1OworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfdGd0X2JpdHJhdGVbMF0gPQorICAgICAgICBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9wZWFrX2JpdHJhdGVbMF0gPQorICAgICAgICBtQml0cmF0ZS0+dmFsdWUgPDwgMTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfY29kZWNfbGV2ZWwgPSBtSGV2Y0VuY0xldmVsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfaV9vcGVuX2dvcF9wZXJpb2QgPSBtSURSSW50ZXJ2YWw7CisgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF9jcmFfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKyAgICBtRW5jUGFyYW1zLnNfbXVsdGlfdGhyZF9wcm1zLmk0X21heF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgbUVuY1BhcmFtcy5zX291dF9zdHJtX3BybXMuaTRfY29kZWNfcHJvZmlsZSA9IG1IZXZjRW5jUHJvZmlsZTsKKyAgICBtRW5jUGFyYW1zLnNfbGFwX3BybXMuaTRfcmNfbG9va19haGVhZF9waWNzID0gREVGQVVMVF9SQ19MT09LQUhFQUQ7CisgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF90ZW1wb3JhbF9sYXllcnMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFOgorICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMzsKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfZnJhbWVfcXBbMF0gPQorICAgICAgICAgICAgICAgIGdldFFwRnJvbVF1YWxpdHkobVF1YWxpdHktPnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUOgorICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUNvbXBsZXhpdHktPnZhbHVlID09IDEwKSB7CisgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1AwOworICAgIH0gZWxzZSBpZiAobUNvbXBsZXhpdHktPnZhbHVlID49IDgpIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDI7CisgICAgfSBlbHNlIGlmIChtQ29tcGxleGl0eS0+dmFsdWUgPj0gNykgeworICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QMzsKKyAgICB9IGVsc2UgaWYgKG1Db21wbGV4aXR5LT52YWx1ZSA+PSA1KSB7CisgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1A0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1A1OworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX2Nsb3NlKG1Db2RlY0N0eCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgQ0hFQ0soIW1Db2RlY0N0eCk7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlTW9kZSA9IG1JbnRmLT5nZXRCaXRyYXRlTW9kZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1IZXZjRW5jUHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlX2woKTsKKyAgICAgICAgbUhldmNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBtQ29tcGxleGl0eSA9IG1JbnRmLT5nZXRDb21wbGV4aXR5X2woKTsKKyAgICAgICAgbVF1YWxpdHkgPSBtSW50Zi0+Z2V0UXVhbGl0eV9sKCk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gaW5pdEVuY1BhcmFtcygpOworCisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciBwYXJhbXMgOiAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IElIRVZDRV9FT0s7CisgICAgZXJyID0gaWhldmNlX2luaXQoJm1FbmNQYXJhbXMsICZtQ29kZWNDdHgpOworICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICBBTE9HRSgiSEVWQyBlbmNvZGVyIGluaXQgZmFpbGVkIDogMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6c2V0RW5jb2RlQXJncyhpaGV2Y2VfaW5wX2J1Zl90KiBwc19lbmNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcqIGNvbnN0IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpIHsKKyAgICBpaGV2Y2Vfc3RhdGljX2NmZ19wYXJhbXNfdCogcGFyYW1zID0gJm1FbmNQYXJhbXM7CisgICAgbWVtc2V0KHBzX2VuY29kZV9pcCwgMCwgc2l6ZW9mKCpwc19lbmNvZGVfaXApKTsKKworICAgIGlmICghaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGlmIChpbnB1dC0+d2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbnB1dC0+aGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5wdXQtPndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5wdXQtPmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCYgbGF5b3V0ID0gaW5wdXQtPmxheW91dCgpOworICAgIHVpbnQ4X3QqIHlQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCogdVBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90KiB2UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworCisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBldmVuCisgICAgaWYgKHdpZHRoICYgMXUgfHwgaGVpZ2h0ICYgMXUpIHsKKyAgICAgICAgQUxPR1coImhlaWdodCgldSkgYW5kIHdpZHRoKCV1KSBtdXN0IGJvdGggYmUgZXZlbiIsIGhlaWdodCwgd2lkdGgpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPQorICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgdVN0cmlkZSA9PSB2U3RyaWRlICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0KKyAgICAgICAgICAgICAgICBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB5U3RyaWRlLCBoZWlnaHQpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSW1hZ2VDb3B5KGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqaW5wdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6IHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlCisgICAgICAgICAgICAvLyBwb2ludGVyLgorICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsyXSA9IHZTdHJpZGU7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzBdID0geVN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzFdID0gdVN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMl0gPSB2U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMklMRTogeworICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1syXSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzJdID0gMDsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMF0gPSB5U3RyaWRlICogaGVpZ2h0OworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMV0gPSB1U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsyXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF90Z3RfYml0cmF0ZVswXTsKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfcGVha19iaXRyYXRlID0KKyAgICAgICAgcGFyYW1zLT5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9wZWFrX2JpdHJhdGVbMF07CisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX3JhdGVfZmFjdG9yID0gcGFyYW1zLT5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfZmFjdG9yOworICAgIHBzX2VuY29kZV9pcC0+dThfcHRzID0gd29ya0luZGV4OworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhldmNlX291dF9idWZfdCogcHNfZW5jb2RlX29wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhwc19lbmNvZGVfb3AtPmk0X2J5dGVzX2dlbmVyYXRlZCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmIChDMl9PSyAhPSB3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbWNweSh3Vmlldy5kYXRhKCksIHBzX2VuY29kZV9vcC0+cHUxX291dHB1dF9idWYsCisgICAgICAgICAgIHBzX2VuY29kZV9vcC0+aTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBwc19lbmNvZGVfb3AtPmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIHBzX2VuY29kZV9vcC0+cHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICAgIHBzX2VuY29kZV9vcC0+aTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgIGlmIChwc19lbmNvZGVfb3AtPmk0X2lzX2tleV9mcmFtZSkgeworICAgICAgICBBTE9HVigiSURSIGZyYW1lIHByb2R1Y2VkIik7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0KKyAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWhldmNlX291dF9idWZfdCBzX2VuY29kZV9vcHt9OworICAgICAgICBtZW1zZXQoJnNfZW5jb2RlX29wLCAwLCBzaXplb2Yoc19lbmNvZGVfb3ApKTsKKworICAgICAgICBpaGV2Y2VfZW5jb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2VuY29kZV9vcC51OF9wdHMsIHdvcmssIHBvb2wsICZzX2VuY29kZV9vcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHNQcm9jZXNzZWQgIT0gMXUpIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICBBTE9HRCgiU2lnbmFsbGVkIEVycm9yIC8gU2lnbmFsbGVkIEVvcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX09LOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICBzdGF0dXMgPSBpbml0RW5jb2RlcigpOworICAgICAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHN0YXR1czsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoZW9zKSBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgdmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgdmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IElIRVZDRV9FT0s7CisKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgeworICAgICAgICBpaGV2Y2Vfb3V0X2J1Zl90IHNfaGVhZGVyX29we307CisgICAgICAgIGVyciA9IGloZXZjZV9lbmNvZGVfaGVhZGVyKG1Db2RlY0N0eCwgJnNfaGVhZGVyX29wKTsKKyAgICAgICAgaWYgKGVyciA9PSBJSEVWQ0VfRU9LICYmIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCwgMHUpOworICAgICAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBzX2hlYWRlcl9vcC5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNzZCkpOworICAgICAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgICAgICAgICBtQml0cmF0ZS0+dmFsdWU7CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3BlYWtfYml0cmF0ZVswXSA9CisgICAgICAgICAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpaGV2Y2VfaW5wX2J1Zl90IHNfZW5jb2RlX2lwe307CisgICAgaWhldmNlX291dF9idWZfdCBzX2VuY29kZV9vcHt9OworICAgIHVpbnQ2NF90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCk7CisKKyAgICBzdGF0dXMgPSBzZXRFbmNvZGVBcmdzKCZzX2VuY29kZV9pcCwgdmlldy5nZXQoKSwgd29ya0luZGV4KTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOworICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7CisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgIGVyciA9IGloZXZjZV9lbmNvZGUobUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZW9zKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgKGludCl0aW1lVGFrZW4sCisgICAgICAgICAgKGludCl0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgIGZpbmlzaFdvcmsoc19lbmNvZGVfb3AudThfcHRzLCB3b3JrLCBwb29sLCAmc19lbmNvZGVfb3ApOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRIZXZjRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0SGV2Y0VuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIH5DMlNvZnRIZXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM3NjQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYikKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgNAorI2RlZmluZSBNQVhfQl9GUkFNRVMgICAgIDEKKyNkZWZpbmUgTUFYX1JDX0xPT0tBSEVBRCAxCisKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgMAorI2RlZmluZSBERUZBVUxUX1JDX0xPT0tBSEVBRCAwCisKK3N0cnVjdCBDMlNvZnRIZXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEhldmNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworCisgICBwcm90ZWN0ZWQ6CisgICAgfkMyU29mdEhldmNFbmMoKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190IG1FbmNQYXJhbXM7CisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgIFVXT1JEMzIgbUhldmNFbmNQcm9maWxlOworICAgIFVXT1JEMzIgbUhldmNFbmNMZXZlbDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB2b2lkKiBtQ29kZWNDdHg7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1RdWFsaXR5VHVuaW5nOjpvdXRwdXQ+IG1RdWFsaXR5OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworICAgIGNoYXIgbU91dEZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncyhpaGV2Y2VfaW5wX2J1Zl90KiBwc19lbmNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHdvcmtJbmRleCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgaWhldmNlX291dF9idWZfdCogcHNfZW5jb2RlX29wKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0VuYyk7Cit9OworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggIi9kYXRhL2xvY2FsL3RtcC9oZXZjIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICJoMjY1IgorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCBtVGltZVN0YXJ0LnR2X3NlYywgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl91c2VjLCBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgT1VUUFVUX0RVTVBfRVhUKTsgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxFKiBmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkR1bXAgdG8gZmlsZSEiKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX0hFVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wM0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE3ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKQEAgLTAsMCArMSw1NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wM0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wM0RlYy5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXAzLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0TVAzOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHs4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAzMjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE1QMzo6QzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db25maWcobnVsbHB0ciksCisgICAgICBtRGVjb2RlckJ1ZihudWxscHRyKSB7Cit9CisKK0MyU29mdE1QMzo6fkMyU29mdE1QMygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25TdG9wKCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKKyAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1QMzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVsZWFzZSgpIHsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db25maWcpIHsKKyAgICAgICAgZGVsZXRlIG1Db25maWc7CisgICAgICAgIG1Db25maWcgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0TVAzOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICAgIGlmICghbUNvbmZpZykgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgaWYgKCFtRGVjb2RlckJ1ZikgcmV0dXJuIE5PX01FTU9SWTsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworLyogVGhlIGJlbG93IGNvZGUgaXMgYm9ycm93ZWQgZnJvbSAuL3Rlc3QvbXAzcmVhZGVyLmNwcCAqLworc3RhdGljIGJvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpIHsKKyAgICAqZnJhbWVfc2l6ZSA9IDA7CisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOworICAgIGlmIChvdXRfY2hhbm5lbHMpICpvdXRfY2hhbm5lbHMgPSAwOworICAgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgICBpZiAob3V0X251bV9zYW1wbGVzKSAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKworICAgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKKyAgICBpZiAodmVyc2lvbiA9PSAweDAxKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKKyAgICBpZiAobGF5ZXIgPT0gMHgwMCkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKKyAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAwIHx8IGJpdHJhdGVfaW5kZXggPT0gMHgwZikgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKKyAgICBpZiAoc2FtcGxpbmdfcmF0ZV9pbmRleCA9PSAzKSByZXR1cm4gZmFsc2U7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0geyA0NDEwMCwgNDgwMDAsIDMyMDAwIH07CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgICAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAxOworCisgICAgaWYgKGxheWVyID09IDMpIHsgLy8gbGF5ZXIgSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4CisgICAgICAgIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZSA9ICh2ZXJzaW9uID09IDMgLyogVjEgKi8pID8ga0JpdHJhdGVWMVtiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgIGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorICAgICAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPQorICAgICAgICB7CisgICAgICAgICAgICA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKSA/IGtCaXRyYXRlVjFMMltiaXRyYXRlX2luZGV4IC0gMV0gOgorICAgICAgICAgICAgICAgICAgICBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIChvciAyLjUpCisgICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfSBlbHNlIHsgLy8gVjIgb3IgVjIuNQorICAgICAgICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKKworICAgICAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gPDwgMjQgfCBwdHJbMV0gPDwgMTYgfCBwdHJbMl0gPDwgOCB8IHB0clszXTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU91dFNpemUodWludDggKmhlYWRlciwgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmRlY29kZWRTaXplcykgeworICAgIHVpbnQzMl90IGNoYW5uZWxzOworICAgIHVpbnQzMl90IG51bVNhbXBsZXM7CisgICAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgICBzaXplX3QgdG90YWxJblNpemUgPSAwOworCisgICAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgICAgICBpZiAoIXBhcnNlTXAzSGVhZGVyKFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSksICZmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNoYW5uZWxzLCBudWxscHRyLCAmbnVtU2FtcGxlcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBwYXJzZSBtcDMgaGVhZGVyIGR1cmluZyBvdXRTaXplIGVzdGltYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgZGVjb2RlZFNpemVzLT5wdXNoX2JhY2sobnVtU2FtcGxlcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisKKyAgICBpZiAoZGVjb2RlZFNpemVzLT5lbXB0eSgpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogQ2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/IEFzIGluIHRoZSBjaGVjayBmb3IgdmFsaWRpdHkgb2YKKy8vICAgICAgIHdvcmssIHBvb2wgcHRyLCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSA9PSAxLCAuLi4KKy8vIFRPRE86IEJsaW5kIHJlbW92YWwgb2YgNTI5IHNhbXBsZXMgZnJvbSB0aGUgb3V0cHV0IG1heSBub3Qgd29yay4gQmVjYXVzZQorLy8gICAgICAgbXBlZyBsYXllciAxIGZyYW1lIHNpemUgaXMgMzg0IHNhbXBsZXMgcGVyIGZyYW1lLiBUaGlzIHNob3VsZCBpbnRyb2R1Y2UKKy8vICAgICAgIG5lZ2F0aXZlIHZhbHVlcyBhbmQgY2FuIGNhdXNlIFNFRyBmYXVsdHMuIFNvZnQgb214IG1wMyBwbHVnaW4gY2FuIGhhdmUKKy8vICAgICAgIHRoaXMgcHJvYmxlbSAoQ0hFQ0shKQordm9pZCBDMlNvZnRNUDM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplID09IDAgJiYgKCFtR2FwbGVzc0J5dGVzIHx8ICFlb3MpKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaW50MzJfdCBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGRlY29kZWRTaXplczsKKyAgICBpZiAoaW5TaXplICYmIE9LICE9IGNhbGN1bGF0ZU91dFNpemUoY29uc3RfY2FzdDx1aW50OCAqPihyVmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsICZkZWNvZGVkU2l6ZXMpKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWxPdXRTaXplID0gc3RkOjphY2N1bXVsYXRlKGRlY29kZWRTaXplcy5iZWdpbigpLCBkZWNvZGVkU2l6ZXMuZW5kKCksIDApOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgY2FsT3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb3V0U2l6ZSA9IDA7CisgICAgaW50IG91dE9mZnNldCA9IDA7CisgICAgYXV0byBpdCA9IGRlY29kZWRTaXplcy5iZWdpbigpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChpdCA9PSBkZWNvZGVkU2l6ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpICsgaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IChjYWxPdXRTaXplIC0gb3V0U2l6ZSk7CisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSArIG91dFNpemUpOworCisgICAgICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICAgICAgaWYgKChkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKSkKKyAgICAgICAgICAgICAgICAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19FTk9VR0hfTUFJTl9EQVRBX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIGRlY29kZXJFcnIgIT0gU0lERV9JTkZPX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKKyAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgQUxPR1YoImlnbm9yaW5nIGVycm9yIGFuZCBzZW5kaW5nIHNpbGVuY2UiKTsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9ICppdCAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChtQ29uZmlnLT5wT3V0cHV0QnVmZmVyLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBzYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworCisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBudW1DaGFubmVscyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgqaXQgIT0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvdXRTaXplICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaW5Qb3MgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBpdCsrOworICAgIH0KKyAgICBpZiAobUlzRmlyc3QpIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUdhcGxlc3NCeXRlcyA9IHRydWU7CisgICAgICAgIC8vIFRoZSBkZWNvZGVyIGRlbGF5IGlzIDUyOSBzYW1wbGVzLCBzbyB0cmltIHRoYXQgbWFueSBzYW1wbGVzIG9mZgorICAgICAgICAvLyB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG91dHB1dCBidWZmZXIuIFRoaXMgZXNzZW50aWFsbHkgbWFrZXMgdGhpcworICAgICAgICAvLyBkZWNvZGVyIGhhdmUgemVybyBkZWxheSwgd2hpY2ggdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIGFzc3VtZXMuCisgICAgICAgIG91dE9mZnNldCA9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGlmIChjYWxPdXRTaXplID49CisgICAgICAgICAgICBvdXRTaXplICsga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIGlmICghbWVtc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KHdWaWV3LmRhdGEoKSArIG91dFNpemUpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJBZGRpbmcgNTI5IHNhbXBsZXMgYXQgZW5kIik7CisgICAgICAgICAgICBtR2FwbGVzc0J5dGVzID0gZmFsc2U7CisgICAgICAgICAgICBvdXRTaXplICs9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGluZ1JhdGU7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKChvdXRTaXplIC0gb3V0T2Zmc2V0KSAvIChudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkIHRpbWVzdGFtcCAldSIsIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCwKKyAgICAgICAgICAodWludDMyX3QpKG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXApKTsKKyAgICBkZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgb3V0T2Zmc2V0LCBvdXRTaXplIC0gb3V0T2Zmc2V0KSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE1wM0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcDNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgbmV3IEMyU29mdE1QMyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1QMzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1QMzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXAzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXAzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyYmRjNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOworCitib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X3NhbXBsaW5nX3JhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9udW1fc2FtcGxlcyA9IG51bGxwdHIpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNUDMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TVAzKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1QMygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ID0gNTI5IC8vIHNhbXBsZXMKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1HYXBsZXNzQnl0ZXM7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNUDMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVAzX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZjBhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdiNDAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC0wLDAgKzEsMTExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzJEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnMkRlYy5oIgorI2luY2x1ZGUgImltcGVnMmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTkyMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxMDg4LCA0KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyhXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKm1lbSkgeworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6OkMyU29mdE1wZWcyRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTWVtUmVjb3JkcyhudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICAgIG1PdXRJbmRleCgwdSkgeworICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjp+QzJTb2Z0TXBlZzJEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckRyYWluID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0TnVtTWVtUmVjb3JkcygpIHsKKyAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpmaWxsTWVtUmVjb3JkcygpIHsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSAoaXZfbWVtX3JlY190ICopIGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKCFwc19tZW1fcmVjKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBzX21lbV9yZWMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykKKyAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgbU1lbVJlY29yZHMgPSBwc19tZW1fcmVjOworCisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfZmlsbF9tZW1faXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBtV2lkdGg7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gbUhlaWdodDsKKyAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtTnVtTWVtUmVjb3Jkcywgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICBpZiAoIXBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBtV2lkdGg7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gbUhlaWdodDsKKyAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfaW5pdF9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X29wX3QpOworCisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRHJhaW47CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEMyU29mdE1wZWcyRGVjOjpnZXRTZXFJbmZvKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX29wOworCisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCk7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfc3ViX2NtZCA9CisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX0dFVF9TRVFfSU5GTzsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dXKCJFcnJvciBpbiBnZXR0aW5nIFNlcXVlbmNlIGluZm86IDB4JXgiLCBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gIGZhbHNlOyAgLy8gbXBlZzIgdmlkZW8gaGFzIGxpbWl0ZWQgcmFuZ2UuCisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU3RyaWRlID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBkZWxldGVEZWNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgZGVsZXRlRGVjb2RlcigpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLCBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGNsb25lQW5kU2VuZCBjYW4gYmUgYXZvaWRlZCBieSB0cmFja2luZyBudW1iZXIgb2YgZnJhbWVzIHJlbWFpbmluZworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbU91dEluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgIG1PdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElNUEVHMkRfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HVigidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgc19kZWNvZGVfb3AudTRfcGljX3dkLCBzX2RlY29kZV9vcC51NF9waWNfaHQpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE9LICE9IHJlSW5pdERlY29kZXIoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlciBvdXQ6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKSBnZXRTZXFJbmZvKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWcyRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkM2I4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaW1wZWcyZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfaXBfdAorI2RlZmluZSBpdmRleHRfaW5pdF9vcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9faXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9jbGlwcy9tcGVnMmRfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJtMnYiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgICAgIGlmIChpICE9ICh1aW50MzJfdCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCitzdHJ1Y3QgQzJTb2Z0TXBlZzJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzJEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBmaWxsTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFNlcUluZm8oKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRHJhaW47CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnMkRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjY4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMCwwICsxLDc1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RGVjIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RGVjLmgiCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgxdSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QNFZfMykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzZ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAxOTIwLCAxMDg4KSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDM1MiwgMjg4KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTkyMCAqIDEwODggKiAzIC8gMikpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM1MiAqIDI4OCAqIDMgLyAyKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworI2lmZGVmIE1QRUc0CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisjZWxzZQorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMzUydSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyODh1KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRNYXhXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT53aWR0aDsgfQorICAgIHVpbnQzMl90IGdldE1heEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT5oZWlnaHQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitDMlNvZnRNcGVnNERlYzo6QzJTb2Z0TXBlZzREZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgeworfQorCitDMlNvZnRNcGVnNERlYzo6fkMyU29mdE1wZWc0RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICAodm9pZClvbkluaXQoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1Jc01wZWc0ID0gdHJ1ZTsKKyNlbHNlCisgICAgbUlzTXBlZzQgPSBmYWxzZTsKKyNlbmRpZgorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgLyogVE9ETzogYnJpbmcgdGhlc2UgdmFsdWVzIHRvIDM1MiBhbmQgMjg4LiBJdCBjYW5ub3QgYmUgZG9uZSBhcyBvZiBub3cKKyAgICAgKiBiZWNhdXNlLCBoMjYzIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBwb3J0IHJlY29uZmlndXJhdGlvbi4gSW4gT01YLCB0aGUKKyAgICAgKiBwcm9ibGVtIG9mIGxhcmdlciB3aWR0aCBhbmQgaGVpZ2h0IHRoYW4gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGlzCisgICAgICogb3ZlcmNvbWUgYnkgYWRhcHRpdmVQbGF5QmFjaygpIGFwaSBjYWxsLiBUaGlzIGNhbGwgZ2V0cyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogaW5mb3JtYXRpb24gZnJvbSBleHRyYWN0b3IuIFN1Y2ggYSB0aGluZyBpcyBub3QgcG9zc2libGUgaGVyZS4KKyAgICAgKiBTbyB3ZSBhcmUgY29uZmlndXJpbmcgdG8gbGFyZ2VyIHZhbHVlcy4qLworICAgIG1XaWR0aCA9IDE0MDg7CisgICAgbUhlaWdodCA9IDExNTI7CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBhbGlnbihtV2lkdGgsIDE2KSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzREZWM6OmhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OworICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOworCisgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisKKyAgICBDSEVDS19MRShkaXNwX3dpZHRoLCBidWZfd2lkdGgpOworICAgIENIRUNLX0xFKGRpc3BfaGVpZ2h0LCBidWZfaGVpZ2h0KTsKKworICAgIEFMT0dWKCJkaXNwbGF5IHNpemUgKCVkeCVkKSwgYnVmZmVyIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOworCisgICAgYm9vbCByZXNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gbVdpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICByZXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNNcGVnNCkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmVzQ2hhbmdlZDsKK30KKworLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQorICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorICAgIC8qIFUgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIC8qIFYgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgYm9vbCB2b2xIZWFkZXIgPSAqc3RhcnRfY29kZSA9PSAweEIwMDEwMDAwOworICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAoY29kZWNDb25maWcgfHwgdm9sSGVhZGVyKSB7CisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IGJpdHN0cmVhbTsKKyAgICAgICAgICAgIHZvbF9zaXplID0gaW5TaXplOworICAgICAgICB9CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgbW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50PyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgeworICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKTsKKyAgICAgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlclNpemUgPCB5RnJhbWVTaXplICogMyAvIDIpeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSxtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGVhZGVyIGNvbnRhaW5zIG5ldyBpbmZvLCBlLmcuLCB3aWR0aC9oZWlnaHQsIGV0Yy4KKyAgICAgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICAgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gKGluUG9zID09IDApOworICAgICAgICBpbnQzMl90IHRtcEluU2l6ZSA9IChpbnQzMl90KWluU2l6ZTsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gYml0c3RyZWFtOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSB3b3JrSW5kZXg7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWb3BIZWFkZXIuCisgICAgICAgIGJvb2wgcmVzQ2hhbmdlID0gaGFuZGxlUmVzQ2hhbmdlKHdvcmspOworICAgICAgICBpZiAobUlzTXBlZzQgJiYgcmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJlc0NoYW5nZSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZ0bXBJblNpemUpICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZpZGVvIGZyYW1lLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgICAgICAodm9pZCljb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJZLAorICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKKyAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBpblBvcyArPSBpblNpemUgLSAoc2l6ZV90KXRtcEluU2l6ZTsKKyAgICAgICAgZmluaXNoV29yayh3b3JrSW5kZXgsIHdvcmspOworICAgICAgICArK21OdW1TYW1wbGVzT3V0cHV0OworICAgICAgICBpZiAoaW5TaXplIC0gaW5Qb3MgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzREZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2YTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0RFQ19IXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzREZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzREZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCisgICAgfTsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGJvb2wgaGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgICBzaXplX3QgIG1PdXRwdXRCdWZmZXJTaXplOworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1Jc01wZWc0OworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzREZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA1M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RW5jIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRW5jIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RW5jLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU8gPSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKKyNlbmRpZgorCit9IC8vIG5hbWVwc2FjZQorCitjbGFzcyBDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU8pIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxNzYsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDE0NCwgMTYpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkub25lT2YoezE3NiwgMzUyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5vbmVPZih7MTQ0LCAyODh9KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNy4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfTVA0Vl9TSU1QTEUsIExFVkVMX01QNFZfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzJ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IMjYzX0JBU0VMSU5FLCBMRVZFTF9IMjYzXzQ1KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9NUDRWX1NJTVBMRTsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IMjYzX0JBU0VMSU5FOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9NUDRWXzI7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IMjYzXzQ1OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKK0MyU29mdE1wZWc0RW5jOjpDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1FbmNQYXJhbXMobnVsbHB0ciksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKK30KKworQzJTb2Z0TXBlZzRFbmM6On5DMlNvZnRNcGVnNEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uSW5pdCgpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1FbmNvZGVNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyNlbHNlCisgICAgbUVuY29kZU1vZGUgPSBIMjYzX01PREU7CisjZW5kaWYKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIH0KKworICAgIGlmICghbUVuY1BhcmFtcykgeworICAgICAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ3ZpZGVvRW5jT3B0aW9uczsKKyAgICB9CisKKyAgICBpZiAoIShtRW5jUGFyYW1zICYmIG1IYW5kbGUpKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICh2b2lkKVBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtSGFuZGxlOworICAgICAgICBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0VuY0NvbnRyb2xzKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIGlmICghUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNQYXJhbXMsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGlmIChtRnJhbWVSYXRlLT52YWx1ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZXJhdGUgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IG1FbmNvZGVNb2RlOworICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMtPmVuY0hlaWdodFswXSA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgbUVuY1BhcmFtcy0+cmNUeXBlID0gVkJSXzE7CisgICAgbUVuY1BhcmFtcy0+dmJ2RGVsYXkgPSA1LjBmOworICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyAobUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjUpOworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy0+aVF1YW50WzBdID0gMTU7CisgICAgbUVuY1BhcmFtcy0+cFF1YW50WzBdID0gMTI7CisgICAgbUVuY1BhcmFtcy0+cXVhbnRUeXBlWzBdID0gMDsKKyAgICBtRW5jUGFyYW1zLT5ub0ZyYW1lU2tpcHBlZCA9IFBWX09GRjsKKworICAgIC8vIFBWJ3MgTVBFRzQgZW5jb2RlciByZXF1aXJlcyB0aGUgdmlkZW8gZGltZW5zaW9uIG9mIG11bHRpcGxlCisgICAgaWYgKG1TaXplLT53aWR0aCAlIDE2ICE9IDAgfHwgbVNpemUtPmhlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW5pdEVuY1BhcmFtcygpOworICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplZCBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtSGFuZGxlLCBtRW5jUGFyYW1zKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyAxc3QgYnVmZmVyIGZvciBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCAmJiBDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopd1ZpZXcuZGF0YSgpOworICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgorICAgICAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKCFQVkdldFZvbEhlYWRlcihtSGFuZGxlLCBvdXRQdHIsICZvdXRwdXRTaXplLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXctPmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPSBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGluQnVmZmVyLndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBwbGFuZXMgYXJlIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLKE5VTEwgIT0geVBsYW5lKTsKKyAgICAvKiBFbmNvZGUgZnJhbWVzICovCisgICAgVmlkZW9FbmNGcmFtZUlPIHZpbiwgdm91dDsKKyAgICBtZW1zZXQoJnZpbiwgMCwgc2l6ZW9mKHZpbikpOworICAgIG1lbXNldCgmdm91dCwgMCwgc2l6ZW9mKHZvdXQpKTsKKyAgICB2aW4ueUNoYW4gPSB5UGxhbmU7CisgICAgdmluLnVDaGFuID0gdVBsYW5lOworICAgIHZpbi52Q2hhbiA9IHZQbGFuZTsKKyAgICB2aW4udGltZXN0YW1wID0gKGlucHV0VGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcworICAgIHZpbi5oZWlnaHQgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICB2aW4ucGl0Y2ggPSBhbGlnbih3aWR0aCwgMTYpOworCisgICAgdWludDMyX3QgbW9kVGltZU1zID0gMDsKKyAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICBpZiAoIVBWRW5jb2RlVmlkZW9GcmFtZShtSGFuZGxlLCAmdmluLCAmdm91dCwgJm1vZFRpbWVNcywgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgJm5MYXllcikgfHwKKyAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW50IHRyYWNrIGF0IGZyYW1lICUiIFBSSWQ2NCwgbU51bUlucHV0RnJhbWVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXRwdXRTaXplIGZpbGxlZCA6ICVkIiwgb3V0cHV0U2l6ZSk7CisgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgQ0hFQ0soTlVMTCA9PSBQVkdldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworCisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0cHV0U2l6ZSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworICAgICAgICBpZiAoaGludFRyYWNrLkNvZGVUeXBlID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0KKworICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKHlQbGFuZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzRFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQ2MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9FTkNfSF9fCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzRFbmMoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgdGFndmlkZW9FbmNDb250cm9scyAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICptRW5jUGFyYW1zOworCisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sICAgICBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB1aW50MzJfdCBtT3V0QnVmZmVyU2l6ZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgTVA0RW5jb2RpbmdNb2RlIG1FbmNvZGVNb2RlOworCisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIGMyX3N0YXR1c190IGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzRFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMTQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNFbmMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY5NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJDMlNvZnRPcHVzRGVjLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdE9wdXNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2MDAwLCA1MTAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA5NjAgKiA2KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNEZWM6OkMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRPcHVzRGVjOjp+QzJTb2Z0T3B1c0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKKy8vIE1heGltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBYaXBoJ3Mgb3B1c2RlYy4KK3N0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcyA9IDk2MCAqIDY7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CitzdGF0aWMgY29uc3QgdWludDhfdCBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0W2tNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0XSA9IHsgMCwgMSB9OworCisKKy8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbnVtYmVyIG9mIHNhbXBsZXMuCitzdGF0aWMgdWludDY0X3QgbnNfdG9fc2FtcGxlcyh1aW50NjRfdCBucywgaW50IHJhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiByYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIUdldE9wdXNIZWFkZXJCdWZmZXJzKGRhdGEsIGluU2l6ZSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGVuY291bnRlcmVkIGVycm9yIGluIEdldE9wdXNIZWFkZXJCdWZmZXJzIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmbUhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyLmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9jb3VwbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLmdhaW5fZGIpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGVjRGVsYXlCdWYgJiYgY29kZWNEZWxheUJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNvZGVjRGVsYXlCdWYsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcyh2YWx1ZSwga1JhdGUpOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZiAmJiBzZWVrUHJlUm9sbEJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIHNlZWtQcmVSb2xsQnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQxOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMCwwICsxLDYzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNFbmMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVMgMjAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgY29uc3QgaW50IGtNYXhOdW1DaGFubmVsc1N1cHBvcnRlZCA9IDI7CisKK2NsYXNzIEMyU29mdE9wdXNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDEyMDAwLCAxNjAwMCwgMjQwMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCBrTWF4TnVtQ2hhbm5lbHNTdXBwb3J0ZWQpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgMTI4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg1MDAsIDUxMjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwgMTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNvbXBsZXhpdHksIHZhbHVlKS5pblJhbmdlKDEsIDEwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ29tcGxleGl0eSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzg0MCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDb21wbGV4aXR5KCkgY29uc3QgeyByZXR1cm4gbUNvbXBsZXhpdHktPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNFbmM6OkMyU29mdE9wdXNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1PdXRwdXRCbG9jayhudWxscHRyKSwKKyAgICAgIG1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMTYobnVsbHB0ciksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0T3B1c0VuYzo6fkMyU29mdE9wdXNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtb25vX21hcHBpbmdbMjU2XSA9IHswfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzdGVyZW9fbWFwcGluZ1syNTZdID0gezAsIDF9OworICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIGludCBjb21wbGV4aXR5ID0gbUludGYtPmdldENvbXBsZXhpdHkoKTsKKyAgICBtTnVtU2FtcGxlc1BlckZyYW1lID0gbVNhbXBsZVJhdGUgLyAoMTAwMCAvIG1GcmFtZUR1cmF0aW9uTXMpOworICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgPQorICAgICAgICBtQ2hhbm5lbENvdW50ICogbU51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQgZXJyID0gQzJfT0s7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBtYXBwaW5nOworICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgbWFwcGluZyA9IG1vbm9fbWFwcGluZzsKKyAgICB9IGVsc2UgaWYgKG1DaGFubmVsQ291bnQgPT0gMikgeworICAgICAgICBtYXBwaW5nID0gc3RlcmVvX21hcHBpbmc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk51bWJlciBvZiBjaGFubmVscyAoJWQpIGlzIG5vdCBzdXBwb3J0ZWQiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobUVuY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgfQorCisgICAgbUVuY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LAorICAgICAgICAxLCBtQ2hhbm5lbENvdW50IC0gMSwgbWFwcGluZywgT1BVU19BUFBMSUNBVElPTl9BVURJTywgJmVycik7CisgICAgaWYgKGVycikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNyZWF0ZSBsaWJvcHVzIGVuY29kZXIuIEVycm9yIGNvZGU6ICVpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyBDb21wbGV4aXR5CisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwoCisgICAgICAgICAgICBtRW5jb2RlciwgT1BVU19TRVRfQ09NUExFWElUWShjb21wbGV4aXR5KSkgIT0gT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBjb21wbGV4aXR5Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRFRYCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX0RUWCgwKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBkdHgiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBcHBsaWNhdGlvbgorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLAorICAgICAgICAgICAgT1BVU19TRVRfQVBQTElDQVRJT04oT1BVU19BUFBMSUNBVElPTl9BVURJTykpICE9IE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgYXBwbGljYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTaWduYWwgdHlwZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9TSUdOQUwoT1BVU19BVVRPKSkgIT0KKyAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBzaWduYWwiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJhaW5lZCBWQlIKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSKDEpICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciB0eXBlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9WQlJfQ09OU1RSQUlOVCgxKSAhPQorICAgICAgICAgICAgT1BVU19PSykpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgdmJyIGNvbnN0cmFpbnQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBCaXRyYXRlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX0JJVFJBVEUoYml0cmF0ZSkpICE9CisgICAgICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGJpdHJhdGUiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgc2VlayBwcmVyb2xsIHRvIDgwIG1zCisgICAgbVNlZWtQcmVSb2xsID0gODAwMDAwMDA7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckdlbmVyYXRlZCA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IGZhbHNlOworICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgbUZyYW1lRHVyYXRpb25NcyA9IERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVM7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20xNikgeworICAgICAgICBtSW5wdXRCdWZmZXJQY20xNiA9CisgICAgICAgICAgICAoaW50MTZfdCopbWFsbG9jKGtGcmFtZVNpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIH0KKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTE2KSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgLyogRGVmYXVsdCBDb25maWd1cmF0aW9ucyAqLworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IGZhbHNlOworICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIGlmIChtRW5jb2RlcikgeworICAgICAgICBpbnQgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIk9QVVNfUkVTRVRfU1RBVEUgZmFpbGVkIHN0YXR1cyA9ICVzIiwgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT3V0cHV0QmxvY2spIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclBjbTE2KSB7CisgICAgICAgIGZyZWUobUlucHV0QnVmZmVyUGNtMTYpOworICAgICAgICBtSW5wdXRCdWZmZXJQY20xNiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtRW5jb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgICAgIG1FbmNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCisvLyBEcmFpbiB0aGUgZW5jb2RlciB0byBnZXQgbGFzdCBmcmFtZXMgKGlmIGFueSkKK2ludCBDMlNvZnRPcHVzRW5jOjpkcmFpbkVuY29kZXIodWludDhfdCogb3V0UHRyKSB7CisgICAgbWVtc2V0KCh1aW50OF90ICopbUlucHV0QnVmZmVyUGNtMTYgKyBtRmlsbGVkTGVuLCAwLAorICAgICAgICAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICBpbnQgZW5jb2RlZEJ5dGVzID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGUoCisgICAgICAgIG1FbmNvZGVyLCBtSW5wdXRCdWZmZXJQY20xNiwgbU51bVNhbXBsZXNQZXJGcmFtZSwgb3V0UHRyLCBrTWF4UGF5bG9hZCk7CisgICAgaWYgKGVuY29kZWRCeXRlcyA+IG1PdXRwdXRCbG9jay0+Y2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRSgibm90IGVub3VnaCBzcGFjZSBsZWZ0IHRvIHdyaXRlIGVuY29kZWQgZGF0YSwgZHJvcHBpbmcgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEFMT0dWKCJlbmNvZGVkICVpIE9wdXMgYnl0ZXMgZnJvbSAlenUgUENNIGJ5dGVzIiwgZW5jb2RlZEJ5dGVzLAorICAgICAgICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IHRydWU7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgcmV0dXJuIGVuY29kZWRCeXRlczsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoIW1FbmNvZGVyKSB7CisgICAgICAgIGlmIChpbml0RW5jb2RlcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5pdEVuY29kZXIgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplID4gMCkgeworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtSXNGaXJzdEZyYW1lID0gZmFsc2U7CisgICAgfQorCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGtNYXhQYXlsb2FkLCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBwcm9jZXNzU2l6ZSA9IDA7CisgICAgbUJ5dGVzRW5jb2RlZCA9IDA7CisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gMHU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGNvbnN0IHVpbnQ4X3QqIGluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisKKyAgICBjbGFzcyBGaWxsV29yayB7CisgICAgcHVibGljOgorICAgICAgICBGaWxsV29yayh1aW50MzJfdCBmbGFncywgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgICAgICAgICA6IG1GbGFncyhmbGFncyksIG1PcmRpbmFsKG9yZGluYWwpLCBtQnVmZmVyKGJ1ZmZlcikgeworICAgICAgICB9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKCFtSGVhZGVyR2VuZXJhdGVkKSB7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW0FPUFVTX1VOSUZJRURfQ1NEX01BWFNJWkVdOworICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisKKyAgICAgICAgLy8gR2V0IGNvZGVjRGVsYXkKKyAgICAgICAgaW50MzJfdCBsb29rYWhlYWQ7CisgICAgICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX0dFVF9MT09LQUhFQUQoJmxvb2thaGVhZCkpICE9CisgICAgICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgbG9va2FoZWFkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Db2RlY0RlbGF5ID0gbG9va2FoZWFkICogMTAwMDAwMDAwMGxsIC8gbVNhbXBsZVJhdGU7CisKKyAgICAgICAgT3B1c0hlYWRlciBvcHVzSGVhZGVyOworICAgICAgICBtZW1zZXQoJm9wdXNIZWFkZXIsIDAsIHNpemVvZihvcHVzSGVhZGVyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbHMgPSBtQ2hhbm5lbENvdW50OworICAgICAgICBvcHVzSGVhZGVyLm51bV9zdHJlYW1zID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChtQ2hhbm5lbENvdW50ID4gOCkgPyAyNTUgOiAobUNoYW5uZWxDb3VudCA+IDIpKTsKKyAgICAgICAgb3B1c0hlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgb3B1c0hlYWRlci5za2lwX3NhbXBsZXMgPSBsb29rYWhlYWQ7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBXcml0ZU9wdXNIZWFkZXJzKG9wdXNIZWFkZXIsIG1TYW1wbGVSYXRlLCBoZWFkZXIsCisgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgbUNvZGVjRGVsYXksIG1TZWVrUHJlUm9sbCk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShoZWFkZXJMZW4sIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgaGVhZGVyTGVuKTsKKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBoZWFkZXJMZW4pOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIGJ1ZmZlciBzaXplIHdoaWNoIGlzIG5vdCBhIG11bHRpcGxlIG9mIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUsIHdlIHdpbGwKKyAgICAgKiBhY2N1bXVsYXRlIHRoZSBpbnB1dCBhbmQga2VlcCBpdC4gT25jZSB0aGUgaW5wdXQgaXMgZmlsbGVkIHdpdGggZXhwZWN0ZWQgbnVtYmVyCisgICAgICogb2YgYnl0ZXMsIHdlIHdpbGwgc2VuZCBpdCB0byBlbmNvZGVyLiBtRmlsbGVkTGVuIG1hbmFnZXMgdGhlIGJ5dGVzIG9mIGlucHV0IHlldAorICAgICAqIHRvIGJlIHByb2Nlc3NlZC4gVGhlIG5leHQgY2FsbCB3aWxsIGZpbGwgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4KKyAgICAgKiBieXRlcyB0byBpbnB1dCBhbmQgc2VuZCBpdCB0byB0aGUgZW5jb2Rlci4KKyAgICAgKi8KKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogcGNtQnl0ZXMgPSBpblB0ciArIGluUG9zOworICAgICAgICBpbnQgZmlsbGVkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIHByb2Nlc3NTaXplID0gbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW47CisgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2Nlc3NTaXplID0gaW5TaXplIC0gaW5Qb3M7CisgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEJ1ZmZlclBjbTE2ICsgZmlsbGVkU2FtcGxlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgbklucHV0U2FtcGxlcyA9IHByb2Nlc3NTaXplIC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgZGF0YSA9IHBjbUJ5dGVzWzIgKiBpICsgMV0gPDwgOCB8IHBjbUJ5dGVzWzIgKiBpXTsKKyAgICAgICAgICAgIGRhdGEgPSAoKGRhdGEgJiAweEZGRkYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2W2kgKyBmaWxsZWRTYW1wbGVzXSA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gcHJvY2Vzc1NpemU7CisgICAgICAgIG1GaWxsZWRMZW4gKz0gcHJvY2Vzc1NpemU7CisgICAgICAgIGlmICghbUJ1ZmZlckF2YWlsYWJsZSkgYnJlYWs7CisgICAgICAgIHVpbnQ4X3QqIG91dFB0ciA9IHdWaWV3LmRhdGEoKSArIG1CeXRlc0VuY29kZWQ7CisgICAgICAgIGludCBlbmNvZGVkQnl0ZXMgPQorICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGUobUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVNhbXBsZXNQZXJGcmFtZSwgb3V0UHRyLCBrTWF4UGF5bG9hZCAtIG1CeXRlc0VuY29kZWQpOworICAgICAgICBBTE9HVigiZW5jb2RlZCAlaSBPcHVzIGJ5dGVzIGZyb20gJXp1IFBDTSBieXRlcyIsIGVuY29kZWRCeXRlcywKKyAgICAgICAgICAgICAgcHJvY2Vzc1NpemUpOworCisgICAgICAgIGlmIChlbmNvZGVkQnl0ZXMgPCAwIHx8IGVuY29kZWRCeXRlcyA+IChrTWF4UGF5bG9hZCAtIG1CeXRlc0VuY29kZWQpKSB7CisgICAgICAgICAgICBBTE9HRSgib3B1c19lbmNvZGUgZmFpbGVkLCBlbmNvZGVkQnl0ZXMgOiAlZCIsIGVuY29kZWRCeXRlcyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCBtQnl0ZXNFbmNvZGVkLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIG1CeXRlc0VuY29kZWQgKz0gZW5jb2RlZEJ5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoZmlsbGVkU2FtcGxlcyArIG5JbnB1dFNhbXBsZXMpOworICAgICAgICBvdXRUaW1lU3RhbXAgPQorICAgICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtQ2hhbm5lbENvdW50IC8gbVNhbXBsZVJhdGU7CisgICAgICAgIGlmICgocHJvY2Vzc1NpemUgKyBtRmlsbGVkTGVuKSA8IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUpCisgICAgICAgICAgICBtRW5jb2RlckZsdXNoZWQgPSB0cnVlOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKGVvcykgeworICAgICAgICBBTE9HVigic2lnbmFsbGVkIGVvcyIpOworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtRW5jb2RlckZsdXNoZWQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRyYWluIHRoZSBlbmNvZGVyIGZvciBsYXN0IGJ1ZmZlcgorICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChwb29sLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgRmlsbFdvcmsoKEMyRnJhbWVEYXRhOjpmbGFnc190KShmbGFncyksIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbkludGVybmFsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIG1CeXRlc0VuY29kZWQgPSAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gbnVsbHB0cjsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhrTWF4UGF5bG9hZCwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGludCBlbmNCeXRlcyA9IGRyYWluRW5jb2Rlcih3Vmlldy5kYXRhKCkpOworICAgIGlmIChlbmNCeXRlcyA+IDApIG1CeXRlc0VuY29kZWQgKz0gZW5jQnl0ZXM7CisgICAgaWYgKG1CeXRlc0VuY29kZWQgPiAwKSB7CisgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihtT3V0cHV0QmxvY2ssIDAsIG1CeXRlc0VuY29kZWQpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLyBzaXplb2YoaW50MTZfdCkpOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPQorICAgICAgICAoQzJGcmFtZURhdGE6OmZsYWdzX3QpKGVvcyA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gb3V0T3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIHJldHVybiBkcmFpbkludGVybmFsKHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRPcHVzRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE9wdXNFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE9wdXNFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRkOGYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX09QVVNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK3N0cnVjdCBPcHVzTVNFbmNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIC8qIE9QVVNfRlJBTUVTSVpFXzIwX01TICovCisgICAgY29uc3QgaW50IGtGcmFtZVNpemUgPSA5NjA7CisgICAgY29uc3QgaW50IGtNYXhTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgY29uc3QgaW50IGtNaW5TYW1wbGVSYXRlID0gODAwMDsKKyAgICBjb25zdCBpbnQga01heFBheWxvYWQgPSAoNDAwMCAqIGtNYXhTYW1wbGVSYXRlKSAvIGtNaW5TYW1wbGVSYXRlOworICAgIGNvbnN0IGludCBrTWF4TnVtQ2hhbm5lbHMgPSA4OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dHB1dEJsb2NrOworCisgICAgT3B1c01TRW5jb2RlciogbUVuY29kZXI7CisgICAgaW50MTZfdCogbUlucHV0QnVmZmVyUGNtMTY7CisKKyAgICBib29sIG1IZWFkZXJHZW5lcmF0ZWQ7CisgICAgYm9vbCBtSXNGaXJzdEZyYW1lOworICAgIGJvb2wgbUVuY29kZXJGbHVzaGVkOworICAgIGJvb2wgbUJ1ZmZlckF2YWlsYWJsZTsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgdWludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICB1aW50MzJfdCBtRnJhbWVEdXJhdGlvbk1zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgLy8gQ29kZWMgZGVsYXkgaW4gbnMKKyAgICB1aW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICAvLyBTZWVrIHByZS1yb2xsIGluIG5zCisgICAgdWludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludCBtTnVtU2FtcGxlc1BlckZyYW1lOworICAgIGludCBtQnl0ZXNFbmNvZGVkOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBzaXplX3QgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgaW50IGRyYWluRW5jb2Rlcih1aW50OF90KiBvdXRQdHIpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE9wdXNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5NDRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFJhd0RlYy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYjkwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRSYXdEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFJhd0RlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5yYXcuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRSYXdEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDM4NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgOTgzMDQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA2NCAqIDEwMjQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWb3JiaXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2b3JiaXNpZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTZkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0Vm9yYmlzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWb3JiaXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0Vm9yYmlzRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMzIwMDAsIDUwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIgKiAyICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFZvcmJpc0RlYzo6QzJTb2Z0Vm9yYmlzRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1TdGF0ZShudWxscHRyKSwKKyAgICAgIG1WaShudWxscHRyKSB7Cit9CisKK0MyU29mdFZvcmJpc0RlYzo6fkMyU29mdFZvcmJpc0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gKGluaXREZWNvZGVyKCkgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRCk7Cit9CisKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVZpID0gbmV3IHZvcmJpc19pbmZve307CisgICAgaWYgKCFtVmkpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKworICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRle307CisgICAgaWYgKCFtU3RhdGUpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworCisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUluZm9VbnBhY2tlZCA9IGZhbHNlOworICAgIG1Cb29rc1VucGFja2VkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0ZSkgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7CisgICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisgICAgYnVmLT5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5iZWdpbiA9IDA7CisgICAgcmVmLT5sZW5ndGggPSBzaXplOworICAgIHJlZi0+bmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Cit9CisKKy8vIChDSEVDSyEpIG11bHRpZnJhbWUgaXMgdHJpY2t5LiBkZWNvZGUgY2FsbCBkb2VzbnQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGNvbnN1bWVkIGJ5IHRoZSBjb21wb25lbnQuIEFsc28gaXQgaXMgdW5jbGVhciB3aHkgbnVtUGFnZUZyYW1lcyBpcyBiZWluZworLy8gdGFnZ2VkIGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVycyBmb3IgbmV3IHBhZ2VzLiBSZWZlciBsaW5lcyAyOTctMzAwIGluCisvLyBTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzICA9IG1WaS0+Y2hhbm5lbHM7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgLyogRGVjb2RlIHZvcmJpcyBoZWFkZXJzIG9ubHkgb25jZSAqLworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSAmJiAoIW1JbmZvVW5wYWNrZWQgfHwgIW1Cb29rc1VucGFja2VkKSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGY1NzUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4ZjVkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDBkYmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MmNhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDkzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmIDAKKyAgICAgICAgLy8gc2FtcGxlIEJULjIwMjAgc3RhdGljIGluZm8KKyAgICAgICAgbUhkclN0YXRpY0luZm8gPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigpOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWFzdGVyaW5nID0geworICAgICAgICAgICAgLnJlZCAgID0geyAueCA9IDAuNzA4LCAgLnkgPSAwLjI5MiB9LAorICAgICAgICAgICAgLmdyZWVuID0geyAueCA9IDAuMTcwLCAgLnkgPSAwLjc5NyB9LAorICAgICAgICAgICAgLmJsdWUgID0geyAueCA9IDAuMTMxLCAgLnkgPSAwLjA0NiB9LAorICAgICAgICAgICAgLndoaXRlID0geyAueCA9IDAuMzEyNywgLnkgPSAwLjMyOTAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IDAuMSwKKyAgICAgICAgfTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heENsbCA9IDEwMDA7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhGYWxsID0gMTIwOworCisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhMdW1pbmFuY2UgPSAwOyAvLyBkaXNhYmxlIHN0YXRpYyBpbmZvCisKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCwgQzJDb2xvclh5U3RydWN0PigpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkclN0YXRpY0luZm8pCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkclN0YXRpY0luZm8sIG1hc3RlcmluZy5yZWQueCkuaW5SYW5nZSgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyU3RhdGljSW5mb1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAyMDQ4dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyMDQ4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgNjMpIC8gNjQpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgNjMpIC8gNjQpICogMzA3Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisjaWZkZWYgVlA5CisjaWYgMAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4gbUhkclN0YXRpY0luZm87CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworI2VuZGlmCit9OworCitDMlNvZnRWcHhEZWM6OkNvbnZlcnRlclRocmVhZDo6Q29udmVydGVyVGhyZWFkKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+PiAmcXVldWUpCisgICAgOiBUaHJlYWQoZmFsc2UpLCBtUXVldWUocXVldWUpIHt9CisKK2Jvb2wgQzJTb2Z0VnB4RGVjOjpDb252ZXJ0ZXJUaHJlYWQ6OnRocmVhZExvb3AoKSB7CisgICAgTXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+OjpMb2NrZWQgcXVldWUoKm1RdWV1ZSk7CisgICAgaWYgKHF1ZXVlLT5lbnRyaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CisgICAgICAgIGlmIChxdWV1ZS0+ZW50cmllcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29udmVydCA9IHF1ZXVlLT5lbnRyaWVzLmZyb250KCk7CisgICAgcXVldWUtPmVudHJpZXMucG9wX2Zyb250KCk7CisgICAgaWYgKCFxdWV1ZS0+ZW50cmllcy5lbXB0eSgpKSB7CisgICAgICAgIHF1ZXVlLT5jb25kLnNpZ25hbCgpOworICAgIH0KKyAgICBxdWV1ZS51bmxvY2soKTsKKworICAgIGNvbnZlcnQoKTsKKworICAgIHF1ZXVlLmxvY2soKTsKKyAgICBpZiAoLS1xdWV1ZS0+bnVtUGVuZGluZyA9PSAwdSkgeworICAgICAgICBxdWV1ZS0+Y29uZC5icm9hZGNhc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0MyU29mdFZweERlYzo6QzJTb2Z0VnB4RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKSwKKyAgICAgIG1Db3JlQ291bnQoMSksCisgICAgICBtUXVldWUobmV3IE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPikgeworfQorCitDMlNvZnRWcHhEZWM6On5DMlNvZnRWcHhEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKQorICAgIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIC8vIEZsdXNoIGRlY29kZXIgYnkgcGFzc2luZyBudWxscHRyIGRhdGEgcHRyIGFuZCAwIHNpemUuCisgICAgICAgIC8vIElkZWFsbHksIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggb24yIGRlY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAodnB4X2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBWUDkKKyAgICBtTW9kZSA9IE1PREVfVlA5OworI2Vsc2UKKyAgICBtTW9kZSA9IE1PREVfVlA4OworI2VuZGlmCisKKyAgICBtV2lkdGggPSAzMjA7CisgICAgbUhlaWdodCA9IDI0MDsKKyAgICBtRnJhbWVQYXJhbGxlbE1vZGUgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIH0KKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBBTE9HRSgibUNvZGVjQ3R4IGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IG1Db3JlQ291bnQgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICAgIHZweF9jb2RlY19mbGFnc190IGZsYWdzOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZih2cHhfY29kZWNfZmxhZ3NfdCkpOworICAgIGlmIChtRnJhbWVQYXJhbGxlbE1vZGUpIGZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfRlJBTUVfVEhSRUFESU5HOworCisgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CisgICAgaWYgKCh2cHhfZXJyID0gdnB4X2NvZGVjX2RlY19pbml0KAorICAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIG1Nb2RlID09IE1PREVfVlA4ID8gJnZweF9jb2RlY192cDhfZHhfYWxnbyA6ICZ2cHhfY29kZWNfdnA5X2R4X2FsZ28sCisgICAgICAgICAgICAgICAgICZjZmcsIGZsYWdzKSkpIHsKKyAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgdnB4X2Vycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvcmVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBzcDxDb252ZXJ0ZXJUaHJlYWQ+IHRocmVhZChuZXcgQ29udmVydGVyVGhyZWFkKG1RdWV1ZSkpOworICAgICAgICAgICAgbUNvbnZlcnRlclRocmVhZHMucHVzaF9iYWNrKHRocmVhZCk7CisgICAgICAgICAgICBpZiAodGhyZWFkLT5ydW4oKCJ2cDljb252ICMicyArIHN0ZDo6dG9fc3RyaW5nKGkpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfQVVESU8pICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdFZweERlYzo6ZGVzdHJveURlY29kZXIoKSB7CisgICAgaWYgIChtQ29kZWNDdHgpIHsKKyAgICAgICAgdnB4X2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCBydW5uaW5nID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IHNwPENvbnZlcnRlclRocmVhZD4gJnRocmVhZCA6IG1Db252ZXJ0ZXJUaHJlYWRzKSB7CisgICAgICAgIHRocmVhZC0+cmVxdWVzdEV4aXQoKTsKKyAgICB9CisgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgbVF1ZXVlLT5sb2NrKCktPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBzcDxDb252ZXJ0ZXJUaHJlYWQ+ICZ0aHJlYWQgOiBtQ29udmVydGVyVGhyZWFkcykgeworICAgICAgICAgICAgaWYgKHRocmVhZC0+aXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQ29udmVydGVyVGhyZWFkcy5jbGVhcigpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4LCBpbnRmID0gdGhpcy0+bUludGZdKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdFZweERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9MCk7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgLy8gU29mdHdhcmUgVlA5IERlY29kZXIgZG9lcyBub3QgbmVlZCB0aGUgQ29kZWMgU3BlY2lmaWMgRGF0YSAoQ1NEKQorICAgIC8vIChzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLykuIElnbm9yZSBpdCBpZgorICAgIC8vIGl0IHdhcyBwYXNzZWQuCisgICAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgICAgIC8vIElnbm9yZSBDU0QgYnVmZmVyIGZvciBWUDkuCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1ZQOSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRvbGVyYXRlIHRoZSBDU0QgYnVmZmVyIGZvciBWUDguIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisgICAgICAgICAgICAvLyBmb3IgYi8yODY4OTUzNi4gY29udGludWUKKyAgICAgICAgICAgIEFMT0dXKCJXQVJOSU5HOiBHb3QgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBDb250aW51ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpOworCisgICAgaWYgKGluU2l6ZSkgeworICAgICAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIGJpdHN0cmVhbSwgaW5TaXplLCAmZnJhbWVJbmRleCwgMCk7CisgICAgICAgIGlmIChlcnIgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4gZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAorICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0VnB4RGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorICAgIENIRUNLKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsIChpbnQpKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKworICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBNdXRleGVkPENvbnZlcnNpb25RdWV1ZT46OkxvY2tlZCBxdWV1ZSgqbVF1ZXVlKTsKKyAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga0hlaWdodCA9IDY0OworICAgICAgICAgICAgZm9yICg7IGkgPCBtSGVpZ2h0OyBpICs9IGtIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+ZW50cmllcy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBbZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBtV2lkdGgsIGhlaWdodCA9IHN0ZDo6bWluKG1IZWlnaHQgLSBpLCBrSGVpZ2h0KV0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgLyAyICoga0hlaWdodDsKKyAgICAgICAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGUgLyAyICogKGtIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZSAqIGtIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUSgwdSwgcXVldWUtPm51bVBlbmRpbmcpOworICAgICAgICAgICAgcXVldWUtPm51bVBlbmRpbmcgPSBxdWV1ZS0+ZW50cmllcy5zaXplKCk7CisgICAgICAgICAgICB3aGlsZSAocXVldWUtPm51bVBlbmRpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPmNvbmQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCisgICAgICAgICAgICAgICAgZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgZmluaXNoV29yaygqKGludDY0X3QgKilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJgorICAgICAgICAgICAgd29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdFZweEZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcHhGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZweERlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZweEZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZweEZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWJjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0VnB4RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFZweERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgTU9ERV9WUDgsCisgICAgICAgIE1PREVfVlA5LAorICAgIH0gbU1vZGU7CisKKyAgICBzdHJ1Y3QgQ29udmVyc2lvblF1ZXVlOworCisgICAgY2xhc3MgQ29udmVydGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDb252ZXJ0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPj4gJnF1ZXVlKTsKKyAgICAgICAgfkNvbnZlcnRlclRocmVhZCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICAgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+PiBtUXVldWU7CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdnB4X2NvZGVjX2N0eF90ICptQ29kZWNDdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIGludCBtQ29yZUNvdW50OworICAgIHN0cnVjdCBDb252ZXJzaW9uUXVldWUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBlbnRyaWVzOworICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmd7MHV9OworICAgIH07CisgICAgc3RkOjpzaGFyZWRfcHRyPE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPj4gbVF1ZXVlOworICAgIHN0ZDo6dmVjdG9yPHNwPENvbnZlcnRlclRocmVhZD4+IG1Db252ZXJ0ZXJUaHJlYWRzOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcHhEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFiNzBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKQEAgLTAsMCArMSw2NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgIDIxNDc0ODM2NDcKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiAwCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorI2VuZGlmCisKK0MyU29mdFZweEVuYzo6QzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0NvbnRleHQobnVsbHB0ciksCisgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKG51bGxwdHIpLAorICAgICAgbUNvZGVjSW50ZXJmYWNlKG51bGxwdHIpLAorICAgICAgbVN0cmlkZUFsaWduKDIpLAorICAgICAgbUNvbG9yRm9ybWF0KFZQWF9JTUdfRk1UX0k0MjApLAorICAgICAgbUJpdHJhdGVDb250cm9sTW9kZShWUFhfVkJSKSwKKyAgICAgIG1FcnJvclJlc2lsaWVuY2UoZmFsc2UpLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOworfQorCitDMlNvZnRWcHhFbmM6On5DMlNvZnRWcHhFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQ29kZWNDb250ZXh0KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0NvbnRleHQpOworICAgICAgICBkZWxldGUgbUNvZGVjQ29udGV4dDsKKyAgICAgICAgbUNvZGVjQ29udGV4dCA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbmZpZ3VyYXRpb247CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBudWxscHRyOworICAgIH0KKworICAgIC8vIHRoaXMgb25lIGlzIG5vdCBhbGxvY2F0ZWQgYnkgdXMKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uU3RvcCgpIHsKKyAgICBvblJlbGVhc2UoKTsKKyAgICBtTGFzdFRpbWVzdGFtcCA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm47CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlTW9kZSA9IG1JbnRmLT5nZXRCaXRyYXRlTW9kZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSBtSW50Zi0+Z2V0VGVtcG9yYWxMYXllcnNfbCgpLT5tLmxheWVyQ291bnQ7CisgICAgfQorCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX0NCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX1ZCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKyAgICBpZiAoIW1Db2RlY0ludGVyZmFjZSkgZ290byBDbGVhblVwOworCisgICAgQUxPR0QoIlZQeDogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBuZXcgdnB4X2NvZGVjX2VuY19jZmdfdDsKKyAgICBpZiAoIW1Db2RlY0NvbmZpZ3VyYXRpb24pIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+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+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2NkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCituYW1lc3BhY2UgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmVuY29kZXIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU8gPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworI2VuZGlmCisKK30gLy8gbmFtZXBzYWNlCisKK2NsYXNzIEMyU29mdFZweEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU8pIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMHUsIDAsIDAsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJMYXllckNvdW50KS5pblJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJpdHJhdGVSYXRpb3MpLmluUmFuZ2UoMC4sIDEuKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTGF5ZXJpbmdTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+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+PiB7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBDMkVOVU1fSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ0MTdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKQEAgLTAsMCArMSwxNjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlBBUkFNX0hfCisjZGVmaW5lIEMyUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8vLyBcZGVmZ3JvdXAgaW50ZXJuYWwgSW50ZXJuYWwgaGVscGVycy4KKworLyohCisgKiBcZmlsZQorICogUEFSQU1FVEVSUzogU0VUVElOR3MsIFRVTklOR3MsIGFuZCBJTkZPcworICogPT09CisgKgorICogVGhlc2UgcmVwcmVzZW50IG1pc2NlbGxhbmVvdXMgY29udHJvbCBhbmQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYW5kIGFyZSBsaWtlbHkgY29waWVkIGludG8KKyAqIGtlcm5lbCBzcGFjZS4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgQy1saWtlIHN0cnVjdHVyZXMgZGVzaWduZWQgdG8gY2FycnkganVzdCBhIHNtYWxsIGFtb3VudCBvZgorICogaW5mb3JtYXRpb24uIFdlIGFyZSB1c2luZyBDKysgdG8gYmUgYWJsZSB0byBhZGQgY29uc3RydWN0b3JzLCBhcyB3ZWxsIGFzIG5vbi12aXJ0dWFsIGFuZCBjbGFzcworICogbWV0aG9kcy4KKyAqCisgKiA9PVNwZWNpZmljYXRpb24gZGV0YWlsczoKKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiAgIC0gbXVzdCBiZSBQT0Qgc3RydWN0LCBlLmcuIG5vIHZ0YWJsZSAobm8gdmlydHVhbCBkZXN0cnVjdG9yKQorICogICAtIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGluIDY0LWJpdCBhbmQgMzItYml0IG1vZGUgKG5vIHNpemVfdCkKKyAqICAgLSBhcyBzdWNoLCBubyBwb2ludGVyIG1lbWJlcnMKKyAqICAgLSBzb21lIGNvbW1vbiBtZW1iZXIgZmllbGQgbmFtZXMgYXJlIHJlc2VydmVkIGFzIHRoZXkgYXJlIGRlZmluZWQgYXMgbWV0aG9kcyBmb3IgYWxsCisgKiAgICAgcGFyYW1ldGVyczoKKyAqICAgICB0aGV5IGFyZTogc2l6ZSwgdHlwZSwga2luZCwgaW5kZXggYW5kIHN0cmVhbQorICoKKyAqIEJlaGF2aW9yOgorICogLSBQYXJhbXMgY2FuIGJlIGdsb2JhbCAobm90IHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0KSwgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQsCisgKiAgIG9yIHJlbGF0ZWQgdG8gYW4gaW5wdXQvb3V0cHV0IHN0cmVhbS4KKyAqIC0gQWxsIHBhcmFtcyBhcmUgcXVlcmllZC9zZXQgdXNpbmcgYSB1bmlxdWUgcGFyYW0gaW5kZXgsIHdoaWNoIGluY29ycG9yYXRlcyBhIHBvdGVudGlhbCBzdHJlYW0KKyAqICAgaW5kZXggYW5kL29yIHBvcnQuCisgKiAtIFF1ZXJ5aW5nIChzdXBwb3J0ZWQpIHBhcmFtcyBNVVNUIG5ldmVyIGZhaWwuCisgKiAtIEFsbCBwYXJhbXMgTVVTVCBoYXZlIGRlZmF1bHQgdmFsdWVzLgorICogLSBJZiBzb21lIGZpZWxkcyBoYXZlICJ1bnN1cHBvcnRlZCIgb3IgImludmFsaWQiIHZhbHVlcyBkdXJpbmcgc2V0dGluZywgdGhpcyBTSE9VTEQgYmUKKyAqICAgY29tbXVuaWNhdGVkIHRvIHRoZSBhcHAuCisgKiAgIGEpIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQuICBXaGVuIHNldHRpbmcgcGFyYW1ldGVycywgaW4gZ2VuZXJhbCwgY29tcG9uZW50IHNob3VsZCBkbworICogICAgICJiZXN0IGVmZm9ydCIgdG8gYXBwbHkgYWxsIHNldHRpbmdzLiBJdCBzaG91bGQgY2hhbmdlICJpbnZhbGlkL3Vuc3VwcG9ydGVkIiB2YWx1ZXMgdG8gdGhlCisgKiAgICAgbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWVzLgorICogICAtIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB2YWx1ZXMgaW4gdHVuZSgpLworICogICAgIGNvbmZpZ3VyZSgpLgorICogICBiKSBJZiBmYWxsaW5nIGJhY2sgdG8gYSBzdXBwb3J0ZWQgdmFsdWUgaXMgYWJzb2x1dGVseSBpbXBvc3NpYmxlLCB0aGUgY29tcG9uZW50IFNIQUxMIHJldHVybgorICogICAgIGFuIGVycm9yIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZywgYnV0IHNob3VsZCBjb250aW51ZSB0byBhcHBseSBvdGhlciBzZXR0aW5ncy4KKyAqICAgICBUT0RPOiB0aGlzIGN1cnJlbnRseSBtYXkgcmVzdWx0IGluIHVuaW50ZW5kZWQgcmVzdWx0cy4KKyAqCisgKiAqKk5PVEU6KiogdW5saWtlIE9NWCwgcGFyYW1zIGFyZSBub3QgdmVyc2lvbmVkLiBJbnN0ZWFkLCBhIG5ldyBzdHJ1Y3Qgd2l0aCBuZXcgcGFyYW0gaW5kZXgKKyAqIFNIQUxMIGJlIGFkZGVkIGFzIG5ldyB2ZXJzaW9ucyBhcmUgcmVxdWlyZWQuCisgKgorICogVGhlIHByb3BlciBzdWJ0eXBlIChTZXR0aW5nLCBJbmZvIG9yIFBhcmFtKSBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY2xhc3MgdHlwZS4gRGVmaW5lIHN0cnVjdHMKKyAqIHRvIGRlZmluZSBtdWx0aXBsZSBzdWJ0eXBlZCB2ZXJzaW9ucyBvZiByZWxhdGVkIHBhcmFtZXRlcnMuCisgKgorICogPT1JbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICoKKyAqIC0gVXNlIG1hY3JvcyB0byBkZWZpbmUgcGFyYW1ldGVycworICogLSBBbGwgcGFyYW1ldGVycyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgIC0gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIGluIHNvdXJjZSAoZS5nLiB3aWxsIG5vdCBiZSB1c2VkCisgKiAgICAgd2hlbiBidWlsZGluZyBhIHBhcmFtZXRlciBieSB0aGUgZnJhbWV3b3JrIGZyb20ga2V5L3ZhbHVlIHBhaXJzLikKKyAqLworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKworLyoqCisgKiBQYXJhbWV0ZXIgYmFzZSBjbGFzcy4KKyAqLworc3RydWN0IEMyUGFyYW0geworICAgIC8vIHBhcmFtIGluZGV4IGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmc6CisgICAgLy8KKyAgICAvLyAtIGtpbmQgKHNldHRpbmcsIHR1bmluZywgaW5mbywgc3RydWN0KQorICAgIC8vIC0gc2NvcGUKKyAgICAvLyAgIC0gZGlyZWN0aW9uIChnbG9iYWwsIGlucHV0LCBvdXRwdXQpCisgICAgLy8gICAtIHN0cmVhbSBmbGFnCisgICAgLy8gICAtIHN0cmVhbSBJRCAodXN1YWxseSAwKQorICAgIC8vIC0gYW5kIHRoZSBwYXJhbWV0ZXIncyB0eXBlIChjb3JlIGluZGV4KQorICAgIC8vICAgLSBmbGV4aWJsZSBwYXJhbWV0ZXIgZmxhZworICAgIC8vICAgLSB2ZW5kb3IgZXh0ZW5zaW9uIGZsYWcKKyAgICAvLyAgIC0gdHlwZSBpbmRleCAodGhpcyBpbmNsdWRlcyB0aGUgdmVuZG9yIGV4dGVuc2lvbiBmbGFnKQorICAgIC8vCisgICAgLy8gbGF5b3V0OgorICAgIC8vCisgICAgLy8gICAgICAgIGtpbmQgOiA8LS0tLS0tLSBzY29wZSAtLS0tLS0tPiA6IDwtLS0tLSBjb3JlIGluZGV4IC0tLS0tPgorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS18LS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICAgICAgfCBraW5kIHwgZGlyIHwgLSB8c3RyZWFtfHN0cmVhbUlEfGZsZXh8dmVuZG9yfCAgdHlwZSBpbmRleCAgfAorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICBiaXQ6IDMxLi4zMCAyOS4yOCAgICAgICAyNSAgIDI0IC4uIDE3ICAxNiAgICAxNSAgIDE0ICAgIC4uICAgICAwCisgICAgLy8KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDMlBhcmFtIGtpbmRzLCB1c2FibGUgYXMgYml0bWFwcy4KKyAgICAgKi8KKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9ORSAgICA9IDAsCisgICAgICAgIFNUUlVDVCAgPSAoMSA8PCAwKSwKKyAgICAgICAgSU5GTyAgICA9ICgxIDw8IDEpLAorICAgICAgICBTRVRUSU5HID0gKDEgPDwgMiksCisgICAgICAgIFRVTklORyAgPSAoMSA8PCAzKSB8IFNFVFRJTkcsIC8vIHR1bmluZ3MgYXJlIHNldHRpbmdzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBzcGVjaWZpZXMgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIHR5cGUgb2YgYSBwYXJhbWV0ZXIgYXMKKyAgICAgKiBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyIHR5cGVzIGFyZSBkaXZpZGVkIGludG8gdHdvIGdyb3VwczogcGxhdGZvcm0gdHlwZXMgYW5kIHZlbmRvciB0eXBlcy4KKyAgICAgKgorICAgICAqIFBsYXRmb3JtIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgYXJlIGNvbW1vbiBmb3IgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIFZlbmRvciB0eXBlcyBhcmUgZGVmaW5lZCBieSBlYWNoIHZlbmRvcnMsIHNvIHRoZXkgbWF5IGRpZmZlciBiZXR3ZWVuIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHZlbmRvciB0eXBlcyBiZSB0aGUgc2FtZSBmb3IgYWxsIGltcGxlbWVudGF0aW9ucyBieSBhIHNwZWNpZmljCisgICAgICogdmVuZG9yLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdHlwZV9pbmRleF90OworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCA9IDB4MDAwMDgwMDAsIC8vLzwgdmVuZG9yIGluZGljZXMgU0hBTEwgc3RhcnQgYWZ0ZXIgdGhpcworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb3JlIGluZGV4IGlzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIGZvciBhIHBhcmFtZXRlci4gSXQgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUKKyAgICAgKiBsYXlvdXQgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgY29tcG9uZW50IG9yIHBhcmFtZXRlciBraW5kL3Njb3BlLgorICAgICAqCisgICAgICogSXQgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgZGlzdGluZ3Vpc2ggZ2xvYmFsIHBhcmFtZXRlcnMsIGFuZCBhbHNvIHBhcmFtZXRlcnMgb24gYSBnaXZlbgorICAgICAqIHBvcnQgb3Igc3RyZWFtLiBUaGV5IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgc2V0IG9mIGdsb2JhbCBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgICAgKiBzZXQgb2YgcGFyYW1ldGVycyBvbiBlYWNoIHBvcnQgb3IgZWFjaCBzdHJlYW0sIGJ1dCB0aGUgc2FtZSBjb3JlIGluZGV4IGNhbiBiZSB1c2VkIGZvcgorICAgICAqIHBhcmFtZXRlcnMgb24gZGlmZmVyZW50IHN0cmVhbXMgb3IgcG9ydHMsIGFzIHdlbGwgYXMgZm9yIGdsb2JhbCBwYXJhbWV0ZXJzIGFuZCBwb3J0L3N0cmVhbQorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGxheW91dC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZSBsYXlvdXQgZm9yIGFsbCBwYXJhbWV0ZXJzIHdpdGggdGhlIHNhbWUgY29yZSBpbmRleCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMgbXVzdAorICAgICAqIGJlIGlkZW50aWNhbC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgICAgIElTX0ZMRVhfRkxBRyAgICA9IDB4MDAwMTAwMDAsCisgICAgICAgICAgICBJU19SRVFVRVNUX0ZMQUcgPSAweDAwMDIwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRjAwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMjAsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+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+bVJlc3VsdE92ZXJyaWRlID0gZXJyOworfQorCitTaW1wbGVNZXRob2RTdGF0ZTo6U2ltcGxlTWV0aG9kU3RhdGUoKQorICAgIDogbU1vZGUoRVhFQ1VURSksIG1PdmVycmlkZShmYWxzZSksIG1SZXN1bHRPdmVycmlkZShDMl9PSykge30KKworU2ltcGxlTWV0aG9kU3RhdGU6Ok1vZGUgU2ltcGxlTWV0aG9kU3RhdGU6OmdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nb2RlOworfQorCitib29sIFNpbXBsZU1ldGhvZFN0YXRlOjpvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKCFtT3ZlcnJpZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcmVzdWx0ID0gbVJlc3VsdE92ZXJyaWRlOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX01FVEhPRF9TVEFURV9IXworI2RlZmluZSBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RhdGUgZm9yIGEgc2ltcGxlIG1ldGhvZCB3aGljaCByZXR1cm5zIGMyX3N0YXR1c190IGFuZCB0YWtlcyBubyBwYXJhbWV0ZXJzLgorICovCitjbGFzcyBTaW1wbGVNZXRob2RTdGF0ZSB7CitwdWJsaWM6CisgICAgZW51bSBNb2RlIHsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICBFWEVDVVRFLAorICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZworICAgICAgICBOT19PUCwKKyAgICAgICAgLy8gSGFuZzsgbmV2ZXIgcmV0dXJuCisgICAgICAgIEhBTkcsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluamVjdGVyIGNsYXNzIHRoYXQgbW9kaWZpZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZyB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZhaWwgdGhlIG9wZXJhdGlvbiB3aXRoIGdpdmVuIHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJvciBjb2RlIHRvIHJlcGxhY2UgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGV4ZWN1dGUgICB3aGV0aGVyIHRoZSB3cmFwcGVyIHNob3VsZCBleGVjdXRlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmFpbChjMl9zdGF0dXNfdCBlcnIsIGJvb2wgZXhlY3V0ZSA9IGZhbHNlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNpbXBsZU1ldGhvZFN0YXRlICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBleGVjdXRpb24gbW9kZS4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBpZiBjb25maWd1cmVkIHNvLgorICAgICAqLworICAgIGJvb2wgb3ZlcnJpZGVSZXN1bHQoYzJfc3RhdHVzX3QgKnJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1PdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBtUmVzdWx0T3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU0lNUExFX01FVEhPRF9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlMzZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisKKyAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDbGllbnRCbG9ja0hlbHBlci5jcHAiLAorICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgXSwKK30KKworCisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgIkNvbXBvbmVudFN0b3JlLmNwcCIsCisgICAgICAgICJDb25maWd1cmFibGUuY3BwIiwKKyAgICAgICAgIklucHV0QnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIGNsaWVudAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9DbGllbnRCbG9ja0hlbHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ2xpZW50QmxvY2tIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzkwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ2xpZW50QmxvY2tIZWxwZXIuY3BwCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1ibG9ja19oZWxwZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ2xpZW50QmxvY2tIZWxwZXIuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMl8wOjp1dGlsczo6QjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIENyZWF0ZSBhIEdyYXBoaWNCdWZmZXIgb2JqZWN0IGZyb20gYSBncmFwaGljIGJsb2NrLgorc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgdWludDY0X3QgdXNhZ2U7CisgICAgdWludDMyX3Qgc3RyaWRlOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICAgICAgYmxvY2suaGFuZGxlKCksICZ3aWR0aCwgJmhlaWdodCwgJmZvcm1hdCwgJnVzYWdlLAorICAgICAgICAgICAgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmJxU2xvdCkpOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9CisgICAgICAgICAgICBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGJsb2NrLmhhbmRsZSgpKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0KKyAgICAgICAgICAgIG5ldyBHcmFwaGljQnVmZmVyKGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB1c2FnZSwgc3RyaWRlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICByZXR1cm4gZ3JhcGhpY0J1ZmZlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soQzJGcmFtZURhdGEmIGZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlciA6IGZyYW1lRGF0YS5idWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2sgOgorICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzKGJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtMaXN0KSB7CisgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgd29ya2xldCA6IHdvcmstPndvcmtsZXRzKSB7CisgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgIGZvckVhY2hCbG9jayh3b3JrbGV0LT5vdXRwdXQsIHByb2Nlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgICAgICBpZ2JwLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oKTsKKyAgICByZXR1cm4gaGdicCA/IGhnYnAgOgorICAgICAgICAgICAgbmV3IEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcihpZ2JwKTsKK30KKworc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmICghaWdicCkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gbnVsbCBwcm9kdWNlci4iOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jayk7CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKworICAgIExPRyhWRVJCT1NFKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hpbmcgYnVmZmVyOiIKKyAgICAgICAgICAgIDw8ICIgYmxvY2sgZGltZW5zaW9uICIgPDwgYmxvY2sud2lkdGgoKSA8PCAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYmxvY2suaGVpZ2h0KCkKKyAgICAgICAgICAgIDw8ICIsIGdyYXBoaWNCdWZmZXIgZGltZW5zaW9uICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSA8PCAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBncmFwaGljQnVmZmVyLT5nZXRIZWlnaHQoKQorICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykKKyAgICAgICAgICAgIDw8ICIsIGZvcm1hdCAweCIgPDwgc3RkOjpzZXR3KDgpIDw8IGdyYXBoaWNCdWZmZXItPmdldFBpeGVsRm9ybWF0KCkKKyAgICAgICAgICAgIDw8ICIsIHVzYWdlIDB4IiA8PCBzdGQ6OnNldHcoMTYpIDw8IGdyYXBoaWNCdWZmZXItPmdldFVzYWdlKCkKKyAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpCisgICAgICAgICAgICA8PCAiLCBzdHJpZGUgIiA8PCBncmFwaGljQnVmZmVyLT5nZXRTdHJpZGUoKQorICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IGlnYnAtPmF0dGFjaEJ1ZmZlcihicVNsb3QsIGdyYXBoaWNCdWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMgPSAiIDw8IHJlc3VsdCA8PCAiLiI7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIExPRyhWRVJCT1NFKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgcmV0dXJuZWQgc2xvdCAjIgorICAgICAgICAgICAgICAgICA8PCAqYnFTbG90IDw8ICIuIjsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgZ2V0QnVmZmVyUXVldWVBc3NpZ25tZW50KGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCkgeworICAgIHJldHVybiBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spLAorICAgICAgICAgICAgZ2VuZXJhdGlvbiwgYnFJZCwgYnFTbG90KTsKK30KK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworY2xhc3MgT3V0cHV0QnVmZmVyUXVldWU6OkltcGwgeworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1JZ2JwOworICAgIHVpbnQzMl90IG1HZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IG1CcUlkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IG1Pd25lcjsKKyAgICAvLyBUbyBtaWdyYXRlIGV4aXN0aW5nIGJ1ZmZlcnMKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOyAvLyBmaW5kIGEgYmV0dGVyIHdheQorICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4KKyAgICAgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOworCitwdWJsaWM6CisgICAgSW1wbCgpOiBtR2VuZXJhdGlvbigwKSwgbUJxSWQoMCkge30KKworICAgIGJvb2wgY29uZmlndXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCkgeworICAgICAgICBzaXplX3QgdHJ5TnVtID0gMDsKKyAgICAgICAgc2l6ZV90IHN1Y2Nlc3MgPSAwOworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXJzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107CisgICAgICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4KKyAgICAgICAgICAgICAgICBwb29sRGF0YXNbQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JZ2JwID0gaWdicDsKKyAgICAgICAgICAgIG1HZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG1CcUlkID0gYnFJZDsKKyAgICAgICAgICAgIG1Pd25lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJxSWQgPT0gMCB8fCAhbUJ1ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0gbVBvb2xEYXRhc1tpXS5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKCFkYXRhIHx8CisgICAgICAgICAgICAgICAgICAgICFfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKGRhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3RyeU51bTsKKyAgICAgICAgICAgICAgICBpbnQgYnFTbG90OworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmYnFTbG90LCBtQnVmZmVyc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBhdHRhY2ggPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpFbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIG1Pd25lciwgZ2V0SGdicChtSWdicCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7CisgICAgICAgICAgICAgICAgaWYgKCFhdHRhY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgaWdicC0+Y2FuY2VsQnVmZmVyKGJxU2xvdCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlcnNbYnFTbG90XSA9IG1CdWZmZXJzW2ldOworICAgICAgICAgICAgICAgIHBvb2xEYXRhc1ticVNsb3RdID0gZGF0YTsKKyAgICAgICAgICAgICAgICArK3N1Y2Nlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0gPSBidWZmZXJzW2ldOworICAgICAgICAgICAgICAgIG1Qb29sRGF0YXNbaV0gPSBwb29sRGF0YXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlbW90ZSBncmFwaGljIGJ1ZmZlciBtaWdyYXRpb24gJXp1LyV6dSIsIHN1Y2Nlc3MsIHRyeU51bSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVnaXN0ZXJCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKKworICAgICAgICBpZiAoIW1JZ2JwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBvbGRHZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBvbGRJZDsKKyAgICAgICAgaW50MzJfdCBvbGRTbG90OworICAgICAgICAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IGJ1ZmZlcnF1ZXVlLWJhc2VkLCBkbyBub3RoaW5nLgorICAgICAgICBpZiAoIV9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgICAgIGRhdGEsICZvbGRHZW5lcmF0aW9uLCAmb2xkSWQsICZvbGRTbG90KSB8fCAob2xkSWQgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgYmxvY2sncyBicUlkIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIGJxSWQsIGp1c3QgaG9sZC4KKyAgICAgICAgaWYgKChvbGRJZCA9PSBtQnFJZCkgJiYgKG9sZEdlbmVyYXRpb24gPT0gbUdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGltcG9ydCB3aXRob3V0IGF0dGFjaGluZzoiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgb2xkSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBicVNsb3QgIiA8PCBvbGRTbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IG1HZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoZGF0YSwgbU93bmVyLCBnZXRIZ2JwKG1JZ2JwKSk7CisgICAgICAgICAgICBtUG9vbERhdGFzW29sZFNsb3RdID0gZGF0YTsKKyAgICAgICAgICAgIG1CdWZmZXJzW29sZFNsb3RdID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jayk7CisgICAgICAgICAgICBtQnVmZmVyc1tvbGRTbG90XS0+c2V0R2VuZXJhdGlvbk51bWJlcihtR2VuZXJhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGQgPSAoaW50MzJfdCkgbUdlbmVyYXRpb24gLSAoaW50MzJfdCkgb2xkR2VuZXJhdGlvbjsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWNlaXZpbmcgc3RhbGUgYnVmZmVyOiBnZW5lcmF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IG1HZW5lcmF0aW9uIDw8ICIgLCBkaWZmICIgPDwgZCAgPDwgIiA6IHNsb3QgIgorICAgICAgICAgICAgICAgICAgICAgPDwgb2xkU2xvdDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXR1c190IG91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgY29uc3QgQm5HcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgQm5HcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3QgYnFJZDsKKyAgICAgICAgaW50MzJfdCBicVNsb3Q7CisgICAgICAgIGJvb2wgZGlzcGxheSA9IGRpc3BsYXlCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKTsKKyAgICAgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgICAgIGJxSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gQmxvY2sgbm90IGZyb20gYnVmZmVycXVldWUgLS0gaXQgbXVzdCBiZSBhdHRhY2hlZCBiZWZvcmUgcXVldWluZy4KKworICAgICAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dElnYnAgPSBtSWdicDsKKyAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG1NdXRleC51bmxvY2soKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgYmxvY2ssIG91dHB1dElnYnAsIG91dHB1dEdlbmVyYXRpb24sICZicVNsb3QpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAib3V0cHV0QnVmZmVyIC0tIGF0dGFjaGluZyBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAib3V0cHV0QnVmZmVyIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiBub24tYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgbU11dGV4LmxvY2soKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1JZ2JwOworICAgICAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtQnFJZDsKKyAgICAgICAgbU11dGV4LnVubG9jaygpOworCisgICAgICAgIGlmICghb3V0cHV0SWdicCkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvdXRwdXRCdWZmZXIgLS0gb3V0cHV0IHN1cmZhY2UgaXMgbnVsbC4iOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRpc3BsYXkpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAib3V0cHV0QnVmZmVyIC0tIGNhbm5vdCBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVycXVldWUtYmFzZWQgYmxvY2sgdG8gdGhlIGJ1ZmZlcnF1ZXVlLiI7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnFJZCAhPSBvdXRwdXRCcUlkIHx8IGdlbmVyYXRpb24gIT0gb3V0cHV0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgaW50MzJfdCBkaWZmID0gKGludDMyX3QpIG91dHB1dEdlbmVyYXRpb24gLSAoaW50MzJfdCkgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAib3V0cHV0QnVmZmVyIC0tIGJ1ZmZlcnMgZnJvbSBvbGQgZ2VuZXJhdGlvbiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgb3V0cHV0R2VuZXJhdGlvbiA8PCAiICwgZGlmZjogIiA8PCBkaWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAsIHNsb3Q6ICIgPDwgYnFTbG90OworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvdXRwdXRCdWZmZXIgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yID0gIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgSW1wbCAqZ2V0UHRyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICB+SW1wbCgpIHt9Cit9OworCitPdXRwdXRCdWZmZXJRdWV1ZTo6T3V0cHV0QnVmZmVyUXVldWUoKTogbUltcGwobmV3IEltcGwoKSkge30KKworT3V0cHV0QnVmZmVyUXVldWU6On5PdXRwdXRCdWZmZXJRdWV1ZSgpIHt9CisKK2Jvb2wgT3V0cHV0QnVmZmVyUXVldWU6OmNvbmZpZ3VyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmNvbmZpZ3VyZShpZ2JwLCBnZW5lcmF0aW9uLCBicUlkKTsKK30KKworc3RhdHVzX3QgT3V0cHV0QnVmZmVyUXVldWU6Om91dHB1dEJ1ZmZlcigKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgQm5HcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5vdXRwdXRCdWZmZXIoYmxvY2ssIGlucHV0LCBvdXRwdXQpOworICAgIH0KKyAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyUXVldWU6OmhvbGRCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QpIHsKKyAgICBpZiAoIW1JbXBsKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJk91dHB1dEJ1ZmZlclF1ZXVlOjpJbXBsOjpyZWdpc3RlckJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRQdHIoKSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmMjBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLy8gQ29tcG9uZW50TGlzdGVuZXIgd3JhcHBlcgorc3RydWN0IENvbXBvbmVudDo6TGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKworICAgIExpc3RlbmVyKGNvbnN0IHNwPENvbXBvbmVudD4mIGNvbXBvbmVudCkgOgorICAgICAgICBtQ29tcG9uZW50KGNvbXBvbmVudCksCisgICAgICAgIG1MaXN0ZW5lcihjb21wb25lbnQtPm1MaXN0ZW5lcikgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uRXJyb3IoU3RhdHVzOjpPSywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25FcnJvcl9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gYzJzZXR0aW5nUmVzdWx0CisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gc2V0dGluZ1Jlc3VsdHMoYzJzZXR0aW5nUmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmYzJyZXN1bHQgOgorICAgICAgICAgICAgICAgICAgICBjMnNldHRpbmdSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJnNldHRpbmdSZXN1bHRzW2l4KytdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnJlc2l6ZShpeCk7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25UcmlwcGVkKHNldHRpbmdSZXN1bHRzKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25UcmlwcGVkX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gLyogYzJjb21wb25lbnQgKi8sCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMndvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisKKyAgICAgICAgICAgIHNwPENvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0gbUNvbXBvbmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIHRydWUpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgY29ycnVwdGVkIHdvcmsgaXRlbXMuIjsKKyAgICAgICAgICAgICAgICBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKGMyd29ya0l0ZW1zLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uV29ya0RvbmUod29ya0J1bmRsZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKGMyd29ya0l0ZW1zLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHdwPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICB3cDxJQ29tcG9uZW50TGlzdGVuZXI+IG1MaXN0ZW5lcjsKK307CisKKy8vIENvbXBvbmVudDo6U2luaworc3RydWN0IENvbXBvbmVudDo6U2luayA6IHB1YmxpYyBJSW5wdXRTaW5rIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHNwPElDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnQtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworICAgIH0KKworICAgIFNpbmsoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCk7CisgICAgdmlydHVhbCB+U2luaygpIG92ZXJyaWRlOworCisgICAgLy8gUHJvY2Vzcy13aWRlIG1hcDogQ29tcG9uZW50OjpTaW5rIC0+IEMyQ29tcG9uZW50LgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNTaW5rMkNvbXBvbmVudE11dGV4OworICAgIHN0YXRpYyBzdGQ6Om1hcDxJSW5wdXRTaW5rKiwgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4+IHNTaW5rMkNvbXBvbmVudDsKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKK307CisKK3N0ZDo6bXV0ZXgKKyAgICAgICAgQ29tcG9uZW50OjpTaW5rOjpzU2luazJDb21wb25lbnRNdXRleHt9Oworc3RkOjptYXA8SUlucHV0U2luayosIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PgorICAgICAgICBDb21wb25lbnQ6OlNpbms6OnNTaW5rMkNvbXBvbmVudHt9OworCitDb21wb25lbnQ6OlNpbms6OlNpbmsoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCkKKyAgICAgICAgOiBtQ29tcG9uZW50e2NvbXBvbmVudH0sCisgICAgICAgICAgbUNvbmZpZ3VyYWJsZXtbJmNvbXBvbmVudF0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gcmV0MSA9IGNvbXBvbmVudC0+Z2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgIGlmICghcmV0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNpbms6OlNpbmsgLS0gY29tcG9uZW50J3MgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHJldDIgPQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+PihyZXQxKS0+CisgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgIGlmICghcmV0Mi5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNpbms6OlNpbmsgLS0gaW50ZXJmYWNlJ3MgdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHJldDIpOworICAgICAgICAgIH0oKX0geworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBzU2luazJDb21wb25lbnQuZW1wbGFjZSh0aGlzLCBjb21wb25lbnQtPm1Db21wb25lbnQpOworfQorCitDb21wb25lbnQ6OlNpbms6On5TaW5rKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBzU2luazJDb21wb25lbnQuZXJhc2UodGhpcyk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gQ29tcG9uZW50OjpTaW5rOjpmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIGF1dG8gaSA9IHNTaW5rMkNvbXBvbmVudC5maW5kKHNpbmsuZ2V0KCkpOworICAgIGlmIChpID09IHNTaW5rMkNvbXBvbmVudC5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGktPnNlY29uZC5sb2NrKCk7Cit9CisKKy8vIENvbXBvbmVudAorQ29tcG9uZW50OjpDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcikKKyAgICAgIDogbUNvbXBvbmVudHtjb21wb25lbnR9LAorICAgICAgICBtSW50ZXJmYWNle25ldyBDb21wb25lbnRJbnRlcmZhY2UoY29tcG9uZW50LT5pbnRmKCksIHN0b3JlLmdldCgpKX0sCisgICAgICAgIG1MaXN0ZW5lcntsaXN0ZW5lcn0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye2NsaWVudFBvb2xNYW5hZ2VyfSB7CisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIC8vIFRPRE86IFdlIGNvdWxkIGNhY2hlIHRoaXMgcGVyIGNvbXBvbmVudC9pbnRlcmZhY2UgdHlwZQorICAgIG1Jbml0ID0gbUludGVyZmFjZS0+c3RhdHVzKCk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudDo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudAorUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtzOworCisgICAgaWYgKCFvYmpjcHkoJmMyd29ya3MsIHdvcmtCdW5kbGUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMndvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICByZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnF1ZXVlX25iKCZjMndvcmtzKSk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1Db21wb25lbnQtPmZsdXNoX3NtKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICZjMmZsdXNoZWRXb3Jrcyk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyZmx1c2hlZFdvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIGZsdXNoZWRXb3JrQnVuZGxlOworICAgIFN0YXR1cyByZXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKTsKKyAgICBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUpOworICAgIGlmIChjMnJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAoIW9iamNweSgmZmx1c2hlZFdvcmtCdW5kbGUsIGMyZmx1c2hlZFdvcmtzLCAmbUJ1ZmZlclBvb2xTZW5kZXIpKSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihyZXMsIGZsdXNoZWRXb3JrQnVuZGxlKTsKKyAgICBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKGMyZmx1c2hlZFdvcmtzLCB0cnVlLCB0cnVlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRyYWluKGJvb2wgd2l0aEVvcykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPmRyYWluX25iKHdpdGhFb3MgPworICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyA6CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX05PX0VPUykpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4mIHN1cmZhY2UpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgR2V0Q29kZWMyQmxvY2tQb29sKGJsb2NrUG9vbElkLCBtQ29tcG9uZW50LCAmcG9vbCk7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPiBicVBvb2wgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPihwb29sKTsKKyAgICAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6T25SZW5kZXJDYWxsYmFjayBjYiA9CisgICAgICAgICAgICBbdGhpc10odWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2VjcykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhdGNoIHRoaXMKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkOworICAgICAgICAgICAgICAgIHJlbmRlcmVkLnJlc2l6ZSgxKTsKKyAgICAgICAgICAgICAgICByZW5kZXJlZFswXSA9IHsgcHJvZHVjZXIsIHNsb3QsIG5zZWNzIH07CisgICAgICAgICAgICAgICAgKHZvaWQpbUxpc3RlbmVyLT5vbkZyYW1lc1JlbmRlcmVkKHJlbmRlcmVkKS5pc09rKCk7CisgICAgICAgIH07CisgICAgICAgIGlmIChicVBvb2wpIHsKKyAgICAgICAgICAgIGJxUG9vbC0+c2V0UmVuZGVyQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgYnFQb29sLT5jb25maWd1cmVQcm9kdWNlcihzdXJmYWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBpbnB1dFN1cmZhY2UtPmNvbm5lY3QoCisgICAgICAgICAgICBhc0lucHV0U2luaygpLAorICAgICAgICAgICAgWyZzdGF0dXMsICZjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgKHZvaWQpcHJvZHVjZXI7CisgICAgKHZvaWQpc291cmNlOworICAgICh2b2lkKV9oaWRsX2NiOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQmxvY2tQb29sSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIEJsb2NrUG9vbEludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkKKyAgICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZnsKKyAgICAgICAgICAgICAgICAiQzJCbG9ja1Bvb2w6IiArCisgICAgICAgICAgICAgICAgICAgIChwb29sID8gc3RkOjp0b19zdHJpbmcocG9vbC0+Z2V0TG9jYWxJZCgpKSA6ICJudWxsIiksCisgICAgICAgICAgICAgICAgMH0sCisgICAgICAgICAgICBtUG9vbHtwb29sfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiBpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWluZGljZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWZpZWxkczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1Qb29sOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbDsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3Q+KGFsbG9jYXRvcklkKSwKKyAgICAgICAgICAgIG1Db21wb25lbnQsCisgICAgICAgICAgICAmYmxvY2tQb29sKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIGJsb2NrUG9vbCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChibG9ja1Bvb2wpIHsKKyAgICAgICAgbUJsb2NrUG9vbHNNdXRleC5sb2NrKCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmVtcGxhY2UoYmxvY2tQb29sLT5nZXRMb2NhbElkKCksIGJsb2NrUG9vbCk7CisgICAgICAgIG1CbG9ja1Bvb2xzTXV0ZXgudW5sb2NrKCk7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSwKKyAgICAgICAgICAgIGJsb2NrUG9vbCA/IGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpIDogMCwKKyAgICAgICAgICAgIG5ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJsb2NrUG9vbEludGY+KGJsb2NrUG9vbCkpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRlc3Ryb3lCbG9ja1Bvb2wodWludDY0X3QgYmxvY2tQb29sSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQmxvY2tQb29sc011dGV4KTsKKyAgICByZXR1cm4gbUJsb2NrUG9vbHMuZXJhc2UoYmxvY2tQb29sSWQpID09IDEgPworICAgICAgICAgICAgU3RhdHVzOjpPSyA6IFN0YXR1czo6Q09SUlVQVEVEOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnN0YXJ0KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnN0YXJ0KCkpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RvcCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZXNldCgpKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgICAgICBtQmxvY2tQb29scy5jbGVhcigpOworICAgIH0KKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+cmVsZWFzZSgpKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgICAgICBtQmxvY2tQb29scy5jbGVhcigpOworICAgIH0KKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IENvbXBvbmVudDo6Z2V0SW50ZXJmYWNlKCkgeworICAgIHJldHVybiBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPihtSW50ZXJmYWNlKTsKK30KKworUmV0dXJuPHNwPElJbnB1dFNpbms+PiBDb21wb25lbnQ6OmFzSW5wdXRTaW5rKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TaW5rTXV0ZXgpOworICAgIGlmICghbVNpbmspIHsKKyAgICAgICAgbVNpbmsgPSBuZXcgU2luayhzaGFyZWRfZnJvbV90aGlzKCkpOworICAgIH0KKyAgICByZXR1cm4ge21TaW5rfTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBDb21wb25lbnQ6OmZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspIHsKKyAgICByZXR1cm4gQ29tcG9uZW50OjpTaW5rOjpmaW5kTG9jYWxDb21wb25lbnQoc2luayk7Cit9CisKK3ZvaWQgQ29tcG9uZW50Ojppbml0TGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgc2VsZikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGMybGlzdGVuZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4oc2VsZik7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudC0+c2V0TGlzdGVuZXJfdmIoYzJsaXN0ZW5lciwgQzJfRE9OVF9CTE9DSyk7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBtSW5pdCA9IHJlczsKKyAgICB9Cit9CisKK0NvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICBtU3RvcmUtPnJlcG9ydENvbXBvbmVudERlYXRoKHRoaXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50SW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTUzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50SW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29tcG9uZW50SW50ZXJmYWNlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgQ29uZmlndXJhYmxlQzJJbnRmIGJhc2VkIG9uIEMyQ29tcG9uZW50SW50ZXJmYWNlCitzdHJ1Y3QgQ29tcEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBDb21wSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmKSA6CisgICAgICAgIENvbmZpZ3VyYWJsZUMySW50ZntpbnRmLT5nZXROYW1lKCksIGludGYtPmdldElkKCl9LAorICAgICAgICBtSW50ZntpbnRmfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIGluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBDb21wb25lbnRJbnRlcmZhY2UKK0NvbXBvbmVudEludGVyZmFjZTo6Q29tcG9uZW50SW50ZXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmLAorICAgICAgICBDb21wb25lbnRTdG9yZSogc3RvcmUpCisgICAgICA6IG1JbnRlcmZhY2V7aW50Zn0sCisgICAgICAgIG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6Om1ha2VfdW5pcXVlPENvbXBJbnRmPihpbnRmKSl9IHsKKyAgICBtSW5pdCA9IG1Db25maWd1cmFibGUtPmluaXQoc3RvcmUpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRJbnRlcmZhY2U6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50SW50ZXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMGExOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRTdG9yZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb247CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IFN0b3JlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIFN0b3JlSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRme3N0b3JlID8gc3RvcmUtPmdldE5hbWUoKSA6ICIiLCAwfSwKKyAgICAgICAgICAgIG1TdG9yZXtzdG9yZX0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgcGFyYW1zLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+Y29uZmlnX3NtKHBhcmFtcywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIGZpZWxkcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKGZpZWxkcyk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6Om1ha2VfdW5pcXVlPFN0b3JlSW50Zj4oc3RvcmUpKX0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0geworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RvcmUpOworCisgICAgLy8gUmV0cmlldmUgc3RydWN0IGRlc2NyaXB0b3JzCisgICAgbVBhcmFtUmVmbGVjdG9yID0gbVN0b3JlLT5nZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdCh0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcG9ydENvbXBvbmVudEJpcnRoKGNvbXBvbmVudC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+aW5pdExpc3RlbmVyKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzKSwgaW50ZXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBjMnRyYWl0cyA9CisgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisgICAgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+IHRyYWl0cyhjMnRyYWl0cy5zaXplKCkpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmMydHJhaXQgOiBjMnRyYWl0cykgeworICAgICAgICBpZiAoYzJ0cmFpdCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmdHJhaXRzW2l4XSwgKmMydHJhaXQpKSB7CisgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhaXRzLnJlc2l6ZShpeCk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdHJhaXRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Q09SUlVQVEVELCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPSBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBzb3VyY2UtPmdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgIHNvdXJjZSk7CisgICAgX2hpZGxfY2IoaW5wdXRTdXJmYWNlID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Tk9fTUVNT1JZLAorICAgICAgICAgICAgIGlucHV0U3VyZmFjZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDb21wb25lbnRTdG9yZTo6b25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIC8vIGludmFsaWRhdGUgdW5zdXBwb3J0ZWQgc3RydWN0IGRlc2NyaXB0b3JzIGlmIGEgbmV3IGludGVyZmFjZSBpcyBsb2FkZWQgYXMgaXQgbWF5IGhhdmUKKyAgICAvLyBleHBvc2VkIG5ldyBkZXNjcmlwdG9ycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICBpZiAoIW1Mb2FkZWRJbnRlcmZhY2VzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvYWRlZEludGVyZmFjZXMuZW1wbGFjZShpbnRmLT5nZXROYW1lKCkpOworICAgIH0KK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgeworICAgIGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKGluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gMDsgc3JjSXggPCBpbmRpY2VzLnNpemUoKTsgKytzcmNJeCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoaW5kaWNlc1tzcmNJeF0pLmNvcmVJbmRleCgpOworICAgICAgICBjb25zdCBhdXRvIGl0ZW0gPSBtU3RydWN0RGVzY3JpcHRvcnMuZmluZChjb3JlSW5kZXgpOworICAgICAgICBpZiAoaXRlbSA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgY2FjaGUsIGFuZCBub3Qga25vd24gdG8gYmUgdW5zdXBwb3J0ZWQsIHF1ZXJ5IGxvY2FsIHJlZmxlY3RvcgorICAgICAgICAgICAgaWYgKCFtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jb3VudChjb3JlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuZW1wbGFjZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4XSwgKnN0cnVjdERlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2RzdEl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqaXRlbS0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50U3RvcmU6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gQ2FsbGVkIGZyb20gY3JlYXRlQ29tcG9uZW50KCkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIGBjb21wb25lbnRgLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBDb21wb25lbnRTdGF0dXMgY29tcG9uZW50U3RhdHVzOworICAgIGNvbXBvbmVudFN0YXR1cy5jMkNvbXBvbmVudCA9IGNvbXBvbmVudC0+bUNvbXBvbmVudDsKKyAgICBjb21wb25lbnRTdGF0dXMuYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZW1wbGFjZShjb21wb25lbnQsIGNvbXBvbmVudFN0YXR1cyk7Cit9CisKKy8vIENhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZGVzdHJ1Y3RvciBvZiBgY29tcG9uZW50YC4gTm8gdmlydHVhbCBmdW5jdGlvbiBjYWxscworLy8gYXJlIG1hZGUgb24gYGNvbXBvbmVudGAgaGVyZS4KK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICBtQ29tcG9uZW50Um9zdGVyLmVyYXNlKGNvbXBvbmVudCk7Cit9CisKKy8vIER1bXBzIGNvbXBvbmVudCB0cmFpdHMuCitzdGQ6Om9zdHJlYW0mIENvbXBvbmVudFN0b3JlOjpkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wKSB7CisKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICAgIjsKKworICAgIG91dCA8PCBpbmRlbnQgPDwgIm5hbWU6ICIgPDwgY29tcC0+bmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiZG9tYWluOiAiIDw8IGNvbXAtPmRvbWFpbiA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAia2luZDogIiA8PCBjb21wLT5raW5kIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJyYW5rOiAiIDw8IGNvbXAtPnJhbmsgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIm1lZGlhVHlwZTogIiA8PCBjb21wLT5tZWRpYVR5cGUgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImFsaWFzZXM6IjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFsaWFzIDogY29tcC0+YWxpYXNlcykgeworICAgICAgICBvdXQgPDwgJyAnIDw8IGFsaWFzOworICAgIH0KKyAgICBvdXQgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHN0YXR1cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgLy8gUHJpbnQgYmlydGggdGltZS4KKyAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIG1zID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgIGNvbXBTdGF0dXMuYmlydGhUaW1lLnRpbWVfc2luY2VfZXBvY2goKSk7CisgICAgc3RkOjp0aW1lX3QgYmlydGhUaW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KAorICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUpOworICAgIHN0ZDo6dG0gdG0gPSAqc3RkOjpsb2NhbHRpbWUoJmJpcnRoVGltZSk7CisgICAgb3V0IDw8IGluZGVudCA8PCAiQ3JlYXRpb24gdGltZTogIgorICAgICAgICA8PCBzdGQ6OnB1dF90aW1lKCZ0bSwgIiVZLSVtLSVkICVIOiVNOiVTIikKKyAgICAgICAgPDwgJy4nIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygzKSA8PCBtcy5jb3VudCgpICUgMTAwMAorICAgICAgICA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBQcmludCBuYW1lIGFuZCBpZC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wU3RhdHVzLmMyQ29tcG9uZW50LT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gY29tcG9uZW50IC0tIG51bGwgaW50ZXJmYWNlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQgPDwgIk5hbWU6ICIgPDwgaW50Zi0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJJZDogIiA8PCBpbnRmLT5nZXRJZCgpIDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1Db21wb25lbnRSb3N0ZXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbUNvbXBvbmVudFJvc3RlcikgeworICAgICAgICAgICAgICAgICAgICBkdW1wKG91dCwgcGFpci5zZWNvbmQpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgIkVuZCBvZiBkdW1wIC0tIEMyQ29tcG9uZW50U3RvcmU6ICIKKyAgICAgICAgICAgICAgICA8PCBtU3RvcmUtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQob3V0LnN0cigpLCBoLT5kYXRhWzBdKSkgeworICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSB3cml0ZSgpIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcgc3VjY2VlZGVkIjsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29uZmlndXJhYmxlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworQ2FjaGVkQ29uZmlndXJhYmxlOjpDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50ZikKKyAgICAgIDogbUludGZ7c3RkOjptb3ZlKGludGYpfSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx1aW50MzJfdD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpnZXRJZCgpIHsKKyAgICByZXR1cm4gbUludGYtPmdldElkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJnBhcmFtcywgYzJoZWFwUGFyYW1zKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIGludmFsaWQgb3V0cHV0IHBhcmFtcy4iOworICAgIH0KKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKSwgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmYzJwYXJhbXMsIGluUGFyYW1zQ29weSkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBpbnB1dCBwYXJhbXMuIjsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsCisgICAgICAgICAgICAgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4oKSwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gVE9ETzogY2hlY2sgaWYgYmxvYiB3YXMgaW52YWxpZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMmZhaWx1cmVzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgIGMycGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmMyZmFpbHVyZXMpOworICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGZhaWx1cmVzKGMyZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIGMycmVzdWx0IDogYzJmYWlsdXJlcykgeworICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZmFpbHVyZXNbaXhdLCAqYzJyZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgICAgICsraXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGludmFsaWQgc2V0dGluZyByZXN1bHRzLiI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsdXJlcy5yZXNpemUoaXgpOworICAgIH0KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBvdXRQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIGZhaWx1cmVzLCBvdXRQYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiIF9oaWRsX2NiKSB7CisgICAgQzJMaW5lYXJSYW5nZSByZXF1ZXN0ID0gQzJMaW5lYXJDYXBhY2l0eShtU3VwcG9ydGVkUGFyYW1zLnNpemUoKSkucmFuZ2UoCisgICAgICAgICAgICBzdGFydCwgY291bnQpOworICAgIGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4gcGFyYW1zKHJlcXVlc3Quc2l6ZSgpKTsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gcmVxdWVzdC5vZmZzZXQoKTsgc3JjSXggPCByZXF1ZXN0LmVuZE9mZnNldCgpOyArK3NyY0l4KSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkUGFyYW1zW3NyY0l4XSkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmcGFyYW1zW2RzdEl4XSwgKm1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJhbXMucmVzaXplKGRzdEl4KTsKKyAgICBfaGlkbF9jYihyZXMsIHBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGMyZmllbGRzOworICAgIHsKKyAgICAgICAgLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IG9iamVjdHMgYXJlIHJlc3RyaWN0ZWQgaW4gdGhhdCBzb21lCisgICAgICAgIC8vIG1lbWJlcnMgYXJlIGNvbnN0LgorICAgICAgICAvLyBDMlBhcmFtRmllbGQgLSByZXF1aXJlZCBmb3IgaXRzIGNvbnN0cnVjdG9yIC0gaGFzIG5vIGNvbnN0cnVjdG9ycworICAgICAgICAvLyBmcm9tIGZpZWxkcy4gVXNlIEMyUGFyYW1JbnNwZWN0b3IuCisgICAgICAgIGZvciAoY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBpbkZpZWxkcykgeworICAgICAgICAgICAgYzJmaWVsZHMuZW1wbGFjZV9iYWNrKF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVQYXJhbUZpZWxkKAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQuc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnR5cGUgPT0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEUgPworICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFIDoKKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGMyZmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPyBDMl9NQVlfQkxPQ0sgOiBDMl9ET05UX0JMT0NLKTsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiBvdXRGaWVsZHMoaW5GaWVsZHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZyZXN1bHQgOiBjMmZpZWxkcykgeworICAgICAgICBpZiAob2JqY3B5KCZvdXRGaWVsZHNbZHN0SXhdLCByZXN1bHQpKSB7CisgICAgICAgICAgICArK2RzdEl4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0RmllbGRzLnJlc2l6ZShkc3RJeCk7CisgICAgICAgICAgICBjMnJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBvdXRGaWVsZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyM2EwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dEJ1ZmZlck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dEJ1ZmZlck1hbmFnZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6cmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcik7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpzZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIklucHV0IGJ1ZmZlciBhdCBpbmRleCAiIDw8IGkgPDwgIiBpcyBudWxsLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wbGFjZSgKKyAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgIT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICAgICAgPSBmaW5kTGlzdGVuZXItPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBmaW5kTGlzdGVuZXJEID0gbURlYXRoTm90aWZpY2F0aW9ucy5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyRCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpKSB7CisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gZmluZExpc3RlbmVyRC0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCAtPSBidWZmZXJJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUmVtb3ZlIGxpc3RlbmVyIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZCBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMKKy8vIGFsbCBmcmFtZUluZGljZXMgYW5kIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywgaS5lLiwgd2hlbgorLy8gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgLS0gY2FsbGVkIHdpdGggIgorICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMgPQorICAgICAgICAgICAgICAgIGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBmb3IgKGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5iZWdpbigpOworICAgICAgICAgICAgICAgIGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpOworICAgICAgICAgICAgICAgICsrZmluZEZyYW1lSW5kZXgpIHsKKyAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChjb25zdCBUcmFja2VkQnVmZmVyJiBidWZmZXJJZCA6IGJ1ZmZlcklkcykgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gYnVmZmVySWQuYnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIobGlzdGVuZXIgQCAweCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IGJ1ZmZlcklkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGJ1ZmZlcklkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpID0+IHN0YXR1cyA9ICIgPDwgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGxpc3RlbmVyKTsKK30KKworLy8gU2V0IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9zZXROb3RpZmljYXRpb25JbnRlcnZhbCgKKyAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuc3RvcmUoCisgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zLAorICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibnVsbCBhcmd1bWVudCAocyk6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgICAgICA8PCAiLCBhcmcgQCAweCIgPDwgc3RkOjpoZXggPDwgYXJnCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJidWYgQCAweCIgPDwgc3RkOjpoZXggPDwgYnVmCisgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIiAtLSAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIgPDwgc3RkOjpkZWMgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgIGF1dG8gZmluZExpc3RlbmVyID0gbVRyYWNrZWRCdWZmZXJzTWFwLmZpbmQoaWQubGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXIgPT0gbVRyYWNrZWRCdWZmZXJzTWFwLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIChmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgZnJhbWUgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICBhdXRvIGZpbmRCdWZmZXJJZCA9IGJ1ZmZlcklkcy5maW5kKGlkKTsKKyAgICBpZiAoZmluZEJ1ZmZlcklkID09IGJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9vbkJ1ZmZlckRlc3Ryb3llZCAtLSAiCisgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgPDwgImJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVySWRzLmVyYXNlKGZpbmRCdWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBtRGVhdGhOb3RpZmljYXRpb25zW2lkLmxpc3RlbmVyXTsKKyAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlc1tpZC5mcmFtZUluZGV4XS5lbXBsYWNlX2JhY2soaWQuYnVmZmVySW5kZXgpOworICAgICsrZGVhdGhOb3RpZmljYXRpb25zLmNvdW50OworICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC5ub3RpZnlfb25lKCk7Cit9CisKKy8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorLy8gUmV0dXJuIHRydWUgYW5kIHNldCB0aW1lVG9SZXRyeSB0byB0aGUgdGltZSBwb2ludCB0byB3YWl0IGZvciBiZWZvcmUKKy8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCitib29sIElucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcykgeworCisgICAgc3RydWN0IE5vdGlmaWNhdGlvbiB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+IGlucHV0QnVmZmVyczsKKyAgICAgICAgTm90aWZpY2F0aW9uKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGwsIHNpemVfdCBzKQorICAgICAgICAgICAgICA6IGxpc3RlbmVyKGwpLCBpbnB1dEJ1ZmZlcnMocykge30KKyAgICB9OworICAgIHN0ZDo6bGlzdDxOb3RpZmljYXRpb24+IG5vdGlmaWNhdGlvbnM7CisgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zID0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgICBib29sIHJldHJ5ID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAqdGltZVRvUmV0cnlOcyA9IG5vdGlmaWNhdGlvbkludGVydmFsTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBub3RpZmljYXRpb25JbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOworICAgICAgICAgICAgICAgICp0aW1lVG9SZXRyeU5zID0gc3RkOjptaW4oKnRpbWVUb1JldHJ5TnMsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25JbnRlcnZhbE5zIC0gdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMpOworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJOb3RpZmljYXRpb25zIGZvciBsaXN0ZW5lciBAICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgd2lsbCBiZSBwb3N0cG9uZWQuIjsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0byB0aGlzCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBidXQgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMsIHRoZQorICAgICAgICAgICAgLy8gbGlzdGVuZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zLS0tdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBub3RpZmljYXRpb24gdGltZSBhbnltb3JlLgorICAgICAgICAgICAgaWYgKGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5lbXBsYWNlX2JhY2sobGlzdGVuZXIsIGRlYXRoTm90aWZpY2F0aW9ucy5jb3VudCk7CisgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyPiAmaW5wdXRCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5iYWNrKCkuaW5wdXRCdWZmZXJzOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgZm9yIChzdGQ6OnBhaXI8Y29uc3QgdWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+JiBwIDoKKyAgICAgICAgICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gcC5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZidWZmZXJJbmRpY2VzID0gcC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzaXplX3QmIGJ1ZmZlckluZGV4IDogYnVmZmVySW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyICZpbnB1dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5wdXRCdWZmZXJzW2krK107CisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbGVhciBkZWF0aE5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIHNldCByZXRyeSB0byB0cnVlCisgICAgICAgICAgICAvLyBzbyBwcm9jZXNzTm90aWZpY2F0aW9ucyB3aWxsIGJlIGNhbGxlZCBhZ2Fpbi4gVGhpcyB3aWxsCisgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhhdCBhIGxpc3RlbmVyIHdpdGggbm8gcGVuZGluZyBub3RpZmljYXRpb25zIHdpbGwKKyAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGhhcyBwYXNzZWQuCisgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID0gMDsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5sYXN0U2VudE5zID0gdGltZU5vd05zOworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENhbGwgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmlucHV0QnVmZmVycykuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGlmIHRoZSBjbGllbnQgaGFzIGRpZWQuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBzZW5kIGRlYXRoIG5vdGlmaWNhdGlvbnMgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG5vdGlmaWNhdGlvbi5saXN0ZW5lci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiLiI7CisgICAgICAgIH0gZWxzZSB7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBpbnB1dEJ1ZmZlckxvZzsKKyAgICAgICAgICAgIGZvciAoY29uc3QgSUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIgOgorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJMb2cgPDwgIiAoIiA8PCBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZGVhdGggbm90aWZpY2F0aW9ucyBzZW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAibGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIHRoZXNlIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgcGFpcnM6IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGlucHV0QnVmZmVyTG9nLnN0cigpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgaWYgKHJldHJ5KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAid2lsbCByZXRyeSBhZ2FpbiBpbiAiIDw8ICp0aW1lVG9SZXRyeU5zIDw8ICJucy4iOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyAtLSAiCisgICAgICAgICAgICAgICAgICAgICA8PCAibm8gcGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zLiI7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldHJ5OworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6bWFpbigpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlciBtYWluIC0tIHN0YXJ0ZWQuIjsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHdoaWxlIChwcm9jZXNzTm90aWZpY2F0aW9ucygmdGltZVRvUmV0cnlOcykpIHsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzKHRpbWVUb1JldHJ5TnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyOjpJbnB1dEJ1ZmZlck1hbmFnZXIoKQorICAgICAgOiBtTWFpblRocmVhZHsmSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluLCB0aGlzfSB7Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlciYgSW5wdXRCdWZmZXJNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyIGluc3RhbmNle307CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRjYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIERlcml2ZWQgY2xhc3Mgb2YgQzJJbnRlcmZhY2VIZWxwZXIKK2NsYXNzIElucHV0U3VyZmFjZTo6SW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb25maWd1cmFibGVDMkludGYKK2NsYXNzIElucHV0U3VyZmFjZTo6Q29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZUludGYoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpJbnRlcmZhY2U+ICZpbnRmLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBDb25maWd1cmFibGVDMkludGYoImlucHV0LXN1cmZhY2UiLCAwKSwKKyAgICAgICAgICBtSW50ZihpbnRmKSwKKyAgICAgICAgICBtU291cmNlKHNvdXJjZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkNvbmZpZ3VyYWJsZUludGYoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnkoe30sIGluZGljZXMsIG1heUJsb2NrLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUludGYtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gbUludGY7CisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK1JldHVybjxzcDxJbnB1dFN1cmZhY2U6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICByZXR1cm4gbVByb2R1Y2VyOworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IElucHV0U3VyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAoIXNpbmspIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBDb21wb25lbnQ6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKKyAgICBpZiAoY29tcCkgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgY29tcCwgbVN0b3JlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbmV3IElucHV0U3VyZmFjZUNvbm5lY3Rpb24obVNvdXJjZSwgc2luaywgbVN0b3JlKTsKKyAgICB9CisgICAgaWYgKCFjb25uZWN0aW9uLT5pbml0KCkpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gQ29uc3RydWN0b3IgaXMgZXhjbHVzaXZlIHRvIENvbXBvbmVudFN0b3JlLgorSW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIHJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKQorICAgICAgOiBtU3RvcmV7c3RvcmV9LAorICAgICAgICBtUHJvZHVjZXJ7cHJvZHVjZXJ9LAorICAgICAgICBtU291cmNle3NvdXJjZX0sCisgICAgICAgIG1JbnRme3N0ZDo6bWFrZV9zaGFyZWQ8SW50ZXJmYWNlPihyZWZsZWN0b3IpfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29uZmlndXJhYmxlSW50Zj4oCisgICAgICAgICAgICAgICAgICAgIG1JbnRmLCBzb3VyY2UpKX0geworCisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTkzMmVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsNTI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dFN1cmZhY2VDb25uZWN0aW9uIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK2NvbnN0ZXhwciBpbnQzMl90IGtCdWZmZXJDb3VudCA9IDE2OworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitjbGFzcyBCdWZmZXIyRCA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyMkQoQzJDb25zdEdyYXBoaWNCbG9jayBibG9jaykgOiBDMkJ1ZmZlcih7IGJsb2NrIH0pIHsKKyAgICB9Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIERlcml2ZWQgY2xhc3Mgb2YgQ29tcG9uZW50V3JhcHBlciBmb3IgdXNlIHdpdGgKKy8vIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgpLgorLy8KK3N0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsIDogcHVibGljIENvbXBvbmVudFdyYXBwZXIgeworCisgICAgSW1wbChjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgbG9jYWxDb21wKQorICAgICAgICAgIDogbVNvdXJjZXtzb3VyY2V9LCBtTG9jYWxDb21we2xvY2FsQ29tcH0sIG1TaW5re30sIG1GcmFtZUluZGV4ezB9IHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmID0gbG9jYWxDb21wLT5pbnRmKCk7CisgICAgICAgIG1TaW5rTmFtZSA9IGludGYgPyBpbnRmLT5nZXROYW1lKCkgOiAiIjsKKyAgICB9CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykKKyAgICAgICAgICA6IG1Tb3VyY2V7c291cmNlfSwgbUxvY2FsQ29tcHt9LCBtU2lua3tzaW5rfSwgbUZyYW1lSW5kZXh7MH0geworICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0gc2luay0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJSZW1vdGUgc2luayBpcyBkZWFkLiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNpbmtDb25maWd1cmFibGUgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCk7CisgICAgICAgIGlmICghbVNpbmtDb25maWd1cmFibGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rIGlzIG5vdCBjb25maWd1cmFibGUuIjsKKyAgICAgICAgICAgIG1TaW5rTmFtZSA9ICIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaGlkbF9zdHJpbmcgbmFtZTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVNpbmtDb25maWd1cmFibGUtPmdldE5hbWUoCisgICAgICAgICAgICAgICAgWyZuYW1lXShjb25zdCBoaWRsX3N0cmluZyYgbikgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rJ3MgY29uZmlndXJhYmxlIGlzIGRlYWQuIjsKKyAgICAgICAgICAgIG1TaW5rTmFtZSA9ICIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1TaW5rTmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgeworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1Tb3VyY2UtPnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBib29sIGluaXQoKSB7CisgICAgICAgIGlmIChtU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdyYXBoaWNCdWZmZXJTb3VyY2UgaW5pdCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBlcnIgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogcmVhZCBzZXR0aW5ncyBwcm9wZXJseSBmcm9tIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZTsKKyAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQgdXNhZ2U7CisgICAgICAgIGMyX3N0YXR1c190IGMyU3RhdHVzID0gcXVlcnlGcm9tU2luayh7ICZpbnB1dFNpemUsICZ1c2FnZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgaWYgKGMyU3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gY2Fubm90IHF1ZXJ5IGluZm9ybWF0aW9uIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgY29tcG9uZW50IGludGVyZmFjZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGFzU3RyaW5nKGMyU3RhdHVzKSA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgY29sb3IgYXNwZWN0ICYgZGF0YXNwYWNlCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisKKyAgICAgICAgLy8gVE9ETzogdXNlIHRoZSB1c2FnZSByZWFkIGZyb20gaW50ZgorICAgICAgICAvLyB1aW50MzJfdCBncmFsbG9jVXNhZ2UgPQorICAgICAgICAvLyAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2UodXNhZ2UudmFsdWUpKS4KKyAgICAgICAgLy8gICAgICAgICBhc0dyYWxsb2NVc2FnZSgpOworCisgICAgICAgIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgICAgICAgICAgbVNpbmtOYW1lLmNvbXBhcmUoMCwgMTEsICJjMi5hbmRyb2lkLiIpID09IDAgPworICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworCisgICAgICAgIGVyciA9IG1Tb3VyY2UtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgICAgICB0aGlzLCBkYXRhU3BhY2UsIGtCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICBpbnB1dFNpemUud2lkdGgsIGlucHV0U2l6ZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdCUyBjb25maWd1cmUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgZXJyIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrQnVmZmVyQ291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKCFtU291cmNlLT5vbklucHV0QnVmZmVyQWRkZWQoaSkuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0OiBmYWlsZWQgdG8gcG9wdWxhdGUgR0JTIHNsb3RzLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbVNvdXJjZS0+c3RhcnQoKS5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBHQlMgZmFpbGVkIHRvIHN0YXJ0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUFsbG9jYXRvck11dGV4LmxvY2soKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OlBMQVRGT1JNX1NUQVJUICsgMSwgIC8vIEdSQUxMT0MKKyAgICAgICAgICAgICAgICAmbUFsbG9jYXRvcik7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC51bmxvY2soKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gZmFpbGVkIHRvIGZldGNoIGdyYWxsb2MgYWxsb2NhdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoYzJlcnIpIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBGcm9tIENvbXBvbmVudFdyYXBwZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBpbnQgZmVuY2VGZCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkltcGw6OnN1Ym1pdEJ1ZmZlciAtLSBidWZmZXJJZCA9ICIgPDwgYnVmZmVySWQgPDwgIi4iOworICAgICAgICAvLyBUT0RPOiBVc2UgZmQgdG8gY29uc3RydWN0IGZlbmNlCisgICAgICAgICh2b2lkKWZlbmNlRmQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBDMkhhbmRsZSogaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgYnVmZmVyLT5mb3JtYXQsIGJ1ZmZlci0+dXNhZ2UsIGJ1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LmxvY2soKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC51bmxvY2soKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5mZXRjaF9hZGQoCisgICAgICAgICAgICAgICAgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcigKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXIyRChibG9jay0+c2hhcmUoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksIDo6QzJGZW5jZSgpKSksCisgICAgICAgICAgICAgICAgW2J1ZmZlcklkLCBzb3VyY2UgPSBtU291cmNlXShDMkJ1ZmZlciogcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVySWQsIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMkJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgZXJyID0gcXVldWVUb1NpbmsoJml0ZW1zKTsKKyAgICAgICAgcmV0dXJuIChlcnIgPT0gQzJfT0spID8gT0sgOiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0RW9zKGludDMyX3QgYnVmZmVySWQpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbXBsOjpzdWJtaXRFb3MgLS0gYnVmZmVySWQgPSAiIDw8IGJ1ZmZlcklkIDw8ICIuIjsKKyAgICAgICAgKHZvaWQpYnVmZmVySWQ7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcXVldWVUb1NpbmsoJml0ZW1zKTsKKyAgICAgICAgcmV0dXJuIChlcnIgPT0gQzJfT0spID8gT0sgOiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoCisgICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpZGF0YVNwYWNlOworICAgICAgICAodm9pZClhc3BlY3RzOworICAgICAgICAodm9pZClwaXhlbEZvcm1hdDsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmFibGUgaW50ZXJmYWNlIGZvciBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsLgorICAgIC8vCisgICAgLy8gVGhpcyBjbGFzcyBpcyBkZWNsYXJlZCBhcyBhbiBpbm5lciBjbGFzcyBzbyB0aGF0IGl0IHdpbGwgaGF2ZSBhY2Nlc3MgdG8KKyAgICAvLyBhbGwgSW1wbCdzIG1lbWJlcnMuCisgICAgc3RydWN0IENvbmZpZ3VyYWJsZUludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICAgICAgc3A8SW1wbD4gbUNvbm5lY3Rpb247CisgICAgICAgIENvbmZpZ3VyYWJsZUludGYoY29uc3Qgc3A8SW1wbD4mIGNvbm5lY3Rpb24pCisgICAgICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmeyJpbnB1dC1zdXJmYWNlLWNvbm5lY3Rpb24iLCAwfSwKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbntjb25uZWN0aW9ufSB7fQorICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICAgICApIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcworICAgICAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlOworICAgIH07CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgcXVlcnlGcm9tU2luaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgeworICAgICAgICBpZiAobUxvY2FsQ29tcCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmID0gbUxvY2FsQ29tcC0+aW50ZigpOworICAgICAgICAgICAgaWYgKGludGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Zi0+cXVlcnlfdmIoc3RhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiY29tcG9uZW50IGRvZXMgbm90IGhhdmUgYW4gaW50ZXJmYWNlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENIRUNLKG1TaW5rKSA8PCAiLS0gcXVlcnlGcm9tU2luayAiCisgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gY29ubmVjdGlvbiBoYXMgbm8gc2luay4iOworICAgICAgICBDSEVDSyhtU2lua0NvbmZpZ3VyYWJsZSkgPDwgIi0tIHF1ZXJ5RnJvbVNpbmsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIHNpbmsgaGFzIG5vIGNvbmZpZ3VyYWJsZS4iOworCisgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoCisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgICAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHN0YWNrUGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgbnVtU3RhY2tJbmRpY2VzID0gbnVtSW5kaWNlczsKKyAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzLnJlc2l6ZShudW1JbmRpY2VzKTsKKyAgICAgICAgaWYgKGhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtU2lua0NvbmZpZ3VyYWJsZS0+cXVlcnkoCisgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgUGFyYW1zJiBwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGFzU3RyaW5nKHN0YXR1cykgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gZXJyb3Igd2hpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicGFyc2luZyBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhcmFtUG9pbnRlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtUG9pbnRlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1TdGFja0luZGljZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGkgPCBzdGFja1BhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBza2lwcGVkIChpbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSA8PCAiKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIHVwZGF0ZSBmYWlsZWQgKGluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtUG9pbnRlci0+aW5kZXgoKSA8PCAiKS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgaGVhcCBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgc3RhY2sgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeUZyb21TaW5rIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXVlVG9TaW5rKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgICAgIGlmIChtTG9jYWxDb21wKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2FsQ29tcC0+cXVldWVfbmIoaXRlbXMpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobVNpbmspIDw8ICItLSBxdWV1ZVRvU2luayAiCisgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gY29ubmVjdGlvbiBoYXMgbm8gc2luay4iOworCisgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsICppdGVtcywgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9TaW5rIC0tIGJhZCBpbnB1dC4iOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1TaW5rLT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9TaW5rIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9TaW5rIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXNTdHJpbmcoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtTG9jYWxDb21wOworICAgIHNwPElJbnB1dFNpbms+IG1TaW5rOworICAgIHNwPElDb25maWd1cmFibGU+IG1TaW5rQ29uZmlndXJhYmxlOworICAgIHN0ZDo6c3RyaW5nIG1TaW5rTmFtZTsKKworICAgIC8vIE5lZWRlZCBmb3IgQ29tcG9uZW50V3JhcHBlciBpbXBsZW1lbnRhdGlvbgorICAgIHN0ZDo6bXV0ZXggbUFsbG9jYXRvck11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKworfTsKKworSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgIDogbUltcGx7bmV3IEltcGwoc291cmNlLCBjb21wKX0sCisgICAgICAgIG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW1wbDo6Q29uZmlndXJhYmxlSW50Zj4obUltcGwpKX0geworICAgIG1Db25maWd1cmFibGUtPmluaXQoc3RvcmUuZ2V0KCkpOworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgIDogbUltcGx7bmV3IEltcGwoc291cmNlLCBzaW5rKX0sCisgICAgICAgIG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW1wbDo6Q29uZmlndXJhYmxlSW50Zj4obUltcGwpKX0geworICAgIG1Db25maWd1cmFibGUtPmluaXQoc3RvcmUuZ2V0KCkpOworfQorCitSZXR1cm48U3RhdHVzPiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbXBsTXV0ZXgpOworICAgIG1JbXBsID0gbnVsbHB0cjsKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6fklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSB7CisgICAgbUltcGwgPSBudWxscHRyOworfQorCitib29sIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmluaXQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUltcGxNdXRleCk7CisgICAgcmV0dXJuIG1JbXBsLT5pbml0KCk7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCisvLyBDb25maWd1cmFibGUgaW50ZXJmYWNlIGZvciBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKWZhaWx1cmVzOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpaW5kaWNlczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICAodm9pZClwYXJhbXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKXBhcmFtczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClmaWVsZHM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ2xpZW50QmxvY2tIZWxwZXIuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjI5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ2xpZW50QmxvY2tIZWxwZXIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMSUVOVF9CTE9DS19IRUxQRVJfSAorI2RlZmluZSBDTElFTlRfQkxPQ0tfSEVMUEVSX0gKKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKy8vIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrIE9wZXJhdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gTWFuYWdlIEJ1ZmZlclF1ZXVlIGFuZCBncmFwaGljIGJsb2NrcyBmb3IgYm90aCBjb21wb25lbnQgYW5kIGNvZGVjLgorLy8gTWFuYWdlIGdyYXBoaWMgYmxvY2tzIG93bmVyc2hpcCBjb25zaXN0ZW50bHkgZHVyaW5nIHN1cmZhY2UgY2hhbmdlLgorc3RydWN0IE91dHB1dEJ1ZmZlclF1ZXVlIHsKKworICAgIE91dHB1dEJ1ZmZlclF1ZXVlKCk7CisKKyAgICB+T3V0cHV0QnVmZmVyUXVldWUoKTsKKworICAgIC8vIENvbmZpZ3VyZSBhIG5ldyBzdXJmYWNlIHRvIHJlbmRlciBncmFwaGljIGJsb2Nrcy4KKyAgICAvLyBHcmFwaGljIGJsb2NrcyBmcm9tIG9sZGVyIHN1cmZhY2Ugd2lsbCBiZSBtaWdyYXRlZCB0byBuZXcgc3VyZmFjZS4KKyAgICBib29sIGNvbmZpZ3VyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQpOworCisgICAgLy8gUmVuZGVyIGEgZ3JhcGhpYyBibG9jayB0byBjdXJyZW50IHN1cmZhY2UuCisgICAgc3RhdHVzX3Qgb3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDYWxsIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gb3V0cHV0IGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisgICAgLy8gVGhlIE91dHB1dEJ1ZmZlclF1ZXVlIHdpbGwgdGFrZSB0aGUgb3duZXJzaGlwIG9mIG91dHB1dCBibG9ja3MuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgV29ya0J1bmRsZSBoYXMgYmVlbiByZWNlaXZlZAorICAgIC8vIGZyb20gYW5vdGhlciBwcm9jZXNzLgorICAgIHZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QpOworCitwcml2YXRlOgorCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMSUVOVF9CTE9DS19IRUxQRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGNjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIElDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+JiBzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICAgICAgY29ubmVjdFRvSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMT4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGNvbm5lY3RUb09teElucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRlc3Ryb3lCbG9ja1Bvb2wodWludDY0X3QgYmxvY2tQb29sSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IGdldEludGVyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElJbnB1dFNpbms+PiBhc0lucHV0U2luaygpIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJucyBhIEMyQ29tcG9uZW50IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHNpbmsgaWYgdGhlIHNpbmsgaXMgaW5kZWVkCisgICAgLy8gYSBsb2NhbCBjb21wb25lbnQuIFJldHVybnMgbnVsbHB0ciBvdGhlcndpc2UuCisgICAgLy8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSW5wdXRTdXJmYWNlOjpjb25uZWN0KCkuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspOworCitwcm90ZWN0ZWQ6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHNwPENvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyCisgICAgICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcjsKKworICAgIHN0cnVjdCBTaW5rOworICAgIHN0ZDo6bXV0ZXggbVNpbmtNdXRleDsKKyAgICBzcDxTaW5rPiBtU2luazsKKworICAgIHN0ZDo6bXV0ZXggbUJsb2NrUG9vbHNNdXRleDsKKyAgICAvLyBUaGlzIG1hcCBrZWVwcyBDMkJsb2NrUG9vbCBvYmplY3RzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgY3JlYXRlQmxvY2tQb29sKCkKKyAgICAvLyBhbGl2ZS4gVGhlc2UgQzJCbG9ja1Bvb2wgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nCisgICAgLy8gZGVzdHJveUJsb2NrUG9vbCgpLCByZXNldCgpIG9yIHJlbGVhc2UoKSwgb3IgYnkgZGVzdHJveWluZyB0aGUgY29tcG9uZW50LgorICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKKworICAgIHZvaWQgaW5pdExpc3RlbmVyKGNvbnN0IHNwPENvbXBvbmVudD4mIHNlbGYpOworCisgICAgdmlydHVhbCB+Q29tcG9uZW50KCkgb3ZlcnJpZGU7CisKKyAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOworCisgICAgc3RydWN0IExpc3RlbmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0lOVEVSRkFDRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCitzdHJ1Y3QgQ29tcG9uZW50SW50ZXJmYWNlIDogcHVibGljIElDb21wb25lbnRJbnRlcmZhY2UgeworICAgIENvbXBvbmVudEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIENvbXBvbmVudFN0b3JlKiBzdG9yZSk7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPENhY2hlZENvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgwYzYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgSUNvbXBvbmVudFN0b3JlIHsKKyAgICBDb21wb25lbnRTdG9yZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKyAgICB2aXJ0dWFsIH5Db21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgY29uc3RydWN0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ2FjaGVkQ29uZmlndXJhYmxlOjppbml0KCkgdG8gdmFsaWRhdGUKKyAgICAgKiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+JiBwYXJhbXMpOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlLgorICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgICAgICBjcmVhdGVDb21wb25lbnRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBsaXN0Q29tcG9uZW50cyhsaXN0Q29tcG9uZW50c19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY3JlYXRlSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGdldFN0cnVjdERlc2NyaXB0b3JzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IGdldFBvb2xDbGllbnRNYW5hZ2VyKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBjb3B5QnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBzcmMsCisgICAgICAgICAgICBjb25zdCBCdWZmZXImIGRzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRHVtcHMgaW5mb3JtYXRpb24gd2hlbiBsc2hhbCBpcyBjYWxsZWQuCisgICAgICovCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZGVidWcoCisgICAgICAgICAgICBjb25zdCBoaWRsX2hhbmRsZSYgaGFuZGxlLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiBhcmdzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHNwPENhY2hlZENvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIC8vIERvZXMgYm9va2tlZXBpbmcgZm9yIGFuIGludGVyZmFjZSB0aGF0IGhhcyBiZWVuIGxvYWRlZC4KKyAgICB2b2lkIG9uSW50ZXJmYWNlTG9hZGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVBhcmFtUmVmbGVjdG9yOworCisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPj4gbVN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkNvcmVJbmRleD4gbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnM7CisgICAgc3RkOjpzZXQ8QzJTdHJpbmc+IG1Mb2FkZWRJbnRlcmZhY2VzOworICAgIG11dGFibGUgc3RkOjptdXRleCBtU3RydWN0RGVzY3JpcHRvcnNNdXRleDsKKworICAgIC8vIENvbXBvbmVudFN0b3JlIGtlZXBzIHRyYWNrIG9mIGxpdmUgQ29tcG9uZW50cy4KKworICAgIHN0cnVjdCBDb21wb25lbnRTdGF0dXMgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGMyQ29tcG9uZW50OworICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0aW1lX3BvaW50IGJpcnRoVGltZTsKKyAgICB9OworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Db21wb25lbnRSb3N0ZXJNdXRleDsKKyAgICBzdGQ6Om1hcDxDb21wb25lbnQqLCBDb21wb25lbnRTdGF0dXM+IG1Db21wb25lbnRSb3N0ZXI7CisKKyAgICAvLyBDYWxsZWQgd2hlbmV2ZXIgQ29tcG9uZW50IGlzIGNyZWF0ZWQuCisgICAgdm9pZCByZXBvcnRDb21wb25lbnRCaXJ0aChDb21wb25lbnQqIGNvbXBvbmVudCk7CisgICAgLy8gQ2FsbGVkIG9ubHkgZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBDb21wb25lbnQuCisgICAgdm9pZCByZXBvcnRDb21wb25lbnREZWF0aChDb21wb25lbnQqIGNvbXBvbmVudCk7CisKKyAgICBmcmllbmQgQ29tcG9uZW50OworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZHVtcGluZy4KKworICAgIHN0ZDo6b3N0cmVhbSYgZHVtcCgKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wKTsKKworICAgIHN0ZDo6b3N0cmVhbSYgZHVtcCgKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgQ29tcG9uZW50U3RhdHVzJiBjb21wU3RhdHVzKTsKKworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDk1MTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKKy8qKgorICogQ29kZWMyIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIG1heSBoYXZlIGRpZmZlcmVudCBxdWVyeWluZyBhbmQgY29uZmlndXJpbmcKKyAqIGZ1bmN0aW9ucywgYnV0IGFjcm9zcyB0aGUgVHJlYmxlIGJvdW5kYXJ5LCB0aGV5IHNoYXJlIHRoZSBzYW1lIEhJREwKKyAqIGludGVyZmFjZSwgSUNvbmZpZ3VyYWJsZS4KKyAqCisgKiBDb25maWd1cmFibGVDMkludGYgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBhIENvZGVjMiBvYmplY3QgY2FuIGltcGxlbWVudCB0bworICogZWFzaWx5IGV4cG9zZSBhbiBJQ29uZmlndXJhYmxlIGluc3RhbmNlLiBTZWUgQ2FjaGVkQ29uZmlndXJhYmxlIGJlbG93LgorICovCitzdHJ1Y3QgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICB1aW50MzJfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlfdmIgc2FucyBzdGFjayBwYXJhbXMgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6Y29uZmlnX3ZiICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeVN1cHBvcnRlZFBhcmFtc19uYiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeVN1cHBvcnRlZFBhcmFtc19uYiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfkNvbmZpZ3VyYWJsZUMySW50ZigpID0gZGVmYXVsdDsKKworICAgIENvbmZpZ3VyYWJsZUMySW50Zihjb25zdCBDMlN0cmluZyYgbmFtZSwgdWludDMyX3QgaWQpCisgICAgICAgICAgOiBtTmFtZXtuYW1lfSwgbUlke2lkfSB7fQorCitwcm90ZWN0ZWQ6CisgICAgQzJTdHJpbmcgbU5hbWU7IC8qIGNhY2hlZCBjb21wb25lbnQgbmFtZSAqLworICAgIHVpbnQzMl90IG1JZDsKK307CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIElDb25maWd1cmFibGUgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgY2FjaGluZyBvZgorICogc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBhIHN1cHBsaWVkIENvbXBvbmVudFN0b3JlLgorICoKKyAqIENhY2hlZENvbmZpZ3VyYWJsZSBlc3NlbnRpYWxseSBjb252ZXJ0cyBhIENvbmZpZ3VyYWJsZUMySW50ZiBpbnRvIEhJREwncworICogSUNvbmZpZ3VyYWJsZS4gQSBDb2RlYzIgb2JqZWN0IGdlbmVyYWxseSBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZUMySW50ZiBhbmQKKyAqIHBhc3NlcyB0aGUgaW1wbGVtZW50YXRpb24gdG8gdGhlIGNvbnN0cnVjdG9yIG9mIENhY2hlZENvbmZpZ3VyYWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgY2FjaGluZyBoYXBwZW5zCisgKi8KK3N0cnVjdCBDYWNoZWRDb25maWd1cmFibGUgOiBwdWJsaWMgSUNvbmZpZ3VyYWJsZSB7CisgICAgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50Zik7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlCisKKyAgICB2aXJ0dWFsIFJldHVybjx1aW50MzJfdD4gZ2V0SWQoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25maWcoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5QYXJhbXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgdWludDMyX3Qgc3RhcnQsCisgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIC8vIENvbW1vbiBDb2RlYzIuMCBpbnRlcmZhY2Ugd3JhcHBlcgorICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+IG1JbnRmOworCisgICAgLy8gQ2FjaGVkIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBtU3VwcG9ydGVkUGFyYW1zOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg1N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCisvKioKKyAqIElucHV0QnVmZmVyTWFuYWdlcgorICogPT09PT09PT09PT09PT09PT09CisgKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyIHByZXNlbnRzIGEgd2F5IHRvIHRyYWNrIGFuZCB1bnRyYWNrIGlucHV0IGJ1ZmZlcnMgaW4gdGhpcworICogKGNvZGVjKSBwcm9jZXNzIGFuZCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGEgbGlzdGVuZXIsIHBvc3NpYmx5IGluIGEKKyAqIGRpZmZlcmVudCBwcm9jZXNzLCB3aGVuIGEgdHJhY2tlZCBidWZmZXIgbm8gbG9uZ2VyIGhhcyBhbnkgcmVmZXJlbmNlcyBpbiB0aGlzCisgKiBwcm9jZXNzLgorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBob2xkcyBhIGNvbGxlY3Rpb24gb2YgcmVjb3JkcyByZXByZXNlbnRpbmcgdHJhY2tlZCBidWZmZXJzCisgKiBhbmQgdGhlaXIgY2FsbGJhY2sgbGlzdGVuZXJzLiBDb25jZXB0dWFsbHksIG9uZSByZWNvcmQgaXMgYSB0cmlwbGUgKGxpc3RlbmVyLAorICogZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHdoZXJlCisgKgorICogLSAoZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIGlzIGEgcGFpciBvZiBpbmRpY2VzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGJ1ZmZlci4KKyAqIC0gbGlzdGVuZXIgaXMgb2YgdHlwZSBJQ29tcG9uZW50TGlzdGVuZXIuIEl0cyBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkKKyAqICAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGRpZXMuIFRoZSBhcmd1bWVudCBvZgorICogICBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgaXMgYSBsaXN0IG9mIElucHV0QnVmZmVyIG9iamVjdHMsIGVhY2ggb2Ygd2hpY2gKKyAqICAgaGFzIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKyAqCisgKiAgICAgdWludDY0X3QgZnJhbWVJbmRleAorICogICAgIHVpbnQzMl90IGFycmF5SW5kZXgKKyAqCisgKiBXaGVuIGEgdHJhY2tlZCBidWZmZXIgYXNzb2NpYXRlZCB0byB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwKKyAqIGJ1ZmZlckluZGV4KSBnb2VzIG91dCBvZiBzY29wZSwgbGlzdGVuZXItPm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKSB3aWxsIGJlCisgKiBjYWxsZWQgd2l0aCBhbiBJbnB1dEJ1ZmZlciBvYmplY3Qgd2hvc2UgbWVtYmVycyBhcmUgc2V0IGFzIGZvbGxvd3M6CisgKgorICogICAgIGlucHV0QnVmZmVyLmZyYW1lSW5kZXggPSBmcmFtZUluZGV4CisgKiAgICAgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCA9IGJ1ZmZlckluZGV4CisgKgorICogSVBDIE9wdGltaXphdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNpbmNlIG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKSBpcyBhbiBJUEMgY2FsbCwgSW5wdXRCdWZmZXJNYW5hZ2VyIHRyaWVzIG5vdAorICogdG8gY2FsbCBpdCB0b28gb2Z0ZW4uIEFueSB0d28gY2FsbHMgdG8gdGhlIHNhbWUgbGlzdGVuZXIgYXJlIGF0IGxlYXN0CisgKiBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBuYW5vc2Vjb25kcyBhcGFydCwgd2hlcmUgbU5vdGlmaWNhdGlvbkludGVydmFsTnMgaXMKKyAqIGNvbmZpZ3VyYWJsZSB2aWEgY2FsbGluZyBzZXROb3RpZmljYXRpb25JbnRlcnZhbCgpLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZgorICogbU5vdGlmaWNhdGlvbkludGVydmFsTnMgaXMga0RlZmF1bHROb3RpZmljYXRpb25JbnRlcm5hbE5zLgorICoKKyAqIFB1YmxpYyBNZW1iZXIgRnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBpcyBhIHNpbmdsZXRvbiBjbGFzcy4gSXRzIG9ubHkgaW5zdGFuY2UgaXMgYWNjZXNzaWJsZSB2aWEKKyAqIHRoZSBmb2xsb3dpbmcgcHVibGljIGZ1bmN0aW9uczoKKyAqCisgKiAtIHJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICogICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpCisgKgorICogLSB1bnJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkKKyAqCisgKiAtIHVucmVnaXN0ZXJGcmFtZURhdGEoY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpCisgKgorICogLSBzZXROb3RpZmljYXRpb25JbnRlcnZhbChuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpCisgKgorICovCisKK3N0cnVjdCBJbnB1dEJ1ZmZlck1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gMiBzdWJzZXF1ZW50IElQQ3MuCisgICAgICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOcyA9IDEwMDAwMDA7IC8qIDFtcyAqLworCisgICAgLyoqCisgICAgICogVHJhY2sgYWxsIGJ1ZmZlcnMgaW4gYSBDMkZyYW1lRGF0YSBvYmplY3QuCisgICAgICoKKyAgICAgKiBpbnB1dCAoQzJGcmFtZURhdGEpIGhhcyB0aGUgZm9sbG93aW5nIHR3byBtZW1iZXJzIHRoYXQgYXJlIG9mIGludGVyZXN0OgorICAgICAqCisgICAgICogICBDMldvcmtPcmRpbmFsICAgICAgICAgICAgICAgIG9yZGluYWwKKyAgICAgKiAgIHZlY3RvcjxzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVycworICAgICAqCisgICAgICogQ2FsbGluZyByZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpIHdpbGwgcmVnaXN0ZXIgbXVsdGlwbGUKKyAgICAgKiB0cmlwbGVzIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHdoZXJlIGZyYW1lSW5kZXggaXMgZXF1YWwgdG8KKyAgICAgKiBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggYW5kIGJ1ZmZlckluZGV4IHJ1bnMgdGhyb3VnaCB0aGUgaW5kaWNlcyBvZgorICAgICAqIGlucHV0LmJ1ZmZlcnMgc3VjaCB0aGF0IGlucHV0LmJ1ZmZlcnNbYnVmZmVySW5kZXhdIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gcXVldWUoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciBvZiBkZWF0aCBub3RpZmljYXRpb25zLgorICAgICAqIFxwYXJhbSBpbnB1dCBJbnB1dCBmcmFtZSBkYXRhIHdob3NlIGlucHV0IGJ1ZmZlcnMgYXJlIHRvIGJlIHRyYWNrZWQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisKKyAgICAvKioKKyAgICAgKiBVbnRyYWNrIGFsbCBidWZmZXJzIGluIGEgQzJGcmFtZURhdGEgb2JqZWN0LgorICAgICAqCisgICAgICogQ2FsbGluZyB1bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCkgd2lsbCB1bnJlZ2lzdGVyIGFuZCByZW1vdmUKKyAgICAgKiBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgZm9yIGFsbCB0cmlwbGVzIChsLCBmaSwgYnVmZmVySW5kZXgpIHN1Y2ggdGhhdAorICAgICAqIGwgPSBsaXN0ZW5lciBhbmQgZmkgPSBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXguCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBvbldvcmtEb25lKCkgYW5kIGZsdXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgUHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICAgICAqIFxwYXJhbSBpbnB1dCBQcmV2aW91c2x5IHJlZ2lzdGVyZWQgZnJhbWUgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVW50cmFjayBhbGwgYnVmZmVycyBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgICogcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHN1Y2gKKyAgICAgKiB0aGF0IGwgPSBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLAorICAgICAqIGkuZS4sIHdoZW4gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaXN0ZW5lciBQcmV2aW91c2x5IHJlZ2lzdGVyZWQgbGlzdGVuZXIuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbm90aWZpY2F0aW9uIGludGVydmFsLgorICAgICAqCisgICAgICogXHBhcmFtIG5vdGlmaWNhdGlvbkludGVydmFsTnMgTmV3IG5vdGlmaWNhdGlvbiBpbnRlcnZhbCwgaW4gbmFub3NlY29uZHMuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIF9yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKyAgICB2b2lkIF91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworICAgIHZvaWQgX3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgdm9pZCBfc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKTsKKworICAgIC8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aWVkIHRvIEMyQnVmZmVyIG9iamVjdHMuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBzSW5zdGFuY2UgaXMgdGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcworICAgIC8vICAgICAgIGNsYXNzLgorICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisgICAgdm9pZCBfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKTsKKworICAgIC8vIFBlcnNpc3RlbnQgZGF0YSB0byBiZSBwYXNzZWQgYXMgImFyZyIgaW4gb25CdWZmZXJEZXN0cm95ZWQoKS4KKyAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSB0cmlwbGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgcGx1cyBhCisgICAgLy8gd2VhayBwb2ludGVyIHRvIHRoZSBDMkJ1ZmZlciBvYmplY3QuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlICJrZXkiIGlzIGJ1ZmZlckluZGV4IGFjY29yZGluZyB0byBvcGVyYXRvcjwoKS4gVGhpcyBpcworICAgIC8vIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBUcmFja2VkQnVmZmVyc01hcCBkZWZpbmVkIGJlbG93LgorICAgIHN0cnVjdCBUcmFja2VkQnVmZmVyIHsKKyAgICAgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4OworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgICAgIFRyYWNrZWRCdWZmZXIoY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgICA6IGxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgICAgICAgICAgICBmcmFtZUluZGV4KGZyYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4KGJ1ZmZlckluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXIoYnVmZmVyKSB7fQorICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IFRyYWNrZWRCdWZmZXImKSA9IGRlZmF1bHQ7CisgICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFRyYWNrZWRCdWZmZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVySW5kZXggPCBvdGhlci5idWZmZXJJbmRleDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXA6IGxpc3RlbmVyIC0+IGZyYW1lSW5kZXggLT4gc2V0PFRyYWNrZWRCdWZmZXI+LgorICAgIC8vIEVzc2VudGlhbGx5LCB0aGlzIGlzIHVzZWQgdG8gc3RvcmUgdHJpcGxlcyAobGlzdGVuZXIsIGZyYW1lSW5kZXgsCisgICAgLy8gYnVmZmVySW5kZXgpIHRoYXQncyBzZWFyY2hhYmxlIGJ5IGxpc3RlbmVyIGFuZCAobGlzdGVuZXIsIGZyYW1lSW5kZXgpLgorICAgIC8vIEhvd2V2ZXIsIHRoZSB2YWx1ZSBvZiB0aGUgaW5uZXJtb3N0IG1hcCBpcyBUcmFja2VkQnVmZmVyLCB3aGljaCBhbHNvCisgICAgLy8gY29udGFpbnMgYW4gZXh0cmEgY29weSBvZiBsaXN0ZW5lciBhbmQgZnJhbWVJbmRleC4gVGhpcyBpcyBuZWVkZWQKKyAgICAvLyBiZWNhdXNlIG9uQnVmZmVyRGVzdHJveWVkKCkgbmVlZHMgdG8ga25vdyBsaXN0ZW5lciBhbmQgZnJhbWVJbmRleCB0b28uCisgICAgdHlwZWRlZiBzdGQ6Om1hcDx3cDxJQ29tcG9uZW50TGlzdGVuZXI+LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4+IFRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gU3RvcmFnZSBmb3IgcGVuZGluZyAodW5zZW50KSBkZWF0aCBub3RpZmljYXRpb25zIGZvciBvbmUgbGlzdGVuZXIuCisgICAgLy8gRWFjaCBwYWlyIGluIG1lbWJlciBuYW1lZCAiaW5kaWNlcyIgYXJlIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgZnJvbQorICAgIC8vIHRoZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB0cmlwbGUuCisgICAgc3RydWN0IERlYXRoTm90aWZpY2F0aW9ucyB7CisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIuCisgICAgICAgIC8vIGNvdW50IG1heSBiZSAwLCBpbiB3aGljaCBjYXNlIHRoZSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IHdpbGwKKyAgICAgICAgLy8gcmVtYWluIHZhbGlkIGZvciBvbmx5IGEgc21hbGwgcGVyaW9kIChzcGVjaWZpZWQKKyAgICAgICAgLy8gbmFub3NlY29uZHMpLgorICAgICAgICBzaXplX3QgY291bnQ7CisKKyAgICAgICAgLy8gVGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgY2FsbGJhY2sgb24gdGhpcyBsaXN0ZW5lci4gVGhpcyBpcworICAgICAgICAvLyB1c2VkIHRvIGd1YXJhbnRlZSB0aGF0IGNhbGxiYWNrcyBkbyBub3Qgb2NjdXIgdG9vIGZyZXF1ZW50bHksIGFuZAorICAgICAgICAvLyBhbHNvIHRvIHRyaWdnZXIgZXhwaXJhdGlvbiBvZiBhIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3QgdGhhdCBoYXMKKyAgICAgICAgLy8gY291bnQgPSAwLgorICAgICAgICBuc2Vjc190IGxhc3RTZW50TnM7CisKKyAgICAgICAgLy8gTWFwOiBmcmFtZUluZGV4IC0+IHZlY3RvciBvZiBidWZmZXJJbmRpY2VzCisgICAgICAgIC8vIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBjb2xsZWN0aW9uIG9mIChmcmFtZGVJbmRleCwgYnVmZmVySW5kZXgpLgorICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjp2ZWN0b3I8c2l6ZV90Pj4gaW5kaWNlczsKKworICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgbnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zID0ga0RlZmF1bHROb3RpZmljYXRpb25JbnRlcnZhbE5zKQorICAgICAgICAgICAgICA6IGNvdW50KDApLAorICAgICAgICAgICAgICAgIGxhc3RTZW50TnMoc3lzdGVtVGltZSgpIC0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyksCisgICAgICAgICAgICAgICAgaW5kaWNlcygpIHt9CisgICAgfTsKKworICAgIC8vIFRoZSBtaW5pbXVtIHRpbWUgcGVyaW9kIGJldHdlZW4gSVBDIGNhbGxzIHRvIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IHRoZQorICAgIC8vIGRlc3RydWN0aW9uIG9mIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjphdG9taWM8bnNlY3NfdD4gbU5vdGlmaWNhdGlvbkludGVydmFsTnN7a0RlZmF1bHROb3RpZmljYXRpb25JbnRlcnZhbE5zfTsKKworICAgIC8vIE11dGV4IGZvciB0aGUgbWFuYWdlbWVudCBvZiBhbGwgaW5wdXQgYnVmZmVycy4KKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKworICAgIC8vIFRyYWNrZWQgaW5wdXQgYnVmZmVycy4KKyAgICBUcmFja2VkQnVmZmVyc01hcCBtVHJhY2tlZEJ1ZmZlcnNNYXA7CisKKyAgICAvLyBEZWF0aCBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQuCisgICAgLy8KKyAgICAvLyBBIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3QgaXMgYXNzb2NpYXRlZCB0byBlYWNoIGxpc3RlbmVyLiBBbiBlbnRyeSBpbgorICAgIC8vIHRoaXMgbWFwIHdpbGwgYmUgcmVtb3ZlZCBpZiBpdHMgYXNzb2NpYXRlZCBEZWF0aE5vdGlmaWNhdGlvbnMgaGFzIGNvdW50ID0KKyAgICAvLyAwIGFuZCBsYXN0U2VudE5zIDwgc3lzdGVtVGltZSgpIC0gbU5vdGlmaWNhdGlvbkludGVydmFsTnMuCisgICAgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwgRGVhdGhOb3RpZmljYXRpb25zPiBtRGVhdGhOb3RpZmljYXRpb25zOworCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIHNpZ25hbGVkIHdoZW4gYW4gZW50cnkgaXMgYWRkZWQgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtT25CdWZmZXJEZXN0cm95ZWQ7CisKKyAgICAvLyBOb3RpZnkgdGhlIGNsaWVudHMgYWJvdXQgYnVmZmVyIGRlc3RydWN0aW9ucy4KKyAgICAvLyBSZXR1cm4gZmFsc2UgaWYgYWxsIGRlc3RydWN0aW9ucyBoYXZlIGJlZW4gbm90aWZpZWQuCisgICAgLy8gUmV0dXJuIHRydWUgYW5kIHNldCB0aW1lVG9SZXRyeSB0byB0aGUgZHVyYXRpb24gdG8gd2FpdCBmb3IgYmVmb3JlCisgICAgLy8gcmV0cnlpbmcgaWYgc29tZSBkZXN0cnVjdGlvbnMgaGF2ZSBub3QgYmVlbiBub3RpZmllZC4KKyAgICBib29sIHByb2Nlc3NOb3RpZmljYXRpb25zKG5zZWNzX3QqIHRpbWVUb1JldHJ5TnMpOworCisgICAgLy8gTWFpbiBmdW5jdGlvbiBmb3IgdGhlIGlucHV0IGJ1ZmZlciBtYW5hZ2VyIHRocmVhZC4KKyAgICB2b2lkIG1haW4oKTsKKworICAgIC8vIFRoZSB0aHJlYWQgdGhhdCBtYW5hZ2VzIG5vdGlmaWNhdGlvbnMuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGxhc3Qgc28gaXRzIGluaXRpYWxpemF0aW9uIHdpbGwgaGFwcGVuCisgICAgLy8gYWZ0ZXIgYWxsIG90aGVyIG1lbWJlciB2YXJpYWJsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLgorICAgIHN0ZDo6dGhyZWFkIG1NYWluVGhyZWFkOworCisgICAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXIoKTsKKworICAgIC8vIFRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgc3RhdGljIElucHV0QnVmZmVyTWFuYWdlciYgZ2V0SW5zdGFuY2UoKTsKKworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8yLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFNpbmsuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSBHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGNsYXNzIEludGVyZmFjZTsKKyAgICBjbGFzcyBDb25maWd1cmFibGVJbnRmOworCisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK307CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThiNmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworLy8gQW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBjb25uZWN0cyBhbiBJbnB1dFN1cmZhY2UgdG8gYSBzaW5rLCB3aGljaCBtYXkgYmUgYW4KKy8vIElJbnB1dFNpbmsgb3IgYSBsb2NhbCBDMkNvbXBvbmVudC4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGNob29zaW5nIHRoZQorLy8gY29ycmVzcG9uZGluZyBjb25zdHJ1Y3Rvci4gVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgdHdvIGNhc2VzIGlzCisvLyB0aGF0IHdoZW4gYW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZQorLy8gY29tcG9uZW50IHRoYXQgcHJvY2Vzc2VzIHRoZSBidWZmZXJzLCBkYXRhIHBhcmNlbGluZyBpcyBub3QgbmVlZGVkLgorc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgYm9vbCBpbml0KCk7CisKKyAgICBmcmllbmQgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKworICAgIHN0ZDo6bXV0ZXggbUltcGxNdXRleDsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTI4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL3NhZmVfdW5pb24vMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDb25uZWN0aW9uSWQ7CisKKy8vIFR5cGVzIG9mIG1ldGFkYXRhIGZvciBCbG9ja3MuCitzdHJ1Y3QgQzJIaWRsX1JhbmdlIHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgbGVuZ3RoOyAvLyBEbyBub3QgdXNlICJzaXplIiBiZWNhdXNlIHRoZSBuYW1lIGNvbGxpZGVzIHdpdGggQzJJbmZvOjpzaXplKCkuCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JhbmdlLCAwPiBDMkhpZGxfUmFuZ2VJbmZvOworCitzdHJ1Y3QgQzJIaWRsX1JlY3QgeworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmVjdCwgMT4gQzJIaWRsX1JlY3RJbmZvOworCisvLyBNYWtlIGFzU3RyaW5nKCkgYW5kIG9wZXJhdG9yPDwgd29yayB3aXRoIFN0YXR1cyBhcyB3ZWxsIGFzIGMyX3N0YXR1c190LgorQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKFN0YXR1cyk7CisKKy8qKgorICogQWxsIG9iamNweSgpIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogY29udmVyc2lvbiBzdWNjZWVkcyBvciBub3QuCisgKi8KKworLy8gQzJTZXR0aW5nUmVzdWx0IC0+IFNldHRpbmdSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBTZXR0aW5nUmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMlNldHRpbmdSZXN1bHQmIHMpOworCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4qIGQsCisgICAgICAgIGNvbnN0IFNldHRpbmdSZXN1bHQmIHMpOworCisvLyBDMlBhcmFtRGVzY3JpcHRvciAtPiBQYXJhbURlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBQYXJhbURlc2NyaXB0b3IqIGQsCisgICAgICAgIGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yJiBzKTsKKworLy8gUGFyYW1EZXNjcmlwdG9yIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+KiBkLAorICAgICAgICBjb25zdCBQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgc3EsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQmIHNyKTsKKworLy8gQzJDb21wb25lbnQ6OlRyYWl0cyAtPiBDb21wb25lbnRUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyogZCwKKyAgICAgICAgY29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cyYgcyk7CisKKy8vIENvbXBvbmVudFRyYWl0cyAtPiBDMkNvbXBvbmVudDo6VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgQzJDb21wb25lbnQ6OlRyYWl0cyogZCwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpOworCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFN0cnVjdERlc2NyaXB0b3IqIGQsCisgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBBYnN0cmFjdCBjbGFzcyB0byBiZSB1c2VkIGluCisvLyBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KK3N0cnVjdCBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBSZXN1bHRTdGF0dXM7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2U7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6CisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSBCdWZmZXJQb29sRGF0YTsKKworICAgIC8qKgorICAgICAqIFNlbmQgYnBEYXRhIGFuZCByZXR1cm4gQnVmZmVyU3RhdHVzTWVzc2FnZSB0aGF0IGNhbiBiZSBzdXBwbGllZCB0bworICAgICAqIElDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKCkgaW4gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24KKyAgICAgKiBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gYnBEYXRhIEJ1ZmZlclBvb2xEYXRhIGlkZW50aWZ5aW5nIHRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKiBccGFyYW1bb3V0XSBicE1lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEluZm9ybWF0aW9uCisgICAgICogICAgaW5zaWRlIFxwIGJwTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBieSBzb21lCisgICAgICogICAgb3RoZXIgbWVhbnMgc28gaXQgY2FuIGNhbGwgcmVjZWl2ZSgpIHByb3Blcmx5LgorICAgICAqIFxyZXR1cm4gUmVzdWx0U3RhdHVzIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgIChTZWUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBSZXN1bHRTdGF0dXMgaW4KKyAgICAgKiAgICBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmhhbC4pCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgPSAwOworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbFNlbmRlcigpID0gZGVmYXVsdDsKK307CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlci4KKy8vCisvLyBUbyB1c2UgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIsIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nCisvLyBwcm9jZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBzZW5kKCkgY2FuIG9wZXJhdGUuIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIHdpbGwKKy8vIGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIGNhbGwKKy8vIElDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigpIHRvIGVzdGFibGlzaCB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uIHdoZW4KKy8vIHNlbmQoKSBpcyBjYWxsZWQuCitzdHJ1Y3QgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgOiBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyIENsaWVudE1hbmFnZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBJQ2xpZW50TWFuYWdlciBJQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgdm9pZCBzZXRSZWNlaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoKS4gc2VuZCgpIHdpbGwgZXN0YWJsaXNoIGEKKyAgICAvLyBidWZmZXJwb29sIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCB0aGVuIHNlbmQgdGhlIGJ1ZmZlcnBvb2wgZGF0YSBvdmVyIHRvCisgICAgLy8gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPENsaWVudE1hbmFnZXI+IG1TZW5kZXJNYW5hZ2VyOworICAgIHNwPElDbGllbnRNYW5hZ2VyPiBtUmVjZWl2ZXJNYW5hZ2VyOworICAgIGludDY0X3QgbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbVNvdXJjZUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1MYXN0U2VudDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBtUmVmcmVzaEludGVydmFsOworfTsKKworLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlCisvLyBOb3RlOiBJZiBidWZmZXJwb29sIHdpbGwgYmUgdXNlZCwgYnBTZW5kZXIgbXVzdCBub3QgYmUgbnVsbC4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBXb3JrQnVuZGxlKiBkLAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBicFNlbmRlciA9IG51bGxwdHIpOworCisvLyBXb3JrQnVuZGxlIC0+IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLAorICAgICAgICBjb25zdCBXb3JrQnVuZGxlJiBzKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgcmV0dXJucyBDMlBhcmFtIHBvaW50ZXJzIHRvIGl0cyBwYXJhbXMuIFRoZSBwb2ludGVycworICogcG9pbnQgdG8gbG9jYXRpb25zIGluc2lkZSB0aGUgdW5kZXJseWluZyBidWZmZXIgb2YgXHAgYmxvYi4gSWYgXHAgYmxvYiBpcworICogZGVzdHJveWVkLCB0aGUgcG9pbnRlcnMgYmVjb21lIGludmFsaWQuCisgKgorICogXHBhcmFtW291dF0gcGFyYW1zIHRhcmdldCB2ZWN0b3Igb2YgQzJQYXJhbSBwb2ludGVycworICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHBhcnNlUGFyYW1zQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICpwYXJhbXMsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZibG9iKTsKKworLyoqCisgKiBDb25jYXRlbmF0ZXMgYSBsaXN0IG9mIEMyUGFyYW1zIGludG8gYSBwYXJhbXMgYmxvYi4KKyAqCisgKiBccGFyYW1bb3V0XSBibG9iIHRhcmdldCBibG9iCisgKiBccGFyYW1baW5dIHBhcmFtcyBwYXJhbWV0ZXJzIHRvIGNvbmNhdGVuYXRlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIGZhbHNlIGlmIHRoZSBibG9iIHdhcyBub3Qgc3VjY2Vzc2Z1bCAodGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlCisgKiAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7Citib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcyk7Citib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAmcGFyYW1zKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgY3JlYXRlIGEgdmVjdG9yIG9mIEMyUGFyYW1zIHdob3NlIG1lbWJlcnMgYXJlIGNvcGllcworICogb2YgdGhlIHBhcmFtcyBpbiB0aGUgYmxvYi4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyBjb25zdHJ1Y3RlZAorICogXHJldHZhbCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgYXBwbGllcyB1cGRhdGVzIHRvIHBhcmFtcy4KKyAqCisgKiBccGFyYW1baW4sb3V0XSBwYXJhbXMgcGFyYW1zIHRvIGJlIHVwZGF0ZWQKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiBjb250YWluaW5nIHVwZGF0ZXMKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgdXBkYXRlZAorICogXHJldHZhbCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCB1cGRhdGVQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgIGNvbnN0IFBhcmFtcyYgYmxvYik7CisKKy8qKgorICogQ29udmVydHMgYSBCdWZmZXJQb29sIHN0YXR1cyB2YWx1ZSB0byBjMl9zdGF0dXNfdC4KKyAqIFxwYXJhbSBCdWZmZXJQb29sIHN0YXR1cworICogXHJldHVybiBDb3JyZXNwb25kaW5nIGMyX3N0YXR1c190CisgKi8KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICBSZXN1bHRTdGF0dXMgcnMpOworCisvLyBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9jayBPcGVyYXRpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIENhbGwgYmVmb3JlIHRyYW5zZmVycmluZyBibG9jayB0byBvdGhlciBwcm9jZXNzZXMuCisvLworLy8gVGhlIGdpdmVuIGJsb2NrIGlzIHJlYWR5IHRvIHRyYW5zZmVyIHRvIG90aGVyIHByb2Nlc3Nlcy4gVGhpcyB3aWxsIGd1YXJhbnRlZQorLy8gdGhlIGdpdmVuIGJsb2NrIGRhdGEgaXMgbm90IG11dGF0ZWQgYnkgYnVmZmVycXVldWUgbWlncmF0aW9uLgorYm9vbCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CisKKy8vIENhbGwgYmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBibG9ja3MgaW4gdGhlIGdpdmVuIHdvcmtMaXN0LgorLy8gcHJvY2Vzc0lucHV0IGRldGVybWluZXMgd2hldGhlciBpbnB1dCBibG9ja3MgYXJlIHlpZWxkZWQuIHByb2Nlc3NPdXRwdXQKKy8vIHdvcmtzIHNpbWlsYXJseSBvbiBvdXRwdXQgYmxvY2tzLiAoVGhlIGRlZmF1bHQgdmFsdWUgb2YgcHJvY2Vzc0lucHV0IGlzCisvLyBmYWxzZSB3aGlsZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzT3V0cHV0IGlzIHRydWUuIFRoaXMgaW1wbGllcyB0aGF0IGluCisvLyBtb3N0IGNhc2VzLCBvbmx5IG91dHB1dCBidWZmZXJzIGNvbnRhaW4gYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzLikKK3ZvaWQgYmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQgPSBmYWxzZSwKKyAgICAgICAgYm9vbCBwcm9jZXNzT3V0cHV0ID0gdHJ1ZSk7CisKKy8vIENhbGwgYWZ0ZXIgdHJhbnNmZXJyaW5nIGJsb2NrIGlzIGZpbmlzaGVkIGFuZCBtYWtlIHN1cmUgdGhhdAorLy8gYmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2soKSBpcyBjYWxsZWQgYmVmb3JlLgorLy8KKy8vIFRoZSB0cmFuc2ZlciBvZiBnaXZlbiBibG9jayBpcyBmaW5pc2hlZC4gSWYgdHJhbnNmZXIgaXMgc3VjY2Vzc2Z1bCB0aGUgZ2l2ZW4KKy8vIGJsb2NrIGlzIG5vdCBvd25lZCBieSBwcm9jZXNzIGFueW1vcmUuIFNpbmNlIHRyYW5zZmVyIGlzIGZpbmlzaGVkIHRoZSBnaXZlbgorLy8gYmxvY2sgZGF0YSBpcyBPSyB0byBtdXRhdGUgYnkgYnVmZmVycXVldWUgbWlncmF0aW9uIGFmdGVyIHRoaXMgY2FsbC4KK2Jvb2wgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0cmFuc2Zlcik7CisKKy8vIENhbGwgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrKCkgb24gYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKy8vIHByb2Nlc3NJbnB1dCBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXQgYmxvY2tzIGFyZSB5aWVsZGVkLiBwcm9jZXNzT3V0cHV0CisvLyB3b3JrcyBzaW1pbGFybHkgb24gb3V0cHV0IGJsb2Nrcy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb2Nlc3NJbnB1dCBpcworLy8gZmFsc2Ugd2hpbGUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcHJvY2Vzc091dHB1dCBpcyB0cnVlLiBUaGlzIGltcGxpZXMgdGhhdCBpbgorLy8gbW9zdCBjYXNlcywgb25seSBvdXRwdXQgYnVmZmVycyBjb250YWluIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2Nrcy4pCit2b2lkIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICBib29sIHRyYW5zZmVyLAorICAgICAgICBib29sIHByb2Nlc3NJbnB1dCA9IGZhbHNlLAorICAgICAgICBib29sIHByb2Nlc3NPdXRwdXQgPSB0cnVlKTsKKworLy8gVGhlIGdpdmVuIGJsb2NrIGlzIHJlYWR5IHRvIGJlIHJlbmRlcmVkLiB0aGUgZ2l2ZW4gYmxvY2sgaXMgbm90IG93bmVkIGJ5CisvLyBwcm9jZXNzIGFueW1vcmUuIElmIG1pZ3JhdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhpcyByZXR1cm5zIGZhbHNlIGluIG9yZGVyCisvLyBub3QgdG8gcmVuZGVyLgorYm9vbCBkaXNwbGF5QnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RiZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMCwwICsxLDE4MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+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+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyUG9vbERhdGEgdW5hdmFpbGFibGUgaW4gYSBibG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgfQorICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRToKKyAgICAgICAgdWludDMyX3QgZ2VuOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICBpbnQzMl90IGJxU2xvdDsKKyAgICAgICAgLy8gVXBkYXRlIGhhbmRsZSBpZiBtaWdyYXRpb24gaGFwcGVuZWQuCisgICAgICAgIGlmIChfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgICAgICBibG9ja1Bvb2xEYXRhLCAmZ2VuLCAmYnFJZCwgJmJxU2xvdCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6Ok1pZ3JhdGVOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSksIGdlbiwgYnFJZCwgYnFTbG90KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2FkZEJhc2VCbG9jaygKKyAgICAgICAgICAgICAgICBpbmRleCwgaGFuZGxlLAorICAgICAgICAgICAgICAgIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gQzJCbG9ja1Bvb2xEYXRhIHR5cGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLy8gQzJGZW5jZSAtPiBoaWRsX2hhbmRsZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorYm9vbCBvYmpjcHkoaGlkbF9oYW5kbGUqIGQsIGNvbnN0IEMyRmVuY2UmIHMpIHsKKyAgICAodm9pZClzOyAvLyBUT0RPOiBpbXBsZW1lbnQgcy5mZCgpCisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBkLT5zZXRUbyhudWxscHRyKTsKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgICAgIGlmICghaGFuZGxlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgbmF0aXZlIGhhbmRsZS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZlbmNlRmQ7CisgICAgICAgIGQtPnNldFRvKGhhbmRsZSwgdHJ1ZSAvKiBvd25zICovKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyQ29uc3RMaW5lYXJCbG9jayAtPiBCbG9jaworLy8gTm90ZTogTmF0aXZlIGhhbmRsZXMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgaGFuZGxlcyBtdXN0IG5vdCBiZQorLy8gY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKHMpOworICAgIGlmICghYWRkQmFzZUJsb2NrKCZkLT5pbmRleCwgcy5oYW5kbGUoKSwgYnBEYXRhLAorICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBibG9jayBkYXRhIGluIEMyQ29uc3RMaW5lYXJCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBtZXRhZGF0YS4KKyAgICBDMkhpZGxfUmFuZ2VJbmZvIGRSYW5nZUluZm87CisgICAgZFJhbmdlSW5mby5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5vZmZzZXQoKSk7CisgICAgZFJhbmdlSW5mby5sZW5ndGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5zaXplKCkpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJhbmdlSW5mbyB9KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJhbmdlIGluZm8gaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIGlmICghb2JqY3B5KCZkLT5mZW5jZSwgcy5mZW5jZSgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQ29uc3RMaW5lYXJCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdEdyYXBoaWNCbG9jayAtPiBCbG9jaworLy8gTm90ZTogTmF0aXZlIGhhbmRsZXMgYXJlIG5vdCBkdXBsaWNhdGVkLiBUaGUgb3JpZ2luYWwgaGFuZGxlcyBtdXN0IG5vdCBiZQorLy8gY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gYnBEYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdEdyYXBoaWNCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBtZXRhZGF0YS4KKyAgICBDMkhpZGxfUmVjdEluZm8gZFJlY3RJbmZvOworICAgIEMyUmVjdCBzUmVjdCA9IHMuY3JvcCgpOworICAgIGRSZWN0SW5mby5sZWZ0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LmxlZnQpOworICAgIGRSZWN0SW5mby50b3AgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QudG9wKTsKKyAgICBkUmVjdEluZm8ud2lkdGggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3Qud2lkdGgpOworICAgIGRSZWN0SW5mby5oZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QuaGVpZ2h0KTsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmQtPm1ldGEsIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSZWN0SW5mbyB9KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJlY3QgaW5mbyBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIGlmICghb2JqY3B5KCZkLT5mZW5jZSwgcy5mZW5jZSgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQ29uc3RHcmFwaGljQmxvY2s6OmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyQnVmZmVyRGF0YSAtPiBCdWZmZXIKKy8vIFRoaXMgZnVuY3Rpb24gb25seSBmaWxscyBpbiBkLT5ibG9ja3MuCitib29sIG9iamNweShCdWZmZXIqIGQsIGNvbnN0IEMyQnVmZmVyRGF0YSYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBkLT5ibG9ja3MucmVzaXplKAorICAgICAgICAgICAgcy5saW5lYXJCbG9ja3MoKS5zaXplKCkgKworICAgICAgICAgICAgcy5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIGxpbmVhckJsb2NrIDogcy5saW5lYXJCbG9ja3MoKSkgeworICAgICAgICBCbG9jayYgZEJsb2NrID0gZC0+YmxvY2tzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGxpbmVhckJsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6bGluZWFyQmxvY2tzLiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoRGVzdGluYXRpb24gaW5kZXggPSAiIDw8IGkgLSAxIDw8ICIuKSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBncmFwaGljQmxvY2sgOiBzLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICBCbG9jayYgZEJsb2NrID0gZC0+YmxvY2tzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGdyYXBoaWNCbG9jaywKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlckRhdGE6OmdyYXBoaWNCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXIgLT4gQnVmZmVyCitib29sIG9iamNweShCdWZmZXIqIGQsIGNvbnN0IEMyQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+aW5mbywgcy5pbmZvKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW9iamNweShkLCBzLmRhdGEoKSwgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6ZGF0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkluZm9CdWZmZXIgLT4gSW5mb0J1ZmZlcgorYm9vbCBvYmpjcHkoSW5mb0J1ZmZlciogZCwgY29uc3QgQzJJbmZvQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIC8vIFRPRE86IEMySW5mb0J1ZmZlciBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgKHZvaWQpZDsKKyAgICAodm9pZClzOworICAgICh2b2lkKWJ1ZmZlclBvb2xTZW5kZXI7CisgICAgKHZvaWQpYmFzZUJsb2NrczsKKyAgICAodm9pZCliYXNlQmxvY2tJbmRpY2VzOworICAgIExPRyhJTkZPKSA8PCAiSW5mb0J1ZmZlciBub3QgaW1wbGVtZW50ZWQuIjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGcmFtZURhdGEgLT4gRnJhbWVEYXRhCitib29sIG9iamNweShGcmFtZURhdGEqIGQsIGNvbnN0IEMyRnJhbWVEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGcmFtZURhdGE6OkZsYWdzPj4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6b3JkaW5hbC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZC0+YnVmZmVycy5yZXNpemUocy5idWZmZXJzLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc0J1ZmZlciA6IHMuYnVmZmVycykgeworICAgICAgICBCdWZmZXImIGRCdWZmZXIgPSBkLT5idWZmZXJzW2krK107CisgICAgICAgIGlmICghc0J1ZmZlcikgeworICAgICAgICAgICAgLy8gQSBudWxsIChwb2ludGVyIHRvKSBDMkJ1ZmZlciBjb3JyZXNwb25kcyB0byBhIEJ1ZmZlciB3aXRoIGVtcHR5CisgICAgICAgICAgICAvLyBpbmZvIGFuZCBibG9ja3MuCisgICAgICAgICAgICBkQnVmZmVyLmluZm8ucmVzaXplKDApOworICAgICAgICAgICAgZEJ1ZmZlci5ibG9ja3MucmVzaXplKDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCdWZmZXIsICpzQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpidWZmZXJzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+Y29uZmlnVXBkYXRlLCBzLmNvbmZpZ1VwZGF0ZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5pbmZvQnVmZmVycy5yZXNpemUocy5pbmZvQnVmZmVycy5zaXplKCkpOworICAgIGkgPSAwOworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4mIHNJbmZvQnVmZmVyIDogcy5pbmZvQnVmZmVycykgeworICAgICAgICBJbmZvQnVmZmVyJiBkSW5mb0J1ZmZlciA9IGQtPmluZm9CdWZmZXJzW2krK107CisgICAgICAgIGlmICghc0luZm9CdWZmZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgQzJGcmFtZURhdGE6OmluZm9CdWZmZXJzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgmZEluZm9CdWZmZXIsICpzSW5mb0J1ZmZlciwKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIncyBpbXBsZW1lbnRhdGlvbgorCitEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpCisgICAgOiBtUmVjZWl2ZXJNYW5hZ2VyKHJlY2VpdmVyTWFuYWdlciksCisgICAgICBtU291cmNlQ29ubmVjdGlvbklkKDApLAorICAgICAgbUxhc3RTZW50KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSwKKyAgICAgIG1SZWZyZXNoSW50ZXJ2YWwocmVmcmVzaEludGVydmFsKSB7Cit9CisKK3ZvaWQgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNldFJlY2VpdmVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobVJlY2VpdmVyTWFuYWdlciAhPSByZWNlaXZlck1hbmFnZXIpIHsKKyAgICAgICAgbVJlY2VpdmVyTWFuYWdlciA9IHJlY2VpdmVyTWFuYWdlcjsKKyAgICB9CisgICAgbVJlZnJlc2hJbnRlcnZhbCA9IHJlZnJlc2hJbnRlcnZhbDsKK30KKworUmVzdWx0U3RhdHVzIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpzZW5kKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgeworICAgIGlmICghbVJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBhY2Nlc3MgdG8gcmVjZWl2ZXIncyBCdWZmZXJQb29sLiI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICBtU2VuZGVyTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICghbVNlbmRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZXRyaWV2ZSBsb2NhbCBCdWZmZXJQb29sIENsaWVudE1hbmFnZXIuIjsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIGludDY0X3QgY29ubmVjdGlvbklkID0gYnBEYXRhLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbm93ID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGludGVydmFsID0gbm93IC0gbUxhc3RTZW50OworICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDAgfHwKKyAgICAgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgIT0gY29ubmVjdGlvbklkIHx8CisgICAgICAgICAgICBpbnRlcnZhbCA+IG1SZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uLgorICAgICAgICBtU291cmNlQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBpZiAobVNvdXJjZUNvbm5lY3Rpb25JZCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgcmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1SZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2VpdmVyQ29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSAmJiAocnMgIT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUykpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicmVnaXN0ZXJTZW5kZXIgLS0gcmV0dXJuZWQgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjZWl2ZXJDb25uZWN0aW9uSWQgPSByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICBycyA9IG1TZW5kZXJNYW5hZ2VyLT5wb3N0U2VuZCgKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCwgYnBEYXRhLCAmdHJhbnNhY3Rpb25JZCwgJnRpbWVzdGFtcFVzKTsKKyAgICBpZiAocnMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHJzOworICAgIH0KKyAgICBpZiAoIWJwTWVzc2FnZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJOdWxsIG91dHB1dCBwYXJhbWV0ZXIgZm9yIEJ1ZmZlclN0YXR1c01lc3NhZ2UuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGJwTWVzc2FnZS0+Y29ubmVjdGlvbklkID0gbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGJwTWVzc2FnZS0+YnVmZmVySWQgPSBicERhdGEtPm1JZDsKKyAgICBicE1lc3NhZ2UtPnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIGJwTWVzc2FnZS0+dGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICBtTGFzdFNlbnQgPSBub3c7CisgICAgcmV0dXJuIHJzOworfQorCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKK2Jvb2wgb2JqY3B5KAorICAgICAgICBXb3JrQnVuZGxlKiBkLAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyKSB7CisgICAgLy8gYmFzZUJsb2NrcyBob2xkcyBhIGxpc3Qgb2YgQmFzZUJsb2NrIG9iamVjdHMgdGhhdCBCbG9ja3MgY2FuIHJlZmVyIHRvLgorICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+IGJhc2VCbG9ja3M7CisKKyAgICAvLyBiYXNlQmxvY2tJbmRpY2VzIG1hcHMgYSByYXcgcG9pbnRlciB0byBuYXRpdmVfaGFuZGxlX3Qgb3IgQnVmZmVyUG9vbERhdGEKKyAgICAvLyBpbnNpZGUgYmFzZUJsb2NrcyB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIGJhc2VCbG9ja3MuIFRoZSBrZXlzCisgICAgLy8gKHBvaW50ZXJzKSBhcmUgdXNlZCB0byBpZGVudGlmeSBibG9ja3MgdGhhdCBoYXZlIHRoZSBzYW1lICJiYXNlIGJsb2NrIiBpbgorICAgIC8vIHMsIGEgbGlzdCBvZiBDMldvcmsgb2JqZWN0cy4gQmVjYXVzZSBiYXNlQmxvY2tzIHdpbGwgYmUgY29waWVkIGludG8gYQorICAgIC8vIGhpZGxfdmVjIGV2ZW50dWFsbHksIHRoZSB2YWx1ZXMgb2YgYmFzZUJsb2NrSW5kaWNlcyBhcmUgemVyby1iYXNlZAorICAgIC8vIGludGVnZXIgaW5kaWNlcyBpbnN0ZWFkIG9mIGxpc3QgaXRlcmF0b3JzLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwb2ludGVycyBjYW4gYmUgcmF3IGJlY2F1c2UgYmFzZUJsb2NrSW5kaWNlcyBoYXMgYSBzaG9ydGVyCisgICAgLy8gbGlmZXNwYW4gdGhhbiBhbGwgb2YgYmFzZSBibG9ja3MuCisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiBiYXNlQmxvY2tJbmRpY2VzOworCisgICAgZC0+d29ya3MucmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgc1dvcmsgOiBzKSB7CisgICAgICAgIFdvcmsgJmRXb3JrID0gZC0+d29ya3NbaSsrXTsKKyAgICAgICAgaWYgKCFzV29yaykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJOdWxsIEMyV29yayBlbmNvdW50ZXJlZC4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGFpbiBpbmZvIGlzIG5vdCBpbiB1c2UgY3VycmVudGx5LgorCisgICAgICAgIC8vIGlucHV0CisgICAgICAgIGlmICghb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmstPmlucHV0LAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJXb3JrOjppbnB1dC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHMKKyAgICAgICAgaWYgKHNXb3JrLT53b3JrbGV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiV29yayB3aXRoIG5vIHdvcmtsZXRzLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJjZWwgdGhlIHdvcmtsZXRzLgorICAgICAgICAgICAgaGlkbF92ZWM8V29ya2xldD4gJmRXb3JrbGV0cyA9IGRXb3JrLndvcmtsZXRzOworICAgICAgICAgICAgZFdvcmtsZXRzLnJlc2l6ZShzV29yay0+d29ya2xldHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4mIHNXb3JrbGV0IDogc1dvcmstPndvcmtsZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc1dvcmtsZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJOdWxsIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgV29ya2xldCAmZFdvcmtsZXQgPSBkV29ya2xldHNbaisrXTsKKworICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpZAorICAgICAgICAgICAgICAgIGRXb3JrbGV0LmNvbXBvbmVudElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmNvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkV29ya2xldC50dW5pbmdzLCBzV29ya2xldC0+dHVuaW5ncykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+dHVuaW5ncy4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmFpbHVyZXMKKyAgICAgICAgICAgICAgICBkV29ya2xldC5mYWlsdXJlcy5yZXNpemUoc1dvcmtsZXQtPmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGsgPSAwOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4mIHNGYWlsdXJlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNXb3JrbGV0LT5mYWlsdXJlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNGYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPmZhaWx1cmVzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQuZmFpbHVyZXNbaysrXSwgKnNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPmZhaWx1cmVzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgayAtIDEgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG91dHB1dAorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5vdXRwdXQsIHNXb3JrbGV0LT5vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCAmYmFzZUJsb2NrcywgJmJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaiAtIDEgPDwgIl0tPm91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHMgcHJvY2Vzc2VkCisgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gc1dvcmstPndvcmtsZXRzUHJvY2Vzc2VkOworCisgICAgICAgIC8vIHJlc3VsdAorICAgICAgICBkV29yay5yZXN1bHQgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHNXb3JrLT5yZXN1bHQpOworICAgIH0KKworICAgIC8vIENvcHkgc3RkOjpsaXN0PEJhc2VCbG9jaz4gdG8gaGlkbF92ZWM8QmFzZUJsb2NrPi4KKyAgICB7CisgICAgICAgIGQtPmJhc2VCbG9ja3MucmVzaXplKGJhc2VCbG9ja3Muc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKGNvbnN0IEJhc2VCbG9jayYgYmFzZUJsb2NrIDogYmFzZUJsb2NrcykgeworICAgICAgICAgICAgZC0+YmFzZUJsb2Nrc1tpKytdID0gYmFzZUJsb2NrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEMyQmFzZUJsb2NrIHsKKyAgICBlbnVtIHR5cGVfdCB7CisgICAgICAgIExJTkVBUiwKKyAgICAgICAgR1JBUEhJQywKKyAgICB9OworICAgIHR5cGVfdCB0eXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljOworfTsKKworLy8gaGlkbF9oYW5kbGUgLT4gQzJGZW5jZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorYm9vbCBvYmpjcHkoQzJGZW5jZSogZCwgY29uc3QgaGlkbF9oYW5kbGUmIHMpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQuCisgICAgKHZvaWQpczsKKyAgICAqZCA9IEMyRmVuY2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJMaW5lYXJCbG9jaywgdmVjdG9yPEMyUGFyYW0qPiwgQzJGZW5jZSAtPiBDMkJ1ZmZlcgorYm9vbCBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SYW5nZUluZm8uCisgICAgaWYgKChtZXRhLnNpemUoKSAhPSAxKSB8fCAhbWV0YVswXSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyTGluZWFyQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmFuZ2VJbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJhbmdlIGluZm8gaW4gQzJMaW5lYXJCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEMySGlkbF9SYW5nZUluZm8gKnJhbmdlSW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SYW5nZUluZm8qPihtZXRhWzBdKTsKKworICAgIC8vIENyZWF0ZSBDMkJ1ZmZlciBmcm9tIEMyTGluZWFyQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgcmFuZ2VJbmZvLT5vZmZzZXQsIHJhbmdlSW5mby0+bGVuZ3RoLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVMaW5lYXJCdWZmZXIgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyR3JhcGhpY0Jsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiYgYmxvY2ssCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgbWV0YSwKKyAgICAgICAgY29uc3QgQzJGZW5jZSYgZmVuY2UpIHsKKyAgICAvLyBDaGVjayB0aGUgYmxvY2sgbWV0YS4gSXQgc2hvdWxkIGhhdmUgZXhhY3RseSAxIEMySW5mbzoKKyAgICAvLyBDMkhpZGxfUmVjdEluZm8uCisgICAgaWYgKChtZXRhLnNpemUoKSAhPSAxKSB8fCAhbWV0YVswXSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyR3JhcGhpY0Jsb2NrOjptZXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1ldGFbMF0tPnNpemUoKSAhPSBzaXplb2YoQzJIaWRsX1JlY3RJbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHJlY3QgaW5mbyBpbiBDMkdyYXBoaWNCbG9jay4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEMySGlkbF9SZWN0SW5mbyAqcmVjdEluZm8gPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDMkhpZGxfUmVjdEluZm8qPihtZXRhWzBdKTsKKworICAgIC8vIENyZWF0ZSBDMkJ1ZmZlciBmcm9tIEMyR3JhcGhpY0Jsb2NrLgorICAgICpidWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICBDMlJlY3QocmVjdEluZm8tPndpZHRoLCByZWN0SW5mby0+aGVpZ2h0KS4KKyAgICAgICAgICAgIGF0KHJlY3RJbmZvLT5sZWZ0LCByZWN0SW5mby0+dG9wKSwKKyAgICAgICAgICAgIGZlbmNlKSk7CisgICAgaWYgKCEoKmJ1ZmZlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3JlYXRlR3JhcGhpY0J1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQnVmZmVyIC0+IEMyQnVmZmVyCisvLyBOb3RlOiBUaGUgbmF0aXZlIGhhbmRsZXMgd2lsbCBiZSBjbG9uZWQuCitib29sIG9iamNweShzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KiBkLCBjb25zdCBCdWZmZXImIHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgeworICAgICpkID0gbnVsbHB0cjsKKworICAgIC8vIEN1cnJlbnRseSwgYSBub24tbnVsbCBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLgorICAgIGlmIChzLmJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHMuYmxvY2tzLnNpemUoKSAhPSAxKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgIkN1cnJlbnRseSwgYSBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBCbG9jayAmc0Jsb2NrID0gcy5ibG9ja3NbMF07CisgICAgaWYgKHNCbG9jay5pbmRleCA+PSBiYXNlQmxvY2tzLnNpemUoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmluZGV4OiAiCisgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGluZGV4IG91dCBvZiByYW5nZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyQmFzZUJsb2NrICZiYXNlQmxvY2sgPSBiYXNlQmxvY2tzW3NCbG9jay5pbmRleF07CisKKyAgICAvLyBQYXJzZSBtZXRhLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzQmxvY2tNZXRhOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZzQmxvY2tNZXRhLCBzQmxvY2subWV0YSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6OmJsb2Nrc1swXS5tZXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb3B5IGZlbmNlLgorICAgIEMyRmVuY2UgZEZlbmNlOworICAgIGlmICghb2JqY3B5KCZkRmVuY2UsIHNCbG9jay5mZW5jZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6OmJsb2Nrc1swXS5mZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0IGEgYmxvY2suCisgICAgc3dpdGNoIChiYXNlQmxvY2sudHlwZSkgeworICAgIGNhc2UgQzJCYXNlQmxvY2s6OkxJTkVBUjoKKyAgICAgICAgaWYgKCFjcmVhdGVMaW5lYXJCdWZmZXIoZCwgYmFzZUJsb2NrLmxpbmVhciwgc0Jsb2NrTWV0YSwgZEZlbmNlKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJhc2VCbG9jazo6bGluZWFyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6R1JBUEhJQzoKKyAgICAgICAgaWYgKCFjcmVhdGVHcmFwaGljQnVmZmVyKGQsIGJhc2VCbG9jay5ncmFwaGljLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpncmFwaGljLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJhc2VCbG9jazo6dHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUGFyc2UgaW5mbworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5pbmZvKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoQzJQYXJhbSogcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgcGFyYW0gaW4gQnVmZmVyOjppbmZvLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGMycGFyYW17CisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW0pLnJlbGVhc2UoKX07CisgICAgICAgIGlmICghYzJwYXJhbSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICgqZCktPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oYzJwYXJhbSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDMkJ1ZmZlcjo6c2V0SW5mbyBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBGcmFtZURhdGEgLT4gQzJGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEMyRnJhbWVEYXRhKiBkLCBjb25zdCBGcmFtZURhdGEmIHMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiYgYmFzZUJsb2NrcykgeworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8QzJGcmFtZURhdGE6OmZsYWdzX3Q+KHMuZmxhZ3MpOworICAgIGlmICghb2JqY3B5KCZkLT5vcmRpbmFsLCBzLm9yZGluYWwpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+YnVmZmVycy5jbGVhcigpOworICAgIGQtPmJ1ZmZlcnMucmVzZXJ2ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IEJ1ZmZlciYgc0J1ZmZlciA6IHMuYnVmZmVycykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGRCdWZmZXI7CisgICAgICAgIGlmICghb2JqY3B5KCZkQnVmZmVyLCBzQnVmZmVyLCBiYXNlQmxvY2tzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6OmJ1ZmZlcnMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkLT5idWZmZXJzLmVtcGxhY2VfYmFjayhkQnVmZmVyKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbXMsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBkLT5jb25maWdVcGRhdGUuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgIGlmICghZC0+Y29uZmlnVXBkYXRlLmJhY2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBlcnJvciB3aGlsZSBwYXJzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lRGF0YTo6Y29uZmlnVXBkYXRlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbmNlIEMySW5mb0J1ZmZlciBoYXMgY29uc3RydWN0b3JzLgorICAgIGQtPmluZm9CdWZmZXJzLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEJhc2VCbG9jayAtPiBDMkJhc2VCbG9jaworYm9vbCBvYmpjcHkoQzJCYXNlQmxvY2sqIGQsIGNvbnN0IEJhc2VCbG9jayYgcykgeworICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICBjYXNlIEJhc2VCbG9jazo6aGlkbF9kaXNjcmltaW5hdG9yOjpuYXRpdmVCbG9jazogeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBzSGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9uZShzLm5hdGl2ZUJsb2NrKCkpOworICAgICAgICAgICAgaWYgKHNIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgQmFzZUJsb2NrOjpuYXRpdmVCbG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpzQzJIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEMySGFuZGxlKj4oc0hhbmRsZSk7CisKKyAgICAgICAgICAgIGQtPmxpbmVhciA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5saW5lYXIpIHsKKyAgICAgICAgICAgICAgICBkLT50eXBlID0gQzJCYXNlQmxvY2s6OkxJTkVBUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+Z3JhcGhpYyA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKHNDMkhhbmRsZSk7CisgICAgICAgICAgICBpZiAoZC0+Z3JhcGhpYykgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6R1JBUEhJQzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBoYW5kbGUgdHlwZSBpbiBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2Uoc0hhbmRsZSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc0hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICBjYXNlIEJhc2VCbG9jazo6aGlkbF9kaXNjcmltaW5hdG9yOjpwb29sZWRCbG9jazogeworICAgICAgICAgICAgY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmYnBNZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgcy5wb29sZWRCbG9jaygpOworICAgICAgICAgICAgc3A8Q2xpZW50TWFuYWdlcj4gYnAgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGE7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGU7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBicC0+cmVjZWl2ZSgKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGJwTWVzc2FnZS5idWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAmY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJwRGF0YSk7CisgICAgICAgICAgICBpZiAoYnBTdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWNlaXZlIGJ1ZmZlciBmcm9tIGJ1ZmZlcnBvb2wgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdFN0YXR1cyA9ICIgPDwgdW5kZXJseWluZ192YWx1ZShicFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFicERhdGEpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkYXRhIGluIGJ1ZmZlcnBvb2wgdHJhbnNhY3Rpb24uIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGQtPmxpbmVhciA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5saW5lYXIpIHsKKyAgICAgICAgICAgICAgICBkLT50eXBlID0gQzJCYXNlQmxvY2s6OkxJTkVBUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+Z3JhcGhpYyA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGNIYW5kbGUsIGJwRGF0YSk7CisgICAgICAgICAgICBpZiAoZC0+Z3JhcGhpYykgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6R1JBUEhJQzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBoYW5kbGUgdHlwZSBpbiBCYXNlQmxvY2s6OnBvb2xlZEJsb2NrLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJVbnJlY29nbml6ZWQgQmFzZUJsb2NrJ3MgZGlzY3JpbWluYXRvciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICA8PCAidW5kZXJseWluZyB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgPDwgdW5kZXJseWluZ192YWx1ZShzLmdldERpc2NyaW1pbmF0b3IoKSkgPDwgIi4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogZCwgY29uc3QgV29ya0J1bmRsZSYgcykgeworICAgIC8vIENvbnZlcnQgQmFzZUJsb2NrcyB0byBDMkJhc2VCbG9ja3MuCisgICAgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+IGRCYXNlQmxvY2tzKHMuYmFzZUJsb2Nrcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy5iYXNlQmxvY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZkQmFzZUJsb2Nrc1tpXSwgcy5iYXNlQmxvY2tzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrQnVuZGxlOjpiYXNlQmxvY2tzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+Y2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IFdvcmsmIHNXb3JrIDogcy53b3JrcykgeworICAgICAgICBkLT5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCkpOworICAgICAgICBDMldvcmsmIGRXb3JrID0gKmQtPmJhY2soKTsKKworICAgICAgICAvLyBjaGFpbiBpbmZvIGlzIG5vdCBpbiB1c2UgY3VycmVudGx5LgorCisgICAgICAgIC8vIGlucHV0CisgICAgICAgIGlmICghb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmsuaW5wdXQsIGRCYXNlQmxvY2tzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrOjppbnB1dC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldChzKQorICAgICAgICBkV29yay53b3JrbGV0cy5jbGVhcigpOworICAgICAgICBmb3IgKGNvbnN0IFdvcmtsZXQmIHNXb3JrbGV0IDogc1dvcmsud29ya2xldHMpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+IGRXb3JrbGV0ID0gc3RkOjptYWtlX3VuaXF1ZTxDMldvcmtsZXQ+KCk7CisKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpZAorICAgICAgICAgICAgZFdvcmtsZXQtPmNvbXBvbmVudCA9IHN0YXRpY19jYXN0PGMyX25vZGVfaWRfdD4oCisgICAgICAgICAgICAgICAgICAgIHNXb3JrbGV0LmNvbXBvbmVudElkKTsKKworICAgICAgICAgICAgLy8gdHVuaW5ncworICAgICAgICAgICAgaWYgKCFjb3B5UGFyYW1zRnJvbUJsb2IoJmRXb3JrbGV0LT50dW5pbmdzLCBzV29ya2xldC50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgV29ya2xldDo6dHVuaW5ncyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmNsZWFyKCk7CisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMucmVzZXJ2ZShzV29ya2xldC5mYWlsdXJlcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBTZXR0aW5nUmVzdWx0JiBzRmFpbHVyZSA6IHNXb3JrbGV0LmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gZEZhaWx1cmU7CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRGYWlsdXJlLCBzRmFpbHVyZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0OjpmYWlsdXJlcy4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGRGYWlsdXJlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG91dHB1dAorICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0LT5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0OjpvdXRwdXQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZFdvcmtsZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdvcmtsZXRzUHJvY2Vzc2VkCisgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gc1dvcmsud29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzV29yay5yZXN1bHQpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitjb25zdGV4cHIgc2l6ZV90IFBBUkFNU19BTElHTk1FTlQgPSA4OyAgLy8gNjQtYml0IGFsaWdubWVudAorc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlBhcmFtKSA9PSAwLCAiQzJQYXJhbSBhbGlnbm1lbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUEFSQU1TX0FMSUdOTUVOVCAlIGFsaWdub2YoQzJJbmZvKSA9PSAwLCAiQzJQYXJhbSBhbGlnbm1lbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUEFSQU1TX0FMSUdOTUVOVCAlIGFsaWdub2YoQzJUdW5pbmcpID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworCisvLyBQYXJhbXMgLT4gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+Citib29sIHBhcnNlUGFyYW1zQmxvYihzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpIHsKKyAgICAvLyBhc3N1bWluZyBibG9iIGlzIGNvbnN0IGhlcmUKKyAgICBzaXplX3Qgc2l6ZSA9IGJsb2Iuc2l6ZSgpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJsb2IuZGF0YSgpOworICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworCisgICAgZG8geworICAgICAgICBwID0gQzJQYXJhbVV0aWxzOjpQYXJzZUZpcnN0KGRhdGEgKyBpeCwgc2l6ZSAtIGl4KTsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgaXggKz0gcC0+c2l6ZSgpOworICAgICAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChwKTsKKworICAgIGlmIChpeCAhPSBzaXplKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInBhcnNlUGFyYW1zQmxvYiAtLSBpbmNvbnNpc3RlbnQgc2l6ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLiBUIGlzIGEgY29udGFpbmVyIHR5cGUKKyAqIHdob3NlIG1lbWJlciB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCBDMlBhcmFtKi4KKyAqCisgKiBccGFyYW1bb3V0XSBibG9iIHRhcmdldCBibG9iCisgKiBccGFyYW1baW5dIHBhcmFtcyBwYXJhbWV0ZXJzIHRvIGNvbmNhdGVuYXRlCisgKiBccmV0dmFsIEMyX09LIGlmIHRoZSBibG9iIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsIGNyZWF0ZWQgKHRoaXMgb25seQorICogICAgICAgICBoYXBwZW5zIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUgbm90IGNvbnN0KQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NyZWF0ZVBhcmFtc0Jsb2IoaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsIGNvbnN0IFQgJnBhcmFtcykgeworICAgIC8vIGFzc3VtaW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb25zdAorICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IHAtPnNpemUoKTsKKyAgICAgICAgc2l6ZSA9IGFsaWduKHNpemUsIFBBUkFNU19BTElHTk1FTlQpOworICAgIH0KKyAgICBibG9iLT5yZXNpemUoc2l6ZSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBORVZFUiBvdmVyd3JpdGUgZXZlbiBpZiBwYXJhbSB2YWx1ZXMgKGUuZy4gc2l6ZSkgY2hhbmdlZAorICAgICAgICBzaXplX3QgcGFyYW1TaXplID0gc3RkOjptaW4ocC0+c2l6ZSgpLCBzaXplIC0gaXgpOworICAgICAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJipwKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApICsgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICYoKmJsb2IpW2l4XSk7CisgICAgICAgIGl4ICs9IHBhcmFtU2l6ZTsKKyAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShpeCk7CisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlUGFyYW1zQmxvYiAtLSBpbmNvbnNpc3RlbnQgc2l6ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgY3JlYXRlIGEgdmVjdG9yIG9mIG5ldyBUIG9iamVjdHMgdGhhdCBjb250YWluIGNvcGllcworICogb2YgdGhlIHBhcmFtcyBpbiB0aGUgYmxvYi4gVCBpcyBDMlBhcmFtIG9yIGl0cyBjb21wYXRpYmxlIGRlcml2ZWQgY2xhc3MuCisgKgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIF9jb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb3B5UGFyYW1zRnJvbUJsb2IgLS0gZmFpbGVkIHRvIHBhcnNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwYXJhbXMtPnJlc2l6ZShwYXJhbVBvaW50ZXJzLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHBhcmFtUG9pbnRlciA6IHBhcmFtUG9pbnRlcnMpIHsKKyAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBudWxsIHBhcmFtUG9pbnRlci4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICgqcGFyYW1zKVtpKytdLnJlc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKnBhcmFtUG9pbnRlcikucmVsZWFzZSgpKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gLT4gUGFyYW1zCitib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gLT4gUGFyYW1zCitib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKSB7CisgICAgcmV0dXJuIF9jcmVhdGVQYXJhbXNCbG9iKGJsb2IsIHBhcmFtcyk7Cit9CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworICAgIHJldHVybiBfY29weVBhcmFtc0Zyb21CbG9iKHBhcmFtcywgYmxvYik7Cit9CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PgorYm9vbCBjb3B5UGFyYW1zRnJvbUJsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHVwZGF0ZSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+Citib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBDMlBhcmFtKj4gaW5kZXgycGFyYW07CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFwYXJhbSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBvdXRwdXQgcGFyYW0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXgycGFyYW0uZmluZChwYXJhbS0+aW5kZXgoKSkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIGluZGV4MnBhcmFtLmVtcGxhY2UocGFyYW0tPmluZGV4KCksIHBhcmFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHBhcmFtUG9pbnRlciA6IHBhcmFtUG9pbnRlcnMpIHsKKyAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgaW5wdXQgcGFyYW0uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkZWNsdHlwZShpbmRleDJwYXJhbSk6Oml0ZXJhdG9yIGkgPSBpbmRleDJwYXJhbS5maW5kKAorICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSk7CisgICAgICAgIGlmIChpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBpbmRleCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtUG9pbnRlci0+aW5kZXgoKSA8PCAiIG5vdCBmb3VuZC4gU2tpcHBpbmcuLi4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpLT5zZWNvbmQtPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIHNpemUgbWlzbWF0Y2g6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1zLnNpemUoKSA8PCAiIHZzICIgPDwgcGFyYW1Qb2ludGVyLT5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAoaW5kZXggPSAiIDw8IGktPmZpcnN0IDw8ICIpLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENvbnZlcnQgQnVmZmVyUG9vbCBSZXN1bHRTdGF0dXMgdG8gYzJfc3RhdHVzX3QuCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKFJlc3VsdFN0YXR1cyBycykgeworICAgIHN3aXRjaCAocnMpIHsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6T0s6CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOgorICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICBjYXNlIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOgorICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coV0FSTklORykgPDwgIlVucmVjb2duaXplZCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1czogIgorICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soQzJGcmFtZURhdGEmIGZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlciA6IGZyYW1lRGF0YS5idWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2sgOgorICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzKGJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrTGlzdCkgeworICAgICAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzSW5wdXQpIHsKKyAgICAgICAgICAgIGZvckVhY2hCbG9jayh3b3JrLT5pbnB1dCwgcHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NPdXRwdXQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4mIHdvcmtsZXQgOiB3b3JrLT53b3JrbGV0cykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrbGV0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvckVhY2hCbG9jayh3b3JrbGV0LT5vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworYm9vbCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6QmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgYmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwgYmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2ssCisgICAgICAgICAgICAgICAgIHByb2Nlc3NJbnB1dCwgcHJvY2Vzc091dHB1dCk7Cit9CisKK2Jvb2wgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgYm9vbCB0cmFuc2ZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6RW5kVHJhbnNmZXJCbG9ja1RvQ2xpZW50KGRhdGEsIHRyYW5zZmVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCB0cmFuc2ZlciwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgdHJhbnNmZXIpLAorICAgICAgICAgICAgICAgICBwcm9jZXNzSW5wdXQsIHByb2Nlc3NPdXRwdXQpOworfQorCitib29sIGRpc3BsYXlCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpEaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKGRhdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmMGQwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhNTUyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+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+PiB0aW1lc3RhbXA7CisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICAvLyBSZXNldCB0b3RhbCBubyBvZiBmcmFtZXMgcmVjZWl2ZWQKKyAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgaWYgKG1Db21wTmFtZSA9PSBnNzExYWxhdyB8fCBtQ29tcE5hbWUgPT0gZzcxMW1sYXcpIHsKKyAgICAgICAgLy8gZzcxMSB0ZXN0IGRhdGEgaXMgYWxsIDEtY2hhbm5lbCBhbmQgaGFzIG5vIGVtYmVkZGVkIGNvbmZpZyBpbmZvLgorICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCksIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBzaXplX3QgaW5mb1NpemUgPSBJbmZvLnNpemUoKTsKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgaW5mb1NpemUgKz0gMTsKKyAgICB9CisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gaW5mb1NpemUpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgaW5mb1NpemUpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgdWludDY0X3QgZXhwVHM7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIC8vIFVwZGF0ZSBTYW1wbGVSYXRlIGFuZCBDaGFubmVsQ291bnQKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgICAgICBpbnQgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOworICAgICAgICBpbnQgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKKyAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgYW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT46Oml0ZXJhdG9yIGl0T3V0ID0gb0J1ZmZlck1ldGFEYXRhLmJlZ2luKCk7CisgICAgICAgIEVYUEVDVF9FUSgqaXRJbiwgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgZXhwVHMgPSAqaXRJbjsKKyAgICAgICAgd2hpbGUgKGl0T3V0ICE9IG9CdWZmZXJNZXRhRGF0YS5lbmQoKSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cFRzLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICAgICAgaWYgKGV4cFRzICE9IGl0T3V0LT50aW1lc3RhbXBVcykgYnJlYWs7CisgICAgICAgICAgICAvLyBidWZmZXIgc2FtcGxlcyA9ICgodG90YWwgYnl0ZXMpIC8gKGFjICogKGJpdHMgcGVyIHNhbXBsZSAvIDgpKQorICAgICAgICAgICAgc2FtcGxlc1JlY2VpdmVkICs9ICgoaXRPdXQtPnJhbmdlTGVuZ3RoKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgICAgICAgICBleHBUcyA9IHNhbXBsZXNSZWNlaXZlZCAqIDEwMDAwMDBsbCAvIG5TYW1wbGVSYXRlOworICAgICAgICAgICAgaXRPdXQrKzsKKyAgICAgICAgfQorICAgICAgICBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKTsKKyAgICAgICAgLS1pdEluOworICAgICAgICBFWFBFQ1RfR1QoZXhwVHMsICppdEluKTsKKyAgICAgICAgb0J1ZmZlck1ldGFEYXRhLmNsZWFyKCk7CisgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorLy8gRGVjb2RlVGVzdCB3aXRoIFN0cmVhbUluZGV4IGFuZCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmVhbUluZGV4QW5kRU9TLCBDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcigwLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigwLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIHRydWUpKSk7CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICBzaXplX3QgaSA9IC0xOworICAgIGRvIHsKKyAgICAgICAgaSsrOworICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGlmIChJbmZvW2ldLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2ldLmZsYWdzIC0gMSk7CisKKyAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaSArIDEpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiYWY3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcCA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICAgICAgZ2V0SW5wdXRNYXhCdWZTaXplKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGFhYywKKyAgICAgICAgZmxhYywKKyAgICAgICAgb3B1cywKKyAgICAgICAgYW1ybmIsCisgICAgICAgIGFtcndiLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50MzJfdCBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvLyBJbiBlbmNvZGVyIGNvbXBvbmVudHMsIGZldGNoIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBhbGxvY2F0ZWQKKyAgICB2b2lkIGdldElucHV0TWF4QnVmU2l6ZSgpIHsKKyAgICAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzFdID0gezB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHt9LCB7QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEV9LCBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgJmluUGFyYW1zKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlF1ZXJ5IE1heEJ1ZmZlclNpemVJbmZvIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CisgICAgICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0TWF4QnVmU2l6ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgfQorCit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90IG5DaGFubmVscywgaW50MzJfdCBuU2FtcGxlUmF0ZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCBzYW1wbGVSYXRlSW5mbygwdSwgblNhbXBsZVJhdGUpOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbkNoYW5uZWxzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciogbVVSTDsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLCB1aW50MzJfdCBuRnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLCBpbnQzMl90IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TYW1wbGVSYXRlLCBib29sIGZsdXNoZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBmcmFtZUlEID0gMDsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9CisgICAgICAgIChpbnQpKCgoZmxvYXQpc2FtcGxlc1BlckZyYW1lIC8gblNhbXBsZVJhdGUpICogMTAwMDAwMCk7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzQ291bnQsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClieXRlc0NvdW50LCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClieXRlc0NvdW50LCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgZnJlZShkYXRhKTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBieXRlc0NvdW50KTsKKyAgICAgICAgbkZyYW1lcy0tOworICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wSW5jcjsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJBdWRpb0VuY0VuY29kZVRlc3QKKyAgICA6IHB1YmxpYyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxib29sLCBpbnQzMl90Pj4geworfTsKKworVEVTVF9QKENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIEFMT0dWKCJFbmNvZGVUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKyAgICBib29sIHNpZ25hbEVPUyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgLy8gUmF0aW8gdy5yLnQgdG8gbUlucHV0TWF4QnVmU2l6ZQorICAgIGludDMyX3QgaW5wdXRNYXhCdWZSYXRpbyA9IEdldFBhcmFtKCkuc2Vjb25kOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IHNhbXBsZVJhdGUKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIHN3aXRjaCAobUNvbXBOYW1lKSB7CisgICAgICAgIGNhc2UgYWFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0KKyAgICAgICAgKChtSW5wdXRNYXhCdWZTaXplIC8gaW5wdXRNYXhCdWZSYXRpbykgLyAobkNoYW5uZWxzICogMikpOworICAgIEFMT0dWKCJzaWduYWxFT1MgJWQgbUlucHV0TWF4QnVmU2l6ZSAlZCBzYW1wbGVzUGVyRnJhbWUgJWQiLCBzaWduYWxFT1MsCisgICAgICAgICAgbUlucHV0TWF4QnVmU2l6ZSwgc2FtcGxlc1BlckZyYW1lKTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTY7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgbnVtRnJhbWVzICs9IDE7CisgICAgfQorCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gbnVtRnJhbWVzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICghbUNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBidWZmZXIgbWlzc2luZyIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIEVuY29kZVRlc3Qgd2l0aCBFT1MgLyBObyBFT1MgYW5kIGlucHV0TWF4QnVmUmF0aW8KKy8vIGlucHV0TWF4QnVmUmF0aW8gaXMgcmF0aW8gdy5yLnQuIHRvIG1JbnB1dE1heEJ1ZlNpemUKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEVuY29kZVRlc3QsIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHRydWUsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodHJ1ZSwgMikpKTsKKworCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAyOworICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugb3B1czoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gOTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1ybmI6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1yd2I6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSAxNjAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMzA7CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTI4OworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCBudW1GcmFtZXNGbHVzaGVkLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgdHJ1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKworCisjZW5kaWYgIC8vIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTFiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMENvbW1vblV0aWwiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJWdHNIYWxNZWRpYUMyVjFfMENvbW1vblV0aWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vUkVBRE1FLm1kIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNTc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29kZWMyIFZUUyBIYWwgQCAxLjAgdGVzdHMgIworCisjIyBtYXN0ZXIgOgorRnVuY3Rpb25hbGl0eSBvZiBtYXN0ZXIgaXMgdG8gZW51bWVyYXRlIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuCisKK3VzYWdlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0IC1JIGRlZmF1bHRgCisKKyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCB0ZXN0IGlzIHRvIHZhbGlkYXRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogYFZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPmAKKworZXhhbXBsZTogYFZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyYAorCisjIyBhdWRpbyA6CitGdW5jdGlvbmFsaXR5IG9mIGF1ZGlvIHRlc3QgaXMgdG8gdmFsaWRhdGUgYXVkaW8gc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBvZiBDb2RlYzIgY29tcG9uZW50cy4gVGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGlzIHRlc3QgYXJlIHRha2VuIGZyb20gYGZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlc2AuIFRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGAtUGAuIChJZiB0aGUgZGV2aWNlIHBhdGggaXMgb21pdHRlZCwgYC9kYXRhL2xvY2FsL3RtcC9tZWRpYS9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlLikKKwordXNhZ2U6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBkZWZhdWx0IC1DIDxjb21wIG5hbWU+IC1QIDxwYXRoIHRvIHJlc291cmNlIGZpbGVzPmAKKwordXNhZ2U6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCA8cGF0aCB0byByZXNvdXJjZSBmaWxlcz5gCisKK2V4YW1wbGU6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciAtUCAvZGF0YS9sb2NhbC90bXAvbWVkaWEvYAorCitleGFtcGxlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QgLUkgc29mdHdhcmUgLUMgYzIuYW5kcm9pZC5vcHVzLmVuY29kZXIgLVAgL2RhdGEvbG9jYWwvdG1wL21lZGlhL2AKKworIyMgdmlkZW8gOgorRnVuY3Rpb25hbGl0eSBvZiB2aWRlbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIHZpZGVvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgb2YgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGBmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXNgLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCBgLVBgLiAoSWYgdGhlIGRldmljZSBwYXRoIGlzIG9taXR0ZWQsIGAvZGF0YS9sb2NhbC90bXAvbWVkaWEvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4pCisKK3VzYWdlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QgLUkgZGVmYXVsdCAtQyA8Y29tcCBuYW1lPiAtUCA8cGF0aCB0byByZXNvdXJjZSBmaWxlcz5gCisKK3VzYWdlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4gLVAgPHBhdGggdG8gcmVzb3VyY2UgZmlsZXM+YAorCitleGFtcGxlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QgLUkgc29mdHdhcmUgLUMgYzIuYW5kcm9pZC5hdmMuZGVjb2RlciAtUCAvZGF0YS9sb2NhbC90bXAvbWVkaWEvYAorCitleGFtcGxlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QgLUkgc29mdHdhcmUgLUMgYzIuYW5kcm9pZC52cDkuZW5jb2RlciAtUCAvZGF0YS9sb2NhbC90bXAvbWVkaWEvYAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNiNzMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24iCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworLy8gVGVzdCB0aGUgY29kZWNzIGZvciBOdWxsQnVmZmVyLCBFbXB0eSBJbnB1dCBCdWZmZXIgd2l0aChvdXQpIGZsYWdzIHNldAordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAid29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGlzTnVsbEJ1ZmZlcikgeworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhudWxscHRyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKK30KKworLy8gV2FpdCBmb3IgYWxsIHRoZSBpbnB1dHMgdG8gYmUgY29uc3VtZWQgYnkgdGhlIHBsdWdpbi4KK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gd29ya1F1ZXVlLnNpemUoKTsKKyAgICB9CisgICAgd2hpbGUgKChtYXhSZXRyeSA8IE1BWF9SRVRSWSkgJiYgKHF1ZXVlU2l6ZSA8IGJ1ZmZlckNvdW50KSkgeworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgIT0gd29ya1F1ZXVlLnNpemUoKSkgeworICAgICAgICAgICAgcXVldWVTaXplID0gd29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgordm9pZCB3b3JrRG9uZSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwgYm9vbCYgZW9zLCBib29sJiBjc2QsCisgICAgdWludDMyX3QmIGZyYW1lc1JlY2VpdmVkKSB7CisgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5zaXplKCkgIT0gMCkgeworICAgICAgICBBTE9HVigiQ29uZmlnIFVwZGF0ZSIpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cGRhdGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IHVwZGF0ZXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBpZiAocGFyYW0tPmluZGV4KCkgPT0gQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgICAgIGNzZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnUGFyYW0ucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KKyAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICE9IEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpIHsKKyAgICAgICAgZnJhbWVzUmVjZWl2ZWQrKzsKKyAgICAgICAgZW9zID0gKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZChmbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBmbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICBBTE9HVigiV29ya0RvbmU6IGZyYW1lSUQgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgICAoaW50KXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgd29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgaWYgKCFmbHVzaGVkSW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gUmV0dXJuIGN1cnJlbnQgdGltZSBpbiBtaWNybyBzZWNvbmRzCitpbnQ2NF90IGdldE5vd1VzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwbGw7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTllNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4ZWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZS5oPgorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCA0MDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKKy8qCisgKiBIYW5kbGUgQ2FsbGJhY2sgZnVuY3Rpb25zIG9uV29ya0RvbmUoKSwgb25UcmlwcGVkKCksCisgKiBvbkVycm9yKCksIG9uRGVhdGgoKSwgb25GcmFtZXNSZW5kZXJlZCgpCisgKi8KK3N0cnVjdCBDb2RlY0xpc3RlbmVyIDogcHVibGljIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworICAgcHVibGljOgorICAgIENvZGVjTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBmbiA9CisgICAgICAgICAgICBudWxscHRyKQorICAgICAgICA6IGNhbGxCYWNrKGZuKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgIGlmIChjYWxsQmFjaykgY2FsbEJhY2sod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0cykKKyAgICAgICAgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKXNldHRpbmdSZXN1bHRzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgQUxPR0QoIm9uRXJyb3IgY2FsbGVkIik7CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gMCkgQUxPR0UoIkVycm9yIDogJXUiLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWZyYW1lSW5kZXg7CisgICAgICAgICh2b2lkKWFycmF5SW5kZXg7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgdWludDY0X3QgYnVmZmVyUXVldWVJZCwKKyAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZClidWZmZXJRdWV1ZUlkOworICAgICAgICAodm9pZClzbG90SWQ7CisgICAgICAgICh2b2lkKXRpbWVzdGFtcE5zOworICAgIH0KKyAgICAvLyBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgLy8gc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIC8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gY2FsbEJhY2s7Cit9OworCisvLyBBIGNsYXNzIGZvciB0ZXN0IGVudmlyb25tZW50IHNldHVwCitjbGFzcyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdFNlcnZpY2VzKCkgb3ZlcnJpZGUgeworICAgICAgICByZWdpc3RlclRlc3RTZXJ2aWNlPElDb21wb25lbnRTdG9yZT4oKTsKKyAgICB9CisKKyAgICBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcik7CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUyk7CisKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCk7CisKK2ludDY0X3QgZ2V0Tm93VXMoKTsKKworI2VuZGlmICAvLyBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM2NGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM1NDFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfY29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvKiBUaW1lX091dCBmb3Igc3RhcnQoKSwgc3RvcCgpLCByZXNldCgpLCByZWxlYXNlKCksIGZsdXNoKCksIHF1ZXVlKCkgYXJlCisgKiBkZWZpbmVkIGluIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaGFsLiBBZGRpbmcgNTBtcworICogZXh0cmEgaW4gY2FzZSBvZiB0aW1lb3V0IGlzIDUwMG1zLCAxbXMgZXh0cmEgaW4gY2FzZSB0aW1lb3V0IGlzIDFtcy81bXMuIEFsbAorICogdGltZW91dCBpcyBjYWxjdWxhdGVkIGluIHVzLgorICovCisjZGVmaW5lIFNUQVJUX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFNUT1BfVElNRV9PVVQgICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFJFU0VUX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFJFTEVBU0VfVElNRV9PVVQgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIEZMVVNIX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBRVUVVRV9USU1FX09VVCAgICAgICAgICAgICAgICAgIDIwMDAKKworLy8gVGltZV9PdXQgZm9yIGNvbmZpZygpLCBxdWVyeSgpLCBxdWVyeVN1cHBvcnRlZFBhcmFtcygpIGFyZSBkZWZpbmVkIGluCisvLyBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmhhbC4KKyNkZWZpbmUgQ09ORklHX1RJTUVfT1VUICAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFFVRVJZX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBRVUVSWVNVUFBPUlRFRFBBUkFNU19USU1FX09VVCAgIDIwMDAKKworI2RlZmluZSBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgVElNRV9PVVQsIEZ1bmNOYW1lKSAgICAgICAgICBcCisgICAgaWYgKHRpbWVDb25zdW1lZCA+IFRJTUVfT1VUKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlRJTUVEX09VVCAlcyAgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIGlzICIgICAgICBcCisgICAgICAgICAgICAiZ3JlYXRlciB0aGFuIHRocmVzaG9sZCAlZCB1cyIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZ1bmNOYW1lLCB0aW1lQ29uc3VtZWQsIFRJTUVfT1VUKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgQ29tcG9uZW50IHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBJZiB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGZhdGFsIGZhaWx1cmUsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAgICAgICAgICAgIC8vIGZyZWVOb2RlKCkgd2lsbCBub3QgZ28gdGhyb3VnaC4gSW5zdGVhZCBvZiBoYW5naW5nIHRoZSBhcHAuCisgICAgICAgICAgICAvLyBsZXQgaXQgcGFzcyB0aHJvdWdoIGFuZCByZXBvcnQgZXJyb3JzCisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbUVvczsKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKKy8vIFRlc3QgRW1wdHkgRmx1c2gKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgRW1wdHlGbHVzaCkgeworICAgIEFMT0dWKCJFbXB0eSBGbHVzaCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAvLyBFbXB0eSBGbHVzaCBzaG91bGQgbm90IHJldHVybiBhbnkgd29yaworICAgIEFTU0VSVF9FUShmbHVzaGVkV29yay5zaXplKCksIDB1KTsKK30KKworLy8gVGVzdCBRdWV1ZSBFbXB0eSBXb3JrCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIFF1ZXVlRW1wdHlXb3JrKSB7CisgICAgQUxPR1YoIlF1ZXVlIEVtcHR5IFdvcmsgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gUXVldWVpbmcgYW4gZW1wdHkgV29ya0J1bmRsZQorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0xpc3Q7CisgICAgbUNvbXBvbmVudC0+cXVldWUoJndvcmtMaXN0KTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnJlc2V0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBDb25maWd1cmF0aW9uCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIENvbmZpZykgeworICAgIEFMT0dWKCJDb25maWd1cmF0aW9uIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29tcG9uZW50IE5hbWUiOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIFF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQUxPR1YoIk51bWJlciBvZiB0b3RhbCBwYXJhbXMgLSAlenUiLCBwYXJhbXMuc2l6ZSgpKTsKKworICAgIC8vIFF1ZXJ5IGFuZCBjb25maWcgYWxsIHRoZSBzdXBwb3J0ZWQgcGFyYW1zCisgICAgZm9yIChzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHAgOiBwYXJhbXMpIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5aW5nIGluZGV4ICVkIiwgKGludClwLT5pbmRleCgpKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtwLT5pbmRleCgpfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgICAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKyAgICAgICAgRVhQRUNUX0VRKGVyciwgQzJfT0spOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3F1ZXJpZWRbMF0uZ2V0KCl9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9Cit9CisKKy8vIFRlc3QgTXVsdGlwbGUgU3RhcnQgU3RvcCBSZXNldCBUZXN0CitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIE11bHRpcGxlU3RhcnRTdG9wUmVzZXQpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgU3RhcnQgU3RvcCBhbmQgUmVzZXQgVGVzdCIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBtQ29tcG9uZW50LT5zdGFydCgpOworICAgICAgICBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBBU1NFUlRfTkUobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IFJlbGVhc2UgQVBJCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIE11bHRpcGxlUmVsZWFzZSkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBSZWxlYXNlIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXJ5IENvbXBvbmVudCBEb21haW4gVHlwZQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisKKyAgICAvLyBDb25maWd1cmUgQ29tcG9uZW50IERvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dCogcG9ydE1lZGlhVHlwZSA9CisgICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cG9ydE1lZGlhVHlwZX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgIH0KK30KKworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBpc051bGxCdWZmZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSBBTE9HRCgiVGVzdGluZyBmb3IgbnVsbCBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgZWxzZSBBTE9HRCgiVGVzdGluZyBmb3IgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RJbnB1dEJ1ZmZlcigKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwgZmxhZ3MsIGlzTnVsbEJ1ZmZlcikpOworCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRJbnB1dHMsIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpKTsKKworLy8gVGVzdCBBUEkncyBUaW1lb3V0CitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIFRpbWVvdXQpIHsKKyAgICBBTE9HVigiVGltZW91dCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBpbnQ2NF90IHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFNUQVJUX1RJTUVfT1VULCAic3RhcnQoKSIpOworICAgIEFMT0dWKCJtQ29tcG9uZW50LT5zdGFydCgpIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsIHRpbWVDb25zdW1lZCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5yZXNldCgpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFJFU0VUX1RJTUVfT1VULCAicmVzZXQoKSIpOworICAgIEFMT0dWKCJtQ29tcG9uZW50LT5yZXNldCgpIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsIHRpbWVDb25zdW1lZCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbXM7CisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1zKTsKKyAgICB0aW1lQ29uc3VtZWQgPSBnZXROb3dVcygpIC0gc3RhcnRUaW1lOworICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBRVUVSWVNVUFBPUlRFRFBBUkFNU19USU1FX09VVCwKKyAgICAgICAgICAgICAgICAgICJxdWVyeVN1cHBvcnRlZFBhcmFtcygpIik7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICB0aW1lQ29uc3VtZWQpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBRVUVSWV9USU1FX09VVCwgInF1ZXJ5KCkiKTsKKyAgICAgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisgICAgICAgIEVYUEVDVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIm1Db21wb25lbnQtPnF1ZXJ5KCkgZm9yICVzIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgIHAtPm5hbWUoKS5jX3N0cigpLCB0aW1lQ29uc3VtZWQpOworCisgICAgICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBDT05GSUdfVElNRV9PVVQsICJjb25maWcoKSIpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICAgICAgQUxPR1YoIm1Db21wb25lbnQtPmNvbmZpZygpIGZvciAlcyB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgICAgICBwLT5uYW1lKCkuY19zdHIoKSwgdGltZUNvbnN1bWVkKTsKKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJndvcmtMaXN0KTsKKyAgICB0aW1lQ29uc3VtZWQgPSBnZXROb3dVcygpIC0gc3RhcnRUaW1lOworICAgIEFMT0dWKCJtQ29tcG9uZW50LT5xdWV1ZSgpIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsIHRpbWVDb25zdW1lZCk7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFFVRVVFX1RJTUVfT1VULCAicXVldWUoKSIpOworCisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmd29ya0xpc3QpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPmZsdXNoKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgRkxVU0hfVElNRV9PVVQsICJmbHVzaCgpIik7CisKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICB0aW1lQ29uc3VtZWQgPSBnZXROb3dVcygpIC0gc3RhcnRUaW1lOworICAgIEFMT0dWKCJtQ29tcG9uZW50LT5zdG9wKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgU1RPUF9USU1FX09VVCwgInN0b3AoKSIpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnJlbGVhc2UoKSB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLCB0aW1lQ29uc3VtZWQpOworICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBSRUxFQVNFX1RJTUVfT1VULCAicmVsZWFzZSgpIik7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgd29yaywKKy8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHN0YXRlcworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2UzMjNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhmYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfbWFzdGVyX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgTWFzdGVyIHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMk1hc3RlckhhbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworfTsKKwordm9pZCBkaXNwbGF5Q29tcG9uZW50SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcExpc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBjb21wTGlzdFtpXS5uYW1lIDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmRvbWFpbjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmtpbmQgPDwgIlxuIjsKKyAgICB9Cit9CisKKy8vIExpc3QgQ29tcG9uZW50cworVEVTVF9GKENvZGVjMk1hc3RlckhhbFRlc3QsIExpc3RDb21wb25lbnRzKSB7CisgICAgQUxPR1YoIkxpc3RDb21wb25lbnRzIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29kZWMyQ2xpZW50IE5hbWUiOworCisgICAgLy8gR2V0IExpc3Qgb2YgY29tcG9uZW50cyBmcm9tIGFsbCBrbm93biBzZXJ2aWNlcworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGxpc3RUcmFpdHMgPQorICAgICAgICBtQ2xpZW50LT5MaXN0Q29tcG9uZW50cygpOworCisgICAgaWYgKGxpc3RUcmFpdHMuc2l6ZSgpID09IDApCisgICAgICAgIEFMT0dFKCJXYXJuaW5nLCBDb21wb25lbnRJbmZvIGxpc3QgZW1wdHkiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgKHZvaWQpZGlzcGxheUNvbXBvbmVudEluZm87CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdFRyYWl0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgICAgICAgICBsaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShsaXN0ZW5lciwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBjb21wb25lbnQgZnJvbSBhbGwga25vd24gc2VydmljZXMKKyAgICAgICAgICAgIGNvbXBvbmVudCA9IG1DbGllbnQtPkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgICAgICBsaXN0VHJhaXRzW2ldLm5hbWUuY19zdHIoKSwgbGlzdGVuZXIsICZtQ2xpZW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjb21wb25lbnQsIG51bGxwdHIpIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2CkBAIC0wLDAgKzEgQEAKK8rKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS0tPT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PD87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0REQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc8Oz46PTo6Ojg4Ojs7ODg6Ojs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PjtEPD06PDw5ODo5Ojo5Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vLzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra2tvb29nZ2dnZ2dnZ2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vc3Nzc3Nzc3N3c29vb29rU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjM7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2NkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqLh4GCgoKCgoKCgYGBgX+R09PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe6+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTVE1DREREREREQ0NDREM/XdHT09PT09PS0tLS0tLS3+rr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1hRSUlJSUlJSUlISEhIRGDQ09LS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFhYmJiYmJiXoysqampqampqampqamqo2dhYmJiYmJiYmJiYmJiXFRUVFRUVFRUVFRUVVFr0NLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs3MzMzOz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXFxsbGy8zLzMvMzMzMzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy8rKysrKysrKy8vKysvLzdXV1dbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9LUz8/S1NXUz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NDR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbV1tbW1tbW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmszPzs7Ozs7Sq5zP0NO5n9HQnIKEisjPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1tXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9Wyl5i1tpO4ua+i0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3DnaKmq9KRfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COTY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmKrUz8/P0b+YoJuyrciGma3V0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT4/Pjo4RUA/Qjs3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZiq1M/Pz9O0mZaquKTbo5it1dPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+g2KGYrdXVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWodmhmK3V1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PTo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmanaoZiu1s2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpu02qOYr9jCn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tPT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SazNihma3asqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNXUsYTD1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR0tHD1dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f39/g4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxEREREPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FRERFPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QTw7PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29va2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBRD8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW2tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm4uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU0Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6vs7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfnJ2hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLW0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZmamZeXl5eXlpmbmJmZmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW2tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2uq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iZmpucnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2sq6qnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKampaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWlqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnJyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alpKWkpaWmqKinqKelpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmbnKGko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKKioqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fn5+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnZ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5uanJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ycnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5iZnJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52doKGio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+dnZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qbmpuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KTk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cmpubm5uamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pjs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucm5ubnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz1DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnZ+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPj4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7Pzw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8/QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9OTk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPj9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg5ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBvcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFEXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFLzhbbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PS2+heEF7d2NiUFBaR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0tLS5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGC/1qZDe4yAdU9tjnVSZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XUF5lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPD48OTk8QUJFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLOybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkKKXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6OhpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNgHdydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BCPkM9Ozk+OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqidiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoainpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoF2eHl4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs+Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloaSnp6GfnZ6Wk5ygl5mSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ6dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ojw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1XoyMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5M1uTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMzNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCPDg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKKnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJeXnJufnqOcnpaYl5OWnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojs7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbOrqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOMlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmlqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjMysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmlqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvBw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1paWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnZ6WnKOgoaKko6SinpqZm5ubnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VUTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg6PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Odn6JVkxvpMvUxba/v8C/urq9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnJ+eo6CmmXl6eYBzcGZlZ2RrZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8PDxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3aoOQmG+pyMjH0cGvvb24ubu7vri1sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbCnpqWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2joJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs7QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj06OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm2uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1RMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e1uLa2vLu5trS4urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLWzs764ubi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJO9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y2tbfBvbu8wMO7v8K/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBub69xL/Av8LIvcfGxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7nDvr65wL3DxsLKzsfGvbrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gYFRJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC7wru5tLu7w8PBzdDKxL21vLu5v7m6tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6dsLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PD86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9vsC4yL6roaGhprnBycW4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsC7yKy8rbq4n5ORm6O3tLC0tLW8ub65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u667u5SPztzm4tG4mpKGf52tr66zure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7Cms7ma6OPb1dfVz7qJdWpsmKynr7azsrq1u7u7tbi2sLXEsr68vry5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennauivcurqLXKz8/LmXRrbHKgpKqtrqewrK+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiarrNaOEt5qsXKxqKAhZKIiJ6jqaigpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJU0ROQz04ODc1Ojc8PTo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aXjKx9MlJoVnSvtbGejJqiopuWnaOin56koKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45hZGKArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUlYugY16Gh3RajKOZm5idoaSnpp2en6CcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzYFtecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpSPiG6Hur+jY2eTh5SRjp6joqainZ+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fWV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD07Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODU1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko11lfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZaWmYh6pMfW1Z9PbH+JgIOUmpibq6OhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmpePd5/K2rKyZ0Zmenh/g4F7irWvprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZilnaCak3CGvbJTinV5cWVpamVeUGusuqy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR05HQ0dOPT5MPjU8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqaKsoJKCe4iDeoGQpYdzWktfWklAp8G1ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoV1xRRlVIREpQST9GQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg7Ojk7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKSioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamptJF5jIeHlqOkpohibmuRroBMRLfEv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tLu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oj8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKutsqdzdnlubGyChHuFWVZ5jMCnYW7MxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb6+v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaSalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqG3tZmXb2VmXE1Wg4BwkHpob1+0p2yf08/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoaqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdm5SUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2DrJiLmmlXY1hfZHCAbX6Pck9zm5mAxtDRws/T1tjV1dLLyc7Qy8bN0snS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz9DGx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoaNi45iT1xUXGBRZl5YZVpNand5h9XR0MvQzdPX1tPV0M/S09HJ09HH0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHRyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0f3txa2VUR0lRUEdFPUpQXF91W3PV1NDJzszS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19dXGJtcm5tcXFycXdpT36NalFYS1dPS2BAS1tSbWJ20dLOxs3MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzszQxcfBuLm9xMK9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWlucGZ9i3pmZ1tKVl1jPEFWS2Fpd87NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp2g5GSfWhoVFdmUEJFXFZXXXnKxL/Cv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH+SnY5zZVpbU0FCRU9SU1aRwre4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbW1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWtyiaKSf2ZZUVFTTkA7R0xwoLOusrKysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xurawt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhnanWRj4NtX1NYZF1PRERdlZijpq2qqKqnsqy0r7Gnraarsrq5tcK5ubmvqrS5urPBua/Asb28u7W7x7nDtq2qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DAvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcPGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqeId+b2hcY2xpcXOElJePkp2kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Ozu7ezvK+4ubWyu8Gywa+lqaOrsbOzqL2qq6irrK61tKaorqGksKmzpqeorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG16d3FxaHR/f2hrk5qQjYaYm6SgoJ6jo6WlrJ6bmqOlq7Cvtramr6umqbOrs7mwtbWttrmysLq6sbaloKSgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGFgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmaXZ4dG98g3xSZ42VioqAlJmcopmcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqagqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubqwtry7uquzsrmzvbS3srG1tL+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRtenJud35nPWWMkoaKgpGZmqKbl5qhpKCimp2fmZesrKytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezr6mtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnJwa3J7UDlbfY2GjIWMmJaamZKcnaahnJ2lm5qYqaStrqmaoaG2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpacmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsa+wr6+nqKeyrbG0sLu0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbW1lbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncGlubjkuMEyAiY2HipOYlpqRm5qjoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGtq7WeoJ2VlamhopStsbGfoqOenpmbk4ugk5GTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk7Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhra2EuHytMdYSKhYiOmpOakZeboZ6poqGhoaKgmqeoopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in56XmZOKnZGNkpOVkJiYk5yho5ykoaKVoKKkpZujq6WipKqkq62lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9iaWpiPSs9TG6Ah4OHiJKTm5WVmqSkpqSopKekoJajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvo624paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozo6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNuc1NEUFtgfIJ9iYaOkJmYlJmmpKKqqKWtoaWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgamlmbl9uXGp/eIh/ioqQk5GXo5aapaOiqJuklZ2imZCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW8tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEQ/OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSU1BRVFFTVVFOTUtLU1dXVldXV1daXGFlWV9cbF9eeG+DeoSAi4mLlpuKlZefnqCWo5OemZOKhJeZi3OMgn2NlpWFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6io46JmqCho6SborSvrK+tn5imuKalsKGxrpyxu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraehppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlmYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTk9OT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaV2ltZWRFT2mIeY1+hZWQho6Mm5WalJWUkYyUiH6SiF47Vm57ipOJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6QmJqZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVFJibmNFODd5jYmHdYCNhoCFiJaJlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEiomVhJuNgoSSm5aenZSko6ippaWem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4qUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZlxUYGdXWFBKiHyMgGx3f3t3f4eOfo+Zi454g41+c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFMUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iXlxhVWV+jZKJinNgcnlwc3mDi3iAmJJ+boSNenR5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNiIBtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLS4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeomPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXFxbV1Z3l5u7emtvW3NwaHZzgot1eIiDbGmJj3Zyd2hofoFxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRTWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRVlJQmHpXkF9ob112aWd5dIWEcX2DgXFqlo9ycXpoaJyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2RjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhQRl2lqZdmcW5kdWZrfHt/fHZ/goJ2b5yRcXd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKHlZGdpKeer5WltKmtsa7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRntpdHJybXZmcIGBdnh/fnuIenOelnd8hH+DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQEREP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWTkZfd31xf3F0anWIhXV3hIJ6kYN0nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhJGph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhIeRjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZpV1haYX+He4p4fHl9iox5gISMfJWSf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaUExOV1JRSVBKRE5HQ0pEQ0BEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVV9ed2NiZ2yPj4KPiIuDhoiTg42LmYecnI+fpqKhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc6P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFdaYF3bXp1kpCOnJuZkpmQnJCXmqSao6acpainqLOWqr2qtMbItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5p3en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktQT0lKTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeNfXuTjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWl+iXKMgpWbnaq0sJ2npaejpLCnrbKurqq4r7G8m7HDqrjJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZDRkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLjQ+Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd9i5h/pZumoKe3wLylrsCzqK+8r7S6sryyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZN9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NkFCNzY0MC82Q0hDUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09eip2nnqusuKuvuMXEsbfBurCwvrS1vrG8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCilpuikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6NhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfYqDgouEln14enVmUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVRgX0xST0RBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXY+osa+1ssG3s7fFybe5v7q1s7m4tbyyuLDEX3OwpLGanaq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjqLG0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGNfWWNgamdTWGFWUlVJRUVNSkA+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeoGKgpd+dH16bGVwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0ubHBurW1x8i3tLi0t7ixtbOyrbS1mGN0p5ytcF6irJuXoKKbpJ6qpZSfn5CTjpWYmKiepp+empmDpJ2tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeW2BjWmRjUVxgU1FKQ0FFRkU8QEY/QUhCP0M8OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWlfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGDc3yKg4V7iXSBioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVlZVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrPCrbWvt7myr8LEs663r6+5qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE5QQUJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnKPkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHZscHh+cXpteHNtaYFxbWNqbXB4aXd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstamxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PWzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYVRfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp0hoWKd2x3cH1+f6GenqGMjJiTk4uMk4+VhXmFj5CNi4mIkIZ+gntxfoCBh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuBc3JpcHF6eXJ6vsuafYuxhHZyhHZnYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn52fpqSprreppbKhoaygoq2hprGeiKaak5KRiY6NiIGTiGqVooyZhIGGfpGDg5OXrYuVjZSZjoaSkZ6XqLCioaGlpKnJzc/Iw8zR1dLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVltUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCioCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9goh3f3qGkZWAg253cG12f3Z4fHSGfHpth3Z0b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6Swo6OxnqGknJ+on6Kxm4WdkZGSkIqKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIuakquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdTXFhGR0tJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoSJgYd8eIWWlomOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qcqJ6gq5qhmZidpJ2fq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmYaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycrMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaPdYJ0dYF+dICDb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWm493cGVPZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlZmWlaSblp6VnZKRlqKdmKqVkJCJjJGCi4OIiIGFj5GdmpmIhYuBhZd6iImfl5CIjYmLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsTNytHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzk1NTU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn9zfpKekZ6CkHuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSlI2cmZKTj5WMi5Sem5OflJCNjY+Kfo6NjYqDiJKWmZ6eiIuUkZ2RgYp/pZiIhI2BhYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WcoZudlJF/jIiAmIiAnJJviKiFeqGLfJGNg4iEnH2akImMo6OgkKSvoIqQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmZuOlJWQipGThX+Kh5GMiomclpihoYaSnZWfiomIjZuQg4eOf4KHhqSFjJGymJ2SlZehop+ZkpydqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfW2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Sg25td4t4eX56gXyGe3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXc4qyjYSokoSZk4WZjKKVn5iSiJqeo5OpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZiZjo+TkoaTloN+j4uZh42QqpaWoqGImJ6WmoiOh5eXiYSOjIF/h4+liY6TqJqXk5eZoZmfmZOdm6OztaajvMK+yMXFycjJwsvUzc3UqdLR1tXW2NrU0tnOhXWDa2ZhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX2IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6SdmJCol6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko6GgIWGiJGXk4uKk5KGk5eFg5CPm3OQmLKVlqOgh5uak4+KkIqWmoiKlo2GfYyYnoqQkJyamZOZmJ+UoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjWGNZUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6e22Fhnl8hHiAhIF9cHh8fXxvcox5fYF7eIaLiYaEk6i8ramzvbClrrO0qaOisK2KmrWeo7mllayjl6mtuKako5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieo6uSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46VjIqMlpiRm5mzlpSqnYqblJGMkJGLmJqJkZ2PiomVn6GOlY2XmZ2SnJielKGglJydpq6ooqSzuKvCyMS1ur27xsjIwtChxsnNzcTX1tDK1KNzfWxfXVZiU1FIRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoBzh4d8gYl1gYqDfm19fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO3jKiyrq69q5u6o6itubirp6aioaOjqq+ysaudnKOZm5iXnqKlpZKjua6ov7usrbK5paOnfYiGna28sIKLi4qQg4+DkY56gYaQjI2bh4eNloyKlJaTkJmWm6eZsJmQqpyOmo+RjpWQj5WWjpCgkIiVm6OslZaPlJyelKCdm5ifoJSan6inpKKjsLOmwMbDsLC7tsXFw7/Np8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYWQioFufnuBfnF+gXqUepKUlZiQk5aotMbJwMLMwsO5yL26sKu5u5iytrmywK6lwKOrsLy9qq6ro6Oep6yvtbGqm6CqnKKclp+vs6eMo7q6tcG8q6icsqSjqJSEjqrEw6SCi46Gh4SGlZSMeoOMkI6RoIuLk5COh5efl5KYlJaln66ci6mbjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZqkn5qgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmFk4+BcoB7jX93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprLO8vqqwqqSlo6yuta63tqCfrp+mo5ijs7ypnKi8waO2t6+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjZGPnZ+RjpKKjouTopeWmpSToZ2pnpCkmYuOj4+Vloh8jpWSkaKalKCinLamkJ+XpaSjpZ+eppielZebpaOoqKKyrKi7v8OvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFxZXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6QnY2Wjp6SiYp/iJ6ShHeFf5R+f5CIiZCAlqCarqekmMS+yMTIxtLNzs3LvMK4sLq8tL3Lu8PCt7a8rbS/uryur6ihqai2rq+qsrianqyiqKKdq7e3qqWvvsSxvbmzp6q0s62ulpWlramgkY6SscWnlI58kZV9h5GYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi4+Onohaj5aXkpakmWaZpJ+zpZajlausq6icn6aXmZaYlaKkqKaetaupurzCtKa0tcvBuKq2rLO7uK6ouLq8t4RvcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeolYyQg4alkoiBh4KahIOVkJCTjpqhn6++rqHIvsXFyMfOzs/Syr68trG7u7y/z7bEvri5t7OztrO4tKynnKusuaupqK+wmKOupaikpbXAsKustL7DucC4s6e4tLeyr5WkrbCwpYuTlKCNc8GZfJaZhI6WmouwlZmZlJGRmZikopSempWZp5yaoJ+YioyPlZ1fSpacmpSZpZdUlrCfr52fpZWvr62mm6GmlJOZmI6doKahmbSpqrO8u7ursLLHwLilq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUZNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlXPDpCQ0A9UkVXU3RiVkZIqpeZn6GorpiRl4eKp5aOiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjMzse/u7OvurnAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+uLKywrC3vKyjrrWtuqaImpalm3W+n4SYnI6SmJqLrpagm5qWlJmen6idpp+YmamZoKadl4+MkJ2CbXWSopqVnKKfkK6yoquWqquYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOmqKWmnJytqamNZmlkYlRNTkhJT0pWTD1MRE1JSkBDRDxRVTxBQUJFTzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NntmVzw6PS4uU2FMVkh+ZV5IRqyUm6Gfu66YlJ6LkqqbkZKTiKqNh6KejKOtlKOktse9tMG7wsLIycbCzsjCvrqyr7m1wcPKtsaywby1u6ypra2xpKOZqrW7p6qnrKqdqK+opKurvruorb20t77HvLa1uMCwvcCzqrW2rL+mj6KWkKCfu56Jmp+Zlp2dj7aeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqG1r6Wlk7Ksmqutn5+lpKuSlpWghJCen5yVqKShobO0uratqLWysp2do6Wal5WZqqGeeGRgYmBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6SensOsm5ekl5iom5WZmo6qlpWoppWsrZmhq7fFwbu/uMHCwMjEv83HvL66srC4tL/DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2/sLe3x7e0ubi/sb7BtrSytbC+pJajlZKak62fkKGipKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqylnJezp5qwqaCbq5+ijpqWoIWOoZqckqWkmpersbayq6WqraycmKCgko6QlqmflGlmXGNfUUpIS09NSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57FrKCeq52crZ+Rop6WpKCmqquXt7GjqrO2xcK9wLa/wbzJwr/KyLa4trSxtLS3wsa3v7G4tbq2oKetq62fnp+lpMGloaquoKSprbCipqi9taWxvLe2tsSys7e6vrLDwLe4rbS1taOcpJSRk6CsnpihnKioqqKawqyonautmpqdmKWfvaGcpJeqq6uloJiNmp+SnYiOV3+WnqWhoLmrp5OZt6Ofs6KhnLGYoZCblp6Cj6CXl46io5WQpa6yrKmioqWklZWdmIuPkpOkn4ljZ1xlYk5KS0tPRkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1FTUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6foZiew6elorOgm7Gmkqmjn6Oframrnbyxqay1ssjDwcOzwsO9x8S9xcq9sLG2rrG1sL/FtbqxsLq2rZupsKqrnJ6moajBrZytsZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq2qoqWVlJOiq6Cfn5qnqq6vr7uxpZ+pqZiYl5Kho7igoKORrq+rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco7CboJ2wkaGVmZWbgZKilpCOoKCTi6WssKWmop2gnpKSmpOGi5KNnJ+AZGhdaWdLSk1KU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTU1JOE5kXExFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDt2XV4/W1VfZ3JAODxIlndlQTSfpJ6bn8Kno6mxoKO0qZSxqqaipLKsram7s62wtLTHv8TDtb/EvsrFtsHJwrastamxuKzAxLS4r622uqWZq7Ksq5mhp5itu7ScqLCbrJ+utLKoq7qyp7m0t7K5waq3s8O9tMWnvq6tt7WpqKyhlpWRpaOiopeXpK63rbG0tp+eqKSZlJSTo6C2oqSlla2xsaWopKCdmpmZlZeooJ+Zop6vs6KmjZivmqWtmJugp5OekJaam4aXoJSNkJ2ek4uoqauhp6CanpaNj5mQgoaWiZWfemVrXm1rTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2FdQklTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW/paiurqCptamct6+ro6q0trGwuLewt7e4xbzDx728w8LIwbrCxsK7qralrbuuwcO4uKuusryjla6xrrOXpqiRqrqpoaewnaqgr7Szq6q2tay7rLOyuresubDCur6/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6qfmZaSl6aftqikoqKvsLOrsaaqn5ufn5udpZ2hmJ2jtLCcn5GUppuhqpyWpKKYm4yXmpSWl56UiZGbmZSOqainn6ObmZuTh4+Zi32Ml4aPmmxpbmJub1hRUlpUQUNEVUA7OklBNzpYUGReUFdXRVlfXk1MU05eTEo/WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2VAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKGqr6qisLeopLOyq6Gstb2us7m9u723tsHCv8nDucTDwcG5xb7BubC2qKy3sry/v7Wqr7K4n5esramvmKmpjqe7nqWts5+rorGws6yqtbO1vK2vsbWssLWywLrFt6u9r7G3rK2porGlnqWonqOWj5ifsqmyqamymZ2nm5qUjKCmpLSup6KsrK2wp7KqsKmim56oo56UoZmcqLepmJqTkp+an6Kgkq2hm5uIl5qMnpqdlIuPl5eal6alo6CdlpaWk4CQlYR7j5OEjJdnbXJocXNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUhbX15OTVNYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MT1gVl84KUMzWVVcaEs1jHpmTEClmqCkrLWjrKilrq21qK6yuKansLfFt7G3v8HCtrW6xb7LxLnDwbvAusW4wbqztKyqure7u761q6+xt5mZqKysrJ2tq4+rvZ6rr7GjqZ+xrbOvrraxubaqra+yqLawtLq8yrKqtbSxtLCvp6Gzn5qorJ+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy5o5iUkY+ZnaGZmJWuoqCXg5abj56dmZeRipSTnpqloqOhmZaTkpV7jJCFeo2Lg4uTbG55b3Z9YUZgalpJSFpcPXtKR0U2QWNUaVtNXGFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2srejrLO3ybu1u7zAvrW0t8PAzMe8w724v8DAuMC9sr2uqLq6uLfDt6yusrqWl6evraiksqqUr7ukrLKyp6ejsrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp6fp7Gfo5SbmJSxnqebn6mNqaOdnJWXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVj4+MmZ2imJGZqaWimYaUmJGenJiXl4mXkJeaqJ2koJKWkpCVdoSQhnuGg4SMjG5xeHZ8gFxMZWxcS05jXT5ie0dJOEdoV2VbTF5iTVlaV1RYVWpdUFBIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNxakxFRJGYpK2krK2qpaOwsbOptq+1n6u0uci6rsK9w7izsrXCw87EwMK+tb7BwLu/vbTEqau6sbe4wLywrbS0nqGnsa6mprGlnbG1rKmysKuoqbW6rLWytauzrKqrqaypua6ysMe/uKS5r6mtraanrbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoqpygmpuTpLSZj4qOiJGjoZaPlZ+jl5aHkJWVnpuZlpWImJOVmaedoZ+Nk5GOkHd+j4R8fX6HiopydHN/fn1cU2NuX05ZZ1xGRJZbRzpNblhiW05hYk9WV1ZXVFloXlFTTWNbW1VLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoaivpKais7Ows7SvsKCrrb3Mu67BvcextK60wsPRxMW/wrO/wsO8v7i9xaitt6y0ub3AsayzrqKkp66qqKWwo6mwqq2qsa6urKuzu6e2sLKps6mrpqWkrrqsqrHDubSruampqK2pp7GlqaSjramoop6boqyVpJ2XnpmsnaKnqKGspqOtrLexsKCpoqCqrrCsnZ6nqKmao5iZkKGomIeEj4uLn6GQjY+Yn5OSiImTl6GdlpmWh5eTk5elnJ2djJKQjYl/f4iEe3eAh4WHdHRyiXdsX1lgbmNRc3JcSzuEfEY+V3VYYVlPZFxOVlZVV1FcYl9TUE9oWVdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQU5GlZasp6CpsZynqLC1rLe0raqkq6q9ybyxv7nDr7Gts8TDzc7Dv8C0wMPEusG0ycSsr7eus7rAvrSvr6ynqKqxqaeosaWzrKqvra2xrrKts7uluLOsq66nq6CjnrG4q6qturaktbWkqqesrKqtoKinp7Cxo6aloaGslqqhk5ugpp6koqqjrKKeprG2rKyhpaKaqaquqpyhpaSkmaCZlpCYnpSCg5CJhZ2hjYyQjpySlI6Fj5qlm5OSm4yTkpKUo5qcmouPi4t8hoGCgXp1gYOBf3V4iqKGeGpeYG5mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVUtPaVdWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQ0pJRJaQr6Shqq+XqKettaq1sKqkq6qovMHAubq0vLWmsq/EycvRv8G7uL/Aw7rCusLErrK1srS8wb2zsq+trK2ntqqmra+qt62nsLCusau1qra2p7W3q6ykqamcpJ60s6mopLO0n7Wtoaqoqqisp5+rrKm4tampqqmhqaCtm5GqoZ2gpKOmo6qdnKa0rqekqaKjl6Smp6qcoqSjoJqYoJGPj5mOf4iNh4SenomGjIyRkZOPhYmXo5qOjZuRkpCPkqCYmpeNi4R/dIaCf354dYN/e3h+f4ecj3BxZmdxeFxhdIhqT12YVkhteVVlVlNkUE1WVVVRT1hbYlZJUGpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JbDhSRjuVjK+gpKqrmamjra6ytK+ppa+pqLu/vMGysLmtoravyMfH0MC/vbu8w767xMK/v6+ys7K2vrzCsbK0q7SppbWppa2ysreuoqy0sa+xuau4rqmut6yqnqqroKOhtq2poZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqGop56nm5mpsKminquhoZKhoqOnmJmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJKekpOQjZGdlZePi4aHeHSBgHx0d3mAe3V0e2uCh6R2aV5lbIF1Z4iMfFJWb15LeHNUZFNSX01NU1pnTk1XWWVZR1NpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WUQzj42xoKSlqaOkoqyms7KwqKSwp6q4vsG8sam5qqeusMnGx9DDvsC+ub/Avcm8wbixsLWyury5wLO0vKy5rKO0pqarsLW3saWmubSss7uvvKWtrbarrZypr6SfpKyqqJyeqrKks6iaq6eqpKidoqmnqr2qtLCunamkoK6cmrOjlqWcpaSfpZqaqKulnpqooZuRm6CknZmXqaqSmZqSkIuDj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWTo46UkYuRm5OWh4p/gHF6eX18aHZ8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGFQUllMTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07Rl1AKo2RsJien6ikoqGrpLaxsaSpsKatucG9trGkuayoqLDCyMjMwre9v7W4wbnItsK1tbO1sr25ur22r7m2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6upp6Gpm6OooK28p66wrqGqoqSunp6tppifmqGinJ+bmaOqopqaoqSVlpSfoZablqWsjJ+RkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKOLkpGIkJmQlIGJfXlrfXZ4eGJ6enFvcXR4a4J1a4JnY2dibnOObWJqb2BvQFx5bFVeTlFSS0pNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62hr6+orLjDu7SuoLmvq6i0usfKx7+4wb2vtL+3xLfDs7C6sbLAtru+t6q5uL6qpLWnqKmvrLivp5i5u6OtvrS0oK23taemp7CzoJ6lpqegpJmerKeonqCqr6egppaiqJ+xuJ+ksa+gq6GspJymp6iam5yfo5Wcm5qdqaaWm56okZiTmZ2TmZahqpGbio6Qh32Hf4KOfXyhjY2JeoSOhoyOjYaKk5qOiJWfiZGVgoyXjZJ9hXxzcHxxc3RfeHdpbnFxcGuAdGV6bGdlZGJmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXEZPPVJaZ0gqPzBdXDUolZummJuVrJ6doaOgtqqvo7Szqam5xbezrqC3ra2ssLXFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1p6eqr6qxrqSXu7Wjqrq1r56xuK+ppaevsZuhpKCko6CWm6+loZ6iqK+hoKGSo6Sit7ChprGrn6ujrpidqqWon5ibnaSTmZuanaWpmZubpZWUl5WcjpOYoqmikYqLkIZ6hH6Ei3qOl4qOh3uDiYSKjo+GkJOYjI6VmYuPl36Gl4yQeoF7cHJ3bm9zXnd3ZGxsbGtqhW9ncmlqZWldZHOBYFtrdmlaSn9eW1lOT0tISFNWRzM4Xl9sUEVZVlplTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobapraC7t6WsvcW0sK+jtrCsrK60w8O8s766trCzubi6t7qvrsCzs7mvv8C3rL26taWisqmmqLGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CxpJmepKmonKGfkqSgpLippKeup52koaiToKmioaGZm5yfkpmblp+iqpuamKCUkZWXmo2Tk6SppJCJio+GeoR7hIV8nY2Ki4d7goWIiYqRhpeSkouQlJSNjpR6g5eQi3d+fGx0cmxrc2B3dGhoamdncIdoaGhkZmlqYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1FWFVfYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGhbSldHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequramrMPBuLGso7aup62utr+/vLLBtrCtsra2uLa2raq9s66ysby+t6+8u7Gln7WppKSzpqitnZzAqqekr7OprLW7nqmprLClmJ2pnaakkZilrKGYnaSpoZuhm5afnae1prCqrqCgnZ2hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZiLjpibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeHkYSXlI+Oj5GRkYyTeoOVj4Zzfn5meW9qamtldHNrYmdkZHaBY2VmZmVqamNrcltfWV1sY2FOaVhaYFZKR0hLTVNXPjlebGhIRFZUXVtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpW0xaSlZiZkA6M0JoSCU1mqOgj4yroZaWoJaksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7K4s6mrubGvrrO1urWwuL2spp60qZ+gsKKorZuiv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio98gnOBgYqYhYd9iYqGhouNi5OFlZuTko6PkZaOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gmJmZ2pubGdqamluXWxscnBgVGNpY2ZaSUZNTU9YUVBVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Zk6GaqbGvnri/taC0wbu+urGmt7CnraS3uLe2rLuurKqrt6qzt66msrWyrqmwtbWwsrW5pqiftKecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSVmp+bkJukqququ6CnpKCYmpmdoY9ropaZnHCClZmjgHWSqaeelJSekImYmoCWiqKQeYeUjYNtan93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVFVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qsqqO9xa6pt8K3vbytp7ewpKqit7OxsrC5rKmmrLSlr7Sjqbe1tainq7ayrbSts6Gon7KpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dqKmktrCko6KclpiXl6OIoY6Smoagh5KcoH+lf6aqnpKSmpGIhHN4jY6FiKF2iY1pl4lmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcW+IWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU3MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeWg52rnZiYnZ+qqaeqv8Ousbq8t8C/qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyqK2dqaCwp5+jopifoZqtspOjpaW1vaatp6uqrKiloJ+Yn6ajmZiloqOYnKSolpOim5OTo6WmobikpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytaa7kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFzlHOaoaqQV09XYk9WTkZVW1hRUFONXVdbUUFdRFBORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYunk4GnqZ+XnJ2lrLGosMK9srXAtba+waums6ysqKaus6mutrOmp6W0pae3rZyzsbWrpqSnsK2ssKapnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZuamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5eWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tPWGBcV1Y7TotPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTQuLjUzLysvKC4wLjo2LyckMjAzQi8+O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLG3usGmqLCqrqior66jsLqvo6StsqOpt6eesrKwo6Whqayuq6+mpp2ioa+aoZuWlJaam6yklZqhnrOzoqyco62toJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4OgjoOwdnefcWxsbHyLTqRYSGJimX5jaKZfeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSlxlWVxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YtMC45NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCVh7OmpqGvqaiyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns62jqrSjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUmJ2soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mdoqmbppqcm6Khl5ORkpOcg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFRXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCos6ijm5ydqpWYl5WWk5agqZyZlqetsKmjn4+toqiWnZWboKWgmKGgoaCaoaGnmp6hnpSYmqagnKeVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPy8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKksa2jq7ytprSmp7W6vLK6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CSoaeflZOlqrCmopeTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlZuhnZyllZ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmxl7TCrqiyqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKKkmpKQpq2vpqGWmamgoo6QoZmnpJ+VmaSonZyknqycoZyfjJOfmp2hmZmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkheQjI/OKOemZrBq5e0wq6rrKmmtLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi1q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5ien5CMjKmwsKeel5uopqCMkaOXp6qmlJeop56eoKKtpKGeoYyToZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtTPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGcssCvraurp7ept661v7S6r663tqrAtaipoJulo6Gckampp7SisqetqaCXnKefpKu4naKsmpWYjqOilYydoJuYnJ+Rk5SrtrGomZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOQmKKWoJuWnJahk5ypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYerfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYGZnY214b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5qJueo72hl7LDsK2pqqyxprevtsOwuLCtuK6twLCro6Kdo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn5Ckn5KMnKKel52akZWTr7myrJaYpKinlJCWpJyjrJ2Qn6irnpqfqKKzn6OljqehlKKbnZiVo5iPr5+RlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbZ0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZFpUZmBjXmNRZ2dwbHVDTlFMQzpaTT9LMjsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKieoaLApZa1xLSsqqisqqm5rrDFrbOyrbWmtLisqaGhpZ6gnZmTqqOsqqW1p6afm5Wgo52spLyloKmWk5uQoZuSj6GnoZKdl5SYlbK1t62ZnqSkoouSkaWbpKqblaikpZuZoaimp6SqoZKtnpeknpiXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgZqVlGVeYGJwmYhpcot9hpVna39ydHh9f2JceHSBaFBdboN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtYZmNfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2oqylrqentLGsx6uvsqqzor2wsKWfoqedo5uZmaumrqOktKmkm5iVoJqmrai9p6iklJOalZ+ZkpakqaiQnpGQmJ2ws7+sm6eep6KIk5Gpmqejm5qqoKOZmqOnrKOgrKObsZuUp6CXlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNh5iWjoqMmJaHlJWLhJOUkomOk5SZlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWLioFxgnh5dnWJf3yJanOBdIN1ZXZ9d2tvem1fZF1waE1ZWmZqX1dab3ltbWZVT0ZSOU5ZTVJPKCs6S0I2MzU9QEE6OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6Gzo8ChpLKyt6CppbKnpa+0qseqrK+ks6TAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6qo5WRmpeemJKToZ6eoqeTkpqpqLPEsJqrnaufj5aWqJ2qnJyfq5igmpuipK+noqaooK+Yl6edmZmgnp2cr6CcoKWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYGZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GBiWt1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWt7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLShubC/rKuvsrGgqqeyraKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52ZmbClrb6gq6KQkJ2ZmZSRlaGcl6idhJ6srKO0yLSgqqSrl5WXmqadqJqeo6qTnp+doKqvqqakrKOvm5+goJiknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpF/iIJtd4F4f3NueYR0domHjoN8aodZXmx1ZV1ziWlre3BrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2loLq8uq+stLGqpaitrrCmraywu7CopqOsrbCerJafo52imZmmqpyto6WnqLKunpSij6KvpbW4pa2ijo2ZoJmTkpugmZmllnylr6OotcW4paKnr56clJ6inqOboqiokZ6gnaGqsKuspKuhqpunn6efq5agm6Wvo5abqJWfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558lpiJncC9gZadnYycwcF8gnyTjZrDwH5spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUYmdgeGRfZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6iwrq2lsrOuqaSlpa+rnqqYmqKfnJqqpqGdq6KkqKSktKScopKlrau3s6etopGQmJylkpCgoZicn52Ip62lrK7BwLGhqa6plpKenaGZoaKpo5KgoJ2erK+rrqekpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1leod2dmt8h259hZCRfm2DkGBxbHBoYF95ZVxxZ2pkZ2BSVFJXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrpbKqq6qiq6auqZ+mm5mlmJyir5+gn6ino6WgnrCrmp2Vpq2rsKqoq5+UkZqfpJKPn6WXnqejn6+mrbGpwMezqKmxrpaSnZuhl5+oqZ6UoJ+dna2wqayrnKiopaKrkquylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYudfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmWFb2F3bnJviYqSjoNuk5JmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOfnKKOo6KirK62rqixpaippq2qqqeho52ZopWfpaufoaWfqKiinp2wrJealqmnrquopqeel5SZo6GSlKGtm52no6+tpa62q7rOsa2mrquWlZydopierauclqCZnZ+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJCUoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoGWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6prKKnpamqqqikpqCbpJ6dpqeno5yrmaKsoaOfr6GdmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23ybK1qquplpGcnKKYn6WznJmglJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSpqZCSm42AnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ6SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraykopuyuKyqoKWaqKSpq6qnn6ammKqjoK+rnqWgrJqeqaWdp7WeopeTqaq1saybpJyglI+lrJGanKejoaqnrqKmqKqxtcOys6qsqJOJl5ykmqGjrqWXoZWZnKWmrZyxnq6pp5+rorasoLC4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycICaYLx9UlV0jpKjlnt+lJOMdntzh4BxXW1ueHJqgm9bZF9qb2NlXUtNUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SquKquoJugrLKzpZ6glaWtra2qp5ymp5ujqKGzr6Opp7KgmKiklKK1oqKVl6KptLijm6Gco5KPobGZnpynpqGisK6dpqmjtrPFsK2prKmRh5Ccp5yipJyllp6YmZqmpaucsaKvpaaYr6S7raG1taycnLOwtq+wpJWcrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF+n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq29vry5tJ6Wp6SttaGhmJWjp6atq6yZpqOfpqGhtqijqaewo5Sro46lraOdkJmaqrOzpJyjnKiRlJeun6Cep6SdqJ22mqOrpLatxLCpq6mijISOnKKgpqKVmZmcmZuZp6aoma2or6Olm6ymvayUvK+snaGusLepsKSYp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGpwhpldYFuMoG2VkaaZgpWPmo58fISagGtugGN/dG6AemBnZnFvaWhnQ1phWz1LVTNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcG2wLOemqygrbelo46bpKKgsLCrn6Wgnq2Zn7mho6ugr6maraGQq6iklombkK2wrKaepZutl5iPrKGhnaWhmqWdr5miqae3qsGvpaiknouAjZuan6aekpSYmpSbmqalppuqrK2kpJ6pqL6llsGqqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIWmmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ9Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1ia2hybmdmZVBVZFxBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqp+koZ62maG0qKqsnrCtnqucla+noY6Im4+vq6imoaWZrpKYj6iZop2ln5qko6aaoaOqs6q9r6Sonp2OfYublaCgmY+RmZuSmpipoKOaqa6opaWipKi6np/EpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRfta9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxmbWtjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BQ0VHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraalsqadi5ilwKq4sqiiwKeos52fsp26qJ+ur6WmlZSwq5eMgpuRrqWirKCjnKqfl4qjk6eep5yboamkmaCirK6quq2oo5uXknyImZGlm5KOkJeZj5iTqZqhmaqpoaqnoKOqup2ow6KfrKGpsLKoraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqikm5ivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGhtY0tkWEprWjtRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREZIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XLvrern8GtrqSiqa2guqOkrqytpY2WrqmPi4WWlqyepqqgnaSjoJGLpJOnmamal6Sropefp6aosLurrJqbkpJ8hJeNpZiNkZCYlI6YlaiVoJmpo5uwpp2iq7mfr7+no7Gkqq6vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+WhoGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkXRrkXdyjHh4fXpqbWZlcGVVYFlAaltIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xaV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn6C1sZCNrMi+xru6q6Omn52nn7KqpLennam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiaoba7p6qZmpCNfIGVi6CUipWRlpCPlJemkaCbqaCctaOdpqq2p67AraK1pK2trqqnprC2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5GXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoaOkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9dJd0fIyAc3yAam9mX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY1ODk9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQkJ2ktb2wra2jpJt8n6SzpaaxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqpqpjZqpkJ+5tqSlmZyNiHmBk4uak4qUkZOQjZKXo42fn6ien7iif4OutaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKmraqjZZ2fknN5mpdxgZmpmG1/o6iKZZymnZKXmJaMk52Rhp6bkZaEk4iQkJKJhXdqjoZ2hXB6hX9/YGiHipORilp1lJBnaI+Pc3yonJxme5uKhXqZaoaMhHB6gGtxZmB3cGxraVxmZmJjcVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ipq2lkpWrt7Gzp5usqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56Mq5milaehnY6Xkp2Fdq2PiaecqpKZpIqcu7OnoJmYi4h1d5KNlpOJk5GQlIyQlKGPnKGnmZyxlYGMm7Scs4ySjbmln32nonmgrLR/jY2lnoOLhpCxqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qHnIGXp4OCe52zeoqGoZialZiWgpGXl4SbmmN6h5GFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjoeGmmuQjodseXxycWhmeXBqbGtcZWxqZ3VdXklUTFJARTYuW1VVNykhMDk+Pjc0MzQ2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWVFIOUVMOz5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqapppmTr8nAsqKXqKq3n5GFn62cp6KgjpC+npqNn5qgkH2GjpmXh6ucopagoZGNk4qFgJKnjYejnqWVmZ6HoLqxp56bko6FcHaQiZWQipSPj5uLj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIugnaWnkpjCgH+riJihcp6AmqV+l4WVs4GhfaGUoZCYl4GPlJyLmZKMfYWTh46WkoqDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhZqBj5GJjJpxkJWGanl2fHhoaXZxaGhsXmRwbWduWWdHXVFNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYl5qbVxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6ealaCjpaylmKasuaSwgaKpnaaenYqUvJqTjaGSno96hJaWkYermZubmqKFjox3mpyPn5CIn6WcmJqZiKO5raSZnI2MfmJtj4qTkI2QjI2XjJCSoI+UoKCZoad+oaeHrZ2fla2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZduX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm52dGxqcF9rcW5sallpT11YRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eY3ZgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgY2RjYWNqa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6jmZihoqWtrqGesLakqZOioaCnnJqOmbSakIuejJWLdYGUko2Kp5WVmZ6ffpOFhaylh5uQi5qqmZubkommsaehlZqIiYBpboiHi46OiYuNkouQk6OMlJ+fm6Gkf5OBj6Kgk6B2nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZq0l3N9mJ+zdXRcnrKDa2NwdXhyaXBZa210c2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tK2soJqinaSkpq+dnLOvrZSZopuhpZqblZ6rm4uIknmLhXGBlo6KkKCPkpSemH2Rio6ooYeXjoqSpJWdm42Mqailno+Xh4R+anuGfn2PjYKLkJCJj5Shg5een5yfnouJd5yYoYyfcaGKhqmHmqONlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfnNpdKuDn4N0qmiVml2bhXaFnmeqa4C4Zlyob4GcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRb6iaXql/ebxsf6pcjoRdtGhdb3J7eGxqXHFrenpkYGdYYkJRRk83V0RSbzVLW1tfTlpEQDE1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlYl5iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGwrJ6mnJypoJ+vnJ6yqa6fmKWcoaCZl5ago5mGiY1qiYBye5eIi5aWg5GUmZB6i4SVpJyKlY+GjZ+Tnp2JkKmjoJqMkoqAgGmBhnh/lox6iI6OiI+Wm3+Top6foJOYcmifiZ6Oi3CSjICphpedoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXlVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWR2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mysqmao4ycrJydqpWiraWjqZCgn52bmpaYoZ2WiIeJd4aCb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGcho+qnJuVi4uKfINshIVxgaGLeIWNiIeTmZZ8k6OfnaKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkX+jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn2Gm3B7e5hsnH14mHNuqaRnYWZ6coGFbGhmZW93eGlhY1NcZ1JSYkhYSlVhWFRcZmtcZVFFQ0tNSktCS0U4T0BRTlhTWU9TUWBmZWpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiGe3B9hGh9j4OVm4F3kY6PiW9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAboGfhneAkoaImaOXepSiopmfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpOYi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtueHmYapp8dplzUUV9s19qd2x6iGdraGN1dnFvV19UWWlRU2lKV01ZVFZeaWxvVmdXTUtBSk1LSEtPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq+1oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIJphIWRg4yFnY16jYyXp5SEmKqYjJGLgol6gH2LeHCQoYZ5gpWHiZaglX+UpKablZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11b4hiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallrVlFSRlZdTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnYnBnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafjICYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJmbc3WJfpB7ZYOGlIqJlZqCfImImKiSgaOtkYaQi4KKfoCAjnJpj6aEfYeTjYmYoI+Hk6mlnIimeJWbfqWIloqxl52Pgq6WnqR2k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZuffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3irkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66MtnV4vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlcYFtndWVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkZG5zZFJrZ2hvbHJqZmlhX15cYWtibGx6b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqDmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Zk3R0hnKRg25/i5GHhZSPfXyDh5mnj4Cnp4+BjomFlXaCh5JubIupgIOLlI6JnJ+JjJOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJidoIN7fYlrjIVbeXlyenFpbn6SinKAdYGPlJRxh4SDZYx/YIGAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWMp5l9dHuVaomIcIF2fYd3bm5pjXR6fJh4hVxsWHmPaW94c3NweHhwXWyHb2poV1tgV11ma2RXY1VfUmBweXlta3dnamtrd31yc3VzYW92YnR7gnh1eYJ2f4CAgXmLhYN+e25/bGR5bl5WbmdpdWt4amlpZVxgWmNpZWxxdG5aW2JsZGxseW5obG9hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90coRxlYV7fJGLhoaQhXl+gImbpY58qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIyapp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xpXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqWThGWLjYNud4uEcYaPenFoaWZ9hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x+c3x5dWRudWhtfH52enx7eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGptYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4SGioF7gYWNnKGRg6iiiHiOl4mVioucl4SDea2CkZialYqenYiIoKmeoaGjioeTm5yimZWpoKaknpGahZOLeXaMjYOnfn+SkJOUnbKmm5WfkI2xkpeDpIuMlJqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yRiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6jj4KEjIaCjJCMfYeMi5GEem6Fhn56mWtzaWF0i3F+e3d3cHd1gl1eb4dobmFfWl1dU2lxVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBeH99f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZ3JxbVZebHRtaHl6cWdpa2SMh5y4npahoJeUmJmUmKSgnnyAmqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRzipCGkpGLnJF9jXqqhI6TmJePnJaHhpuknqGZnIWCkpqZmI+Zpp+knJuPlX6Oh3R6hY2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2LiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOQg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8e3FweoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJugIJ9b2lsbmheeoBofn13dnd1fHhdYHF+bnVhZFtdX1JnblRmXF5ia2l3e39ybG1ka2pogX9sdIJsbXVwenCGeW6HgHaCgH2FdnGCjYh+e3x8f3yCi2Boe2p1aWmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop6SkZWYipqfn597eZ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaFh32Qg5GdnZOKqZ2BcYuLjJKGoKGJhYx8p5GJkJOYlJaTeIyinp+dlZh+gJCamJKLmqKgopiVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakYmSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKNf4OGh49peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouBlKOSioSPeoaGh4R2g4SJiXxodH6BenxybWxoX35zaX12dnV+c4FrX2F0d3F4ZWRZX19Sa2lWZlpgYWhqd3qCcmdsZGxoZoCBa25+aG9ybH95h3tsjIFzgYF+gnR2go2Gf3x7f4F+f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgY2ji4malnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gcf3CLgZGThaWbiI2Jg6aVhZOMl5iSkneRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4VxiJSAkoJsiYSCgYqFZnZve4WRmIx8kniLh3t/hnt6cH13iIR4go6HiZaflIGCinaIg4OCd3yDiod4Ynp6f3V/eGhtZmJ/amt4dHV3fnJ9ZGRhc251c25hWmFfW21lU2RZYWFpa3Z6h3Jja2NtZmh9gmxpdWlucGmAfYJ6bpCGcn+Dg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXuYnoyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5aZjqWjmYBzh3uTkommj4yOipKgkYSSkJWXkYuBjpeempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaThJV4cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgoqSoY94g4F0iYd9gHR1gomFcWN8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGplamNod4duZ21pa21ogX17eG+QiHOAg4V9dIGGiXuDfXqChH19jnJ5inh4bWyHa2hfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ8gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnpSnnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6Jh4uRm5KOjIxthJCPkYiemaGglpSIlY9shpeCZYSYjpN6iYSQinCWm5Sjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+Gko+TcXWBfIKDiX1mcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLk6aLeoZ7fYqEd35xcIGHhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtRWFllY2dxcoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZvjoV0gYKDfHWCiIZ4hXx4hIV6f4l3fot7e3N4gmprX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoaabhouLgY+ch5OddoKslpOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26KdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlZ6ZopaYeYp/gIyInJ2Kj4aSmJaFiZWakJaLi4uNi5uJjY+CbYmLkJCJnJahm5aThJaGaIKhgWWEm4mQfouDi4F3k5mTn5KRiYiUjH59jpd7kIyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYN6Z3NudYCZjnqHhHmTkHl1h3Nvh3qEiniJhICGjJmhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXFrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJWThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyhHuDooSUg5aUmZ2Tm3mSe4OMkqOZk46JlZmShIeXmoyTioiNjoacg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPj4yLj4x3epGQeo6KjJKWjHyIfIBrdmtva2xte39hen6QmIJ3e4J4g419emh0bHOGlYp9h4V7ko5xeYNvdot5h4t4h3x/iY6cm4N7enaBinx2cGpsgoR7YXlxb21zdFZfcGNyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hoB1dn6MeXuFgXiIg3OGhX+MjIN7epR4ZnFrg2CIfW9va3pgam51f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHNSTYLfyJLWkntwdYV3haKElXiWkpqdkZp8lHOFkJ6hkpOQiZOclIZ/l5aIjI2HkIyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4ehhJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXt/bXxlcm9rbXt6XIF6kZCBe36AgIePe3tpc2pzio6IgIWEfJSKbH5+bX+JfYqGe4N4f4ySmJiJfHV3g494cm1ncYCFbmt1cGprdm5UX3BlcFpgbXN5aGxrY2d5c3FxZGB4YWBWbGBfd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ+i3N/hn97iX9yiYiCkIqHfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e413c3eKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4VwbW9/c2VleXF9bXl9amhrY6Sawdyu8KBybHaFd4alh5NvmJKXopacgpJyhouil4iNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNm5qYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLj4mOi4qEiW17lYF9iIWJkY+GdoV9fmt9ZHh2a295c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYGCf4qVhGuAdW2Gj4COgnyBeH2Nk5CXj3Ryd4eMdXNxZ3V6hGN1bnFja3doU2FyaGxWYG91emFzZGBpf3Fzb1tkc2FiV25bXnlOTU1lZ2Jed3SKblxdZXlfYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol7dIuJiJaGi39+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYeMaXeAinJ/nIaYp5yjkoR9cYyUeHmMnoWGoY2PfJaNgJqIhHtzeHB0anCCbGptfXVfYXl3e3F1e2dgZHzr2rXJw9yHcmx0g3eLnYuPa5qRkZ6WlIKJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYODiY6NgnGGfn9xd2h2c2p1eGxajX2ShIZ+goWChYuDd2Fya4eBjomAfn6Qj3xtgWt3hI2EkIF6gHt9jpCOlIdtcHmMhXRrcWtyeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGFdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5X15kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WCfX+Id3aKho+YgYyCe5N1bHd2eXiTdG54e31YeoZxf29neHeSgmR2hoZwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lnbXh4XGB5e3txcYBpYWdhf9W2j5Gmd25xeH1ylJKOiWybkIqdk4yHe2mHi5iGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDenCHgJWZjpOSgId0goR0gX6IkZuehpWPn36IYn+Th4WJhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46CkIGGf32GgIWJgHBfcW+Ee42KgHt+kId6cINleYGIhYqBeoR8fZGMj5GCbW55i351bW5qbHx/ZGlsa1pud1lTanNpYlFjc3htY2ZeWmuFb3VjXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BbY2x3ZWVdXVpsbWNtanR3h39xcH98fXR4hniFgn2AiHV5iYGSlXyIhnaIgG94eXuDk29ue4F3XoN/dIJtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIuOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB+ZWNnZ1edj19ydJe+xYV4cpaLkYB0mY2HnpSNiXNqiI+VgHuUi4GEm4x8ioZ9fIiMfpKHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloWSjZ2AiGZ9k4KBhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCjIB6g4KEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhomEgXeCen6Uio6LfG1reoh8dnRvaGh+eGVdcmNZcXRUVG9zaWJOaHV5Z2FeXVhwgXB1WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4KDcW9+e390dYN6g4J8goZ2fomBlpB4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfYx2anmZj4CDi4OWmIp5j5ZveXNxbGpkYHR7aV9mcntbYXN9emZwemFlZI6xsndLY1ql29KYc3yTjZJ6gJeNhpqSjYdvbIWSkXl5k4aAhJmKfIeAeXiIioOUf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5OJko+UhYhwepKEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2HhIx9eHmBhXuDa1xvfHJ/hoOIfISHeohxgG1vgoWNgoJxg3d/loqMgnZsbH2EfnZ6ZWhqf3JhWnhcWnJuT1hydGdgS253dWJeXFtZdn90cFhnXmdrcmBvT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/iG9sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fm9yfHuTcG+Bf3hnkYqCoZidkoOGZ4eEcGd6l4p/gIWCmoqCfI2NaXhybGxmX2Fvem5fY3B5XWRsg3pgcHZfZGXV676LMzo+jI+Ac3qHi5GPeIWZjoCUj41/bm2FjIt1fI9/hYKViXyDeG52hoWClXZth4RrdHt1ZXmDhKeMg46LgnxtfnJ0gniEmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3dheYSCcmRxaX9udnJ1g52NgoGHgHR2foBzgXBba3xzd4iBiXqGf3yIeHlwaoaCjoKIcIB3fZOIiX1zbWp1gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXFeXFtaXXaAdmpaYltoZm9kak5YZ1I+X2ZcXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugHt9gX+Ce3aCgoyThXCAi254fYB7e4iTiYBpe35qdHxyhntzd35/jHp4hH58a4uMg5udloyCgG2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGJsdWFocIl6YXNzXmJkm6CQbl02W7C2dWuBi3+UiHeImYh1kIyKd3BthYKGdHmJeIl9k4h6f3NndYd9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8j4pxfH6GfGl+bWuAe3lqeneCh4FyX3eCfnJkcmh2g251fIaWk4J+g4FweHp8dX9tV219dXOJgIV2hnWBiXp3cmyHf45/g3F9e3yQhod5bW1obIKBdG5caGZ1clJcfE9dcl1PXHNwZFZLdHlrWFpZWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin19cH9+fIF/gnt3gICKjIRxe4dvcneDf3uJjY+Ean57bnh5dot3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWKknl+fIKSgIB+i4NwcnBjZl5YZ19wcGBhaHFmam+JdGFzb1thY2p2e3+/nailyrlyh4Z0lX56iZWEdZKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeH+SaHGDdmZ2dWNqfISInoJ/fo6NfHF9coJ3fY+OgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9Z2B3h31ranRofIFqdoGNkpZ/fH9/cn13fHV/YlV1e3Fyh4GBe4Jwhol3d29ugYCLfXx3fHpzjISAdGdwZ2uIgXFvXWhjdG9MZndNX29WVVp0bmJRUHV5Y1NYWF1icoN0XWJcaWVlZGxlUVxxSURlYlxkcl9deGhVV1Z4XltmbmlXbF5hamdlb25pcHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHeDc253goJ+iYuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWHjZF6f4B8ioaEd4+AZ3BuYGVcWGVabnNhYWFxbWxoiW5gc2lYXmNtgHep2qnIh4izc4t6cY93fYmRgnuUi4B1dHV9dn9vcH9uhXSUhnh1bGB5gHiHjWRxgm5ndW1bbX2BkJOAgHiSkXx3emyFc32PioNylYqRj4iGhnt/hm51d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y358aHWHj46XfXaBd3KAe31ugFpWcXxvc4GFfX93a4iGc3hqc36Cgnx5e3d6cYl/enJmcmRsi4Nsc1pqYHZmSW9vTV1jWFdWeW5iUFN1d1pRVlheYXOFcF1hY25lZF5vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn93eH13gYSBfHV9g4iIg29xf3VxdX6FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXFmV1xja398ys6HuqJrbm+MbnOGc36GjIB7koV6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZHmAeGl1eWeCd2h1iIyPln5ziGtwf4B5bn1dV298bHJ9iHqAbW6JgHB2ZnZ+f36AdHpveXKFendwZHFgbYyBa3JXa195XUlwbE5YVl9UVXxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZZHFIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6UinV/e3h+eYOIgHV0f4aFjoNwb3t4d3V6hoWGjIZ6fH91i399hoSEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSi3CFhYJ6g3VjbmpZYFpdXlRoc2VhWWRycmeBcmFrZVdaX2l/eL6ue6C3bmN1iGl2fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV/cJmScH92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNh5eAcYxobHuDdW11YlttempyeYl6gGV0hn1tcGd0fXZ9fnB6anl5f3d2b2RrYGyKfWxtVWpgeFZMbG1QU1BoTll9aGJPVXZsTVFUVV9od4RnXmFxaWdgV2pdXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312dIKIgJWDbnN5e3tzc4WGiIiEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dqdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1aXFtUZXFlX1hjc3VpdnBlZWNXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bXmIfGdsd2ZqZFVXc3COpnyEe3aWj3N7cXp4bHl5j4N1l3yIhoSHhH11cXNtaHVdbWlgbHVkZ2dpem97cllngXZ1aHCAeIJ2YneFi32Wgm+MbG58gXFmc2VganhmcHWIeXxhdIN2aWtwc3lveXhye2V9fX12dW1iZGBshnxsalVpYnJUTGtsUE1PcEhefGZhTlZ1ZUtPU1hibHh/Zl5nc2tlYFdkWGNyXkxMbFhkYlVUVnRXTVl3ZVpfbGFcW2RlX3ZnbWJwanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdnSRgHyBlY6BhYR8foyGen6Adnqjpop5iYaFbHV9fHaEg417b4ZzeoV9goN1b2ppZVZdW1taU2NvZVtZYXR7amhtaGBhWF5aaYBpbG+AaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnhuaW9mZl1VWG9oj6h2gXp8kI14dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNydGpvgX56eGJ3hYV5kYZ0iXNwen9yY3FoW211ZG9xhnp3YXJ/cGdpd3Nxa3d2c3Vignl8dXRvY2JhbHx8a2tVaWJnVExuaVBIU2tGYnlmYk1Ucl5KTlVaZm14e2ZfbnJqZF1WYVZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZmB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4Rxc3R+enZ0hYiQfoF9kWxzlYF8g5+Ff4d9gX+GgoCKe3aEq59/eoiIhWxxgnt2gYCCdW+Ibn2AdIqAanBuZWRYX1paWlVia2dcWl91gmlebWxcYVdbXGuBZXJ0fWprXm14d2l2eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCnbn53gIuNeXBue2V3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX2x1ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB5c3Z+dGFwbFhwcWFub4J6c2NxgGxhbHluaWh5eHNwZIRzeHhzb2NgY2xzfWlrVGheX1VMdWRRSFZiSGN3ZmJMVHFZS01YWWlsd3tlZW5yZ2NaWF5ZeGdVSl1kWGlZWUlXZlBJY3lbXl9tW15dYmRef2lqYG90eW1vbnaDl3lygYB9f4mMhn52doZ4hox9c3V1gnl6eoKMjn1/hYlqdJeBe4udfn6GeoB7fnyGiXNxj62Me3yHj35mcYl7dH59d3Nwhmx8fm2QemNwcGJlXmVWWllXZGZsYF1ddIVoWHBtW15YWlxse2Nxd3ZuY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3VmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpGh4dIKFkHdsbXhmdmx7g3l0h3KBeX15gGlmd21hZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOEk4CJhIl7d3BzfXJheGNZbm5gbm9/enJlcYBkXm11aGNmd3pybG2Bc3F7cXBhXWRsbnxlaVNnWVpVTnpgUktaWUhjdWRhSlVuVUtNWldqbXN7ZGxtdGNhWVpcYnhdVExkXllqVFdIWWFOSGt3WV9hblxcX2JjXIVpaGJueHptb2p2gZB5bYJ+gIGSiISBd3WJdIuGdHJ2doF4fX1+jI+Bf5N+cHiWg32Zk3mAgXd5fn9ziIRzcJmhe3t/iZV5ZXWJenN5d2x1cH9seXxwknNecG9haGJsVFtaV2lkbmZcXHKJZVNybltaWVdgbHZjanVra19bb3VybnV1dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fXCAXGFjXlNaYVxkkp5lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmJbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiICGdnRrcHxsZndXW2lsYW9wfndzZW99W2BvcGJeaXB9a2pyfXBvdmluX1pka2x6YWZTZlVYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhXFpYWm1xWFNRZ1dXalRVRlpdT0lzdllgY25jWWFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG6PhnFudnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBc3+BcIeDdm+il3N7hoyHe2Z3i29ufHBneXJ7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21dVlhVZmlzaGN1ZWVeW3B3b3F2dnpsiH1/fYh3j3NjZGtvYVxubWNzeIdrWlRWYWJ2e3tvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFteV2JkWWJ1ZVVgYW1kYXFdXH5vaGlzcXRxdXdsbYWVg4p9hnJzZ298b3FvUlplaWRvcX50cmJsdVVicWpaXm5ke2RrdHtwcXFobF5YY2lqeF5lU2RVV1FWb1hSV1RQSGVzYGJGWGtPSVhUV25pZXxpbHlrYlddVlx1ZVRTWGlSWmdVVElbWlBOeXdbX2VtaVpiYV9ej25iZ2t5dm5vaXZ2f35sg4B9hph7f4eBin9rk4hyZ3OAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2lUYF9VZ2BtcFxebo5oTWlsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7f3ecenlrYWVsbV5gb2plcXl+Z1pVV19rdnp5boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKfIhucWZwe2xxbGFYX2dmbXF/cnJeaWxTZXBkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT1xPUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVX1VedlxVU2FoT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHFzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPiJGbhIB7jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp8fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fX1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJOTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6PjYyNjY2Oj4+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4V3ZWdmZmZoXENEREREQ0dkaGdnZ2dna29ubW5ucUorLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyOLhodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoKCg3JdX19fX2FSNDU1NTU0OVxgX19fX19lZ2dnZ2dqPBgcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYqKioqKiomFg4ODg4ODhYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5CNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo2NjY2NjY6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYmJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd3eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWHjYmQiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z3e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMiY+Hjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEioyIjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjYuNjI+Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgICAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqLh4eJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Pj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj5CQkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhYWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkVFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BAQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BAQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtAPz08PTw8QD09PDw+Oz08PT5BQEJBQEBAQkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnl7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4+Pj09Nzk/PT0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09Pk5TVVJMQ0BAPz5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFHZmhsaGFfT0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJSVdqamhpaGZnT0RHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NU213cGltb3FlS0pJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1Ucnh4cm5vb2xNR0lHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpISUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNSlt3eoJxbm1tbEtDQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHJydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SkpHW2doamZpc3pxQz07OjxBQUA+PDk5ODw8PDs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVZkamxhZWx4gGU3OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYplYm9wbGhrcW14UTM4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk4NjY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hxdXZwcHVwam5LNDg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAgICAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoh2eHd2eHJtbUo4Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjYJ1eHt4cnFqSEFBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjH94e3p6a1dMSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkRGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ6Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH55endZTlNNS0tJSkpKSUVEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyOiXp6dV1RVE9MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMjI2NhHl6dF5RUE5OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyNdnZ4bVRTUE1MSUdESEtITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5/ZGdtWVhVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VEZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvYWNvZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gYCAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmpZPltbWlVSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9dHNbXl5dVFVTV1dWW1t1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUU9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIqAal1dXltWV1VYVFNYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BOTUtKRUM/QDtQUFpaW1NTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gX1gVVlbVlRXVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6alhbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpwc1pOT1FRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1ZVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFgUEhCRUVERERBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl1cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQz08PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBQTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVFQkJDPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSUNGPzo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn59e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTUtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRUNBOz08PDo9RzY2NzdEbXB0dnl7e318fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3t7fXt8e3l8ent+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFdXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEZDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUlBST1NPT1BMTU9NTE1NTk9OW1dLTVFPR0lIQ0lKTExLRkZGRT9CQz48Qkc/Qj9BZHBzdnp6e3t8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0pGREhIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hJR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pFSUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtMSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRkdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDRUVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0lISU9SUlNOUmZmZnJvc3h2e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NFR0lJR01RSkZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09NT05PT05KSklMUlVVU09XZGBgbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86Pj1AQj5AQURHSkZJRklIRkZHRENCQUFGRkNCQkNERUVHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MT05PT01OT0tLS09VV1ZVU1hfXlxpYW5qbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJra3JNR0dGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtJUU1KS0hISUVGSEhFQ0lKSUtMS1BTTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWNqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERkNERkVGSkVFSUdDR0hGSEdFQ0ZLSkhOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhISElEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tJTUtKS0xITEtMS0pOS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVtdXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QkFGQ0VFRUlGRkVHRkdIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTVBMUFBRVVZXT0tWVVRSU1FSTE9SUlFWWlpdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2Zrb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTVRVVFJRUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ2xvc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRTw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdjaGhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxIS0xLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkI/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpKTlBPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFREVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUUtHS0pKTkpISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjY2dgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXV0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFpQSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlWXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkNHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQEhGS0lLTEpMSkhGRElGREZHRUZKSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdJS0pKSURGS0tLRUZJSk5LTktITE5HR0U+R0dLSUtMSktLSUdESURDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdIRkdISEZHSUdIR0hLSUxEREtLTk1MS0hKSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19jaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0tJSUdESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYWZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0pMS0lKR0VKTlFRTk9PTU5MTUhLQURCQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBgZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUEhLS0tLTk1VTk9KSktHR0tQU1NOUE9OT05OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYF9hYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTR0pPSklPTVJQTE1MTE9SVVJPT0lLTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZlteYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01PU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdsd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVMTUdKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUFRQUFBRS0hneGxjeHJtW0xOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Jydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWFXbkxxcF5GaHlXdlRLaHl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ3VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NcWmRcYW1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWW11cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNTWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFNaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xaWllYV1xaXFtgXl9bXl5hYF9iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WW15qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFpZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltZWlNPU1FWVlZUT1dSUlpSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFlbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVltYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllUV1RXW1paW1lYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXVVSWFdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFphZWJmZmVeYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZVWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VYWFtaX2BcX1lZXFxdXl9cW11ZW2BhXmBkY2RlZWViWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fW1peXV5eYV1bW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFddXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZWZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVNWFdcaGlraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3p6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7enp7fHt7fHx9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPTxL2+v76+wKKKjIyNjY6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OXTzMzMzMzPqo2Pj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDg4KCgoKCgoJ+fH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5eXl5eXl5ent7e3x8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18ent4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXt5e3h8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9enl7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGBfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIioiGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoKBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHN0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcXBxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcm9vbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJwcHBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXBufIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxb3KYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJh4eJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgIGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQioqKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJudnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4OEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgIGBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOPlZiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4eFhoaGh4iRk5GQjpCOkZGMiYiFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIiHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4F/f3+BgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4ODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4OChISFhIODg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoODgYucmqGaioKCgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGJkpCMlqOjj4GCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhYWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgpOUlpiSl56ciYGCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SEi5mUmpmXlpWShISEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhISRlYOJlpiWlZSIhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhZ2TgYGYmZiYlouFhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hYWIoaCbm5+eko2QioeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAiJqgmpqjopuMgYyKiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uUoZeWmZ+fm5iLi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgoODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGVk5CXmJOYmpeNh4eHiIeHiYeHhoiHhomJhIOEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKDg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCRjo+QjpOYmYqDhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoWQjYyPlJeUhICCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp7e4iPjY2Pj4Z/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fH1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4uPjZCGfn5+fn9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf31+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIp/f39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g5CNlYyBgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7h4iUlYSDgYKDgYCCgIKBgYOCg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goeRhIOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp9gYd/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSMgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp6e3+CgIGBg4KAfn1/f3uIkXx8jpaAfX5/goaKhYODhIOCg4yJf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4ODhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4GBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgYCAfX59fn9+i4SBh359fHx/foKCf318fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX59fXx7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn5/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7fHt7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX1+fXx7e3t8e3x8e3p7e3p6ent+fYKGiIeIioqLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCCg4OBgICBgYCBf4CBgoF/f35/fn6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x7fXx7ent7eXp6eXp7fn+Dg4SIiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYCBf3+Af4CBf4CAgYKBgYSDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enp5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgYCAgoSBf36Bf31+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fn6Afn1+foCAfoF+f4B/f3+Af31/f39+f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOEg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX2AgH+BgIGBgICAgYF+foB/gYCAgYGAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgX+Af35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B+fHp7enx7fIKBf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEg4KEg4GDgYCAgX9/f3+AfH19foB9fn9/f399f3x+fn6Bf4F/f35/gH+Bg4KDgH9/gYGBgoGBgYCAgYCAgH+AgYGBgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f31/gHx/f319gYCAfn19f35+goCBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSBhISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fX9/f4GAgX9/fH6AfoCBgoOBgICBg4WCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIWDgoOEhIOCgoKDgYKCgX+BgX2AgH6AfX59fn+AgH9/f39+fH6Af4GAgYB/f31/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf31/gX9/gIKCgIGDgoSFhoSAfn18fXx8e3l2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R1hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoKBgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fX19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHt7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9/f4B/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fX59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4F/f39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgYGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBf4CAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+Bg4J/gIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx9fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGBf4KDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCgoODhIOBgoKDg4ODgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4KCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiISFhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhISGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4aFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIRqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhYSGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6Bf397f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSFeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgX9+fn9/f3p+fXx+fX9/fn2AgYODgIKDgYKEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoaDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4GBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t9fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4SEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fH59fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIh4eGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J+f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhISGhoeGhYSDhYWGhoaGhoWGh4aGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn5+foB+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaFh4WFhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDgoJ9gYGAf4OBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aHh4WEhoWFhoWEh4SEhYSIhoaIhYWEgoWFhoWGhoeEhoaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5/gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhYSFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgISAfIF/fX6Cfn6AfoB+f319fn1+e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeGhISEgoWDg4aCg4WFhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+AhH98gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHt9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaHhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX6BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx7fH5+fX+AfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B+f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4WFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fX+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn1+fX+AgICGg4SFhIWChIKChIKBgIKAfn1+f35/foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeGhYWEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af3+Af4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb28vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbV1tbW1tbX1tbX2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ68lYicnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuyrsHJmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquKTWlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+ks5/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uVodCKkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmarR26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2rkqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SdsaSlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNadko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3OTg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBwcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFFXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVRiUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFMDhZbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSm+heEF7d2RhUFFbR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDA1qZDe4yAdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkaOXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqmdiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbKsqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpMvUxba/v8C/uru9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQmG+pyMjH0cGvvb24ubu7vre0sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm1uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e0uLa2vLu5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLaztb24uLi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y0wMHAvbu8wMO6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBucK6xb/Av8LIvcfHxsW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7u3tMG5wL3CxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC9rKvAs7u7wb7Ays7KxL21vLu5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9v6WVw7S2tb2+vs7MzMK4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsKggae2qrC+wrrSycjDsbC0tLW8ub66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u66/n3J6o42TnJ+lw8K/vayqr62yure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7CmtKF5hKeXkY+Qjo6ZsLSlqKmuwbWzsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennaequsXL08CkkJSXgoOgoKSlvMSsrqewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiYzubh4d/VxqeRiXltcZehqcGmqKihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2rqKamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aVm9vPxsbMz8y/m31samV7pcaql6Kin5+loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPjs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUk66cY3KQtMbHx6t8aWluZpS1i5uen6GcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzX1pecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpehSy1IWoizwsGrgHGDiYN4fZSinp+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko1xlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZWchFJrf2lglK+unoOBnZ6jmn+qqqWhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVocnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmHxrkKKLXnCZmI+LjZ6jpaent7WwprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3ZebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZiln5GBgLPKypNig4WGj4iVoKOhrry+uKy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqqWNfoGw1NKxdGFze4N4jZaZlaXAwL61ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamtkH1wpNWUe4dLWnB0cYKDeniTvcjCv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKuuro6FZoOof3x2X2JgZGloY1tSdsDKxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb+/v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqK2spd0fXx6en55e5KEZVxQbGlaPG7Oz9DEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2OTo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2EpJmGZXx4d3+Pl5yQaWhmZKildT+k2M/Rws/T1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoSQhl5fXllXcYN9fFxTcVWKt4ljz9XS0MzQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHSyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0hn5PT1JKUW97bH5sU3JakqyCkdDV1NDJz8zS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5tcXFycnZxVE9OTVxhdWZ6hXZZZ4OMdJ7M0tHNxs7MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzczQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltcnFdSkNNTl1bYHFiSF1vZ1aRxs3NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MTFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWl3g2BGREhHQj9NTFFUZ15Ol73HxMDCv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH5xW01JRzhGP0NTSlRkWJSvv7i4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt0gW1YS0NOVzk6TUZIW1SVorOws7KysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8XAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQURGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhoand7X09RWUU5OEZJREphn5ekp66qqKqnsqy0r7Gnraarsru5tcK5ubmvqrS5u7PBuq/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcLGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqemxPWltEQDs2Oj1NipqRlJ+kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Szu7ezvK+4ubWyu8GywK+lqaOrsbOzqL2qq6irrK61tKaorqGlsKmzp6eorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8XDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG13XUxKVlZRUT5Cep2RjoeZnKWgoJ6jo6WlrJ6bmqOkq7Gutramr6umqbOrs7mwtbWttrmysLq6sbaloKWgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVma3JXUGBnb2pafI+WjIuClpqcopqcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqafqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubuwtry7uquzsrmzvbS3srG1tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRvbGV0fG9KT4KQlIqMhZOam6Obl5mipKCimp2fmZesq6ytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezrqmtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFxdnlgPkxgco2JjoiOmJebmZKdnaahnJ2mm5qYqaStrqmaoaK2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpabmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsbCwr6+nqKeyrbG0sLy0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncG90UjEsKT94jo6JjJSYlpqRm5ukoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGuq7WeoJ2VlamhopStsbGfoqOenpibk4ugk5GTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhvbkkrHylFb5ONh4qOm5ObkpeboZ6poqGioaGgmqepopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in5+XmZOKnZGNkpOWkJiYk5yho5yloaKVoKKkpZujq6WipKqkqq2lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9ia2pKOy89SVyHjoWJiZOUnJaWm6SkpqSppKekoZajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvpK64paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNwbE1CT3Rsa4SAi4ePkZqZlZqmpKKqqKWtoqWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKexvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgaWpmbGR1dmF7fIuBjIuQlJKXo5abpqOiqJuklZ2imJCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW7tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSUlBRVFFTVVFOTUtLU1dXVldXV1daXGFlWmBbbnhldnKFeoWBjImMl5uKlZegnqCXo5OemZOLhZeZi3OMgn2Nl5WFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6jo46JmqCho6SborSvrK+toJimuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraihppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaWGlxa2ZGUGmJeo5/hZaRho6Mm5WalZWUkYyUiH6SiF47Vm57i5OJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqJ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVVNkbGNGOTh6joqIdoGNh3+FiJeKlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTk1NVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZl1WYWlaWlFLiH2NgGx3f3t3gIePfpCZi455g419c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iYWBjVmiBjpKJi3Rgcnpwc3qEjHmBmJJ+b4SNenV5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXF5gXFl5mZy8e21wXHRxaXZzg4x2eYmDbWqJkHdyd2hpf4FxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRV1VTm3tYkGBqcF53amh5dYaFcn6EgXFqlo9ycXppaZyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhPR16mqphncm9ldmdsfXyAfXaAgoJ2b52Scnd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGZiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZOHlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRnxqdXJybndncIGCd3mAf3uIe3Oel3h8hH6DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtcZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQERDP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWT0dgeH9ygHJ0a3aJhnV4hIN6koN1nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhZKph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQT9DQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs7yzl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZrV1laYoGJfIt5fHp/i4x6gYSMfZaRf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaT0xOV1JRSFBKRE5HQ0pEQ0FEQ0I8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pOVl9femRjaG2Qj4OQiouEh4iUg46LmYecnI+gp6KhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFeaoR4b3t2k5KPnpyak5uQnZGYmqSapKecpqmnqLOWqr2qtcfItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktPTklJTEZHTUNITUZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuTjo6Kn5KXnZabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWqBinONg5ecn6u1sZ6opqijpLCorbOurqq4r7G8m7HDqrnJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldob1h5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVNW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd+jpqAppyooKi4wb2lr8GzqbC9sLW6s7yyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYWJXeXRxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NUFCNzY0MC82Q0hDUVtPUVVXVVxXT19VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09ei56on6ytuaywucbEsrjBu7GxvrS1v7K8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6OhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgouEln14enVlUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVNgX0xTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZCqsrC2ssK3tLfFyri5v7q2s7m5tbyyuLDEX3OwpLGanqq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGRfWWNgamdTWGFWUlVJRUVNSkE+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+dH16a2VwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0urHBura1x8i3tLi0t7ixtbOyrbS1l2N0p5ytb16irJuXoKKbpJ6qpZSfn5CTjpWYmKiepqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeWmBjWmRkUVxgU1FKQ0FFRkU8QEY+QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmampoYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrTDrrWuuLmyr8LEs663r6+6qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXm5WWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpmWlFdWE5QQUJIRUJIO0FDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscHh+cXpteHNtaYBwbWNqbXB4aHd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstaqxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXk5uRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PXzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuAc3JpcHF6eXJ6vsuafYuxhHZyhHZoYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn56fpqSprreppbKhoa2goq2hprGeiKaak5KRiY6NiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSZjoaTkZ6XqLCioaGlpKnJzc/Iw8zR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVlpUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZWAg253cG12f3Z4fXSFfHpth3Z1b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6SwoqOxnqGknJ+on6Kxm4WdkZGRj4qKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIubkquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFhGR0tJRUU9Ojc6QEBCOkdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtvfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qdqJ6gq5uhmZidpJ2eq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaOdYJ0dYF+dICEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlpmWlaSbl56VnZKRlqKdmaqVkJCJjJGCi4OIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJOflJCNjY+Kfo6NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk6Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WboZudlJJ/jIiAmIiAnJJuiKiFeqGLfJGNg4iEnH2akImMo6OgkKSvn4qQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyOlJaQipGThX+Kh5GMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGymJ2SlJehop+ZkpydqLO5raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX56gX2Ge3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXcoqyjYSokoSZk4WZjKKVn5eSiZueo5OqsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZmajo+TkoaTloN+j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztaajvMK+x8XFycjJwsvUzc3UqdLR1tXW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6WdmJCnl6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKXk4uKk5KGk5eFg5CPm3OQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjV2NYUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox5fYF7eIaLiYaEkqi8ramzvbClrrO0qaOisK2KmrWeo7mllaykl6mtuKalo5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieoquSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46UjIqMlpiRm5m0lpSqnYublJGNkJKLmJqJkZ2Pi4qWn6KNlY2YmZ2SnJielKGglJydpq6noqSzuKvCyMS1ur28xsjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoByh4d8gYl1goqDf219fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO2jKiyra69q5u7o6itubirp6aioaOjqq+ysaqdnKOYm5iXnqKmpZKjua+ov7ysrbK5paOnfYiGna28sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCem5ifoJSan6inpKKjsLOmwMbDsLC7tsXEw77Mp8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlZiQk5WotMbJwMLMwsO5yL26sKu5u5eytrmywK6lwKSrsLy9qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqrEw6SCi46Gh4SGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZmkn5qgm6CUmJ+mpKWnpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nusC9vMS4rMGprbO8vqqxqqSlo6yutK63taCfrp+mopijtLypnKi8waO2tq+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYuPj4+Vloh8jpWSkaKalKCinLamkJ+XpKSjpZ+eppielZebpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFtaXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6PnY6Wjp6SiYp/iZ+ShHiFf5R+f5CIiZCAlqCarqekmMO+yMTIxtLNzs3LvMK4sLq9tL3Lu8TCtra8rbS/uryur6ihqKi2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tl5WlramgkY6SscWnlI58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKjI+Pnohaj5aXkpakmWaZo56zpZajlqutq6ecn6aXmZaYlaGkqKaetaupurzCtKa0tcvBuKq1rLO7uK6ouLq8t4RwcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeoloyQg4alkoiBh4Kag4OVkJCTjpqhn6++rqHHvsXFyMfOzs7Syr67trG7u7y/z7bEvre5t7OytbO4tKynnKusuaupqLCwmKOupaikpbTAsKustL7CucC5s6e4tLeyr5WkrbCwpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YioyPlZ1fSpacmpSZpJdUlrCfr52fpZWvsK2lm6GllJOZmI6dn6ahmbSpqrO8u7ursLLHwLimq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiRl4eKp5aNiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjNzce/u7OvurjAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaImpalm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJ2CbXWSopqVnKKfkK6yoquWqqqYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTkhJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FMVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvrqyr7m1wMLKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvbuorL20t77HvLa1uMCwvcCzqrW3rL+mj6KWkKCfu56JmqCYlp2djraeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqC1sKSlk7Krmqutn5+lpKqSlpWghJCen5yVqaWhobO0uratqLWysp6co6Wal5WZqqGeeGRgYWBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5WZmo6qlpWoppWsrZmiq7fFwry/uMHCwMjEv83GvL65srC5tL/CyLbAsLy3urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0ubi/sL7Bt7WytbC+pJajlZKak62fkKGipKKinpC9pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqymnJezp5qwqKCcq5+ijZqWoIWOoZqckqWlmpersbayqqWqraycmKCgko6QlqmflGlmXGNfUUpIS09MR0VESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa5tbSxtLS3wsa3v7G4tbq1oKesq6yenp+lpMGloKquoKSprbCipqi9taWxvLe2tsOys7e6vrLDwLe4rrS1taOcpJSRk6CsnpihnKioqqKawayonautmpqdmKWfvaGcpJeqqquloJiNmp+SnYiNV3+WnqWhoLmqp5OZt6Ofs6KhnLCYoY+blZ6Cj6CXl46io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYk5KS0tORkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gmkqmjn6Oeramrnbuxqay1scjEwcOzwsO9x8S9xcq9sLG2rrG1r7/Ftbqxsbq2rJupsKqqm5+moafBrZussZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq6roqWVlZOiq6Cen5qnqq6ur7uxpZ+oqZmYl5Kio7egoaORra6rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco6+bn5ywkaGVmZWbgJKilpCOoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7s62wtbTHv8TDtb/EvsrFtsHJwrWstamwuay/xLS4r622uqaZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyp7m0uLK5waq3s8O9tMWnvq6tt7WpqKyhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKCdmpmalZeooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZm4aXoJSNkJ2ek4upqauhp6CanpaNj5mQgoaWiZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW+paiurqCptaqdt6+ro6q0trGwuLewt7i4xb3Dx728w8LIwbrCxsK6qralrbutwcO4uKqtsryjla6wrrOXpqiRqrqqoKawnaqgr7Szqqq2tay7rLOyuresubDCur2/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaaqn5ufn5qdpZ2hmJ2jtLCcn5GUppuhqZyWo6KYmoyXmpSWl56UiZGbmZSOqamnn6OcmZuTh4+Zi36Ml4WPm2xpbmJub1hRUVpUQUNEVUA7OklBNzpYUGReUVdXRVlfXk1MU09eTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKCqr6qisLeopLOyq6Gttb2vs7m9u723t8HCv8nDucTDwcC5xb7BuLC2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1vK2wsbWssLWywLrFtqu9r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7KqsKmim56no56VoZmcqLapmJqSkp+ZnqGgkq2hm5qIl5qMnpqdlIuPl5eal6amo6CelpaWk4CQlYR7j5ODjJdnbXJocXNfR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbX15OTVNYY0pLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcaEs1jHpmTEClmZ+krLWjrKikrq21qK6zuKansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyqure7ur61q6+xt5iYqKyrrJyuq4+rvZ2rrrGjqZ+xrbOurrWxubaqra+yqLawtLq8ybKqtbSxtLCvp6Gzn5qoq5+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy4opiTkY+YnKGZmJWuoZ+Xg5Wajp6dmpeRipSTnpqlo6OhmZaTkpV7jJCFe42Lg4uTbG55b3Z9YUZgalpJSFpbPXtKR0U2QWNUaVtNXWFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2s7ejrLO3ybu1u7u/vrW0t8PAzMe8w723v7/BuMC9sr2uqLq6uLfCt6yusbqWl6euramksqmUr7ukrLKypqeisrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp+fp7Cfo5SbmJSxnqebn6mNqaKdm5WXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVjo+MmJ2imJGZqKShmYaUmJGenJiXl4mXkJebqJ2loZKWkpCVdoSQhnuGgoSNjW5xeHZ8gFxMZWxcS09kXT9ie0dJOEdoV2VcTF5iTVlaV1RYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpaKwsbKpt6+1n6u0uci5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLywrLS0nqGnsa+mp7GlnbG1rKqysKuoqLW6rLWytauzrKqrqaypua6ysci/uKS5sKmtraaorbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inaOoqpygmpuTpLWaj4mOiJGjoZaPlp+jl5aHkZWVnpuZl5WImJOVmaedoaCNk5GOkHd+j4R9fH2HiopydHN/fn1cU2NuXk5aZ11GRJZbRzpNblhhW01hYk5WV1ZXVVloXlFTTWNbW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoaivpKajs7Ows7SwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6yzub3AsayyraKkp66rqKWwo6qwqq6qsa6urKuzu6e3sLGosqqrpaWjr7qsqrHCubSsuampqK2pp7GlqaSiramoop6boqyVpZ2XnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mapJiZkKGomIaEj4uKn6GQjY+YnpKSiImSlqGdlpmWh5eTk5elnZ2djJKQjYl/f4iEfHd/h4WGdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPZFxOVlZVV1FcYl9TUE5oWVhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1ramkq6q9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaeosaWzraqvra2wrrKts7ult7OsrK6oq5+jnrG3q6qturaktbWkqqerrKqtoKimprCxo6eloaGrlqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlpCYnZOBgpCJhZ2gjYuQjpyRk42Fj5qlm5OSm4yTkpGUo5qcmouPi4t8hoKCgXp1gYOBfnV4iqKGeGpdX25mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVktPaVhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Xqaittaq1saqkq6qpvMHAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsq+trK2nt6qmra+qt66nsK+usaq1qra2p7S3q6ykqaqcpJ60s6iopLO0n7Wtoaqoq6irp5+rrKi4tamqqamiqJ+tm5GqoZ2gpKKmoqqdnKa0rqelqaKjl6Smp6qcoqSjoJqYn5GPj5mNf4eMh4SenomGjIyRkZOPhYiXo5qOjpuSkpCPkqCYmZeNi4R/dIaCf354dYN/e3h+f4edj3BxZmZwd1xhdIhqT12YVkhteVVkVlJjUE1WVFVRT1hbYlVJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+ppK+pqLu/vMGysLmtoravyMfI0MC/vbq8w767xMK/v6+ys7K1vbzBsrK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhtq2poZ+usqC0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqCop56nm5mpsKiin6uioZKhoqKnmZmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJGekpOQjZGdlZiPi4aGeHSBf3x0d3mAe3V0e2uDh6R2aV5la4B1Z4iMfFJWb15LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKOlqqOjoqyms7KxqKSwp6q4vsG9sam6qqeusMnGyNDDvr+9ub/Avcm8wbixsLWyury5v7O0vKy5rKO0pqarsbW3saWmubSss7yvvKWtrbWrrZypr6SfpKyqqJydqrKjs6iaq6eppKidoqmnqb2qtLCunamkoK6cmrOilqScpaSfpZqaqKqlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWToo6UkYuRm5OWh4p/gHF6eX17Z3Z8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGJQUllLTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJien6ikoaGrpLaxsaSpsKatucG9t7GkuayoqK/DycjMwre9v7W4wbrItsK1tLK1sr25ur22rrm2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbCjnKWpqaOdm6Swpq+gn6qpp6Gpm6OooK28p66wrqGqoqSunp6tppifm6GinJ+bmaOqopqZo6OVlpSgoZablqWsjJ+SkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKSKk5KIkJqQlIGJfXlrfXZ4eGJ6enFvcXR4aoJ1a4JnY2dhbnOObWJqb2BvQFx5a1ZeTlFSS0lNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62ir6+orLjDu7SuoLmvq6izusfKx7+4wb2vtL+3xLbDsq+6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oK24taemp7Czn56lpqigpZierKeonqCqr6egppeiqJ+wuJ+ksa+gq6GspJymp6iam5ueo5Wcm5qdqaaWm56okZiSmZ2TmZahqpGaio2Qh32HfoKOfHyhjY2JeoSNhoyPjYaKk5qOiJSgipGVgoyXjZJ9hXxzcH1xc3NfeHdpbnFxcGuAc2R6bGdlY2FmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdXDUolZulmJuVrJ+doaOgtquwo7Szqam5xbezrqG4ra2sr7XFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevsZuhpKCko6CWm6+moZ6iqK+hoKGSpKSht7ChprGrn6ujrpidqqWon5ianaSTmZuanaWpmZubpJWUl5WcjpOXoqmikYqKkIZ6hH6Ei3mPl4qNh3uDiYWKjo+GkJOYjI6VmYuQl36Gl4yQeoF7cHJ3bm9zXnd2ZGxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFNWRzM5Xl9sUEVZVllmTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobaqraC7t6WsvcW0sK+jta+srK+0w8O8s766trCzubi6t7qvrcCzs7ivv8C3rL26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CypJmepKmpnKKfkqSgpLippaeup52loaiToKmioaGZm5yfkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWIiYqShpeSkouQlZSOjpR7g5eQi3d+fGx0cmxrc2F3dGhoamhncIZoaGlkZmlpYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1EV1VeYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequranrMPBuLGso7aup62vt7+/vLLBtrCusra2uLa2raq9s66ysLy+t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmprLClmJ2pnaakkZilrKKYnaSpoZuhm5afnae1prCqrqCgnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrYmdkZHaBY2VmZmVqaWNrcltfWV1sY2FOaVhaYFZKR0lLTVNYPjlfbGhIQ1ZUXFtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJWksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7O4s6mrubGvrrO1urWwuLyrpp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd9iYqGhouMipOFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZaSUZMTU9YUVFVYWWAVUFXU1lURklGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvnri/taC0wru+urGmt6+nraS2t7e2rLuurKqrtqqzt66msrWxrqmwtbWws7W5pqiftaecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSWmp+bkJukqqupu6CnpKCYmpmdoY9ropaZnHCClZmjf3WRqaeelJSekImYmoCWiqKQeYeUjYNtaX93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qsqqO9xa+pt8K3vbytprewpaqitrOysrC5rKmmrLSlr7Sjqbe1tainq7ayrbStsqGonrKpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dp6mktrCkoqKdlpiXl6OIoY6Smoagh5KcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ6qqaeqv8Ovsbq8tsC+qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyp62dqaCwp5+jopifoZqss5OjpaW1vaatp6uqrKikoaCYn6ajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytae6kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFdRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ2lrLGosMK9srXAtba+waqms6ysqKaus6mutbOmp6W0pae4rZyzsbWrpqSnsa2tsKaqnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZyamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICUeHlqpzdKr1xYU2xkW0tPWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLK3usGmqLCqrqior66jsLqvo6StsqOpuKeesrKwo6Whqayuq6+mpp6ioa+aoZuWlJaamqullZqhnrOzoqyco62soJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSltkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCViLOmpqGvqaizrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUl52soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mcoqmappqcm6Khl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFQXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaeap7itoq+xn7O0sKCknp+mqbCos6ijm5ydqpWYl5WVk5WgqZyZlqetsKmjn4+toqiWnZWboKWgl6GgoaCaoaGnm56hnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKlsa2jq7ytprSmp7W6vLG6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CRoaaflZOlqrCmopaTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlJuhnZyllZ2VmaKelZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmwl7TCrqizqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgoo6QoZmnpJ+UmaWonJyknqycoZyfjJOfmp2hmJmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F8gmuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkhfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi0q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkaOXp6qmlJeop52eoKKtpKGeoYyUoZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t4f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtSPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZMXjgxQzimnJuevKGbssCvraurp7ept661v7S6r663tqrAtaipoZulo6Gckampp7SisqetqaCXnKefpKu4naOsmpWYjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOPmKKWn5uWnJahk5ypnJSPqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWZnY213b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qqquxprevtsOvuLCtuK6twLCro6Kdo6Gcm5Coo6mypLSlrKSelZqqmKasuJyhrZiUn4+knpKMnKKdl52ZkZWSr7myrJaYpKinlJCWpJujrJ2Qn6irn5qfqKO0n6OljqehlKKanJiVo5iPr5+SlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpbTT9KMzsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Srqqisqqm5rrDFrbOyrbWms7erqaGhpJ6gnZmTqqOsqqW1p6afm5Wgo52rpL2moKmWk5uQoZqRjqGnoZKcl5SYlLG1t66ZnqSkoouSkaaapaqblaekpZuZoailp6SqoZKtnpeknpeXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBdbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2o6ylrqentLGsyKuusqqzor2wsaWfoqedo5uZmaumrqOktKikm5iUoJqlrae+p6iklJOalZ+ZkpekqaiQnpGQmJyws7+tnKeep6KJk5GpmqijmpqqoKOZmqOnrKOgrKOasZuUp6CWlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiWjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVT0ZSOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKyt6CppbKnpa+0qseqq6+ls6TAp7OgnaOknKOVlZ+qpqyiorarn5iWlZ+XramkwJ6ro5SRmpadmJKUoZ6eoqeTkZmop7PEsJqrnaufj5aWqJ2qm5yfq5ihmpyipK+noqaon66Yl6edmZmgnp2br6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWx7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLSgubC/rKyvsrGgqqeyrKKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52Zma+lrb6gq6KQkJ2ZmZSQlaGcl6ichJ6rrKO0yLSgqqSqlpWXmqadqJqdo6qUnp+doKqvqqakrKOvm5+goZeknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJueIJ4f3NueYR0domHjoN8aodZXmx0ZF1ziWlrfHBrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq8uq+stLGqpaitrrCmraywu7CopqOtrbCeq5afo52hmZmmqpyto6WnqbKunpSjj6KvpbW5pa2ijo2ZoJiTkpqgmZmllXymrqOotMW4paKnr56clZ6inqOboqiokZ6hnaGqsKyspauhqpunn6igrJagm6Wvo5abqJSfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3eQg46BdXmAf3lxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6mwrq2lsrOuqaSlpa+qn6uYmqKfnJqqpqGcq6KkqKOktKScopKlraq2s6etoZGQmZykkpCfoZiboJ2Ip62lrK7AwLGhqa+plpKfnaGZoqOpo5KgoZ2era+rrqikpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1le4d2dmt8h259hZCRfm2DkGBybXBoYF95ZVxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbSrpbKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6rsKqoq5+UkZqfpJKPnqWYnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp6UoJ+dna6wqayrnKmopaKrkqyylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYydfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmSGbmF3bnJviYqSj4NukpFmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SUlARDw+PUBGRUNFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOgnKKOoqKirK62rqixpaippq2rq6aho52YopWfpaufoaWfqKiinp2wrJealqinrquopqeel5SZoqGSlKCtm52no7Ctpa21q7rNsa2mrquWlZydopierqyclqCZnp+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoKWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6orKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKYn6WznZmhlJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSoqZCSm42BnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ2SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramyrKylopuyuKuqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7WeopeTqaq1saybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylmqGjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2ZraawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycYCaYLx9UlV0jpKjl3t+lJOMdntzh4BxXW1ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SruKquoJugrLOypZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO1oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5Ccp5yipJyll56ZmpqmpaucsaKvpaaYr6S7raG2taydnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF/n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhHQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq2+vry5tJ6Wp6SttKGhmZSip6auqquYpqOfpaGgtqejqKewo5Sro46kraOdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqKVmZmcmZyZp6aoma2or6Omm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGtwhpldYFuMoG2VkaaZgpWPmo58fISZgGtugGN/dG6AemBoZnFvaWhnQ1lhWz1LVDNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6marqGQq6iklomakK2vrKaepZusl5iPrKGhnaWhmqWdr5miqae3qsGvpKmjnouAjZuan6aekpSZmpSbmqalppuqrK2kpZ+pqL6klsGqqaGgqrC3qauknbKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIanmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ8Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFtBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTk9RUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqZ+koZ62maG0qKqsnq+tnqubla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qko6aaoaOqs6q9r6SnnpyOfYublaCgmY+RmpuSmpipoKOaqa6opaaipKi7np/FpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRf9a9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraWlsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WmlZSwq5eMg5uRrqWirKCjnKqfl4qjkqaep5uboamkmaCirK6quq2oo5uWknyImZGlm5KPkZiZj5iTqZuhmaqpoaqnoKOqup6ow6KfrKGpsbKnraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqiknJivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHqAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XKvreqn8GtrqSiqKyfuqOkrqytpY2WrqmPi4WWlqydpqqgnaSjoJGLpJOnmamal6Sropeep6aosLurrJqbkpJ8hJeNpZeNkZCYlY6YlamWoJmpo5uxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+VhYGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn5+1sZCNrMi+xru6q6Omn52nn7Gpo7annam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiZora6qKqYmpCNfIGVi6CUipWRlpGQlJemkaCbqaCctqOdpqu3p67AraK1pK6trqqnp7G2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5CXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoWPkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9c5dze4yAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQj52ktb2wra2jpJt8n6SypKWxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqZqqjZqpkJ+5t6SlmZyNiHmBk4yak4qUkZSQjpKXo46fn6ien7ijf4OvtaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKnraqjZZ6fknN5mphxgZmpmG1/oqmKZZymnZKXmJaMk5yRhp6bkZaEk4iPkJKJhXdqjoZ2hXB6hX9/YGiHiZORilp1lJBnaI+Pc3yonJxme5uKhXmZaoWMhG96gGtxZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56MrJmilaehnY6Xkp2Fdq2PiaebqZKYpYqcu7SnoJmYi4l1d5ONlpOJk5GQlI2QlKGPnKGnmZyxlYCMm7ScsoySjbmln32nonmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qInIGXp4OCe5yzeoqGoZialZiWgpGXl4SbmWN6iJCFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuW1VVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVtiYWhmWVFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkH2Gj5iXh6ycoZafoZGNk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSPj5uMj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIygnaWnkpjCgX+riJihcp6AmqV+l4WVs4GhfaGToZCYl4GPlJyLmZKMfYWTh42WkomDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYV5pbFxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvJmTjaGRno96hJeWkYermZucmqKEj4x3mpyPn5CIn6Wcl5qZh6O5raSanIyMfmJtj4qTkI2QjI2YjJCSoI+VoaGZoKd+oaeHrZ2flq2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYKUkoyKppWVmJ6ffpOFhaykh5uQi5qrmZubkoimsaehlZqIiYBpboiHi46OiYuNkoyQk6ONlJ+fnKGkf5OBj6Kgk592nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tKytoJqinaSjpq+dnLOvrZSZopqhpZmalZ+rm4uIkniLhXGAlo2JkKGPk5SdmH2Rio2ooYeXjomTpJWcm42Mqailno+Xh4R+anuHfn2QjYKLkJCJkJShg5eeoJ2fnouJd5yYoYyfcaGKhqmHmqSNlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0RSbzVLW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKSboaCZl5ago5mGiY1piIBye5eIi5aWhJGVmJB6i4SVpJyKlI+GjZ+Tnp2JkamjoJqMkoqAgGmBhnh/lox6iY6OiJCXm3+Uop6foJOYcmifiZ6Oi3CSjICphpidoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyfn9vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mxsqiaooycrJycqpWiraWjqZCfnp6bmpaYoZ2WiIeJd4aBb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGbhY+qnJuVi4uKfINshIVxgaGLeIaNiIeTmZZ8k6SgnqKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhYSlVhWFRcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiFe3B9hGh9j4OVm4F3kY6Pim9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAbYGfhneAk4aImaOYe5Sio5mfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpKXi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtud3mYapp8dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2lKV01ZVFZeaWxvVmhXTUtBSk1LSEpPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq60oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY6JjIFphIWRg4yFnY16jYyXppSEmKqYjJGLgYl6gH2LeHCQoYZ5gpWHiZagln+UpaeblZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallsV1FSRlZcTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJibc3SJfpB7ZYOGlIqKlpqCfImImKiSgaOtkYaQi4KJfoCAjnJpj6aEfYeTjYmYoI+Ik6mlnIimeJWbfqWIloqxl52Pgq6WnqR1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaSlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66NtnV4vo2kk1qDp46rYXVzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlbYFtndGVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhX15cYWtibWx7b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Yk3R0hnKRg25/i5GHhpSPfXyDh5mnj4Cnp4+BjomFlHaCh5JubIupgIOMlI6JnZ+JjZOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJieoIN7folrjIVbeXlyenFpbn6SinKAdYGPlJNxh4SDZYx/X4GAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWNqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11na2RXY1VfUmBweXlta3dma2trd31ycnVzYW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5WbmdodWt4amlpZVxgWmNpZWxxdW5aW2JsZGxseW5oa29hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90c4RxlYV7fJGLhoaQhXl+gImbpY98qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xqXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCJjqWThGWLjYNud4uEcYaPenFoaWZ9hXuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH52en17eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGpsYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4OGioF7gYWNnKGRg6iiiHiOl4iUioucl4SDeayCkZialYqenYiIoameoaGjioeTm5yimZWpoKaknpGahZOLenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZGbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6kj4KEjIaCjJCMfYeLipGEem6Ehn56mWtzaWF0i3F+e3h3cHh1gl1eb4dpb2BfWl1dU2lyVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBd39+f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZnJxbVZebHRtaHl6cWdpa2WMh5y4npahoJeUmJmUmKSgnnx/mqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRyipCGkpGLnZF9jXqphI6TmJePnJaHhpuknqGZnIWCkpqZmI+Ypp+knJuPlX6Oh3R6ho2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOPg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8fHFxeoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBofn13dnd2e3hdYHF+bnVhZFtdX1JnblVmXF5ia2l3e39ybG1ka2pogX9sdIJsbHVwenCGeW6HgXaCgH2FdnGCjYh+e3x8f3uCimBoe2p1aGmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop+SkZWYipqfn597eJ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaEh32Pg5GdnZOKqZ2BcIuLjJKGn6GKhYx8p5GIkJOYlJaTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakImSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKMgIOFho9peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouClKOSioSPeoaGh4R2goSJiX1oc36BenxybWxoX35zaX12dnR9dIBrX2B0d3F4ZWRZX19Sa2lWZlpgYWlqd3qCcmdsZGxoZoCBa25+aG9xbH95h3tsjIFzgIF+gnR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgI2jiomalnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gbf3CLgpGThaWbh4yJg6aVhZOMl5iSkneRnJ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4Vxh5OAkYJsiIOCgImFZnZve4WRmIt8kniLh3t/hnt6cH13iIR4go6HipeflIGCi3aIg4OCd3yDiod4YXp6f3V/eGhtZmJ/amt4dHR3fnJ9Y2Rhc251c25hWmFeW21lU2RZYWFpbHZ6h3Jja2NtZmh9gmxpdWhucGqAfYJ6bpCGcoCDg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXqYnYyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5WYjqWimIBzh3uTkYmmj4yOipKgkYSSkJWXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaTg5V3cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgouSoY94g4F0iYd9gHR1gomFcWJ8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGpla2Nod4duZ21pa21pgn17eG+QiHSBhIR9dIGGiXuDfXqBhH19jnJ5i3h4bWyHamhfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ9gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnZSmnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6JiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5Wjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+HkY+TcXWBfIKDiHxmcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLlKaLeoZ7foqEd35xcIGGhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtQWFllY2hycoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZwjoV0gYKDfHWCiIV4hXx4hIV6f4l3fot7e3N4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabhouLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26LdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlJ6ZopWYeYp/gYyInJ2Kj4aSmJaFiZWakJeMi4yNi5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEm4mQfouDi4F3k5mTn5ORiYiUjH59jpd7kYyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYJ5Z3NudYCZjnuHhHmTkHl1h3Juh3qEiniJhICGjZqhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcYuAdX+DgXl2gIuAeIV/eIiGd4OFfIaLf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJSThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyg3qDooOUgpaUmZ2Tm3mRe4OMkqOZk46JlJmShIeXmoyUi4mOjoacg4+Je3KLhYqOh5yan5qVk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPkI2Lj4x3epGQeo6LjJKWjHyIfIBrdmtva2xte39hen6Ql4J3eoJ4g4x8emh0bHOGlYt9h4V7ko9xeYNvdYt5iIt4h3x/iY6dm4N7enaCinx3cGpsgoR8YXlxb21zdFZfcGJyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWBzVFFPXWdlXnlwiX1gXGlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hYB1dX6MeXuFgXiIg3OGhX+MjIR8epR4ZnFrg2CIfW9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHJSTYLfyJLWkntwdYR2haGElHiXkpmdkZp8lHOFj56hk5OQipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4eihJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXx/bXxlcm9rbHt6XIF6kJCBe32AgIaOenppc2pzio+JgYWEfJSKbH5+bX+KfYqFe4N4f42TmZiKfHV3g494c21ncICFbmt1cGlrdW5UX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ9i3N/hn97iX5yiYiCkIqIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KBybHaFd4akhpNvmJKWoZWcgpJxhoqil4mNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNnJqYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLkImOi4qEiGx7lYF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYKBf4qVhGuBdW2Hj4GOgn2BeH2OlJGXj3Ryd4eMdXNxZ3V6hGN1bnFja3doUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXlOTU1lZ2Jed3OKblxdZHleYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol6dIuJiJWGjH9+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUeHmMnoWGoY2PfJWNgJqIhHtzeHBzanCCbGptfXVfYXh3e3F1e2dgZHzr2rXJw9yHcmx0gneLnIqPa5qRkJ6WlIGJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p1d2xajXySg4Z+gYSBhYqCdmFya4eBjomBfn6RkH1ugWt3hI6EkIF6gHt9j5GOlIhtcHmMhXRrcGtyeYJhdWpwXWx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WDfH+IdnaKho+YgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2j5Gmd25xeH1xlJKOiGubkIqdk4yHe2iHipmGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCHgJWZjpOTgId0goR0gX6IkZudhpWPn36IYoCTh4WIhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46Cj4CGf32GgIWJf3BfcW+Ee46LgXx+kIh6cINleYGIhYqAeoR8fZGNj5GCbW55i351bW5ra3t/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BcY2x3ZWVdXVpsbWNtanR3hoBycH98fXR4hniFgn2AiHV4iYGTlXyIhnaIgG94eXuDk29ue4F3XoN/dIFtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIqOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB/ZWNnZ1edj19yc5a9xYV3cpWLkYB0mY2HnpSNiXNqiI6VgHuUjIGEm4x8ioZ9fIiMfpOHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloaTjZ2AiGZ+k4OBhoSKiXKCfmd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCi4B5g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhYmEgXeCen6Vio6LfG1reol8dnRvaGh+d2VdcmRZcXRUVG9zaWJOaHV5Z2FeXVlwgXB0WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGpzd4KDcW9+e390dYN6g4J8goZ2fomBlpF4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCi4KWmIp5j5ZveXNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql29KYc3ySjZF5f5eMhZqSjYdvbIWSkXp5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5KKk4+UhYhwe5OEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2GhIt9d3mBhXuDa1xvfHJ/h4OIfISHeohxgG1vgoWMgoJxg3d+loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnNuT1hydGdgS253dWJeXFtZdX50b1hnXmZrcV9vT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/h29sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3hmkYqCoZmdkoOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2Fvem5fY3B5XGRsg3pgcHZfZGXV676LMzo+jI+Ac3qGipCOd4WZjn+Ujo1/bm2FjIt1fI9/hYKViXyDeG52hoSClXZth4RrdXt1ZXmDhKeMg46LgnxtfnJ0gniDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udnJ1gp2MgYCGf3N2foFzgXBba3xzeIiBinuGf3yIeHlwaoaCjoKIcIB3fZOJin1zbWp2gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXBdXFtaXXaAdmpaYltoZm9jak5YZ1I+X2ZdXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugXt9gX+CenWBgYyThXCAi254fYB7e4iTiYBpe35qdHxyhntzdn5/jHp4hH58a4uMg5uel4yCgW2Nfmxpf4+OfH6Ag5SCf32KiGt1cWdpY1tjZ3NvYGJsdGFocIl6YXNzXmJjm6CQbl02W7C2dWuBin6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251fIaVkoJ+g4Bwd3p8dX9tV219dXOJgIV2hnSCiXp3cmyHf45/g3F9e3yQh4d5bW1obIKBdG5caGZ1clJcfU9dcl1PXHNwZFZLdHlrWFpaWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnt3gICJjIRye4dvcneDf3uJjY+Ean57bnh5dop3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWJknl+fIKSgIB+ioRwcnBjZl5ZZ19wcGBgaHFmam+JdGFzb1tgZGp2e3+/nailyrlyhoV0lX56iZWEdJKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeX+SaHGDdWZ2dWNqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3h31ranRoe4FqdoGNkpV/fH9/cnx3fHR/YlV1e3Fyh4KBe4Fwhop3eG9ugoGLfXx3fHpzjISAdWdwZ2yIgXFvXWhjdG9MZndNX29WVFp0bmNRUHV5YlJYWF1icoN0XWJcaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlXbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ9dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdpCAZ29uYGVcWGZZbnNhYWFxbGxoiW5gc2lZXmNtgHep2qnIh4izc4t6cY92fYmRgXuUi4B1dHV9dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW1bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGFieIZ6aHV2Y358aHWHj46WfXaBdnKAen1tgFpVcXxvc4GFfX93a4iGc3hqc3+Cgnx5e3d6cYl/e3Jmc2Rti4Nsc1pqYHZmSW9vTVxjWFdWeW5iUFN1d1lRVlheYXOFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn92eH13gYSBe3R9g4iIg29xf3VxdX6FgYiNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXBmV1xja398ys6HuqJrbm+MbnKFc36GjH97k4V6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXmAeGl1eWeCd2h1iIyPln5ziGpwfoB4bn1dV298bHN+iHqAbm6Jf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JXa195XUlwbE5YVl9VVnxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZY3FIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOIgHVzf4WFjoNwb3t4d3V6hoWGjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSim+FhYJ6g3VkbmpZX1tdXVRoc2ZhWWRycmeBcmFrZFdaX2l/eL6ue6C3bmN1iGl1fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV+cJmScX92c4BsfoCPhnGUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNhpeAcYxobHuCdG11Ylttempzeol6gGV0h31tcGd0fXZ9fnB6anl5f3h2b2RrYG2JfWxtVWpgeFZMbG1QU1BpTll8aGJPVXZsTVFUVV9nd4RnXmFxaWdhV2ldXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312c4KHf5WDbnN5e3tzc4WGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dpdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1bXFtTZXFlX1hjc3VpdnBkZWJXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bnmIfGdsd2ZqZFZXc3COpnyEe3aWkHN7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97cllngXd1aHCAeIJ2YneFi32Vgm+Ma257gXFlc2VganhmcHWIeXxhdYN2amtwdHlveXhye2V9fX12dW1jZGBshnxsalVqYnJUTGtsUE1PcUhefGZhTlZ1ZUtOVFhha3h/Zl5nc2plYFdkWGNyXkxMbFlkYlVUVXRXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36XhW5ydHx7dHGFhY+CgXqLdnSRgHyBlY6AhYR8foyGen6Adnujpop5iYaFbHV9fHaEg417b4ZzeoV9goN1bmppZVZdW1taU2NvZVtYYXR7amhtaGBhWF5aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnluaW9mZl1VWG9oj6h3gHp8kI14dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV5kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGdpd3Nxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIU2xGYnlmYk1Ucl5KTVVaZm14e2ZfbXFqZF1WYFZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhb3B2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxyg3t2gYCCdW+Ibn2AdIqAam9uZWRYX1paWlVia2dcWl92gmlebWxcYVdbXGuBZXJ0fWpqXm14d2l1eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCob353gIuNeXBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB4cnZ+dGFwbFhwcWFub4J6c2NxgGxhbXpuamh5eHNwZIR0eHh0b2NgY21zfWlrVGheX1VMdWRRSFdiSGN3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2dVSl1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gnl6eoKLjX1/hYlqdJeBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYl7dH59d3Nwhm18fm2QemNwcGJlXWVWWllXZGZsYF1ddIZoWXBtW15YWlxse2Jxd3ZtY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3RmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpWh4dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlld21gZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOElICJg4l7d3ByfXJheGNabW5gbm9/enNlcYBkXm51aGNmd3pya22Bc3F7cXBhXWRtb31kaVNoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVExkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5bYJ+gIGSiISBd3WJdIyHdHJ2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmhe3t/iZZ5ZXWJenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbmZcXHKJZVNybVtZWFdgbHZjanVqal9bb3VybnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fnCAXGFjXlNaYVxkkp9lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiH+FdnNrcHtsZndXW2lsYW9xfnhzZW9+W2BwcGFeaXB9a2pyfXBvdmlvYFpka217YWZTZlVYU1F4XVNQWlJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIaBn4l1gYCBdH+CcIeDdm+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21cVldVZmlzaGN0ZWVeW3B3b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYWJ3e3xvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXdsbYWUg4p8hnJyZ257b3FvUlpkaWRvcX50c2JtdVVicWpbXm5lfGRrdXxwcXFobF5YY2lqeF5mVGRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35tg4B9hph7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2BtcFxebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gb2plcXl+Z1pVV19rd3p6boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKe4hucWZwe2xxbGFYX2dnbXF/cnJeaWxTZXFkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT11PUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPh5GbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWGioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+Pz9BQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0/QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtERDw8PTw8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6O0xSPT09OTo/PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08T2hLQDw4PEE/Pj5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFQbl5UUEhBQ0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSVRoZ2VfYFhGTU1GRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NXGloamViZ1phTklJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1mdm9oa2lsbmFHSEhHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNTmx4dm5tb3FwUT9EQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SklSdHqDd3BtbG5WOz87OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVlrb3pubG9xc082OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYpnZGpsY2VpdYFzPDQ4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4dzcW9mZ3ByfWU0Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYd4c25vc21xYTk6Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoR3dXlyb29dQkJBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjYF7e3ZzcVZLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH96e3ReT1JMS0tJSkpKSUZEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUJDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt6cFxRUk5MTktKS0lLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2NhHp6eGRQT01OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMdnd0cVVSUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5+ZGBoXVdVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvX15vZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmlZPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9c3NbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpvc1pOTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf316e4B/g4KFhoeChoaGgYSBhoWGdmFeT0dBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e319fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0tGQ0hIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDREVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01RSUZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09MTk1PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87Pj5AQj5AQURHSkVJRklIR0ZHRENCQUFGRkNCQkJERURHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUNFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtMS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSEhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVVRSUlFSTE9SUlFWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAREE/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSkxISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTVRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dKR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSEdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSUhESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU1MTUhLQURBQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MRkdYTEdISkhHTUxRUEhLS0tLTU1VTk9KSktHR0tQU1NOUE9NTk5OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTSEpPSklPTVJRTE1MTE9SVVJPT0lMTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVNTUhKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVVRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF9jXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWFdZWV1iWl5XWFtcW1xcW1pcWlpfX2BgZGJjZGViZFphZWNmZmVdYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VXV1tbX2BcX1hZXFxdXl5cW11ZW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtbXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFhdXV9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZmZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6e3t7e3t6enp6enp6enx9fXx8fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPYWiUqKioqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDhHhzc3Nzc3N9hISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9e3t9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJqdnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5GQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4eLh4KCgoGAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4GAgYCBgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4KHiIKChIODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDgoyRgYGEhYSDhIOCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOBjpuJg4ODg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGOnaGloJGEgoOEgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDg4uSj5mmpZeEioiCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SGj5SVkpigoJiUhoOEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhIeYl5uYlpmYmpOGhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWDjJuJjZmZlpSTjYeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hoSWmYB9kZiYl5WPiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAi5+hk42am5eVko2JiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uVo5yboaGfkIKKi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGTlZagoZuUh4mIh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58en+PlJmbmpqVjoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoOPkY6Vl5iPgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDg4OCfn1+f4CAgYB+fX19fX59fHp7e4aMjZGUloV/f3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4mNjZKJfn9/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIqCf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9+fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g4+LlJSCgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl6h4iPloeDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goSNh4KChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYN/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7e3+CgIGBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx8fH19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foKGiIeIi4qLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fn6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgYCAgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Af4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDhoWBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoSEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf31/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgICAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6e31/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4KDhIOEhIWDhIWGhIWGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1+fX9/fn2AgYODgIKDgYKEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiHh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGiIWFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYGAf4OBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKBgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIB/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fXx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpYGRTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tbT0tLT09PT09PU1dTU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb29vLy8vLu/0tLS09PT09LS09TT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamosNLS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0tXT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/O0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0q2Dg5XP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpMqbvLiZtbOgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ6zpo2BjcaemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1mKOKq9a6mKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaqu4qtq5ulsZmWsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o5GNpZyWp5CZhJ2To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWoqi0qp5/oKmFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmavP2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2nkaGenpmolpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6ScuKSro57DoKukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNmpj5Cs18KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC/1tLVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD46OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6empaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTg5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Oz06Ojs3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCSkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qampmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7OTo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6enp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9rlqWVn3+Jf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxZcX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9Oz86ODw5OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xxlIaCS19wcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULzA9eId3d0BEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVNdSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI2CdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueKCjmpVlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6jRopqzqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPyLCap69rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26RzLuUk6SWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBDQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRYn7a9pqeaiHdrcW94eXt+ho6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuVhoaGfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUURpeGtudG5rZWVZV11YXGNqamlmYWmKtcHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmnnZSGcl5RVEtEW2VeY2plYWBoWVRYU1ZZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5sXl9lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJiaWNgW2NfV1JPUFBWgLS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdUVneat8C7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQl2+qycjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI5+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSVSnvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjkN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwHlSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urJwY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGhfXNrrcjFxL/Awb/Lx8PAyMC6wb/Ds7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMK1rK60tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM60doCzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5F+wMTDvry/u7u4tsHCtcG6gKCwrK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJWcpZahcK7JxMC9v7mzrrK8uq7BfnCiq6asur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaLoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLCipXKly8K/ubq1rqWss7CppFSAlqGepa22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4h49vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/GdoOqnppkp7+4tbKxra2fpKanpYhJg4+ZmJmfqa24q6qqnqSppKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3t5WMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vZCisqujcquwqautq6OooJ2enaRvSnuGiYiFj5uoraOio56rr6Gjqaihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU5AUnhxUElJS2abgVlFUq67sayzr66srba2srS1r6mmn5qbnZ6mqJ6gqKmfoaeWm5WnemJubHuDfoCIm6ifnp+huqSlnaOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSl9JU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52olJqVoLWeg36NkYuDenuMmZ2cp6qSqpyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx8ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOeeE9uS0tiZXRzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlcPaw7q2oZGMjIRza3qZn7GBm6uhn6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx49XU0lkpFxlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYlqrh3dXV0bmhioqLdWZgjryhcqquq6aisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemZ29tbK+w8TBsZSAeGxpYY20cYa3uLawp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnZ6WnZesl09ag6O3vLaif25laGlygV+qur2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmZ+ZrGZBUlp6o7K3qIJoYWhxcGCBx76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqioKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ipJtsb3tqYYOmrqZ/Zmh5iIx+s8fEwsfBwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpK2NdHyilWVmlJ6ZeWh8kJ2iqcHNy8bIxMXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqKxiHKPuMWbYnuKhXRxiJShpaW40czMzc/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2Fn4VphLXXl2psdnJ4d4OQm5ubttTT0s/Sw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Buc4KJZmyntWh8Y19ldHB4iIqJiqfV09PR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzc/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfX2FgXmBgX2BlbXBwbWptb3N1gGheg5iKg1lMWmdicXhyamiX1MzV1NHKz8zT1tLR1c3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGBeYF9eXGJtcm5tcHBycnZzZ2lwcWRYUFFXWGFiXFdLp9DJ0tLOxs7MzdTLztLMytbW0MzQ08vM0NHTys7R1dLV1sq/ysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltdW5lcXNyeHBWT05UeXdVbsHAw87Ox8XHzcrRx8rNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWpzX2V8hoVoV1pOVqCWZZu6trvHxcHDwMPIycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobnJbbXBvWUtdXnmhiW2gsa6twLm5u7m4wMHBw729uLy+uMPJxMbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt2d2ZgaGBGZmJ3gW9el6qoorSxtLOysrO7tLuwtq+zrrG6wbvAxLy/urSyur7AuMe4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhoanhwU2VuZF1XYl1MWpmmopimqK+rqauosqy0r7Gnraarsru5tcK5urmwqrS5u7PBua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdseVlSaGNFS1pTPl2Yn5qTlqCmq6Kmoaqoq6qvoqWeqay0tbC8uK+3r6ituLSzu7ezvK+4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5yQkZFRERGU0lelpyTkIqbnqWhoZ6kpKalrJ+cmqOlrLKwtransKunqrSrs7mwtbWttrmysLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbWYzNUI9NUdDbpWaj42El5ydo5udnaKkoqadmqGanqqurLG0o6ipqauspLS4rLavrLK0rrO1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVxUjE6NC84Ql5jjJaNh5WcnaWcmJujpaGjm56fmJitrK2usaCkoq2rp6G1sLGxrKivsqe6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZ3BQUT8sMSskOmullYmQmpmcmpOenqeinJ2mm5qZqqausKmboqK3qaGgrqi1qqanrbCkt7Ckt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFgYV9fYGJocGhKMSIcJkpJf5aLjpWal5ySnJyko6GkpZ2bnqWeqq6ln6CitqehoaKos6Klp6WvpbGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV5fYWppRzo0LzppfHCEi4yQnZWck5icop+po6KioaKhm6iqo5mdo7CpoaCdpKqeqKKerKyqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKWoKKkpZujq6WipKqkq62lrrKppqWnprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFlcW1tcXFxdXF9ia0s1QkJSfYZ3e4qLi5WVnZeXnaSlp6WppailoZekrKKUmKStqJ+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJmNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmZjVVhsbXyBeoCCjYmRk5yblpunpaOrqaauo6aXnaqelJSjp6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkI3NTg4OTs5Ojc6Ojc8PTo7Pz46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganBqcGV3fXiDfY2Cjo2RlpOZpJecp6SkqZyll56jmpGNnqGZlpaFhJGao4+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1daXWFnX2NecnhzfHSHfYeDjouOmZ2Llpmhn6GXpJSfmpSMhpiZi3ONgn2NlpaGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQno6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaFxeW2x1bWlHUmuKfJCBh5eSh5CNnZablZWVko2ViH+TiV87V297i5OJgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWFjWlZocGVIOzp7kIyKeIKPiICGiZiLlZWJkYaEk4V4iH9gSlFud4qRg36EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTk1NVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZT1FTU1VaaGZcZG1cXVNNioCPgm95gXx4gYmQf5CZi496hI1+dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXVlNVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5obWloWWuDj5SLjHZidHtydXuFjXqCmJJ/cIWNenZ6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVJPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWFnY158nKC9fG5yXnZzand0hY13eomEbmuKkHdzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqyzv6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRV1hXnX5bk2JscmB5a2l7doeFc3+Fg3Jrl49ycntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlQSF+prZpqdHFneGhtfn2BfneBg4N3cJ6ScneAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozk/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlJDSH5teHV0cHlocoOEeHqBgHyJe3Sfl3h9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkVMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqWRoKugsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4FzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUEhie4F0gnR2bXiLh3Z5hYR7k4R1npeGho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtMTU9XYFdsWFpbZISLfo17fnyAjI57goWNfpeSgJ6flpOamaWtkpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdnVmf5SOhoiIhoeHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOV1JRSFBKRE5HQ0pEQ0BEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi8wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9he2VkaW+TkoaTjI2GiYqVhI+MmoidnZCgqKOiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITEtNTlJea4Z5cH14lpSSoJ+clZySnpGZm6WbpaidpqqoqbSWq76rtcfItsjQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktPTklJTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTU5RWWuCjHSPhZmfoa23s6CpqKmkprGprrSvr6u5sLK9m7LDq7nJy7fDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqI+csYuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTg7PDVDOz1GS0lGSFFOUFd/j5uBqJ6qo6q6wr+nsMK0qrG+sba7s72zwLW7uqK4xai1yMe1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqssLWisayxtbu2tK20n6anoqaZqK+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejKCqoK6uu6+yu8jFs7nDu7Kyv7W2wLO9r7Z0sLOlusSjr8a4sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1hVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVFZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZGrs7G3s8S5trnHyrm6wLu2tLq5tbyzubHFYHSxpLGanqq9qaWoq6qjorK1oauon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGw8XMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhY2NfWGNgamdTWGBWUlVJRUVNSkE+R0Q9S0E9QkA9Rz47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+c316a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr21u7PCvLe2yMm4tbq1t7iytrOyrbW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxtX2JeWmBjWmRjUVtgU1BLQ0FFRkU8QEY/QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XErrawubqzr8LFtK64sLC7q7Kwpaq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYBwbWNpbXB4aXd8fsu+wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZastquypa+0qau7v7CqtKakuKarrZ+rtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1NDU0c7Hw9TRxs3S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafYuxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hprGeiKaak5KRiY+OiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlth3Z0bn12hHR4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCon6Kxm4WekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFdGR0pJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6gq5uhmpiepJ6fq5mKmouQkY2EfIeHg4WLjp+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09rb1dDa2tHWyNTLlnx+a2tdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkvNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36Fh4B3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQgomOlpmWlaSbl56VnZKRlqKdmauVkJCJjJGCjISIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnKmmpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NbZ2tvX2trZ2M7bxoh9fGpsaGJWWVdXTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV5hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJSglJCNjY+Lfo+NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLiYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUE9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyPlJaQipGThoCLiJGMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGzmJ2SlJehop+akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWVlDQUlDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIyRk4iEiYiFlZmaj4+UkoaTloN/j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZSdm6OztKajvMK+x8bFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKYlIyKk5KGk5eGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Vn5uhsa2jpLi/tMTHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBjV2NYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzUyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox6fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqmygomJjJSGkHyOjXyDhY2PlJSIh5KWi46VjYuMl5iRm5m0lpSqnYuclJGMkJKLmJqJkZ2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra69q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCdm5ifoJWbn6enpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKd3ZlX11iXk9MQ0xARUc/QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrmywa6lwKSrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjpaPkZCUlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprbO8vaqwqqSlo6yutK63taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYyPjo+Vloh8jpWSkaKalKCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsG/mnF8ZFtaX15MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGaraekmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8TCtra8rbS/ubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi46OnYhaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RwcV1bVldQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCTjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7bEvre5t7OytbO4s6ynnKusuaupqLCwmKOupaikpbXBsKuttL7DucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YiYuOlJxfSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcmhfXVFSTEZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnaCao6S1ybWpx7zExMnLycjMzse+urOvurjAwc21yLvBuba6sq+vs7SnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJyCbXWSopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTUdJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvruorb20t77HvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCYlp2djraeqJulopqboJmnpLGgmp2lnKepnJeTjpObipaJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobO0u7atqLWysp6co6Wal5WZqqGeeGRfYWBMSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/uMHCwMjEv83Gu765srC5tL7DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0uLi+sb7AtrSyta++o5ajlZKak62fkKGhpKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWlmpersbayqqWqraycmKCgko+QlqmflGlmXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaquoKSprbCipqi9taWxvLe2tsOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonautmpqdmKWfvaGcpJerq6uloJmNmqCSnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXlo6io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gnkqqjn6Oeramsnbuxqay1scjEwcOzwsO9x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKqqm5+moafCrZytsZypoq6xqqSovbemtbu9r7fErbOzwr+yxrO6t6u0tq2qoqaVlZOiq6Gfn5mnqq6ur7uxpZ+pqZmYl5Kio7egoaORrq6rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilo+OoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTHv8TDtb/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyprizuLK5waq3ssO9tMWnvq6tt7Wpp6yhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKGdmZmalZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaWoJWMkJ2ek4upqauhp6GanpaNj5mQgoaViZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i4xb3Dx728w8LIwbrBxsG6qralrbutwcO4uKqtsryjla2wrrOXpqiRqrmqoaewnaqgr7Szqqq2tay6q7OyuresuLDBur2/psOqsLauqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaern5qfn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl52UiZGbmZSOqamnn6OcmZuTh4+Zi36Nl4aPmmxpbmJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qisLeppbSyq6Gttb2vs7i8u723t8HCv8nDucTDwcC5xb3BuK+2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1u6yvsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7Krsamim56opJ6VoZmcqLapmJqSkp+Zn6Ggkq6hm5qIl5mMnZqdlIuPl5eal6amo6Cel5aWlICQlYR7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjY+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKikrq21qa+zuaansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5iYqKurrJyuq4+rvZ2rrrGjqp+xrbOurrWxubeqra+yqLavs7q8ybOqtbWxtLCvp6Gzn5qorKCllZaambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5meraebl56amay4opiTkY+YnKGZmJWuoZ+WgpWZjp6dmpeRipSTnpqlo6OgmZeTkpZ7jJGFe42Lg4uTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWNUaVtNXGFLXFxaUlJSYmFMS0VgYWFRTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe8w723v7/BuMC9sr2uqLq5uLfCt6yusbqWl6eurKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6ssqe4r7WzxMW2qbW1q7Cuqqejtp+fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Cnra+0rKSYoayonJydnJSquZyVj4+MmJ2imJGZqKShmIWUl5GdnJiXl4mXkJebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcS09kXT9ie0dJOEdoV2VbTV5iTVlZV1VYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpqKwsbKqt7C1n6u1ucm5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysKuoqLW6rLWytau0raqrqaypua2ysMe/uKW5sKmtraaorbGlpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inKOoq5ygmZuSpLWaj4mOiJGjoZaPlp+jl5WGkJWUnpuZl5WImJOVmaecoKCNk5KOkXh+j4V9fH2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpNblhhW05hYk5WVlZXVVloXlFTTWNaW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoamwpKejs7OwtLWwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6y0uLzAsayyraKkp66qqKWxo6qxqq6qsa6urKuzu6e3sLKpsqqrpqWkrrqsqrDCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mao5iZkKComIaEj4uLn6GQjY+YnpKSiIiSlqGdlpmWh5eTk5elnZ6djJKQjop/f4iFfHd/h4WHdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPY1xOVVZVV1FcYl9TT09oWFhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaapsaa0raqvra2xrrKttLult7OsrK6oq6CjnrG3q6qtubaktbWkqqesrKqtoKimp7GxpKeloaGslqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjpyRk42Fjpmlm5OSm4yTkpGUo5qcmouPi4x8hoKCgXp1gYOBfnV3i6KHeGpeX25mV2WHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPalhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+YqKittaq1saqlq6qpvcDAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsa+trK2nt6qlrbCruK6nsK+usau1qra1p7S3q6ykqqqcpJ60s6iopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqqiqZ+tm5GqoZ2gpKKmoqqenKa0rqelqaKjmKSmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyRkZOPhYiWo5qOjpuSkpCPkp+YmZeNi4SAdIeCf354dYN/e3h+f4idj3BxZmZwd1xhdIhqT12YVkhteVVkVlNkUE1VVVVRT1hbYlZJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+qpK+pqLu/vMGysLmtoravyMfH0MC/vbq8w767xMLAv66ys7O2vbzBsbK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhta2ooZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6ifrJmPsKKYoqCop56nm5mpsKmin6yioZKhoqKnmZmpppiYmZ2Pi4eViH2OhoSFpJeGg4SNh5CQkoWGlqGXiJGdkZOQjZGdlZiPi4aGeHSBf310eHqAe3V0e2uCh6R2aV5la4B1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKSlqqOkoqyms7KxqKSwp6q4v8G9sam6qqetsMnGx9DDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO0pqarsbW3saWmubSttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaq6eppKidoqmnqb2rtLCunamkoK+cmrOilqSbpaSfpZqaqKqlnpqpoZuRm6CknZmWqaqRmZqTkIuCj4V+kIOAiJ+Ph4F/jYiSkJCFgpWblIaToY2UkYuRm5OWh4p/gHJ6eX17Z3Z8e3Vxcn5qhnmFiGRfZ2NyhXttZ3ldXlZCV3ttVGJQUllLTE5wdF1JWltoWUZWZ09DPktPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJifn6mkoqGrpLaysaSpsKatucK9t7GkuaypqLDCyMjMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yis6aqqq60trOom7m7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6qpp6Gpm6OooK28p66xrqGqoqSunp6tppifmqGim5+bmaOqopqZo6OVlpSgoZablqasjJ+Sj5GMgoqAgI+Be5qVjYp9gIyHkZCNioWTmJGGk6OKkpGHkJmQlIGIfXpsfXZ4eGJ6enJwcXR4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlqyYn5eno6Gfp6O3r62ir6+orLjDu7SuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oa24taemqLCzoJ6lpaegpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynp6iam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjY2JeoSNhYuOjYWJk5qOiJSfiZCVgoyXjZF8hXx0cHxxc3NfeHhqb3FxcGuAc2R6bGdlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaOgtquwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevspyhpKCko6CWm6+loZ6iqK+hoKGSo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3uDiISJjY+Fj5OYjI6VmYuPln6Gl4yPeoF7cHJ2bm9zXnh3ZWxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZaUm6qco6GiobapraC7t6WsvsW0sK+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6yZoqecpKWUl6CxpJmepKmpnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWHiIqShZaSkouQlZSOjZR7g5iPi3d+fGx0cmxrc2F3dWhoamhncIZoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSnmZyenaO0rKequranrMPBuLGso7aup62ut8C/vLLCtrCusra2uba2raq9s66ysby/t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmqq7GlmJ6qnaakkZilrKGYnaSpoZuhm5afnae1prCqrqGhnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFd4GCgZ2Hi4OJfoCFiIeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBY2VmZmVqaWNrcltfWV1sZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJaks7Gisr22obHFvLuysaO3rKqtqbi8u7qtwLGurq62r7O4s6mrubGvrrO2uravuL2spp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdp6mln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rLuurKqrt6qzt66msrWyrqmwtraws7W6pqmftaecnaigp6uap72XrKSusLa1rK2fsa2wqaKbnKOrqJuUm6ajnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqKQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrC5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7KpnaGjmaSlmKu5k6Wlr7O3ra6lqa6rrKWhnpyhp6ablqClpJubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2io1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19NRVJWVlFRUldVZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ+qqaeqv8Ovsbq8tsC/qqW3sKispbK0rq6ytamopbCtpbSym621trWmp6iysKyyp62dqaCwp5+jopifoZqss5OjpaW2vaatp6uqrKiloaCYoKajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ucxXpytae6kHuAbZaxq7B5aGxYsa5uZWm8krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK9srXAtba+wauntKysqKaus6mvtbKmp6W0pae4rZyzsrarpaSnsa2ssKaqnaajr6Kgn52VmZ6crauTnaKfs7qjqqmira6loZyamqKnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9bKGQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqiosK6jsLmuo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+aoZuWlJaamquklZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaeyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqeqsaewp6Wdnp6ulZ6ZlJSUl52soZmZpKi1r6Kqj6qoqpudlZegpaeZnp2jn5ufo6WjlZuel5mcoqmbppqcm6Kgl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITXFQXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCotKijmpydqpWYl5WVk5WgqZyZlqetsKmjn4+to6iWnZaboaWfl6GhoqGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZ5RRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdKOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsa2jq7ytprSmp7a7vLK6vra2tLm4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mamaedlZOXl5CRoaaflZOlqrCmopaTraCmkpSgm6SlnpSapaehmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kes6yfn6irnpSntauor7GqrbOjm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZinpKCUmqWonZyknq2doZyfjJOemp2gl5mblpeioJSXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5Vtkl2rW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVzdKm5ZYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubmxsLS5qLqzn6+knaSmpp6TqbCpr6m0q6muoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSWpqqnlJipp52eoKKtpKGeoIyUoZifn5Gdl5yVnqGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFtSPj1ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r662tarAtaipoZulo6Gckampp7WisqetqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSll6OsopGWq7Gjn56mq7GZoaKPmKKWn5uVnJahk52pnJSPqpmH1JKau3Oww4DDhn3Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1lcWkNAQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6Keo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJujrZ6RoKirn5qfqKO0n6KkjqeilKKanJeVo5iQr5+SlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfYeGjIeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc5Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Ssq6isq6m6rrDFrbOyrbams7erqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZKcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SqoJGtnpeknpeXl52ej6+ok5uloY1qfWmbpXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pem4lgY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaWfoqedo5uZmaumrqOktKilm5eUoJqlrai9p6iklJOblZ+ZkpekqaiQnpGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6KasZuUp6CWlJ2fnZawpJegp5ibkJycoaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiVjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVUEZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWnn66Yl6edmZmgnp2cr6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEkJ6IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCanVkemZgamVjZGZrWWx7b2lrXVNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFNFtHNTwsQLSgubC/rKyvsrGgqqayraKss6/Er6mqorGtu6Kzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqaWjq6Kvm5+goJiknpyenK6jmJ6nkpaVm5Gjl5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8aodZXmx0ZF5ziWlrfHBrZF9STlhJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCeq5afo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmllXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKqgqpunn6egrJagm6Wvo5abqZSfm5mRo5WcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+qnquYmqKfnJqqpqGcq6KkqKOktKScopKlrau3s6euopGQmZylkpGfoZiboJ2Ip62lq67AwLGhqa+plpKfnaKZoqSqo5Ogop2era+qraejo6ihpaWdrKiRo5qorKmanKebqp+UlqOUn6GVm3/OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGBybXBoYGB6ZFxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9N0A+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6ssKqoq5+UkZqfpJKPnqSXnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqShqqmdoqWkn66fkZill56Zk5ORl6BxhYyXdYWohnGxfZ5yrH+in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qh6KMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmSFbmF3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpaippq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZoqGSlKCtm52npLCtpa21q7rNsa2mrquWlZydopmerqycl6Canp+ps6urq5usq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ97mZeFemaAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnw8nW1L+hmaunoK+inrC0sK6prKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLWvrqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepmVmniqyXSZpJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqaq1sqybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylm6GjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp+XiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaaYr6S7raG2taycnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqapJyVip99mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknKMiq2+v7y6tJ6Wp6SttaGimZSip6auqquYpqOfpaGhtqejqKewo5Sro46kraKdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqOWmZqdmZyZp6anma2or6Olm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJF9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWthaCVqqCil4afgZqVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhnQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYGFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaWgmqWdrpiiqae3qsGvpKmjnouBjpuan6aekpSZm5WbmqalppuqrK2kpZ+pqL6klsKrqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SnlZqBrIqEsIWmmqShopGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFumI+onIyYkpqafHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBgYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop2knpmjo6WZoaOqs6q9r6Snnp2PfoublqGgmI+RmpySmpipoKOaqa6opqaipai7np/FpqOnn6mzs6qso526q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpquRf9a9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaeppuaoamjmaCirK6quq2oo5uXk32ImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqup6ow6KfraKpsrKoraeeuKWsrJlzdqqluIZkiaBwaK6Ri5FubnekkJmfgXWumZRwj4txlaiknJivpHNtbWxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epamgnaSjoJGLpZKnmaiZl6OroZedpqaosLurrJqbkpJ8hJaNpZiNkZGZlY6YlqmWoJmqo5yxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVrKeNk5OMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4R+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaujn5innp6SlKOXqJqnmZSmoqWRm6eZora6qKqYmo+MfIGUi6GUipWRlpGQlJimkKCbqqCdtqOdpqu3p67AraK1pa6trqqnp7G2n6y6mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qenp6clqyek5qim5SQlquajpmZl5GWn5GIoZ6WlYaSjZGOlYuBfmWLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjlJ+ZpIWJm4p9c5d0fIyAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJjYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomco4+tnaKVqJ+gkpaZm66LqJWPqJqqjZmpkJ+5t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKurnSiu6GxnnZ3nqivuJN0q6OeiYCrf2RcYnagj6WfhJh9bZKznKOnraqjZZ6fknN5mphwgJipmG1/oqiKZZymnZKYmJaNkpyQhp6bkZeEkoePkJKJhXdqjoZ2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3yonJxme5uKhXmZaoaMhG96gGtyZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVVVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ2Rf4mIm56Mq5milaehnY6Wkp6Fda2PiKebqpKYpYqcu7SnoJmYi4l1d5ONlpOKk5GRlI2QlKGPnKGnmZyylYCMm7ScsoySjrqln32noXmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qInICXp4KBe5yzeoqGoZialZiWgpGXl4SbmWN7h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyGj5iXh6ycopafoJGMk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0ma2KyoeprIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVs4GhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXOPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJeWkYermZubmaGEjox3mpyPn5CInqWcl5qZh6O5raSanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2flq2PnZyckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmqmZubkoimsaehlZqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6Kgk592nJWPp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS3tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGAlo2JkKGPkpSdmH2QiY2ooYeXjomSpJWcm42Mqailno+Xh4R+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoYyfcaGKh6mHmqSOlaWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0NSbzVMW1tfTlpEQTI1MTw6N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ+Tnp2JkamjoJqMkoqAgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ6Oi3CSjIGphpidoaWepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn56bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkaGbc5CQgYmalqGbhY+qnJuVi4uKfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSNnZx7pZZ6qYCUmo+Jnpp7p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoqWPpqmhmquLm5mZlJmTkqGYjoeFe3B9hGh9j4OVm4B3kY6PiW9/hY6SkmyXk3yJkpSll4OPq5uUkouGiXmDdoiAboKfhneAk4aImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmY6FgJmPeqSAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Ole3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZtud3mYapp7dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOmjaaon56nhJuYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY15jYyXppSEmaqYjZGLgYl6gH2LeHCQoYZ6gZWHiZagln+UpKablZWDZm54nGyiZHtxpXebmHBmpoCUiXqkep+Wg5dznneBipWXj7lukYqiYn2YoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii256fXNyZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVYteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNsZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fp42jopyko4GWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfIiHmKiSgaOtkYaQi4KJfoCAjnJpkKaEfYeTjYiZoI+Ik6mlnIimeJWbfqSIlouxmJ2Qgq+Xn6R1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OHhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ+foulnnaffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp3bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6aKnKaeq56FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlHaCh5JubIupgYOMlI6JnZ+JjJSpop+Of3STl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4CAi3d1c5R1b3lubYdsg4ZedWd3jmV/gISMqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5oa29hjZO3qKaJoKKapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+WlIeOiomNcoN8j31+j4R7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6Jlq2nj5Klj3dvm46BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqaUhWWLjYNud4uEcYaPenFoaWZ8hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWVudWhtfH53enx7eXqAgH5vhYmEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3lvaGpsYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmJiYaHinN+gYx2hYuChJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4iUioucl4SDeq2CkZialYqenYeIoameoaGjioeTm5yjmZWqoaemn5KahpSLenaNjYOnfn+TkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOGkYt8iZ6Eh4yQiYmBhYSQd3x6dJqgiYaKnYmEk359ioB/dG5yhIF9doWFiY6lkIKFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0i3F+e3h3cHh1gl1eb4hpb2BfWl1dU2hyVmRdXWJtaHZ8fXRvcGVraml/fW55gHJqcHFsZ4F7coKAeH99f4R6bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2WMh5y5npahoJiUmJmUmKShn3x/mqyPn46GoJ2MnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4ODj36Ah4SFfIeFj5yfk4isoIRzipCGkpGLnZF9jXuqhI6TmJaPnJeHh5uknqGZnIWCkpqZmI+Zpp+knJuPlX+Oh3R6ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdIyZgYOPg4eFf4WElW55dnSSooqMhZqEhIxzf4l8e3FxeoaCeneIjYORpo+Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBpfn13dnd2e3hdYHF+bnVgY1tdX1JnblVmW15ia2l2en9ybG1ka2pogX9sdIJsbHVwenCGeW6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qfn597eJ+nkZyLh6WVjJmZenuNhn2JkYSMgoKDbnyAeXOBhX6Lkn1raH2Cl4mBiI17fYaEhnyPgpCdnZOJqZ2BcYuLjJKGoKGKhYx8qJGJkJKXk5aTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakImSlpt+k5J+h46BdXSCcXdhfoGOhnGLl32JjHKMf4KFho9oeHJ4jJiRj3+WfoiJcoGGe3tvd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWlqdnmCcmdsZGxoZoCBa25+aG9xbH95h3psjIFzgYF+gXR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJuefHeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V+i5F4Z2N9hpeKgoqLeHyAjYN5loKWmZiOl6Gbf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlo2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpWZfpiNfIiNgXZxfm57ZIB8i4Vwh5OAkYJsiIOBgImFZnVve4WRmIt8k3iLiHt/hnt6cH13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW21lU2RZYWFpa3V5hnJja2NtZmh9gmxpdWhucGqAfYN5bZCGcoCDg350fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuUh3+EhnR8fot/fZiGl5WYjaSimIBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqHiI+Jb5eem6SUlouMnouGgZGcf5KSlYaZiHuKioF5cnpsdWx8f4t+bYWTg5V3cIOEfn6LgGVyaXt/lpeDfo10kIeCeIZ9dHZ+fISAe4GLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ2YHBsdm5vXFxgXl5rXlFeWWNhaW50e4psYGpla2Nod4duZ21pa21pgn17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZl+eK+ZjZd9n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4JyeoCHeo+SiZOSnZOmnZWCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5WjlJOJi5mMgX+Qnn2SjpKMmY57ioWHc3N2bHFudXyKdG+HkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SKhoGLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3FleV5vbHNtclhbX2BibFtQWFllY2hycn+IZ11qaWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dXSBgICgh5KLlJ6YopWYeYp/gY2InJ2Kj4aSmJaFiZWakJeMjI2Ni5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEnImQfouDi4F3k5mToJOSiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0hI+Zi3F3gXWCiIN5ZnJudYCZjnuHhHmTkHl1h3NviHqEinmKhICGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbXZhcG9rcW1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarZ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgaqUhoJ3f3Zxg3qDoYOTgpWUmZ2Tm3iRe4OMkqOZk46JlZmShIeXmYyUi4mOj4acg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5GYkJyPkI2Mj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39hen6Pl4J3e4J4g4x9eWdzbHOGlYt9h4V6k49xeYNvdYt5iIp5iHuAio6dnIR7enaCi3x3cWpsgoR7YXlxb25zdFZfcGJyYmBtb3pxaXBmZ3N1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbGcpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFvhXRwcoRwa2l3boNufX1tdHJSTYLfyJLWk3twdYR2haGElHiXkpmdkZl7lHOFkJ6hk5SRipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjIqcm5yak5F4jHRlho+Fa4eihJGIloOGY4yRmY+Wi5eMjIqKcXqUiHuOiIqTkYl5hXx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR4gI2TmZiJfHV3g494cm1ncYCFbmx1cGlrdm9TX3BlcFpgbXN5aGxrY2d4cnBxZGB4YWBWbF9fd1FOTGJnY116cop2Xl1ldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3N/hn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KFzbHaFd4akhpNvmJKWopacgZJyhouil4iOlouQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SOnJqYmI2OdYl1bISHiXyJooORiZyEhV6Lk5iLkImPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFja3hoUmFyaGxWYG91emFyZGBpfXBzb1tkcmFiV25bXXlPTUxlZ2Jed3SKbl1dZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPa5qRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuPi4WOgH91eIOEcoiCk5yWlJeEi3WGfW6CgIeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4eBjomBfn6RkH1tgWt3hY6EkIF7gHt9j5GOlIhtcHmMhXRrcWxzeYJhdWpwXm14YVJlc2lmU2Bxd3VhcGBdaINxdGtYaGljaVluV1x2TUtMZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIdIWDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG9xeH1xlJKOiGubkIqdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCGgJaajpOTgId0goR0gX2IkJuehpWPn36IYoCTh4WJhYuNgICDZ3yQgH5/goyPkH5tg3yCdGxtd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pveFpTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcYBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9ycYB8fXR4hniFgn2AiHV5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB/ZWNnZ1edj19xc5a9xYV3cpWLkYB0mY2HnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gXF1hoGelYaUjoGBcX6Gc4J5h5WbloaTjZ2AiGZ+k4OBhoSKiXKBfWd9i3t5f3+Hi499aYB8g3ZmcHl4c3d0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaWh+d2VdcmRZcXVUVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXmtuYXFQWmxSRFRoYlpsb217cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcm9+e390dYN6g4J8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5eMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEkoyCfm59gXSBdoOZl5KKk4+UhYhwe5OEfoSDiYNvgXhogIV4cn9/g4qHfGV8foN1Y3FzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWMgoJxg3d/loqMg3dtbH6Ef3Z6ZWhqfnJhWnhbWnNvT1hydGdgS253dmJeXFtZdX5zcFhnXmZrcl9vT1hpUz9ZZ19bcWtneXJcW1lsZVpjcHlfaF1eZWxoZmxpcnh/h3BugH2BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1gY295XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIaZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg46LgnxsfnJ0gXiDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udXJ1gpyMgYCGf3R2foBzgXBba3xzeIiBinuGf3yId3lwa4eDj4KIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltoZm9jak5YZ1I+XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtaGpraXB4fo5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1+jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3iImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251e4aVkoJ9goBwd3p8dX9tV219dXOJgIV2hnSCiXp3cm2IgI5/g3F9e3yQh4d5bm1obYKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmlOQWJkXGB3YV11blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGiEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5dop3fXh/gYd/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4BqdoGNkZV/fH5+cXx3fHR/YlV1e3Fyh4KBe4Fwhol3eG9vgoKLfXx3fHpzjISAdWhwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlWbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4foCBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW5bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAe31tgFpVcXxvc4GFfX93a4iGc3hqdH+Dgnx5e3d6cYl/e3Jnc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWntjUlZddltbZ2xiVmtgYG5mZmxwaHB2eI90a46Ndn92eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIB4iodkcYBqanFjWG17hpyJg4Fyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXqAeGl1eWeCd2h1h4yOlX1zh2pvfoB4bn1dV298bHN+iHqAbm6Kf3B2ZnZ/gH6AdXpveXKFenhxZXJgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3FIQWldYWdfXFV7Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue6C3bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9Z2trW1ZveIukgYV/cJmScX92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdYaNhpaAcItna3uCdG11Ylttempzeol6gGV0hnxtcGd0fnd9fnB6anl5f3h2b2RsYWyJfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxqSkVsW2JlV1lUeVpOV29rWV1sZVxaZWNedGZsZXFnc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd1dYWGeIKFend0dm5renBhaGtnhnSNhG5nXl98bnmIfGdsd2ZqZFZXc3COp32Ee3aWkHR7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFlc2VgandmcHWIeXxhdYN2amtxdHpweXdye2V9fX12dW1jZWBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxMbFhkYlVUVXNXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dXGFhY+CgXqLdXSRgHyBlY6BhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV11aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXt8kI54dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGhqeHRxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIUmxFYXlmYk5Ucl5KTVVaZm14e2ZfbXFqZF1WYFZwb1dKVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVZaW2uBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR1dmZoaWFXVlloZJCob393f4qOenBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGxhbXtwamd5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWRRSFdiR2N3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2ZUSV1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKLjX1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWXBtW15XWVtse2Jxd3ZtY1xudHVodndyb4Z5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoGBc3xhYmlcVFheY2SQpWl5dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlmd21hZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNZbm5gb3B/enNlcYBkX252amNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVEtkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIuGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybVtZWFdgbHZjanVqal9bbnRybXV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF+fnCAXGFjXlNaYVxkk59lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYW9xf3hzZW9+W2FxcWJfaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVeWnB2b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3e3xvhFxjXmNUW2BaY5eVY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn90c2JtdVVjcmtcXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3aAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gbmplcXl+Z1pWWF9seHp6boJeYV1oVlhgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dmbnJ/cnJeaWxTZnFlVmJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI56bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgpV4qLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSqVhUcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+IgoODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi4+KipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4aLioWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiNiYSGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiHiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH18fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJuc2phWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW51cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJobG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh6fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1xpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGlVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BBQD8/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08QVNEPzw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUBZYUdDPT1ARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSWpmUU1FQ0dGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOaWdbW1ZMSE5NSElISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTVZlZGJgZWBOX0lHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNY2ppaGNmaGdfQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SU1tdW1qaWlpa0k6PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9mUXV4dG1tbm9sRDc4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYptdnyEcW9wb25LMjY4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hyc3xycW5vbkQzNjg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHh4iIioqMi4qLjYVsaGxveX1mPjs7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNj39mbG95fl5FQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjXlwcm92XUtMSEhIRUZIR0VDQUBDRURDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMjIyMjXxzcnBYTFJMS0tJSkpKSUZEREdIR0RERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyNinl3dW9jUU5MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhYWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjIyOhXl8eHJZTk1OTEpJRkpJRktJR0tKSUpHR0dLTE5MTUhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMeXJiXVtQUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSEpKTEpMRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI1/YFxXV1dVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NTE5HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjItuX1ttZEhVU1NSSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hyYWhYPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh4enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhoWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x8cnNbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJWU1ZUV191eICFhISFhoaGhoeHh4eIiIiIh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3pvc1pNTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFeT0ZBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZGRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0pHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hIR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0tHQ0JJSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHREdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZISEdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTU5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LRElMS09NT05PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz09Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUU1BST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gYl5cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTUlFSTE9SUlBWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTlRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MTE1HQ0NBRDw/RUVFQz1BQUNCQ0NEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BvampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZDR0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUhISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUhHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpNSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dXZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZDR0VCRUhJRkdISEZGSUdIR0lLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX11eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0pNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSWl1dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSU1QRUZJSktOTExJS0xJSUhESEtRT01NUExMSktISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNDRkdCTUhCS0tPT05MRk1GR0lKSEdMTE1PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OSEtGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoOEgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUtFUlZMS05JS1JYV1FNT09MUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOTE9IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3NydXl+gXN1em58fXl4cm5OS1N1TkNCRlBPSEpLSUtQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5VTGxgdnVraXV7em1+eGt8cFxeXmJbXmFkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ2xtcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlJRS1FNS0xQU1VTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVU1RVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBOTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2RgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUUxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXVFZaWFxdW1tdVlNNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlWV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU9SWlNSUVRSVFVUS1JXVltZWlNPU1FWVldUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWlVaXlhfXllcWVFXUllZWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmhoYmZpY2VeYmJjYWBgX11dWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXmFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6enx9fX19fHx8e3x8e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPYWiUrKysqJWOSjY2MjI2Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExsbGxsUXZaRkJCPkYx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4cG9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISDhHhzc3Nzc3N5fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXx7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH16e357d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fH18fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF0naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnNzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpiyoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgX5+n6uklqSbm5agn4Z/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDi5eal5aYoJqdnZ2ampiQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4eLh4KDgoGAgICAgYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f4CAgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgIKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KFgoGEhYSDg4OCg4OEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5OQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOChZODgYOFg4OEg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKRlIGBg4OCg4ODgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDhpaVkIyCgoOEhIODg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIOEhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDhISLmaCqqJuKhI6Jg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SEhYqTmKClpJuNloeFhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYaGhoeGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhISGlZeVl5+fnp2Sh4iGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eGhoaFg4OEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYycm5qXmpybmY6HiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3p/mZeKlJmZmJWUjImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yalX+BlpiXlZONiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXj4yYlpiXk4mHh4eHiIeHiYaHhoiHh4mJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoKan5yYjYqLg4SEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYegnpqMh4iAgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEg4KDg4OBfn1+f4CAgYB+fX19fX59fHp7eo+bl5aSiX6Af3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6e46XlZeGfn5/fn5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/f39/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f5CQj5GRf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9+fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5go2Jj5aHgYCAgYB/gX+AgICBgYKCgH6Afn9+fn9+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhYSCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoGCgoKAf359fX1+foB9fX19fX19fX18enp5eXl7iImHh4iDgYKDgYCCgIKBgYODg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXl8goKEhYOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYJ/gouEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5enx/gH2Gk4ODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEhIWFg4SEg4OEg4SFhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7fYCCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OCgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx9fX19fX18fXx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx+foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42LioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4B/f39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXx9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fX19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGDgYCAgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoB/gICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoKBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/f3+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYGCgYCBgX2AgH6AfX59fn+AgIB/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+Af3+BgoGAf36AgX5/gIKCgIGDgoSFhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn18f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOBgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXx8e318e3x8fH18fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH18fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/f39/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fH14eHV4eHl7fHx9e3t8fHx9fn9/f39+fX1+gH9/gYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpydnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIGAgYGBgYGDgH+Bg4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WDgoOCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOBgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fXx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRxeHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SAgoOCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgYGAgH99fXx8fXt2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGDgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+BgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgn2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4SEgoOCgoGDhIOEhIWDhIWGhIWGfYR6fX5/g3uFg4GEg4F/fX5/fn6Cg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f35+gX+AgH59gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SEg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoB/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhIWEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFhISEg4KBfn9+e3x7fnx8fX5/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhoSGhoSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fH18fXt8fHx8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIhoWHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fn18fXp6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhISCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLmwi4uLioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6OllVNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0dzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaueY2FiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs7Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0c3Mzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzs3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zPz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3FpKCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuzp52HnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZeckJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Uq5p+o5KKrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7Nzw/QDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uYiqGarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlm5uapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpyvnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Saz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNbMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR1Mq91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eXlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs4Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1FThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFdQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5NUGOGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn5qlKWVnX2IgF9yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3ttUXWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndXTktyk4aDTV9vcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULy89eId3dkFEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVReSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI6DdU9ujnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueaGkmpVlTF94bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6jqnRopqzqFhMrZNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6KihXd+fXLOxq+Zpq9rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urI6Gg26RzLyUlKWWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0tZ+HeWRYn7W7pqeZiHdrcW94eXt+hY6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SPcmZSRIuVhYWFfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yuo5WIdFlaUURpd2pudG5rZWVZV11YXGNqamlmYWmLtsHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmmnJOFcl5RVEtEW2VeY2plYWBoWVRYU1dZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vItpN0Y1VQT1RIPl5sX19lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWFiaWNgW2NfV1JPUFBXgbS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVpdZWxlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9GXWJhamBaWFdUVneat7+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVmVhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pd4CKVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4KQl2+ryMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2R9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI1+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSUSXvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjUN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwXhSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urFvY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGgfHJsrcjFxL/Awb/Lx8PAyMC6wru5s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLhtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMC0s660tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2zdoGzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5B+wMTDvry/u7u4tsHCtb+6tK2urK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJacpZWhca7JxMC9v7mzrrK8uq67tLOlqqasur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLChpXKly8K/ubq1rqWss7GmsrConaCepK22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYOqnpljqb+4tbKxra2fpKemoq6mnJWYl5meqK24q6qqnqSopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vI+hsqujcqywqautq6OooJ2dpZqFn5SQlJaOlp2nraOio5+hpqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmZmVaU5AUnhxUElJS2ecgVlFUq67sayzr66srba2srS1rqimn5qbnZ6mqJ6gqKmfoaeWn5FVgZ6RjI6Ui5WZoqefn6GioaWlnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBKVI5gY2KArrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olKNVVoeVj4uMlJCWmqCnnp+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXKed09uS0tjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJqTOmSEjYyLjpeUmZ6iqZ2hoJymp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0llo1tlfm9yXVFrY1tkX11rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KjgD1kgIF7eX+UmJ2jo6eepqufp66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aeoINqY2Zwenh1foybpqmrpbWyn620t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZ62q39nf4Z9dXl7gZ20rrPBmKm3uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmaC81bmVhYiMhXpxcGyAqbvEnJC5w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhth5+z29S8q5yJhouCcmhdXZDOtnOtx8XFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbXCRu8PHxMC3loOChIRyYFeFuYCA0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcm9se4hnjq22taGOfXp6a2hlcYRfutTR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1xcXB5UVl8mKSjln5vamNmamZdk9jR0tPU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcHBubHFvdYBjWneSm5mFaWFfY2ljeczUzc/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucXJ2fGBdgJSYimdZWV5tdZfH1M7L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucXFycXd3W2eHj4piVVlqgpGds83OxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NHTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFxbWlteGhVeIN8W1Rpf5Kbn67Fxr/BxM7Ox8XHzcrRx8rNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWtxX2Vvalhcd4KRl5eit7q6uLvIxcHDwMPIycjIycfBxcvFx8rNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYm5xbmlmZ2tpbnZcWlpcYHN+hoaCkq6vsa+uwLm6u7m4wMHBw729uby/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBrZGNpamp1cEhPXFloc29pZJOlpqqoo7WxtbOysrO7tbywtq+zr7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhnanlfQ1BMXFxWUnOhmp6mopqnqa+rqauos621r7Gnraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWl1jbW1mZGRkZWdseFE9RUxYX1qXpZadn5uVl6Gnq6Kmoaqpq6qvoqWeqq21trG9uK+3r6ituLSzvLezvLC4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5zRkRkgXBdlJmHnK6WkoycnqahoZ+kpaalrJ+cm6SlrLKwtransKunqrSrs7mwtbWutrmzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbGtZe3lfVFxEXmKTpJGHmJ2epJudnqKkoqadmqKbnqqurLG0o6ipqauspLS4rLavrbO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVvZllYSDIhIlxYX46UiZadnqWcmZujpaGkm56gmpitra2usaCkoq2rp6G1sLGxrKmvs6i6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFROjMhGitolI94kYyRm5mdmpSfn6iinZ6nnJqZqqausKqboqO3qaGgrqi1qqanrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJpaT0zLTJOf42TjJOOj5abmJyTnZ2lpKKlpp6cnqWfqq6ln6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWtYND9NdISKiYySjI6RnpWdlJmdo6CrpKOjoqOhm6mqo5mdpLGpoaCdpaqeqKKfrayqqa6toqKilZiimpyQrKmwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFldW1tcXFxdXF9jaEBScYd7hYaFj4qMjJeWnpiYnqWmqaaqpqilopikraOUmKSuqaCcmZugn66ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmVxeXZ/c4CFgYmEj4uSlJ2bl5yop6Ssqqevo6aYnquflJSjqKadl5GPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganRscml7gnyGf4+Ej46Tl5WapZidqKWkqp2ml56kmpGOnqKal5eGhZKbpI+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFpZGhjdnx2fneJfoiFj42Pmp2Ml5qioKKYpJWgmpSMhpiai3ONg36Ol5aGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpywu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaF9jYHF4cWtJU22LfZGCiJiTiJGOnpeclZWVk42ViX+TiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrayYp7Ojqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBlXlttdWlKPTt8ko2LeYSQiYKHipmMlZSJkYaElIV4iH9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqGpnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1Vaa3RkaHFgX1VPjIOQhHB6gn15goqRgJGZi496hY5/dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5xenBrXG6GkZWMjHdjdX1zdXyGjnuCmJJ/cIaOe3Z6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PS1JPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWRtaWJ/n6O+fHB0X3d0a3h1ho54eoqEbmuLkXhzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFpaoIFdlWNtdGF6bGp8d4iGdICFhHNrmJBzcntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlRSGCqrpxsdXJoeWluf36Cf3iChIR4cZ+Tc3eAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVJDSIBvend2cXppc4SFeXuCgX2KfHSgmHl9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUUlkfYN2hHV3bnmLiHd6hoR9lIV2n5iHho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPRkM/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XYFhtWFpcZYaNgI98gH2BjY98g4aOf5iTgJ+gl5SamaWtkpm7sae7x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSFBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9hfGVlanGVlIiVjo+HiouWhZCNm4menpChqaSiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTkxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlJebId6cX55mJaVoqCdlp2Tn5KanKacpqmdp6uoqbSWq76rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU9RWWyDjXWQhpygo6+5tKCqqaqlprKprrSwsKy6sLK9m7LDq7rJy7jDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGgq6GkqI+csYuVo6a3upugoq+SopyhnY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lGSFFOUFeAkJ2Cqp+tpay8xMCnsMO1qrG+sba8tL2zwLW7uqK4xai1yce1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6anoaaaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejaGqoa6wvbCzvMnGtLnDvLKyv7W2wLO+r7Z0sLOlusSkr8a5sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKSvqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZKstLK4tcW7trrHy7m6wLu2tLq5tr2zubHFYHSxpLGanqq9qaWoq6qjorK1oKuon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgrLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr62u7TDvLi3yMm5tbm1t7iytrSzrrW1mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyb3BvMHAxMTFyr7HzbKjurC0rpqrt7uYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEY+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XFr7exubuzsMPFtK+4sLC7q7Kwpqq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uypa+0qau7v7CqtKakuKarrqCrtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZCOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOg4eFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6hrJuhmpiepZ6fq5mLmouQkY2EfIeHg4WLjp+Zk4iEh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnx9a2pdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQg4mPlpmWlaWcl5+VnpORl6KdmauVkJCKjJGCjISIiIGFj5Gdm5mJhoyBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGlrZ2FWWVdXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCSk42cmZKTkJaNi5WfnJSglJGNjY+Lfo+OjYqDiJKWmp6eiIyVkp2RgYt/pZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHpua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiLkpKLk5OTjouPioeWmpyPlJaQipGThoCLiJGMiomclpiiooaTnZagiomIjZuQg4iOf4OHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amhfX1pVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIySk4mFiomFlpmaj4+Uk4aUl4N/j4uZh42QqpeWoqKImZ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2ZgYF9RS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiNlIuLk4+HgIaHiJKYlIyKk5OGlJiGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBiV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomJjJSGkHyOjn2Dho6PlJSIh5KWi4+VjYuMl5iRm5m0lpWqnYuclJKNkJKLmJqKkp2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxfXFVhU1FIRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWm6easZqRq52Omo+SjpWQj5WWjpCgkIiVnKSslJaPlJyelKCdm5ifoJWbn6inpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnVkX11iXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeoOMkY6RoYyMlJGOh5egmJOZlZaloK6djKqcjpaPkpGVlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltfbVROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4uTo5mXm5SToZ6pn5GlmoyPj5CVloh8jpWSkaKalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZX15MTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTj5OUkqWdk52Zk6ChoZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKusuaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmouxlZqZlZKSmZilo5WfmpWZqJyboaCZioyPlp1gSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyrtLWrqqetrJmkrqalqay6v6irt7e+wcC+t7Kyw7C3vayjrrStuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqeoKmep6CYmamZoaedl5CNkZ2DbXWTopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1MRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypraywo6OZqrW7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7eeqJylo5qboJqnpbKhmp2lnKepnZiUj5Sbi5aJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobS0uratqLWysp6co6Wal5WZqqGeeGNfYV9MSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLXAsLy2urenpKurraGhm6urxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSytbC+o5ajlZOak62fkKGhpKKjnpC+pKidqKucnKCbpp+9opiknqKpq6CdlY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWkmpirsbWxqqWqraycmKCgko+QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS1taOdpJSRk6Ctn5ihnaioqqKawqyonautmpqdmKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXl46io5WQpa6zq6mioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKmqm5+moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u1tq6qoqaVlZSiq6Gfn5mnq6+vr7uxpZ+pqZmYl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilpCOn6CTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+eqKSZk5STo6C3o6Slla6xsaWppaGem5malZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaXoJWNkJ2elIupqaqip6GanpaNj5mQgoaViZWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO4uKqtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLiZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl56UiZKbmZSOqamnoKOcmZuTh4+Zi36Nl4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7Sqr7K4n5esraiumKmpjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqqzqaqymZ2nm5qUjKCmpLSup6GsrK2xp7Orsamjm56opJ6VoZqcqLapmJqSkp+Zn6Ggkq2hm5qIl5mMnZqelIuPl5eal6elo6Cel5aWlICQlYR7j5OEjZdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKilrq21qa+zuaansLfGt7G3v8LCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurrWxubeqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCllZaambGiraClr5ahpJqZko2ipaeyqaGmsayqtaWusLSvo5mdraebl56bmqy4opiTkY+YnKGZmJWuoZ+Xg5abjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFLXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe7xL23v7/BuMC9sr2uqLq5uLfCt6yusrqWl6evrKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKem5WXpaWkt6eisLOrp7Cnra+0rKSZoayonJydnZWquZyVj4+MmJ2jmJGYqKShmYaVmJGdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcSk9kXT9ie0dJOEdnV2ZbTV5iTVlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm5rsG8w7izsrXCw8/EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1raqysauoqLW6rLWytau0raqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoq5ygmZuTpLWaj4mOiJGjoZaPlp+jl5aHkZaUnpuZlpWHmJKVmaecoKCNk5KOkXh+j4V9fX2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpObVhiW05hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamwpKejs7SwtLSwsKCrrb3Mu67CvceytK60wcPRxMa/wbK+wsO8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqqrpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnqKnqKGspqOtrLawsaCpo6CqrbCsnZ6np6mao5iZkKComIaEj4uLn6CQjI6XnpKSiImSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfHeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY+V3VYYFlPY1xOVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8PEzs7Dv8C0wMPEusG0ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLult7OsrK6oq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKeloaGrlqqhk5ugpp6ko6qjrKKeprG2rKyipaOaqauuqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZyRk42Fjpmlm5ORm4yTkpKUo5qcmouPi4x8hoKCgXp1gYSBfnV3i6KHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Yqaittaq1saqlq6qpvMDAubq0vLWms6/DycvRv8G7ub+/w7rCusHErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7S3q6ykqqqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmiqZ+tm5GqoZ2gpKOmoqqenKa0rqelqaKkmKWmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyQkJOPhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeCf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlNjUE1VVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpaqsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMLAv6+ys7O2vbzBsbK0q7Sppbappa2zsrivoq20sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCopp6nm5mpsKmin6yioZKioqOnmZqpppiYmZ2Pi4eViH2OhoSFpJaGg4SNiJGQkoaHlqGXiZGekZOQjZGclZiPi4aGeHSBgH10eHqAe3R0e2qCiKR2aV5la4F1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqOko6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO1p6essba4sqWnubWttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rtLCunamkoK+cmrOilqWbpaSfpZqaqKqlnpqpoZuRm6CknpmXqaqRmZqSkIuCj4V+kIOAiJ+Ph4F/jYmTkJGGg5WblIaToo6UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfZ2NyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yitKaqq661t7SpnLm7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qVjIl9gI2IkpCNi4eTmJGHlKSKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLWnqKqvrbivqJi4vKStvrS0oa24taemqLCzoJ6lpaehpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjYyJeoSNhoyOjYaKk5qPiZWgiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xua+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3qCiIWKjY+GkJOYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW5mcmlrZWhdZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGqrbGfmb+1pKe0taiesrypqKWpr6yZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo2Uk6SopJCJio+GeoR7hIZ9nY2Ki4d6gYWIiYqShpeSkouQlZSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLGso7aup62ut8C/vLLCt7Cusra2uba2raq9s66ysby/t667u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqmqq7GlmJ6qnaakkZilrKKYnqSpoZyhm5afnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiYqLiXmFd4GCgZ2Hi4KKfYCFiIeGkYSXlJCOj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBYmVmZmZqaWNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqysaO3rKqtqbi8u7qtwLKurq62r7O4s6mrubGvrrO2uravuL2spp61qp+gr6Oprpuhv6Cwo66xr7eutZ6tr62topmdp6mln5Wap6WfmaSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko+QkZeOkH+AjY6Db4F/ZnltZ2tpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsc3BgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rbuuraqrt6qzt66msrWyrqmwtraws7W6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKejnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiGa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrG5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7OpnaGjm6WmmKu5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9iJ50h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+qqaeqv8Ovsbq8t8C/qqW3sKmspLK0rq6zt6qopbCtpbSym621trWmp6iysKyyp62dqaCxp5+jopmfoZqss5SjpaW2vaatp6uqrKiloaCYoKajmZmlo6SYnKSplpSim5OSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVOMXFdbUEFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK+srW/tba+wauntKysqaaus6mvtrOnp6a0pae4rZyzsrarpaSnsa2ssKaqnaaksKKhn52Wmp6crauTnaKfs7qjqqmira6loZyamqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66jsLqvo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+bopuWlZaamqullZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDg6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wdn5+ulZ6ZlJSVmJ2soJmZpKi1r6Kqj6qoqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5h6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYl5WVlJagqZyZlqetsKmjn4+to6iWnZaboaWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ6hqaSxp6ypo5mcmaedlZOXl5GSoaaflZOlqrCmopaTraCmkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5VZR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m0q6quoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj9ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSlmaWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYKMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQXNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Coo6qypLSlrKWelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJykrJ6QoKirn5qfqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjZh8pLu5vZx0erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9dXT0rOlZVJz47PKeeoaK/pZa0w7Ssq6isq6m6rrDFrbOyrbams7irqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZOcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpneHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNwmoppcot9hpVna39ydXh9fmJbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtXZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKilm5eUoJumrai9p6iklJOblZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqKYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpuUoJyNgnqlhW1rfZF8gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glKKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaZk5CcjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgubC/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqpqGcq6KkqKSktKScopKmrau3s6euopGQmZylkpGfoZibn52Ip62lrK7AwLGhqa+plpKfnaKaoqSqo5Ogop2era+qraekpKihpqWdrKiRo5qoramanKibq6CVlqSVn6KWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnuoh4WgdZeTiLNjgquGoY6Ns2qEr3R9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGFybXBoYGB6ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mll5yir5+gn6inoqWgn7Crmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn66mrLGpwMezqKmxrpaSnZyil5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0Q5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52no7Ctpa22q7rOsq2mrqyXlZydopmerqycl6Canp+ps6urq5utq6Wjq5qusaGnq62lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpqCbpJ6dpaeno5yrmqKsoaOfr6GcmpKrpLWvrqCnmp2Vk6aikJqiqKCgppyxpqapsq63yLK1qqyplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhs62hqrOxoZqop62utKGRlKKml5qRe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqau1sqybpZyglI+lrJGZnKijoaqnrqKlp6mwtcOys6qtqJOKl5ylm6GjrqWXoZWZnKamrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopiejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp6YiqSXo6l/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgnBbZGBpb2NkXUxNUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpunpqGisK6dpqmitrLFsa2pramRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaeYr6S7rKG2tq2dnLSxt6+xpZecrp+inYWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmmapJyVip98mJmGh49zr4Klm6KOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBLW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqOfpaGhtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ22m6OrpLasxLCpq6mijISOnKKgpqKWmZqdmZyZp6anma2or6Smm62mvayUva+sn6GvsrepsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWthaCVqqCil4afgJmVgHuSfquAnZqWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKfsLCqn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaahmqWdrpihqKe3qcGvpKmknouBjpuan6efkpSZm5WbmqalppuqrK2kpZ+pqL6klsKsqqKgqrG3qKylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SmlZqBrIqEsIWmmqShoZGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFtmI+om4yYkpqafHqRn39ldX9jhnh0gX1iamdxbmdmZlBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop6ln5qjo6WZoKKqs6m9r6Sonp2PfoublqGhmpCRmpySmpipoKKaqa6opqaipKm7nqDGpqSooKmzs6qtpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoTXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52Rm5KaoHuDk517ZH57ZY9neYJ8YWxma2tjUWJbU2pcP1ViQ00pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaep5yaoamjmZ+hrK6quq2no5qXk32ImZGmnJOPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKosrKnrqmfuaatrZlzdqqluIZkiaBwaK6Ri5BubnekkJmfgXWumJRwj4txlaijmpeupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZmTmqJ+iZGYd2eJeGmPa3mAemVtZGdtY0tlWEprWjpRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpZKnmamal6OqoZaepqeosLurq5qbk5N8hJaOppmOkpGZlY6YlqmWoJmpo5yxpp2iq7mfr8Gno7Klqq6wqauppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVq6eNkpKMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4V+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpqlhImXkHNrkXdxjHh3fXpqbWVkcGVVYVlAalxIY2JQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOXqJqompSmoaSRnKmaora7p6qYmpCNfYGVjKKVi5WRlpGQlJimkKCbqqCdtqOdpqu3p67AraK2pa6ur6unp7G2n627mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqK+Yo6Cco6qenp6dl6ydk5mhm5SQlquajpmZl5GWn5GIoZ6WlYWSjZGOlYuBfmaLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjk5+ZpIWKm4p9dJd0e4yAc3x/am9lX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqJmojZqqkJ+6t6SkmJyNiXqClI2clIuVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKwnnd4nqevuJR1rKOeiYCrf2RcYnagj6WfhJh9bZKznKOnraqiZZ6fknN5mpdxgZmomG1/oqiKZZymnZKYmJaNkpyQhp6bkJaEkoePkJKJhXdqjod2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3uonJxme5uKhXqZaoWMhG96gGtyZWB3cGxraVxmZmJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpart7Gzp5urqK2YdI2esaCoq6eUl7mgoI+cpJ2Rf4mImp6Mq5mhlKehnY6Wkp6Edq2PiKebqZKZpYqdu7SooJmYi4l1d5ONl5OKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmn32nonmgrLR/jo2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWgpGXl4SbmWJ6h5CFj5CSi4NtcI2HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseXxxcWhleHBqbGtcZWxqZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8nAsaKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyFjpiXh6qboJWfoJGMk4mGgJGnjYejnqSVmZ+In7qyqJ6ako6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3N7d52Pp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxkJSGaXl1fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCkpaylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJaVkYeqmJqamaGEjot3m5yPn5CInqWcl5qZiKS5rqWanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprIWjjamZjJp/onWBmZRsgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgWNYUXB3Zm51c2tqb11qcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZiho6atr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGTkoyKppSUmJ2efpKFhaykh5uQipmqmZubkomnsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXRcnrKDa2NwdXdyaW9Ya21zc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARF9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGBlo2Kj6COkpSdmH2QiY2ooIeXjomSpJWcm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGhdbnJ6eGtpXHFreXpkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aVg5GVmJB6ioSVpJyKlI+GjJ+Tnp2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXpV2SGVkYXRyf39vZmBsaXd8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn52bmpaZoZ2WiIeJd4aBb3mVhZGbinuRk5aIcoCIkqGcc5GQgYmalqGchY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnp17pZZ6qYCVm4+Jn5t8p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5dsnHx4l3NuqaRnYWV6coCFbGhmZG92eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbGdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmaqhoqWPpqmhmquLm5mZlJmTk6GYjoeFe3B9hGh9j4OUmoB3kY6PiW9/hY6SkmyXk3yKk5Sll4OPq5uUk4uGiXmDdoiBboKfhniBkoaImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlosrW0xqZzmH16nWucm6t2hZtud3mYapp7dZhyUUV9s19qd2x6iGdraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJiro6Omjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY16joyXppSEmaqYjZKLgYl6gH2MeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbF2Ii256fXFxZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVIteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfImImKiSgaOtkYaQi4KKfoCAj3RpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foqknneffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaW1TV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjIxzhnqIhG+MhH2Zk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdsg4VddWd3jmV/gISMp5l9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHbmpnVltgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6iipuom6qZg4KcjH+XlIeOiomNcYJ8j31+joR7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWDho6YdnKEqYaOkp2QiZ+eiIybp5+fqoOJjpWafn6Jlq2nj5Glj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6mnuCioF1gYWBZ3eKhmpfb3GBdV5xiYCIjaSUhWWLjYNud4uEcYaPenFoaWZ8hHuWW1xraG52W3x5eHZvdHODaF1ui2trYlpaX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmKiYeHinJ9gYx2hYuBhJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKki4iTm5yjmZWqoaemn5KahpSMenaNjYOnfn+SkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYSQd3x6dJmgiIaJnYmEk359ioB/dG5yhIF9doWFiY6kj4KFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0inF+e3h3cHh1gl1eb4dobl9eWl1dU2hyVmRdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKShnnx/mqyPn46HoJ2MnpZ9eZWEfI6ZioaEhIZueYGBc4GHfYmUhG1rfnqXh4ODj36Ah4SFfIiFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJeHh5uln6KZnIWCkpqZmI+ap5+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqEhIxzf4l7fHFxeoeCeneIjYORpY6Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheen9pfn13dnd2e3hdYHF+bnRgY1tdX1JnblRmW15ia2l2en9ybG1ka2pogX9sdIJsbHVvenCGem6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVjJmZenqNhn2JkYSMgoKDbnyAeXOBhH2Lkn1raH2Cl4mBiI17fYaEhnyQg5GdnZOJqZ2BcYyLjJKGoKGKhYx8qJGJkJKXk5aTeI2jn6CdlZh+gJCamJKMm6Oho5mWkJp9jIN3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfoiJcoGGe3xwd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH54h3tsjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V9ipF3Z2N+hpeKgoqLeHyAjYN5l4OWmZiNl6Gcf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnaChl5OVeH6Ol5eNlpudpJ2YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4aRl4t8k3iLiHt/hnt6cX13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW2xlU2RZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYN6bpCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmnuXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEf4mLgGRffYuUh3+EhnR9fot/fZmGl5WYjaSimYBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5efmpGPj3J/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5eem6SUlYuMnouGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lZaDfo10kIeCeIZ9dXd/fISAe4KLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ3YHBsdm5vXFxfXl5rXlBeWWNhaG50e4lsYGlla2Npd4duZ21pa21ogX17eG+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZh+n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Jze4CHeo+SiZOSnZWmnJaCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIySnJKPi4tthJCPkYiemaKglpWIlpBth5iDZYWYjpN6iYSQinCWm5Wjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5e5iTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3Fmel5vbHNtclhbX2BhbFxQV1hlY2dxcX+IZ11paWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOPiKGNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeMjI2NjJyJjpCCbImLkZGKnZahm5eUhJeGaYOigWWEnImQfouDi4F3k5mTn5KRiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudX+YjnuHhHmTkHl1h3NviHqEinmKhYGGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcG9rcW1ZWWJhYm9ZUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ybjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgauUhoJ3f3dyg3qDoYOTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKe3KLhYqOiJyan5uVk3+TfWeEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlIt+h4V6ko9xeYNvdYt5iIp5iHyAio6dnIR7enaCi3x3cWpsgoR7YXlxb21zdFZfcGJyYmBtb3pxaXBmZ3V1aXJsYndlXVdmYWBzVFFPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoeAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1tdHNSTYLfyJLWk3twdYR2haGElHeWkZmdkZl7lHOFkJ6hkpORi5OclIZ/l5aIjY2HkY2Hm36NgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIloOGY4yRmY+Vi5eMjIqKcXqUiHuOiIqTkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR5gI2TmZiJfHV3g494c21ncYCFbmx1cGlqdW5TX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fdlBOTGJnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amhrY6Sawdyu8KFzbHaFd4akhpNwl5GWoZWcgZJyhouil4mNlouQnZaDgZaQhYmPgJGLiZV9hnp1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXhOTUxlZ2Jed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPapmRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuQi4WOgH91eIOEcoiCk5yWlJeFjHWGfW+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hY6EkIF7gHx9j5GOlIhtcHmMhXRrcGxzeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGhjaVltV1x1TEtMZmdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBpYWdhf9W2jpGmeG9xeH1xlJKOiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDe3GGgJaajpOTgYh0goV1gn+JkZydhpWPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcXCEe46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcoBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB+ZWNnZ1edj19xc5a9xYV3cpWLkYB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaTjZ2AiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaGh+d2VdcmRZcHRTVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXWtuYXFQWmxSRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYhwepKEfoOEiYNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xwfHJ/h4OIfYWHeohxgG1wgoWNgoJxg3d/loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnJuTlhydGdgS253dmJeXFtZdX5zcFhnXmZrcV9vT1hpUz9ZZ19bcWtoenJcW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIWZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIyHf3uSiHmAhY6DbIByaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltnZm9jak5YZlE9XmZdXnZmX3VxW1lVb2RaZHF6XGheYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1/jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8kIpxfH6GfGl+bWuAe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tV219dXOJgIV2hnSCiXp3cm2If45/g3F9e3yQh4d5bW1obIKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmhOQWFkXGB3YVx1bVhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3Fyh4KBe4Fwhol3eG9vgoGLfXx3fHpzjISAdWdwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURkYlxkcV5ceGhVV1Z4XlxmbmlXbF5hamdlbm5ocHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjWVxgm5ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11d39taHdlbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4GFfX93a4iGc3hqdH+Cgnx5e3d6cYl/e3Jmc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1VeckdCZl9eZ2ldWntjUlZddltbZ2thV2tgYG5mZmxxaHB2eI90a46Ndn93eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hkcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iHqAbm6Kf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3BHQWhdYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinWAe3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue5+4bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eYuCZXB9Z2trW1ZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeol6gGV0hnxtcGd0fXZ8fnB6anl5f3h2b2RrYG2JfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxpSkRqWmJlV1lVeVpOV29rWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2gH94f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd0dIWGeIKFend0dm5renBhaGtnhnSNg21nXl98b3qJfGhsd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3uIhoSHhH11cXNtaHVdbWlgbHVkZ2Zpem97cllngXZ1aHCBeIJ3Y3iFi32Vgm+Ma217gXFmc2Vga3hmcHWIeXxhdYN1aWtxdHlveHdye2V9fX12dW1jZGBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxLa1lkYlZUVXNWTVl3ZVpfbGBcW2RlX3dnbWJvaXRvcX51dJmBeICBeIB/hoR6fXaCg36YhW5ydHx7dXGFhY6CgXqLdXSQgH2BlY6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV15aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXKAb2dpeHNxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVaZm15e2ZfbXFqZF1WYFZvb1hLVGlYZ19ZTlVsVEtdel9cX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR2dmZoaWFXVlloZJCob393f4qOenBve2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnZkdYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGtgbHpuaWh5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWWltd3tlZW5yZmNaWF5Zd2ZVS11kWGlYWklXZVFJY3hbXV9tW15cYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWHBtW15YWlxse2Jxd3ZtY1xudHVpdndyboZ5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoKBc3xhYmlcVFheY2SQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeX15gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZnODk4CJg4l6dm9yfXJheGNZbm5gb3CAenNlcYBkXm11aGNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMW1dqbXN7ZGxsdWNhWVpcYndcVExkXllqVFdIWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybltZWFdgbHZjanVqal9bbnVzbnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGFjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JecGhhd2FbfHZqanJueHR0dWpygpaEh3+FdnNqcHxtZndXW2lsYW9xf3lzZW9+WmBwcGFeaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWm1xWFNQZ1hXaVRVR1pcT0lzdVhgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZ2lzaGN0ZWVeWnB2cHJ2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjXmNUW2BaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVfYG1kYXFdXX5vaGlzcXRxdXdtbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpbHlrYldcVlx1ZVRSVmlSWWdVVElaW1BOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29nc2tmeGVmXlpydm90fHl0bop7f3ece3prYWVsbV5gbmplcXl+Z1pWWF9seHt6b4NeYV1oVlhgWGSciGJrcIGGfHZranZsW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bWmGjYCKe4htcWZwe2xxbGFYX2dmbnKAc3JeaWxTZXBkVWJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aW9/ZWBVXlRedlxVUmBnUF5iVVRLXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKUk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6NjY6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD8vMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0REQ1hoZmdnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4aJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5COi42FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiIeKjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OSk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f39/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JscWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJucmphWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW11cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJoa29wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2lsbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3Ntbmxqa2hVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHN0cGdUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbHxqPzk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJTFFNTUtFQ0ZHR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk5pWk9QTklHSUhISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hLVnNeVlFLSEhISERHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8UEpZbmVeXVRHQ01GQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SmBiYWFjZVNOWDw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5xaGhnZWdpZmhGNjg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIx4bWxpaGlqWTU2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qKi4l2bW1tbGxVNzg1Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYhybm9vcGVAPjo7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoJycnFxY0dGQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjX5yc3JTS0pLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyMi3t6dF5nXVBLS0tJSkpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt4e29nVU1MTUpKS0hLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2OgnhyVVJST01OS0lJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMc1tWVFFRT0xLSEdDSEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI18XFtXVldVUU5MS0VGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+Mi4tsXVptYkdVU1JRSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dvX2dYPFlaWVRRP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJi4x7cXJaXV1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIuAaFtcXVpVV1VYU1JYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1fU1daVlNWVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3pvcllMTVBQTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTkVARERERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhBQTw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX1xaSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZFRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NzVXb3Bzd3l6e3x9fX19fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXt8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTU1NTExPTlNkTkpMUkhJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49OTk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRURFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTVBMUFBRVVZXT0tWVlVTU1FSTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkZHSUZJRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUVJUWFZNTlRWVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0hKS0lJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENGRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSElFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEpJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09NSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhLS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYCDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUlZMS05JS1JYV1FNT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm9OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUklSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0xQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVVFRVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYWFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXU1ZaWFxdW1tdVlNNVFVVXFxXUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1lSVVVZWVlVV1pcVlNXXlpdXWBcYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWJmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISEhH58fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYGCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgYGBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCb3Jvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgYGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYKCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoZ58cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKepl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1qqyjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiVnIV8fn5+f35+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ukl6Sbm5ahn4Z/fX1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjp+yqKKgmZ2dpqisqKCZkYeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eal5aYoJudnZ2ZmpeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4SIkJOPlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGDgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4OCio+Cg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDg4aYj4KDhISEhIWDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDjZmVkoiEhYSFhYSEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWUm6OropOHhZCHhoeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/iZKdpaamopOQkoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3mJmJecoaCdnZqMiImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e36Sm5mdnpydk4eIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYCVmpmbmpmShYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCWmZmYlZKCgoSEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt7eoaXl5WWj4GBgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp8e4qWlpOEgH+Af3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7ent7fI2MiouXjH1/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5foyNipGPgX9+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5ho6HgoKDgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7hYSCgoSDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYOBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp/goJ/g4uEg4SEhJeXg4OEgX1+gYGCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyAgH2HlIODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8fYGCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoaEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn5+f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXt9fH19fn1+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5/fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gYCAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/gIGAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH5/gYB/f32Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgIGAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIKDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4SEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fX5/g3uFg4CEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGBgIGAgICBgYCAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aGh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9PD46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX19bU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLe909PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6Oiq9PS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaiw0tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0tTT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9PTz8/Q09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0NChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ65npaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1l5+gqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZymoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+lm8fJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uXlJ+VlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PDw9OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlnYaer7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlqCPo5uinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Scvp6ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGUlFLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojs9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNmvjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlRMRkI8PD9GRUdLST02Njc6OTc5Ojs6Oz05Pjk4Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4ODk5Ojw+PD43Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRLSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1NTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOzo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSERFQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw4Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo7ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY4ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4aBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjUzNTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2OT07PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubm4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2PDo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyODk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz5AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzo9PkA/QDpAQkJCPz9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7OwsK2sq6qpqainqKmpqaioqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiYmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTkzNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKinqKilpqiop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD46OkE8Nzw4Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2srKyrqqmopaOkpaampaanp6qopqanp6eoqKenqKinpaSkoqGhoaCfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Ctq6mprquopaWmpqelpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1Njw/PT9BPzw/QkM/QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaOio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj47Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpKSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk4PTs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Oio6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Oj07PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6goaCkp6empaOioaOnpqalo6OmpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqOlpKWlpaWlpaWko6SjoqKioaCgoaCen5+fn5+enp+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manJ2eoaampqWko6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5eYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6OkpaSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2dn56bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6ODY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6Ojo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaXmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqalpaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2en5+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnJ2cnp6en6ChoJ+foKCgoaKjo6SkpKSioaGenJqZl6O3n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZiZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoaChoaCgoaGipqGioqKhoJ6cm5ubmaGplpybm5mcnpqWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJGSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE9PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz48Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKloZ6goaKioqGgpbKtoKCfn56cmZmampyuZnidnZ6bmZqcmZeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOSkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6aTmKyfoJ+dm5qampmqgESBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCfnp2bmpqam5qYmZmYl5eWlZSUk5GRkJCRkpKTk5KTk5SXmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw9OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz86OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ufoqKem5ydnJycnZ6gn2GZqJ+enJqam5yjoU9IhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foKGgnZyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+enJmbmpycm5qamZaWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0JDOTw/Pzs6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPDo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYl5iZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqdqXKKgm5mZm52cr3JKTIahnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmJiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilglN3opmZmp2boKNfV06HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5qcnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWWlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIpcYJObmpudnKOPZVpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+PkI6RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZ6ZXV51lpqcnZ2igWVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bm5ubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDk9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZycnZybm5ubm5yamJmZm2FiYH6Vnpyel3RjVU+Bop6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmZqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpmYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oj06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56dnZ2cmpubnJubm5iZmZ9pXVtjfZycnotpXlBTh5+bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+MkI6Qi4uPj5aIiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoqqxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg6OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRho2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZuampeTdm5mVnmUmJ2JW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo4Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+MkY+LjI+QkZGOk52fkn+ipZimnXRPUGSHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo6QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaKbjHxmkqWTnHuIg2N0gICCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKjiXlsUXOcjYtYcHt8f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3OTo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmXVTS0tzk4WCTF5vcXeJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo9ODg7Ojk6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S4CCiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+DgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GOo4tQMC87eIZ2dUBCW2pugpCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/Ojw4OTU4NzU3OTU6Ojo5PDg6PD06PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5xjQ19LPHh4aWZHMTZXbXKQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZDPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqq6OSXiqfkB8eGViUVZjSl5viqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRT43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidmPC1KVFfZCEeE9tjXhWYoCjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6qppKenmZ2kpaOinmOBu8CufKSjmpdsSVx7cFJ0laOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07QEFBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCip6GmrqamnJ9sg5i5i6zTo5u0rFxNr5pVZZChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Ojh3d+enPRxLCZo61sVqeuZl2HpqCloqGdn6KYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbW2sq2wrY+HgW2Sy72VlaaVdFZtd3Vzf5WmqqekoZ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyuLu8vLq6wrm1tJ6GdmFWnrW7pqeZh3htcnB4eXp9hIyRlpuhpqespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMLIztLQzMi9saONcGVSRIiUhYWFfXhyb2Zla2hrcXNxcXJ0e4upxsa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb5OPZybuuo5WGcllaUURmd2pudG5rZWVZWF1YXGJpamhlYWuPuMHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zNDUyrmmmpGEcFxRVEtEW2ZeY2plYmFoW1VZVFdZWlxZXXmeuLqrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJuJV0YVRPT1NIPl9sX19lY2JfZGJUVldWVFVbeaKusKqoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDn2ZLREdLRD1aZGJiamRhXGRfWFNQUFJch7a6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGwilNHTUU7S1pfZmxnX1xgWVpUT1mHp6y4tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsedcVxIPz9EXmJha2JbWFdTWYChub+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsbGxsCvelVOL1ZUV2hhUk5UerLJyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLCwsPBlUNOeYOOVlB5rc3Txba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68x6Z5bYKRlnK0zMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb+ucGF8kYqL0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqysp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5tqulmI18hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG9ycWVSHzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mxvcPKjUR2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqbnVveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/AwHdRb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbW9gY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0cO6vrzEvre8wL/Jz8fIysnBhXFzpczMy83KxsLDy87BvLi9urBuY2O8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAv8nKwb+7ubGgfHJrrsjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmI98gJvKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1puc3eBn7i4wrqzu7e7vb+6u7uupJqXhpB+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJabpZWgca7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUphjaCsr7a6tbSyrLy5uLW4wb2Ll6+hpXKly8K/ubq1rqWss7Cmr62onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYKonZljqb+4tbKxra2fpKamnKOlnJaZmZqfqa65rKurn6WopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7iztLKwsa2wubi2u7e6vI+hsaqjcqywqautq6OooJ2enZaXoZWRlZePl56orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU1AUnhxUElJS2ecgVlEUq67sayzr66srba2srS1rqimnpqbnZ6mqJ6gqKmfoaeWmpaXjZuSjI6UjJaao6ign6GioaalnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBLVI5hY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olJmUlYqUjoqNlZGXm6Gpnp6foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOdd1BuS0xjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJWdmpSNj4+PkJeWmp6jqZ2goJ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSElLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXVFrY1tkX1xrj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKclqeloZWVlpGWlpSbmZ2jpKifpaOep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1RS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2etrqyvp5+eoqCWkJOboJyZl5KTn5yho5qempijbn2XmaCbop6copyipqutp6uopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ+ZSEePn5+mo66npKygqKu1sLSwsK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52JYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWmdipgkp6jq664r6+ur6+4vLu7uLW4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhsi1c1ZoV8eYCWvLy8sLnBw8LGv77CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbHBsVGBrcHJuc4+uxL7BzM3QyMTI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qe4BkWHd3cm5yf52+z83TyrPR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm+Ee3aAfXRydW90ns/Q05m219PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Bvc4OAe4F5bWloXm2+06N/0tbUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWpsb3N2fXJ5gHJiXFNZo61yq9rP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5ucHFycXZ0b3d5dGNbXHt3iNHUyczNxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NLTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltc3BocnRnZmNdd8LFx8fExL3Bxc7Ox8XGzcrRyMvNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDo6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp1amNiXmJlXajGuL/Bubm4uL3IxcHDwMPHysjIycjBxczGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXWBbWVpcYW5xbWlmZ2tpbndcWFZdYWmqwa21uLCwsa+vwbq6u7q4wMHBxL69ub3AucTKxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpamt3ck9RV2JxmrSrrq6kp6uppLWytbOys7S7tb2xt7C1r7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI+GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhobHtlSVx1h5SoqKijm5+npJuoqbCsqaups621sLKoraess7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmhteWRthJCTm6KlrpqboZ2WmaKorKOnoaupq6uwo6afqa21trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG15eYCHhpOYkZWtpqCYlI6eoKeiop+kpKalrZ+cm6OlrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmbHlzcWpYW29Fe6CflJKJmp6fpZuenqKkoqedm6KbnqqurLG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hYmNjYmJjZGVwalhBIjpxaGmHnJKSjJeenqadmpujpaGkm5+gmZiura2vsqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnqamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYGJjYWFiYGBkZnJEGRxIipSQjpmRlI6TnJqem5Wfn6einZ2nm5qaq6evsKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJqXyU3boeLjo6UkpaQkZicmZ2Unp2lpKKlpp6cn6agq6+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJUX19dXl9cXV1gYWxXXIeDiYeNi42VjpCToJeelZqeo6CrpKOjoqSinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY2Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1tcXFxdXF9ia4OJfYp/iIiHkoyPjpiYoJmZn6anqqerp6mlopikrqSVmKSvqaCcmZugn66ZnKqzn6amn6OjoZWUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2doZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmR6hHqDd4SIg4uHkYyTlp6dmJ6pqKWtq6mwo6eZnqyglJSjqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk1OTVJXWFlYWFdaW1tgaXdwdm1/hX+IgpGGkJCUmJabppmeqaalq52mmJ6lm5KOnqKal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFsaW1ne396gXqMgIqGkY2Qm5+NmJujoaOYpJahm5SNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFtdaWRnZHV8dG1LVW6Mf5ODipqViZKQnpidlZSWk42ViYCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBpZF5xeWxMPz19k4+NeoWSioOIi5qNlpSJkYaEk4V5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTkxNVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVabX1qbXZjY1hSjoaShXF8hH56g4uSgZKZi456hY9/dX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5zfnZyYXGJlJeNjXlkd350dn2Hj3yDmJF/cIaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWVvb2eDpanAfXF2YHl2bHl3ho95e4uFbmuLknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBtZWtrWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtepYZhmGVvdWJ8bWt9eImHdYGHhXNrmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjMzNTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5ud3RpempvgH+DgHmDhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTExMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2RqXklQRz0/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfHl5c3tqdIWGenyDgn6LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoYSKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYV4hnd5b3qNiXh7h4V+lod2oJmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiICCiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtNTVBXYFhvWVtdZ4mPg5F+gX+Dj498hIePgJmUgZ+gl5Sbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMTEtOVl9ifmZma3KYlouXkJCIi4yXhpGOnIqfn5GiqaSjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITExNTlJebYl7cn97m5mXpKKfl56UoJObnaedp6qep6upqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWWyEjnaSiJ6iprG7tqKsqqump7Oqr7Wxsa26sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+So52inY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUVeAkZ6Dq6Gvp66+xcGoscS1q7K/sre9tb60wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60oKeoo6eaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDk2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorCxv7K1vsrHtbrEvbKzwLa3wbS+sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayssaWwqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZKttrO5tse8uLvJzLq7wLu3tbu6tr2zubHFYHWypLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL28vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQUlNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluSt763vLXEvrm4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLuYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhlrXFsLiyuruzsMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZast6uzpq+1qau7v7CqtKWkuKarrqCrtKOOsK2al5iMkJORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbKhoa2ho62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHh4uIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6OxnqGlnaCooKOxnIWekpGRj4uNi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+grJuhmpifpZ6fq5mLmouQko2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9a2pdXFFUVWBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId7dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjoqEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSQmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisK2KmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mSnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mWoKKNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWnKeasJqRq52Omo+SjpaRj5WXjpGgkIiUm6SslJaPlJyelKGem5igoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlJaloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltebFROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5STop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52Zk6CioZyYn5iLjI+QnohakJaXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjM0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqVnKKfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7efqZylo5qcoZqnpLOhm52lnKepnZiUj5Sbi5aJjKSilJyjn6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZq6GeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKmdqaydnaGbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytm5uemKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmZl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ+boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsaWppaGem5malZeooJ+Zop+vs6OmjJevmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GanpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoaW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2ktLCcn5CTppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmZuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Orsamjm56opJ6VoZmcqLapmJqSkZ6ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6Cel5aWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajq6ilrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusrqWl6evrKiks6mUr7ukrLKypqejsrSxsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLW6rLWytauzrKqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamvpKejs7SwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqmqpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLuluLOsrK2nq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7W3rKykqaqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiXo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMHAv6+ys7O2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCop56nm5ipsKmin6yioZKhoqOnmJqpppiYmZ2Pi4eViHyNhoSFpJaGg4OMh5CQkoWHlaCWiZGdkZOQjZGclZiPi4aGeHSBf310eHqAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vK25rKO1pqessba4sqanubWttLyvvKWtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamkoK+cmrOilqWbpaSfpZqZqKqlnpqpoZuRm6CknZmXqaqRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSak4aToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qUjIl9f4yHkZCNioaSl5GHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q6uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcm5qdqaaWm56okZiSmZ2TmZahqpGbio6Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSWmY2Uk6SopJCJio+GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGljZmpqYGtjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLCso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t6+8u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyinJafnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiIqLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdXNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2uravuL2spp61qZ+fr6Oprpyhv6Cwo66xr7eutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKeknZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6Gpn7OqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56fmJCeqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+pqaeqv8Ovsbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqqCxp5+iopmgoZqss5SjpaW2vaatp6uqrKimoaCYoKajmZmlo6SYnKSplpSinJOTo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKosMK+srW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhn7Szoquco62toJ6alqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wen5+ulZ6ZlJWVl52roJmZpKi1r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw8OD06PEM6Rjo6PzY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqitsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZOlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlq7CmopaTraClkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m1q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwsKedl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJufvKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZSbrKqXjJSlmKWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Cpo6qypLSlrKWelZmqmKasuJyirZeUn4+kn5KMnKKdl52akZWSr7myrJaYpKinlJCWpJykrZ6RoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaGhpZ6gnZmTq6SsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNxmoppcot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtYZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpyUoZ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKa3OBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJurnaufkJaWp52qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamZjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSgqqSrl5aXmaWdqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAiIJueIJ4gHNteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ2hnqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kdq6KkqKSktKOcopKmrau3s6euopGRmZylkpGfoZebn52IpqykrK3AwLGhqa+pl5GenKKZoaOqo5Ohop2drK6qraekpKehpqWdrKiRo5qoramanKibq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdZiTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gn6inoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqSXnaejn62lq7CowMezqKmxrpaSnJqhl5+pqZ+VoZ+dnKyuqKyqnKiopKKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCsmp2mo6+spKy1qrrOsq2mrqyXlJucopmerqycl6Canp+osaqrq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqip5+fpZyxpaSosa23yLK1qqyplpKcm6KZn6WznZqhlJ2fpqytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKejn6mnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq6opp+so7esobK4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpumpaChr66cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKupKaYr6S7rKG2tq2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+epqKcp521mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2orqOlm62mvayUva+sn6GvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfZdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfsLCqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqSdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrKykpZ+pqL6klsKsqqKgq7K4qaylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpqafHqRn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYV5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5KaoHuDk5x7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6GYmZmTmqJ+iZGWdmeIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7ernsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKmmKmal6OqoZadpqanr7qsrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+WhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqlhImXj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVFFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xry6q6Olnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWp5mompSmoaSQm6iZobW6qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiX2LlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm62KqZaPqJmpjZmpj565tqSlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJxme5uJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmhYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcurOooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYSVkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZnRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjpC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCZl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5Zwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcGxsallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya2xyc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq6dnLKurJOYopqhpJmblZ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFqeHlkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGwrJ6mnJypoJ+vnJ6xqa2el6SboaCZl5ego5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSjqI+gnp2bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnp17pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5hsnHx4l3NuqaRnYGV6cYCFbGhmZG51eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqLm5mZlJmTkqGYjoeFe3B9hGh9j4OUmoB3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhneAkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRoY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppOEmaqYjZKLgYl6gH2LeXCQoYZ5gJWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlza1lsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlYqKlZmCfIiHl6iRgaOtkYaQi4KKfoCAjnNpkKaEfYaTjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuChpimjn+np4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4KcjH+WlIeOiomNcoN8j31+j4V7mI90coRxlYV7fZKLhoaPhHl+gIeapY58qKKMhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoSJjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX98mIZ9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4iTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4WGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5uln6KanYWCkpqamI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeCeneJjYORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2en9ybG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnKCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqZ2BcYyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCbmZKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcoGGe3xwd3qKgnh4j4uBlKWSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiNl6Gcf3CMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6OmJiOlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hnt6cX13iIN4g4+HiZehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh3+FhnV9fot/fZiGl5WYjaSimYBzh3uTkYmmj4yOipOgkYOSkJWXkYuBj5efmpGQkHN/jZKUiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnoyGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eCeIZ9dXd/fIR/e4KLg4qTo494g4F0iYd9gHR2gomFcGJ8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lsYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Nze4CHeo+SiZOSnZWmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhWZpenV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+IZ11paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi42NjJyJjZCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYGHjZqihnuDdYKLf3d5bmyBhYNfdHVzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgb29rcW1ZWWJhYm5YUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauVh4N4f3dyg3qDoIKTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJGWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt+h4V6k49xeYNvdot5iIp5iHyBio+dnYR7enaCi3x3cWpsgoR7YXlxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2IkYyHm3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqKcXqUiHuOiIqSkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3pocmpzio+JgYWEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBxY193YGBWa19edlBOTGFnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGJiZZ+h3p1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYKBfouVhGuBdW2Hj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBzb1tjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uPioWPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hI6EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2tXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiX2gf4OZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1goV0gn+JkZydhpSPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnRiXGhfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmnyLmnd+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdIiFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB3en2Lh4V7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5jpZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYdwepKEfoOEioNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xvfHJ/hoOIfYWHeohxgG1wgoWNgoNxg3d/l4uNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdnXmZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuUcG+Af3lmkoqCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuHf3uSh3iAhY2DbIBzaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9aa31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMhJudloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh+fZdvcYV9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8j4lyfH6FfGl+bWuBe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tWG19dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLdHlrWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHt0jYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d5cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1dllRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46Ndn92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweHKFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnJRUlRXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3eHeW6VinV/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anh5f3h3b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXVrTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVqWmJlV1hVeVpOV25qWV1sZVxaZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311dIKHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bISGlYFyj4JxhoJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISGeIKFend0dm5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yIhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFmc2Vfa3hmcXWJen1hdYN1aWtxdHlveHdye2V8fX53dW5jZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ0ZEtPVFhha3d+Zl1nc2llX1djV2NxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2RlX3dnbWJwaXRvcX51dJmBeH+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgXqLdXSQgH2BlI6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl9KTVVZZWx4e2ZfbXBqY11WYFZwb1dKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6aGl3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYR9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWGhsdnplZG1xZmNaWF1Yd2dUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmRef2lqYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboZ5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMWldpbHJ7ZGxsc2JhWVpbYXddVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdga3VkanVqal9bbnRybXR0dWuHfX+BfXdvbmxkaXBjW2tyZHR2jnNcV1RjX3B/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYV6MamNlbXp5bG5pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gX+BdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjWRPb21cVldVZmhzaGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmJ2fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYV5ej25iZ2x5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29lcmtmeGVlXVpydm5ze3lzbop7gHece3prYWVsbV5gbmplcHl+Z1pWWF9qd3t6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3uBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWh2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6Ojo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0RERTkuLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU3JxscHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWEg4ODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CNjI+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4eHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYaGh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQkpGRkpKTh4WTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKBkpGRko51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkY+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fX19fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI12bnuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtboN6dHaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJebGxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1lWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bWJuc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW10cmdRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxkb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJVmNna29wbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2lncm5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXWZsbmtvbW1sa2lpa2NSR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Sltpbm5vam9ta2psbGVQR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTo6PUdibnNubmxrbGdUQj9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRkVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxJX3N0cWZSPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1pPjo7Pj0+P0BAQD4/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEFERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0FEX2Q8PT07Oz0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCQ0VIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZT08PTw4Ojs/Pz08PTs8QD09PD09Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTEZGdXdNNzg4Ojs+P1dqQTs8PDo7Oz4/Pz09ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QUBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSklNTUtFQ0ZGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOT1BQTUlHSUdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hKT05PT01LR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8T1hkTElJR0dERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop2b2lTTUA+QT8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5+bGJhUj44P0A3Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYxvYGRlWUFXPTU2NTU4NzM1Njg6ODc2NTY1Njc2Nzc3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYqKiYmKioqKi4qLjIZqZmtpZlE3ODg1NTg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoRrbGtiPzw+Pzk5Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoBtbGBFREZGQkFBQj9AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjXtta09LTUtKR0hIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyNi3htYW1kTU9LS0tJSUpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyMh3l5ZWFPT01MTUpJSkhLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4yNhmlSUk9OTk1OSkhIRUpJRUtJR0tKSUpHR0dLTE5MTUhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMYVRVU1BQT0xLSEdDSEpHTEtHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI59WlhVVVZVUE5MS0VGRkxPTlBXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxqWlhsY0dUUlJRSzs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x+YYqLi4duXWVWO1laWVRRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH17fn9+fX59fX1+fn9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BaXF1cU1VTVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af39/gH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1paXFpVV1VXUlFXVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxeUldZVlNWU1JRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f39+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU5eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3lvclhLTU9QTU9MSktERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTUVARERERENBRVBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhAQTs8PkBAP0A/a1BKYEVGSElFQj9HTE5HTVFVSUFFPj88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNTFRUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0tOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9BQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTktMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxJS0xJSk1NT1BSUEtHQ0tHQ0JJSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREE+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5vcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNFQ0NJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTU9MUFBRVVZXT0tWVlVTUlFRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUFJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21uc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HQ0NBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW5zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTExbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5MTUxGSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFwcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSEhFSExKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTktMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PWFFcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTEtMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERRYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0tQU1VTUVFTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVVpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGFYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFXV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5jXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZbWFxdW1tdVlNNVFVVXFxWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxXVVteXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFpYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xcW1pcWlpfX2BgZGJjZGRiZFlhZmJmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZXGBhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7e3t7e3t9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJiYuNjIyMjI6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyMj5CPj4+PkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISEhH58fHx8fHx8fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3t7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fH18e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoKBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYGCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFvfoJucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeIcHJxcHSagW5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaKDb3JvjZ98b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1nqJ3cXegnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHuJoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5oLSppqmpl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/f39+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvpKG1qqyjf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maWWorGgmaeUfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI2gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJixoZiVnYV9fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqMjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f3+Afn6AgX5/oaullqSbm5iioId/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIGBgYODgYGBgoOChISHj6Gyp6GgmZ2dpqisqaGakYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tsaabmqCbnpycnqGko52UiIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDipeZl5aYoJudnp2ampeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJSOlJiRh4KChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4iMh4KDgoGAgIB/gYCAgICAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CBgH+DiY6AgYKDg4B/f3+AgICAgICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIOEg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOCgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4ODgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDgoOEg4SDg4SEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4OEi4aEhISEhYWEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAg4+XhoWGhYWFhYWGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+BlZaSj4iIh4eGh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qKnaekmIyJi4uIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e32Zp6SimI+Vi4iIiomIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fIGcoJ2dnI+GhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoOcm5yVhIOCg4OEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYmbm5eFgIGBgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp6e42alYWCgH9/f3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4+TkZqPfn5/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5gIyMjIuBf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5f4WAgIGBgoCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx8enp5eXl6gYKCgoWDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYGCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IlYODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4ODgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Bf317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9g4GAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXx+fn9/fn5+fn18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f4B+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+Af4WCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY6Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt8fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISEgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4KDgX9/gYGBgoGBgYGAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx9fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3p2enh5e3t8fX17fH19fX1+f4CBgICAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4ODhIGEg4CDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foWEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnVmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnx8fH1/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4mGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiFhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOEhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fX9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiImIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWFhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhIOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIB/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOFgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAg4WEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CHhISEhISEhISEhISEiGdAREREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiioaHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Oz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztLSz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9KnntDP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9aznqOm1rCgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7QnZqTncCemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5q0wJihnLSYnKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbaZlq25hp6WsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Pz9WlmbatmIGglnibhJ6To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm2rpuoiJx5n6mFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatre1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTGo5eXnaWnlpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZux2J+rpJvQn6ukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCw9XFkI2318KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TR1MfD1dHVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE9Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZlqa5n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCjpqGioaKhoJ6cm5ubmaOmkZybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgprGuoKCfn56cmZmamp2tYXmdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgn6aSla2foKCem5qZmpmre0OBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6foWGWqJ6enJqam5ukn01JhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmadsWqCgm5qam52cr25LTIahnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilhFR0opqZmp2boaFgWE6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoItdYJGamZudnKOOZVpMgKKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ6ZXl9zlZqcnZ2hgGVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYm2FiYHyUnpyelnNjVU+BoZ6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmKBqXFphe5ucnolpXlBUiJ6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSeHNrWHyVmJ6KW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOlZ+fkoCkp5mmmnlVT2SHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaSZi3pijqOSmHOFhWh1f4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foSih3ZqUHGbjYpXbnl7f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmHJOR0lzkoOASlxub3aJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPo4hMMzI7eYR1cj89VmptgZCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5tfRWROPXl3Z2RINTZUbnGPj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa6MS4K2hkB7e2hjUl9xUVtviqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidGjF0qhJgJWMfU9sintaYICjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinmKCuL+qha+jmp13R1eBclJzlKKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ5vgpSziLbWppy4sWJQtKNWZJChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6OjiXd/dXjTu6mTnqhsVaGqaF+Hp6CloqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbS2sqywrZCIf2yYx8SXnKqSdlppc3V1f5KlqaekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyt7u8vLq6wrm0s52EdF5RnbCvpKKRhHduc3F3eHl8gomOlJmgpaespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMPJ0NTRzMe8r6GMbWNSQ4ONfn6AeXVvbWRkaWdqcXJxcXFyeYmpx8e8oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMfb5OPXx7mtopSEb1dYUERhcmdrcmtoY2VYV1xXW2BoaWdkYGySusC/uamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+y8/Uy7mlmI+CblpQVEpDXGZdYWhkYWFpXFRYVVdYWVtYX32huLmrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJupd0X1JOT1JHPV5sYF9lY2FeZGNUVVdWVFVdf6eur6qoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubfEo2pMQ0VKRD1ZYWFkbGRhXGVfWVNQUFVhi7e5rK6lpKOnpKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGzkFZITUY7SVhfaG1oX1xfWVpUUF2Nqqy4tbKsqaOhramsp62frLS0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsijd2BIPz9BXl1ca2RbWFZSXYiour66vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcbGx8K1gV1UL1VZXWxfUU1XhLnKx8LExsC8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHCwsXGnE5SgImVVVSDtc7Sxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68xad8dICRlHW8zsfH0MCvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb6xc2GAkYmKz8S/wMm+sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjZ2pnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5trO2no10hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG7xseWQnzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mwvcPIjEZ2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/Av3dTb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbG5fY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysnBhnFzpczMy83KxsLDy87BvLi9urBvZGO7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAwMnKwb+7ubGgfnNsrcjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhyd3yXvb/GwLnAvL7FxL29uLGwmY9+gpzKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpTUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1wqWHaVpeYE1SW1puc3aBn7i4wrqzu7e7vb+6u7uvpJqXiJJ+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4iqCvtZ1qZWdWWWBJSU1QU2x2hqWwt765srWyu7m8trm+tJWcppehcq7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2Kl7ChpnOly8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05BP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQFyBr7WztbK0r6y7uri2ub/FdYGpnZpkp7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0BTo7mztLKwsa2wubi2u7e6vI+hsaukc6uwqautq6OooJ2enpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaE5AUnhwUElJS2ecgFlEUq67sayzr66srba2srS1rqimnpqbnZ+mqJ6gqKmfoaeWmpaXjp2TjpCWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvWhFUp2CUVdJSmBKVI1gY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJqVlouWkY2Pl5KYnaKqn5+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmt7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6BQQXOdd1BuS0tjZnRzX1pecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaXl5WPkZGRkpqXm6Ckqp6hoZ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5emBiU1ZhSElLS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXFFrY1tkX1xqj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KYmZeXmJSZmJadm5+lpamgpqSep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NbWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SMeVVpcnZ1cGN2dlhXY2BjZ1hXVmetrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemp6XmqKdpKCeo56kqKytqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqeHVebVtSYUlSVkhGVldKQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgo4BugnBgY1hMW1NaTUxQWFJHTExHmKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZmmn6CnpbCppq2iqq22sLWysK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdnp6anZuUk5WUnp6YlIWenaCZq6Orsa+5sbGwsbC6vby8uba4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMm/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qrqOerKi2sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIRUpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKael5yUkZqemZWMioaIhnhsiqWioqursry2w72+srvBw8LFv7/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iSjY+Xl5SPjZCMgoOCdnJwbXCHpayttLjEus3Hy77CzM3NzMfI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwrzDwb+/v7W+s62/wMPDx8XHxK+/ubK4vcTCwrq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkI+Mh4SEiIaDgIGBgHlxcm9reKK2u7m8ysHT0tLIzc7R09HR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXhxa2ViaHJwcnuFioB1cG1xcm+EnK28x9HR19bV0dbN1NbW09PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKyMDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBubHBvdYB3mLjV19bX1tPXz9XU2dTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0tHSyMzNwMvNxtTPzM7JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym5yTfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucHR5dml8qc3U2NjY0cXT0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOztDM0M7OzM/PyMzQ0cvOy8PJx8rNy8zS087T0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucnJ0dXpxYm2ex9XU0KTKz87Tys3OxM3K0tLOxs7MzdTLztLNytbW0MzR1MvM0NHTys7R1dLV1srAysHGzcPIysPNxMbJy8vPy87N0M7UzMbJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFyb2txeXRlbp/PzZuX1snDyMjFxr7Cxc7Ox8XGzcrRyMvNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcrM0MjFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBubmlqbW56Z1WAwKJ5u8/DuL/Curq6uL3IxcHDwMPHysjIycfAxcvGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdETERGUkA1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXmBbWVpcYm5xbmpoaW5tc3lWapR7q8PFwK61uLCxsrCwwbu7u7m4wMHBxL69ub2/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBsZmVsbW97eF5mkse5v7esr66lqKyqpbeztbOys7S7tb2xt7C1rrK7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8vFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbWdlaGtsb35taLq4trOuqKulnKCnpZypqrGsqaups621sLKoraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxkbW5mZWZnaWtweom3r7Sso6KkpJieop6YmqOprKOnoauprKuwo6afqq20trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6uruyvL6/vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2ZrZWNlZGZobHGCpaSqopqZnqGRmqKYlY+foKeiop+lpaelrZ+cm6SmrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbOzsLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11eZGJhZGVlZGhqbIacp6Wilpedk5iflZOJm5+gpZuen6OloqedmqKbn6qvrbG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqagqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCyua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hY2NkZGVmZ2lxiZCCk6uXlpOXnZKTjZmfn6adm5ykpqGkm5+hm5iura2usqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnaamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dWZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYWNkYmJjY2NmaXNzR019kJCSk5qTlpGUnZufm5agoKijnp6onJuaq6eusKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyjoKCTlaGUlpacmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFhYmBhY2RrcmVnboiOj4+WlJiSkpidmp2Vn56mpaOmp5+dn6agqq+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfoqOdnpick4yglJGTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsXEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19eX2BdX19hY2mBj4WFi4mPjY6XkJGToZeelZuepKGspaSko6OinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwm5+in5+XmZOKnZGNkpSWkJiYk5yho5ykoKKVoKKkpZujq6WipKqkq62lrrKppqWmprSmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0lDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1xdXV1eXmFjbIiKfouBiouJlI+Qj5mZoZqan6eoqqirp6mmo5mlr6SVmaWvqaCcmZugn66ZnKqzn6amn6OjoZSUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWFlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVlZWVxcXF1eX2R6hnyEeYaLhY2Jk42Ul5+emZ6qqKaurKmwpKian6yglZWkqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0q66nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS01PUkdOS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWVhbW1xgaXp0eW+Ch4KLhZOHkZGVmJecp5qfqqamq52nmaClm5KPn6Oal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVldYWFdaXWFsbHBqfoJ9g3yNgYuHko6RnKCOmZyjoaOYpJehnJWNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVVRWWFpdaWZrZ3l/d3BMVm+NgJSEi5qWiZKQnpidlZSWlI+WioCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipq2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTU9SVFVYWWBqaGJ1fG9NQD5+lZCOe4aTi4OJjJqNlpSJkoeFlYZ5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuipp2foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVaboFucHhlZVlSjoiThnJ9hX97hIuTgZKZi497ho+AdX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl51gXl0YnOKlJeNjXpleH91d36IkHyDmJKAcYaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamkoZiZjoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWZwcGmFpanAfXJ3YXp3bXp3h495e4uFb2yMknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+lopmVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBsZWxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVtfpoZhmGZwd2N8bmx+eYqIdYGHhXRsmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5weXVqe2twgoCEgHqEhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2NqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfnp6dH1rdYaHe3yEg36LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpodmtSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYd6iHh6cHuOinl7iIZ+lod2oZmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhvWVtdaIuRhZN/goCDkJF9hYiQgJmUgaChmJSbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZmbHSamI2YkZGJjI2Yh5KPnYugn5GjqqWjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8gYKDdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop7coB8nZqapaSgmJ+WoZScnqedqKqfqKypqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3aUiaCkp7K8t6Otq6umqLOrr7Wxsa27sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+SoZ2inY+joauuq7K0oZSkqYiZiJKJlXl6foaAaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeAkp+DrKKxqbC/xsKpssW1q7K/sre9tb+0wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6ano6eaqa+ssbi3uKaataiMpI6Qkp+GeIGFd1tjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorGzwbS2wMvItbvEvbKzv7a3wbS/sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKWwqa29sLy6wcGrmLmnlK2Ol5epiH6DfmxYZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfYqCgYuDlX13enVlUFxkR0VLO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZOut7S5t8i+uLzJzLq7wLu3tbu6tr2zubHFYHWxpLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXNhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4qDh3uLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluTuL+4vbbFv7q4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLqYgHttX2FdWl9iWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYezq6Chn4uZnJmMjJWRmpGFiop+iIaMkIuIfIGDc3uKgoV7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVlaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7bGsLiyury0sMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooNwZV5fX1phWFpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uzpq+1qay7v7CqtKakuKarrqCrtKOOsK2al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cGdfZF9XYVNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmuAc3Jpb3F6eXF6vsuafouxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZKPiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXBlYmFZVVpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCclJ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtAi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4uOi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZl9bU1dSXFdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Cdi36HkoOJhoSJgYd8eIWWloiOg4eFhnqEeHF6e4OGdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKrCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+hrJuhmpifpZ6fq5mLmouQkY2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9ampdXFFUVGBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGLvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKScfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdi4uQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpIeLi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WbopudlJJ/jIh/mIeAm5Juh6iFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhaSGjJCzmJ2SlJehoZ6ZkpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIKEfn+SpqSfpaKXip2QlJeLiqiXcoqxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiY6UqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xvin55fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSRmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc4x5fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqZmYm5SVkZigl5m7u63KoWm2t6qwlZieo6uSl72kXqqzgomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mTnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mVoKKNlY2XmZ2TnJielKGglJydpa6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuKfoByhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKlpZOjua+owLusrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWRj5WXjpGgkIiUm6SslJaPlJyelKGem5ifoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+ws6eMorq6tcG7q6icsqSjqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlZeloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1d3tvXltebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB7jH93hoGCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtLypm6m8waO2tq+rk6+rqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5WUop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQUNLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlV56QnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qaWvvsSxvbizp6q0s62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52ZlKCioZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZjTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKustL7DucC4s6e4tLeyr5WkrbCvpIuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1NDQ6QjM0TldOPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnaCao6S1ybSpx7zDxMnLycjMzse+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7a+wcC+t7Kyw7C3vKyjrrWtuqWIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqUnKOfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJysqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKuqvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7afqZylo5qboJqnpbOhm52lnKiqnZiUj5Sbi5aJjKShlJyin6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZqqGeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKidqaycnKCbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCipqi9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytmpqdmKagvaGdpJirq6umoJmNmp+SnoiOWH+Wn6ahoLmqppSYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+foJiew6ekorOgnLKnkqmjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqaSnvbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmYl5KipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQEhHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utLGnqrqzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6uglpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsqWppaGem5malZeon56Zop+vs6KmjZivmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GZnpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCbn5GUppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVEA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGovKCpr6qisbeopLSxqqGttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLSywLrFtqu8r7G3rK2po7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmcqLapl5qTkp+ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6CelpaWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmqCkq7ajq6ikrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xtpmYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbSwtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpagsKexqayko66ttKi3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusbmVl6evrKiks6mUr7ukrLKypqejsrSwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2jrK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLS6rLSytKuzrKqrqKypua2ysMe/uKS5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mpoamvpKejs7OwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyraGjp66qqKWxo6qwqq6rsa6urKuzuqa3sLKpsqmqpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEe0Y/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKmxqaapsqa0raqvra2xrrKts7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRGJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJaRr6Siqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa6trKynt6qlrbCruK6osK+usau1qra1prS3rKykqaqcpJ6zs6iopLO0n7Wtoamoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjrK6ytK+qpK+pqLu/vMKyr7mtoravyMfI0cC/vbq8w727w8G/v6+xs7K2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuaq4rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6efq5mPsKKYoqCop56nm5ipsKmin6yhoZKhoqOnmJqopZiYmJyPi4eViHyNhoSFpJaGg4OMh5CQkoWHlaGWiZGekZOQjZGclZiPi4aGeHSBf310eHmAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5KeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4vsG9sKi5qqetsMnGyNDCvb+9ub+/vcm8wrixsLWxury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamjoK6bmrOilqWbpaSfpZqZqKqlnpqpoJuRmqCknZmXqamRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSblIaToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3Vwcn5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqOunp6sppifmqGim5+bmaOqopqao6OVlpOfoZaclqasi5+Rj5GMgouAgI+Be5qUjIl9f4yHkZCNioaTmJGHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcHN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfp6O3r62ir6+oq7jCurOtoLmvq6ezusfKx7+3wr2vtL63xLbCsrC5sbLAtru9t6q5uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJympqiam5ufopWcm5qdqaaWm56okZiSmJ2TmZahqpCaiY2Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhpb3BxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xLeyrqG4ra2rr7XFx8C3v8G5sLS9t7+7vrCsvrCzv7G8wripu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpecqqWon5ianaOTmpuanaWqmpubpZSUl5WcjpOXoqihkImKj4Z6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZGxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6t7qvrsCztLmvv8C3rL26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiSn6mioaGZm52fkZmblp+hqpuamKGUkZSWmY2Uk6SopJCJiY6GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dGhoamdncIdoaGljZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqOQjaSmmp2enaO0raequranrMTBt7Gso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t668u7Gln7aqpaWzp6mtnZzAq6ekr7KprLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyim5afnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnZOlnayhl5adk5ONlZeLj5ibqJ+RiImLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdHNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2urawuL2spp21qZ+fr6Oprpyhv6Cwo66wrreutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6p6iftaicnaigqKyap72YrKOur7W1ra2fsa2wqaKbnKOrqJyUnKaknZqpoqSWmp+bkJujqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Ko5mFlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6GpnrOqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZqbp6adk56fl5CdqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqaWgpyrnJiYnZ+pqaeqv8Ousbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqZ+xp5+iopmgoZqss5SjpKW1vKatp6uqrKimoaCYoKajmZmlo6SYnKSplpOinJOSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ6lrLKosMK9sbW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCraelnqOkqrG3rLS9v6+2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhnrSzoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZlqCfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFUNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Sen5+ulZ6ZlJWVl52roJmZpKi0r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqetsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjChnZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlqrCmopaTraClkpSgm6Smn5WapaahmqKfrJmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsX3BtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt764t7G0urSkt7Kfs6yfnqirnpSntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknqycoZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sLW+uLixsLW6qLq0n6+knaSnp52TqbCpr6m0q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6edl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11gcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJueu6GbssCurausp7ept6+1v7S6r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZScrKqXjJSlmKWsopGWqrKjn52mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6GdoqGbm5Cpo6qypLSlrKWelZmqmKasuJyirZeTn4+kn5KMnKKdl52akZWSr7myrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2ZwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaKhpZ6gnZmTq6OsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Byalpem4lgY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFpYZ2NfT1ttdWlxUlBERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqeco5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+sm6eep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKanOBdIN1ZXd9d2tvem1gY11waE1YWmZqYFdab3ltbWZUT0ZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJqrnaqfkJaWqJ2qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipaOm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXFNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSfqqSqlpaXmqadqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAh4Jud4J4gHNteYR0doiIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6ZoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ6inqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99lpiJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRjWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kcq6KkqKSktKOcopKmrau3s6euoZGRmZylkpCfoZibn52IpqykrK3AwLGhqa+pl5GfnaKZoaOqo5Ohop2erK+qraekpKehpqWdrKiRo5qoramanKibq6CVlqSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdJeTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gnqinoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn62lq7CowMezqKmxrpaSnZuil5+pqZ+VoZ+dna2vqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6hnoGlj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJuiYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52mo6+spKy1qrrOsq2mrqyXlZydopmerqycl6Canp+psqurq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUqyFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqiqKCfpZyxpaSosa23yLK1qqyplpGdnKKZn6WznZqhlJ2fp6ytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+Wlp+UgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGSmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKijoKqnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn5yek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpunpqGisK6cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKvpaeYr6S7rKG2ta2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ21mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2or6Smm62mvayUva+snqGvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfr7Cqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqWdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrK2kpZ+pqL6klsOsqaKgq7K4qaylnrKtp6iXda9+kIuchYd9uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmZfHqQn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipKm7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iJGWd2eIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7eqnsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKnmKmal6OqoZadpqansLusrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+VhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqkhImWj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xbu5q6Klnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWqJqompSmoaSQm6iZoba7qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltbywra2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqJmpjZmpj5+6t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcu7SooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo6CImH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZXRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjZC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGZsWGdHXVJNM0U0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcW1raVhpT11ZRjlBNUhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya21zcmZdaV5iTEU9RDZRQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tKytoJqinaSjpq6dnLKurJOYopqhpJmalJ6rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCWh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0NSbzVLW1pfTlpEQTI1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6xqa2el6SboaCZlpago5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+Pi3CSjICph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZGViUV9XXVRXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqiaooycrJycqpSirKSjqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG18cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B5e5dsnHx4l3NuqaRnYGV6cYCFbGhmZG52eGdgY1NcZlFRYkhYSlVhV1RbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqKmpiYk5mTkqGYjoeFe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhniBkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ2XqW16lYegm3SiiHegfpOXi4FwTWajknCah3Oke3l0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUE5sXmlca2lSamhpbGhsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5qXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppODmKqYjZKLgYl6gH2LeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dynneBipWXj7lukYqiYn2YoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmJOOmpCLmJCOinuHcYCIaYuLfJibc3WJfZB7ZIOHlYqKlZmCfIiHl6iRgaOskIaRi4KKfoCAjnNpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+XnqV2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4KGhYaTlZyffKV6cqiVoJZmnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibWp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjJqPhpyRhZKNjI10h3uIhG+NhX6Yk3R0hnKRgm1/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weHlsa3Zma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coRwlYV7fZKLhoaPhHl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoOIjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4F2dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH97dXB0ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4eTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4aGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHV8fHNvcGRrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eXt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZSDe46ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4eroIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZxdWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeDeneJjoORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2eX9xbG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBoe2p1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqJ2AcIyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCamJKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXOCcHdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcYGGe3xwd3qKg3l5j4yClKSSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiOl6GcfnCMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6Ol5eNlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfW57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hXt6cX13iIR5g4+IipehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg390fIOMgYB9eoKDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh36EhnV9fot/fZiGl5WYjaSimX9yh3uTkYmmj4yOipOgkYOSkJWXkYuBj5ifmpGQkHN/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnouGgZGcf5KSlYaZiHuKioF5cXlrdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eDeIZ8dXd/fIR/e4KLg4uTo494g4F0iYd9gHR2gomFcGF8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lrYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+jqJ2KipKFip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYZ/g4Nze4CHeo+SiZOSnZOmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2a3BudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhGVoeXV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6YopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi4yNjJyJjpCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYKHjZqihnuDdYKLf3d5bmyBhYNec3VzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgcG9rcW1ZWWJhYm5YUVRaZmdjdXCEgmJda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHh1gIuAeYV/eIeGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauUh4N4f3dyg3qDoIKTgpWUmZyTm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJuPj4yMj4x3e5GQeo6LjJGWjHyIfIBrdmpua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt9h4V6k49weYNvdot5iIp5iHyBi4+dnYR7enaCi3x3cWpsgoR7YHhxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dX6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfW9va3pgam51f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmYeAjJ+Ai5qUj4WImI+Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2Iko2Im3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx/bHtlc3BrbHp6W4F5kJCBen5/gIaOe3pocmpzio6JgYSEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBwY2B3YGBWa19edlBOTGFnYl16cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGKiZZ+h3p1f4l4h4SOnJqYmI6Pdol0bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh1am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYGCfouVhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBybltjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uQi4WPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGiY2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2cml0d2xajX2Tg4V9gISBhIqCdmFya4iAjomBfn6RkH1tgWt3hI2EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeoZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiXygf4SZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh0goV0gn+JkZydhpSPn36IYn+Th4WIhIqNgICDZ3yQgH5/goyPkH5tg3yCdGttd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnNiW2dfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdImFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoOJiXKBfWd9i3t5f3+Hi499aYB8g3Zmb3l4c3d0bGuPhouCi395g4GEhIBrXnB3en2Lh4R7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWRhXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCfm5+gnWCd4Sal5KKk4+UhYdwepKEfoODiYNvgXhogIV4cn9/g4qHfGV8foN2Y3BzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWNgoNxg3d/mIuNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdmXWZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnR/fW9yfHuUcG+Af3lmkomCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1gYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Uj41/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaX9+eG18e4GKg3hieYSCcWRxaH5udXJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praHB4fY5taoGEf3lugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35qdHxyhntzd31/jHp4hH58a4yMg5udloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6fnNndYh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmIiLhIl8j4lyfH6FfGl+bWuAe3lqenaCh4ByYHeBfnFkcmd1gm51e4aVkoJ9goBwd3p8dX5tV219dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLc3lqWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGiEiX18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKNh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSPiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4h31qanRoe4BqdoGNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHtzjYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh0bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4eFhXt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d6cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1d1lRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI50a46MdX92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfoWAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR5dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY214cWpscXd9fHldZXmAd2l1eGaCd2h1h4yOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweXOFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnNSUlVXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3aGeW6VinR/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+f32Hf3x4dnl2kZOffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hyd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHhlcn1uhHRmdYaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anl6gHh2b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXZsTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlYFyj4JxhYJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISFeIGFend0dW5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yHhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yVgm+Ma217gXFmc2Vga3hmcXWJen1hdYN1aWtxdHlveHdye2V9fX53dW5iZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ1ZUpPU1hha3d+Zl1nc2llX1djV2JxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgHqLdXSQgH2BlI6AhYR9foyGen6BdnujpYp5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnZ1bnpoanlqX2VuaIF3kIRoZVhhdml9hnluaW9mZ11VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hYOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNydGpvgH55d2F3hYR4kIZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVZZWx4e2ZfbXBqY11WYFVvbldKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kGxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6Z2l3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYN9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt+dXVidYaMe4iIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHBZS0xYWGhsdnplZG1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmNef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1+hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZoWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboV5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KAeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR1ZXODk3+Ig4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlRtVUpMWldpbHJ7ZGxsc2JhWVpbYXZcVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJud3ltb2p2gZB4bYN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmienuAiZV5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdgbHZkanVqal9bbnRybXR0dWuGfX+AfXdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJveHRzdGlxgpWDh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWa1FJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYl2MamNlbXp5bG5pdnmGemuEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiClIWBn4l1gX+BdH+CcIeDdm+il3N7houHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdla1NeXFZoYmxsW1xxjWROb21cVldVZ2l0aGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRwdXZsbYWUgol8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYF9ej25hZ2t5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2tmeGVlXVpydm5ze3lzbol7gHece3prYWVsbV5gbmplcHl+Z1pWWF9seHt6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3yBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2bGiGjH+Je4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5wY2hqd3JzbWh2dHmCc4KDeoiOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5KOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeGiYaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiLhoWEhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuEh4SGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5KSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZGRkZKTkpKSk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPkpGRkpKThoWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYKAkpCRko11h5GQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCCkI+Qe3WIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc26Jj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIx2bXqPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtbYJ5dHWAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0YV5kX2JqcGZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGFfbWxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bGJvc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01banJrX2x0c2dRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxjbmtaaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0VJVmJma3Fwbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2hncW5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD1IWVxbXmZsbmtvbW1sa2lpamJRR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Slpobm5wam5ta2psbGRPR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUVgbnNubmxsbGZRQj9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxIXHR1cWVQPjo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpBanxpPTk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/QEFBW2M8PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PlZqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp7e35/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJRkdHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hIRkZERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1S0pGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9oQ0E9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlgQzc1NTU3NjY2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4mKiodmSTU5QDU4ODc0NTc4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qKjINlUFpDOjw9Pjk5Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRISU1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiouLjH1qUz1CREVFQkFAQj9AQ0FAPj0+PkA/Pz9APj89PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLi4yKi3RFQ0dKTEpKR0dIRUZIR0VCQUBDRURDQUJCQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIuLiVpKUE5OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2MjIuMgWxtVU5NT0xKTEpJSkhKRkRHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4uOfWBYUE9OTUxNSkhIRUlJRUtJR0pKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMi4uKX1RUUk9PTktKR0ZCR0pHTEtGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WlhUVFZUT01LSkRFR0xPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxpWVhrYkZUUVFQSjs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dtXGVWOllZWFNRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BZW1xbUlRSVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxdUVZYVVJVU1FRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVdKTE5PS05LSUpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0JARFBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCCgYJrTUc/QDs7Pj8/Pz8+a1BKYEVGSElFQj9HTE5HTVJVSUJFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1JZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQU1NPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTk1OTUtMS0tOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUdDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRGSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQj0/PkFCRkNFQ0NJRENFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUVJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5LTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFSExKR01NTktNTkdMTUlMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tPU1NOUE9OTk5OR0tGYEVEX0xFZmRFTltJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITFBbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FNT09NUVROT1FPS0tOR01PUltaU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU01NSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBLSlFRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVFpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVVNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZaWFxdW1tdVlNNVFVVXFxWUlRWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxWVVteXF5gYV5kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1hXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xbW1pcWVpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7ent7e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJioJFPj8/Pz87m8O+v76+vcrU0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzL2eXl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKDhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19fH17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX18fX14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9e3x9fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFuf4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIiIcHFxcHSagG5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfKKEcHJwjp58bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1nqN4cHignH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZFvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3Nzc3NzcpOqpXyKoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHh5obOpp6mql317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvoqG1qaukf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maSWobGfmKaVfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcm4yfsKGgop6AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJewoJiUnIZ8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6Aoayll6KanJmioYiAfn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChISIkKKypqChmZ2dpqesqaGbkoeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tr6SamqCbnZydnaCkopyTh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDiZWYlpWYn5udnp2amZePiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYWNlJOWmZydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OHj5WNlJiQhoOChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCGmYiMhoKCgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+CiY6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgoGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDg4SDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDhISEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhISEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+AiYWGiIiIh4eGhoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3uChoeJioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3uLjIiLiouKiYiIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXkIiMjoeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoSak5aKg4OBgoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoidjYOCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIGDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp7e4qFgoB/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf35+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4OEg36Af35+fX9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5fpaTg3+Af39+f39+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6enl5gouEgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX18enp5eXl6gIKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh9goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYWEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODg4KBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/f4B9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fIqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31+fn9/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fH17e3t8e3x8fH18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYGAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEg4CDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3yAfnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4SDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoWFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQT03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNT0io2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEiGdAREREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDg8Oj07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19bW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9O4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9Wyl5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7UnKOostGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx1cOGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdTWo5i01NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9SkmbHU1aKZtNTVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDUpJmy1dWimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aSas9XVopq21M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWkmrPV1qOattfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5ux1teim7TasqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9PVsYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TS0tDD1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDs5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojk7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6ubq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ioqaqnpaSjoqKio6KgoqKhoaGgoKGhoqOko6OlpaaosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpqWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKCgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoZ+XkZCQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+dnJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY2ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKPjpabmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuYlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuUmaqcm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZmq2qnpmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCisKehoqKioJ6cm5ubmq55epubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpKWtp5+goJ6cmZmamaaTS4GdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6OieaqkoKCem5qam52oWkmEn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqSkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eqG1vq6KfnJqanJysgktPh5+enpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmqSIVISom5qZm5yeqmRUUYignZ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5yampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmgk2Jim52Ym52bopZmXVGHoZ2dnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZnJllY32cmJudnKSHZ1xRgqKdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqkaGdmiJecnJ6ceWZaVIOinp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn25lYmyGnZ2fkG9jVleHoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ95c3JeeJmcoY5hWVNajp2bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSm5+UeZqooaqUfGJSYJCSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOoJ+OfWKJqZiaboOHa3CIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/jKiNeGlScJ2PjFZteXuCfn+CkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpCgek9DSXaUg4NJV29zd4J7ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCglFM0NDt5hXVyQzhOa2+Ah4qOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPoW5GZFU/enpnZEw8OU1udY2KiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuipJhRdLCRSHuHeG1SaX9ZV3GIkIyYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqayEX7/YrEaSo5qQXWuCe15eg6KhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6imb3q9wKqazKies5pIVoRwUnifqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKinmp2kpaOionKBma6Oyc6ynrCyblO+oFRslKOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKCNfYV7htC9mJeonHJSmqxnY46jnaCgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqCiqKqusbKuq6SpmIh7ap29w6uunol2ZHB4enaHo6Sno6GdoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e2tLO2srCyp4l1Xk6Wn5CPjYB7c3BzcXh8foWSnaGko6Kkm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuytru+v8C/xb+1q5NwZlhHd4BzdXpxbmloYmJpaW92d3h9g42Yo6ispqSZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1usjS2dzVx7qtn5B4XFtPRV5rZWpwaGRiZ1lXXVleZm5ubW1sboGoyMa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMXZ4t/PvbConI14YlVXTUVebGFjamVhYmldVVxXWVpeY2FcY4CpxcC9uKmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca8x8fO0MSrjXtvXFNUVktAXmxlZm5lYl5mYVVYWlhWV1dig6W2u7mrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TCxsnJwKSIWkxISk5IPlpgYmxxaGFfZVxYVVNUUVaAtsOvrKqqqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMfGxMTDuLPBuqB3TEpRST1NVGJqaW5jX19aXFVTWn+arbe0q66lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmZyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb27vpFlVktCSj1eVlhrZ1taWVhWcJCwsau4tbOsqaOhramsp62grLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jIv8bGtqBsS1lBUnJ7gFpSUFNrn77Aur27vLq8rK2mqbu6ubfAs7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcTJwKqNeG+MmZ1TT3GfwtLHxMHEx8G8vrSxsLDCvr7BxsC/uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandsaWZ1b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMLOvHNqhZmXWpHLy83Pxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZmNrZGJrbW9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wsGZgI6ZiH/Sy8TI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLu/wLy7xL26wMS/vb22vsiklGaPzcS/wMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbq/u8O1use3trm7vLi5tbrEyaZCi8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHipzL3Ht7m4rba0t7mztbK6xcqaRoDKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1650gbvIz8LAuK61tbu9t7mxvsPHjkx7zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcXSu0dHMysS1ur/EyL6+tL7AwHtZc8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnJ0pszMy83KxsLDy87BvLi8urFyaWa7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsPApXl2eZzExsvIwcPAwMnKwb+7ubGhgXhxrsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvat9bmhubXKBlZhzeH2Yvb/GwLnAvL7FxL29uLGvnJWDiJzKwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1tudHeCobi4wrqzu7e7vb+6u7uuo56djpl/v8TDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZmdWWWBJSU1QVGx3h6awt765srWyvLm8trm+tZWgq52odK7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZuVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHaMoZhgVENYVUdhalZPRUphjqGsr7a6tbSyrLy5uLW4wb2LmrOmqnSmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BP0pDQUpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBvT0o/ZFlCTneAlGpOQVyCsLWztbK0r6y7uri2ub/GdoSsoJxlqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVV5cUE5IREdNQkdORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BY0FTo7mztLKwsa2wubi2u7e7vJCisaukc6ywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJU0VOQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2ecgFpFU6+7sayzr66srba2srS1rqmmnpqbnZ+mqJ6gqKmfoaeWm5aXjp2Tj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmx7ZGlWUmROSkhHT1NOS05IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFtgcZCxr66ztaqmrKyjm5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGSk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yXFFrY1tlYF5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmXFNaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhYY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqayppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVebVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTUxQWFJITU1HmKyqqaWgn5qSkZSYmJaWloyIi46VnZ2dnJ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW5cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnp2KYldeZWBXTVFHPT9AQ0M/PkJReKmtqaqmn56foqOdnp2anZuUk5WUnp6YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRR0U8Qz5GPD45Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdPRT5JWnxvYkI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZ15aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREE/S4aepZmEoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0srS1dbZ1tjT1tjN0srP0czP0czT0MDJyMvEzM3Mz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxKS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsTJx8/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1c3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMnBycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0pGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeYF9eXGJtcm9vc3R1dnmkv8zV0dbT09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLJysPNxMbJy8vPys7N0M7UzMbJ0M3Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtqqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0Q/OzY4Ojg6OzU3PT1AOzo8PTk8PTk9PTo+Ojw3Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfYGBhYV9fXVtdZ3JycHJzcG1yeaXH087M0M/T1MnEyMjFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jKzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7q9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zYFteXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHLwsLPy83Eur/Duru6ub7IxsLDwMPIysnIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1tbXWBgYmRkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/Iu5jAzMDGwbC2ubGxs7Gwwbu7vLq4wcHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzs3BxcO/vbK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5m46fxMO6wLitsLCmqa2rpbeztbSzs7S7tr2yt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8zFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2xwbmlmam1uc3uKv7+4uLSvqqumnaGopp2pqrGtqqyptK22sLOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8yLnDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BHQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25yhK25sLWtpKOlpZmfo5+YmqSqraSooquqrKuwo6afqq21trG9uK+3r6iuuLS0vLizvLC4ubayvMGywa+mqaOrsbO0qL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+v8W/tcLBx8i3v8DFt8TDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWro5yan6OTm6OZlo+goaijo5+lpaemrqCdm6SmrLKwt7ensKyoqrSrtLqxtrautrqzsLu6sbeloKSgp7GorKm6qqWmp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsrm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ2Tk5eelJmglpSLnKChppyfn6Olo6eem6Kcn6uwrbG1pKmqqqyspbS4rbewrLO1r7O2r7Gqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqusrbCzua+4ubqwtry7uqyzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy1t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKeakJGRmJSYnpOUjpqgoKeem52lpqKlm5+hmpmvrq6vsqGlo66rqKK1sLKyrKmws6i7s6e2oaOfnKOirqOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+qsLKys7ezrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWlZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscO1tr2ttLnBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmZCQjZGTlJyUl5KVnpygnJahoamjnp6onJqaq6evsKuco6S4qqGgr6i3q6enrrGkuLCkt6CjnJmZq6ahmq25sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrG0sLy0urivo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJKOkYmOkJGXlZmTlJmem56VoJ+mpaOmp5+cn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWfoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqmusK+rqKqqs6amq6+0sa68trGwr6CTe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurK5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJVYGFfYGFfYGBiZGl+jo6GjYuQjpCZkZOVopiflpygpaGspaSko6SjnaurpZqfpbGqoaGepaqeqKKfrqyqqa6toqKilZiim5yQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoKKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq2wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl5fX2JkbYmLf42Ci42LlpCRkJuaoZuboKipq6isp6mmpJmlr6SVmaWvqaCcmZugn66anKuzoKamn6KkoZSUm5aWkqmqrZudn6Ghm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJGWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR7iH2GeoiMho+KlI+Vl6Cfmp+rqaavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOS01PUkhOS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1hanx2e3GEiYONhpWIkpKWmpidqJugq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxre6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFqbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFubnJsgIR/hX2Pgo2IkpCSnaGOmp2joqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnY2CiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG9jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWhtaHuBeXFNVnCOgZWFjJuXipORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOWjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBramR2fnFOQT9/lZGQfIeUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+UeHZ2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiVhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNUklMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0VEQ0lOT2hZT1FTVFVaboFwc3pnZlpTj4mUh3N+hoB8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp7aXZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51gnp2ZHSLlZiNjntmeYB2eH+IkHyDmJKAcYePfHd7b2t+rX10kIt/eoaSgX1/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVvcGqGparAfnN4Ynt3bnt4h495e4uGb22Mknl0eWpqgIJxlpGMgX2VgEqTmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYd7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpa2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtfpodhmWdyeGR9b2x/eYqIdYGHhXRsmpJ0dHxqap2OTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY98dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIiMhnpwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9wenZrfGxxgoGEgHqEhYV5cqCVdHiAc3WUhzVxnaidjqGhhKOFdnCHfId8dIyujYmBaGdiam5ybXCDdWlwWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUVNES4V0f3t7dX5sdoeHe3yEg36LfXWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hHpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygmJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjXiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfX2Bf3CBfnpodmxSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktogod6iXl7cXyPi3l8iIZ+lod2oZqIh4+SlKWNralIhq6vrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4iEi3mVnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXltjZFhnZVxUUFBWWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMzMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFlvWVxeaYyShpSAg4GEkZJ+hYiRgZqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY6UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxudnVmf5SOh4iJh4iHoauilomOl396gYh5eXBna3h/fH91bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSUlMTEtOVmBjf2ZnbXSbmY6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkYeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F8npybp6WhmaCWopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF+c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4eJgYCHdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiaGlqLO8t6Suq6umqLSrsLaysa27sbO+nLPDq7rJyrfDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoOFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraKxqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisayxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1tjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU08Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUxLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7GzwbW3wczItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+t7q3uayssKWwqa29sLy6wcGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu8wbu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9SkE9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg42Win6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0lGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTlBKS1BLU1FITEFKRkpPX15iZ2lhl7fHsLmyur21scTGta+4sbC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPL0NTVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQiHyEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CqtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNPU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomIkYZ/gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOloZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuJfoN4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Szn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLR0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOgoeFhnqEeXF7e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ+hrJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg3RUI3NTU0NzkvNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlve3uGgXR6kp6OoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcmJ+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hipGLvKGYlJiZnKmmpq6fqLa/wMC5x8rOzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxFTkM7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5OekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6dmpKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouAppmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcopudlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqdlpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehop+ZkpydqLK5rKa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUxNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Rg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIOFfn+SpqSfpqKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmbj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjn18bX2IeHp+eoGBgn52doCCe2xvi355fHd4fISHi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m5q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJOYlIyKk5OGlJiGhJGQnHSRmbKVlqShiJyak4+KkIqXmomLlo2GfYyZnoqQj5yamZOZmKCVoZ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYF9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramzva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqYm5SVkZigl5m7u63KoWm2t6qwlZieoquSl72kXqmygomKjJSHkXyPjn2Dho6QlJSIh5KWi4+VjYuNlpmTnZq0lpWrnouclJKNkJKLmJuKkp2Pi4mVoKGNlY2XmZ2TnJmelaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDL06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqDfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqaioqSjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY55gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4/R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6ro6OeqKyvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkoJqgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762z7LFvsO8s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcoB7jX93hoGCkHqNoZaompqYu77JyMrC0snKws28wbOtvL+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqqp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu73Bua3CwsK/mXB7Y1tYXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tL3Lu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqaeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhFREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnKuruaupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCvpYuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKehmbSpqrO9vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJOFoIiEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnBwc21yLvBubW6sa+vsrSnpJyqtLWrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrWtuqWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkZ2DbXWTopqVnaOfkK6yo6uVqaqYq6+lpaGlqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66ZlJ6Lk6qbkZKTiaqNhqGejKOslKSktse9tMG7wsLHycXCzsjCvbmyr7m1wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKuqvryorby0uL7GvLa1uMCwvcCzqbW2q7+lj6OXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyin6G1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUZITlFJTURGRkJRS0hBREdBVlJESDxBR1ExO0E3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wnl6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwry/uMDCwMjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pq2+sLe3xra0ubi+sr/BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGplXGJeUEpIS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopukm57FrKGfrJ2crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLa/wbvJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSprbCipqi9taayvLe2tcOys7e6vrPEwLi4rrS0tKOdpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsO+x8S9xMq9sLC2rrG1sMDFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6xqqSnvbemt7u9r7fDrbOzwr+yx7O6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6qxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtcDEvsrFtsDJwrWrtamxuazAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7myuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJSTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemZqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCptaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWo6CXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeppbSyq6Gttb2vs7i9u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2wsbWssLWxwLrFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHl5iMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEtLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbmytayquri7ur61q6+xt5mYqKurq5yuq4+rvp6rr7Gjqp+xrbKurrayuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsayqtaSusLSvo5mdraebl52Zmay4opeTkY+ZnKGYmJStoZ+WgpWZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG55b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaU1NTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAvrSzt8TAzMe8xL23v8DAuMC9sr2uqLq5uLfCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVj4+MmJ2imJGYqKSgmIWTl5GdnJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVWldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKq5sba3wLyvrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2ysMe/uKS5sKmtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mOiJGjoJaOlZ+ilpWGkJWUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2RuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK20wsPRxMW/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qp6Wxo6uxqq6rsa6urKuyuqe3sbKpsqmqpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLawsaCpop+qrbCsnZ6mp6mao5eYkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZesp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CsssTEzs7Dv7+0wcTEusG0ycSsr7eus7rAvrSurqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG2rKyipaOaqauuqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQk42Fjpmlm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJeRr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG1srS8wb6zsa+trKyot6qmrbCruK6osbCusau1qrW2p7W3q6ykqaqcpJ6zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKkl6Wmp6qcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uQkJKOhYiWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+fpaqsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0cC/vbq8w727w8G/v6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq21sa+xuaq4rqqvt6uqnqqroKOhta2poZ+vsqG1qp6op6qjqqGhrK2ova+rrq2hp6efq5mPr6KYoqCopp6nm5ipsKmin6yioZKhoqOnmJqopZiYmJ2Pi4eUiHyNhoSFpJaGg4KMh5CPkoWHlaGWiZKdkZOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46wnqSlqqKlo6ymtLOxqaSwp6q4vsG8sKi5qqeusMnHyNHCvcC+ub+/vcm8wrixsLWyury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbaqrZypr6SfpayrqJydqrKktKmaqqeppKmdo6moqb2rs7CunamjoK6bmrKilqSbpaSfpZqZp6qlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V9j4J/iJ6Ph4B+jIiSkJGFgpSblIaToo2TkYuRmpKVh4p/gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltnWkZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6Sr5ifnqmko6GqpLeysaSpsaetucG9tbCkuayoqLDDycnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgr7S2qayerbGjnKWnqaOdnKSvpq+hn6upp6KqnKOpoK27p66xrqGqoqOunp6sppefmqGim5+amaKqopqao6OVlpOfoZaclqWsi5+Rj5GMgop/f4+AepqUjIl9f4yHkZCNioaTmJGHlKOKkZGHkJmQk4GIfXlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6uYn5eno6Gfp6O3r66ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbCsrC6sbLAtru+t6q5uL2qpLSmqKqvrbmwqJi4vKOtvrSzoa64taemqLCzoJ6kpaihpJmerKionqCqr6egppeiqKCwuJ+jsa+hq6GspJympqmampufopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Qh32HfoKNfHuhjI2IeYSNhouOjYaJk5qOiZWfiZCVg4yWjZF9hXx0cHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7S0qam6xbezrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzsKWYu7akq7q1rp6xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTpKSit7ChprGrn6yjr5ecqqWon5ianaOTmpuZnKWqmpubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYuOln+Gl4yPeYF7cHJ2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUnKqcpKGioLeqrqC7uKWsvcW0sa+jtbCsrK61w8O8s7+6t7Gzubi6t7qvrsCztLmwv8C4rb26taWisqmnqbGrrbGgmb+1pKe1taiesrypqKWpsKyZo6ecpKWUmKGxpZmfo6ipnKKfk6WgpLiopKeupp6loaiSn6iioaGZm52fkZqblp+hqpuamKCUkJOWmY2Uk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYqShZaTk4uQlpSNjZR8g5eOi3d+fGx0cmxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0raequranrMTBt7Gso7aup66utr++vLLBt7Cusra2uLa2raq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAq6elr7KprLW7nqipq7GlmJ6pnaakkZmmrKKYnqSpoZuhnJafnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnJOlnayhl5aclJKNlZeLj5ibqZ+RiImLiHiFdoGCgZ2HioKJfX+FiIeGkYSWlJCOkJGRkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1tfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqLi7urmtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qZ+fr6OprpyiwKCxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkJaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGZaSUZMTU9ZUVBWYWWBVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GaqbGvn7m/taC0wru9urGmtq+oraS2t7a2rLyvrKqrtqqzuK6ms7Wyrqmwtraxs7W6pqmftaicnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekImXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIU2FwdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Ogm6qtqqO9xa+puMK4vbytp7awpaujtrKxsrC5rammrLSmr7Wjqbi2tqinrLayrrSts6Gpn7OqnqCjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6adk5+fmJCeqKmktrCko6KdlpiXl6OIoI6SmYagh5OcoH+kf6WqnpKSmpKIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhpcXCIWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ousbq9t8C+qqW3sKmspbK0rq+ytqqppbCtpbSznK21trWmp6izsK2yp66dqp+xp5+iopmhoZqts5SjpaW1vaasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJSTo6SmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdbUUFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKosMK9sbW/tbe+waqns6ysqaeus6mvtbOmp6a0pae4r5yzsrarpaSnsa6usKaqnaejsKKhn52Wmp6crauTnqKftLqiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnqOkqrG3rLS9v6+2xLK3usGmqbCrrqipr66jsLquo6StsqOouKies7Owo6Wgqq2vrK+mp5+joa+bopqWlZaamqyllpuhn7Szoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqGvqaezrKm7tsKwu8KtuLa/qqytra2mrbGpoK68qqCntKyjq7WkprKzp6Sinqeqsqiwp6Wen5+tlZ+YlJWVl52roJmZpKi0rqKpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqmbppmcnKKgl5ORk5Odg9WTmblwsMF+xoZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKimtKqltKmkvLfBsLnAsbW0urO1p7GvorCypp+ttqiap7mto6+xoLO0saGknp+nqbCotKikm52dqZWYl5WXlZagqJyZlqetsKmjn4+toqiWnpeboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5yfoZiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsKyjq7ytprSmp7a7vLK6v7e2s7m5sqS0s6CxsaKeq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaadlZOXmJKSoaaflZKlqrCmopaTraClkpSgm6Smn5WbpqahmqKfrZmgnp6QlZuhnZymlZ2WmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhZqadq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZNLmZkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwl7TCraizqKmyurezuL65t7G0u7Wkt7Kfs6yfnqisn5SntauosLGrrbSkm6mgn6ihtaamqaKZnZSjoZOSm5iRlKGkmpKQpq2vpqGVmamfoo6RoZmopaGVmaWpnZyknqydoZ2gjZOemp2hmJmblpeioJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9ydF9LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLq0n6+knaSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5eeno+Mi6iwr6edl5uopp+MkqOXqKunlZepp56eoKOtpKGeoo2UoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCvrausp7ept6+1wLS7r663tqrAtaipoJqlo6Gckaqpp7WjsqiuqqCXnKegpau5naOtm5aZjqSilYydoJuYnJ+Rk5SqtrComZScrKmXjJOlmaWto5GWqrKkn56mq7GZoaOQmaKWoJuWnJehk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWkRBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsK2qq6uxp7ivtsSwubCsua6twLGro6Keo6Gbm5CppKqyo7SmraWflpqqmaesuZ2jrZiUoJCln5KMnKKdmJ2akZWSr7myrJWXo6enlJCWpJykrZ6RoKirn5ufqKOzn6OljqihlKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZl6gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+NzA3TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0w7Ssq6isq6m6rrDFrrSxrLamtLisqaGhpZ6gnZmTq6StqaW0p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblqmlpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2FzalpdmolhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydXh9fmJbd3SBaFBcboN9fItrWGt7gnJKSm+GcE50TUVYXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq1o6ylrqentbGsyKuvsamzor2xsaagoqicopuZmaymr6OjtKmlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnpGQmJywsr+sm6eep6KJk5GpmqijmpqsoKOZm6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqMhZeVjoqMmJaHlJWKhJOUkYmOkpSYlJiWmqChmpyUoJ2NgnqlhmxqfJF8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKytqCqprKnpbC0qsiqrK+ktKXAp7OgnaSknKOVlaCqp6yjorarn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEsJqrnaufkJeWqJ2qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCYl4mDj56IeoSQh4aakoiGipaPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXqIcmlzf3t2g4eCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rKuusrGgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6O0yLSfqqSrlpaXmqadqZqeo6yUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saI2YkaN3a2qLmaOemXNsbnqDjYd6WGVehoNebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIj4N8a4dZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8ua+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pq6jjo6aoZmTkpqfmZmklXulraKotMS4paKnr5+elJ6inqOboqmpkp+hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH5spbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpGfoJibn52Hpqykq63AwLGhqa+pl5GfnaKaoaOqo5Ogop6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYKtWqPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hpGRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKsrKqiqqevqaCnm5mll5yir5+gnqino6ahn7Csmp2Vp66ssKqorJ+UkpufpJOPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2vqayqnaiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+q4eGn3aZknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKijn52wrJealqmnrqyop6iel5Sao6GSlKCtm52moq+spKy1qrnNsq2mrqyXlZydopieraydl6CZnp+psqurq5ysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoGWh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKajkJqiqJ+gpZywpqSosay2yLK1qqyplpGdnKGYn6SznZqhlJ2fp6ytpbCbraqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjoK6rnaagrJqeqaWdp7afopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOys6qtqJOJl52lmqGjrqWXoZWZnKWmrZyxnq+pp56so7esobG4r52arqaysrKjk5anopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhqCErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmaqllKK1oqKVl6GptLikm6Kdo5KPobGZnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56YmpqmpKubsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+jnIWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYuWkJttcbJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqChtqejqaexo5Sso46lraOdkJqaqrOzpJyknKmRlJeun5+epqOcp5y1maKqpLarw7Cpq6mhjISOnKKgpqOVmpqcmZuZp6Woma2pr6Olm62mvayUvbCsnqGvsrmqsqWaqLCip5d5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4naCSipSSgXqvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY18fISYgGtuf2N/dG6AemFnZnFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbOfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklombkK6wrKaeppusl5ePrKGgnaWhmaScrpihqKe3qcGvpamknouAjpuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZGFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt+tV2khGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmYfHqQnn9ldX9jhXh0gHxiamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnbOzqZ+joJ61maC0qKqsnq+tnqybla+ooo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKqs6m9r6Sonp2PfYublqGgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRso4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK6quq2oo5qXk3yHmZGmm5KPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iZGWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlZV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTKv7eqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLusrJqbk5J7hJaNpZiNkZGZlI6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY6VhoGlm5iWjouUlIuQhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+dlaKXmpmkhImWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6isKOtn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6iZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qenp2clqudk5mhm5SQlquajpmZlpCWn5KJoZ6VlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaejk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566t6SlmZuNiHmBlIybk4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiol21/oqiKZZymnZKYmJaMkpyShp6akJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGzp5urp6yXdIydsKCoq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2PiKabqZGXpImcu7SooJmYi4l1d5ONlpOKk5GRlIyQlKGPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoZialZiWgpGXl4WbmWN6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo5+ImH+UjIWFmmuOjoZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNikhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isn6iwpqappZmUr8i/saKXqKm1npCFnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopafoZGMk4mGgJGnjYeinaSUmJ6Hn7qyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga6sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5yLmZKMfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKSdhJqBjo+Hi5pxkJSFaHh1fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZTcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7CpqqaalKCjpKukl6aruKOwgaGonaaenYmUvZqTjaGSno95hJaWkYirmZubmaKFjot3m5yPn5CInqWclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoKGZoad+oaeHrZ2glq2PnpydkYWAoIyprYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5d/jHtkaItzmX15lmxdfZdtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJYUG93Zm10c2tqb15rcW1raVhpT15ZRjlBNEhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaykh5qQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxygJqkY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZdaV5jTEU9RDZSQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9eW1pYYGB8ZEhDOExXVVdjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZqhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSo5Scm42LqailnpCXh4V+anuHfn2QjYOLkJGJkJShg5efoJ2gnouJd5yYooyfcqGLh6mIm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbZ5om45vmpl7gIunfXJodKuDnoN0qmiVml2bhXaFnWeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qQbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0RTbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWdYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ6SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9nZp/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRiUV9YXVVXQFpGUWhFU1dcYlheSUQ9Qjg/QTpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGbc5CQgYmalaGbhY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8lKShnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpp2ZgaRvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jc6SPdWuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEbGdmZG91d2dhY1NcZlFRYklYSlVhV1NbZWpbZVFGREtNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamhmaqKmpiYk5mTkqGYj4iGe3B9hWh9j4OUmoF3kI2PiW9/hY+TkmyXk3yJkpOlloOPq5uUk4uGinmDdoiAboKfhneAkoaImqOYe5SjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa1tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpOXi4FvTWajknCah3Oke3p0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9s19qdmt5h2ZraGN1dXBuV19UWWlRU2hJVk1ZVFZdaGtuVmdXTktCSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmaqYjZKLgYl6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dyn3eBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpeW2OhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTVhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinyHcYCJaYuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaOskIaRi4KKfoCAj3NpkKaEfYaUjYiZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqWijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6htqqKBiXaIg3erkaaIa5Gwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDp46rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6adqZ2FjJqPh5yRhZKNjI10h3uJhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/X4B/i3d0cpR1b3lubodshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN6fJh4hVxrWHmPaW94cnJveHhwXWuHbmpnVltgV11ma2RWYlVfUV9weHlsa3Zmamtsd31ycnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl9XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHuWW1xqZ252W3x5eHVuc3ODZ1xti2trYlpaX1tabHFcX2FaX11mdH57dXB0Y2tra3x+c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hVXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChZeKcW+AcpiGg36Sg4SGioF6gYWMnKGRg6eiiHmOl4mVi4ucmISDeq2CkZealYqenYiIoaqfoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJKTnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4yQiIiAhISQd3x6dJmgiIaJnYmEk359ioCAdW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX56mWtyaGF0inF+end3cHd0gl1eb4dobl9eWl1dU2hyVmRcXWJsaHV7fHNvcGRra2qAfW55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXhoOCj3+Ah4SGfYeFjpyek4eroIRzi5CGkpGLnZJ9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2EpXt8jpCRhpiroZ6UnZCOqo2QgJ2MiJOZnoKPl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaFfoWElG55dXSRoYqLhZqEhIxzf4l8fHJxeoeCeneKjoORpo+Fg46Ag4qJineGiYuNfnBsf4J8bmhsbWhfen9pfnx2dXZ1e3hcX3B+bnVgY1tdX1JnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbHVveW+GeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4met5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1qaH2Cl4h/h419foaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcHdhfYCNhnGLlXyIjHGMf4KFho9od3F4i5iRj3+WfYeKcYGGe3xwd3qKg3l5j4yClKWSi4WPe4aGh4R2g4SJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX19Sa2lVZVlfYWhqdnmCcWdrZG1oZoCBa259aG9ybH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N9hpeJgImLeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2dfoGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgXZxfW57ZIB8ioVwh5N/kYJsh4OCgImFZXVue4WRl4t8k3eLiHt/hXx6cX13iIR4hI+IipehlYGDi3aIhIOCd3yDiod4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFjamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyQbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5ytl6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGMfnyDfIGDgXh0eXt0fYGEgImLgGRffYuUhn6EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmXqHiI+Jb5edmqSUlYuMn4yGgpKcf5KSlYeZiHyKioF6cXlrdWx7fot+bYWSgpR4cIGDfn6LgGRxaXt/lpeEfoxzj4eDeIZ8dXd/fIR/e4KLhIuTo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG10e4lsYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4Nze4CHe4+SiZOSnZOmnJaCfYF9joqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAfIGCiHxkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMe4d7fouFd35xcIGHhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8d4V4eX9zc3uGa3Nwem6Ld4CBiG9xW1l+kY2IgH9/d3WBgYCghpGLk52YoZWYeIp/gY2JnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjpqRfIqAg291cGxtb3B7hWlzg46Yi3F3gHWCiYN5ZnJudYCajnuHg3mTkHl2h3NviHqEi3mKhYKHjZqih3uDdYKLf3d5bmyChYNec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWWJhYm5YUVRaZmdjdnCEgmJda25kYmZrkm5gZ2ZgaGuBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbnZtiXeDfoBublVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhJCKfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkoSRgolxg5GYkJyPkIyMj413e5KReo6LjJGWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYRvdot5iIt5h3yBi4+dnYR8e3aCi313cGpsgoR7YXlxbm1zdFZfcGJyYWBsbnpxaHBmZnN0aHFrYXdlXVdmYWByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBscXSKfXZ8hYB1dX6MeXuFgXiIg3OGhX6MjYR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ/l5aJjo2Iko2InH+OgXd6jH6JjIqcm5yblZJ5jHVmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx+bHtlc3Bra3p5W4B5j4+Ben1+f4aOe3pncmpyio6JgYWEfJSKa31+bX+LfoqFfIN5gI6UmZmJfHV3g5B4cm1ncYCFbmt1cGhqdW5UX29lcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cYp1XVxldmFiZWWPZGFmYllpc3Nua3J3jH10eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbn1liH5ucGyAWWxueXl0YXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhoujl4mOlYqRnZaDgZaQhoqQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooORiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gIGGjH95ZXJpf4mOiYGCfouWhGuBdW2HkIGOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjandoUmFxZ2xWX290emFyZF9ofnByblpjcmBiVm5ZXHhOTUxkZ2Jed3OJblxcZHleYGRlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIt7bnRxgVdxenZ5cmV3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGltfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2TiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4yeg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hY6FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmlmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdfYnNzhWpcXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mHgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh1g4V1gn+JkZyehpSPn36IYn+Th4WIhIqNgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SJf3BfcW+Ee46LgXt+kId5cINleYGJhouCeoN8fpKNj5GDbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNiXGhfZGxgblVbcE5IT2dlXGdvcYBtWlxjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAiHV5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIJtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabl4aTjZyAiGZ9k4KAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goGEhIBrXXB3en2LiIV7gI5/fXGAaHiBhoqFg3eCen+Wi46LfG1reol8dnRvaWh9d2VdcWNYcHRTVG9zaWJOaHR4ZmFeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZmSjYZvbIaSkXp5k4eBhJmKfId/eXiJioSVgG+Kh3F0fXtqeYaDpZGFk42Df25+gnWCd4WZl5OKk4+UhYdwe5KEfoODiYNvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHqCa1tvfHJ/h4OIfYWIeohxgG1wgoWNg4Rxg3d/mIuNg3dtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1ycFhoXmZqcV9vTldpUj9ZZ19bcGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+gIWCmoqBfI2NaXhya2tmX2FveW1fYm95XWRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tj41/bm2FjIx1fY9/hYKViXyDeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG9aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1pZXHV/dWlZYltnZW5iaU1YZlE9XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtZ2lraXB4fY5taoGEf3lugHt9gX+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5WCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKeHBthYOHdHmJeIl9k4h6fnJndoh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3lqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKCdW5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlYWWBxgHVhXV1gZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl6f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9MZnZMXm9VVFlzbmJRT3R5YlNXV1xhcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgYJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoizcop5cI52fYiQgXqUi4B1dHV+d39wcH9uhXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVVddYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R+g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoWAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koZ6eXR6dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fXpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhnYV9yZmpocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHx4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHpkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2AeHhzd297d2Vqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZvd4ukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Yltuempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFxaGdhV2ldXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedWZsZXFmc3B0gXhwmYV2f394f3yFh312dIKHgJWDbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlIByj4JxhoJ+goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3Bvcn9ziWVmen9qdXZ0dISFeIGFend0dW5renFiaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cnt5bHp6j4N2l3yHhoOHhH11cXNtaHVdbWlfbHVkZ2Zpem97cllngXd1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHhye2V9fn53dW5jZWFshnxta1ZqY3JUTGtsUExPcEhee2VhTlZ1ZUtPU1dga3d+Zl1nc2llX1djV2JxXUxLa1hkYlVUVXNXTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaYBpa29/Z2xiaXt6a3R1dW+GgnuBfXZ2bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWXBpj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR5kIZziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2dHVignp9dnVvY2NibXx8a2tVaWJnVExuaFBIUmxFYXhlYU1Uc15KTVVZZWx4e2ZfbXBqZF1WYFVvb1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXF0fGlqXW14d2h1eHNuhnx+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4iIgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWd5d3RwZIN0eXl0cWRhZG1yfmprVGleX1VMdWNRR1diR2N2ZWFMVHFZS0xYWGdsdnplZW1xZmNaWF1Yd2ZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlrYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Jxd3VsYltudHVodXdyboZ5f4F6d29vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Ig4h6dm9xfHFhd2Nabm9gb3CAe3JlcYBkXm11aWNmeHpybG2AdHJ8cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidGNgSlVuVUpMWlZpbHJ7Y2xsc2NhWlpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGJueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doJ3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdgbHZkanVqaV9bbnVybXR1dWuGfX+AfHdvbmxlaXFjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3N6entkZnZoXmNbYWhcXndpV2JecGhhd2FbfHZqanJveHRzdGhxgpWDh3+EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFFJUFpWa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgZG1jWGBhYl2MamRlbXp4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZml0aGN0ZWVdWnB2b3F2dnpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5dHVven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5waGlzcXRxdXZrbYWTgol8hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWVVVlBVb1hSV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVlt0ZFNSV2hRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBin5rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpydm5ze3l0bol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJub3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2a2iFjH+JeohtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhib3V6dGpua2pfWGBmaHVdZFdiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddVtUU2BnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpORi5KOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOjYmRiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiY6MiZCIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6Li5CIjYyJjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOjYuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx7e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18e31/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHh4iJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTlJOTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTk5GPk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGRkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOkJGRkZKTf4STkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoR5kJGQkohziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QjXB7kI+Pd3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6OdWyFkIdyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI14bXWOgXR2ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLiHBiZ3hzb3WChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndyXGJpXGJka2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGBjdGxeam5nZGJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aW2tza2FtdG5lWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01bZW9rWmlzdGtSUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlhiaG1ub3BxblNMT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0ZJVmNmZ3FubWhnXVFOTk5PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRUtNTVJfam1obm1tamhmY2NjWkxKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD5FVF1fY2lsbmltbGxqamtqZ15PR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R1ZfbnBxa21ramltZ1hJRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PD1RZXFyc29saFhFQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTk8S257cVZBODo8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PTw7SmxlOTo7PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0E6Rl8+Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTUZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3p8d1c8PT89PT5GaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KDhIODg4B9Xj5AQ0BBPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhIS01MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRlBTUlNTUk9QUFJUZXFxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f39+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCBg4ODg4OFiYuKiYmKioqKi4mKioFHNTY2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5/f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHiIiIioqMiomJjHo+PDo4Ozw9Pjk6Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo6Ojk5OTw/PDxBQkRJSkxLSUtMV29yc3VzdXh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjG9PPj5CREVFQkFAQj9AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouJjGM+REZKTEpKRkdIRUZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKh1ZITU1OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0hIR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE9NT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5TUU9OTUxNSkhHRUlJRUpIR0pKSUpHR0dLTE5MTUhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLYFRUUk9PTktKSEZCR0pHTEpGS09MS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WVhUVFVUT01LSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4xpWVdrYUZUUVFQSTs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGVVOllZWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5b3BZW1xbUlRSVlZUW1p1g1lVfZBhXVhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHxcUVZYVVJVUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3lucVZKTE5PS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTkxMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21xdHd4eXt7fH19fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5NSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lGSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tMTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0pGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREE+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTE5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9PT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZFSUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmhjaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdmcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnZ0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk5NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklJSkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHR1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhLSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BESERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQSk1NSk1SSUhFQUhGSklLTEpNSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JiYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURHS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlaUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0lLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhJUU1MS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGFYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhISEhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1MUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTUhISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVhVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goGDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJTWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWNkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0dLS0lKSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUExNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFdXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllZWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXWJcYGZhZGZkXl9kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGNjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tdX11gX11bYGRdXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dXFpbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4KCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz87m8O+v76+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3t5eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3e3l6e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6end7eXp8eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIWFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93cHBvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcHJ1cHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJ3dHFycnFuiYZucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycIWTcnFxb3uefm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxd6OQcHFxlZ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJznKiBb3uinn5wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGUq5twg6OffnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4d3h4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzcpOxqouVpp17c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh8qa+jsa2vn3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e4+rmaG0pJ+piHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maGVo6+fnKOafn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGZm4mYsKGdnZ2DgIGAf39/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBf5eknZSjm5mRnYh7fX5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6GqK+mnpmdn6appo+FgX9/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChYaNmquvoJujnZ+eoqSqq6WflIeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIOGjJ+rqaCZmaKdnp6fnZ6hoJqQhoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KCho+SlJWXnJyen56ZmJONiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5ORj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgIOIkJWUkJedmpGKhoeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDjJuHkJSKhIKDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoGBiIeNg4KDgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH9/iZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoODgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI+UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX2AgoSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhYWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICFhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHh4mJg4OEg4WEhIWFh4iIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDiIiGhIOCgoOEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWGh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Bg4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoGQhISCgYGAgYCCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp5fIOCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBgH9+gICAgICAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX9/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Mi4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl6gYKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh9g4OEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1/gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhoWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4OCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX19gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt6enyCgIF/f4F9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHp7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISEgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgYOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fX18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn6CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISDgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn9+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHyAfoCAf4GAgH99gX9+f39/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYGCgoGAgYGBgoKCg4B+gYOBf4CBhISBg3+CgoGDgYKCgYODg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgn+BgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChISDg4KAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIOChISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYSEhYSFhISDhIOBgoKDg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXiFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHh4eFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+CfYB8fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/Nk4icnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx173JmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdXSlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZsJ/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1s2Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTNjqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZu0vKOlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCxNWdko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkpGPlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmp6alo6CgoaGfmZKVpJqamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpaSlpaWkpKOioaGdnJqWqaqdm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKmpKOkpKSioaGem5qZqn1+nJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgsbWkoKKhoJ6cm5qaopdQg5ybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgoaeSsaKfn56cmZmam6piTIednZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoJ+qgX2uoqCem5mamqeMTlOKn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eopdZia2enJmbnJ2ralVVip6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm52ibWOeoJmZnJ2hmmlgWIygnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmbonNpf6KYm5yco4tqX1iGoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmal1cGqLl5ydnZt8aF9ch6Gdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZije2xrb4ecnJ6UcGVbX4qhnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn4mLknR+nKCjkXhlVWCQoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmqCmnI1siLGnpHiKhmNhl5ybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaloIh4W2unlpZbdIF8dpSSjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCSqI9rVFBynIqLTl10eICIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/k6h6Oy88eI96eUc6U291gYCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f56ZT09UP3uEbmZOOzVQcHp+hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCkdVOBeFB8lYl5Umh8Ulx1hIqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNn2GN1sBfpq+kpnBxin9WaIaLiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuio5Flv9Ctldu3psCxVF53aVWEkIuYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqrKBc7OvndHFopisrXFqxYdQe5+ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6isjX6ThIrIzrCzqpJ0Rq6xW3CdqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOipaGMg2+YsaOenIeBdGN6jHVtlKSioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKidgWtRjJKAfoJ2dG9wc3R+gJCjoaGfnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKurKupg3BfSG91bnF2a2llaGZncXZ+ipahpKWfoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e1s7a6vbuvlGpjV0hca2ZqcWdjY2VaWmFia3V6foiUnaOmnJ2gmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt77FzdDHwLWmk3deXVNHXHRranFlYGNpWlheWV5lbnBxdHiFmKaup6WYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vNDc4NnKu6+gkXljXF5TQV9sanF3Z2JeZ15VXFxbW15lZGJjbomyycK5oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMDO19jOuqOPfG9dVlhYTD1eYmh0cm1iYWZbV1dYWFZYWF1xkrDFy7q4t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca6xMDHz9LHpoVdT0tPU0w9VldoYmBxaGFfWFpXWFZUXoexxL2ztLaqtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBtp3Hs4xcU1ZQQ1ZTXGFmcGVYW1peWFlnkK+/uramqampqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TEubS/ubvKrnldUE5XfHSQl5ZVVFhXWWGBsLepq7K0rK6lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPDsn1WTHB3l6WdTlFTW3Sgtbeyray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THw8fIsIBgWJGmkkhMbZezwry+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcLFxc3Qx5OLqItFbbnFyc3GxcHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMHFxsnOsYxeacTQx8vPxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNrZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcG/wMmTP5TSzMXI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnOwbu/wLy7xL26wMS/vby4u8DFq0iVzMTAwMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjbq/u8O1use3trm7vLi5tbrDyalMj8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHiqy73Ht7m4rba0t7mztbK6xcmcTYTKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1651grzIz8LAuK61tbu9t7mxvsPHkVR/zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcnSu0dHMysS1ur/EyL6+tL7Av39hdsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnN0pszMy83KxsLDy87BvLi8urB4cWm7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKqytsPApXl3epzExsvIwcPAwMnKwb+7ubKiin91rsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKp9bmhubXKBlph0eH2Zvb/GwLnAvL7FxL29uLGuoJ+Mjp3KwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1waSGaVpeYE1SW1tvdHiDori4wrqzu7e7vb+6u7uuoqKml5+AvsTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4iqCvtZxqZmdWWWBJSU1QVG14iKewt765srWyvLm8trm+tZWltaWtdq3JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmIfHaMoZhfU0NYVUdhalZPRUphjqKtr7a6tbSyrLy5uLW4wb2LnrmrrnWmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBuTks/ZFlCTneAlGlNQV2DsLWztbK0r6y7uri2ub/GdoewpJxmqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV5cUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BYkBTo7mztLKwsa2wubi2u7e7vJGjs62kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2icgFpFUq67sayzr66srba2srS1rqmnn5qbnZ+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bWt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFxgcpCxr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yW1FrY1tlYV5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhXY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVdbVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTEtQWFJITU1HmKyqqaSfn5mSkpSYmJaWloyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW1cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnp2KYldeZWBXTVFHPT4/Q0M/PkJReKmtqaqln56foqOdnp2anZuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD85Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hqZVpbRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYUI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREA/SoWepJmDoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1JETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0crS1dbZ1tjT1tjN0srP0czP0czT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sa+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsPIxs/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2ZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgXmFgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcWkpGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYWBeX19eXGJtcm9vc3R1dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLIysPMxMbIy8vPys7N0M7UzMbJz83Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgYGBhYV9fXVtdZ3JycHJzcG1yeaXH08/L0NDT1MnEyMnFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jJzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7m8qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHIycrPy83Eur/Duru6ub3IxsLDwMPIysjIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fEyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1pbXWBgYmNkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/HvcnFy8DGwbC2ubGxs7Kxwry8vLq4wMHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dnhrZWhgaG9kVl5ZSkZKRkhLQUZCRklAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3LwcO6wLitsLCmqa2rpri0trSzs7O7tr2xt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8vFwMbGu8fLwM7Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15bXV5aW1tdX2xwbmlmam1ucnykxr+4uLSvqqunnqGppp6qrLKtqqyptK22sbOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8x7nDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BGQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWtpaOmppmfpJ+Zm6SqrqSooquqrKqwo6afqq21trG8uK+3r6iuuLS0vLizvK+4ubWyvMGywa+lqaOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcHBx8i3vsDFt8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWrpJ2boKOTnKOal5Cgoqmjop+lpqemraCdm6SmrLKvt7ensKyoqrSrtLqxtrautrmysLq6sbekoKSgprGorKm6qqWnp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsbm5wrPBvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVFlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ6UlJmflJmhl5WLnaChppyfn6Sloqeem6Kbn6uwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqytrbCzua+4ubqwtry7uquzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKebkZKSmZWZn5SVj5uhoaiem52lpqKlm6Chmpmvrq2vsqGlo66rqKK1sLKyrKmvs6e6s6a2oaOfnKOhraOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+rr7Kys7izrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmpGRjpKUlZ2Vl5OWn52gnJahoaikn5+pnZubq6avsKuco6S4qaCgr6i3q6enrbCkt7Ckt6CjnJmZqqahm625sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrG0sLy0uriuo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJOPkoqPkZKYlpuTlJqfm56Vn5+npqSnqKCdn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ihopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGwr6CSe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGBiZGl/j4+HjouRj5GakpOVo5mglpygpaGtpqWlpKSjnaqrpZqfpbGqoaGepaqeqKKfrqyqqa2toqKilZeimpyQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoaKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkZQT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl5fX2JkbYqMgY6DjY2Ml5GSkZyaoZyboKipq6isp6mmpJmlr6SVmaWvqaCcmZugnq6anKu0oKamn6OkoZSTm5aWkqmqrZudoKGhm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJFWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR8iX+IfImNh5CLlY+WmKGfmqCrqqavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnamnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1han13fHKFi4SOh5WIk5KXmpieqJufq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopubk4yOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqGaoKKWlJiYlaKmmo2ZpKepp6GgtLKos7ihnKO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFub3NtgYV/hX6Pgo2Jk5CSnaGOmpyjoqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS3ucHOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWlvanyCenJNV3GOgZaFjJyXi5ORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOVjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQipyIn5iIiJaemqGgl6euqa2oqJ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCt7O9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBrbGZ4f3JPQT9/lZGQfIiUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiUhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFZaboJxdHxoZ1tTj4mUiHN+hoF8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp6aHZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnp+hnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt3ZXWLlZiNjnxneIB2eH+JkH2EmJKAcYePfHd7b2t+rX10kIt/eoaSgHx/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcWuHpqrAfnR4Ynt3bnt5iJB5fIuGb22Mknl0eWpqgIJxlpGMgX2Vf0mSmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpK2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVxfp4dhmWhyeWR+b2x/eouJdoKIhnRsmpJ0dHxqap2OTXmFk4mEjmYxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSWlhZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpCZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9xendrfGxxgoGFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8c4utjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXS0hKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVNES4Z1f3x7dX5sdoiIfH2Eg3+MfnWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfHyBf3CBfXpodmxSWExARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktog4h7iXl7cXyPjHp8iYd+l4d2oZqIh4+SlKWNralIhq6vrouBgJOKgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36AdXVzbVxeXltjY1hnZlxUUFBXWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaYyThpSAhIGFkZJ+hYiRgJqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneHf3t2hHxudnVmf5SOh4iIh4iHoKqilomOl396gYh6eXBna3h/e391bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZnbXSbmo6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F9n5ybp6WhmaGXopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlRRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiqKmqbS8uKStrKymqLSrsLaysa27sbO+nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraOyqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisauxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1pjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU48Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUtLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0wrW3wcvItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ube+t7q3uayssKWwqa29sLy6wsGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUlJZWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu7wLu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuonpWWn5mfrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZl6eepqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTk9KS1BLU1FITEFKRkpPX15iZ2lhl7fHsLiyur21scTGta+4sLC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OIkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPM0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CrtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZeXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomHkYZ+gXtyfn+Bh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Oyn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ6grJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfLycnMy8/JxNLK1NfZ19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR6kp6NoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6KdmauVkJCJjJGCjIWIiIGGkJGem5mIhYyBhZd6iImfl5CIjYqLgn2hipGLvKCYk5eZnammpq6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxETUI7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2LnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkZ2Rgot/pZmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSun4qQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqclpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wcfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYX6Rg29td4t4eX96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfn+SpqSfpaKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5Kpr5+RlJCNjoiWjG6Nt4WaxMixm6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmSDR3WCjn18bX2IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZra+kl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJKYlIyKk5OGlJiGg5GQnHSRmbKVlqShiJyak4+KkIqXmomKlo2GfYyYnoqQj5yamZOZmJ+UoJ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramyva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+wqZqZm5SVkZigl5m7u63JoWm2t6qwlZieoquSl72jXqmygomKjJSHkXyOjn2Dho2PlJSIh5KWi4+VjYuMl5mSnZq0lpWrnouclJKNkJKLmJqKkp2Pi4mVn6GNlY2XmZ2TnJielaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDK06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqCfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqahoqOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUY+QT9BPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6roqKep6yvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLEvsO7s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu7+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqpp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsK/mXB7Y1tYXlxNTU5KR0RESEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tLzLu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqKeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhEREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnauruKupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCupIuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlZxgSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimrKutsrGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnAwc21yLvBubW6sa+vsrSno5uqtLSrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrStuaWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkJ2DbXWTopqVnKKfkK6yo6uVqaqYq6+lpaClqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiaqNhqGejKOslKSktse9tMG7wsPIycXCzsjCvbmyr7m0wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKurvryorby0uL7GvLa1uMCwvb+zqbW2q76kj6KXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyinqG1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUdITVFJTURGRkFRS0lBREdBVlJESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwby/uMHDwcjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pqy9sLe3xra0ubi+sL7BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1dNopukm57Fq6Gfq52crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSpra+ipqi9taWxu7e2tcOys7e6vrHDwLi4rrS0tKOcpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsS+x8S9xMq9sLC2rrG1r8DFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq6qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6mxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtb/EvsrFtsDJwrWrtamxuKzAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7mzuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJWTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCotaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaufr7Szqqq3tay7q7OyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWpKCXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MUk9fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeopbSyq6Gttb2vs7i8u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7Spr7K4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2vsbWssLWxv7rFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHlpmMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8LCtbS6xb7MxbnDwbrAusS4wbmytayqure7ur61q66xt5mYqKurq5ytq4+rvp6rr7Gjqp+xrbKurrWxuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLSuo5mdraebl52Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG95b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaUlNTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAv7Wzt8TAzMe8xL23v8DAuMC9sr2uqLq5t7fCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7Gnra+1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgmIWTl5GenJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKu6sba3v72vrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2xsMe/uKS5r6mtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7O0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+ilpWGkJSUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s/SEmQmqmqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK60wsPRxMW/wbK+w8K8v7i9xaitt620ubzAsKyyrqGjp66qp6Wxo6uxqq6qsK6urKuyuqe3sbKpsqmqpaWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLewsaCpop+qrbCrnZ6mp6mao5eYkKComIaDjoqLn6CQjI6XnpKRh4iRlaGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE1GlZasp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CtssTEzs7Dv7+0wcTEusG0ycSsr7ius7nAv7Surqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq5+jnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG3rKyipaKaqaqtqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmkm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1iVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklIRJaQr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG2srS7wb6zsq+trKyot6qmrbCruK6nsLCusau1qrW2p7W3q6ykqaqco56zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uPkJKNhYeWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0MC/vbq8w727w8HAv6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq20sa+xuaq4rqqvt6uqnqmroKOhta2poZ6vsqG1qp6op6qjqqGhrK2ova+rrqyhp6efq5mPr6KYoqCopp6nm5ipsKiin6yhoZKhoqKmmJmopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGWiZGdkJOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub+/vcm8wrmxsLWyury5wLO0vK25rKO1pqessba4sqanurWttLyvu6WtrbWqrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rs7CtnamjoK6cmrKilqSbpKSfpJqZp6qlnpqpoZuRm6CknZiWqKmRmZmSkIuCj4V9j4J/iJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRmpKVh4l+gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttZ3ldXlZDWHttVGFQUllLS01wdF1JWltnWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfnqmko6GqpLaysaSpsaetucG9trCkuayoqLDDycjMwbe9v7W4wbrItsS2tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgrrS1qKyerrGjnKWnqaOdnKSvpq+hn6upp6GpnKOooK27p66xrqGqoqOtnp6sppifm6Gim5+amaKqopqao6OVlpOeoZablaWsi56Rj5GMgop/f4+AepqUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJmQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJpcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5emo6Gfp6O3r62ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbDsrC6sbLAtru+t6q5uL2qpLSmqKqvrbiwqJi4vKOtvrSzoa63tKamp7CzoJ6kpaehpJmerKionqCqr6egppeiqJ+wuJ+jsa+hq6GtpJumpqmampueopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Ph32HfoKNfHuhjI2IeYSNhYqNjYWJk5qOiZWfiJCVgoyWjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7O0qam6xbayrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzr6WYu7akq7q1rp6wuK6ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6Sht7ChprCrn6ujr5ebqqWon5ianaOTmpuZnKWpmZubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qcpKGioLeqrqC7uKWsvcWzsK6jtbCsrK60w8O8s7+6t7Gzubi6uLuvrsCztLmwv8C4rb26taWisqmnqbKqrbGfmb+1pKe1taidsryop6Wpr6yZo6ecpKWUmKGxpZmfo6ipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5yfkZqblp+hqZuamKCUkJOWmY2Tk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0rKequrenrMTBtrCso7aup66ut7+/vLLBt7Cusra2uLa2rqq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAqqelr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae1pq+qrqGhnZ2hlKCmn6GgmpuZm5KYnJOlnKuhl5aclJKMlZeLj5iaqJ+RiImKiHiFdoGCgZ2HioKJfYCFiIeGkISWlJCOkJGQkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1pfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqbm8u7qtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qqCfr6Oprpyiv6Cxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6W6p66ioZqanZmepJqknZeel5uTmJ+SqJWpp5qTmpqRi5WZjZSUmqimjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkZaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGVaSUZMTU9ZUVBWYWWBVUFWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GZqbGvn7m/taC0wru9urGmtq+oraW3uLe3rbuurKqrtqqzuK2ms7Wyrqmwtraxs7W6pqmftaidnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIUmFvdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Kgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7Wiqbi2tqinrLayrrSts6Gpn7OqnqGjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6edk5+fmJCep6mjta+joqKdlpeXl6OIoI6SmYagh5OcoH+lf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oG+Ih4R+jn1/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhqcXCIWV5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C+qqW3sKmspbK0rq+zt6qppbCtpbSznK21trWmp6izsK2yp66dqqCyqJ+iopmhoZqts5OjpKW1vKasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJOTo6SmobejpKCjmJWSl5OciK+Ql5SJqYuWoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2R/wJy/eYSEeZGEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdcUEFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKoscK9srW/tbe+waqns6ysqaeus6mvtrSnp6W0pae4r5yzsrarpaSnsa6usKaqnaeksKOhn52Wmp6crauTnqKfs7qiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoaGwop+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJydlJmllHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnaOkqrG3rLW9v7C2xLK3usGmqbCrrqipsK6jsLqvo6StsqOouKies7Owo6Wgqq2vrK+mp5+jorCbopqWlZaamqullZuhnrOzoaucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpp+an6GVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXN2U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqCvqaeyrKq7tsKwu8KtuLa/qqytra2mrbGpoa68qqCntKyjq7WlprKzp6Sinaeqsqiwp6Wen5+ulp+YlJWVl52soJmZpKi0rqGpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqibpZmcnKKglpORk5Odg9WTmblwsMF+xYZ81pSbu3yalaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKiltKqltKmkvLfCsLnAsbW0urO1p7GworCypp+ttqiap7mto6+xoLO0sKGknp+nqbCotKikm52dqpaYl5WXlZagqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeji4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsK2jqrytprSmp7a7vLK6v7e2s7m5sqW0s6GxsaKfq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaielZOXmJKSoaaflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoImSmoqif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhpmZdq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZOLmVkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwlrTCraizqKmyurezuL65t7G0u7WkuLKetKyfnqisn5SntauosbGrrbSkm6mgn6ihtaamqaKZnZSkoZOSm5iRlKKkmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZOemp2gmJmblpehoJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6CJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19LVjZKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLu0n7CknqSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2UoZifn5Kel5yVnaGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCurausp7epuK+1wLS7r663tqvAtaipoJulpKGckaqpp7WjsqeuqqCXnKegpKu5naOtm5aZjqSilYydoJuYnJ6RkpSqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOQmaKWoJuWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXioyniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGLbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1lbWURBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsKyqq6uxp7ivtsSwubCtua6twLGro6Keo6Gbm5Cpo6qypLWmraWelpqqmaasuZ2jrZiUoJCln5KMnKKdmJ2akZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqehlKKanJeVo5ePr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZp7gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62YnaSkooqSkqWbpaqblqilpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Fzalpem4lhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydHh9fmJbd3SBaFBcboN9fItrWGx6gnJKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwaKbtbq1o6ylrqentbGsyKuvsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnZGQmJyvsr+sm6eep6KIk5GpmqijmpqsoKOam6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2NgnqlhmxqfJB8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKyt6CqprKnpbC0qsiqrLCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEr5qrnaqfkJeWp52qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipWPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXmIcmlzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rauusrKgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6KzyLOfqqSqlpaXmqadqJqeo6uUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saIyXkaN3a2qLmaOemXNsbnqDjYd6WGVehoJebYuJgXZcaHN3d5KAh4Jud4J4f3NteYR0doiIjoN8aodZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pa2jjo6aoZmTkpqfmZmklXulraKotMS4paKnr56dlJ6inqOboqmpkp6hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH1rpbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpCfoJibn5yHpqykq63AwLGgqa+pl5GenaGZoaOqpJOgoZ6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4d2dmt8iG59hZCRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrprKsrKqiqqevqaCnm5mkl5yir5+gnqino6Whn7Csmp2Vp66ssKqorJ+UkpufpJKPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2wqKyqnKiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+qoaGn3aYknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6OirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKiinp2wrJealqmnrqyop6iel5Sao6GRk6Csm52moq+spKy1qrnNsq2mrayXlZydopieraydl6CZnp6psqqrqpysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoKVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbZuVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKaikJqiqJ+gpZywpqSosay2yLK1qquplpGdnKGYn6SznZqhlJ2ep6yspa+braqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiIegepiWmniqyXSZo5WoqZGTmoyAnImaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGYlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjn66rnaagrJqeqaWdp7WfopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOysqmsqJOJl5ylmqGjrqWXoZWZnKWmrJuwnq6pp56so7esobG4r52arqaysrKjk5amopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWchZ+ErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5OMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmKmklKK1oqKVl6GptLikm6Kdo5KPobGYnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56ZmZqmpKqbsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+inYWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqCgtqejqaexo5Sso46kraOdkJqaqrOzpJyknKmRlJetn5+dpqOcp5y1maKqpLarw7CpqqmhjISOm6KgpqOVmpqcmZuZp6Wnma2or6Olm62mvayUvbCsnqGvsrmqsqWaqLCippd5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4nZ+RiZSSgHmvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5WOmY18fISYgGtuf2N/dG6AemBnZXFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklomakK6wrKaeppusl5ePrKGgnaWhmaScrpihqKa2qcCvpamjnouAjZuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmI+nm4yXkZiYfHqQnn9ldX9jhXh0gHxhamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnLO0qZ+joJ61maC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKpsqm9r6Wonp2PfYyblqCgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRrooFvq4RsnH96srDHg2mrsL2seHeivrxzgJaOppyRm5GZnnuCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK2pua2oo5qXk3yHmZGmmpKPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4mWlphxaWmEh2ZwhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmSmKF+iJCWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTJvreqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLqrrJqbk5J7hJaNpZiNkZGZlI6YlqiVoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnJSQmZOZkY6VhYGkmpeWjouTk4uPhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+clKGWmpijg4mWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6hr6Otn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6eZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qdnp2clqudk5mhm5SQlqqZjZiZl5CWnpGIoJ2VlYWSjJCNlIqAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSl5Sik56Yo4WKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566tqSlmZuNiHmBlIyak4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mZdwgJiol21/oqiKZZylnJGXmJaMkpyRhp2aj5WDkoeOjpKJhHdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3unm5tmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGyp5urp6yXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilKehnY6WkZ6Eda2PiKabqZGXpImcu7SnoJmYi4l0d5ONlpOKk5GRlI2QlKCPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoJeZlJiWgpGXl4SamWJ5h5CEjY+RioNtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmEop+ImH+UjIWFmmuOjYZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpqytq6isn6iwpqappZmUr8i/saKXqKm1npCEnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopWfoZGMkomGgJGnjYeinaSUmJ6Hn7qyp52bko6FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKOchJqBjo+Hi5pxj5OFaHd0fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJaioLCnqKilq5+jt7CpqqaalKCjpKukl6aruKOwgKGonaWenYmUvJqUjaGSno95hJaWkYirmZubmaKFjot3mpyPn5CInqWclpqYh6O5raSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoIyqrYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2mef5JrZ5eFl7eJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJXUG93Zm10c2tqb15rcW1raVhpT15YRjlBNEhEX2s0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaukh5qQipmpmZqbkoimsaehlZqIiYBpboiIi46OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+GqKuDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxxf5qkYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZcaV5jTEQ9RDZRQlpyMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVdjYFplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSjt5mrm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZmhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2noIeXjomSo5Scm42Lqailno+Xh4R+anuHf32QjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6mIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbJ5omo1umpl6gIunfXJodKuDnoN0qmiVml2bhXaEnWeqaoC4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qRbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljX2ZYYkJRRk83V0NSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbWbp4hjlJqrubGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioOVo5yKlI+GjJ6SnZ2JkKmjoJqMkYqAgGmAh3l/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OipICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF4fpi0oqOrqISZfJt9nZp/dKpaXW97lot4nmJMfnt6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRhUV9XXVVXQFlGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqCbc5GQgYmalaGbhY+pnJuVi4uKfINshIZxgaGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp2ZgKRvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdWuQs4xggpiJc6qyp7x/d4Ntfr6mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEa2dmZG91d2dgY1NcZlFRYklXSlRhV1NbZWpbZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamgmaqKmpiYk5mTkqGYj4iGe3B9hGh9j4OUmoF3kI2PiW9/hY+SkmyXk3yJkpOlloOPqpuUkouFiXmDdoiAboKfhneAk4aImaKXepSjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa0tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9tF9qdmt5h2ZqZ2N1dXBuVl5UWWlQUmhJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmKmYjZGLgYh6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpfW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dnWlNtSVlPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinuGcYCIaIuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaKskYaQioKKfoCAj3NpkKaEfYaUjYmZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6lsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDpo2rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtmdGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpmmjn+mpo6BjomFlHaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/XoB/i3d0cpR1bnlubYZshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN5fJh4hVxrWHmPaW54cnJveHhwXWuHbmpnVltgV1xma2RWYlVfUV9weHlsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunmqmYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58p6GLhpCQhZWDho6Yd3KEqoaNkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXd6mnuCioF1gYWCZ3eJhWphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHqWW1xqZ252W3t5eHVuc3OCZ1xti2trYlpaX1pZbHFcX2FaX11mdH57dXB0Y2tra3x9c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN9gYx2hYuChZeKcW+AcpiGg32Sg4SGioF6gYWMnKGRg6aiiHiOl4mVioucmISDeq2CkZealYqenYiIoaufoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJOUnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnYmEk359in9/dW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX16mWtyaGF0inF+end3cHd0gV1eb4dobl9eWl1dVGhyVmRcXGJsaHV7fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDe46ZiYaDhIdueYGAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4ern4Ryi5CGkpGLnZJ9jnuqhI6TmJaPnJaHhpuln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2DpHp8jpCRhpiroZ6UnZCOqo2Qf52MiJOZnoKOl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaEfoWElG54dXSRoYqLhZqDhIxzf4h7fHJxeoeCeneKjYORpo6Fg46Ag4qJineGiYqMfnBsf4J8bmhsbWhfen9pfXx2dXZ1e3dcX3B+bnVgY1tdXlJnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1tiomet5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYONgoKDbnx/eXOBhX6LkX1qaH2CmImBiI58fYaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdHSCcHdhfYCNhnGLlXyIjHGMf4KFho5od3F4i5eRj3+WfYeKcYGGenxwd3qKg3l5j4uClKWSi4SPeoaGh4V2goSJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZoCBa259aG9xbH54h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveoiMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4p/iYKBf3J/e3R2g4V+ipF4Z2N9hpeKgYqMeH2AjYN5l4KWmZeNl6CcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2cfYGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgHZxfW57ZIB8ioVwh5N/kYJsh4KBgImEZXVue4WRl4t8kneLiHt/hXt6cX13iIR4g4+IipehlIGCinaIhIKCd3yDioZ4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyPbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5yul6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGLfXyEfIGDgXh0eXpzfYCEgImLgGRffYuVh36EhnR9fop/fZmFl5WYjaSimX9zh3uTkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmHqHiI+Jb5edmqSUlYuMnoyGgpKcf5KSlYeZiHyKiYF6cXlrdWx7fot+bYWSgpR4cIGDfX6Kf2RxaXt/lpeEfoxzj4eCeIV8dXd/fIR/e4KLg4uSo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG50e4hrYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH18jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId357inx7gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4NzeoCHeo+SiZOSnZOmnZWCfYF9jYqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMeod7fYuFd35xcIGGhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhaX19ha1pQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaIF6d3VvjoV0gYKDe3WCiYV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8doV4eX9zc3uGa3Nwem2KdoCBiG9xW1l+kY2HgH9/dnWAgICghpGLk52YoZWYeIp/gIyJnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjZqRfIqAg251cGxtb3B7hWlzg46Yi3F3gHWCiIJ4ZnJudYCZjnuHg3mTkHl1h3NviHqEi3mKhYKHjZqih3uDdYGLf3d5bmyChIJec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWGFgYW5YUVRaZmdjdXCEgmJda25kYmZrkm5gZ2ZgZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbXZtiHaDfoBubVVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhI+KfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkYORgolxg5GYkJyPkIyMj413e5KReo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYNvdYt5iIt5h3yAi4+dnYR8enaBi3x3cGpsgoR7YHlxbm1zdFZecGJyYWBsbnpxaHBmZnN0aHFrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpFqX2hlW2dwfXBscXSKfXZ8hYB1dX6LenuFgHiIg3OGhX6MjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHBwhXRwcoRva2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ+lpaJjY2Iko2InH+OgHd6jH6JjIqcm5yblZJ5jHZmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3p5W4B5j4+Ben1+f4aOenpncmpyio6JgYWEfJSKa31+bX+KfYqFfIN5gI6UmZmKfHV3g5B4cm1ncYCFbmt1cGhqdW5UX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPZGFnYlhpc3Nua3J3jH10eoaCdXZ+i3OAhn96iX9yiYeBkYuIfH6YdmVzbn1liH5vcGyAWWxueXlzYXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR3cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqRnZaDgJWQhYmQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXByblpjcmBiVm5ZXHhOTUxkZ2Fed3OJblxcZHleX2RlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NndXF5bYt7bnRxgVdxenZ5cmR3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGptfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2SiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5WPh4qGiY2IgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hI2FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdeYnJzhWpbXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdnaKho6ZgYyCe5N1bHd1eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjICBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1g4V1gn+JkZydhZSOn36IYoCTiIWIhIqOgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SIfm9fcW+Ee46LgXt+kId5cINleYGJhYqBeoN8fpKNj5KEbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIFtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1elpgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabloaTjZyAiGZ9k4KAhoSKiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goCEg39qXXB3en2LiIV7gI5/fXGAaHiBhomEgneCen+Wi4+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRnYVpsbm17b1lbXmxjWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBlcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfIZ/eHiJioSVgG+Kh3F0fXtqeYaDpZGFk4yDfm5+gnWCd4WZmJOKko+UhYdwe5KDfYOEioRvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHmBaltvfHJ/h4OIfYWIeohxgG1wgoWNgoNxg3d/mIuMhHdtbX2Ef3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19acGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4J/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+f4WCmYqBfI2NaXhya2tmX2FveW1fYm95XWRsg3pgcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyCeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG5aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1tZXHV/dWlZYltnZW5iaUxXZlE9XmZdXXZmX3VxW1lVb2RaZXF5W2heYGdtZ2praXB4fY5taoGEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h5fnJndoh+fZdvcIZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3pqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKBdG5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlZWmBxgHVhXV1hZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl5f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9LZnZMXm9VVFlzbmJRT3R5YlNYWFxhcIJzW2FcaGVkY2pkUVtxSURkYlxjcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgIJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh5eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoezcop5cI52fYiQgXqUioB1dHV+d4BvcH9uhXSUhnh0bGB6gXmIjmVxgm9ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVlhdYHKEb1xgY21kY11uYlRdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoSAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZodyYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fHpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYGZfXFZ8Xk9WZXBZW2poXVhnYV9yZmtocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHt4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHlkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2Ad3dzd297dmVqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZveIukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Ylttempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFwaGdhV2ldXGtpSkRrWmJkVlhVeVpOV25qWV1sZV1aZWNedWZtZHJmc3B0gXhwmYV2f394f3yFh311dIKHgJWCbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn58bISGlIByj4JxhYJ+goBwZmxnV11bXFtUZXBlX1hjcnVpdXBkZWJXW1tof3Bvcn9ziWRleX9qdHZ0dISFeIGEendzdW5renBhaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXcnCOp32EfHaWkHN7cnt5bHp6j4N2lnuHhoOHhH11cXNtaHVdbWlfbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHdxe2V9fn53dW5jZWFshnxta1ZqY3JUTGprUExOcEhee2ZiTlZ1ZUtPU1dga3d+Zl1nc2llX1ZiV2JwXUtLa1hkYVVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaX9pbG9/Z2xhaXp6a3R1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWG9oj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR4j4VziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2NibXx8a2tVaWJnVExtaFBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vub1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXJ0fGlqXWx4d2h1d3Juh3x+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4eHgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWh5d3NwZIN0eXl0cWRhZG1yfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gXl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Nxd3VsYltudHVodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Hgoh6dm9xfHFhd2NZbm9gb3CAe3JlcYBkXm11aWNmd3lya22AdHJ7cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGFud3lsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdga3ZjanVqaV9bbXRybXR0dGuGfX+AfHdvbmxkaXFjW2tyZHR2jnNcV1NkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J6entkZnZoXmNbYWhcXndpV2JecGhhd2Fbe3ZqanJveHRzdGhxgpWDhn6EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVhgZG1jWGBhYl2MamRkbXl4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIGCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5c3Vven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5vaGlzcXRxdXZrbYWTgYl7hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAe3V/g36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtb3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zrc3VvbXh2a2iFjH+JeodtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGpua2pfWGBmaHVdZFZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIi4eGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uNiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk4qHlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKMi5KRkZKRd4aTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYlyipKQkoBziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj3NwjJCMdHeIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pd2t6kIZ0d4ePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI57ZWuGfnF1ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2heaGVnY26ChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvXnJsXGltZ2Voa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaF5odWxdbXVuZmJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWdvbV9rc3VsWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01WYmhtc3Bwc25SUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRhZWVubW1paFRNTk9QUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tEQ0ZMWmhsaG1sbWlnY1tVUk9OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVBUVVpka21nbGxramppaGlnW0xKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5CSlljaGxrb2xtbGppamtpX1RJRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs6Rk5NYW1wcHRwamtpWEtCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTs7S2Bte3NqW0c9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo5OEJqbUg5Nzw8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD08O0dcOTw8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/PkE8RV49Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLYz08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+DgHp8d1Y8PT89PT5GaXRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B8XT5AQ0BAPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHiIiIioqMiomJjHo+OTg4Ozw+Pjk6Ojs4OTs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFAQj5AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJTEpKRkdHREZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxOTE5KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE5MT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5SUE5NTUxMSkhHRUlJRUpIR0pKSUpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1NTUU5PTUtKR0VCR0pHTEpGS05LS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi418WFdTU1VTTkxLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toWFdrYUVSUVFQSTs7UlNSYHVcVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGRVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBZWltbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE1HTVJVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUExLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRD9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tLTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTU5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2loaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhIUU1LS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1NUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQTk9PV1FcW1tcXF5fYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVFJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OS1N1TkNCRlBQSEpLSUtQT09PTU9aYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0lJSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl1ZXV9eVV5dXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVBYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmRjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZqY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x5e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8ent8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFwcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnJzc3Jxb3p/b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF5e3BycXBxl4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycX2eenBxb4agfG9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcp2fdnB0nJ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwl6yQbn+jn35wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCOsah6iKagfXBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nzc5yzpqSnsaJ2c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4d3eBq52htqaip4R6eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e5KmmaOxoZuklHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19lZ6KlKyenp+agH9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCUo5yUnJuXjpuDf4GAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAfpqyqaObn5+lp5F9fH1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgYSVr6aepZ+fnqSorZ+Rh4F/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChomWprGpnpuln56foJ+jqKijl4eBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OFipmjn5mYmJ2dnqGfm5ydmZOMhYODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYeMkZWYmY2VnZuYlI2HhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYGDi5ach46bmoyHhoiIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKBhIuKko6FhIODhYWFg4SEhYWDgYKAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYGBgIiRgoKDgYKAgIB/gYCAgH+Af36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGBgoKFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiIiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBgoOEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+f4CAgICAgIB/gIJ/gIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fH9/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF+f4B8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7e36Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH9/fH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYKEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoODg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBg4KAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4GChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vLu/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0q2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtcqavLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqrDEooyAjcWdl5WcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzwJ6IrNa6l6GdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbunq5ulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbTBoJ2Wp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1qO0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bJ2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbTJjaGfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qzwqSqo6HDoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9ipj5Cs18KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cG/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpGXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoaCZkZKalpeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWnp6alo6CgoaCfmpOmr5uamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpqakpKOioqGenZqjioebnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKmrqSkpKSioaGem5ufoFuGnJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgqrSwoqOioJ6cm5qaqXBQi5ubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKuTnK6goJ6dmpmaoplTWo+cnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCjoWiXrJ+dm5qbnKpzVl+Pnp6enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enah0aKSjm5ubnJ+ha2JikZ6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qngmyBp5ubnJyikmxkY42fnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmapoR2cJOam5ydnYJqZWWMoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmaaNdXx8jpqdn5Z4Zl9ljaGdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmclZSde3+coqCGjH9gZpGgnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn6mcimttrqqhZ3+LemeXn6Cgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6aliHBfaqSUmFZne318nZybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampepmWdFSHSZg4VPRWB1gJSRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrYQ9Ojx4jHZuUTk1XnaCh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+mKNaXmxQeaGWg1NjakZneIGCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fp2MWZijb7a8sbyCeZp9TnV+hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2geIzczLPWsZ64vGVicmFgiIuOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjIuLiJKKmmizybTI1K+uuqd0i6lqWIiLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6Ganpyjo5NvqZuRwr62sZiNd13KmlWCj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqbOgh5B5lKyUjI99eXJnnZxjeJ2ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epqo54V4ONe3qAcG5rc3Z8fXagqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhqZ58aEtpdG5weGpoZGprbnqElqSjoKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqGjp6Gmrqanp6+EbGJLXXNub3dnYmNlX15qdH6Om6Khn52go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmtsLO1vLKWb2VcR1Z2cnN8Z2FkalpaYGNteH+KmaKioaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qorra4vMHDva+Ze2VkW0BdbG54e2thX2dbWGBeYWZwc3mBk6KonZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuzusbQ2tXGuKiWfWdiY1U9XmpsdnFyZGJjWVdcX11dYWhqa257kqWup6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vdLg4dC6pZKDcmFZW1tPP1dyaV5bbmxeXVdZWFpaWFlZW2Ryhp26yL63oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7zDyM7U0MCjfmFVU1VYUUZJgm56g39eVlhXXFtdWldgfJyyvMDGx7e3t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFyMjFv8WtimVWWFVRSWt1o6yjT1VcX2FcXWyQscS8va6psrertbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TDxsbAsZTEyNK7i2ZVVlFWZqKunU5WV1hbZ4ezt66wrbKmqqqqq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTAtrO+xsiwgFpUU1CZsZFHT1ZZcY6mvLClrbS1rK+lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcDCwsOhblVKjbaFRUtafqGip7Syray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTIy8asc192X0tXlre5wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPGxcjM1MyGSUxXoMnByM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbKzHtHhc7Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcC/wMelSp/SzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4vMDFr0+ZzcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjru/u8O1use3trm7vLi5tbrEyKpQkcm/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmszL3Ht7m4rba0t7mztbK6xcqeUojKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1652hL3Iz8LAuK61tbu9t7mxvsPHk1iDzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3aw0dHMysS1ur/EyL6+tL7Av4JmeMvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V2p8zMy83KxsLDy87BvLi8urB9d2u8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6zbw762vsC+vrqmnKqzt8PApnt5e57ExsvIwcPAwMnKwb+7ubGjkYV6r8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbdtrs69trnAvKp9bmhubXSCl5l0en6avr/GwLnAvL7FxL29uLKupKeSkp3Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d212e3FvalxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoKzvba1waSGaVpeYE5TW1xwdXmEo7i3wrqzu7e7vb+6u7uvoqitnqSBvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4i6GwtZxqZmdWWV9JSU1QVG55iamwt765srWyvLm8trm+tZaqvKuxd6zKxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxgY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmHe3aMoZhfU0NZVUhialVPRUpjkKSur7a6tbSyrLy5uLW4wb2Nor6vsHany8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQl6EsbWztbK0r6y7uri2ub/Fd4q0p55mqr+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dYSkpZeI6DY0FUo7mztLKwsa2wubi2u7e7vZKjs66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PTg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxUElJS2icgFpFVK+7sayzr66srba2srS1rqmnn5qbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OTw5OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t/UVhJS2FKVo5iZWSCr7WqsrSuqquvsLKzraWdkZeTjpegn6KgnKOkn56olJuWl4yXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yp9PQXOYc1BuSkxjZnV0YFxic5Gyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFpmfW9yW1FrY1xmYmBskbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXY2BkaVpaV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJITk5ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz9GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5iSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+MiISDiIeDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bV0tbN1NbX1NPR09TU08/SxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83LyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX1tPW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHLz83T1tLR1c3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNyszS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Ix8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBfX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9w8jJzsXDx8DHzcjEzMvMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vcHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8ws7Dxr6+tcG9xLu9x7vDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MbV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xu7awt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8x7nDtq2qqLCywLa4vbCxp7Gztbu8rK62pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlXV1tBTEtNSkVBQ0BGQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpaWlxlbm9oZmhpa25yga26sLWupaSmppqgpKCZnKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0vK+4ubayvMGywa6lqKOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqaot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhrb3KFqqWrpZ6coKSUnaSal5Ghoqmjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGorKm6qqSnp6insq2gqKefnKSmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVFlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+VlZqglZqimJWMnaGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXklXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRmZmZoaWtyjaeckpOTmpaaoJWVkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5KTj5OVlp6WmJOXn52hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmZiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlRLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgJSRk4uQkpOZl5yVlZufnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGFjZGmAkZGHj42SkJKck5WWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnJ+in5+XmJOJnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxcGBbV1ZWUkZQT0haXE9SSlRMU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXFxdXl5fX2JkbYyNgo+Ejo+NmJKTkpyaopyboampq6msp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK64pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9RTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZakqKedmJCPmp6ul5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVlcXF1han54fXOHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJmZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHRugoaBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVWWVtdampwa32De3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+XioCUiV87Vm98jJSJgIySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBsbWd5gHNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkVEQ0lOT2hZT1FTVFVaboJydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHp6aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgHx/dGZ2fIZsb2hzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmW5od36CbWpkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjnp3iX6JiI5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOKgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOh4iIh4iHoKuilomOl396goh5eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElMTEtOVmBjf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2inZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYaIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEQ8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKeoo6eaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWUF9VSUtLQUA/R0tGRUQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ube/t7q3uayssKWwqa29sLy6wsKsmbqok62Pl5eqiH2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqb36OhICNhG56c3iHYrmhmaKIlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLy3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qqGrjqSotoiBgXNgY2NfWGJgamdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj48SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+c316a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLSkhGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7Wz8nM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9hWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLL0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/iIGGe4dyg5KLjn1xeHVscXh+cXtueHNsaYFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4uMko+WhHmFkJCNiomHkYZ+gXtyfoCBh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI2Hj4B4hJSYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zp6+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlnt9amlcW1FUVF9IQ0ZJSD5BPT03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpORl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHp9gpGJhIV6hId6dX51bXx9hn5zfpKekZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+pjo/Dob2LnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPioeWm52PlZaQipKThYCLiJKNioqclpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMz9fQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfX6SpqSfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiJqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnl6mZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+s8XHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIaLiYWEkqe8ramyva+lrrOzqKOisKyKmrWeorilla2kl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho6PlJSIh5KWi4+VjYuNl5mSnZm0lpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u728xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgU1FHRD89Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLSsq7O2jKiyrq69q5u6pKituberpqaioaOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKebsZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81tDNxMqJdnVkX1xiXU9LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnuCf3F+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762zrLFvsO7s9HJyMG1d3tvX1pebFROSURNS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu76nur++vMO4rMGprLO7vaqwqaSlo6yutK22taCgrp+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOpqKKyrai7wMSvpbO3zMC5rsOzu77Bua3CwsHAmXB7Y1tZXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtPNzs3LvMK3sLq8tLzKvMPBtre8rbTAubytr6igqae2ra6psreanqyip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmWaZo5+zpZajlqytq6ecn6eXmJaYlaGkqKaetqypurzDtaa0tsvBuKq2rLO7uK6ouLq9uINucFxaVldQR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycWdeXFBSTUVRUVBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjKycjMzse+urOvubjAwc21yLrAuLW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC/uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpaClqpOSmZyJlZyinpaxp6qrure9s7Kuvrm2n6OnqKWmnJysqamNZWhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG7w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1u6uprayvo6KYqrS6pqqnrKqdqK+npKurvryorLyzuL7GvLe1uMCwvb+zqbW2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn5+lpKqSlpWghJCen5yVqaWiobS1urWtqLWysp6coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/uMHDwcjEv83Gu765srC4s7/DyLXAsLy3ubenpKurrKGgmqqqxKKlqaymnqyvrKKqqL+4pqy9sLe3xra1ubi+sL7BtrSytK++o5ajlpOblK2fkKGhpaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqaCbq5+hjZqVn4SOoZqbkqWkmpissbaxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57Fq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKmuoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rrS0tKKcpJWRk6Ctn5ihnaioq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OZt6Ofs6KhnLCYoI+alJ6Cj6CXlo2ipJWQpq6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLC2rrG1r7/FtbqxsLq2rZqpsamqmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5mnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKGTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhcaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDFvsrFtsDJwrWrtamxuKzAxLS3rq23uqWZq7Krqpifppetu7WbqLCbrZ+utLKnqrqzp7qzuLK4wKq3ssK8tMWnva6tt7Wpp6yhl5aRpaShoZeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6xsqWppaKempqalZion56Yop6usqKmjZivmaWsmJufppKdj5WYmoaWn5SMkJyelIupqauip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqevr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qralrbutwcO3uKqtsryjla2wrbKXpaiRqrmqoKewnaqfsLSzqqm2tqy7rLOyubesubDBub2+psKrsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWpKCXmYuWmZSWl52TiJCbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhSUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvKGqsKqjsbippbWyq6Gstb2vs7i8ur23tsHCv8nEucXDwcC5xb7BuK+2p6u3sry/v7WqrrK4n5esraitl6ipjqe7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6Gfkq2gmpmHlpmMnZqdk4qNlpeal6emo6CelpaXlIGQlYV7j5OEjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVJoXE5ZXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLajrKmlrq62qq60uaamsLjGt7G3vsHCtbS7xb7MxbnDwbrAusS4wbmztayqure7ur61q66xtpiYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6yp7WvtLq8ybKqtbSxtK+upqCzn5morKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5ieraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpeRi5SSnpqlo6OhmZaTkpZ7jJGFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejq7S3yrq0u7q/vrW0t8PBzce8xL23v8DAuMC9sr2up7q6t7fCt6yusriVl6auq6ejs6qUr7qkrbKxpqeisrOxsrG1sbeyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmJSxnaebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgl4STl5GenJiXloiWj5eaqJ2koZOWkpCWd4WRh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2krK2rpqOwsrOqtrC2n6u1usi5rsG7w7ezsrXCw8/EwMK+tL3BwLq/vbPEqKq5sba3wL2wrLOznaCnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraanrLClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGkJSUnpuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamvpKejs7SxtLWxsaGrrb3Muq7Bu8axtK20wsPRxMa/wbO+w8K8wLi8xaitt6yzuLzBsayyraGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpJ2XnpirnaGnqKGspqKsq7exsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI6XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GpsZyoqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcTEusG0ycSsr7eusrrAv7SurqulqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWjqaisrKqsoKimprGyo6aloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmknJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6Siqa+Yqaittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrrBusLErrG1srS7wb6zsq+tq6yotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irpp+rq6i5tqmpqamhqZ+tm5GooZ2go6Kmoqqdm6a0rqelqaKjl6Wmp6qcoqOjoJmYn5GOj5iNfoeNh4WenoiFi4uPj5GNhYeWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdRRTuVja+gpaqsmaqkra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0MC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWopK2zsrivoq21sa+xuaq4rqqutquqnqmroKOhta2poZ6vsqG1qp6oqKqjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGXiZGdkJOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessba4sqanurWttLyvu6WtrbWrrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rtK+tnamjoK6bmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZmSkIuCj4V9j4KAiJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltoWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycjMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6aqq661t7Sqnbq7qLG/srqgr7S2qayerrGjnKWnqaOdnKSvpq+hn6qpp6GpnKOooK27p66xrqCroqOtnp6sppifm6GinJ+amaKqopqZo6OVlpOeoZablqasi56Rj5GMgop/f4+Be5qUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKyL+3wr6vtL62xLbDsrC6sbLAtru+uKm5uL2qpLSmqKqvrbiwqZm5vKOtvrSzoa63taemp7CzoJ6kpaehpJmerKionqCqrqegppeiqJ+wuJ+jsa+hq6GtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Ph32HfoKNfHyhjIyIeYSNhYqNjYWJk5qOiZWfiJCVgoyXjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLXFx8C2v8K5sLW8tr67v6+svrCzv7K9w7mpu7q4p6i1qKerr6uzr6WZvLakq7q1rp+xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6SitrChprCrn6ujr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6g32DinmPl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmleZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5Xl5tUUVYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra60w8O8s7+6t7Gzube5t7qvrsCztLmvv8G4rL26taaisqmnqbKqrbGgmsC1pKe1taiesrypp6Wpr6yZo6ecpKWUmKGxpZmfpKipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY6GeYR6g4V9nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmleak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqORjaSnm56enaO1rKequrenrMTBtrCso7Wup66vt7+/vLLBt7Cusra1uLa2raq9s66ysb2/uK68u7Gln7aqpaWzqKqtnp3Aq6ilr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImKiHmFdoGCgp2Ii4KJfX+FiIeGkISWlZCOkJGQkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamNrc1pfWV1tZGFOaVhaYFZKR0lLTVJYPjlfbGlIQ1VTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7qtwLKurq62rrK4s6irubGvrrO2urawuL2spp61qqCgr6OprpyiwKCxo66vrbeutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6p66ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnSBgYqYhYd8iYmFhYqMipKElJyTko+QkZaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuurKqrtqqzuK2ls7Wyrqmwt7axs7W6pqmftaidnqihqKyap76YraOurrS1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXWBhio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6GpnrOqnqGjm6WmmKu6laWlr7K2ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+joqKdlpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtpbK0rq+zt6qppbCtpbSznK21trSmp6izsa2yqK6dqqCyqKCjopmhoZqts5SjpKW1vKasp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CjmJWTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYPUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6W0pae3rpyzsraqpaSnsq6usaaqnaeksaOin52Wmp6drquUnqKfs7mjqqmira6loZ2bmqKnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aWkpeSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKnqbCrrqmpsK6jsLqvo6StsqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuWlZaamqyllpuhnrOyoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qqytra6mrbGpoa67qqCntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqpudlZigpaeanpyin5ugo6SjlZuel5mdoqmbpZmcnKKglpORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurO1p7Gwo7Cypp+ttaeap7mto6+xoLO0sKCknp+nqbCptKikm52eq5eYl5WXlZWgqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6agm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m6s6W0tKGxsaKfq6+kl6a5raSxsJy0uKqgpp2hqaSyqKyppJmbmqielZSXmJKSoqeflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7G0u7SkuLOes6yfnqirnpSntauosbGrrbSkm6mgoKihtqemqaKZnZSkoZOSm5iRlKKlmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZSemp2gmJmblpehoJOXkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0nq+knqSnp52TqrCpr6m1rKqvoZihoKalpLqio6uglpuRoqCUk56Zk5een4+Ni6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2VoZifn5Kel5yVnaGVlo6rnI+ubXK0cqmMdoqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW7sK64tqrBtaiooJulpKGckaqpp7WjsqivqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVlxqeV5qYWVnYm14b1lbWUNBQHJAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0I5p5ueobyil7HDsK2qq6yxp7ivtsSxubCtua6twLGro6Keo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5qeqKOznqOljqeilKKanJeVo5iQr6CSlKmehZCZtX+PkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZqjbV0cnF3toxegHp9imiDeW15Y4uscHWFf1lbp2pFZVpUZmBjXmNRaGdxbXVCTVBMRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqWbpaqblailpZuZoKimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmbpXiHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYGNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUk9ERU47SEg9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOZmaKnrKKfq6KasZuUp6CWlJ2fnZexpJehqJmckZ2coqOYpaGanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiWmqChmpyUoZ6NgnqkhmxqfJB8gHWKioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2tvem1gY11waE1YWmZqYFdacHpubWZTT0ZTOU9ZTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrbCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJeWp52qm5ygrJihmpuhpK+moaWon66Yl6ecmZqgnp6cr6CcoaaVl5KYk5+glaKdmKCOlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZido5aak5GejX+OZqGzr4WKhHZ7kop9dnl6b2Z6kYGAiWt1gXmIc2lzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUERfVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqrorKtvKOzm5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqadqJqfo6qTnp+doKmvqaWjq6Kum5+goJiknpyfna+jmJ6ok5eWm5CjmJennJqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIjoN8aodZXmx1ZF1ziWlrfHFrY15STldKZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2wvLGppqOtrrCerJago52imZmmq5yto6WoqbKtnpWjj6Kvpba5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokZ6hnaCqsKqrpKqgqpunn6egq5Whm6WwpJebqpWgnZqRpJadqZeefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJujIFvynp/m3eRg46BdnqBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprCrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOpo5KgoZ2dra6prKejo6ehpqWdraiRpJqorambnKmbrKCVlaSVoKKWnH/OlHh6pIF5lZabX66PXo6ngaKgfaeWm3Srg4CvXmONqnunh4WgdZeTiLNjgquGoY6Ns2qFr3R9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hZCRfm2DkGFybHBoYF95ZFxxaGpkZmBSVFJXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrprKsrKqjqqavqqCnm5mklpyir5+gnqino6Whn7Csmp2Vp66ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+UoJ+cna2vp6upnKeopKKrkqyylqWiqqqdo6akobCgkpmmmJ+Zk5SRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdkWFNcYVlRU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2rqiwpqiqpqyrq6eio52ZoZSgpaufoqWgqKiinp2wrJealqmnrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqKmxopKWo6SZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCo32pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxqY11XYGlYWFVMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK6prKKnpqmqq6mkpqCbpJ2cpqeno5ysmqKsoaOfr6Kcm5OrpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqhs62hqrOxoZqop66utqKSlqKmmJqRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG9bZmpycGWBa15hWWNtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuKyqoKWaqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7WfopeTqaq1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtcOys6qtqJOIlpykmqGjrqaYoZWYnKWmq5uwna6opp+so7esobG5r52arqaysrKkk5enopmejoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KLdXtzhX9xXW5ueHJqgW9bZF9obmJkXUxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6qp52mppqjp6GzrqKpp7KgmKmklKK1oqKVl6GptLmjm6KdopOPobGYnpunpaGir66dpKiitrLEsa2pramRh4+bp5yipJyll56YmZqmpKmar6KupaaYr6S7rKG2t62dnbSxt7Cyppedrp+inYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2UjXh9eY+Cbmp5aXlyboB1XmVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqrS0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISNm6GgpqKVmpqcmJuZpqSmmKyorqOlm62mvayUvbCsn6Kvsrmqs6aaqLGippd5qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmYCsiYWuhZ+UqqGhl4afgJmVgHuSfquAnZqWi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI17e4SYf2xuf2N+dG6AemBnZXFuaGdoQlphWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbSfmqygrbilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKaeppqsl5ePrKGhnaWhmqScrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6mn7Ktp6iXdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZeYfHqPnn5ldX5ihHh0gHxhamZxbWZlZk9WZFxCVV8+Sig+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqS2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iaoZ6kn5mjo6WZn6Opsqm9r6SonpyOfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp66rKurlICpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpx7ZH57ZI5neYJ7YGtla2piUGFbU2pcQFVhQ04pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubK9sqKdrqWlsqadjJilv6q4sqihv6anspyesZy6qJ+tr6WmlJSwrJeMgpuRrqWirKCjnKqgl4qjkqaep5yaoaiimZ6hrK2pua2oo5qXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7Sqr6mfuaatrZlzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCWd2eIeGmOa3l/eWRsY2ZsYktkWEprWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytp42XrqmPi4WVlq2epqqgnaOjoJGLpJKnmaiZlqOqoJacpqansLqrrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2qprairLaViqCopbadiZajmYepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjnNqkXdxi3h3fHpqbGRjb2RVYVlAaltIY2FPWStGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam1p6mRmK2ii4eJj5uolaykn5innp6SlKOXqJqomZSmoaOQmqeZoba7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKyoqLK3n627mJGlpKa2opKep5+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmoh7c5dzeot/cnx/am9kXnBqYVtgWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKKvsqyuo6mmrZ+ntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuaejlJmqnI6Giomco4+unqKVp5+gkpaYm66LqZaPqJmojJipj5+6tqSlmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyn3d5n6mwuZR1q6OeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoCAYWmHipSSi1p1lJBoaI+Pc3ummppmepqIhHmZaoSLg295gGtxZV92cGxraFtnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqK6jpq2kkpartrCyp5urpqyXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2OiKaaqZGXpImcurSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7unoH6nonqirbWAjo2lnoOLhpCxqq+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXl4SamWN5h5CEjo+Ri4NtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+Ui4WFmmuOjoVseHtxcWdkeG9qbGpbZWtqZXRcXklUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWhmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isn6iwpqappZmUrsi+saKXp6m2npCEnaycp6KgjZC+npmNn5qgkHyGjpmYiKycoZWfoJGNk4mGgJGnjIainaSUmJ6Gn7qyp52bko6FcHWQiZWQipSQj5uLj5GfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgrCsgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6Ocg5qBjo+Hi5pxjpOFaHd0fHdoaHZxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq5+jt7CpqqaalKCjpKukl6WruKOwgKGonaWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPno+HnqSclpqYh6O5rqSanIyMfmJtj4uTkI2QjY2YjI+Rn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbVtvjH1nWmCDf2JXUG93Zm10c2tqb15rcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRoLa7q62imZigoqWtrqGdrrajqJOhoKCnnJqOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5qPipipmZqbkoimsaeilZqIiYBpboiIi4+OiouNkoyQkaKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+0dHNbnrKDamJvdHZxaW9Ya2xycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3tK2toJqinaOjpq6dnLKurJOYoJihpJmalJ+rm4uIkniLhXGAlo6Kj6GQkpSdl32QiY6ooIeYjoqRo5Scm42Lqailno+Xh4R+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkJRRk83VkNSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJqrubGvrJ6mnJypn5+vnJ6xqa2dl6OaoaCZlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkYqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbnN9lXCadGukXZV2SGVkYXRxfn5uZmBsaXZ7ZGViUl9XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCumYRUXqCms7mysqmaooycq5ycqpSirKSiqI+enZ2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcn+IkqGbc5GQgYiZlaGbhY6pnJqVi4uKfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm3B6e5hsnHx4l3NuqaRnYWV6cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0r7Ojm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI2PiW9/ho+SkmyWk3yJkpOlloOPq5uUkouFiXqDdoeAboGfhneAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJqQe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t2hZttdniYapl7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVk1ZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+TobKqrq+1oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg41/mKB5dY+IjIFphIWSgoyFnY16jYuWppODmKmYjZGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6euo6mwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJicc3SJfZB7ZIKHlYqJlpmCfIiHl6iRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lIZ4qXOlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnnq2MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3JicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2opq6kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5KHhpOOfXuChpmmjn+mpo6BjoqFlHaCh5JvbIupgIOLlI6JnJ+JjJSqop+PgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d0cpR1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bm1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaLoaKapqSYpZyroqGEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7mI90coNwloV7fZKLhoaQhXl+gIeapY58p6GLhpCQhZSDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+fqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFufqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenFnaGV7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3x4dWRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6dl56YqKOifoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gIx2hYuChZeKcW+AcpiGhH6ThIOGioF6gYWMnKGRgqaiiHiOmIiUi4ucl4WDeqyCkZeZlIqenYeIoaueoaGji4iTm5yjmZaqoaemoJKbh5WNe3eNjYOnfn+SkZKTnLKmm5WekI2ykpeEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGEeW2DhH16mWpyaGF0inB9end3cHd0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH9+f4V7bYKMhnx5eHt9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiUmJiUmKSgnnuAmquOn42GoJyLnpZ9eZSDe46ZiYaEhIZueIGAc4GIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4esn4Ryi5CGkpGLnZF9jXuqhI2SmJaPnJaHhpumn6GanYaCkZqZmJCapp+lnZ2Qln+PiXV7ho2DpHp8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF+g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqDhIxzf4l8fHJye4eDeniKjoOSpo6Fg46Ag4qJineGiYqMfnFtf4F8bmhsbWhfen9ofXx2dXZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbXVueXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZWpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1si4met5qho5+RkZWXi5qfn557eJ6nkZyKh6SUi5iZeXqNhXyJkYOMgoKCbnx/eXOBhX2LkH1raH2CmImAh418foaEhn2PgpCcnZKJqZ2AcIyLjJOHoaKKhYx9qJGIkJKXk5aTeIyjn6Cdlpl/gJCamJKMmqOho5qXkZp9jIN3f4KOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfYCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36WfYeKcoGGe3xxeHqKhHp5kIuClaWTi4SPeoaGh4V2goSJiHxnc31/eXtxbGtnX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZYCBa21+aHBxa315h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjo+Xj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2g4V+ipF4Z2N9hpeKgYmMeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabh4yJg6aVhZOLlpeTkneRnaChl5OWeX6OmJeOlpqdpJ2YkpSaeI2EgneDlo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8kneLiHt/hXx7cX53iIV5hI+JipeilYGCinaIhIKCd3yCioZ4YXp5fXR/eGdtZWF/amp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodWlub2d/fYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Ml4eGn5OXmX14qpyKmXqXnYuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqnj4yOipOhkoORkJSXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl42VlXOMjYlrhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx7fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfoxzj4eDeIZ9dnd/fIWAfIKMg4uTpI94g4F0iYd9gHR2gYmFcGJ8dnpxfW9ib2NkfGNub3ZzeHdzdGF1YG9sdW1vXFxfXl9qXlBdWWNhaG10e4hrX2lmamNod4huZmxpamxngH17d26QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGip6LlZh+d66ZjZd9n5ORlpSId357in17gHZ4f4BwdHR8b4Z9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiZOSnZOmnJWCfYJ8jouSpImOio2Ym42GkZiTlo+KiIySnJKPi4xug4+PkYiemaKhl5aJlpFuh5iDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx4fZmTfYOIc5CJgHOHeW5/fYCFe4WLiIOLlaiMeod7fYuFd35xcIGGhGRpeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtcllaX19ha1pQV1hlY2dxcX6HZl1qaWdiZ3GNbmRpZ2RpaYF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgY+dh5OddYGqlZOOh6GMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgYCghpGLk52YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi4yNjJyJjY+DbYmLkJCKnZahnJeUhZiHaoOigmWFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIg3mTkHl2h3NviHuFi3qKhYKHjZujh3uDdYGLf3d5bmyBhIJec3VzcXB4Wl5xYXBrXnBqfXtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda25kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNg3+XlIOQoHWLoJSShoubjJWOi3pyeHSCcHKFc3F1iGtvbXZtiHaDfoBtblVRgauVh4J3f3dzgnqCoYKTgpWUmZyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4edhI+KfHOLhYmOiJyan5uVlH+TfmiEm4ZnhaCHkYORgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWdzbHOHlYp+h4V6k45xeYNvdox6iYt5iH2Bi4+enYR8enaBi313cGpsgoN6YXlxbm1ydFZecGJyYWBsbnpxaHBmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgHiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXRwcoRwa2p3boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDlHeVkpmckZl7lHOFkJ+hk5ORiZKblIZ+lpaIjY2Iko2InH+OgHd6jH6JjIqcm52blZN5jHVmh5CGa4eihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuNiIqTkYl5hXx+bHtlcm9ra3p5W4B5kI6Aen1+f4aOenpocmpzio6JgYWEfJSKa31+bn+LfouGfIN5gI6UmpqKfHV3g5B4cm1ncYCFbmt1cGhqdW5TX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaBdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW9/c2VleXF9bXl9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqQnZaDgZWQhYmQgJGKiZZ+h3p1f4l4h4SOnJuYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2HkIGPhH2BeH6QlZOYkHRyd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXBybVpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3BzanCBbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaLm4mOapmQkJ6WlIGJcYWJoI6Fi5WKjJiUfI6TiIOJkHuQi4WPgX92eIOEcoiCk5yXlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySg4V9f4OAhIqCdWFza4iAj4qBfn6RkHxtgWt4hY6FkYJ7gHx+kZKQlohucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfH+HdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGaooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2Ryf2lmbXh4XF95e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2uaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh0g4V1gn+JkZydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0d3ZrY42Bj3+FfnyEf4SIfm9ecXCEe46LgXt+kId5cINmeYKKhouCeoN9f5OOj5KEbm55i351bW5sbHt+Y2lsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxnYmp1elpgeHx6bXF/ZWRoZ1edj15xc5a8xIR2cZSKkH9zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5OIdYmFdnZ9gXF1hoGelYaVj4KCcX+Hc4N6iJabloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqNhYqBin95goCEg39qXXB3enyLiIV7gI5/fXKAaHiChoqFgneCe4CXjI+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZY6xsndKYlqk2dCXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSVgG+Kh3F0fXtqeYaDpZGEk42Dfm5+gnWCd4WZmJOKko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foR1Y3BzgGh5cW91mI2Fgop7dniAhHmBalpvfHJ/h4OIfYWIeohygG1wg4aNg4Nxg3iAmIyNhHdtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFbW1lrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2xvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+gIWCmYqBfI2NaXhya2xmX2FveW1fYm95XWRsg3phcXZfZWXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt1ZnmCg6iMg4+Mg31tf3R2gXiEm4+Lj5GSjIuGfnuSh3iAhI2DbIBzaX9+eG18e4GKg3hheYSBcWRxaX5tdHF0gZuLgH+EfnN1fYBzgG5aa310eImCinuGf3yIeHlwa4eCjoKJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pyZUxbc3JlW0pxeHBeW1tZXHV/dWhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaHB4fo5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvYGFsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZhvcIZ9aHd5bmV6iISlh4GHjYp+bn52fn97ipiGgZOQl4iLhIl8j4hxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l7dH1sV219dXOKgYZ3h3WBiXp3cm2If45/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3lrWFlZWmBxgXVgXV1hZ2RoaGZOWmhOQWFkXGB2Ylx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcnBjZl5ZZ19wcGBhaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N3fpCPgneVjZSPh4KIeomJa3h5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3N9YVV1e3FziYOCfIJwhop3d29vgoGLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFlzbWJRT3R5YlNYWFxhcIJ0W2BcaGVkY2pkUFtxSURkYlxjcV9cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd6k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3GAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdpCAZ3BuX2RcWGVZbXNhYWFxbGxoiW5gc2lZXmRtgHep2qrHhoezcop5cI52fYiQgXqUioB1dHV+d4BwcX5thXSUhXh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdH+Qi4NylYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsfllWcnxvdIOGf394a4iGc3hqdH+Cgnx5fHd7coqAfHNndGRti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN1d1lRVlhdYHKEb1xgY21kY11uYlRdckdDZl9eZmldWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVWp0ZGBbaG9wZ4dyYXFmV11ja398ys6HuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7am11Y4R2koF2b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB4bXtcWHB9bHN/inyBbm6Jf3B2ZnZ+gH6AdXtxenOGe3lxZXJgbYyCbHNYa194XUlvbE1XVl9UVXxrYU9UdnNRUlRWXWJ0hWhcYGtqZmJZbmFYY3BHQWhdYGZfXFZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3eHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bWJ0h2l0fHJ6hId7fo2AeHhzd297d2VqbmCHdY6AcmliX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQh3KTh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qCdGx0Ylttemp0e4t6gWZ0hn1tcGd0fnd8fnF7a3l7gXl3cGVsYWyJfm1uVmtgeFZLa2xPUk9pTll9Z2JOVXZsTVFUVV5mdoNmXWFwaGdhV2ldXGxpSkVrWmJkVlhVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZXBlX1hjc3VpdXBkZWJXXFxogHBvcoBziWVleX9qdHZ0dISFeIKEend0dW5renBhZ2tnhnSNg21mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2lnuHhoKGg311cHJtZ3VdbWlfbHVkZ2Zpem97cllngXZ1Z3CAeIJ2YneFi3yUgG6Lam16gHBlcmVga3hmcnaJen1hdYN2aWtxdHpveHhyfGV9fn54dm5jZWFshnxta1ZqYnJUTGlrUExOcEhee2ZhTlV1ZUtPU1dga3d+ZV1nc2llX1ZjV2JwXUtLa1hkYVVUVXNXTVl2ZVpfa2BcWmNlX3dnbWJwaXRvcX51dJmBeICAeIB+hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amhtaGBiV19baYBpa2+AZ2xhaXp5anR1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRoZlhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kI54dW59bXF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2J3hIR4j4VziHFweX9xYnBoW253ZHBzh3t4YXKAcGdpeHNxa3d2c3Vignp+d3VwY2NjbXx9a2tVaWJnVExtaVBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vvb1dKU2hYZ15YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZcXGuBZXJ0fWlqXWx3dmh1d3Juh3x+fnp2c2x6Z2l3Z11kc2h6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBve2Z4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXZjdYWKe4eHgH93cnV+c2BwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIN0eXl1cWRhZG1zfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3lbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9gImMhn52doZ4hox9dHV1gnl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66Me3uGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15YWlxse2Nxd3ZtY1tudHRodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc31hY2lcVVheYmSQpWh5dIKFkHhsbnhmd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR1ZXKDkn+Hg4h6dm9xfHFhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpza22AdHN8cnFiXmVtb31laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doJ4fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFhgbHZkanVqal9bbXRybXR0dGuGfX+AfHdvbmxkaXBjW2tyZHR2jnNcV1NkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHtsZXZXW2ptYnBygHpzZW9+W2BvcWJeaW99bGpyfXFwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmFe2uEfYCFmX2ChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVlhVZ2l0aGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZGtvYV1ubWRzeIhrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SJcmpneW5lcnVxemt5c3Vuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3BuUlplamVxc4B2c2JsdlVicWtbXm5kfGVrdHxxcnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAenWAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2xleGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3R6dGpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5CLipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6GjIWKioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2NiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIeFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OSkpKSkpSSkZSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKTlIOFlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOg5KRkZONdYmTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkY5vf5KRkXx0iZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkHhqhJGKc3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pe2dxjoRydYePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI55XGh1cGRviI6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qKhmRpa1xnamuDhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnduY3VsW2p1bmVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Bnb29mbHJ0amJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGJnanJvcXNtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SX2NlbW5uamhSUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9NTVVja2dsbW1nZVlRT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFRUtSXmhtZ2xtbGpqZmJcVVBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhGRlNbXWFmam5qb21ramtrampmWktKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz9AQ1NeY21sbG53cmppa2hfVE1GRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tCTmJtcHpza2pgS0ZCRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTw6Pk1gdHBjTkM/QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTs6NjhXZkE4ODs8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PDw8OkRZOTw8PT0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8Rl09Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213STg7Oj09QTxLYj08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndONzg4Ojs+PldpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUlye1o6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WHuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUNERURDV3WGh4d+WEdISk1MTk9PTEhHSEhISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7enx9fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbUFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NjY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNTE9JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTkxKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyLi4qNck5SUE5NTUxMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0VCR0pHTEtGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1FTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpVRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpLVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdOSEdAQTw5Nzc2OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25xdHd4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVES01SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJTEpESUlGR0dDQztBQEI+QEBCRURJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDRUVJRUlKTEZJSUdGRkNCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTE9NTk5NS0hISU9SUVNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJDQ0NER0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1DQj5APTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEJBQUM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lKSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8QENCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5uXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBBQkA+Q0ZHQkZDRkVFRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRHRkxIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGS0lKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQkJHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tZWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENRYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTR0pPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNCRlBQSEpLSkxRT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cm1uXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Fha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhRUExOT01NU1JST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUE5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeV1RQWVJWV1dXWF9bZ3JeW1tZXV1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVJTUklITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFpVVFJVU1RVV1hXXVpeYV1bWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZ21zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUVVRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUldWVVdbWVpfXVVYXlxeXVtdYWFeW2JiY2dmZGRiWF9gYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFdWVlZZVFhYVVJSWVdWWl1ZXV9eVl5dXmBcW19fX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcW1pXW1tcWVpbZHFtaGReW1lWVVdRTE1WUk1OUk9RUk9MUFNSVVpVU1BQTFBYV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF5WXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1FOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVlXUE5SWlNSUVNSVFVUS1JWVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl5eZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFlbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF9eYlxgVV1eYmt5dGx9a1pVWVVRUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUVdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFliZmNmZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUFdWV1dXVlNVVFhcXF5gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYF9lY11laWRlaV9mXmNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1gWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NeYWZlWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1hXXFlXXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9en16e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fXx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7eXx9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzdHJxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnBxc3Bvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3F0c3Jxb4aEbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF4g3FycnB3nX9ucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcXahiHBycI+hfW9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb5Wqf3B3oKF9b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwj7GecIGloX1wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCMtqqRm7KmenFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdaCno7OopqV4dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCqJ+jsaObpI96eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fI+jkZOlnKChlnt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19jqCYlpmclpCZgn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCPsaqln6GfoaGDfoGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAg6SuoaehoKCorJ6Ffn1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AhY+nsaScp6GgoKKjq6mcjIKAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoubqaqjnZqinZ+hoJ6foqWhlYaBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4KEh5CYmJaXmZyMlJ+dm5yalIyIhIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KBgYSGjpaXlYePmpyWjomHhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBiJKXjpSak4aHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCgoeSloqEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBgoKGlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf3+Af35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4foGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX59fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH18fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX19gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn99i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt8fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx9fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIi4mFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH+Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3t8e3t8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoKBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYSEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCgH5+foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX98fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf3+Dgn9/gH+Bf4B/fHp7enx7fIKAf4J/f4CAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Bg4ODgH9/gYGAgoGBgYCAgICAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoCAf36AgX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYCAgICAfH9/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH5/gIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoGAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoCAgIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4ODhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEgoGCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4ODhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWGfXeFhISEg4KBfX9+e3x7fnt8fH1/fn19f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH98e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWChIWGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhIaHhYWEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeFh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHh4eFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYiDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhoWGgoODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag397gH19f4J+f4F+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2MmqqpqampqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7WoqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qxz5iHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZs8iZkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbS+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm1v56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatcaWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbPRmpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qw2aWrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9XMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubi4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm4uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlJqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpSZmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkKGsl5ebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmp6Wlo6CgoaGfmZmalpibmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpaWkpKOioqGdnJyiaombnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKltqmjpKSioaGempmlgVaOm5qamJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgp6qwqKChoJ6cm5qdolldlJqbnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKaigKuln56dmpmZp39VZpWcnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgoKCfqnd2raKenJqanKRrYWmVnJ+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaiMaYyrnJubnKCXbmlrlp2dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qjkXl1n5yanJ2giGtpa5KfnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZqao5R4fIWYmpyemX1qZ2ySn5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmqCci56AfpignIWNgWZtlKCdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqcp6GRcWWmrKFogY15a5efnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYoa2Sd2VmppeaWGd9f3idnqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6eleE5KcJuEhFJEYXiCnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampermU43PHSSfXBTPzZheo6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrXNUcFd8sKmZWmduSGt9iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+lqRchZt8ysWxxZ1+nXpQeIKCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpKRcs/XzdWmnLm8a11yXWeAhY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gnyZd5rRvcfTx8G0nHelqGNiioqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLiJKMm2+ippW5rKKhiYV2YciLWoiKiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoJ2Ek3yPpY2Fi3d1cGyml2GBj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nln5YcoZ5eYBta2l1eH94eqChpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpqKerqYVwUmB0cXJ6aWZiaWtwfIWiqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKjsJhwaU9WeHZ0fGhhZGZfX259iqCkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCjp6Kmraewsql8aWNJUnN1eIFoYGNqWltia3WDkZ2hoJ2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmttbq8vayKbWdhQlpucH1+bmFfZltZYWFocHh/jZqgoaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qnrrnBxszFt6WOcmhpWj9TcG9xbHRoYWFaWF9jYWJqcXZ7jJ+nnZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKq0v87Z2866q5yIb2BhYlNDSnlrYGJtbFtbV1pZXVtaXmNmZmh3j6Wvp6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vM7a3dTApIp2ZV1ZWlxTSkNtapSelFZUWFddXF1dWFVXW2l+larBx7q2oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9wMbO0c23knVkW1laV1NJVW+qs6ZOVV5hYl9fX2Z3kKe6vsHFxbS2tqmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsG+vMzEsJFvXFVYU1BTobWbTllbXV1gbY6qusG1uamnsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZK/v87OvJVpWFdaTJm5k0xUWVdgf6a8sKarrLKmqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAt7O8wca+qXlYVVGKt4ZMU1VdhKCmt6+lrbS0ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e9lmxSWmlaUVJklKufprSyray4tbKsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGyc7KnFZIT1Brrbu3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnL0dOkUkxgsMfAyc3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbIzopJk87Mx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcDAwMWqTqTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24vMDEr1OczMTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEyapUk8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmty73Ht7m4rba0t7mztbK7xcqfVYvKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1692hL7Iz8LAuK61tbu9t7mxvsPHlFyGzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tL6/v4VqesvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLi8ua+CfG28yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uqzbw762vsC+vrqmnKqzt8PApnx6fJ/ExsvIwcPAwMnKwb+7ubGjmIp+sMjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtrs69trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGvp6yXl53Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x2e3FuaVxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoKzvba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uvoqyyoqiCvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6GvtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZavwLC1eKzKw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2Np8KysnanysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FeI64qZ9mq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSkpZeI6DY0FVo7mztLKwsa2wubi2u7e7vJKks66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjk7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE0/U3hxUElJS2idgFpFVbC6sayzr66srba2srS1rqmnnpmbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t9UVhJS2FKVo1iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXSYcVBuSkxjZnV0YF1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFlmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1dfX19PX0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrNwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Jx8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDJxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9x7vDurS9xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7Gztbu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaSnp5qgpKCanKWrrqSooquqrKuwpKafqq20trG9ua+3sKiuuLSzvLi0vK+4ubWyvMGywa6lqKOrsbKzqL2qq6irrK61s6WorqGkr6mypqiorqaot6yxsre6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXV1hQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGorKm6qqSnp6insq2gp6afm6SmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVVlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnKCin5+XmJOKnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxb2BbV1ZVUkZQTkhaXE9SSlRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbYyNgpCFjpCNmJKUkpyaopyboampq6msp6mmpJmlr6WVmaWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK63pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dmJeVhIB2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han54fnSHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJiZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWViHyDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHVvg4eBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3h0ZFdNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH54fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdampwa36Ee3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk390b2BcT1NSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d+c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bmdfXUhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hiXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjXp3iH6JiY5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOLgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT06ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh6eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnpuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2hnZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoiShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKenoqeaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtLQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ubi/t7q3uayssKWwqq29sLy6wsKsmbqok62Pl5eqiX2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNhG56c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDln13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLHr565qqGrjqSntoiBgXNgY2NfWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttXmFdWl9hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIyJfIGEc3uKg4V7iXSBioeVf3N7eWxtdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NG3r8O8xLmltrrDooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KiouQh3yEgnB/iIGGe4dyg5KLj31xeHVscXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfZF5YYVNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkYh/b3Zya3N9e3Z7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBZVVpUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zpq+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlXt9amlcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX11bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOMlJSUj4uPiYeWm52PlZaQipKThYCLiJKNioqdlpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqmygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlFHRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqq+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdnVkXlxhXE9LQ0xARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO6x7u6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dntuXlpdbFROSUNMS0pJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IycrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6yutK22tqCgr5+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZebpaOpqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9ycTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2ip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaZo5+zpZajlqytq6ecn6eYmZaZlaGkqKaetqypurzDtaa0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcbFyMfOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKycjMzse+urOvubjAwc21yLrAubW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC+uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq6+lpaClqpOSmZuIlJyinpaxp6qrure9s7Kuvrm2n6OnqKWnnJysqamNZWhiYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1uquorayvo6KZqrS6pqmmrKqdqK+npKuqvryorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn56lpKqRlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensKsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEv83Gu765srC4s7/DyLW/sLy3ubenpKurrKGhm6urxKKlqKymnqyvrKKqqL+4pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqKCbq5+hjZmVn4WOoZqbkqWkmpissbaxqqWpraycmKChko6QlamflGplW2JeUEpJS09NSEZDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm53Eq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKquoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJmhnamoq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OYt6Ofs6KhnK+YoI+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZlxlYU1KS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLG3rrG1r7/FtbqxsLq2rZqpsamqm56moajCrZussZyqoq6wqaSnvbemtrq8r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5qnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUl5SagJKhlo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2dcaGZLSkxLU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrFtsDJwrartamxuKzAxLS3rq22uqWZq7Krqpigp5etu7WbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6ysqWppaKempqalZion5+Yop6usqKmjZevmaWsmJufppKdjpWZm4aXn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfemVqXWxrT1FOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qrelrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoKewnaqfsLSzqqm2tqy7rLKyubesubDBub2+psOrsLeuqKqrpp2YmKqhoqCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWo6CXmYqWmZSXmJ2TiJCbmZSOqamnoKSbmJuTh4+Zi36MloaOm2tqbmJublhSUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC5xb7BuK+2qKu3sry/v7WqrrK4n5esraitl6ipj6e7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSonqSXkJifsqqzqqqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6GfkayfmZmGlpiMnpqdk4qNlpeal6emo6CelpWWlIGQlYV7j5KEjJdmbXNocHNfR1lmVkRDTlhEWjlIQjY+XVJoXE5aXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS3wbmztayqure7ur61q66xt5mYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6xp7WvtLq8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5mdraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpOZjZ6cmpeRi5SSnpqlo6KhmZaTkpZ7jJCFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6yusrmVl6euq6ejs6qUr7qkrbKxpqeisrOxsrG1sbiyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquZyVj46LmZ2imJGYqKOgl4SSlpCdnJiXloiWj5eaqJ2koZKWkpCWd4SQh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMK+tb3Av7q/vbPEqKq5sba3wL2wrLS0naGnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGjpSTnZuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa/wbO+wsK8v7i8xaitt6yzuLzBsayyrqGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqoop6boqyVpZ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI2XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcPEusC0ycSsr7eusrrAv7SurqymqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqqhk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCIhZ2gjYuPjZuQkoyEjZmlnJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCYqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS7wb6zsq+trKyotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irp6Cqq6i5tqmqqqmhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeNh4WenoiFi4uPj5GNhIaWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+gpaqsmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWppK2zs7ivoq21sa+xuaq4rqqutquqnqqroKOhtq2ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeViH2NhoSFpJaGg4KMh5CPkYWGlaGXiZKdkZOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NUlpnTkxWWWVYR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46xoKSlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqmoqb2rtK+tnqmjoK6cmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZqTkIqCj4V9j4KAiJ6Ph4B+jIeSj5CFgZSblIaToo2UkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsZmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqqOdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6sppefm6GinJ+amaKqopqZo6OVlpOeoZablqasi56RkJGMgouAf4+Be5qUjIl9f4yHkJCMioaSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6yZn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6sbLAtru+uKm5uL2qpLWnqKqwrbmwqZm5vKOtv7S0oa63taamp7CzoJ+lpqihpJmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Qh32If4KOfHyhjIyIeYSNhYqNjYWJk5qOiZWfiZGVg4yXjZF9hHtzcHxxc3RgeXhqb3FxcGt/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7K9w7mpu7q4p6i2qKersKyzsKaYvLajqrq1rp+xuK+ppaevspuhpKCko6GWm6+moZ+jqK+hoKKTo6SitrChprGrn6yjr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6hH6EinqPl4qNh3qCiISJjY+FjpOYjI6WmYqPl36Gl4yPeoB6cHF2bm90X3h3ZW1sbGtqhG9mcmlrZmleZHSBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Gzubi6uLqvrsCztLmvv8G4rL26taais6qnqbKrrbGgmsC1pKa0taiesrypqKWpr6yZo6ecpKWUmKGypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY+GeYR7hIZ9nY2Jiod6gYSHiYmShZaTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqSnm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBt7Cusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Aq6ikr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GhmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfYCFiIeGkYSXlZCOkJGRkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwbKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqrpyiwKCxpK6wrreutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6qK6ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTko+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9urGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7W1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vb2tp7ewpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKanmKu6laalr7O3ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqepvsOvsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqhopqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKnsMK9srXAtbe+wquns62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2bmqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3q7O9vrC2xLK3usGnqbCrrqipsK6jsLqvpKSusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrOzoqucoq2toJ2Zl6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qautra6mrbGpoa+8qqGntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqZqdlZigpaebn52in5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurK0prGwo7Cypp+utqiap7mto6+xoLO0sKCknp+nqbCptKmknJ2eq5eYl5WXlZWgqZyZlqetsKijno+toqaVnpecoaWhmaKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m5sqS0tKGxsaKfrLCkl6a5raSxsJy0uKqgpp2hqaSyqKyppJqcmqielZSXmJKSoqeflpKlqrCmopaTrZ+kkZSgm6Smn5WbpqahmqKfrZqgnp2QlZuhnpymlZ2WmaKflZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52VoLmwl7TBraizqKmyurezuL+5t7G0u7Skt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWkoZOSm5iRlKKlmpKPpq2vpqCVmamfoY2RopmopaCUmaWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV5xc15KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmpq/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0n7CknqWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56Zk5een4+Ni6iwr6adlpuopp6LkqSXqKunlJapp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo+rnI+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY1xfb3piVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpyeu6GcssCurqurp7epuK+1wLW7r664tqrBtqmpoJumpKKdkaqpp7WjsqevqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmZScrKmVi5OlmaWtopCWqrKjn56mq7CYoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYWx3bllbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueoryhl7HDsK2qq6yxp7ivtsSxubGtuq+uwLGrpKKeo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enk5CWpJykrJ6QoKirn5ufqKOznqOljqeilKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZFlTZmBjXmNRZ2ZwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqabpaqblqmlpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXmZgS1pXZ2NfT1ttdWlyUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqu0o76xsqagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOamqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHWJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11wZ0xYWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVl5KYk6ChlaOel6COlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZieo5aak5GejX+OZqGzr4WKhHZ7kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3VkeWZgaWVjZGZrWWx7b2lqXFJMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp+doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5eWnJGkmJeonZqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoR8aoZZXmt0ZF1ziWlrfHFrY15RTVdKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2xvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjj6Kvpra5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWgnZqSpZeeqpiefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eRg46BdnqBgHlxen+HcXiFjZN5bniUY2ZfeWRgZYJjXnRnbGRiV0tVSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKCWlqWVoaKXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Srg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i3YYOtWaLNbpB1e9p7f5lwfoiSdn5le4h2dmt8iG99hZGRfm2DkGBybHBoYF95ZFxxaGpjZl9RVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrprKsrKukq6awqqCnm5mll5yir5+gnqino6ahn7Csmp2Vpq2ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+VoJ+dna6wp6upnKeopKKrk6yzl6Wiqqqdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaufoqWgqKiin52wrJeal6imrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqeno5ysmqKsoaSfr6Kcm5Oqo7Wwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlaKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG5bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqKm1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtMKxs6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7Okk5enopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KMdntzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpp7KgmamklKK1oqKVl6GotLmjm6KdopOPobGYnpunpaGir66dpKiitrDDsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2Ujnl9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqLO0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLaqwrCpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6KwsrmrtKaaqLGjp5d6qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI58e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomaj66xrKaeppqrlpeOrKGhnaWhmqScrZigqKa2qL+vpamkn4uAjZuan6aekpSampSamqalpZuqrKykpZ+qqL6klsOsqqKhq7K5qq6mn7OuqKmYdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHqPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoaaYrZGYjqiaoZ6kn5mjo6WZn6Oqsqi7r6SonpyOfYublqGgmY+RmpuSmpipoKKaqa6opqajpam7nqDGpqSooau0tayupp67rKyslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKCjm6iel4qjkqaep5yaoaiimZ6hrK2ouK2oo5uXknuHmZKmm5OOkZiYj5iTqZuhmaqpoaqnoaOqu56oxKKgrqOqs7Sqr6ifuqeurppzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlphyaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epqqgnaOinpCKpJKnmaiZlqOqoJacpqanr7qrrJqbkpJ7hJaNpZiNkZGYlI2XlaiVn5iqpJuxpp6iq7mfr8CnpLKlrLCxqq2rpreirbeWiqCopbadiZajmYepmpCUnZKpspmao6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmZeWjouTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjXJpkHdxi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpLS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5uolaykn5imnZ2RlKOXqJqomZSmoaOQmqeZobW7qKuYmY+Ne4GUjKGUipWRlZCQk5elkJ+bqqCctqOep6u3p67BrqO2pq+vsKypqbK4oK68mZGlpKa2opKep5+NqZ+Nkp+jrK+aoKOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmYh7cpZzeot/cnx/am9kXnBqYVtfWG1jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOvsqyuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco5CunqKVp56gkZaYm66LqZaPqJmojJipj5+5tqSlmJqMiHmClIybk4qVkpSQjZKXoo2en6men7ijgISvtaKvr3WkvaOyn3d5oKqxupR1rKSeiYCqf2RcYnagjqSehJd9bpOznKOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lJBoaI+Pc3ummppme5qHg3iYaoSLg295gGtxZV92cGxraFtmZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mJm56Mq5milKagnI2WkZ6Eda2OiKaaqZGXpIiburOnoJmXiol1d5ONlpOKlJGQlIyQk6CPm6GnmZyyloCMm7Wds4ySj7unoH6nonqirraAjo6mnoOLhpCxqq+MipajmnmAi6yGnJ2hp6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWJ5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+TioSEmWuOjoVseHtxcWdkeG9qbGpaZWtqZXRcX0lUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpiXh6qboJSen5GNk4mGf5CnjIainaSUmJ6Gnrmwp52bk46FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgq+sgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWSho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6OchJqAjY6GiplxjpOFaHd0fHdoaHVxaGhrXWNwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkIaqmJmamaCEj4x3mpuOno+HnqSclpqYhqK4rKSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbFtui3xmWmCDf2JXUG93Zm10cmtqb11qcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWjqJKhoJ+mm5qOmbSZkIufjJWLdYGUkoyKppWTl52dfpKFhaujh5qPipipmZqbkYelsKahlZqIiYBpboiIi4+OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZiylXF8l5+zdHNbnrKDamJvdHZxaW9YamxycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7KurZOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GPkZOdmH2QiY2ooIeYjoqRo5Scm4yLqKilno+Xh4R+a3uHfn2PjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeZXKh+eLtqfalbjoRds2dcbnJ6eGtpXHBqeHljYGZYYkJRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56xqaydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJCTmI96ioSVo5yKlI+Gi56SnZ2JjqijoJqMkYqAgGmAhnh/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbXJ9lG+ZcmqjXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl9XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRTXqCms7mzs6maooycq5ycqZShrKWiqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yQkZaIcn+IkqCbc5GQgYiZlaGbhY2onJqVi4uKfINshIVxgaGMeIaNiIeTmZZ8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm294epdrm3t3l3NuqaRnYWV5cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3j4yOiG9+hY+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneAk4eImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGeYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVkxZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg4x/l6B5dY2Hi4Bng4WRg4yFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZaIiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJibc3SIfI96Y4GGlImJlZmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjomYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhH6Yk3R0hXKSg2x/i5GHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlmVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZmxxdW5aW2JsZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYVlaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gYx2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOLm6CQgqehh3iOmImVi4ucl4SDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3cHd0gV1eb4Zobl5eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR3anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2Gn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYaCkpqZmJCapqClnZ2Qln+PiXV8h46EpXt8jpCRhpiqop6TnY+Nqo2RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSooqLhZqEhIxzf4h8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWhfen9ofXt2dXZ1e3dcX3B9bnRfY1tdXlFnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J0bWxVY3F5ZXB6e3Nlam1si4met5qho5+SkZaYi5qfn557eJ6nkZuKhqSTi5iZeXqNhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImAh418foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx9qJGIkJKYlJaTeIyjn6Cdlpl/gJCamJKMmqOhpJqXkZp9jIR4gIOOhqB/foyMj3yYpKKik5mQj6aMjoCakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIuClaWTi4WQe4aGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoJtc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6Xf4yiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgYmMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh4yJg6aVhZOLl5iTkneRnaCgl5OWeX6OmJeOlpqdpJ2YkpSaeI6EgneElo2dfoGJjYxyl6OfopOZjo+hi4qClpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3aIhIKCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R2fXF8YmNhc251cm1hWmFeW2xlUmNYYWFpbHZ5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaIc3RuZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqWnIuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipOhkoORkJWYkYuBj5ifmpKPkHN/jZKUiZ2dnqaYmI2VlXKMjYlrhZePmXqHiJCJb5eem6STlYqNnouGgZKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW1vXFxfXl5rXlBdWGNiaW10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6inh4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9npOQlpSId357in17gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Ym42GkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBth5iDZoWYjpN6iISQinCVmpSjkpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4CAh3tkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFd35xcIGGhGRpeXR1cHxiX3Bha3RecGp7eXlsc3BleF1ubHNtcllaX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6CMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiVhZiHaYOigmaFnYqQfouDi4F3k5iSn5GQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHSBh4J4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYKLf3d5bmyBhIJec3RycHB5Wl5wYHBqXm9qfHtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThouajJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J3f3dzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4iehI+KfHKLhYmOiJyan5uWlH+TfWeEm4ZnhaCHkYORgolxg5GYkJuOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB3gox8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi312cGpsgoN6YXhwbmxydFZeb2JyYF9sbnlxaHBmZ3N0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eVkpmckZl7lHOFkJ+hk5OSipKblIZ+lpaJjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN5jHVmiJGGbIiihJGIl4KFY4yRmY+VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+foWNenpocmpzio+JgoWEfJSKa31+bn+LfouGfIR5gY6UmpqKfHZ4g5B4cmxncYCFbmt1b2hqdG1SXm9kcFlfa3F3Z2trYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uvm6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlouQnZaDgZWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6PdYl1bYWIin2KooOQiZyEhV6Lk5iMj4mOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gH+Ei354ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH+CeX+PlZOYkHVzd4iNdXNwZ3Z6hGN1bnBiaXZnUWBxZ2xVX250eWFyZF9ofXByblpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapmQkJ6WlIGJcYWJoI6Fi5aLjJiUfI6TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWGfm+EgYmGmKGCk4ueg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzdmtajHySg4V8f4OAg4mCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kJKQlohucXmMhnVscGtzeYJgdWpuXWt2X1FkcWlmU2BwdnRgcGBdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqHc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGZooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBpYGZhf9W2jpCmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjYGBio17j419iIR6dHqDe3GHgZaajpOUgYh0goV1gn+KkpydhZSOn36IYX+TiIWJhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0dnVqYo2Bj3+EfXyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KEbm95jH51bW9rbHt+ZGlsalludlpSaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXR4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qemp+GiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWNnZ1edj15xc5a8xIR2cZSJkH5zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1h4KelYaVj4KCcX6HdIN7iZecloaTjZyAiGV9koOAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3Zya2qNhYqBiX54goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqEg3iDe4CXjI+MfW5seol9d3RvaWh9d2VecmNYcHNTVG5zaWJOZ3R4ZmBeXVhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfl5+ZhYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFkZI6xsndKYlqk2dCXcnuRi5F4f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYaEppGEk42Dfm19gnaCeIWamJOLko+UhYdvepKEfoODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BzgGh4cG50mI2Fgol6dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aNg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfnJhWnhaWXJtTlhyc2ZgSm12dGFeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3lgcHZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt0ZnmDg6iMg4+Mg31tf3R1g3mFmo+Lj5GSjIuGfnuSh3mAhI2DbIBzaX9+eG18e4GKg3hieYSBcWRxaX5tdHF0gZuLgH+EfXN1foBzgG9ba310eImCinuGf3yIeHpxbIiCjoKJcYF4f5WKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl5YHN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn52foB8i5eGgZOQl4iLhIl8j4lyfH2FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l8dH5tV21+dnOKgYZ3h3WBiXp3c26JgI5/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeEf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdGBzb1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5COgneVjZSPh4KIeomJbXl5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3R9YVV1fHJziYOCfIJwhop3eHBwg4KLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW1fc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh1bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdX+PioNzlYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGFieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsf1lWcn1vdIOGf394a4iGc3hrdX+Dgnx5fHd7coqAfHNndGVti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgYmxkY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dxYHFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB5bXxdWHB9bXN/inyBbm6Jf3B2Z3d+gH5/dXtxenOGe3lxZXJhboyCbHNYa194XUlvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGppZWJZbmFYY3BHQWhdYGZeXVZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3aHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBcmFrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFsf4GPhnKUh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGh1fnd8fXF7a3l7gXl3cGVsYW2Jfm1uVmtgeFZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFvZ2ZhV2ldXGxpSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxmV11bXFtUZHBlX1hjcnVpdm9kZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bHp6j4R2l3uHhoKGg311cHJtZ3VdbWlfbXVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgW6Lam16gXFlcmVgbHlncnaJen1hdYN2aWtxdXpweXdyfGZ9fn54dm5jZWFthnxta1ZqYnFUTGprUExOcEhee2VhTVV0ZEtOU1dhand+ZV1ncmhlX1ZjV2JwXUtLa1hjYVRTVHNWTFl2ZVpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeICAeIB+hYR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amltaGBiV19aaYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnppa3pqX2VuaIF3kIRnZVhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbHt8a2tVaWJnVEttaVBHUmxFYXhlYU1Ucl1LTVVZZGt3emVfbXBpZFxWX1VvblZJU2hYZl5XTFRrVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXaAgXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paW1ViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6aGp4Zl1kcmd6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXl1cWRhZGxyfWpsVGleXlVMdGNRR1diR2N2ZWBLVHBYSk1YWGdrdnpkZW1wZmNaWF1YdmZTSVxjWGhYWEhWZFBIYnlbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4mLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVpdWVbZ3RmdnaRel9dU2VmaoKBc31hY2lcVVheYmSQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8cnFiXmVtbn1laVRoWVpVTnlgUktaWUhjdGNgSVRtVEpNWlZpbHJ7Y2xsc2NhWVpbYXdcU0pjXVhpU1ZHWGBOR2p2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcVlNkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5B0a2p5bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW97a2tzfXJwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFJJUFpVa2trfGVtb3FhW1pYWWxwV1JPZldWaFNURllcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uEfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SKc2pneW5lcnVxemt5dHVuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5ke2RrdXxycnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWGVTU0hZWlBOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35thIB+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXhib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpgS1htZF94aG59ZGBVXlRddFtUUl9mTlxhVFNKW1lRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5KPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoeIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIyHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjYeFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yPjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSkpSPjpSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk3yGlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPfo+SkZOIc4yTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJB0dpCRkHh0ipGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkXxofZGJdXaJkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6QgGJqin5sdIiPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53XmpmaWNsio6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLhmRvbVtpcmuBhoOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvY3FvYWpzcWVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGNla25zcHJ1bGNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGBiY21vcHBtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01PX2hmbG5tZ2VRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFZkbWZqbW1qZ1xTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHR09VYGhuaGxsa2pqaGRfVk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVNeYmZoam1sc3BqaWpsa2pmWEpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4/P01ZXmptbG55c2pqbGZcUkxFRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o+R1lqb3dwa2lZR0RBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0RYbWxfSEE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzdTYz03ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8RVw9PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj09QTxKYTw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndNNzg4Ojs+P1dpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5GanVNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUpzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZGR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1JTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fX1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pJQEZBQUBGSEVKT0hRUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9BQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRU1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVETE1SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZGRENJSUhLSkdLUk1CTk9NUU9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2ppaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dXZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpgXVVYXlxeXVxdYWFeW2JiY2dmZWRiWF9hYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVlRXXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWJiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8eXx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzdHNzcXB1d29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3Jzc3Jxb5CDbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF2jHVycm99oHtucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXKdlXFxcZWie29wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb4+viW95oqJ6b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwiLKmdoqspHtwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNs6ikprGodnFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdqGho7Smm6R8c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCp5+cp5+jo5J6eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIuhjo+YmpmblXt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1/iKeno52gmpOYgX9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYCNsqepoqChq6aEfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIB/iqmun6mjoKGlqaSMfnx+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+BiJWqr6ScpKGgoaGhqaugjYGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoODhoybpqOdnJqfk5ihoJ6dnqGglIWBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChIyUlpeXmZiHkJ2bm5yYkYuHg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgoOEjJaZlYmSmZySi4eFhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBhI+XlJaZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4SRloiEhYODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYeRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJKAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+Ti5CBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX58fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+BgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKCgYCCgIKBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fnx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY6Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY6Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15d3R0gICCgoKCgoOFg4SDgoOEhISEhISBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHp9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSEgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWFgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX19bU09PT09PT1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLe909PT09PT09PT09PT09Pb4uLi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6Oiq9PS0tLS0tLS0tLS0tPR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tPT0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Mmqqpqampqampqampqaiw0tLS0tLS0tLS0tLT0tLg6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0tTU1NXV1dXW1tbW1tbX2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/Pz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0NChlsvSx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/KnJaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzv5ugqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZssyjoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZmMfJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmzyJyVlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWat7Gar7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbexnpuinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qyyZ2ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9evjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD01NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Njc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLQDs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT5IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUE/Sk8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QUNDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODY3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a3tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3trW1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDQ3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKinqKilpqioqKeop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qopaanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenp6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uanKKgmpaVlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSnaCXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanp6ainp2foaCXmKiilJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmpqalo6CgoaGfmqB0j5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaWspqSlpKOioaGdm6aCYZSZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKktrWlo6SioaGem5yjXWaamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgpqWTsaKhoJ6cm5qnhVVunJmanJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCteoytn56dmpqcpmddcZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCfqY1pnKednJqan5dqZ3Kdm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaSWdH2pnJqbnKKLa2lwm52dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qglnt3kZ2anJ6cfWppcpuenJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmaoKB6ioWQmZ2ekoBrZnOan5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmpugl6B9cpmlm3iOhmlym5+dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZmcq5+KcWCnqZ1heol5dJ6enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn62NcGBpopCTVF95e4WgnqCgn56dn6Ggnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6endEVGbpeAe1A+W3aEnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5apmkxERnCVgnFSRzhgeI6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCVrHVdeF+Dtq+lYnZ+S2p+iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/kqhgjrOMzsOswKWAlXpSeoKBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foqXctDWydetn7qzY2RwWm6Bho2Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2Rf5DNtcLOyL+slHyqrF9oiYyOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLiJKLmHWYoo20qp2eh4JwaM2AYIuLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoZ2KkHqGo4yEiXd0bXaji2aGj4yYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nmX5bZoZ4eH9tamh1dn13hKOhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWqqKeqrIdxVlt0cXJ5aWViaWlwfIujqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmZ6lpaKisJ5xa1JSdnd0e2hhZWZeX298i6CkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqiwsqyAaGZLTnB1d4BpYGJpWl1ia3WDkZ2hoJ2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mttry+vayNbmhjRlVub3x8bmBeZlpaYWJncHh/jpqgoaKYlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7zGy83Gt6aPc2hqXEJOcG50bnNnYmFZWF9jYWJqcXV6jqGonJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKu0wNTd28u5q5uHcGBgYlVGRXVuYF9tbVxbV1pZXVtbXmJkZWh4kqevpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS0t8XS2dbJrpF4Zl1aW1xUTEFraoyYj1lUWFdcXF1dWFVYYHKJobLFw7SyoKeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHHzdDEoH5pXVlYV1NJVGyns6hOVV5hYl9fX2Z6lq+/vr7AwrK1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsC8uczJuZdzXFVYVFFSnLOfTllcXl1gbY6qu8GytqemsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZO/vMvQv5hqWFdZTJK3lk1VWVhgf6a8sKarrrOnqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAuLO8wcW/qXdXVVGKvY9NU1Zbg6Cmt6+lrbS0ra+lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e7jWNRYX9lUFNgjaqfprSyray4tbOrqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGys7CjVJJUFFmp7q3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnM09OWTU1cqsfAyM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsfKzX9Jj83Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcHAwMemTaTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24u8DEsFOezcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3tri7vbm5tbrDyKtUl8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7q0t7O7xcqgVY7Jv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncGtzZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K92hL7Iz8LAuK61tbu+t7qyvsLIlluIzcLCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRud2NnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tb/AwIdofc3Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLm9u7GBem3Ax8TAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bw762vsC+vrqmnKqzt8TApnx6fJ/ExsvIwcPAwMnKwcC8urKlloh5s8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZur869trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGupquWlKLKw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oz0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoK0vba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uupa2yoaWHwcXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZmxvq6zeLDJxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2PrMS0tHenysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iJBuTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/GfpO6q6Joq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vZSntK+nd62wqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxT0lJTGmdgFpFVbC6sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGdEU5x+UFhJS2FKV45iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJuZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTg7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXWZcFBtSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmaGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotXU0pmpFlmfW9yW1JrZFxnYmBtkbWwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVqcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojs5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkQ7Qz5GPD45Nk5+qrKno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIyMrEzMzMzs/Fx8i2v8rA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUy9DU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOztDL0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9xb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJy8vPy87N0M7TzMbJz83Ix8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxfenyhkYuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHaDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2hwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlma25ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubayvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVlbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmJOKnpGNkpOWkJiYk5yho52koaKVoKKlppujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZyjlZugo6GXoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWV9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mfnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiZlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io16kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdampxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhCPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSAjZyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcYB8aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh5eW9na3h+e350bGVeW1teal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSUlLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZGBbZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnpuOkpWYo6KmtrCdkZmoh5aPjYGIbHNzfYB9cmlgXWJgYmhkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKJlXp6fYV/aGFoXGVjXmRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKebtqiMpI6Rkp+GeIKDdlpiZVdmYmJkYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wsKsmbqok62Pl5eqiX2CfWtXZGJZa2VqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lLSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIsJ65qaGrjqSntoiBgXNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36DgIN4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttX2FdWV5hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNwZV5eXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfY11XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4fJ21jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiPg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGfJuIlI+uqpSVmJ+Zp661vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlXt9amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlve3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY+KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WMgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPgIOIhaSGjJCzmJ2SlJehoZ6ZkpydqLK5rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXlhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29teIt4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iJCliY2TqZqXk5aZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyZn4qQkJyamZOYmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlBGRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdXRkXlxhXE9LQkxARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5KZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXlpdbFROSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZugoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Kuvrm2n6OnqKWnnJysqamNZWhjYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsPIycXCzsjBvbmyr7m0wMLKtsaxwLy1uquorayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucopqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEvs3Gu765srC4s7/DyLW/r7y3ubenpKqrrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqaydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpJS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr7KyLa4tbSws7S3wca2vrC4tLq2oKetqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZVtkYExJS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xMq9sLC2rrC1r7/FtbmwsLq2rZqpsKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSU1LU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZion5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBxsG6qralrbutwcO3t6qtsryjla2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnoKSbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC4xb3BuK+2p6u3sry/vrWprrK4n5esraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2VoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6emo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZ11GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6Wmp6qcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWppK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop5+nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiZKdkZOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqZqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIaTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZDWHttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpLaysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQl15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O3r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WdnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiZGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i2qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpuanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Bq6ilr7KprLW7nqmpq7GlmJ6pnaekkZimraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGZnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlZCOkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwLKurq62rrK4s6irubGvrrO2urawuL2tpp61q6CgsKSqrpyiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqJ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+puMK4vbytp7awpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKammKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqgoZqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYm6OplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xmp6crquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ2mp5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqipsK6jsLqvo6SusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZaamqyllpuhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmgpaSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZaQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKikm52eq5eYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKnm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJmbmqielZSYmZKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5iSlKKlmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknqWnp56TqrCpr6q1rKqvoZihoKalpLqio6uglpuRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmpoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm14b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxurGuuq+uwLGrpKKeo6Kcm5CppKqypLWmraWflpmqmaasuJyirpiUoJCln5KMnKOel52bkZWSr7myrJWXo6enk5CWpJykrJ6RoKirn5ufqKOznqOljqehlKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52rpL2moKqXlJyQoZqRj6KooZOdmJOXlLK1t62YnaOjooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fWJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuws6u0o76xsqagoqido5uZmaymr6Sktamlm5eVoZqmrai9p6imlZOblZ+ZkpekqaiQnZGPmJywsr+sm6edpqGIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11waE1YWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlZ+WramlwJ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnKqekJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZiepJaak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3RkeWZgaWVjZGZrWWx7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbCmrb6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlrfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjkKKvpra5pa6jjo6aoZmTkpqgmZmllXulraKos8S4pKKnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopOmrau3s6euopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF5lJabX66PXo6ngaKgfaeWnHSrg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6Whn7Csmp2Vp66tsauorKCUkpufpJKPnqWYnaejnq6kq7CpwMezqKmxrpaSnZuhl5+pqp+UoJ+dna6wp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52wrJealqinr6yopqmel5Sao6GRk6Ctm52mo6+so6y1qrrOsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kcm5OqpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosq23ybK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZuflI+lrJGZm6ejoKmmrqGkp6qwtcKys6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKK1oqKVl6Kptbmjm6KcoZKPobGYnpunpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46kraOdkJqaqrS0pJ2km6eRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6Kwsrmrs6aaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXl1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRYWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmZlgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuYmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6XkZ6Eda6PiKaaqZGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWlFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaSUmJ6Gn7qyp56bko6FcHWQiZSQipSQj5uMkJKfkpehpZaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWiqJKhoJ+mm5qOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmZqbkoimsaeilpqIiYBpboiIi46OiouNkoyQkqKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARF9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7GtrJOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GQkpSdl32QiY2ooYeYjoqRo5Scm42LqailnpCXh4V+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56wqKydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGcc5GQgYiZlaGbhY6pnJqVi4uLfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJmFmamgoaSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneBkoaImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2lJVk1ZVFZdaGtuVmdXTUpCSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaW1loZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6dpmXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlbYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dG90Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaenoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRrammAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXqqhI2SmJaPnJaHhpumn6KanYaCkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqEhIxzf4h8fXJye4eDe3iKjoOSpo+Fg46BhIqJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbGxka2pogYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enJlam1si4met5qho5+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4aHh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaChmJOWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNYYGFoa3Z5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5igmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6GMlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAd3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqSfIqAgm51cGxtb3B7hWlzg46YinF3gHSCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h5b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHOLhYmOiJyan5qWlH+TfmiFnIdnhaCHkYSRgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6MjYR7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHh6jX6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgoWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4WgkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6Pdop2boWIin2KooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEc4eCk5uXlJeGjHWHf3CEgYmGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBio17j419iIR6dHuDe3GGgJaajpOUgYh1g4V1g3+KkpydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpSanJpYlFicndsYmVeWmqDbXNiW2dfZGxgblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXV4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5zaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmSjYZvbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYWDpZGEk42Df29+gnaCeIWamJOLko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aOg4Nyg3iAmYyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViHyDeG52h4WDl3duiIRsdXt0ZnmCg6iMg4+Mg31uf3R1g3mFm5CLj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hieYSBcWRxaH5tdHF0gZuLgH+FfnN1foBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaUxXZlE9XmZdXXZmX3RwW1hUb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6fnJndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn51foB8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOKgYZ3h3WBiXl4cm2IgI+AhHJ+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhXUnRhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJziYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVVlR3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdYCQi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp3dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGf394a4iGc3hqdH+Dg316fHd7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3cGdefIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inyBbm6Jf3B2Z3Z+gH6BdXtxenOGe3lxZXJhboyCbHNYa194XElvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piXn54eYqEZnF9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2x5d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnJ7a3l7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFpTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1aHCAeIJ1YXeFi3yUgW6Lam16gXFlc2VgbHlncnaJen1hdYN2aWtxdHpweXhyfGV+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEhee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTVh1ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeH+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19baYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHVig3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXhmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1Vvb1dKU2hYZl5YTVVsVEtbeV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnhaXmBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXdcU0tjXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5veXl6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0lydFhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVxemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RQSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHZaXmVsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnV1XF5lbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FERERERTkvMDAwMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlZWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OTkpKRkpSIjJSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZCSkZKTkHeMk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQd4mSkZOAdY6SkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJJ5bo2SjnR2jJGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkX9neJKHdXeLkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6PgmFphnpodIqPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53YGtiZ2Rui42NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2RvbltqcmyBhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndwY3BwZGtycWRoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGRlaW1zcHJ1a2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWBhY2xub29rWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QXmlmbG5rZ2NRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFVkbWZqbWtpZlxTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHSU9VYGhuaGtsa2lqaGRfV09OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRFJdYmZoam5sc29qaWpsa2llVUpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PktWXGltbG55c2pqbGZbUUpEREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o9Rllrbndwa2lZR0RCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0Zbbm1gSUE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzhWZD84ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E8RFs9PT07Oz0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxJYDw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTUZGdndNNzg4Ojs+PlVnQDs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRLOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2KChIODg4B9XT5AQ0BBPUlzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg399hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKi4FHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1JTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlBRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUVFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk1MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo4ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJEREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QEBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFSEtGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEdKTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDREVJR0tKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpHSkhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExNTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRUVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLTElMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VDRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJR0ZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVtSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXmJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVddVlRQWVJXV1dXWF9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVtVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZW1dVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXl9eW2BcYFVcXWlqcn1zbGdcVVhXUE9SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFpYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl9cW11YW2BhXmBkY2RlZWZiWWNlZWlnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZnamdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cW15eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmhqZ2NhYlxkZ2BcaWliaGlmZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX15bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGlnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJiYuMjIyMjI2If39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyMj5CQkJCQkIx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV0dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHt8e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3Nzcm9+e29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3VycnJwc5h7b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0lXxwcm+IoHZwcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCUoXVwc52gdnBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxb4mxkW5+pKB2cHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwg7OpfJCvo3dwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNsaerqK+kdHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdZ+iorOlm6N6c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiApZ6apZ+ko496eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fYqikJCXmpeZknt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+hqappJ6gm5WVf39/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCKsaipoqGhq6OCfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gICAiqeun6ijoKGlqaSMf3x+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CBiJaqrqSbpKGgoaGhqaqfjoGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoyapqOdnJqglJmhoJ6dnqGfkoSBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4qSlZiXmZiIkJ2bm5yYkImFg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYKDjJaZlYmRmZySi4eFhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOCgoGBhJCXk5aZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4WRl4mEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZOAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+Nl4KCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJObhYKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSSkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fHyLnI2AgoGBgoKFlJSLgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjI+BgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhoaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHiImIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4ODg4WJiomHhYeFhIWFgoCBhISCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFhoiIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4OFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn5/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fH17enl5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2Pjo2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+AgH9/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJi4mFiJKPjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enp5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4CAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKBgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fn5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgYCAgH1+fn+AfXx+fICAgYCAgICAfIB/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICBgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+AgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4WEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYaGhYWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4WGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOCfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgn1+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqbO09LS0tLS0tLS0tLS2ZE7REREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKSnzdPS0tLS0tLS0dHR0tmUQEhJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM7T0tLS0tLS0tLR0tLZmU1UVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLV1dXV1dXV1dXU1NTV1dDLy8rKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6znqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWroZqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ai5uhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5nIedlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqKPnIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6SlrJuoiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izLa1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nAo5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqKOrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKjJkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKinqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGempubnZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpWXlpqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJaeopKYmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpKWop6ainp2foZ+eqZ+QlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaSlpqalo6CgoaGep3mOj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSrsKOkpKOioaGcopZhkZWZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjqrCroqOioaGemqZzX5eamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoa2SqKWhoJ6cm52fXWSam5manJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCol4Gsn56dmpikiFhmmZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCgo6Rvm6SdnJqapXliZpicm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enp6neYekm5qcnaB4a2aTnZydnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5ucon6AnJmbm52VdWpnj5+dnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmamqp/fYmTnJybiHFoaI6fnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmZiif4aCgpmenIFwYmiOn56dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmXoJubfHqbo5uAh2tlkJ+enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZm6mciGduraqMaIOBbJSfnqCgnp6dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6CmiHRfZZ6Wgldye3qbnJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5WinnRSTW+VhHhJWXB3kZSRjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGPp5VTOUB0iXFnRTpVb4GHhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAiqh5TmhUdIt3ZU9VQ193foCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKgX3WMYn+nnohdhntRa399hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2MlmO51I+9uqm3h3R8aVl/hoqOi42QmZyUlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLh5KJlYKBz8Sc1a2asJ5fgnFUepGJiZCPjY+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZujoZxuj7qkuNGxqK6TbLOnVXSUj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqbCjdI2VfrG8s6uVh12WxGxvnKKhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6iqr5KLdnunl46Pf3pqbZF6b5ajqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOhoauUfFtpkX57gHJva3Nxe3uUnaKioKGfoaGooJyeoaWhoKajop6koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmraenoqynfWxTW3dvcXZrZ2RqZm54gY+eoKGgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaioZ+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mutLe2ubauj2pjT1Zua2tzaGJkYltgZm92gI2bo6WhoaKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqptMLGxsjHv7OmknViYEpPb3FtdGdgZ2dYXVtgZ2xvdX6Jk5ykn6GhmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuywNjh3tXGt6qdkXxnYl9GUmpucXhoYGJpWVteW1xdYWJhYGZ8ob29qKSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1tr/J1dbHrZiOgnVlYGNcQVFsaHV2bWJjZFpZWltYWVtZV2eNtcC/tq6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHI0M2tgGZdWVdcVUJKcWhtZ3JnYV9YW1dZV1RTYo68wri3u7C1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxcHBwL2OZlZVV1JIRHRrYmBvZ1lbWV1bXlhjjLrFvqWlsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZTHyraFXlZUT0diaICLjFZVXWBhXWKDscG5rrKnq6ioqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAtrXJz6NrVVVRU1+YqaVRVlteXmaVwLemq7O1ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7dm5raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPKun1VVFRMj62eTVRXV2iWu7Sxray4tbKsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8XHw8fCi1hRS4awk0lPVWigwb2/uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxMPFx8mndE16sopHTnitzM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMDGy8OTZH1kS4PJycvQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcDAxJNQSXPJzsTI0MGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4u7/FeUmgzcS/v8m/sMG/ure7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEypdNpcjAv7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7mztbK7xcqfUKTJv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJuYFxUSEtLREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K52hL7Iz8LAuK61tbu9t7mxvsPHmFGizsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRud2NnYlxjUUtVSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3ex0dHMysS1ur/EyL6+tL/Aw41Vls/Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V3qMzMy83KxsLDy87BvLi9uruBXYvMxsTAwL/EwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApnt5fJ/ExsvIwcPAwMnKwb+7urKuemx6x8bFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtr869trnAvKp9bmhubXSCl5l1en+cvr/GwLnAvL7FxL29uLGxoIZ7cbzIw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdYK0vbW1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7utrqKfioOvxcPDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR3i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+sq2wqZeUlcfHw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2hsbCko3q/yMK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FjLW/rq1urL64tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vp6wta6vfqywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/U3lxT0lJTGidf1pFVbC6sayzr66srba2srS1rqmlnZmanJ6nqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGZEU5x+UFhJS2FJV41iZWWDr7WqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp5OQXaZbk9tSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWU0pmo1lmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2N3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrKno6OioJ6lq6Wel5yUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzTx76/wMK+x8bCt8PKycPBxr66tbq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjFwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoWepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NHXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysHHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpCLgHpydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIx8rEzMzMzs/Fx8i2v8rA0s3Mz8bKyL/Ew8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czQztTX1tPV0M/S09HJ09HI0NjX2NHX0dfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUy9DU1dbO0tDY2NfYy8jOxMnPzMrMwMrAyMrOztDL0M7OzM/PyMzQ0MvOysPKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZW5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJz83Ix8vFx8HGyszNz9HH0M/NzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8vOwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxbzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxeenyhkYuSloZ6gIWFf3V4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NbXzcrOxcnFx8G5xb2rrqVfZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrEz83Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhXV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrraSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubWyvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxsre6uruyvL6+vsS/tcHBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGoq6i5qqSnp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJagoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clqq6zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6utpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmZOKnpGNkpOWkJiYk5yho52koaKVoKKlpZujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8issbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmaWvqaCcmZuhnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZujlZugo6GYoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpaman62hlZalqKedmJCPmp6ul5moqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoKUfn50io16kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSKgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqinZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3t5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcX98aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLG6xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnqyhprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQamhvg4F0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilYmOl396goh6eW9na3h+e350bGVdWltdal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYmMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZF9bZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnZuOkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYB9cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK0opSkqoiZiZKJlXp6fYV/aGFoXGViXWRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgIuFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayys5iWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKabtqiMpI6Rkp+GeIKDdlpiZVdmYWFjYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkM7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wcGrmbqok62Pl5eqiX2CfWtXZGJZa2VqZVdcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIr565qaGrjqSotoiBgHNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4J4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTuMC4vbfGwLu5ysq6trm1uLmyt7W0rra2mGR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHtsXmFdWV5hWmNjUVtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaGxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3rIy1p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNvZF1dXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKKOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556b2ZeYl1XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3mEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMc29kYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdvZV5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHi5OboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLycnMy9DJw9LK1NfZ19jX1dvX09nb1dDb2tHWyNTLlXp8amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7ibfFpMHJuIKVm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWJiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8e2hqZmBUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hHt+gZGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/DoLyMnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+cmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXlta2ZXYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXJ5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KfkKOuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aWdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqdopKpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpGykWSkzceVjoaHiY+SjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWRfXl5PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqiZra+kl5WVlJCLmJmWoMCOo8m4q5qipa2ZkZqcsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrSeorillaykl6mtt6ako5+ZqZiqo6+wqZqZnJSVkZegl5m7u63JoGm2uKuwlJieoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYqMlpmSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL06JxfGpeW1VfUlBGRD49Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLi4uQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqJdXRjXVthW05LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZifl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXVlda1NNSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmW96Y1lXXFxMTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbizp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINub1tYVVZPRktTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC4s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLmmq6utsbGjobKytKRycGZdW09RTEVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOxwq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Ktvbm2n6OnqKWnnJysqamNZWdhX1JMTUdHTkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsLIycXCzsjBvbmyr7m0wMLKtsaxwLy0uquprayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLe1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUZITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkREnG9iR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/t8HDwMfEv83Gu765srC4s7/DyLW/r7y2ubemo6urrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpHS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xMO9wLa/wrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6atqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6yq6mioqWllZWdmYuPkZOkn4ljZVtkYExJSktORkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcKzwsS9xsS9xMq9sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6atsKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSUxKU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDEvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZeon5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBNTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3t6qtsryila2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepJyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnn6SbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFZXRFleXk1MUk5fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwMC4xb3BuK+2p6u3sry/vrWprrG3n5erraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2UoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6amo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaStsLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrLC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyeo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZl1GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipKKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhc4hpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWopK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiJGdkJOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5KeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIWTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZCV3ttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpbeysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSJkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQV15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O4r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WcnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiJGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLXFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i1qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpyanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdWlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gkn7arpaW0qaqunp3Bq6ilr7KprLW7nqmqq7GlmJ6pnaekkZimraKYnqSpoZuinJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGYnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlY+OkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7quwLKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqr5yiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqZ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+pt8K4vbytp7awpaukt7Oxs7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGkm6anmKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmsprO0rq6zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqho5qts5SjpaW1vKesp6uqrailoaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums6ysqaevs6mvtrSnp6a0pae4rpyzsraqpaSnsa6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqmpsK6jsLqvo6SusqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpqhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmhpqSPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5WWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q+RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKiknJ2eqpeYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mZeji4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOD1WUVpXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJqcmqielZSYmJKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezt7+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5mSlKKkmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknaWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11hcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmqoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm13b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxubGuuq+uwLGrpKKeo6Kcm5Cpo6qypLSmraWflpmqmaasuZ2jrpiUoJCloJKMnKOel52bkJWSr7mxrJWXo6enk5CWpJykrZ6RoKirn5ufqKOznqOljqeilKGanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueo+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qHjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHRCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqaa1qKefm5ago52spL6moaqXlJyQopuRj6KooZOdmJOXlLK1t62YnaSkooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Byalpem4phY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxmopocox9hZVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuwsqu0o76xsqagoqido5uZmaymr6Sltamlm5eVoZqmram+p6imlZOblaCakpekqaiQnZGPmJywsr+sm6edp6KIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11waE1YWmZqYFdab3lubWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqpq2jo7arn5mWlZ+WramlwZ6ro5WSnJeemJOUop+eoqeTkZmop7LEr5qrnKufkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2hzf3p1g4eCa3RkeWZgaWVjZGZrWWt7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWztZ6VlJ2ZmbCmrr6gq6KQkZ2amZORlaGcl6ichJ6qq6KzyLOfqqSrlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaJ3a2qLmKOemXNsbnqEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZefo52imZmmq5yto6WnqbKtnpWjkKKvpra5pa6jjo6aoZmSkpugmZmllXulraKos8S4pKGnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpumn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxi6KIgp99lZiIncC9gpadnY2dwsF7gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO5w7Swr8CpqJSjr6mwrq2msrSvqaWmprGrn6uYmqKfnJqqp6KdrKKlqKWktKSdopOmrau4s6evopGRmZ2lkpGgoZibn52Hp6ykq63AwLGhqa+pl5GenaGZoqOqo5OgoZ2dra6prKejo6ehpaWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF4lJabX66PXo6ngaKgfKeWm3SrgoCvXmONqnqnh4WgdJeTiLNjgquGoY2Ns2qEr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoeSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6WhnrCsm52Vp66tsaqorKCUkpufpZOPn6WYnaejnq6kq7CowMazqKmxrpaSnZuhl5+pqp+VoJ+cna2vp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnaOOo6OirK+2rqixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52vrJialqinr6yopqmel5Sao6KRlKGtm52mo6+so6y0qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kdm5OqpLWwr6Cpm52WlKajkJqiqKCgpZywpqSosa23yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX1+UqYOjiIegepiVmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZyglZClrJGZnKejoKmmrqGkp6mwtcKys6qtqJOJl52kmqGjrqaYoZWYnKWmq5uwna6opp+spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZGLn36alpaKdp6YiqSYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKO2oqKVl6Kptbmjm6KdopOQobGZnpynpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6KupaaYr6W8raG2t62dnbWyuLGzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5uVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tJ6Wp6SttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46krqOdkJqaqrS0pJ2knKiRlJeuoKCdp6Sdp5y1mqGqpLasw7Cpq6mhjISOnKGgpqKVmpqcmJuZpqSmmKyorqOlm62mvqyUvbCsn6Kws7mrtKaaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6eVmICsiIWuhZ+UqaChl4afgJmVgHuSfquAnZqWi6p4nZ+QiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6mklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+ZmIyIsFt9tFukg2vIomSfgHu8WHa0WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsna+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voNro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy5qJ6tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbW1linhvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1lcZ353pl9hcY6RbmVkgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2fopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTkoqPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmJuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqeKZZylnJGXmJaMkpyRhp2akJWDkoePjpKJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62kkpartrCyp5urpqyXdIydr5+oqqeTl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6WkZ6Eda6PiKaaqJGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6CmmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yxeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqeppZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaOTl56Gn7qyp56bko6FcHWQiZSQipSPj5uLkJKfkpegpJaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2UkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkU0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLGqq6ealKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSblZmYh6O5rqWanIyMfmJtj4uTkI2QjI2YjJGSn4+UoKGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8rK6imZigoqWsrqGdrrWiqJKhoJ+mm5mNmLSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmJmakoimsaeilpqIiYBpboiIi46OiouNkouQkqKMlJ6gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinaOjpq6cm7GtrJOYoZmhpJmalJ6rm4uIkniLhXGAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42LqailnpCXh4V+a3uHfn2PjYOLkJCJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRU83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKwrJ2mnJypn56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iI6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1FbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZSiq6ShqI+fnp2amZWYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfINshIVxgaGMeIWNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRgV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhSWU9TUWFmZWpSY3d5d0lGRWNdZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoKSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhniAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2hJVk1ZU1ZdaGtuVmdXTUtBSU1LSEpPQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSVlPXUhYaWlzallrVlFSRVZcTFhTYVVpa193dHp9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6caiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1JXm5udmBbcVlbYFpndGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xla2NVYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eYN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnJCCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIBYcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaXl1mdH56dG90Y2trant9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOifoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gYt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn6SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dU2hyVWNcXGFsaHV8fHNvcGRraml/fG55gHFqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npeioZiVmJmUmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYWDkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIVydGB/g4+GdYuYgYOPgoaFfoWDlG15dXSSoYqLhZqEhIxzf4l8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnRgY1tdXlFnblRkWl5ia2l2en5xbGxka2pngIBsc4FsbHRveW+FeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enNlam1si4met5qhpJ+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58fYaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4KakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5nd3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4WGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xa314hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKRpKWdjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeH2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaGhl5OWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpWZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHuAhXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc250cm1hWmFeW2xlUmNYYGFpa3Z5hnFjamNtZWh9g2xodWhsb2mAfIF5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5ifmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXlrdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogXx6d26QiHOBhIR9dIGGiXqDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ6KipGGip6LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnJOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIB6d3VvjoV0gYKDe3WCiIV3hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCdh5OddYGqlZOOh6GNlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjJ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h4b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVNaZmdjdW+EgmJda21kYmZrkm5gZmZfZ2uBdXFzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdygnqCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHKLhYmOiJyan5qWlH+TfmiFnIdnhaCHkoSRgolxg5GXj5uOj4yMj414e5KQeo6LjJGWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYN7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2g5+Dk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgYWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mei5uvm6CQgoV3iJV+fYqdh4WgkY+FjJiEko6HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoSihZJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boWIin2Ko4SRiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH5+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNf5qIhHtyd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaKmomOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWHf3CEgYmGmKGCk4yegolhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxkpGNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBiY17j419iIR6dHqCenCGgJaajpOUgYh1g4V1g3+KkpyehpWPn36IYX+Th4SIhImNgICDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpTaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgn1/h3V5iYGSlnyIhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmnyMmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8ioZ9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecl4aTjZyAiGV9koJ/hYOJiXKBfWd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5yaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp5j5ZvenNwbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmRjYZwbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXppeYWDpZGEk42Df29+gnaCeIWamJOKk4+UhYdvepKDfYODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4WIfYWIeohygG1wg4aOg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBen+Bf4J/doGFiZeKcYKNcXuGfHp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2MaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSXjX+Tjo1/bmyFjYx1fY9/hYGViHyDeG52h4SClnduiIRsdXt0ZnmCg6eMg4+Mg31uf3R2gnmFm4+Lj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hheYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcoF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbcnJlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHtyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2Fsc2FocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGl4Z0j4yKd3BshYOHdHmJeIl8k4h6fnJndoh+fZdvcIZ9aHZ5bWV5iISlh4GHjYp+bX12f4B8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOLgYZ3h3WBiXl4cm2IgI+AhHJ+fX2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5dop3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SDdJCMiHJycIR7g3N1hnSId5SIeXlxY3eGeYCSaHKEdWZ3dmNqfIOInoKAf46OfXF+c4R4f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJyiYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFlzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4ePgHqTioB1dHV+d4BvcX5thXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13em2GdX+Qi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp2dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGfn94a4iGc3hqdH+Dg316fHh7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtiV1dWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fin97koV6eXR5dXR6am11Y4R2koJ3cGdefIF5i4llcYFqanFjWGx7hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inuBbm6Jf3B2Z3Z+gH6BdXtxenSGe3lxZXJhboyCbHNYa194XElvbE1XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4Z7fY2AeHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2t6d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnF7a3p7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9oTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fISJjoOBg3t+i4N7d3x3d5mdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5qenBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFVXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfGZ+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEdee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTFl2ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBd3+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19aaYBpa2+AZ2xhaHp5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2B2hIR4j4RziHFweX9xY3FoW252ZHBziHt4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXdmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1VubldKU2hYZl5YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ5/eoiHhGxygnl2gYCCdG6Gb3yAdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juhnt+fXl2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKeoeHgH93cnV+dGFvbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnlaXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj62Me3uGkH5mcYh6dH19dnJvhmx7fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4B5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7hHp0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB4eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBfHNlcYBkXm12aWNmeHpzbW6BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXZcU0tjXVhpU1dIWWBOR2p2WF9hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJc4uGc3F2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmhe3uAiZV5ZHWIeXN5dmtzcH9reXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfH+AfHdvbmxkaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5venp6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqaXJvd3RzdGlwgZSDhn6EdnJqcHttZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0hydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9h22PhnFvd3p8dIKCfYuPg4KWdHiClIWBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF6bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpsh32AfIh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVyemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYh7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RPSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rkohyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3pzeWxtcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl7gHece3psYWVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3Zwa3lpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFi36IeodtcWZve2xxbGJYX2hob3OAdHNeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKh455bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQiZCOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OTkpKRk5KGk5STlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkY6RkZKThXyUk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKSfISSkZJ4f5OTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJKCbY2SiXF/kZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkIRnfZKAdH6Qj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Phmhwj3x0e46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI6BXWl2bWV7jYyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLiGdmbV5pZ3SGhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dndxYHRuYXB0amVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Nmbm1dbHVwZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWZqb3Fxc3RlWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05RX2Nlbm9vbmJPUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTVBfaGdtbmxnYVJNTk9PUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tIRklOWGZtaGxtbGpoY1xXVVFPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQlBaW11kaW9pa2xqaWppa2tjUkhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PUxeZ2xrbmtvbWlpamxlVElDREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tHXW1tbnhxaWpoVkhBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pjs6T2lwenNsY0k9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo6QVd0cVg/Nzw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD47O1dfOjo8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E7Rlg7PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTtJWzo8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXdNNzg4Ojs+PlBgOzs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5CXWpBOz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPkZudk06PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8/V3yBXD9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlHSEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Njg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhEQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj9APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDR0ZJTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PUE5KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQkVERElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0dHRkpHREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0hFQ0hJSUhJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RESkVFSkxMSkxMR0dNSUdJS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5LTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0xKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI8QkFCRkRIR0xIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD1DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMS0lLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MS0hKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJTWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd+dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhlfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdXWFJdWVddVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlFXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRYWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVFNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkI67zsvLzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fYCCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h5eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt8e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e3x8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJwcHFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNyc3RzcXODcW9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3dzc3Jvg5Fvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJxkYRwcnCXj25wcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCIpHVve6SQb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcIGvjG2Hp5JwcXBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJxfa6icI+mlXFxcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGCsqmQobGScHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nyc5uqorOnq5VydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHd9p6CjsJ+coYF7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIiml5usoKOiiHp6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+iKCRkJ6blZiPfn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYGGqKmhmp6ZmJR8gIGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GAgpWwpaahn6KqpYl+fX1+f39+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CCh4+hsqqepqGfoKKoq6CUi4SBgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhouaqa6po5ykoZ+ioaCipKOej4KBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4yZnZmamqGbnaKgnJ2ak4iDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYSLlJaZmoySnZualoyGhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOBgoGEkJiViI6amo6Hh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCi5aNk5eMg4KDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKBgpCThIKDgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgIB/iI9/gYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CKkoCCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgI6Yg4KCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KBlZqGgoKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgIuVko6AgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjYmFjYKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Ag4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgIGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+f35/foSSjY2Mj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHt7en1+f4CEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CMjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj4yKiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yHhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4aEhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fH+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS2ZE7REREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tmUQEhJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tLS0tPZmU1UVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU1NTU1dDLy8rKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDOztLUz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dO5n9DRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM2zl5q6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWvoKKnstGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XoceGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKTapJm11NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp232KKZtdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg0taimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpBQ0ZEQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iydTVopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7fQ1qOZttfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRptqimrTZsaSn1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKbasYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR09HD1NLSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0+QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk2Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIQEU9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDxEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysqKagnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhn5aTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoJ6bk5GQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoZ6ptZOQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqSkpKOioaCdraOWk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6qpo6SioaGdo42Km5mZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoqKsr6GhoJ6cmqdzgp6cmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGhoKGhp6Kkn56cmZqgYXyfm5uanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCgn6eWpZ+dm5qek1l5oJubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZ2kjpuenJqapIZYdKGbnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqZpI+QmpubnKR5X2+inZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbnJuampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZmqOOjZWZm52geGlpnJ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZiljYqPlpudnHhqZZSfnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZiWpY+EiZKdnZR3amSPoJ6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYlp+MgIKKnp6JdGhii5+enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeeinl6eZychGxiXo2gnJubnp2dnZ2hoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaLmZOEd3eYnodtYV2Kl5KRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkJGOjZmbiXKQnJyEe3Rkg42Fh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoKAgZKdiHhah5OWbG57c4GHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3KYlHRkT3WLjGBccXODe318ho6Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIiYR/gn59oIdfS0l0g3xaSmFreoSEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLh5KJj554SUJFdHhtVT5MZHOLi42JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZyin6CUYVNbSnRyY1dGRVNsf5CRjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqa+khFaCjVR0fGxcWW1VX3eWn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epo3RqwL1Qf5OHb197a1Zum6GhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhoZtlh8a9Zamhk5decYNdYJecmaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ+ZX421vpvKpJOpdWivcleNm5ufnqCfnp6go52XmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mtsbKvq6OjpG2ClZWoxp2SoYRGrI1YhqGfnZ6lpKWgpLOllZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqnuMG+uba3s66sra+EfXtsrbugnJqAV4OBZ4OooZeepaKZlrC+oJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt8/e3tjNyby3ubqviXhkaqejmpaKe2hrcnZ6h4uFhYR2b424qaOrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1trvD1+DYzsa9uraumnhqUGOUhIOEenJtaGhua2xsa2ZfWneytKq1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9v8TUz7muqaSelIBkX0pcfG5wd29paGJdX15hYF5aVG63sqq0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFyczGoZGOiHxoV1hJU2tlZm5oYmVgWVtYWlpZVWyzuaKmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbAwq+UdG1kWlZXRU5nYmFqZGBnZllaWVhYVGazvLKmqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTHuoBZU1NXVUBPZmRhaWRgZmlbWFdYU2KpuLO1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxMKyeVFLTk89UWNiZW1mX2RoXllXV2Squ6q4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwr2CT01NQE1nXmdramBiYV5cWWSlwbu6vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXIv3xTTkVHb2BhYWxiXF1eW12bx8LEx8G8vrSxsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcOuf1RNSGpjXF9uXVRaWVuSyLe/v8DAuru9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBw7uGVElZXm15gVBQU1aGyMOvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMTBuotXR05/lZJFS1p+uMu+sMG/ure7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2pmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjru+u8O2uce3tbe6vLq5lm5KeJ2RQFqQtrzBvrnGvMK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXisy73HuLm4rbaztrmztrS0hnybiVagv8C+vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1611gr3Iz8LAuK61tLq9t7ixv7+blYGXzcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGYcXWw0dHMysS1ur/DyL6+tL/Dr3xptczFwr7BvL/DzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhXN0qMzMy83KxsLDy87BvLi8url1WLbIxsTAwL/EwMrKw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApXl3ep7ExsvIwcPAwMnKwb+7urC2dla1xsXFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCl5hzeX6avr/HwLnAvL7FxL29uLKvrm5UqcXGw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVpeYE5TW1xwdHiEo7i3wrqzu7e7vb+6u7utr6xsV5zFw8PDvry/u7u4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVG55iaiwt765srWyvLm8trm+sbSob1+KwcPHw8C9v7mzr7K9uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNopdgU0NZVUhialVPRUplkKOur7a6tbSyrLy5uLW4wbq6nH9serzCx8K/ubq1rqWss7GmsK2onqCgpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTkpAZVlCUHiAk2hMQ16DsbWztbK0r6y7uri2ub/Es5+WgnqovLu4tbKxra2fpKannaSlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIR7WEZCUYhYSUpZeI6CYkFVpLmztLKwsa2wubi2u7e6v62xsqqfoLmuqautq6OooZ2dnpeYoZWSlpeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUaE1AVHlxT0lJS2idf1pFVrG7sayzr66srba2srS1rqminpubnZ6np56gqKmfoaeWm5eXj52Uj5CWjpebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZEU6GEUFhJS2BJWI1hZWWEr7WqsrSuqquvsLKzraWdkZeTj5ignqKgnKOkn52olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhWUmRNSkhHT1JOSk5IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/y55OQXWcb1BuSkxjZnZ1YV1ic5Kyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWUktmo1hnfW9yW1JrY1xnYmFtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxmW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2R3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe/sKyxrq2pqrSxsKirqLK2uLO4rbK0pKCdpZ+soaGioaCamJaWn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VebVtSYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dMW1NaTExRWVJIT05ImayqqaSfn5mSkZOYmJaWlYyIi46VnZydnZ6XnpmnoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wry3vrOztaKsoqmosqmqqKeompmemqqnoJmnoJ+fp6ilpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkNSeKmtqaqln56eoqOdnp2anJuUk5WUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6OdrKi2sa2jsKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OioJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLayqrqyrru3v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURUTURDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6WlpOOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19HXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT1tjO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FhX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1c3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMnAyMrNztDL0M3Oy87PyMvQ0MvOysLJx8nMy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFx8HGyszN0NHH0M/OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4OTg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PTg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGx7/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMW/wcfMzMzPwsvMycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb299udHIycrPy83EusDDu7u7ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nCu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAysPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc3Dxr6+tcG9w7u9xrzDurS8xsTCw7fAtra+v7vMw7y2usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRUdLQUVCRkpAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2srqVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMi5tLu3wcK9t7zGwcO8ta6ytbq/tMW3u7WruL2+wL2xu7awtrqzxby3r7u/tbe0xby+wsXAw8XGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6uMm2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a8x7nCt62qqLCywLa4vbCxqLGztbu8rK61pq62rruysaq5sK27rru4u8DAvrnDv8bDxcG8xsLIy7jFx8W/x8PDusTGwrvGyczLs7nDvbuziXN3dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk9OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0va+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK21tKaorqGkr6mypqiorqaot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZga29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLa8sqylr7OtoaORaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBhXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpujmJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqKyrmaCfnpmdn6WamaObnJ6wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6y6urGinqmrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqehmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSsqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZlX2FWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendzZWFcW11YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEs8K/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVSVFJVYGBfYGFfYWFiZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaqeqKKfrqypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwcGBbV1ZWUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+Njk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbm4iBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboaipq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGgm5SQjJmOjJGMko2WlZCeoqGknZujlZugo6GXoqijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTU4Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqmor66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZalqaedmJCPmp6ul5ioqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQU1FMTFdNSk1PUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qmo7GrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXV1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrehnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucnVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjYKUfn5ziY56kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTlJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7Sppqaoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdpraso6CPlZaSkH13fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWtxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIWMfYmBkY2Ql5qYk4uQiZ2In5iHiJaemqKgl6euqa2oqJ6XrbOipq6ZrKuYqLSiqa2jk39zbl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyEiYiVhJuNgoSSmpafnZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+ip6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2nnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS09PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsK2uq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVNTkhOSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woq2qqLWvrqy0v6u8w7+lopqVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqSorp+ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnGHfId8dIyujomAaGdiam5ybXCDdWlwWHVwjpuSd2x/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhKRklHP0JBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepaefr5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjnp3iX6JiI5zi5eQhHpdZHJ0enx3im1oamJ5b4aQgnpvgXd0hHpwdHl4a25pXXaHfYd8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIl7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYOIf4iEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GGgneHf3t2hX1udnVmgJSOhomIh4iHoKuilomOmH96gol6eW9na3h+en9zbGVeWltdal1hZmBZT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsZeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Kfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoiglYaSiY6PlqS1qZuNlaKDh5ODfoBramt8gIGCdGJeZF9bZ2tdbGteV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKqWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYo6KmtrCdkZmoiJaPjYGJbHNyfH99cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKKlnp6fYV/aGFoXGViXWRjXmZnX1pPRElIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6eaqa+tsrm3uKebtqmMpY6Rk6CGeIKDdlpiZVdmYWFjX2BmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gYx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoZ/homFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe4wbW+r7d0sbOlusWksMa5sbOxtKiktbaqsaCilpqikqWwraatrKekmKCstLqiqbK6tbu+zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy6wsKsmbqolK6Pl5iriX6CfWtXZGJZa2VqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3iHYrmhmaOJlZSWk5STjZCWkoeGe4aBjZWKgYSBinp8i4eGfYqDgYqDlX13eXVlT1xkR0VMO1FjYVteU0Y/O0hQRVtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0tMU1pUXpOvuLW6uMm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqu9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfpJSip7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcPIsJ65qqGrjqSntomBgHNgYmJeWGJgaWZSWGBWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWZmZGOl5KWlo6Gh32Gg4yWi3+Df4J4e4uDh3yLeYGKgpd/c316a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLSkhGSEhIR0JJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJ2tcF6irJyYoKObpJ6qpZSgn5CUjpaYl6ifpZ+empmDpJ2spaqwrbewvbnU0c7X0MnM0szPzsrHwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZgHpsXmFdWV5hWmNjUVxgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmpimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+WkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwqLS01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3D0NK4sMO8xLmltrrDooNwZF1dXllgWFlmWlFdV09QQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMm5uXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdHRxdLWxcDOx8fDqL63z556b2ZeY15XYFNdWlBRVVBOSD5ARkFCRTxAQj9FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NXX1cnU2s3J19fRyqzDw8yMc3BjYWBYVFpUXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5SYio2IiIuJfoJ4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuPi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qbkquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eXdvZV5aU1ZSW1dGR0pJRUU9Ojc6QEFCOkdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWXl4mPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1dvX09nb1s/b2tHWydTLlXp8amlcW1BTVF5IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+EfHyEmI6Hi36GhoB3gnlve3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJGKjZGCjIWJiIGGkJGenJmJhoyBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PT08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36AfoB8hXt+gZGJhYV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKScfYmEfYlyjIp+c6aanJiThXuPkIiEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZaNi5WfnZSglJGOjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSvoIuRi4WLgZKGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gX2Ge3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWip2QlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZueopKpr6CRlZCNjoiVi26Nt4WaxMiym6Glm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ+Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3SBaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg+NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCDfGxvi395fHh4fISHi32Ko7Ooo6uzoZanoKWklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5WWlJCLmJmWoMCOo8m4q5uipq2ZkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyalI+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvc416fYF7eIaLiYWDkqe7raiyva+lrrOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZiqo6+wqpqZnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi5CVjYqMl5iSnZmzlpWqnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL1KJxfGpeW1RfUlBHRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgY3BKQIuKf4Fyhod9gYl1goqDf219fXx/cHeHd46ChnuNj4yGjJqrwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaudnKSYm5iXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkZqWnaeasZqRq52Omo+SjpWQkJaXj5GgkYmVm6OslJaPlJyelKCem5igoZWanqenpKGksLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVthW05LQkxARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5antMbJv8LMwcO5yLy6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm6CqnKKclZ6wtKeLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY+RoYyMlJGPiZefmJOZlJemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6pt7XJw762zrLFvsS8s9HJyMG1dXltXVlda1NNSUNMS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHqNoZaomZqYur7HyMrC0snKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6uutK22taCfrp+mopijtL2pm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllYXVxMTE1KR0RDSEJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY6Xjp6SiYp/iJ+ThHiFf5V+f5CIipGAlaGarqakmMO+yMPIxdPNzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdq7e4qaWvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmZaZlaGkqKaetqupurzEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeplo2Qg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKupp6+wl6OvpKikpbTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFFRO0hLSUZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eZoKKor5mQl4eLp5aOiJKFn4iEnZePnqCao6S1yLSpxrvDw8jKycfMzse+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSrqaaurJmkrqWlqay6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrure+s7Ktvbm2oKOnqKWnnJysqamMZWZhX1JMTUdHTkpWTD1NRE1JSkFDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRayVnKGfu66ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLIyMXCzsjCvbmyr7i0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKuqvbyorbyzt73GvLa1t8Cvvb+zqLS2q76kj6OXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjaShlJyjnqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLWys5+coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HDwMfEvs3Hu765srC4s7/DyLW/r7y2urempKqrrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ejlpOblK6fkKGipaOjn5C+pamdqKydnaGbpp+9opmjnqKpq6Gdl42VnpOfh4+FjZKepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWpraycmaChko6QlqmflGlkWmFdT0pIS09NSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqqyXtrCjqrO2xMK9v7bAwrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqyum5uemaagvqGdpJirq6umoZmNmp+SnomOWH+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpq6yq6mioqWllpWdmYuPkZOkn4ljZVtkYExJSktPRkVBRko/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6qkn6Oframsnbuwqay1ssfDwcKzwsS9xsS8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2qoqWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLmgoaSSrq+spaafkqGelZ6PkY6VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+OoKGTi6assKWnopygnpOSm5SFi5KNnJ6AY2ZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZayq6aipbKsrqm7sq2wtbTGv8TEtcDFvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6yhl5aRpaSiopeYpK64rbG1tqCfqKSZlJWTpKC3oqSllq2xsqWqpqGempqblpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6GZnpaMj5mQgYaWiZSfeWVpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaudua+rpKq0t7Gwubewt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSOqainn6OcmJuTh46Zi36NloWPm2tpbWFtblhRUVpVQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHCv8nEucXDwMC4xL7BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8rrG4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+opJ6UoZibqLWpl5mSkp+ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWWlIGPlYV7j5KDjJdmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa6zuaansbjGt7G3vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvZ6rrrGjqp+wrbOurraxubapra6wp7aws7u8ybKqtbSxtK+upqGzn5qoraCllZWambGjraClr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmay4o5iUkY+YnKGYl5Ssn52UgZOZjZ6dmpaQipSTnpqlo6KgmZaSkpZ7i5CFe4yLg4yTa254bnV8YUZgallJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZegsKixqaylo66utam3tLijrLS3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6ytsbmVl6auq6ejsqmUr7qkrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoayom5ydm5SquZyVjo6LmZ2imJCXpqGfloSSl5CdnJiWloiXkJebqJ2koJKWkZCWdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5GZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3wL2vrLOznKCnsK2lprClnrK1rKuysKypqLS5rLSytayzrKmsqKypua6xsMe+uKW5r6mtraaorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmpqSpLSaj4mNiJKjoJWNlJ2glJOFjpSTnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoqmvpKiks7SxtLWxsaGsrb3Muq7BvMextK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzBsKyyraCkp62pqKSwo6qxqq+rsa6vrauzu6e3sbKpsqmrpaWjrbqsqrHCubSsuqioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6mZo5iZj6CnmIaDjoqLn6CPi4yWnI+PhoiRlaCdlpiVhpaTk5elnJ2cjJGQjYp/f4iFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlOY1xOVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6u9ybyxvrfDr7Gts8TEzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Ourqulp6qwqaeosaW0raqwrq2xr7Oss7ukuLSsrK6nq5+jnrC3q6qturaktrWkqaesrKqtoaimprGypKaloaGrlqmglJqgpp6koqqkrKKeprG3rK2ipKKaqKqtqZyhpaSkmaCZlY+YnZSBgpCIhZ2gjYuOjJmPkIuEjZiknJKRm4yTkpKUo5qbmouOi4t8h4GCg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVlRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqmttau2saukq6qpvMHAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsq6tq6yntqqlra+rua+osLCusau1qra1p7W2q6ykqaqco52zs6iopLS0oLauoamoq6isp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6SmpqmcoqSjn5mZn5GOj5mOfoeNh4WenoiFiouPjpCNhIaVo5qOjZuRkpGPkp+XmZaNioN/dIeBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUV1RHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJi8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Gxr7iuoravycfI0cC/vbq8w766w8HAv6+ys7K1vbzBsrKzq7OppbWopK2zs7mvo621sa+xuaq4rqqutquqnqqrn6Ogtq2poZ+vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKiin6yhoZKhoqOmmJqoppeXmJ2PioeViH2NhoWEpJeFgoKMh4+OkYSFlKGXiJGdkJORjZGdlZePioWGeHSBf311eXqAe3R0e2qCh6N1aV5lbIJ1Z4iLfFJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE86V0I0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNDCvcC+ub6/vMm8wrmwsLWyury5wLO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlqSbpKWfpJqaqKqlnpqpoZuRmqClnZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd8enVwcX5phnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RltAKo+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1uLSqnbq7qLK/srqgr7S2qayerbCinKWoqaOenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppefm6GjnJ+bmqOpopqZo6OVlpOfoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTVxebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk9M1FcPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfKx7+3wr6wtL63xLbDsq+6srPAtbu+uKm5uL6rpLWnqKqwrbmwqZm5vKOuv7S0oa64taemp7CzoJ+kpqehpZmfraipnqCqr6egppejqaCwuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhqb3BxcGp/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXFx8C3v8K6sbW9t7+7v6+svrC0v7K9w7mpu7u4p6i1qKersKyzsKaZvLakq7u1rp+xuLCppaevspuhpKCjpKGWnLCmoZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImLj4Z6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZW1sbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5XV5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5ZG04NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGioLiqrqC6uKasvcWzsK+jtbCtra+0w8O8s7+6uLGzubi6uLqvrsCztLmwv8G4rL27taais6qnqbKrrbGhmsC1pKe1taiesrypqKapr6yZo6eco6aUmKGypZmfo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2UkqOopJCJio+GeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhoamdncIZnaGlkZmlqYGpiamdbZXtjYFNzVFxbU0xKR0lPU0AhKmhdakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWdPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8C/vLHBtrGusra2uLe2raq9tK+ysb2/uK68vLGln7arpaW0qaqun53Bq6ilsLKprLW7nqmqq7GlmJ6qnaakkZmnraKYnqSpoZuinZegnae2pa+qr6GhnZ2hlKCmn6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqLiHmFd4KCgpyIi4KJfH+EiIaFkYSWlY+OkJGRkYyTe4OVjYVzfX1meG9ramxndXNrY2dkZHaAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0hLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1m6OfkIusoZiYoJaltLGhsb23obHGvLqxsaS3rKuuqbm8u7qtv7Gvrq62r7O4s6isurGvrrS2uravub6tpp61q6CgsKSrr52iwKCxo66wrreutZ6tr6ytopqdp6mlnpWbqKWfmaSiqZ2aoJuUnJ6sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY98gnOBgYuYhYd8iYmEhYqMipOEk5ySkpCQkZaOkH+AjI2DcIB+ZnltaGtqZ3Fya1xoZGNzgWFmaGpubGdramhtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJKhmo2OsJ2ak6GaqbKvn7i/tqC0wru9ubGmtrCorqW3uLe3rLquraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqa2ap76YraOur7W1rayfsa2vqaKcnKOrqJuVnKejnZqpoqSWmqCckZykq6qpu5+npKCYmZmdoY9roZaZnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQf2eGgGh1aWZXXGhzbk5QamRncoRnX2Rmbm1qXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NlmBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky6MpJmGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukt7Oxs7C4raqnrLSmsLWjqLi2tainrLezrrSts6Kqn7SrnqGknKanmKu6laalr7K3ra6kqa6rrKWhn5ygp6ebl6GlpZubp6edk5+fmJCeqKqjta+jo6OclpeXl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIhHJ4jY6FiKF2iY1pl4hmfXJ4oXCIh4R+jXx/oaCgmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprO0rq6ztquppbGtpbW0nK62trSlp6mzsa2yqK+fq6GyqaCjo5qho5qts5SjpKW2vKesp6uqrKiloaCYoKajmZmmo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoGmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm6CdrquUnaGftLqjqqmira6lop2amqGnn5ebqKCfmJ6np5Gcp5uUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaGeHlkV1nGB+Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZWDrKelnqOlqrK4rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrSzoqucoq2toJ6al6CiqJ2ZnqSfnJqhp6SPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4Gme4KGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKq7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2sopqZpKi0r6Kpj6moqpuelZigpaean5yin5ugo6WjlZuemJqdoqqbpZmcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuhk5ixqKils6qltaikvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqitsKmjno+soqiWnpecoaWhmKKhoaGaoqKnm56hnpWZm6agnKeVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpkZlhBT2tfbGhPVUdJOT1WUltYWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrytprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2iqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq7CmopaTrZ+lkpShm6Smn5SapaahmqOfrZqgnp2QlpuhnZyllZ2WmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfY6ehpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa16vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaVNZUTtCREFMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyurezuL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyvpqCVmamfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52hmJmclpaioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rrammtLC3sLW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjVFpRPj5tbzNCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doZuYnJ+Qk5SrtbCnmZScrKqXjJOlmaWtopGWqrGjoJ6nq7CYoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbKspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKMnKOel52akJWSr7mxrJWXo6enlJGWpJ2krZ2QoKirn5ufqaOznqOljqeilaKanJeVo5iPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4uGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbZ0cnB3toxegHp9imiDeW55Y4uscHWFf1lbp2pFZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6noaqXlJ2QopuRj6KooZOdl5OXlLK1t62YnaOkoouSkaacpqublqikpZyaoaimp6OpoZGtnpeknpeXl52ej7ColJynoo5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx7gnNJSm+GcE51TUVXXWZgTFtYZ2NfT1ttdWlxUlBERU48SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+qKmmlZSclaCakpekqaiQnZGPl5ywsr+sm6edp6KJk5Gpm6mkm5uroKOZmqOnrKOfq6KasJuVp6CWlZ2fnZexpJihqJmckZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11wZ01ZWWZqYFdacHpubGZTT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC5As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAqLShnaSlnKOVlqCqpqyjo7ern5mWlp+XraqmwZ+spJWSnJeemJOUop+eoqaTkZmop7LEr5qrnKqfj5aWqZ6rnJygrJihm5yipK+noqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgamVjZGZrWWt7cGlqXFNMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6grKKQkZ6amZORlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKmvqqajq6Ktm5+goZmknpyena+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaN4a2qLmKOemHNsbnqEjYd6WGVehYJebIuKgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmSkpugmZmllXulrKKotMS4pKGnrp+elZ6jnqOco6qokp6hnaCqsKqro6qgqZumn6ihrJahm6WwpJecq5WhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KIgp99lZiJnsC9gpadnY2dwsF7gnuSjZrDwH1qpbFvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCroKuYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq63AwLCgqa+pl5KfnaKZoaOqo5OgoZ2dra6prKajo6ehpaaeramSpJuprambnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeTiLNjgquGoI6Ns2qErnR9l4e4YYOtWaPNbpB1e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Cj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOT42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+cna2vp6upnKeopKKrkq20l6aiqqmdo6alobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVgb2lpbmZjV1NdYVlSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJialqinr6yop6mel5Sao6KRlKGtm52mo6+so6u0qrrNsq2mrqyWlJydopmfrqydlqCZnZ+psqmqqpusq6SjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGVh65ffKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVMTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKekkJqiqKCgpZyxpqOnsay2yLK1qqyqlZGdnKKZoKWznZqglJyfp6yrpK6araqjoquis66iqrOxoZqpqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4qaxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZmpzcWaBal9hWWRtXF5ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKys6qtqJOJl52kmqGjr6aXoZSYnKWmq5uwnq6opp+so7etobK5r52brqeys7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ+ErH2alGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppujp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa2pramRh5Ccp5yipJyllp2YmZqmpKmar6KupaaYr6W8raG3t62enbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmVkJptcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4anlzboB0XWRkbm1mZ2BKW1lYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKiRlJeuoKCepqOcp5y0mqGqo7arw7Cpq6mhjISOnKGgpqKVmpqbmJuZpqSmmKyorqOlm62nvqyUvbCsn6Kwsrmrs6eaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZSSgHmvXaOBfKanZJ2AfJd0a69dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2N+dW2AemBnZXFuaGdoQ1phWz1LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKefp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamkn4uAjpuan6aekpWampSamqakpJqprKykpaCqqL+ll8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsVt9tFukg2vIomWfgHu7WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmPnX5kc35ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+poo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Oqsqm9r6Wonp2OfYublaCgmZCSmpuRmpipoKGZqK6npqajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwrJeMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5uXknuHmZGmm5OPkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYF6anFpZ4mWlZhxaWmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2Tj6KYmJmSl599h4+VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBojLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epquhn6OjoJGLpJKnmaiZlqOpoJacpqaor7qsrJqbk5J7hJaNpZiNkZKYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkY6VhYGkmZeVjYuTkoqPhoR9Z4p/dIJ2dIeMcadte5SRlJKBgY6QkI+dlKGWmZeig4iVjXJpkHdwi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqyloJmnnp6TlaOWqJqomZSmoaOQm6iZobW7qKuZmpCNfIGUi6GUipWSlZCQlJelkJ+aqqCctqOeqKy3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSJmYd6cpZzeop/cnx/am9kXnBqYVtfWW5jUGBlUFo6R0dFPjI9PjcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj5+5tqWmmZyNiXmCk4uak4qVkpSQjZKXoo2enqmen7ikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJaMkpyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmIipSSi1p2lZFoaI+OcnqmmplleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk5OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qilKehno6XkZ6Fda6PiKaaqJGXpImcurSooJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgpGXloSamWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH+TioODmWuOjYVseHtxcWdkeG9qbGpbZWtqZnRcX0lUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1haWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1npCEnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gn7qyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKmJGLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6KbhJqBjY6FiplxjpOFaHd0fHdoaHVxZ2hrXmRwbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6OvgKGnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYh6O5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onWAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWjqJKhoKCmm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipipmJmakoimsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwc5SIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42MqailnpCWh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeaXal+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU83VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9iYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZyJkKmjoJqMkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVXQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6SiqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfIRshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Fm3B5epdrm3t4l3NuqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYklXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yIkZKkloOOqpqUkouFiXmDd4iAboKfh3eAk4aImaKXe5SipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjICMpI2Wg66hlHa1tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXioBvTGajknCbh3Kke3l0YYOCa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUtBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMhox0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqiQgaKskYaQioKKfoCAjnNoj6WEfYaUjYmYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpyffKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlcYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx7b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZimjn+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpZyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aZpI58p6GLhpCQhZaDho6Yd3KFqYaOkp2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J1gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqeiiHiOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4eTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoB7coKAeH99f4V7bYKMhnx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npeioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYaDjpudkoern4NyipCGk5GMnZF9jXqqhI2SmJaPnJeHhpumn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ6MiZOanoKOl36GjoNvd4VxdWF+go+GdYuYgIOPgoaFfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiIqMfG9rfoF8bmhsbWdeen9ofXt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pogIBsc4FsbHRveW+FeW2HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlam1ti4met5qhpJ+SkZaXi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gZCamJKMmqOho5qXkZt+jYV4gIOOh6B/fYyNkHyYpKChk5mQj6aNkIGbkYmTl5t9kpJ+h46BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfHxxeXuLhHp6kYyDlqWTi4aQfIaGh4V2goSJiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrZGxoZoCBa25+aG9xa354hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmtveYmNnrKRpKWdjpCYj4adoZudfHaloY6YgIyiioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loGVmJaNlqCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6OeoZOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCioZ2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWl9g2xodWhsb2mAfYF5bZCGcYCDg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qp2KmXqXnYuMmJB5e4GLfXyDe4CDgXh0eXpzfYCEf4mLgGRefYuVh3+Fh3V9fop/fZiEl5SXjKShmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5OSlYaZiHyKiYF6cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dniAfYaAfIONhIyUpI95hIJ0iYd9gHR2gYmEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2pmamNpd4huZmxoamxogX17d2+QiHOBg4R9dIGGiXqDfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2Z2Z25sYXlpa317eHBheG2LgJmZqqCjqJ6Ki5KGip6LlZh9d66ZjZd9n5SRlpSId357inx7gHZ3f4BwdHR7b4V9gYCKfnxhXH6QkoaAhIRzeoCGeo+SiJKRnJOlnJWCfoF9jouSpImOio2Ymo2GkZiTlo+KiIySnJOQjI1ug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CVmpSikpKJi5qMgn+Rnn2Sj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiYSMlaiMe4h8fouFeH5xcIGGhGNoeXR1cHxiXnBga3RecGp7eXhsc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GObmRpZ2RpaIF6d3VvjoV0gYKDe3WDiYV3hXx4hIV6gIp3f4t7e3J4g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlZOOh6GNlpOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1l+ko2IgICAdnWAgICghpCLkp2YoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYmLkJGJnJahnJiVhZeIaYSjgmaFnYqRfouDi4F3k5iRnpGQiYmVjn9+kJh8kY2PjZqSfIqAgm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2yBhIJecnNycXB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk25gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIaMf3t2in9qcWN8Y4Z8b3FtdGpob2x2eF9xf3l7dHV0gIJ+pJWarZ6mloWMhH+XlIOQn3WLoJSThoubjJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzgnqCoIKSgpOTmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHOLhYmOiJyan5qWlICTf2iFnIdnhaCHkoORg4lxg5GXj5uOj4yMkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx6iX2CjJCenYV8fHeCjH13cWpsgoN6YHhvbWxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHSKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4ZnJqg2CIfm9va3tgam50f3VfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHdzgHBvhXRwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN2g5+Ck3eUkZmckJl7lHOFkJ+hk5OQipOblIZ+lpaIjY2IkYyInH+OgHd6jH6Ii4qcnJ2blZN6jXZniZKHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqTkYp6hXx+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenpoc2pzio6JgYWFfZWLa35/boCLfouHfIR6go+VmpqKfHZ4g5B5c21ncYCEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY193YGBWa19ed1BOS2FnY116cYl0XFxldmBhZWWPZGBlYlhpc3Nua3F2jH10eYaBdXZ+i3OAhn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WmxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76FzbHWEdoSihZJvlpCVoJWcgZJxhoujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZnNqf4mOiYKCgIyWhWuBdm6IkIKPhH6Ben+QlZOZkHRzeIiNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmBiV25aXHhOTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRxgVdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXeKmoiNaZiQj52Wk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uQi4WPgn92eIOEcoeCk5uWlJiGjHWHf3CEgomHmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6OgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qBfn+SkH1tgmx4ho+GkoN8gH2AkZOQlohvcXqMhnVscWxyeYFgdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hiaVhtVlx1TUtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm9pc3iKfnNzgX56dnqIc4WDfYCHdneKho6YgYyBe5N2bHd1eXiTdG54e31ZeoZxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCneG9xd3xxkpCMh2qZjomckoyGe2mIi5qHgZKRhoeYjXyNjYGBiY17j41+iYV6dHuCenCGgJaZjpOUgol1g4Z2g3+Kk5yfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEfoOHfm9fcnCFe46MgXx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm96jH51bm9rbHt+Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanR3hn9xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xc5e8xYR2cZSJkH5yl4yGnZOMiHRriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4ODcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+HjI99aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCDgn9qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHmDfIGYjI+MfW5se4l9d3RvaWh9d2VdcWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aWBlcntaYHJ8eWdwemFlZY6xsndKYlqk2tCXcnuRi5B4fpWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4uHfGV9foN2Y3BzgGh4cG90mIyFgop7dnh/g3mBalxwfXKAh4WIfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXJgWXdaWXFuTlhyc2dgSmx2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaXhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3duiIRrdXt0ZnmCg6eMg4+MhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBygG9bbH50eImCinuGf3yIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhxWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZlX3RwW1lVb2RZZXB5WmheX2dtZ2psaXB4fY5saYKEf3lugHt9gX+CenWCgYyThXCAi253foB7e4iTiX9oe35qdHtyhntzd31/jHl4hH58a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvX2Fsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmKeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iIWlh4GHjYp+bn51f4B8i5mHgpOQmIiLhIl8j4lxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnOLgYZ3h3WBiXp4cm6JgI+AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQWFkW2B2YVx0bVhYU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx9cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g39+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ/c4R4f5GQgniWjZSPh4KIe4mJbHh5fnVoemlrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJyiYOCfIJwhol3eHBwg4KMfn15fnx1joWCdWlxaWyIgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxkcV5dd2hVV1Z3XlxlbmhWa15hamdlb29pcHd7k25piIx5fnN7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR5gHZvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thXSUhnh1bGB6gnmIjmZxg29ndW5bbX2BkJOAgXmSk314e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdIOGfn94a4iGc3lrdH+Dg316fXh7couAfHJndGVti4NtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG5mZmtxaHB2eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R2koJ3cGdefYJ5i4llcYFranFjWGx7hpyJg4Jzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW99Z2hyYm54cWpscXh9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXN/inuBbm6Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwc3eGeG6VinR/enh+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dXl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl1cm9oeWFqbWBtdmpna2x6d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0fIt6gWZ0hn1tcWh1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZtZHFmcnB0gHdwmoR2f354f3yFh311c4KIf5WCbnN4enpzc4WHiYiEeIB9do9/fYSJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdXBkZWNXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3BiaGtnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNp3yEfHaWkHN8c3t5bXt6kIR2l3yHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXd0Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExOcEdee2ZhTVV0Y0pOU1dgand9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVXNXTVh1ZFpfa2BcWmNlX3dmbWJwaXNvcn50dJmBd3+AeH9+hoR6fXaChH6YhW5ydHt6dHGFhY+CgHqLdXSRf32BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1taU2JuZVtYYXR7amhtaF9iV19baYBqa2+AZ2xhaHl5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3j4RnZVhid2l+hnpvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW252ZHBziHt4YXKAcGdqeHNxa3d2dHdjg3t+d3ZwZGNjbnx9a2tVamNnU0tsaFBHUmxFYXhlYU1Tcl1KTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUtceV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXqAf4eGenl6g36Bk4RxdHR+end0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1paWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Juhnt+fXl2cm16aGl3Zl1kcmd6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnX211ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwcmJxcYR7dWRygGxhbHpvamh5d3RyZoV1enp1cWRhZG5zfmpsVGlfXlRMc2NRR1diR2J2ZWBLVHBYSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYmRegGlqX290eW1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWHBtW19XW1xse2Nwd3ZsYlttc3RndXZxbYV5f4B5d25vdGVpdGVbZ3RmdnaRel9dUmZmaoKBdH1hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp0iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3fGtubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2Rabm9hcHGBfHNlcYBkXm52aWNmeXp0bW6BdXN9c3FiXmZub31laVRpWVlUTnhfUkpaWUhidGNgSVRtVElMWlZpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2t2gZB4bYN+gIGSiISBdnWJdIyGc3F2doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpaV2hjbWVcXHKJZlJybVtaWFhgbHZkaXVqal5abXNxbHR0dGuGfH6AfHdvbmxkaXFjW2tyZHR2j3NbV1RkYHJ/fnKCXGFjXVNaYFxkk59lcnGFhJF0bGp5bG9vent7cYB2f3J6enpkZXVnXmJbYWhcXndoV2Jdb2hhd2FbfHZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXXGptYnBygHpzZW9+W2BwcWJeaXB8bGx0fnJxeGtwYFxlbG17YWdUZ1VXUlB2W1NQWlJIY3NiYEdWa1FJUFpVa2trfGVtb3FgW1pYWWxwV1JQZldXaFNURlpcT0hydVhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gYCBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1NdW1VnYmxsW1xxjGROb21cVlhVZ2l0aGJ0ZWVdWm51bnB1dXpsh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWY2N3fHxwhVxjX2NUW2BaY5aVY25wg4WKc2poem5lcnZze2t5dHVven51X2ZyY1teV2JkWWF1ZlVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxc4B2c2JsdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF5mVGVVVlBVblhRV1RQSGVyX2FGV2pPSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2lRWWZUU0haW1BOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaXZ2f35tg4B+h5d7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Md3hue41gZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX19UZ2Bsb1xebo5oTWlsYFVWU29mc2tleGRlXVlwdG1ye3hzbYh7gHece3psYWVsbV5gbmplcHl+Z1pWWGBreHt7b4NeYl5nVllgWGSciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiZFhlcWNUXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3OAdHNeaW1TZXBlVWJuYXlicHV7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWnV1XV9mbWhYYmFbXo5xY2dqd3Fzbmh2c3mDc4KDe4iNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOQipCNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIiIiJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IjYmQiYuQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MiY+GjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4yJjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjoyNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6ent7fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9fHx9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3x9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOkI+NioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5SSk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKSkZKSg5CTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKSi4qSko16kZKSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZKId5GShHePkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4tuipF6dYyQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+PimiAj3Z1iY+Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2JaXeMdXWGjY2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4BobYFxc4GFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1aGBnYGRpbmdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGZfa2xgamhpZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXGN0bWVxcGVdWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SaHBsYXB1a1RQUVRQUE5OT01LTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRmbG5jb3NyV05OTk9QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJTWFoa3Fxb25ZTE5SVlBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQUtPR0hOYWhmcG9raGNeY2hXSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+QFReWV1obWlubWxqamxsVkZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8RVlmaWtvam1tamprbFdCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PE5pbm9rbWxpaWxVQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo4N0lpb21wbmtrVzw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PEpncndzbFw/PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV0dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/PkdbeXJUQDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj0+QD1nXDk8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdnZNNzg4Ojw/P1NVOTs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89Pj9CVVs6Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPz5aYz47PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXVMQUNFQD8/UHJ2TD9DRUlKSUlNTUtFREZHSEZHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WHiIh/WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVXSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEhHSEZGRkhKSUlJSUhdb29xcnR2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA9PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhYaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk6P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM1Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njo5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozs4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4B/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNCQUJDQj9AREhEQ0VERUVCRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcXR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQEFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT05MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozs9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT05MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LSkpKTU1MT1BOSElLTE9RUVBRT09KSEpKTUpMRkdIR0ZHSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NUkxQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0hHR0hGPkBCPT89PUI/Q0NGVk5GTk9QVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1ZrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JWVlhVVFZUT09NSkxLSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpUU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnt4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hDREhHSEtHREJBREFPUU1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJsTUc+Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVUV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1ST2FXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3R2eHd5ent9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVVRTU9OTElISktJSEZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNWVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fX19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI9WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XV1ZZWVZRUVFPQD47PT9BQkFDQEJFREFAR0hHSEZGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRWVFdXVUxMS0k9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHB0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT01JSklHQ0NDREhKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFua2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETkZBQ0tLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRkpKTEZISUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmZrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD86Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSElGRURFSUpIS0lHSFBLRElNTFBNT05PT05LSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhERUdDQkBCRD1CQT5APTo6PT87Pj5AQj5BQkRHS0ZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS1BTTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj49Oj46QEI+Pz9DRUZERkRESEZERUNERUVHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSVNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2lpaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklJR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNIRUNFRUZHR0dJRkhLSENJSEdJSEZESEtJR0tITUxKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWlxaWVxeXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkI/QEI/PURFRkRDQ0JFRURGQkVGSENESkVFSkxNS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBBQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTUlMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0RJS0xIRkRHS0xIREdIUEtMT0tMV0xJRkVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtMSktLSUdFSURDRERCR0pEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0lIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tNTEpKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0xLTk5VTk9LS0xHR0tQVFNOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUlZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0hneGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f3Bob1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlJSS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVWVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVlROUU5NTlFUUFVRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFdYVVNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWVFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hSVVVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV9iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UU1hTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUVdWV1ZXVlRWVFhdXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWJjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWlpXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVlkZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkI67zsvLzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fICDgoKCgoKAfH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z4e3h5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enp5eXl5enp8e3x8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3t7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8ent4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3l7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4OEhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRfdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB3fHt7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnV9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycnFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeG9wcHJycnJxcXBwcXFxcnJzc3NzcXFycG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNycnJxhXNvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXJyentxcXiWcW9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnB+lnFvg5xyb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcHake26Qn3ZvcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFwdqqIb5mhem9xcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnB2q5VxnaJ9cHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdHqronueon1ydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh4lLKlpKunfnt7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fX+mpqKypKiLent7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX1+hqico6uanpt+f39/fHx9gIOCgIB/fX19fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGNo5OgrZ+hn4R/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIqejJSunJabh31+fX5/f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+Dg4B+iKWimZ+blpyUg4WJjYV/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhIuQlpikrqaim52gp6mhoaCSgX+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChJSpsLCknaKdnp+hoqOfkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgpSfn52ZoZ2doJ+dnZOHh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgo2UlZefnZ6hnpuViIeJiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhISEhIiTlp2Xmp6ckoSDhYWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgouVl4uRnJaEgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4CAf4eSio+ShYGDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBfoKJjIKCgoKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgIqOgIKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhISDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCPjIOBf359fH2MnI2AgoGCgoOAj5OBgoKCgoODgYGBgoOFg4ODg4ODhISCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgYKZmYSBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODhY2NhYKCg4OCg4ODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYWFgoB+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGhIB+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhoaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQjIeGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomKiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFg4SEhYSEhoSEhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICBgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn5+f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4CBfn19f4CBgH9+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gIB/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGChISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBf4KCf4GAgX+Af3+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KEg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHiIiGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eX2BgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpaAfX5/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+DhHx8gYKEgoB/h4N9g4F/goKBg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoGCgICBgYB/i5SQjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WFhoeEhYCGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg4CBgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjYyMj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1/gICEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYaGhoeFgYSRj42KiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeHi4uLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoJ/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99fYB+fH9/iYN/foOQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo6KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCCgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/fn+Af31/f39/f4B+f3+Afnx9fHx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGChIODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+fn9/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXl4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgICAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYGBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foCAgYGAgICAgYKBgIB+gIJ/foGCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoCAf32AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx6d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoOFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICDg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBf4GAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8foB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WChoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeGg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KDhIOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoGEhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3t7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhIGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fXyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXW19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTVybu9vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDP0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF08iUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slMmarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaanl4icnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XosDJmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKbWlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp27s5/Dm9qto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg082Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNXN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jIj6eaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWUjKelqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKihko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPS1LnH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhn5eSk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJeanZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGgmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWkpKOioaGenJuVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6OkpKSioaGem5qZmJmZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5uam5ucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoZ+fn56cmZminZubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6Cfn6CgoKCem5mcsZ6am5ybm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZydpKKfnJqZo6yenJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqbm6mjm5qanKOLnp2dnZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZm5qmopqZm56XdJ6cnZ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZqZo56ZmZuhjmSbnZ2fnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mZmZiYmKGal5qco4JcmKCdnp6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJiilZSbnKN4WpCinZ2enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXopGOnZuhcVuFpZ6enJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaMkp2OiJmVnG9idp6WlZKRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2QkI+LkY+LjI+QkJGOioiWjX6Lio50aGmLiIyFh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJh4SBhoKAgomVkIl6in+FdmpkgoCHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N8jYyEeouEhXNqYIaKeX18ho2Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiGhIiIioR/gn96e4aHfneHgIJvZ1uCi4KEhYqPi42RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjYuLh5KKh4aWiHZsgYV+aGNYf46Oio2JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqGanZyioZWPoYtzbH6YiGVgWYGRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqamnoqWoqayqqa+gnaaRfHuLnZpyYl+Hl5SXn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurquqrKShoqWpp6eoqKmcjXh7lo6WeHBtk52XnqGhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mopKemmZ2kpqKhoKSminpmYY2DhWNwc4udlp+amaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraemnJ2mnHpmVk5+e3lOX2p4mpucmZufnqCfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqusbOuq6KhrJJrUUpJd3RvRVFha5CjnZ2fnZ6koqKhoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Ciqqqnr7e2tbW2s66rr6uCXEhDR3JpZkNGWGZ+n5qcm5aip6WnqZ+jm56hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyuL29vLu6v7SusbyecVBXTURvYV9IRE9gb5WWk5qWo6uotq2io6SrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1trzByMC7vca6ubi8jWFZjnJDbGBfTlJXWmaRn5aipKinoLqmqqu1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9w9TWx8DCvLu6uohWe8KqTm5uZ1FbZF1ciKyop6yii5S1pqu0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMLV4NrKtby8wMCSUIvAv2F9gnldSmlwU3qzuKicgm+WsKOmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PCy9vZyrPBvMDGpVWCoqJwnI+FfEV3jlVrq7CUemNxq7Smqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTNz8O9uLi+xa9jdHtri7eSiJlXe49da5CFcmFajbe1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExcvCq6mtsreecHFtXKS4kIidaGdyaGhqZV5XaKS6tbOsqaKhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XLy6+XmZydjnZwY2CqqoyLlHBgZGdhXVxYVYu7vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx87Dm4aIg3lnX01goZmHjItzZWBeWFdYVWe0ycC8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIyrR+cWpdUVBCXIyCf4J9b2ZbWFRVVVSJwsDAurq9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8LBkl5STUhLQVV2aW5zb2hnXVhUVlNgqcC4ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xq9uSUZESEBNZFlgZ2ZiaGRZU1JbjL+/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpmZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8LXjbq+usO1uce3nGBBQEU7SlxTWGFhYGdoXFJTfrTFvMG/vMS3tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHWqy73HuLm3rbePUEBBOExYU1NdX15laF1TYaHByMPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncWtzZmJtYFxUSUtKREpDQ0c+OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE16xygL3Iz8LAt621rX1PPzhNVVJTXmBbYWJeVYy4vcfLx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKWbnKu0tHMysS1ur+ugkw8TFdPVF9gWVpbVm+3vcDDzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhHBypszMy83KxsLCyb51R0deUFJaYlZRUlyiwr/FwMrJwsPDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7ua3bwr62vsC+vrqmnKqzt8TApXZ0d53ExsvIwcPAv8nLpmxLXVJQVmZOSlmPxMDAwb/Kx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCmJdwd3yYvr/GwLi/vL3Ew7yodGZYVmNwTVuQwMS8vb+/w8K+vse8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVleYE5TW1xvcnaCoLi3wrqzure6vL66vbGNbmZ0hG+Zv8TCvbu+urq4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVGx1h6awt765srWxu7i7tbnAr592eZqtvcPFw8C8v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNoZdfU0NZVUhialVORElkjqGsr7a6tbOxq7u4uLS4wbu7gnWbt7zBxsK+ubm1raWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve292cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9tTUpAZVlCUHiBk2dMQl2CsLWztbK0r6y7ubi2ub/Ct411hK61uru4tbKxrayfpKannaOlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIV7V0VCUYhYSUpYeI2BYUBWpLmztLOwsa2wubi2u7e6vrGsqqSurbiuqaqsq6OooZ2dnZeXoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUZ0w/VHlxTklJS2idflhFWLO7sayzr66srba2srS1rqiinZubm5ynp56fqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZFU6GEUFdJS19JWItgZWaEr7WqsrSuqquvsLKzraWckJaSjpefnqGgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUmRNSkhHT1JOSk5IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMa/y55OQXWcbk9tSk1jZnZ0YF1ic5Gyr66ztaqmrKuim5mUjZCVlpiXm5+hoZudpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotWUktmo1hmfW9yW1FrY1xnYmBskbSwsLispqGcnZqUl5qZj42QlZGLjY2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOLeFRqcXd2b2R3dlhXYmBkaVtbVmetrqyvp5+eoqCWkJOboJuYl5GSn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbVpRYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35ugnBgY1dMW1JaTExRWVJIT01HmqyqqaSfn5mSkZOYmJaVlYyIio6VnZydnZ6WnpqmoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpuIYVdeZWBXTVFGPT9AQ0Q/PkJRd6mtqaqln56eoqOdnp2anJuUk5SUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6Odq6e2sq2isKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLWyqrqyrru3v7u6q7itq6q4urW8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWlmXFRJREA/SoeepJiDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURBRlF3sq+nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjqmVDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzMrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFxsHGyszN0NHG0M7OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBwaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsm9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCtru7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nBu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAycPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXt3cnRmaVphbm1aXFhSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7u9xrvDurO8xcTCw7e/tba+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRUdLQUVCRkpAOTo2NDc4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2rraVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK9t7zGwcO8ta6ytbq/tMS3u7WruL2+wL2xurawtrqzxby2rru/tbe0xby+wsXAw8XGx8vFwMXGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7PCurDAsb68vLa8x7nCt62qqLCywLa4vbCxqLGztbu8q661pq62r7uysKq5sK27rru4u8DAvrnDv8bDxcG8xsLIyrjFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTc1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0vK+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqWot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/w8DAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpuimJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmaCfnpmdn6WamaOcm56wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKivs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV6dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZkXmFWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbCurLSeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendyZWFcWl1YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaqeqKKeraypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbnIiBcoiDe3RpaWpsZ2prbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboampq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMko2WlZCeoqCjnZujlZugo6GXoaijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaedmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xqpF+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio5ydl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoKKWlJiYlaKmmY2ZpKaopqGgtLKnsrehnKK2rKmtpLKyprW8taursaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20t8Cvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmJ+jnpCTmJaFjYKUfn5ziY56kIeTkJCcm5qakZaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTVJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraehppKdpraso6CPlZaSj354fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWMfYmBkY2Pl5qYk4uQiZ2In5iHiJaemqGgl6euqa2oqJ6XrbOipq2ZrKuYqLSiqa2jk350bl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyDiYiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNzdX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXuVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAcmhhXV1KV1BSSEtYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS05PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fX57dm90dIWCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVMTkhNSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo62qqLWvrqy0v6u8w7+lopmVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98c318cXBudW2Cfnd5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSEhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorp6ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnGGfId8dIytjomAZ2diam5ybXCDdWlwWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhJRkpHPkJBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjXp3iH6JiI5zipePg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl4a25pXXaHfId8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GFgneHf3t2hX1udnVmgJSOhomIh4iHoauilomOmH96gol6eW9na3h+en5zbGVeWltdal1hZl9ZT0tOV1JRSVBKRE5HQ0pEQkFEREE7Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoigloaSiY6PlqS1qZuNlaKDh5ODfX9ramt8gIGCc2JeZF9bZ2tcbGxeV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYpKKmtbCdkZmoiJaPjYGIbHNyfH99cWhfXWFfYWdkYGdmW1FFSktQT0lJTEZGTENITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG58YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2jnpCjoauvrLK1opSkqoiZiZKKlXl6fYV/aGFoXGViXWRjXmdmX1pPRElIU05GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6iaqa+tsrm3uKebtqmMpY6Rk5+GeIKDdVpiZFZmYWFjX2BmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe3wbW+r7d0sbOlusWjsMa5sbOxtKiktbaqsaCilpqikqWwraatq6ekmKCstLuiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKawqq29sL27wsKsmbqolK6Pl5iriX2CfWtXY2JZamVqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZWKgYSBinp8ioeGfIqDgYqDlX13eXVlT1xkR0VMOlFjYVteU0Y/O0hQRFtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wLy3tbu7tr20urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfo5Sip7G0p7KzvbbBvtPJydPGwsXMwsrDwL69v7u8t7SvuLe2w7rGvcPIsJ65qaGrjqSntomAf3JgYmJeWGFfaWdSWGBWUVVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLS0hGSEhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqDpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrGwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZf3psXmFcWV1hWmNjUVxgU1BLQ0JFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmlimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+VkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwp7O01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3C0NK4sMO8xLmltrrDooJvZF1dXllgWFllWlFdV09PQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZeMm5uXi42VkZqOfYmLhI6KiouQh3uEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtteHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5uRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdLRxdLWxcDOx8fCqL63z556b2ZeYl5XX1NdWk9QVFBOSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqCLjJmTk4yLk4+WhHmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ2Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NTX1cnU2s3J19fRyqzDw8uMc29jYF9YVFlTXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5OZio2IiIuJfoN4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDxBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGubbGzdLQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eHdvZV1aUlZRWldGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoKJhoWJgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1NvX09nb1s/b2tHWydTLlXp7aWhcWlBTVF1IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEmI6Hi36GhoB3gnlue3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJCKjZGCjIWJiIGGkJGenJmJhYuBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hXt+gZGJhIV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKOcfYmEfYlyjIp+c6aanJiThXuOkIiEaEdwoKSdjIuQkoWJipGSlY+cmpKUkZaNi5WfnZSglJGNjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Ozw2Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZudlJKAi4h/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuPj41bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaSnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGe3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZudopKpr5+RlJCNjoiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ6Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMC+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rPg3OAaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5SWlJCLmJmWoMCOo8m4q5qipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe9tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+krbOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZepo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi4+VjYqMl5iSnZqzlpWrnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzt6vCyMS1ur27xcjHwtGhxsnNzcTW1tDL1KJxfGleW1RfUlBGRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKf4Fzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYmpeXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIiPl42LlZeUkZqWnaeasZqRq52OmY+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVpgW05LQktAREY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm5+qm6GblZ6vs6eLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefmJOZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6ot7XJw762zrLFvsS8s9HJyMG1dXltXVlcalNNSUNMS0pKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHmNoZaompqYur7HyMrC0sjKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6yttK22taCfrp6mopijs7ypm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnZ+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllXXVtMS01KR0RDSUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY2Xjp6SiYp/iJ+ThHeFf5V+f5CIipB/laGarqajmMK9yMPIxdPMzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdqre3qaSvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmJaZlaGkqKaetqupurvEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzg1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEallJyWoZeplo2Qg4elkoiBh4KchIOVkJCUjpqin6++rqHGvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFBRO0dLSEZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eYoKKor5mQl4eLp5aOiJKFn4iEnZeOnqCao6S1yLSpxrrDw8jKyMfMzsa+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSqqaaurJmkrqWlqKy6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrura+s7Ktvbm2oKOnqKWnnJysqamMZGZhX1JLTEdHTkpWTD1NRE1JS0FDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRauVnKGfu66ZlJ6Mk6qbkZKTiaqNh6KejKStlKOjtsa9tMG6wcLHyMXCzsjBvbmyr7m0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKqqvbynrLyzt73GvLa1t8Cvvb+zqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjKShlJyinqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLSysp6coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJabmo+qlpanppWtrJmiq7bEwru+t8HCwMfEvs3Hu725srC4s7/DyLW/r7y2urempKurrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdl42VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbkqWkmpissbayqqWpraycmKChko6QlqmflGlkWmFdT0pHS09MSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqauXtrCjqrK1xMK9v7bAwrvIwr7KyLa4tbSxs7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqWllpWcmYuPkZOkn4liZVtkYExJSkpPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6ukoKOframsnbuwqKy1scjDwcKzwsS9xsO8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLigoaSSrq+spaafkqGelZ6PkI2VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+On6GTi6assKWmopygnpOSmpSFi5KNnJ6AYmZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZWyq6eipbKsrqm7sqywtbTGv8TEtcDEvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlJWTo6C3oqSllq2xsqWqpqGempqalpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6CZnpaMj5mQgYaWiZSfeWRpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaqdua+ro6q0t7Gwubevtri3xL3Dx728w8HHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFtblhRUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaefnKGpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCwMC4xL3BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+oo52UoZibqLWpl5mSkp6ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWXlICPlIV7j5KDjJZmbHJocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa+zuaamsLfFt7G2vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubapra6wp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmau4o5eTkY+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqlo6KgmZaSk5Z7i5CFe4yLg4uSa254bnV8YUZgallJSFlaPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6utsbmVl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoKyom5ydm5SquJuUjo6LmJyimJCXpqGfloSSlpCdnJiWloiXkJebqJ2koJKWkZGXdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3v72vq7OznKCnsK2lprClnrK1rauysKypqLS5rLSytayzrKmsqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmZqSpLSZj4mNh5GioJWNlJ2glJOFj5SSnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoamvpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpaWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnZirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6iZo5iYj6CnmIaDjoqLnqGPi4yWnI+PhoeQlZ+dlpiVhpaTk5eknJ2ci5GPjop/f4eFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzuEfEY/V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Gts8TDzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Otraulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq5+jnrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp2koqqkrKKeprG3rKyipKKaqKqtqZyhpaSjmKCZlY+YnZOBgpCIhZygjYuOjJmPkIuEjZijm5KRm4yTkpKUopmbmouNi4t8hoGBg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SiqrCXqqmttau2saukq6qpvMDAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsa6tq6yntqqlra+rua+osbGusau1qra1p7S2q6ykqaqco52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqSjn5mYn5GOj5mNfoeMh4SenoiFiouPjpCNhIaVopqOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC/vbu8w766w8HAv6+ys7K1vbzCsrKzq7OppbWppa2zs7mvo662sa+xuaq4rqqutqyqnqqrn6Ogtq2ooZ6vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoaCop56nm5mqsKiin6yhoZKhoqOmmJqopZeXmJ2PioeViHyNhoWEpJeFgoKMh4+OkYSFlKCXiJGdkJORjZGclZePioWGeHSBf311eHqAenR0emmCh6N1aV5lbIJ1Z4iLfVJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE86VkI0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHDvcC+ub6/vMm8wrmwsLWyury5wbO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd9enVxcX1ohnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsJmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur63rbm2v62is6aqq6+1uLSqnru7qLK/srqgr7S2qauerbCinKWoqaKenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOpopqZo6OVlpOeoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enFwcHN4aYF0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTV1ebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk8MlBbPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wr6wtL63xLbDsq+6srPAtru+uKm5uL6rpLWnqKqwrbmwqZq6vKSuv7S0oa63taemp7CyoJ+kpqegpZmfraionqCqr6egppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhpb3Bxb2p/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBaWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8K6sbW9t7+7v6+svbC0v7K9w7qpu7u4p6i2qKersKyzsKaavLekq7u1rp+wuK+ppaavsZuhpKCjo6GWm7CmoZ6ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImKj4V6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZWxsbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5Xl5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhELjwyYlYsMpWioZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6uLGzubi6uLqvrsCztLiwv8G4rL26taais6qnqbKrrbGhm8C2pKe1taiesrypqKaor6yZo6eco6aUmKKypZmeo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2TkqOopJCIio6FeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhpamdmb4ZnaGlkZmlqYGliamdbZXtjYFNzVFxbU0tKR0lPU0AhKmleakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWZPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBt7Gusre2uLe2raq9s6+ysb2/uK68vLGln7arpaWzqaqun57Bq6ilsLKprLW7nqmqq7Gll56qnaakkZmnraKYnqSpoZyinZegnae2pq+qr6GhnZ2hlKCln6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqKiHmFd4KCgZyIi4KJfH+EiIaFkYSWlY+Oj5GRkYySe4OVjYVzfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0FmSCU1m6OfkIusoZiYoJals7Ghsb23obHGvLqxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrrS2urawub6tpp61q6CgsKSrrp2jwaCxo66wrreutZ6tr6ytopmcp6mknpWbqKWfmaSiqJ2aoJuUnJ2ssKa5qK6ioZqanZido5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY97gnOBgYqYhYd8iYmEhYqMipOEk5ySko+QkZaOkICAjI2DcIB+ZnhtaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWSBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKhmo2OsJ2ak6GZqbKvn7i/tqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqaybqL+YraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+npKCYmZmdoI9roZaYnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQgGeGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKanmay7laalr7K3ra6lqa2rrKWhn5ygp6abl6GlpZubp6edk56fmJCep6qjta+jo6OclpeYl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIg3J4jI6FiKF2iY1pl4hmfXJ4oW+Ih4R+jXx/oaCgmYB7h550iI52m4psh4GCbWhlY3pscWFUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprK1rq+ztquppbGtpbWznK21trSlp6mzsa2yqK+fq6GyqaCjopqhopuutJWjpKW2vKatp6uqrKiloaCYoKajmZmmoqSYnKSplpSjnJSTpKWmobejo6CkmJSTmJOciK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2lk4CmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm5+drqyUnaGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5qUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKUY21tp21bhKBFaGeHlkV1nGB9Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZSCrKelnqOlqrK3rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZeam62llpuhnrSzoauboq2toJ6ZlqChqJyYnqSfnJmhp6SPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKm6tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2soZqZo6i0rqKpj6moqpuelZegpKeanpyin5ugo6WjlpuemJmdoqqbpZqcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QaWhkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltaiku7fBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqetsKijn4+soqiWnpeboaWhmKKhoaGaoqKnm56hnpWZm6agm6eVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnuFf6Rvm6qma4aEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRTUWpjZlhBT2tfbGhPVUdJOT1WUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2hqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq6+mopaTrJ+lkpSgm6Smn5SapaahmqOfrZqhn56QlpuhnZyllZ2VmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZiK6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyuri0uL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyupqGVmqmfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52gmJmclpeioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFpMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC3sbW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adl5unpp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09iUmtlYmxaY11gcHtjVFpRPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZSbrKmXjJOlmKSsopGWqrGjoJ6nq7GZoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbGrpKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKNnKOel52akJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5yfqaOznqOljqeilaKanJeVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9iWiDeW15Y4uscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL2moaqXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoamnp6OpoZGtnpeknpeXl52ej7ColJunoY5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE50TUVXXWZgTFtYZmNfT1ttdWlxUk9ERU08SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+p6mmlZSclaCak5elqaiQnZGPl5ywsr+sm6edp6KJk5Gpmqijm5uroKOam6OnraOfq6KasJuVp6CWlZ2fnZexpJihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkZOYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZHd9d2twem1gY11wZ01ZWWZpYFdacHpubGZTT0ZTOU9aTVJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwZ6rpJWSnJeemJOUop+eoqeTkZmop7LDr5qrnKqfj5aWqZ2qnJygrJihm52ipbCnoqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWOm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6j4p8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4eCa3RkeWZgamVjZGZrWWt7cGlqXFJMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrb6grKKQkZ6amZSRlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKqvqqajq6Ktm5+goZmknpyena+jmJ+ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaJ3a2qLmKOemHNsbnqEjYd6WGVehYJebIqJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY11STlhKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOco6qokp6hnqCqsaqro6qgqZumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp99lZiJnsC9gpadnY2dwsF7gnuSjJrDwH1qpbFvjIBvynp/m3eSg46BdnqBf3lxen+HcXiFjZN5bXaTY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq62/wLGgqa+pl5KfnaKZoaOqo5OgoZ6era+prKajo6ehpaaeramSpJupramcnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoI6Ns2qErnR9loe4YYOtWaPNbo91e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+dna6wqKupnKenpKKrkq20l6aiqqmdo6elobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJealqinr6yop6mel5Wao6KRlKGtm52mo6+so6u0qrrNsa2mrquWlJydopifrqydlqCZnp+qs6mqqpurqqSjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKajkJqiqKCgpZyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqglJ2fp6yspK6arKqjoquis66iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZWpzcWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKxs6qtqJOJl5ykmqGjr6aYoZWZnKWmq5uwnq2op56so7etobK5r52br6ezs7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppqjp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa6pramRh5Ccp5yipJyll56ZmpqmpKmar6KupaaYr6W8raG3t62dnbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4aXlzboB0XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKmRlJetoKCepqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpqKVmpqcmZuZp6WmmKyorqOlm66nvqyUvbCsn6Kws7mrtKeaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2J+dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrbilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKafp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamjn4uAjpuan6aekpWampSamqalpJqprKyjpKCqqL+kl8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmOnX5kc35ihHh0gHxhamdxbWZlZU9VZFxBVF8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+ooo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuRmpipoKGZqK6npaajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwq5eMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5qXknuHmZGmm5KOkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2VkgI2Tj6KYmJmSl599h46VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epqqhn6OjoJGLpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkI6VhYGkmpeVjYuSkoqPhoR9Z4p/dIJ2dIeLcKdte5SRk5KBgY6QkI+dlKGWmZeig4iUjXJpkHdwi3h3fHpqbGRkb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqykoJmnnp6TlaOWqJqomZSmoaOQm6iZobW6p6uYmpCNfIGUi6CUipSRlZCQlJelkJ+aqqCctqOdp6y3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSImId6cpZzeop/cnx/am9kXnBqYFtfWW5jUGBlUFs6R0dFPjI9PTcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj565tqSlmJuNiXmCk4uak4mVkpSQjZKXoo2enqmenrikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJWLkZyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmHipSSi1p1lZBoaI+OcnqmmZlleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk1OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUEo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56NrJqilKehno6XkZ6Eda6PiKaaqJGXpIiburSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgZGXloSZmWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH6Si4ODmWuOjYVseHtxcWdkeG5qbGpbZWtqZnRcX0hUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1hbWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1no+Dnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6Kbg5qAjI6FiplwjpOFaHd0fHdoaHVxZ2hrXmRvbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYhqK5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onaAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWWfbFtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWiqJKhoJ+mm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipiomJmakYelsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwcpOIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnJizlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRopObmoyKqKilno+Wh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU43VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJyIj6ijoJmLkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoGdbXJ9lG+Zc2qkXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVWQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgIiYlJ+ahI6pnJqUiouKfINshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Emm94epdrm3t3l3NtqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYUhXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6OiW9/hpCTkmyXk3yIkZGjlYOOqpqUkouFiXmDdoiAboKfh3eAk4aImaKWepOipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Wg66hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpGWioBvTGajknCbh3Kke3l0YYOBa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhxUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WnVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqeQgKGskIWQioKKfYCAjnNoj6WEfYaUjYiYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpygfKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlbYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hFtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpJyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqYaOkpyQiJ6eh4ybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J2gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGg36ThIOGioF6gIOLm5+Pgqehh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoF7coKAeH99f4V7bYKMhXx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npaioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXhoODkH+AhoSGfIaDjZudkoeqn4NyipCGk5GLnZF9jXqqhI2SmJaPnJeHh5umn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiJOanoKOl36GjYJvd4VxdWF+go+GdYuYgYOPgoaEfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiImMfG9rfoF8bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pngIBsc4BrbHRveW+EeW2GgHaCgH2EdnGCjYd+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlaW1ti4met5qho5+SkZaXi5qfn557eJ6mkZuKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2Bl4iBiI58fYWEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gJCamJKMmqOho5qXkZt+jYR4gIOOh6B/fYyNj3yYpKChk5mQkKeNkIGbkYmSl5t9kpJ+ho2BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfH1weHuLhHp6kYyDlqWTi4aQfIaGh4V2goSIiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrY2xoZX+Ba219aG9xa314hnpri4FzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmpueYmNnrKSpaWcjpCYj4adoZudfHakoI6Xf42iioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlaCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCiYV2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWh9g2xodGhsb2mAfIF5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamJjdVaDaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDe4CDgXh0eHpzfYCEf4mLgGRefYuVh36Fh3R9fol/fZeEl5OWjKOhmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF5cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dXiAfYaAfIOMhIyUpI95hIJ0iYd9gHR2gYiEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2plamNod4huZmxoamxogXx7d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2V2Z25sYXloa317eHBhd22LgJmZqqCjqJ2Ki5KGip6LlZh9d66YjJd9npSRlpSId357inx7gHZ3f4BwdHN7b4V9gYCKf3xhXH6PkYZ/hIRzeoCGeo+Rh5KRm5KlnJWCfoF9jouSpImOio2Ymo2GkZiTlo6KiIySnJOQjIxug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiISMlaiMe4h8fouFeH5xcICFg2NoeXR1cHxiXnBga3RecGp7eXhrc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GNb2RpZ2RpaIB6d3RujoV0gYKDe3WCiYV3hXx4hIV6gIl3f4t7e3J5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlJKOh6CNlpOQgHR7doV3eH9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYiKkJGJnJahnJiVhZeIaoSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJh7kY2PjZqSfIp/gm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2uBg4FecnNycXB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk21gZmZfZ2uBdXFycIuAdX+DgHh1gIuAeIV/d4eGd4OFe4aMf3t2ioBqcWN8Y4Z8b3FtdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOQn3WLn5SThouajJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHKKhYmOiJyan5qWlICTfmiFnIdnhaCHkoORg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx7iX2CjJCenYV8fHeCjH13cWpsgYJ5YHhvbWxydFZeb2JyYF9sbnlwZ3BmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4Z3Jqg2CIfm9va3pgam50f3RfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN1g6CCk3eVkZmbkJl7lHOFkJ+hk5SQipOblIZ+lpaIjY2IkY2InH+OgHd6jH6Ii4qcnJ2alZN6jXZniZGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenloc2pzi4+JgYWFfZWLa35+boCLfouHfYR6gY+VmpqKfHZ4g5B5c21mcICDbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY194YGBWa19edlBOS2BnY116cYl0XFxldmBhZWWPZGBlYVhpc3NtanF2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WWxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76Fza3WDdYSihZJvlpCVoJWcgZFxhoujl4mOlouQnZaDgJWQhYmPgJKKiZZ+h3p1f4l4hoSNnJuYmI6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlZOZkHRzeIeNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHhNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtzd4t9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRwgFdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXaKmoiNaZiPj52Vk4GJcYWJoI2Ei5aKjJiUfI2TiIOJj3uRi4WPgn92eIODcoeCk5uWlJiGjHWHf3CEgomGmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQlohvcXqMhnVscWxyeIFfdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hjaVhtVlx1TEtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm5pdHeKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHd1eXiTdG54en1YeYVxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNtb2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY57kI1+iYV6dHuCenCGgJaZjpOUgYh1g4Z2g3+KkpyfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyOkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SIfm9fcnCFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm95jH51bm9rbHp9Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xcpa8xIR2cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4OCcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi498aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCEg39qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGYjI+MfW5te4l9d3RvaGh9dmRccWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aF9lcntaYHJ8eWdwemFlZY6xsndKYlqk2dCXcXuRi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qHfGV9foN2Y3BzgGh4cG90mIyFgop7dniAhHmBalxwfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXFgWXdaWXFuTlhyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcHd/h25sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaHhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3duiIRsdXt0ZnmCg6eMg4+LhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4KKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBzgG9bbH50eIqCi3uGgHyIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZmX3RwW1lUb2RZZXB5WmheX2dtZ2psaW93fY5saYKEfnlugHt8gH+CenWCgYyThXCAi253foB7e4iTiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iISlh4GHjYl+bn51f4B8i5mHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnSLgYZ3h3WCiXp4cm6JgI6AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQGFkW2B2YVx0bVhXU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g35+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ+c4R4f5GQgniWjZSPh4KIeomJbHh5f3Voe2lrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJzioSCfYNwhop3eHBwg4KMfn15fnx1joWCdWlxaWyHgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxjcV5dd2hVV1V3XVtlbmhWa15hamdlb29pcHZ7k25piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIjmZxg29ndW5bbX2AkJOAgXmSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdISHf4B5a4iGc3lrdH+Dg316fXh7couAfHJndGVtioNtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R1kYJ3cGdefYJ5i4llcYFranFjWGx7hpyIgoJzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWpscXd9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXOAi3yBbm+Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwcneGeG6VinR/end+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYqDZnF9aGprWlZveIqkgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl0cm9oemFqbWBtdmpna2t5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0e4t7gmZ1h31tcWd1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxZZWNedGZtZHFmcm90gHdwmoV2f353f3yFh311c4KIf5SCbnN4enpzc4WHiYiEeIB9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3FhZ2tnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt6kIR2mHyHhoKGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcneKe35idYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExPcEdee2ZhTVV0Y0pOU1dganZ9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVHNXTFh1ZFpfa2BcWmNlX3dmbWJwaXNucX50dJmBd3+Ad39+hoR6fXWChH6XhW5ydHt6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIWEbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1paU2JuZVtYYXR7amhtaV9iV19aaYBqa2+AZ2xhaHl5a3R0dG6FgXp/fXZ1bnpoanlqX2VuaYF3j4RnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW253ZHBziHx5YnOAcGdqeHNya3d2dHdjg3t+d3ZwZGNjbnx9a2xWamNnU0tsaFBHUmxFYXhmYU1TcV1JTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlIF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1pZWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Fthnt+fXl2cmx6aGl3Zl1kc2h6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwc2JxcoV8dGRygGxhbHpvamh5d3RxZoV1enp1cGRhZG5zfmpsVWpeXlRMc2NRR1diR2J2ZmFLVG9XSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUhXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXh6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrX11dc4VoWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYV5f4B5d25vdGVpdGVbZ3VmdnaRel9dUmZmaoKBc31hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2RabnBhcHGCfHNmcoBkXm52aWNmeXp0bW6BdXN8c3FiXmZub31lalRpWVlUTnhfUkpaWUhidGNhSVRtU0lMWlZpbHJ7Ymxsc2JhWVpbYXZcU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpZV2hjbWVcXHGJZVNybltaWFhgbHZkaXVqal5abXNxbHRzdGqGfH6AfHdvbmxkaXFjW2pyZHR2j3NbVlNkYHF/fnGBXGFjXVNaYFxjkp9lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZXVnXmJaYWdcXndoV2Jdb2hhd2Fbe3ZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXW2ptYnBzgXpzZm9+W2BwcWJeaXB8bGtzfnJxeGtwYFxlbG17YWhUZ1VXUlB2W1NQWlJIY3NiYEdValBIT1pVa2trfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LaWNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1JdW1VnYmxsW1xxjGRPb25dVlhVZ2l0aGJ0ZWVdWm51bnB1dXprh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxdIF2c2JtdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF9nVGVVVlBVblhRV1RQSGVyX2FGV2lOSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2hRWWZUU0haWlBOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaHZ2f35tg4B+hpd7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Ld3hueoxgZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX15UZ2Bsb1xebo5oTmltYFRWU29mc2tleGRlXVlwdG1yenhzbYh7gHece3prYWVsbV5gb2plcHl+Z1pWWGBrd3t7b4NeYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3SBc3JeaW1TZXBlVWJuYXlicHZ7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWXV1XV9mbWhYYmFbXo5xY2dqd3FzbWh2dHmDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMC8sgKSgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwcHBh+qaSkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQio+Mjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4qGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEiYeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpKTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpOTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZGQkZGSjZCSkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+Pj4+Ij5B9jJCQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+OjnuNjHaKj46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIyOc4eKc4WOjI2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4NugoJwf4iFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1cWZtanFzb2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdsZ2lmcm5oZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxlZl5ybF1eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QU2FiWWtkVFFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BZaGhiaWJRT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQ0ZKTWNya2dwalVOTUxNT09PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkA/QEJQbHNtaXNxX09LS1JMSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz49QklCPE9pcG1kcnRmRUpeVEZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7OztBWVE+RWZtaWBwcWlSYWZFRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTpHW1NTY2pqbnFtamhtVD5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODpNY2NpbGpyb21rbGNAPUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT5dbW9wbXFubGtsTzs+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT8+Q0tmcnFvcG5qa108Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg8OUtrcm9wbmtnRzs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXZNNzg5OEpscnJwbVM7PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l7d1Y8Pj89PUpmd21SPT0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BBPkV0Vjs8PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVNQUNFQEBBTnZqSEBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcEJERURDWHWGiIl+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhEQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktHRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozw9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXRzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBREFPUE1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1FRVU9MUlNUV1hUVFhSTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01LSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHBzd3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETUdBREtLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLRElNTFBNT05PT05LSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTUhERUdDQkBCRD1CQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSFNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0NCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0tPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0hJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkM/QEI/PURFRkRDREJFRUVGQkVGSENESkVFSkxNS0xMR0dNSkdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWx2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXW1tcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtLSktLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MS0hKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdISktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tNTEpKR0RKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0tLTk5VTk9LS0xHRktQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f29nb1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWFFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltZWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hRVFVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVtcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV5iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UUlhTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWFlZWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUVdWV1ZXVlNWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWlpeXV5eYVxbW1pcYGFeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW15gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fXx8fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2QRigqKioqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkJQ7FhoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJwcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXFycnFxcXBwcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwdXJwcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXF6cW+Ldm9wcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcY1zc5h4cHFxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnFwl3t2oH9wcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Sfgnukh3F0dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHd3d3d4f6eMiKaQd3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t7fH1+qZKGpZV6e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fHx/fIKrnIqilX19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgICAgIKAmq+op6eVf39/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIWspqWvpp+Cf35/fn5+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn5/gX9+j6mZoqqbo49/gH5/gH+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBg4OCgYGfoZOfpJifmICAhI6Cf4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGDi4uFgZidip2qm52ahIibkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GFlZuMkp2Tna6Zk56fn5qIh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKNpaqsqaOdpZmdpKKdkIeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOTpqihnJ+am56fnpaEhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoSRl5aYnZmcnpyajICAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4ONkpaal5ugnZOEg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mXiISChYaQlpmXnJ+biIGEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhIqTmZWanJCCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGCg4eSjZGOg4GBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgIGCgISJiIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODgoSDgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fn1/g4SDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Ag4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/f4CBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYOCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWCiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GAfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjoyIh4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoGAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkoyMjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjI2OjY2HhIaGhYSEhIOCg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5/foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1+gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIuNi4mHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiYuHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fX9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6PjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhYWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhICAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXW19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVybu9vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slcObvLiZtLOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaafqI6AjcWdmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ajKOJrNa6mKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5m4urrZulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqClpJyWp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg1aS0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNfK2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nDj6Gfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTk6irop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqrjY+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1sC/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyBc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWmpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo57amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJibm5ycoZ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJSZmZiVm6aWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4SMlouMipGci46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomQjpaCjH6OkoyIhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9ho2Zm5CEjHuNio+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHqJlZGQgoVphoWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNm5aLkYh/X4aFiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqCZnZuioZWQm6yRk5uYe1mGj4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hmqCsio6hn3ZZg5mNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKKmpIWGp6N0W3OgmZ2Yn6GiqaegoqKurKuqp62vqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhpZyCgqGicmNmmZ+elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6WSgH6dnXFoX42ioZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGuinx+pZ5valyEpKWinp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66ruYN3fbKmbGlYfqWio5qcnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLh6cnGwr2dmVIGlnp+WlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSud25lrLdrYFKNraWlnZekpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb62qX51aaK2dWBWnLWurqqqp6ynp6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+t6aJfn2Vo4Rtaqq8rK+vtKmqpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DybCWiHuGjJGJeYChuLCfmrCurKStsLSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTEubTAt7S7xcudgnhmdoSGfGx8hqa2qpmit7CmsLu1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysfEw8TCxL64vcq9iW5hU2J9fmlVZ3CNs6qdprSzrLLAtbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMfKzsrJx8jHv8bLpHleTkhUd3VeRFlieae3wL6+uay5wbq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfBzNXXzcvKzsXJvIprUEU/TnBoWD1OXGyVxMzGxrCZusS7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIxsnV29XNycnFyad2WkxXRUpoXVY9SVZje7zQxrCQibnCu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDy9nTyMPCwcaiaUxilWpIYVZYQU1VXmmv1r2TdoW8uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrRwb3P07y0vL29rmxGgL6PSmBXWkRUX1tfosaje2iTw7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2lmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8LWi7q/wtm5oaWvtLh3SYOrjkxoZWNCVXNgV5GfgmxlqMa/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHOpy77czZqPlqKwgU1xfnBXf3hxTlaBZVV4dmtjbsHGxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2Ktwf7zI1N6yhIWPmX1VY2ZWcpmCfm5VdGNaY2JhXIXSx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vcfKysPHydKUbHGt0dDb1JJ2fH90XmJdTpWlg4SJVF1dXFlZWGGq0snHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvG08O6vrzEvre8wL/J0MfIysrAgm5vo8vLz+C4c2prZ2BgV1WooYCDkl5YWVZRVVJ5xsvJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uarbw762vsC+vreimKavs8LAo3RydJnEx8rW14ZXVVFPUEVbn5F5g4lnWlRPTk9WnMnLxsLAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xrVsq828tbnAvKd6bGduanJ/lZZtdHeVvb/GwdWoVUJAPkI5Wol9cX9/aVtTTExOdrfAwcK+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfX1pTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM6xdoCyvLW2waGFaVpfX0xSW1ttbnJ9nbi3wri9u3NENTU5NFJyampzcGRfV0xLXKDAurm3tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLKpoR3iqGvtJhoY2ZVWWBKSk1QVGpzhKOvt765s7aeaDcwNTNGXVVeZGJgYl1PTHa0v7iyrrK8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeIe3aNoZReU0JZVEhibFdQRklji5+qr7a6tbSyrZRQMzExQVBGUVdYWGBgUFyYubq0raWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWdYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI5rTkpAaFhCT3eDlmxMQld+sLSztbK0r66td0wwMD9FO0VWV1FYXVF8sLKxrKyepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWNiYR5VkZBUohXSkpWdoyAYT9Vp7iztLKwsa2wuaR7QC0+WnuXp6KSc1Valausq6OnoJ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmVaE1AVnpuT0lJTGaaf1dFVa+7sayzr66srbW3oGZnk6mnn5qbnqB/d52ep6mfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqmvWRFVaKDUFlJS2FKWIljZmaBrLWqsrSuqqqusK2rsKecj5aRjZaeoKCfmqOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMbAyppOQnedbk9vS05iZnVyYF9mdI2wr66ztaqmq6qinJiSjI+UlZaXmp6ioZucpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxohXUktmol5pfnJ2WVJrY11pZmVqi7SwsLispqCbnZmUl5mYjo2QlJCKjY2TmKKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqONeVVscnV1bWJ1clhZYF9kaV1gWGKsrqyvp5+doZ+WkJObn5qYlpGSnpuho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35vgW5gZFdNW1JYS0tRV1FJUk9Dl6yqqaSfnpiSkpOYl5WUlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5yIYVdfZmBWTU9FPD4/Q0M+PUJRd6itqaqln52doqOdn52Zm5uTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BeZV9QRUU6REBGPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCjoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6q7itq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpYFVORD5KXH1wYkE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIREA/TIqhqZqDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPx8q/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiU0tJREI/RFaz0r2ysKacnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURAR1F5sq6nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RViCqqifmJWXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw9ODc4NTU7PkA9OTw8ODs+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF6SkhDPViMoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1NLV1crAysLFzMLIycPMw8XIysrPys3M0M7TzMbIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PDtaqYpaGZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFBCO0M+OzY3Ojg6OjU3PT1BPDo8PDk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son66VeG9zdYKSmY2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaXH08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrGyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fWiDhKWrk42Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb3B9udHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxfen6kkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvDurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzszBxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraVfZXWGk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7WruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCZW2lxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx7+5uLWwq62nnqKpp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCxqLKztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupaSnp5qgpKGanKWsrqSooquqrauwo6afqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr+/xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbYiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpZ6boaWUnqWbmJGho6qjo6ClpqemraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvcC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RIRUtGPD0/PTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqJ+VlZqhlpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8K7ur2XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaeck5SUm5ibopeWkZyioqienJ2lp6KlnKChm5mvrq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKenKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sLu2ur3AuLOxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5SXl6CXmZWXoJ6hnZagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqqs6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFiZWqAk5OJkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqqyejHJxb2BbV1ZWUkdRT0haW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGHj5COmpOVkpybo5yboaipq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcoKGgm5SQjJmOjJCMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761s6uvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uPiZKNl5GXmaKgm6CsqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefoqy1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOX+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Sio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WIjIaQipeJlJOYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqupLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI6KlJGUnqGPm5yjoqSYpZeinJWNh5majHSNg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTVJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso6CPlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKPgpeGjZ2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuxopqYhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKRfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkRERElOT2hZTlFTVFVaboNzdn5qaVxVj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuViYiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ6dmIynpJOhoJaen6SAcmhhXF1KV1BSR0pYUk9KTE1SSkpKTFBJTFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyGdG90a3FsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV+cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhtfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnaimXl+hoGFmYWbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMyME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1JRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPRElIU09GSExGSkdFRkhBS0VDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKawqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWU0lHRkxRR0NHSUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaKIlZOWk5STjZCWkoeHe4aBjZaKgISBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauon5WWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7SvuLe2w7rFvcPIsJ65qqKrjqWotomBf3JfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3psXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuJfIGEc3uKg4Z7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLizu721scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydHHzM3C0NK4sMO8xLmltrrEooJvY1xcXlhhWFllWlFdV09PQkJIRUJJO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhI6KiouQh3yEgnB/h4GGe4dyg5GLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKyzp7C2qqy8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56b2ZdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoZ+gqKWqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29jYF9YVFpTXFBKR0lKSkA7OjtFQkQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJOZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZvZV1ZUlZRWlZGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeHF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnqLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbY19jX1dvX09nb1tDb2tHWydTLlXl7aWlbWlBSVF5IQkVJST5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uGgXV6kp6NoHaPdYJ0dYF9dICEb4GPgW+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdW6TlpSVj5iQg4qPlpqXl6Wcl6CXn5OSl6OdmauVkJCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYifl4+IjoqMgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNydHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6emhpZGBUV1ZVTUpETkQ7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bXx9hn5zfpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZeNjJWfnZShlJGNjZCLfpCOjouEiJKVmp+fiYyUkp6Rgot/pZmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHhsamRXYFtUUE5HQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22AfoR9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5bgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmiooaSnZahi4qIjZyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzNDMztfP0dSu1tXY2tja2tfW2dqfb3x1aGdcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4WHiZCSjo2TlImFioqGlpqbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ6Wm4mPh5eXioSOjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U2Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+lrbOzqKOisKyKmrWdo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KWi4+VjYuMl5iSnZm0lpWrnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZGjua6ov7ysrbK5paOnfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFpgW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq5tcG7q6mcsqWkqJSFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcalNNSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy9wbOsu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkq+sq6yXhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXnJWUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8K3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJeXkpalmWWYo56ypZailqytq6ebn6aXmJaZlaGkqaaftqupurzEtaW0tsvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e4tLiyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wfm5aaqJycoaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZeOnqCao6S1yLSpxrrDw8fKyMjMzca+urKuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtra+wb++uLKyw7G5vayjrrSsuKWIm5emm3a+oISYnI6TmZqLrpehnJuXlZufoameqKCZmqmZoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvbm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXBzcjBvbmyr7m0wMLKtcaxwby1uquoraywo6KZqrS6pqmmq6qdqK+no6qqvbynrLyzt73GvLe1uMCwvcCzqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FdYF1KSUZITVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJabmo+qlpanppWtrZmhq7bEwru+t8HCwMfDvc3Hu725sq+4s7/DyLW/r7y2uremo6qsraCgmqqqxKKlqKumnquvrKKpqL64pq29sLe2x7a1ubi/sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWmJdTklIS09MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dNopqjnJ7FrKGfrJ2crp+So56WpaCnqauXtrCiqrK1xMK9v7bAwrvIwr3KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9taWxvLe2tcOys7e6vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqallZWcmIuPkZOkn4liZVtkYExJSktPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6ukoKSframsnbuwqKy1scfDwcKzwsS9xsO8xMq8r7G2rbC1r7/FtbmxsLq1rJqosKmpmp2loafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZmJOipLigoaSSrq+spaefkqGelZ6PkI2UnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbaGZKSUxKU0JDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZWyq6eipLKsrqm7sqywtbTGv8TEtcDEvcjDtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlZWTpKC3oqSllq6ysqaqpqGem5qalpionp6YoZ6vsqKmjZeumaWsl5mepZGbjpOYmoWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBOTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+ro6q0t7Gwubevtri4xb3Dx728w8HGwLnBxsG6qrakrbutwcO4uKqtsruila2wrbKWpaeQqrmqoKewnaqgsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mgmZaSl6aht6mloqKvsbSrsqirn5ugoJuepZuhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUlpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCv8C4xL7Bt6+1qKu3sry/v7WprrG3n5erraitlqeojqe7n6Wts56rorGws6yptrO1va2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5qVjaCmpLSup6GsrK2xp7OtsqmjnJ+oo52ToJibqLWpl5mSkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfR1lmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsHCtbS6xb7MxbjCv7q/usS4wbmytayqure6ur60qq6wtZiYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubepra6xp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWvsbWvo5mdraeal56Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipOSnpqloaGgmZaSk5Z7i5CGe4yKg4uSa254bnZ8YUZhallJSFlbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3ybu0u7u/vrS0t8PBzce7w7y2vr/AuL+8sb2up7q5t7fBtqutsbiUl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbizqa6rsqe4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GorrC1rKSZoKyom5ucm5SpuJyUjo6LmZyimJCXpqGfloSSlpCdnJiWloiWj5ebp5yjoJKWkZGXdoSQh3uFgYSNjG5xd3Z8f11MZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6kra2rp6SwsrOqt7C2n6u1ucm5rsG8wrezsrXCw8/Ev8G9tL3Av7q/vLPEqKm5sLa2v7yvrLOynKCnsK2lprClnrK1rauysKypqLS5rLSyta20rKmrqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqlprmlq7S0pKmrqayvtq6inaOoqpufmZqSpLSaj4mNh5GioJaNlJ6glJOFjpSSnZuYlpWHl5KVmaabn5+NkpGOkXd+joV8fH2HiopydHJ+fX5cU2RvXk5aZl1GRJZbSDtObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqmvpKijsrSxtLWxsaGrrbzLuq7Au8extK20wsPRxcW+wLK+wcK8v7e8xKett6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpqWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaOtrLexsaCooqCrrrCsnZ+nqKmZpJiZj6CnmIaDjomLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjop/f4iGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZitp6KqspypqK+2rLi1rqqlq6q9ybuwvrjDr7Gts8TDzs7Dvr+0wMPEusC0ycSsr7eusrnAv7Surqulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq6CinrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp6koqqkrKKfp7G3rKyipKKbqaqtqZyipaSkmKCZlo+YnZOBgo+IhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmYqOi4t8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqistau2saukq6qpvMDAuLmzvLWms6/EycvRv8G7ucC/w7nBusHErrG1srO7wb6zsa6sq6uotqqlra+rua+osbGusau1qra1p7S2q6ykqaqdo52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjmKSmpqmcoqSjn5mYn5GOj5mOfoeLhoSenoiFi4uOjpCNhIaVo5qOjZuRkpGPkp+XmJaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlFiT0xVVFVQT1hbYlVIUGpUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpaqtmaukrK6ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC+vbu8wr26w8HAv66ysrK1vbzCsrKzqrOopLWopKyzs7mvo662sa+xuaq4rqqutqyrnqqsn6Ogtq2ooZ6vs6G0qp6op6qkqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKmjn6yioZOioqOmmJmppZeXmJ2PioeViH2NhoSEpJaFgoKLho6OkYSFlKCXiJGdkJOQjZGclJaPioWFeHSBf311eHmAe3RzemmCh6N1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHCvb++ub6/vMm8wrmwsLSxuru5wbO0u6y4rKO1pqarsba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKulnpuqoZuSm6CknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn99i4aQj5CEgJOblIWTooyUkouRmpGUh4l+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFQUllLS05xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6apqq+1uLSqnru7qLK/srqgr7S2qayfrrCinKWoqaKenKSxpq+gn6qpqKKqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOqopqapKSVlpSfoZablqasi56RkJGMgouAf46Be5qUjYl8fouFjo+MiYWSmJGHlKOJkpKHkJmPk4GIfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3OObWJqcGBwQVx4a1ZeTlBRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wb6vtL63xLbDsa65srLAtbu+uKm5t72rpLWnp6mwrbmwqZq6vKSuv7S0oa63taenp7CzoJ+kpqegpZmeraeonqCprqegppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWm5+okpiTmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjIyIeYOMhImMjYSHk5qOiZWfiZGVgouWjJB9hHtzb31xc3RgeXhpb3Bxb2p/cmR6bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJQSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i2qKaqsKyzsKaavLekq7u1rp+wuK+ppqevsZuhpKCjo6GWnK+moZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaaqmZycpJWVl5WcjpOXoqmhkImKj4V6hH2EinmOl4qNhnmCh4SIjI6EjJOZjI6WmYqPln6Gl4uPeoB6cHJ3b290X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0tIR1JVRjI5Xl5tUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26taais6qmqLKrrbGhm8C1pKe1taiesryqqKapr6yZo6eco6aUmKKypJmfpKipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmaGUkZSWmY2UkqOopJCJio6FeYR7hIZ9nY2KioZ5gISIiIiRhJSTk4yQlZSNjpR7g5eOi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0tKR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBtrGusra2uLe2rKm9s6+ysb2/uK67vLGln7arpaS0qauun57Cq6ilsLKprLS7nqmqq7GlmJ6qnaakkZmmraKYnqSpoZyinZegnae2pq+qr6GgnZ2hlKCln6GgmZuZnJKZnZSlnayimJadlJONlZeLj5iaqKCRiImLiHmFd4KCgZyIi4KJfH+EiIaFkYOVlY+OkJGRkY2Se4OVjYVzfX1meG9ramxndXNrY2dkZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FnSCU1mqOekIusoZiYoJals7Gisb23obHGu7mxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrbS2urawub6tpp61q6CgsKWrrp6kwqCyo66wrrettZ6tr6ytopmcp6mknpWbqKWfmaWjqJ2aoJuUnJ2tsKa5qK6ioJqanpmeo5qknZeemJuUmqCSqJaqp5qTmpqRi5WZjZSUmamnjo2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2CcIB/ZnluaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GZqbKwn7jAtqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ls7Wxrqmxt7axs7W6p6mftqmdnqmjqq2cqcCZraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+opJ+XmpmeoY9ropaYnHGClpukgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2eGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RlRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOhm6qtq6O9xa+pt8K4vb2tp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKenmay7laalr7K3ra6lqK6rrKWhn5ygp6abl6GlpZubp6edk56fmJCeqKqjta+jo6OblpeYl6OIoY6Smoehh5SdoX+lf6aqnpKRmpGIg3J4jY6FiKF2iY1pl4hmfXN4oW+Ih4R+jXx/oaCfmYB7h550iI52m4psh4GDbGhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk0/R19NRlJWVlFRUldUZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yqK+fq6GyqaCjo5qio5yutZWkpKW2vKasp6qqrKiloaCYoKajmZmmo6SYnKSplpSinJSTpKWmoLajo6CjmJSSl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6qvtrOoqKa1pqe4r52zsraqpaSnsa6usaaqnqeksaShoJ6XnKCer62VnqGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5uUnaGmoqCvop+fo5aWkpeRmIWvamqKjap+Z4SVh61kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaGeHlkV1nGB9aHykp4JZX4uraYCVeHpqpzdKr1tXU21jW0tPWF9cV1Y7TohPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK3rLS9vrC2xLK4u8KnqbCrrqmpsK6ksLqvpKWus6Opuames7Kwo6Wgqq2vrLCmp5+jorCbopuXlZeanK2ml5uhnrSzoauboq2toJ6alqChqJyYnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZCWkJmFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknerZ2uxW6x7j4eUdIhxj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaJuW1NraGBMS1xkWFxaQj6weFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAblZ+UiLOmpqGuqaezrKm7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6OinqiqsqiwqKWen5+vlp+ZlZWWmJ6topqao6i0rqGpj6moqpuelZegpKeanp2jn5ugo6WjlZufmJqdoqqbppmbm6KglpKRk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoN8poKTfJh6qnmNnJB7sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1RamhkUEBYZ1pkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltKikvLfBsLnAsba1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZahq52blqetsKijno+soqiWnpeboaWhmKGhoqGaoqKnm56hnpWZm6agnKeUm5qfoZiPkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20uKqfpp2iqqWyqK2qpJqcmqielZSYmJKSo6igl5Klq6+mopaTrZ+lkpShm6Smn5SapqahmqOfrZqgnp2QlpuhnZyllJyVmaKflZmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6dh5mZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraiyqKqyuri0uL+5t7K2vLWkt7OftKyfn6irn5WntquosbGrrrSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpOQpqyupqCVmamfoo+RopmopaCVmaWonZyknq2doZ2gjZSem52gmJmclZeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rbmVPSkOhXFpMdF5iZk1aYV9ydF9KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC4sbW/ubqzsbe8qbq0n7CknqWnp56UqrGpsKm1rKuvoZihoKakpLqio6ugl5uRoqCVlJ6alJieoI+NjKivr6adlpuopp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYW1ZYlxhcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sa+5uKrAtamqoJumo6GdkqqqqLajsqiuqqCXnKegpau4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZScrKqXjJOlmaSsopGXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsSxurKuu7CuwLGspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2bkJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5ufqKKznqKljqeilKGanJeWpJiPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3p9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNQZ2ZxbXVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZazw7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6moauXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoailpqOpoZKtn5ejnpeWl52ej7CplJunoY5qfmmcpniHc36aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunrai+p6mmlZSclaCak5ilqaeRnZGPl5ywsr+sm6edp6KJk5Gpmqikm5uroKOZm6OmrKKfqqKasJuVpqCWlZ2fnZexpZihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dacHpubWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwJ6rpJWSnJeemJOUop+doqeTkZmop7LDr5qrnKqfj5aWqZ2qm5ugrZihm5yipK+moaSonq2Yl6admZqhnp6dsKCcoqaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGclqichJ6pq6KzyLOfqqOql5aXmqedqJqdo6uTnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmJ+ok5iXnJGkmZionZqXZoOSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOboqmpkp6hnqCqr6qro6qfqJumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr6Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqqWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopOmray3s6evopKRmp2lkpGgoZebn5yHpqukq62/wLGgqa+pl5KfnaKZoaKpo5OgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WVoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC3l56RpKqorbOrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq2kqrCowMazqKmxrpaSnZyil56oqp+VoJ+cna6vp6qpm6enpKGrkqy0lqaiqqmdo6elobChk5qnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZBkb3R1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoaWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6u0qrrNsa2mrquWlJydopmerKydlqCZnZ6psampqZurqaOirJuvsaKorK6lmKaqqamxopKXo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mZaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTb215eHdvbGZlZXFwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC0sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZn6SznZqglJyfp6uro66arKmioaqjs62iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk39we3V9e25bZWpycWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramyraylopyyuayqoaabqKaqrKmmoKalmKujn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrZGZnKaioKqmrqGjp6mwtMKxs6qtqJOJl5ykmqCirqaYoZWYnKWmq5qvna2opp6so7esobK5r52br6ezs7OllJino5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3t9k5KLdXpzhX9xXG1ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKpprKgmamklKO2oqKVl6KptLiknKKdo5OQobGZnpympKGir66dpKihtrLDsa6pramRh5Ccp5yiopyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyuLCzp5ier6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jI2Ti3h9eY6CbWl4aXhzbn90XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqaewo5Sso4+lraOdkJqaqrS0pJ2knamSlJeuoKCdpqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpaGVmpqcmJqZpqSmmKunraKkm62nvqyVvbCsn6Kws7mrtKebqbGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkqeZgpSNl4x7e4OXf2tsf2J9dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilpI6bpKOgr6+qn6Sfna2Znrigo6ugr6qarqGQqqmklombkK6wrKefp5utmJiPrKKhnaWhmaScrZifqKa2qcCvpamjnouAjZuan6adkpWampSamqWjpJqorKyjpJ+qqL6kl8OsqqKhrLK6q66noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+om4uYkZaWe3mOnX5kc35ig3d0gHxhamZxbWZlZU9VZFxCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLy9AVVpYV1dXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5uspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrnq+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop2ln5mjoqWZn6Opsqi8r6WonZyOfYublaCgmY+SmpuSmZeonqGZqK6npqajpam7n6DGp6Wpoau0tq2upp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrt0gJaOpp2QnJGXnHmCkZt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9sqKdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajraGknKqgmIujkqeep5yaoKiimJ6grK2qua6oo5qWknuHmZGmm5KOkZiYj5iTqJmgmKmpoaqnoaOru56pxaOgr6Ors7Wrr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2SjqKYmJmRlp58h46VdmaHeGiNanl+eWRsY2ZsYktlWEpsWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6qpoa6epLKpmJK9ssTIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI2YlaeUn5ipo5uxp56jrLqfsMGnpLOmrLGyq62rp7ijrbeWiqGopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmpeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadte5SRlJOBgY+Pj4+dlKGWmZeigoiUjXJpkHdwi3d2fHpqbGRkb2NVYFlAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW3rq6isKStoKC1sZCOq8a9xLq4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5yolqykoZmnnp6TlaOXqJqomZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2pqbK4oK68mZGmo6a2opKdpp+NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clquckpmhm5SQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaQlJSRin2MlpKSmJOhk56XooSImId6cpZzeop/cXt/am5kX3BpYFtgWm1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2mtLuvrKyio5p6naKxpKWwqZabuaejlJmqnI6Giomco5Cun6OWqKChkpeYm6+LqpaPqJmnjJmoj565tqSlmZuNiXmCk4uak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqxu5R1rKSeiYCqfmRcYnagjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmHipSSi1t2lZFnaJCOcnummZlleZmHgniYaoSKgm55f2twZWB2b2traFxmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhsLGsq6mlqK2jp62kkpWrtrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlZKJk5GQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqirreBjo2mnoOLhY+xqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSVkniWaJN0oJp0fZmEoZ2HmH6Si4ODmWuOjYVreHtxcGdkd25pbGpbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKiwpqeppZmUrse+sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2Gj5mXiKudopafoJGNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiJOPiZOPj5uLj5GekZehpJaerIiftIm0mq2Lyoeqroi3hY2wgrCug6mNppmNnXyoj3J7d5yPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6Kag5qAjI6FiplwjZOFaHd0e3ZnaHVwZ2dsXmNvbGdtWGhHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubCqq6aalKCkpaujlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZmYhqK5rqSZnIyMf2Jtj4qSj4yPjI2Yi5CRno6UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2qroakjaqajJp+onaAmZRrgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4SfamWfbFtuinxmWl+Df2JXUG92ZW10cWpqb15qb21salhpT11YRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqySoba8q66imZegoqatraGdrrWiqJKhoKCmnJmOmLSZkIuejJWMdYGUko2KppaVmJ6ef5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHio2NiYuNkouQkqGLlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXmKfYSafaJwcpOIlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHVxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHfn2PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqeqfq6MfXqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnF6eGtpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJusurKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBh3h/lot7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6efp3ywraOiuJd3o7OipICIlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ9lG+Zc2qkXZV2SGVjYHNxfn5uZWBsaHZ8ZGViUl5XXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaCLeIWNiIeSmZV8k6Ohn6OIroZ9tYSOnp17pZZ6qYGWnZCKoJx8p2h2bX6ZdKFzcXyehplwk4OufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294epdrm3t3l3JtqaRnYGV5cICEa2dmZG11eGdgY1RbZlFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJmFmaigoKONpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoeAboKfhniAk4aImaKXepOipJqgibOhoraLeqynpK6lcKmAmo+GgZySfKSAopmGmHKehKOtroqXjICMpI2Wg66ilXa1tbXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt5h2ZqZ2J0dHFuVl5UWWhPUWhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeHCQoYd5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXebmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcoJscGhreHNrb1JYV1ZmWVJtSVhPXUlYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAj3Noj6aEfYaUjYmYoI6IkqqnnYmmeJacfqWJloyymJ6Qgq+Xn6V4lYh6qXSlj4SabqSijJKEjIO7bn2lr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVydHB8dHFian5uaG1TVltVYWFca01dUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOMlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4V5kIuEf3typoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYZ2bWxnjHN5e5h4hFtrWHmPaG53cnFveHhvXWyGbmlnVlpgV1xla2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpS5qaeLoaKapqSZpJyroqGEhJiskp2giZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6XdnKFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5Omj3dvnZGDepJvfqiFcH2VcWtwfIGfjH+TjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYaPem9lZ2R6g3qWW1xqZ252W3t4d3Vuc3OCZlxtimtsYllZXlpYbHJcX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3lvaGptYIuMqrGikKOhmp6el56ZqKOifoOYrY2flIebopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOLm5+Pgqahh3iOmImVi4ucl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbh5aOe3iOjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfYiLiZCBdmyChHx5mWpyaGF0inB9end2b3Z0gV1eb4Zobl9eWlxdU2hyVmNcXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaXl6cWdpa2WMiJ26n5aioZiVmZiUmaSgnnt/mquOno2Fn52LnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJaPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloCQinZ8h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG54dXSSoYuMhZqFhI10gIl8fHJye4iEe3mLjoSTp4+GhI+ChIqKineGiImLfG9rfoB7bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1pdXlFnbVNlW15ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bWxUY3F5ZXB6enJlaW1ti4qft5qho5+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2LkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+jYR4f4OPh6CAfYyMj3yYpKChk5mQkKeNj4GbkYmSl5t9kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLcoGGfH1weHuLhHp6kY2DlqaTi4aRfIaGh4V2goSJiHplcnt/eXpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Ta2hUZFlfYWhqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l/iYKAf3F/e3R2g4V+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZOLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2YkpSbeY+FgneEl42dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXt/hnx7cX53iYV5hJCKi5iilYGEjXeIhIOCd3yCiYZ2X3h3fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2tkUmJYYGFpa3Z5hnFjamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH14qpyKmXqXnIuMmJB5e4GLfXyDe4CCgHh0eHpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoSSkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnONjoprhZiPmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeId+dXiAfYaAfIOMhY2UpJB5hYJ0iYd9gHR2gYiEbmB7dXpxfW9hb2Nke2Jub3ZzeHdzdGF2X29sdW5vXFxfXl5qXk9dWGNhaG10e4hrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJd+npORlpSId357in17gHZ4f4BwdHN7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FuiJmEZoaZjpN6iYWQinCWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHdHN1a3FudHuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgHOIeW+AfYCGfIWMiIWNlaiNe4h9fouFeH5xcICFg2NoeHR1cHxiXnBga3RecWp6eHhrc3BleF1tbHNtc1laXmBialpQV1hlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiYV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdYGqlJKOh6CMlpOQgHR8doV3eH9yc3uFa3Jvem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5aMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaYSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJd8kY2PjZqSfYp/gm52cGxtb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXl2iHRwiXuFjHqLhoOJj5yjiHyEd4KLf3h4b2uBg4FdcnNxcHB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWNg3+XlIOQn3WLn5SThoubjJWNi3pyeHSCcHKFdHF1iGxvbHVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlICUf2iFnIdnhqCIkoSRg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwdox6iYx7iX2CjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYF9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXlwiHxfXWhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgHiIg3OGhX6MjIR7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoiAjJ5/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNwa2l2boNufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQipOblIZ+lpWIjY2IkY2JnICOgXh6jH6IjIqcnJ2blZN5jXZniJGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9ra3l5XIB5j46Aen1+f4aOenloc2tzi4+JgoWFfZWMa35+boCLfouHfYR6gY+WmpqKfXd4g5B5c21ncICEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cnBwY194YGBWa19edk9OTGBnY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pdop2boaIi32Ko4SRiZ2FhV6LlJeKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepKHhXp+f4CFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlpOZkHV0eIiNdXNxZ3V6g2J0bW9iaXZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHdNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh3e3F1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHaHf3CEgYmHmaGDlIyeg4lhg5WPh4mGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoV8f4OAhIqCdWF0bIiBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQl4lvcnqNhnVscWxyeIFfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtVlt1TEpMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipWFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3txcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g3+Kk52ehpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SHfnBfc3GFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkZOEbnB6jH91bm9rbHp9YmhqaVhtdlpSaXJqYlFicnhsYmVdWWqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsW1xjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpGRg5qfm6CGh3Z2lH5tdpSXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGXjZCMfW5te4l9d3VvaGh9dmRccGJXcHNTU25zaWFOZnR4ZmBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2NmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjIafmKCZhYhufYx2aniYj3+CioOVl4l5jpZvenNwbGpkYHR6aGBlcXpaYXJ9eWdwemFlZY+xsndKYlqk2dCWcXuQi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZGEk42Df29+g3aDd4WbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qGe2V9foR1ZHBzgGh4cG91mIyFgop7dniAhHmBa1xxfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmY2NhHhub3+Ef3d7ZWhqfXFgWXdaWHFuTldyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZl9acGtneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2h6lop+gIWCmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3dviYVsdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dheYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygG9bbX50eIqCi3uGf3yIeHpxbIiDj4OKcoF5f5aLi390bmt3gIB1dVxpaXdwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwW1lVb2RZZHF5WmheX2dtZ2praXB3fY5saYKEfnlugHt8gH+CenWCgYyThXCAi254foB6e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn51f4B9jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5sWG9/dnSLgYZ3h3WBiXp4c26JgI6AhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccVxPXHJwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bVhYU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISJknl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIeomJbHh5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3N+YlZ3fXJzioSCfIJwhol3eHBwg4KMfn15fnx1joaDdmlxaW2IgnJwXWhjc25KZXVMXm9WVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1Z3XlxlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goJ+iYuTf3CAfHh5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f398iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxsf1lWdH1vdISHf4B4a4iGc3hrdX+Dg316fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1dWeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG9mZmtxaHB1eI10a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6FgomNint3f3iEfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYeDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyEin57koV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuh3GBiouHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB4bXxdWHF+bHOAi3yBbm6Jf3F2aHd/gX+BdnxxenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBaW2poXVdnX15yZmtncmdwcnaFeG6VinR/enh+eYKHgHVzgIaFjoJwcHt4dnR5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYFtgIKRh3KUiIyHg4iFfXl0cm9oemFqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0Ylxve2p0e4t7gWV0hn1tcWd1fnh9f3J8bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk9oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOV25qWV1sZVxaZGJedGZtZHFncm90gHdwmYV2f353f3yFh311c4KIf5SCbnN4enlycoWHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhoJ+gX9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoB0iWVleH5pdHZzc4OEeIGEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt7kYR2mHyHhoOGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAd4J1YneFinyUgG6Lam16gHBlcmVgbXlmcneKe35idYJ2aWtxdHpweXhyfWZ+f395d25jZWJuhnxta1ZqYnBTS2lrT0xPcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNXTFl1ZFpfa2FcW2NkX3dmbWJwaXNucX50dJmBd3+Ad39+hoV6fXWChH6XhW5ydHt6dHCEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paU2JuZVtYYnN7amhtaV9iV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3J1eI5/d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoXG93ZHFziHx4YnOAcGdqeHNya3d2dHdjg3t/d3ZvZGNjbnx9a2xVaWJmU0ttaE9HUmxFYXhmYU1Tcl1JTVRZZWt3emVebXBpZFxWX1VubldLVGhYZl5YTVVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebWxcYVZcXGuBZnJ0fWpqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt9dXVidIWKeoeGgH93cnV+dGFwbFlxdGJxcoV8dGRyf2xhbHpvamh5d3RxZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1diR2J2ZmFLVG9XSkxYWGdsdnpkZW5wZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB9f4iLhn11doZ4h4x9c3V1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2FlXWVWWVlWY2ZrYF1cc4VpWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJhd2Rbb3BicHGCfHNmcYBkXm52aWNmeXp0bW6BdXR9c3FiXmZub31kalNoWFlUTXdfUUpaWUhidGNhSVRtU0lMWldpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG5gZ2JsVFtaV2hjbWZcXHGIZVNybltaWFhgbXdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZnZnXmJaYWdcXndoV2Jeb2hhd2Fbe3ZqaXJud3NzdGhwgZSChn6EdnNqcHxsZnZXXGttYnBzgXpzZm9+W2BvcWJfaXB8bGtzfnJxeGtwYFtlbG16YWdTZ1VXUlB2W1JQWlJIY3NiYEdValBIT1pWa2xrfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p1aGJ0ZWVdWm51bnF1dXprh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1tmamZxdIF2c2JsdlVicWpbX25lfGVsdXxycnNqbWBZZGpqd15mVGRVVlBUbVdRV1RQSGVyX2FGV2lOSFhUVm5pZHxpa3drYVdcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39tg4B+hpd7f4iBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmltYFRWU29ndGxleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbl9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfGxxbGNZYGhpb3SBc3JeaWxSZXFkVGJuYXlicHZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlb11jR1lpTUlfS1htZGB4aG59ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLy8sgKSgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0dHBh+qaSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQio+LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoWJiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoeFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4yNiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiYqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OKioeHiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cnBxa2xycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZWpmaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxdXmJpYF1eWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUFxXXmxXVVJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQYFddclVPT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0xjVFt0VktQTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDR2ZUVXVTSlBMSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9KY1tVcEtERkhHRkdCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PlVkYl5nT0FFRUZERkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PjxIYm1oZmxgRkM/TENDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3PT04OVVscmtqcGtONUpYPkBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdXN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0NAT0I8WG5xbmxzcVtDY1U9P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT9SWUpSa29rZ3JyZl9qSDs+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6O252R0FiXVxpbmhjcW5rbGY+OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWlE8PD1LTkhIdnZNOFdqaGtuam9xbm1sVjo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUg8X4CDgHp7d1Y7Q2BzdHJvdXFub2BBPz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2WDhIODg4B9XT4/R2h4dXJzcG1sTD5FQkJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R+goKBhH59hHVMQkNDT2x3eHt6cV9FRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERUVDZIKHh4iFXkZJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gIB4gISFg4SJbUFBV3WFiIeHh4mCV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVW2GiIaHhoeIiYh8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoGEhISCgoaGhoSChoWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Bg4OCg4SEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLjIuKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dnd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0NGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTUtSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEtHREFBREBPUE1TZHN0dXVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHF0d3l6e3x9fn19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcnZ3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxcnR5e3t7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHF1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNCQUhKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSkxLTV1SSUhETUdBREtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0hISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkBCRDxCQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS09VV1ZVVFhgXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU9PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVZUUVRRUkxPUVBPVFlaWlxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NHSEhHRkpHQ0dJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJobWdiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0dFS0pHSEpJSUtISkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VoamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDQ0JFRUVGQkZGSENESkVFSk1NS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj8+Q0ZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERURDQUI8QkFCR0RHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkhHSkdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUpHREZHRUZKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2JiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJS0pJSURGS0tLRkZJSk5KTkxITE5ISEY+R0dMSUtLSkxLSUdFSURDQ0VBRkpEQEpMSk9bY1lfXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdJR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmFkZGJYT1FRUltTW11dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1hYldfX1RQTlBRWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tNTEpKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRXT1NUUFBPTlBVVFtYWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUVZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFRT1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUVRQUFBRS0hmeGxjeHJtWktNVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvX19fY2JaXmNkZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT0xLU1NTT1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUU9KSVFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUExOVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lSVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRT1FYVFJRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNRVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpfX2BVYVxhYV1gYl9cYF1jYWNnaWRlYFljYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUU9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUl1YWl1eXGBhYFdiW2NiXmFjX1xiYWJfZGdqZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVZWVlVV1lbVFNWXlldXWBdYmNfWWBbZWJfZGReXmNjYV1lZ2pkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpeXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdlaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFhYWF1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXGJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFVeW2BhXFRVWFBVV1VTVlZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWV1ZWVlNWVFhcXF5gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQV1ZYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXV1ZWFZXW1xgX11fWlpeXV5eYVxbW1pbX2FeYmRjZWZlZmJaZGZnaWdjX2NeYWZlWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVhXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2QRigrKysqJWOSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkJQ7FhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3l7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fX56e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHl5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3x8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7e3p5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgoGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJzcoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Vzc3R2c3Rzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd3dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fYN6hoh5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh4eHl5eXh6enp6enp7e3t8fX58e3t6e3x7kn+Mknl7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fXyahZCaf359f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgH9+gIKBgaKHk5+FgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foCAgICDpomWood+f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5/gH9/f4SojJSjiX6AgH5+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQioqLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgYGCgoF/hamRkKKJfoGBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoWFg4OWq6OhoIeBgoKCg4KDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAg4SBjaypq7ClkoeHhomIh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhISBgoKbqJ2lqqCgi4aJk4uIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEi4qEhaSdlKCil6GVg5GYhoWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKHl5KDmZeOnJ+XnpmRnZKAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOTqZiUlpCgppeYnqGci3+Af3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiIeeq6mfmqGrlpmfnZmHgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLhI+goqCcn6OZnJ2ck4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI+Bh5GSk5acmZucmpODgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19fIKXi4GDg42Qk5eXnJ+ZiYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Lfn+AfYeLfoSEg4SCiY6SjomOnJSDg4KCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYqAi4V9homBf4aFhYWGh4N+fn2Dh4SEg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYOCgX9+goeGhIF/f4CAgICAhISDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/f35+hYKAgICAgICAf4GBhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/fn+Af4CAgICAgICAgYB/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgY2IgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOCg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf39/f35+fn5+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4KDg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgIGBgYB/i5SPjIuOjo2Ih4eFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUkYyMjY6OioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LiYaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIqHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f35/f359g3x8fX18f319fX17fH5+f35+fn9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqIiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/f4B/fnx6fH19fn19fn6Mhn19fnx7g4J9fX18fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/f3+Af31/f39/gIB+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCgoKEgoGBgICCgYCAgoKDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8e3l2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4WHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/f4CAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4GAgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX99foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnh3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYGAgYKBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHZ4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgIGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhYSFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhYSEhYSFhISEhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1+gYB+foGCgICBhIeGg4OGhIWEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR+gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFhISEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4OFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH98e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhoaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn17fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhYaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fX18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J+gIF9foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+fHt6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM3BlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWwpqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2Ym5yHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mpidkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqChrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sju56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iy8WWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jLm5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqqmrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKfPkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp6gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinZubpKGlqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJ6ZmZ+gpqajop6elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6Cqnpmcm6qkoaSfoZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGqsqGkoqOroqWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rt7WksrGwm6KnnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1s7iynra0uX+dqqSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSwrJOxu7lrj7iyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb6zqaWHrsG3YXq+wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+sK+egK28sl5ptsO6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DwrW7lH2qtaVeYaC8u7Ggm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wYd7s8WiYWGGubu2rJujt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwbp9fL/VpmRicrGztKqfp7Syrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMeydHa916RlY2autLe3wL6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPIqmxwstefY2NetcTByMzGxMHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIx8nNyMPIycnFxcPCwqNlaZ/SmmBhXr7Px8vOxLe/v8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDxcTAw8HCwcPCw8GcZGOHx55bXmPEzcXI0MGuvb64ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrSwLvAwby7xb27wcTEo2lkeL2jW1xrxsXAwMm/sMG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8HZirLCu8O1use3trm7wKZ2cnemnWhpgMbAv7vBvrnGvMLAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zRxnagzL3Ht7m4rre1vrGdhYSCk5V7f5nFwL++vby/ycLHyL7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2K1ye7bJz8LAuK+1vr+gjoR9h4SPgYSZsMLCv769vMfGy8rEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi6vcfKycLIydKWb3Cp0tHMysS1u8mviHhwZX15hW9zgIi1xL7BvMC/t8rJxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvH0sK5vrzEvre8wb/Iz8bIysrAhHByos3Ly83KxsXBlXBiWU9sc3tXWGhymb/BwL/EqKTIxMPEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uK7cwr62vsC+vbSelKKrr7++o3Z0d6LQycvIwcPDpnhcTUZBX29wSUVYYX2qxb/BsoiZyMPAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7yK1ssc29tbnAvKR2amdsaG98kZRudHmi0cbIwbi/vYdiTEJBOlRoZEU6TlhoksPAtJBynsi+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wNCpcoO0vba1v56EaFlfXktRWlprb3J9o82+urm0vbR4UEBRZUBLXFlHOUdTXHu8uZxyaay8tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLLoIJ2i6Kws5FmYGVVWV9LSk1PU2xzhKXHu6KjrbiwhEVAcJZRRVJRSzpKUlVsqqF/ZHK2r7K8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaKGeXWNoo5bUkFYVEdhbVlTR0ljjaOqw8aZhJCjsKVCR3uaX0JQUU45U1pSYYt/aV+Jt6Wss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uMKwjn94h45oTklBa1dCT3WFmXBNQ1Z9sLvRrnp2gqGmRkhod1hCWFhbPFZjUlpvaGBfobOepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4s5KMiIN3VUVAVIlWSkpTdYt/YkBZqbmyx8+SZ2yDhEtGU1VJZJGfqZ6Xe1FWXlxXcq+noZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrqnmJmWaEw/YIBqTklJTWeaf1ZHWa26sa/SunJbYWRRRVBwlamlnpqcnp+BVFBTU5Svn6eWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wammvWFCXKN9T1pJS2FLW4lmbXOOr7WpvNKXVU9PUG6isKecj5WRjpeeoo5TSVylpJ2olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8XAyZZOQnada1FxTFBhZ3dwX2BrgZmwsK7Gul0+YJSlnpiSjI+UlZeXm5+mi1ByoJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoZXUk1kn15ufXV5V1FrY15qZ2x4jrSvtMJ/hKGfnZmUl5mYj42QlJCLjZCBiqGdl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOPeVdzdXJ0aV9yblhZXV5kZ1liX2isrquwqKOfoqCWkJOboJqYlpGSnpuhpZuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgon5ve2lgY1dNW1JVSEpPVVBHUlNKmayqqaSfn5mSkZOYmJaVlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjn5yIX1ZfZl9VTExEOj4+QkM+PkNTeKmtqaqln56foqOdnp2anJuTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BgZl5OREU8SkVIPD86Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpX1RMRD5LYIJzZUI9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIQ0BATZCnsJyDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtgUktIRENARli20ryyr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KhWUk/QUNBSVN8sq2mmZSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2dDOT0+R1qDq6efl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLB6S0pFP1qNoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkvszV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK6TeHJ2e4uVmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fGaDg6esk46Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWtfeX+mkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraRfZXSHk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCYW2hxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wbqztLXDrqmwkVxqfpKHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqWop5qgpaGanKWsrqSooquqrauwpKafqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbIiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCcoqWUnqWbmJGho6qjo6ClpqemraCdnKSmrbKwtrensKyoqrSrtLqxtrautrqyr7q6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NjY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlpuilpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaedlJWVm5ibopeWkZyioqienJ2lp6KlnKChm5murq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrStnpqkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZagoamkn5+pnZyaq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqZuZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoJ+npqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6OinKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uQipKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Oio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjYeQipeJlJSYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+tn5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso5+PlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmXhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaen6SAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyFdG90a3FsZGxqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZaKgYSBinp8ioeGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXlhhWFllWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFpTXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlZRWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSVF5IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm6UlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkQ7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bnx9hn50fpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdxoaSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRExCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22BfoV9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPh5eXioSPjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZucsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em6Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYaDkqe7raiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZWanqenpKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZimoK6djKqcjpaPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmZ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknmFjZKQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpalrKigkY6SscWnlY58kZV9h5GYjqmZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqytq6ebn6aXmJeZlaGkqaaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqstL7CucC5s6e4tLiyrpWlra+upYuTlaGNdMGafpeZhY6WmYqxlZqZlZKTmZmmo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuaaInJimm3a/oIWZnY6TmZmKrpehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q76lj6OXkaKfvJ+JmqCZlp6djrefqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FcX11KSEZHTVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpanppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpOblK2gkaGipaOjn5C+pamdqaydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mwqJ+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2crqCTo5+XpaCnqauXtrCiqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWRk6CtoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cjp+Xlo6ipJWQpq6zq6mioqallZWcmIuPkZOkn4liZVpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZyqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZSjrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZayq6aipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5aRpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWsl5qepZGbjpOXmYWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+qo6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurpp6YmKuioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSyq6Gttb2vs7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7WprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEtqu8r7G4q62qo7GmnqSqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqGekayfmJiFlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub61qq2xtpmYp6uqq5usq4+rvZ6srrGjqp+wrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZWambKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqloqKgmZWRk5V6i5CGe4yKg4uSa254bnZ7YEVhallJSFlbPXtKR0U2QWJUaVtNXGFKW11aUlJSYmBMS0VfYGBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lo66utam3tLijq7S3ybu0u7u/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bDt6utsrmVl6auq6ejsaqUr7ukrbKyp6eisrOwsbG1sbizqa6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJSbmZSynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrbC1rKWZoKyom5ydm5SpuJyUjo6LmZyimJCXpqGfloOSlpCdnJiWloiXkJebqJ2koJKVkJCWdoSQh3uFgYSNjG5xd3Z8flxLZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2wL2vq7OznKCnsK2lprClnrK2rauysKypqLS5rLSyta20rKmsqKypua6xsce/uKS5r6mtraaorbCmpKSuo6mcnZuasJmio6KjkKyepKCfoqqmprmlrLW1pKmrqayvtq+jnqOoqpugmpqSpLSaj4mNh5GioJaNlJ6glJOFjpOSnZuYlpWImJOVmaecoJ+MkpCNkHd+joV8fH2HiopydHJ+fX1bUmRvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLzAsKuyraCkp62pqKSwo6uxqq+ssK6vrquzuqe2sLKpsqmrpaWkr7qsqrHCubWruaioqKyqqLGlqqSirqqoop6boqyVpJ2YnpmsnaKnqaKtpqOtrLexsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjYl/foiGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFpPY1xOVVZVV1BcYl5TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZetp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOss7qkuLOsrK6nq5+in7G4q6qtureltbWjqaesrKqtoamnprGyo6aloaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmoqOiop8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtNaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCYq6mttau2saukq6qpvMDAuLmzu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlrbCrubCpsbGvsq22qra1p7S2rKykqaqco5+1s6iopLS0oLWtoamoq6mrp6Crq6i5tqmqqamiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoiFi4uPjpCNhIaVo5qOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJjUE1VVFVQT1hbYlVIUGlUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpautmqulra6ztK+qpa+pqbq+u8CxrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vbzCsbKzqrOopLWppa2zs7mwo622sq+yuaq4rqqutaurnqqsn6Ogtq2ooZ+vs6G0qp6op6qkq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhYSEpJaFgoKLh4+OkYSElKCXiJGdkJORjZGdlJePioWFeHSBf311eHmAe3RzemmCh6R1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsC8r6a4qqeusMnGyNHDvb++ub6/vMm8wbiwsLSxuru5wbO0u6y4rKK0pqessra5s6emu7WttbyvvKatrLWrrZypr6Sgpayqp5yeqrOks6iaqqeppKmeo6moqb2stK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4J/iJ6Phn99jIeRj5CEf5OblIWTooyUkYuRm5KVh4h+f3F6eX58aXd8enVxcX1ohnmFiGRgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6mlpKGrpLeysqWpsKesuMG9ta+iua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6aqq7C1uLSqnbu8qLK/srmgr7O1qqyfrrCjnKWoqaKenKWxpq+gn6qpqKKqnKSpoK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI6AepqUjYl8fouGj4+MioSSmJGHlKOKkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYF0a4NnZGhhb3OObWJqcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+oqrjCubKtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+uKm5t72rpLSnqKqwrrmxqpm6vaSvv7S0oK63taanp7CzoJ6kpqehpZmeraeonqCprqehp5ejqaCwuJ+ksa+hrKCspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfHuhjIyIeYOMhYqMjYWHkpqOiZWfiJGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/c2R7bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwpLSzqKi5xLWxrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i1qKersK2zsaeZvLekq7u2r5+xt7CppaevspuhpKCjpKGXm6+moZ+ip6+ioKKTpKWit7ChprGrn6yirpecqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXoqmhkImKkIZ6hH6EinmOl4qNhnmCh4SIjI6FjZOYjI6WmYqPl36Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUnKqdpaGioLeqrqC6uKWrvcWyr66jta+sra+1xMS8s7+6t7Czubi6uLuurcCztLivv8G4rL26taais6qnqrOrrbKimsC2pae0tamesrupp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLiopKeup56loKeSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6UkqOopJCIio+GeYR8hYZ9nY2KioZ5gISIiIiRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqSnm56enaO1raaquremq8PBtq+so7Wup6+vt8DAvLLBtrGusra2uLe1rKm9s6+ysb2/uK67u7GlnrarpaW0qauuoJ7Cq6ilr7OqrLW7naiqq7GlmJ6qnqakkZmmraKYnqSpoZyinZegnae1pq+qrqGhnpyhlaCmn6GgmZuZnJKZnZSlnayimJaelJONlZeMj5iaqaCRiIqLiXmFd4KCgZyIi4KJfH+EiIaFkYSWlY+OkJGRkYySe4OVjoZyfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FmSCU1mqOekIusoZiYoJaltLGisb22oLDGu7mxsaS3rKquqbm9u7utwLKvrq22r7O3sqaqubGvrbS2urawuL2tpp21qp+gsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJuUnJ2sr6W5p62ioZqbnpmeo5qknZeemJuUmqCSqJaqp5qTm5ySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2NzgWFlaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GaqbKwn7jAtZ+zwru9ubGmtq+orqW3uLe3rLuvraqrt6q0uK2ksbWxrqmxt7axs7W6p6iftqmcnqmjqq2cqcCZraSusLa1ra2fsa2wqqKbnKSsqJuVnKejnZqpoqSWmqCckJujqqmpu56mpKCYmpmeoY9ropaYnHGClpukgHWSqaeelJWfkYmXmYCWiqCPeYaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RVRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOgm6qtq6O9xa+otsK4vb2tp7awpaukuLOys7C5raqnrLSmsLSip7e1tainrLezrrSts6Kpn7SrnaGknKenmay7laalr7O4ra6lqK6rrKWhn5yhp6abmKGmpZubp6edk56fmJCeqKmita+joqOdlpeYl6OIoY6Smoehh5SdoX+lf6aqnZKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk4+Rl9NRlJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWym6y0trSmp6mzsa2yp6+fqqCyqaCko5qio5yutZWkpaa2vaetp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJSTpKWmoLajpKCjmJWTmJOciK6PmJSJqYuXopuFsYCjrJyTmp6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFBORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKpsMK9srXAtbe/wqumtK2tqaevs6qvtrSoqKa1pqe4rZyysLWqpaSnsa6usaaqnqeksaSioZ6XnKCer62VnqKftLqjq6mhra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGmoqCvop+fo5aWk5iSmYWvamqKjap+Z4SVh61kcJ2clJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYCVeHpqpzdKr1tXVGxjW0tPWF9cV1Y7TohPV1YvSFNTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK4rLS9vrC2xLK3usKnqbCrr6mpsK6ksLqwpKWus6OpuKiesrGwo6Wgqq2vrLCmp5+jorCco5yYlZebnK2ml5uinrSzoaycoq2toJ6al6CiqZyZnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5aWqZR+a4GmeoKFiJOUknerZ2uxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNMaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclZ+UiLOmpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKyp6OinqiqsqiwqKWen5+ulp+ZlZWWmJ6topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdoqqbppqdm6Kgl5ORk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3h4R9poKTfJh6qnmNnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh22XiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKikvLfBsLrAsbW1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLOzr6Cknp+nqbCotKmknJ2eqpeYl5aXlZahqp2bl6itsKmjn4+soqeWnpecoaWhmKGhoqGaoqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20t6ifpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5Omq7CmopaTrZ+lkpShm6SmoJSapqahmqOfrZqgnp2QlpuhnZyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraiyqKmyuri0uL+5t7K2vbWluLOftKyfn6irn5WntquosbKrrbSjm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknq2doZ2gjZSem52gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3JdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsWxurKuu7CuwbKspKKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mxrJWXo6inlJGWpJykrZ6RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy3lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOhpZ6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeWl52ej7CplJynoo5qfmmcpniHc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIiOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqagoqmdopuamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCWlZ2fnZexpZiiqJmckZ2co6OZpqKanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMmJeHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLShnqSlnKOVlqCrpqyjo7asoJmWlp+XramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6dsKCdoqaVmJOYlKChlaOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nJ+no6GdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmZ+ok5iYnZGlmZionZqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefpJ6hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6qokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZeeqpiefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9FMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYm6OgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajo6ehpaWeramRpJupraqcnaqcrKGWl6WWoaOXnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4d2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil5+pqp6UoZ+cna6vp6qpm6enpKKrkqy0lqaiq6qeo6emobCgk5qnmqCalJSRl6BwhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkJBlb3R1cGBnbWRfb2lpbmZjV1NcYVpRUUI5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqqSjrJuvsaKorK6mmaarqqqxopKXo6SalJKEpGqkdYl6qXR6snGCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqScG55d3dvbGZkZXFwZntoY11XYGpYWFRLTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqhlJyfp6uro66arKqjoqujs62iqrOxoZuqqK+wtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXkoBwenR8e21bZmpycWaBal5iWWNtXF5YSE1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqaWdprWfopeTqKq2sqybppyglZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl52lm6GjrqaXoZWZnaWmq5qvna2op56so7esobK5r52br6eztLOklJiopJqfjoKdTniagX+feoOjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32ZlpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6KptLiknKKdo5OQobGZnpynpqGir66dpKiitbLDsa2qraqRh5Ccp52jpJyll56ZmZqmpKiarqGupaaYsKW8raG3t62enbWyubGzp5iesKKknoWP0bXDt3mHjoWRk49/pniUoneMoJKEpYGKcaqGhLRucmqZo5uVip97lpiGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2knamSlJeuoKCepqScp5y1mqCqo7Wrw7Cpq6mijISOnKKhpqKVmpucmZyZpqSmmKunraOlm62nvqyVvrCtn6Ows7qstKebqbGlp5h6qJB9fLB3ioGkpYibbLFvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJiVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkaeZg5SMlot6eoKWfmtsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62grrilpI6bpKOgr6+qn6Sfna2Znrmgoqqgr6qaraGQqqiklombkK6wrKefp5utmJiPrKKhnaWimqWcrZifqKa2qcCvpaqkn4uAjpyan6aekpWampSbm6akpJqorKyjpKCqqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2hj4OmlZqBrIqEsIWlmaShoY+EoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkZaWe3iNnH5kc35ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5yspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrna+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop6ln5qjo6WZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuSm5ipn6GZqK6npaajpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpamPftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPm5KXnXqBkJt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajrKGknKqhmIujkqeep5yaoaiimJ6grK2qua6oo5uXk3uHmZGmm5KOkZiYj5mUqpqgmKmpoaqnoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eto3JtbW1linhvbYKZcYB5aXBpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5mRlp99h46VdmaHeGiNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6epLKpmJK9scPIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaanr7qrrJqbk5N7hJeNpZiNkZGYlI6YlqiUn5ipo5uxp56jrLqfsMGnpLOmrLGyq66sqLmkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVqqaMkpKMh5KcnJSQmpOYkI6VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCWmJahg4eTjXFpkHdwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWn5GJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4d6cpZzeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKejlJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJmnjJmoj565tqSlmZuNiXmClIuak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqyu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJWLkpyRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgniYaYOKgm55f2twZWB2b2traFtmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+yppqqpquXc4ydsJ+oqqaUlrmgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlpOKlJGQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqjr7eBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgpGXloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6SiYKDmWqNjIVreHtxcGdkd25pbGtbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5GfkpegpJaerIiftIm0mq2Lyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZg5qAjIyDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdtWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqklqWptqOvf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZmYhqK5rqWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21salhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraGdrbWiqJKhoKCmnJmOmLSZkIuejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RgnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpq6cm7GtrJOXoZmhpJmalJ6rm4uJkniLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHf32PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um56wqKudl6SaoZ+Ylpago5mGiY1qiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBhnl/l4x7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8ZGRhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaGMeIWNiIeSmZV8k6Shn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZlwk4OufaSDpp6agaNvXqhndaNjb6VhnNKQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294eZdrm3p3l3JtqaRnYGV5cH+Da2dmZG11d2dgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJiFmaigoKONpKigmKmJmZiYk5mTkqCYjoiGe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoiAboKfhneAk4aImaKXepSjpZqfibOhoraLeqynpK6lcKmAmpCFgZySfKSAopmGmHKehKKtromXjICMpI2Wg62hlHa1tbXJoXOUioGfYJ2WqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtqtLW0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOQgJepoqKljKWnnZylgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+VpqmclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2YoZWIbXJpq2p1oG1upmCbaIqQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAjnNoj6aEfYaUjYmYoI6Ik6unnYmmeJacf6WJloyymJ6Qg6+Xn6V4lYh6qXSlj4SabqSijJKEjIO8bnylr4KGhYaSlpyffKV6caiVoJZnnn1uq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01dUl1JXm1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYqDmKuanqSJmqWdqZyEjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSrpKCQgHWUl4l/gXmUrqN/gZtxj4Z5kIuEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXFobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUl9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyro6GEhJiskp2giZqmmqiYgoGbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSbgH6Jlq2oj5OmkHhvnZGDepJvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIuMqrGhkKOhmp6emJ6ZqKOifoOYrY2flIebopCllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm5+Pgqahh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaugoqKji4iTnJ2jmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkYSFjYiDjZCMfYiLiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNcXGFsaXV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5eioZiVmZiUmaSgnnt/mquOno2Fn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfoiUhG1sfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqamZCapqCmnZ2QloGRind8iI6EpXt8jpCRhpipoZ2TnY+Nq42RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqFhI10gIp8fHJye4iEe3mMj4STp4+GhI+ChIqKineGiImLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl5ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5uipJ+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2KkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt/joV5gIOPh6CAfYyMj3yXpKCgk5mQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLc4KHfHxweXuMhHp7ko2DlqaTi4aRfIaGh4V2goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Ta2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpqWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iFl42dfoGJjYxzl6KeoZOZjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXyAh3x7cX54ioV5hZGKi5iilYGEjXeIhIOCd3yBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmFeW2tkUmJXYGFoa3Z5hnFiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJyul6aono2Nl4eGn5OXmH14qpyKmHmXnIuMmJB5e4GLfXyDe4CCgHh0eXpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnSOjotshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeAfISOhYyUpJB5hYJ0iYd9gHR2gYeDbmB7dXpxfG9hbmNle2Jub3Zyd3dzdGF2X29sdW5vXFxfXl5qXk9dV2NhaG10e4lrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCjqJ2KipGGip6KlZd9d66YjJZ9npORlpSId357in18gHZ3f4BwdXR7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FviJmEZ4aZjpR6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWNioWNlaiNe4h9fouFeH5xcICFg2NoeHR2cHtiXnBha3VecWp6eHhscnBleF1tbHNtc1laXmBialpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooKabh4yKgZCchpOcdYGqlJKNhqCMlpOQgHR8doV3eH9yc3uFa3Nwem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXqLh4SJj5yjiHyEd4KLf3h4b2uBgoFdcnNxcXF4Wl5wYHFrXm9pfHlwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOPn3WLn5SThYqbjJWNi3pyeHSCcHKEc3F1iGxwbXVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlIGUf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox6iX6DjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYV9sbnlwZ3BmZnN0aHFrYXdlXVdmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcnJ2blZN6jnZoiZKHbIijhZKHl4OGY4yRmY+ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9ra3l5XIB5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMa35+boCMf4yHfYR7g5CVmpqKfHd4g5F5c21mcH+DbGp0b2hqdG1TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19edk9OS2BmY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fImch4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pd4x2boaJi32Ko4SRiZ2FhV6LlJeKj4iOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuBdm6IkYKQhX+Ce4CRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaXZnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25aXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHeIf3CFgomHmaKDlIyeg4lhg5WPh4mGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1tgmx4hpCGk4R9gX6BkpOQl4lvcnqNhnVscWtyeIBfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g4CLk52fhpWPn36IYYCTh4WIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrYo2Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cINmeYOKh4yDfIR+gJSQkZOEbnB6jH91bm9qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpKRg5qfm6CGh3Z2lH5tdpOXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGV9k4KAhYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXiDh4uGhHiDfIGXjZCMfW5te4l9d3VvaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2RmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyUjYWemKCZhYhufYx2aniYjn+CioKVl4l5jpZvenNwbGpkYHR7aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQi5B4fpWLhZmRjYZvbIaSknp5koaAhJiKfId/eHiJioSWgG+LiHF0fXppeYWDpZGEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KDfYODiYNugXhogIR4cn9/goqGe2V9foR1ZHBzgGh4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygG5xhIeOhIVzhHiAmY2NhHhub3+Ef3d7ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZ19bcGpneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBen+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjH6Sjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd29cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RvWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHt9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaFloVzjouKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5cZ2ZzcVFbe05ccFxPW3JwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bFdXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpOCc5GNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4mJbHl5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2dUVlZ3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx1dn9taHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyFin97kYV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z7fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyHhIiFfXh0cm5oeWBqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIx8gWZ1h31tcWd1fnh+f3J9bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk5oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHFlX1hjc3VpdXBlZWNXXFxogHBvcoB0iWVleH5pdHZzc4OFeICEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd0Z3CAd4J1YneFinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpweXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paVGJuZFtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2F3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcV1JTVRZZWt3e2VebXFpZF1WX1VubldLVGhYZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYlZcXGuBZnJ0fWlqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVidIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxYWGdsdnpkZW5xZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BicXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHJ7Ymxsc2NhWlpbYXZbU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB3f3J6enpkZnZnXWJaYWdbXndoV2Jeb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIT1pWa2xrfGZtb3FhXFpYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWm51bnF1dXlrh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFhUVm5pZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29ndGtleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdnNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYGhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZGB4aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4GDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Pj4+Ojo2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8wMDAvPkREREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0cHBwuNzU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIWFhoWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQiZCPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4eGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFPTk1PT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0pOSU5OTE1PTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDRVNCVVBIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9GWUNbVj5FRUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUNdRF5hPkFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj06Q2A+XGtDQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5OTpGZ0BcbT85ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0Q7Pj0+O0ZpS1xtPjo8Pj0/P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdcEI+REY/TWRYXWU+PT07PD4+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6Om53Sjc8OUVaY2BgZEk7PD1EOjs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAW1E8PD1MUElIdndPNzg5VGhtZ2hsYEE7TlE5Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQEV1eUg8YYGEgHp7d1xGPUFlcnRsbXJtT0ZmTzo9PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSXN5a2aEhIOCg4B9YFhRRmJxcnFvdXFgYGlKQEJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBHcHR9goKBg359hHRKU2ZYYXFydHZ8dGttY0lKSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVpc32BfH+EfnmGcUJIZG1sdoGGh4eEdGtWSU1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH94gISFg4SKbUBPc4GFh4eHh4iGZ0pMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goOEg4WHhYeCVmyEh4eHhoeIiYh8UUtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoKEhISCgoaGhYOChYWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Ag4OCg4SEhYWGh4iIiIiJi45mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSEpMV3KDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GT1BQVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceYWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRURJTVBHSUtHSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtLTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSUlMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRDxCQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1CTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSElFQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREhERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGR0VJRUZESUlHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OT0tPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NISEhHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhqbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxNS0xNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMSExMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTElJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUdGSklLS0lMSklGRUpHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkZJSk5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpMSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS05JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JaXWJkZ2lqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUUxOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVVSUlhWVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFNSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FUV1VXWFZUWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWVlVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NXVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x8fHt7e3x8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2Ni4mJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjJCQkJCQkJCNjIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3h5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e319enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn59f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAhH+DgX5/f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f3+Mfo2Ffn9/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/gZeClIx+f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKGnoaXlICCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoqhiJmah4eGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGBi6OKmpyJhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODgoCNo4mXnIiEhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgY2jj5aZhIKDgYGBgYB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjoSBgICFn6apqJeCgoGDhoN/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiYSDhJitp6usoI6BgoSQhIGBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmPhYWJpaGZpaObnomClJWEg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2NnZmThIiflJCfnJSdlZKejoKDgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX1+fIKXk6GdjJOSjZialJmhoZuHgYGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlp+Lfn+AfYeLf4SGlailn5KRlY+JlaCdmYSCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGSoIqAjIV9hoiBgIaJnKGikIN/fn6Clp2RgoODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qQgoSKhYOCgX9/g4iPj4aAf3+AgH+CjoaDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiIF/gIB/hoJ/f4CAgICAgICAg4WEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/f3+AgICAgICAgICAgX9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyIgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4OCgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn9/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WFhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8e3l2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4CDhISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoaCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aHh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NPS09PT1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX19bT0tLT09TU09PT09TU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLe909LS09PS0tLS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6Ohq9LS0tPS0tLS0tLS0tLQ3+vr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSko63S0tLS0tLS0tLS0tPS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaiw0tLS0tLS0tLS0tLT09Hf6unp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS09TV1tbW1tbW1tbW1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0tChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6ooKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaakn5aQobSVhp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2aip2gp5m0v8mXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mZ2lnoygxNKSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp29m8XJlNmto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sixp2TlqO7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izbKbrrOdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7usn5qhnJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTmKGpn6KeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqzjZCl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR1sC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46JiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwMS/wc/Pzserr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMTJzMrSz9POvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPFysfK0M3QzMfEwMPCyc3HxcHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLvIxsjNyMPIycnFxcPCwMW1wsnKyL7Fx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5x9DKxMTAw8HCwcPCw76/obfBwcGgusfMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMvUt7vAwby7xb27wcS/v5KnvcK7eqnAycTAwMrAscG/u7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8Hel37JvMO1use3trm7vb2Km73GtmCVwMXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQy32AuMTHt7m4rre1uL21gJG9yKxWfMDGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uyvb67xLa1uLW3wL7EvMLE1qp0d5DGz8LAuK+1tbvDqnmJv8mdVWa1y8PCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOxuby9sry+vMW4sbe5vsrKyMPGy86Kc3SOzNHMysS1usDEzpdxhcHHkFhal87Gwr/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzPzLy6vrzEvre9vLCvv73By8mxenV6jcbMy83KxsLEy9OEbYK/voZeWHrKxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLbAuMvYvb62v8C/r4V2b3t2hJe0mXF5e4+/x8vIwcPBwMnLc2l7ubR8YVdoxsbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xXJ8wcy8trnDrYdnW2NeUFtfcH9vdnySur/GwLnAvL7GwmVhcq2zdWFWYcHHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5xcp0Z4a1vba2nm5qZ1VfW0lMUVNeb3OBnri4wrqzu7e7vr1hWmSgtHddVGfCw8TDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS1t8fGfHRphaW2mGJTRV9RTWllU0xIUHF4iKGwt765srWyvLq7Z1VXmLx+U1BywcTGxMC9v7mzr7G8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDuYV6bm6OoG9PSUJrUkNce4eHW0ZXiKansLa6tbSyrLy6unRVUIW3gUxUgr/Bx8O/ubq1raWttrGmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ur2RgXdyhX5XRkJXiFFLTmF9h35RQ0+GurKztbK0r6y7urqEZlt4n4FccZe5u724trKxraugra6onaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK/oYeDhH1mTEBVenBMSkxOh6tvVj9zvrmztLKwsa2wurerjoN0haWpqamtrrivqqutrKOorLSnnZeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtaqTjZCbY0VWnXlSV0hRYUl8f2Njd665sqyzr66srbeplY2dpKmkn5ycnZ2nqJ6gqKihqbexn5aXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKq5sp6itVFBep13WGtKVWNpdnVkanqdsrSqsrSuqqupkpSrr6edkJeTj5ignqGgnKSlraepoJqWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigsMG5vXxPS2yqXGp+cXZTXm9hYG1ogJaxr66ztaqnoaGjnZmUjZCVl5iYnJ+iopufraqQl5eXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGfnJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaHDwYBVVmZwfXZtZnpyVF9iZGpsYmxwlLSwsLispqGdnpqVmJqZkI6RlZGMjo6UnKOMdpeampeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqesaWQe22GcGJlV1FcVVdLTlVaVE9fWWy0s6uvp5+eoqCXkZSboJuYl5KTn5yhpJiGbHWdm5+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhooRkWl9pYVZOUEY/P0FERUJHUkxPqLaqqaSfn5mSkpSYmJaVlYyIi46VnZ2eeWGGn5mmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5mBX15mYFJFRTxLPEY8Qj8+QEFNeqmtqaqln56eoqOen52anJuUk5WUnZ6Yln10k6Kaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz43Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can6CJdmphV05EP0xffmxfQzwzNUt7qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhvgp2koqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZcWpgVUlFQEFSjZ6kilBHXo2urKGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXGOpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelGVYUExFREFGXr7Ww6OTo7Ouo56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm9y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtcTENERkRLVXi6uKuvr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8K9xNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KjXkU7QUJJWmyarqyom5SXn5yaoKCem5yZlYl3aWNgX19fX15fX11ibHV0cHBvbHJxdZLEx8XU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjsHNEQEE/U22dsKifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMvA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M7OzM7PyMvQ0cvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppap/YmdiaYedn5uVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeYF9eXGJtcm9vc3R2dnmkvcvV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62Jc4SHocOqloyMl5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBgX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raS1c2N/gLaskI6Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb3B9uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGwsWVleou2kIuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr55caXKXlIuIioR4f4aGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xu7awtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFv765t8m2qrGSXG11kY6GiYl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFfZGVjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKvsC8wbqytLTDrqmwjl9vgJCIjpB7eH2JhXp7hIB3bl5dXFxdX2BfX2RiYmNjYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqSnp5qgpaGanKWrrqSooqyqrauwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0tbu1sK60u62nqpFpaYeEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCboaWUnqWbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmysLq6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrOtn6GQZ2yGhoaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlZqhlpyjmZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6u4ubChnqirp5adkGt9hoZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtxjaidk5SUm5ibopeWkZyioqienJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axuLqssbSunpmjqZ+TmY10gISEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbi5r66vqZuYoKiUkImIf4F9d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYl56ji4hziYh/d25jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkY6Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaumlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6impJmlr6WVmaWvqqCcmZugnq+anKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+snpiZnJSTh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Nl5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdpratop6OlJWRjn54fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298i5SJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmWhZOOioZ9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cXSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjZuNkH52hXd7dW5uaVlLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeoiNiol1cHttdHBpbGpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhYuFdG50a3BsZGtqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0ent3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FOR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+DgIN4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyuLW0rra2mWR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Oxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVVxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4dHt9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jTxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnLy8/Iw9HK1NbY19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQD4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eZnKmmpq6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZKVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dYOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rnI+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUkIyPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ+Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPiJeXioSPjYF/h4+liY2TqZqXk5aZoZifmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qzoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O3jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePmI2LlZeUkJqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKPiZefl5OZlZimoK+djKqcjpaPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY58kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwc22yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wcLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ekl5SclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2drqCTo5+XpaCnqauXtrGjqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpZaSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOhnLOnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaS1qZWyrKeipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnZSMjpmQgoaWiZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6GptaqdubCro6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5qSho6Zi36NloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqr6ujsbippbWzrKGttb2us7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4q62qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWWk4CPlIV7j5KDjJZlbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmmrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub20qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZaamrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bnV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lpK6utam3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJWbmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V8flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5r6mtraaorbCmpKSuo6mcnpybsJqio6OjkayepKCfoqqmprmlrLW1paqrqKyvtq+jnqOoqpugmpqSpLSaj4mNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6urayzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqKyqqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKtpqOtrLixsqGpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiXZsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbPk1GlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xr7Kts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGypKamoaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6SIeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SjqrCYq6mttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlra+rubCosbGvsau1qra1p7S2rKykqaqco56zs6iopLS0oLWtoamoq6irp6Crq6i5tqmqqqqiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gIidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9JazdQRTuVjrCgpaqtmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova6srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhoWEpJaFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3R0emmBhqN1aV5lbIJ1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb2qs6+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK27p62wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI+Be5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3ONbWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8MlBbPSOSmayZn5enpKKfp6O4r66ir6+pq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+isa+hrKGspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfXyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/cmN6bGlmZGFmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9aWTUol52lmJyWraCfoaSht6uxpLS0qai5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG1lcmlrZmldZHOAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYlUsMpajoZeUnKqdpaGioLeqrqC6uKasvcWzr66ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKinMG2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6Uk6OopJCIio+GeYR8hYZ9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnZ2hjZmlqYGliaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKepKORjqSnm56enaO1rKequbenrMPBtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelJONlZeMj5iaqaCRiImLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Te4OVjoZyfX1meG9ramxndXNrY2dkZHV/YWRmZmVqamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanpmeo5qknZeemJuUmqCSqJWqp5uTm5ySjJWZjZSUmainjY2KiY98gnSCgYuYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2Jyf2FlaGpubGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCZraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCckZujq6qpu5+opKCYmpmeoY9ropaYnHGClpukgHaRqaeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRnX2RmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy7laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmZCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6aqnpKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GWF5pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrJyTmZ2VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFcXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cer62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWk5iSmYWvamqKjap+Z4SVh61lcZ2clJmllXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK4usKnqbCrr6mpsK+ksLqwpKWus6Opuames7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uhnrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5WVqJR+a4GmeoKFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1tkWFxaQj6weFdYQSNNaUVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinqiqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaWPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoR9poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp+nqbCotKmknJ2eqpeYl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZikjI+cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrZqgnp2QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iZoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopZ+UmaWonZylnqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVoKGJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adl5uopp+MkqSXqKqmk5epp56foaOtpKGeoY2UoZifoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1qdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Rk5Srtq+nmZScrKqXjJOlmaWsoZGXqrKkoJ6oq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIiQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqquxp7mvtsSxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSnraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mwq5WXo6inlJCWpJykrJ2RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy4lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocH90kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpiXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlZ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLSgnqSlnKSWlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYlKCilqOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziGhqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46Bd3qBf3lxen+HcXiFjJN5bXaSYmZfeGRfZIBiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF94ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil6Cpqp6UoZ+cna6vp6qpm6enpKGrkq20lqaiq6qeo6emobCgkpqnmqGblJSRl6BwhYyXdYSoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XYGpYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyqlZGcnKGZn6WznZqhlJyfp6uro66arKmioaqjs62iqrOxopuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWWNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWfopeTqKq2sqybpZ2glZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl5ykmqGjrqaXoZWYnKWmq5qvna2opp6so7esobK5r56br6eztLOllJeno5mfjoKdTniagX+feoSjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKiitbLDsa2qraqRh5CcppyjpJyll56ZmZmlpKiarqGupaaXsKW8raG3t62enrWyubGzp5idr6GjnoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamSlJeuoKCep6Scp5y1mqCqo7arw7Cpq6mijISOnKGgpqKVmpucmZqZpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqiklombkK6wrKafp5utmJiPrKKhnaaimqWdrZifqKa2qcCvpaqkn4uAjZuaoKaekpWampSamqWjo5moq6ujpJ+pqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5fYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20mKCzqKqrna+tnaubla+poo6Im46vrKmnoqeZrpOZj6iaop6ln5mjo6WZnqOpsqi8r6Wonp2OfIualaGgmZCSmpuSmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amspuesZy5qJ6trqWmlZSwrJeMg5uRrqajrKGknKqhmIujkqeeqJyaoamimZ6gq62pua6oo5uXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCrrKOgp6yfuqOkrayspo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYlI2YlaeUnpeoopqwpp6irLqfsMGnpLOmrLGyq62rp7mkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOPmqeZobW6qKuZmpCNfIGUi6GUipWRlZCQk5elj56ZqJ+ctqOdp6y3p6/BrqO3pq+vsK2pqbO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJqojJioj565tqSlmZuNiXmBk4yak4qVkZSQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6n6myu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrquiZZ6fk3N5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ycr5+oqqaUlrigoI+co52Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSooJmYi4l1d5ONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqirreBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fZmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTlp2Gn7myp56bko6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZiXhqK4raWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipiol5makYelsKailZqIiYBpboiHi46OiouNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3uHf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6PiI+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHidequaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIiSmZV8kqShn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6OFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAk4aImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa1trXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6aEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1td2BbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgYOLlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4Z5kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYSCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1sfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2eX5xa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCFg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOj4pshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9qcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3pyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zeb2JxYV9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqgmCIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR5gY+WmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19ddlBOS2BmY115cYl0XVxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXtlh35vcGyAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5uYmY+Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeX+QlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5YanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXB4bIt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5hpCGk4R9gXx/kpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eHiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY58kIx+ioV6dXuCenCGgJWZjpOUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cYNmeoSKh4yDfIV9f5SQkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRab05IT2dlXGducX9rWltjc2BcY2x3ZGVdXFpsbGJtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfICXjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17bllbXm1jWmNvd2RmXF1gbGpjbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeYWDpZCEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHiAmY2NhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneHBaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2xvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDkISLcoF5f5eLi390bmt2f4B1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjoqJd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qbYGCdW5dZ2ZzcVFbe05ccFxPW3JwZFZLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMh3JycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaWyHgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVtioRtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dldQVVheYXGEb1xgY21lZF5uYlRcckdCZl5dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYR5eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhcX2VfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx+d3hzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyIhIiFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1uhHRkdYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXp4cGZsYm6Jfm1uVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWWFjV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxogHBvcoB0iWRkeH5pdHVzc4KEeICEeXZ0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4J1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucX50dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iYWDa3V8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paVGNuZVtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4anN0dG2EgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bW92dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHg2tygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYVZcXGuBZnJ0fWlqXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbXaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIhqc5eBe4udfX6FeoF6fnyGiHNxj66Me3uHj31lcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB5bYN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3t/iJR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB2f3J6enpkZnZnXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tleGRlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Pj46Oj4+OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLzAvPkRERERERTguLy8wMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHBwcHBwuNzU1NTU2JxscHB0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODg4ODg4WFhoWFhYWEg4KCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQiY+OjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoaHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2HhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFAQENEPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj07PDs4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5Ojs8Pzc9Ozo6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PT9APT09P1E+PT09PEFMO0xCOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RAPTw+QEE/QTtaeU89Q0U+RFg8WU47PDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48Oz1APTk6Om93WTc7OjxHXj1gXDk7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFDX0k8O0ZjZ19Xd3dYNzg4OE1iQmVoPDs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQE98dEZGdYaGhoJ8d1k8PT88U2pHZ2s+Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXZ6cHaEg4OBgoB9WT5AQz5Tb0xkaD07PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBQdHN/g4CBhHx8hW1GQkNEQlJpZHNySUBDRUhJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUdsc32AeX+FgH2Gc0ZDRERNZ32HiIh+WEdIUVBMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B6f4B8goSGhYWLbEBAVneGiIeHh4iCWFJeTkxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLTlx8g4WEhISFhoiAVmyFh4aHhoeIiId+aVZLS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKWoOEhIWAgYWHhoOChYWEhYaGhoeIhol7S0lGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklohYSFhH+Ag4OCg4SEhYWGh4iIiImJjI1mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhYSBgIKEg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaIWDgYGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj52hIGCg4OEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89SoGDgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJVhIKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRVqFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDR0dKW4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNBQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRUNJTVBHSUtGSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSklMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0lJR01QSUZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRURERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGSEVJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUExPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSUhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSERESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVllcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQkNEQkRJREdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhGQUdGSklLS0pMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dKRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUZFRFdVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYVGtUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVhzUWh6bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1taXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVU1JVU1RUWFlXXVpfYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWltfXVZZX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFdXVFJSWFZVWl9aXV9fV19dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VWWFZUWFpUU1FaV1ZcXltfX2BWYlxgYV1gYl9cYF1jYWNnaWRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVYWFhVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl5dZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2FfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9fX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x8fHt7e3t6e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjIyMjI2Ni4mJiYmJiYuMjIyMjI2Ifn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+Pj4+PkJCNjIyMjIyMj5CQkJCQkYt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn18f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4B/f39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39+f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGChYeGh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KGjYOMh4WFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgYKCgYiTgJKIgYKDgYGBgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIKDkYeAf4B/i5qAlY5/goKDg4CAf3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKCg4OCg4mZjIOChIGPnIOYkoKCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIODhYWEg4OBgH+Dj5qPg4WEgpKchJeUhIKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gISQiYOAfnx8e3uMnY6AgoKBkZuElZWEgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/hZuUiH99fXyBgIGViICDgn+PnJKYlIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEm56JfoOBfYmJfoKDg4SCiJ+goZOJgYKCgYSHgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKVoIiCjYV+g4V/f4aGhYWcn4Z+fX1/goOHloyDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4uSgoSGhImBf39+goiGhYh/fH5/f39/iJ2ahISEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISCgYCBhIF/f36AioJ+f39/f39/fn+Fno2DhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgIGMh4B+fn+Bf3+Af3+AgH9/gH6Dh4WGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAg4mFgoCBgoKBgYGBgH+Af39+e3mAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4J/gIKFhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4eHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4GChISDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaBgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f4CBgoOEgYKCg4ODhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SGhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N8goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYF/f32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWEhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/fn+Af3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDg4OEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYWEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhIeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4WGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/PztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9KooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNaynqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3InpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoq2alq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJ2tmIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCjnJ2oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonJG5r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqClppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeczaCrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttfFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkM8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqampqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndWhqaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfBy8vIxszKzsXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8C7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcLDv7++xMvIysvJvLzIyMnNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAv8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxru4zt3Ow8TAw8HCwcPCw769wsDAwcLLw8bMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7tsC3wN6ekMK/wby7xb27wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tLe/utDDfYbKvsO1use3trm7vbm6trvFxcq9ucXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubm5v7/XnXeBqcTHt7m4rre1uLq0t7O7xcbLwbzGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLa1uLe6w7/FvMHOxIB3eZTGz8LAuK+1tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub6+sry+vMS3srqwo6e5s73HzKJ0eXqXz9HMysS1usDEyL+/tb/Bv8bGv8vGw7/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Dc28W5vrzEvrigd2tvcWuAlbiHc35/mcrMy83KxsLEy83Fv7m9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLbBiq3YxL62wL6dfWRaZ1JOWFx2fHR+gp/DxsvIwcPBwMnKyMG7u7Czvb3AxcbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7trrAt2VupsnAtreGYmBmVGRdTk5RVGh0e4ikvr/GwLnAvL7FxMC1urKwrb+5v8PHw8O9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri4y7VtZ2+YtbiEWU5GZkxPdGpgT01YdHqOrLi3wrqzu7e7vcG1nr2usLC2s7nBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uM22eXVlc5yiXk5HVXpMSGZ+lINbQ3WJmauxt765srWyvLm/qoi8s7O3n6i4vcPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7bHs4B5cWyLdlFFR3R/TU5PX4qBcEZSfqa0sLa6tbSyrLy5vp93uby5t3aUvbzBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO3vbmNgnp6eWRLR3t8YU1JUWWnpWFOSnCuu7CztbK0r6y7uMGMb63FuK1cdrm2vLy4trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO/nYeHi4haRHaXcltaSV5gUpFxbm2gwbiztLKwsa2wubi/cmegwrKwp6WxrrmuqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtqmWj5OoT0p9s2xqcV1rXnVxY2Nuh7G5sa2zr66srba3tF2Dpauknp2dnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKmzs6KtlUxUcqZzdH2Mc05ubWVwcG6TqLaqsrSuqquvsLChsaadkZiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigrcG/qFdaeHVucVpfZGJcWVtpbGJmc4Oyr66ztaqmrKujnpmUjZGWl5mZnKCiopydpZ6bpJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnZ6/t3hjcnxmZ2VXWlpRSkdLT1BMVWJfm7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeqaedh2FYZmhcTkpGRD5AQkVCQ0xWT32xrayvp5+eoqCWkJOboJuZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgnn9jZWZYSkJJT2ZSS0FDPkBGSUhfo6qqqaSfn5mSkZOYmJaWlYyIi46VnZ2dnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjoIt3a19SS0NEVn+Lf2hGPTo6OThRhaqtqaqln56foqOdnp2anJuUk5WUnp6YlIadmqGaq6SssrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2ir6aho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGRzk1Oz43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can591aV5USkZERmezxMGNXVBJQk97qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqurs7y2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyXaldOS0lISFN90cu0k5yOgpavraGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3NxbnGOpaywub3Fu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyek1xNQ0ZJSVlmkrqsjYO0ubGso56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlycnBseKbBysrFysHT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyca/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ5eSD5ERVdmhqyfnqGtq6OcnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB2cG5xc2+Iw8/NyNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3Lz8bJyL/Ew8fOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGpcEdFRUhihLzEqquqm5SXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHVzcXBvbHJxdY+9ycXU1tfX19PWz9XU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdHLztDAxsPIxs7N0dHRyMzNwMrMxtPOzM7IxMrHx8jMytTU0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjr4Jia2p6nMK/rqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3mcq/0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMysvS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp5Z7iIypzc6xm5qVlJabnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvcvV0NXT09jWzs7Uy83Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7iysr6xu8PDtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFhYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK54ZYODus6qlI2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JxcXJzcW5yeaPF0s7L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raSwZmZ8jNGrkI6Nlo+Gg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299t9DHycrOy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKypF1qc6a4joqSl4Z6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvco/FvMnEy7/GwbC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwra/tbW+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3AxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr5JdbnaokouIi4V4gIaGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J4nLzLv8K6wLeusLGnqq2sp7i1t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL65t8m2qrCIXnGBl42FiIl7eH6GhnZ3gXxzaF1dXV1fYF9gZGFfY2VjX19cW15cXV5aXFtdX2twbmlmam1ucnukxr64t7Svq6ynnqKqp56rrbOtqqyptK63sbKprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsHHyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmwjGhshJKHjo97eH6KhXp7hIB3bl5dXFxdX2BfX2RjYmNjYmBfXVpbWlpdWlpaWlxkbm9oZ2hpa25xgay4r7StpaSnp5qgpaGanKWrrqSooqyqraqwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaVxhb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766ybfBw8G0tbu1sK60u62nqY1pYIaEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmVnZWhqb3KFqaSqpZ6boaWUnqSbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbakoKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PBvb+1uLy9vrzCx8TCw77AxKCDeHFsYWZfa29gVFleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKGNZG+HhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4ecqJ+VlZqhlpyimZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrK1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vcC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLe+t7LBtLG7u6u4ubChnqiqppeekGZ+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKeck5SUm5ibopeWkZyioqmenJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a1oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbq2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smoduf4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5WXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6CinJmZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mp6eyrbG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tLu8tLi5r66vqJuYoKeTkIqAfIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLWeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xaq3t722vbq6tbKrrKaYl56hi4hzhYd+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVFJVYGBfYGFfYWFiZGqAk5OJkI+Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqGilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZVUkdRT0hZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaqklJmam4d/cYiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHj5GPmpOVk5ybo5yboampq6isp6impJmkr6WVmaWvqp+cmZugnq+anKuzoKWmn6KjoZSTm5aWkqmprJqcn6GgmpSQjJmOjJCMkY2WlZCdoaCjnZujlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQjw/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWon5WWl5WGeXSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqKedl5CPmp6ul5ioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThomNg4+LkpWRoJ6ho5iVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopuclpaTgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ2omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6snpiZnJSShnqCbV9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5iajHONg36Nl5aGkZqQlI6Oe5mPnIyCiX+JmJ+jnpCTmJaFjYOUfn50io56kIeTkJCdmpqakZWQnY6io46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRktKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdprWrop6OlJWRjn12fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTiV87Vm98i5SJgIySjJCGhnOKhZaBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uPiZyIn5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqKijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxaminZiDlJuvoZiWhZOOioZ8cnVdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+Ud3V2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6ivraq1vLa3t7PBu7anuci4tqiotbaqsrymnZaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c251cHSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW5uaFhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFVYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6TjY98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWVdZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2Ziam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGBfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHF0ent3im1oamJ5b4WQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1tdVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGTh3qFdmt/jJGCfYqEjox4g4BzoYSLfXyBfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqcdG18gYaHfY5oZ2h4fm6Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzc6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8OTg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYOhlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbISBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUZCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3aVkquyiI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg2PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6O3xai2yce1vrm0qKO0rbGxm5mSmp+Jp6+rpZR2n6SXoauxs5iWqq2orra7srqsr7Wisauxtbu3tK61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hIeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWkr8a5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSAinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlZJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7m2uLmyt7W0rra2mGR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0FFRkQ8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHta+5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/h4GGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfn+Bh3mEdYWTkYl/b3Zya3N8fHZ8c4F3cWuAc3Job3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1dlZFhla1NYXVxgY11jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWqVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzc/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4c3t9g4d3f3qHkZaAg254cG11f3Z4fXOFfHlth3Z0bn12hHV5e521jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKOxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xe4Fxg4eBbo56dHd8fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46TkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIuGe5uIk4+uqpSVl56Ypq61vamtvcbLyMnLy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXR5kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhpd6iIifl4+IjYqLgnyhiZCLvKGXk5eZnKelpa6eqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DCoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6Rgot/pZmIhI6ChoSApYaKi7iYnZGVlqGmoJ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dIOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhYCLiJKNiYqdlpmjo4aSnZahioqIjpyQg4iPgIOHhaSGjJCzmJySlJehoJ6Zkpydp7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gXyGfHt3hoR/c3CFgnp1dnZ0hIKEfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjISnkYSZk4SZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4iPh5eXioSPjIF/h4+liY2TqJmWk5aZoZifmZOcm6KztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHin2Ko7Ono6qzoZann6WklpWuooOQuJWSs5mMoaCMpJuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJKYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIqXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vnpuhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmbWdo7ikla2klqmtt6akop+ZqZipo6+wqZqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KXjJCVjYuMl5iSnZm0l5arnYublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyrq68qpu7pKitubirpqaioaOjqK+ysaqcnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEwq2ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3IyMrB0snKwsy8wbOtu76nub+9vMS3rMGprLK7vaqwqaOlo6yts622taCfrp6lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK+yMPHxdPNzs3Lu8G3r7m8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzDtKaztcvBuKm2rLK6uK6ot7q9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLuqsLLHwLilq6utsbGjobGytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpPSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwcy2yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMC6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrunrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OXkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Snl6SfnsOsm5ekl5mpnJaamo+qlZWoppWtrZmhq7bEwru+tsHCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+3pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpSclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opijn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlYlZMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMO9v7W/wrvIwr7KyLa4tbSws7O3wca2vbC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9taaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmZ+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTZ6foZiew6elorOhnLKnk6qkoKSfrKmsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/EtbmwsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbamt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfo5+boMOopKqyoaO0qZWyrKeipLKrrqm7sqywtbTGv8TDtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrqyp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnpaMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaqdubCro6q0trGwubevtri4xL3Dx728w8HGwLjBxsG6qrakrbutwMK3t6qssbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5uTh46Zi32LloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKujsbippbWzrKCstL2us7i8ur22tsDCv8jEucTBwMC4xL3Bt6+1qKu3sry+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4rK2qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWXk4CPlIV6jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub60qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtbCvp6GzoJqoraCllZabmrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4opeTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bXV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVEpEmZagsKixqa2lpK6utai3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6eisaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1rLGuqqejtp+fp7KgpJScmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNyakpDQ5CZpa6lra6rp6SwsrOqt7C2oKu1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5sKmtraaorbCmpKSuo6mcnpybr5qio6OjkKyepKCfoqqlprmlrLW1paqrqKyvtq6jnqOoqpugmpqSpLSajomNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZaRztObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s8R0iPm6qqoqmwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqK2qqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKspaOtrLixsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiHVsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRaPkxFlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGyo6aloaGslqqhlJqgpp6koqukrKKfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOCgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6OHeGpeYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGP0hGRJaSr6SjqrCYq6mttau2saulq6qpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqmra+rubCosbGvsqy2qra1p7S2rKykqaqco56zs6iopLS0oLWtoKmoq6irp6Crq6i5tqmqqqmiqaCsm5KpoZ2gpKKmo6mdnKa1rqimqaKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuVjrCgpautmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsKmjn6yioZOio6OnmJqopZeXmJ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6Smq6OmpKymtLKxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVwcH1ohXiEh2RgZ2NyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RFg+Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVl5Sfopablqasi56RkJGMgoqBgI+Ae5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXJ4aIBzaoNnZGhhbnOObWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8Mk9aPSKSmayZn5enpKKfp6O4r66ir7Cpq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+jsa+hrKGspJympqiampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32Hf4KOfHyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bwb2l+cWN6bGllY2Fmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJyWrKCfoaSht6uxpLS0qqi5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpn5eanaWTm5yanaaqmZycpZaVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsa2log21mcmlrZWhcY3OAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYVQsMpajoZeUnKqdpaGioLeqrqC6uaasvcSzsK6ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKim8G2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGVkpWWmo6Uk6OopJCIio+GeYR8hYV9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdlb4RnZ2hjZmhqX2hiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGROJzKepKORjqSmm56enaO1rKequbeorMPAtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelZSOlZeMj5iaqaCRiIqLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Se4OVjoZyfX1meG9ramxndXNrY2dkY3R/YWRlZmVpamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kw6CypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanZmeo5qknZeemJuUmqCSqJarqJuTnJySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnhuaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCYraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCdkZujq6qpu5+opKCYmZmeoI9ropaYnHGClpukgHWSqqeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRmXmRmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmJCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6ernpOSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrZ6Ump6VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflJrY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cfr62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWkpiSmYWvamqKjap+Z4SVh61lcJ6dlJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWaHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK3usKnqbCrr6mpsK+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uinrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d/lJaXqZR+a4GmeoGFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinaeqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaiZn5yjn5ygo6SjlpufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yalqWQjZyNpHuOhqOCpYJ6rHmPnVWve4l+n2q5Wrl3hoN8poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp6nqbCotKmknJ2eq5eZl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mpikjI+cjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2hqqSxp6yppJqcmqmelpWYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrJqhn56QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioOog5mZoYmSmoqif5KYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfY6dh5mZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSUnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYyCp4aWoKGKl5eIo4KRh5SqfICLnXlvsVqng4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifn4+NjKmwr6adl5uopp+MkqSXqKunlJepp56foaOspKGeoY2UoZifoJKdl5yVnqCVlo+rm4+ubXK0cqmMdoqmc7R5dLOAkqSikpyNiaSHj3a4b4x7i6Jra7ZZoYZll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpKu5naOtm5aZj6Wjlo2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKjoJ6nq7CYoaOQmaKXoJuWm5ehk5ypnJSRq5mH1JKau3Oww4DDhn7Vlpy4eIiQmIyXiYyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2pqquxp7mvtsWxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirZiVoZCloJONnKOemJ2akJaTr7mxq5WXo6inlJCWpJykrZ6RoKirn5ufqaOynqOljqeilKGanJeVpJiPsKCSlaqehZCZtYCQkYy4lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWeDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssqqesq6m7rrDFr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56rpL6moaqXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vb7Aum6Sg3GUhmByalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxmolocox9hpVnan5xdHh9fWJbd3SBaFBcboN8e4tqWGt6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwaOatLq2oqylrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrKi+p6mmlZSblaCZk5ilqaeRnpCPmJ2wsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlJ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWhufXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpuUoJ2OgnqlhmtpfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGltabAqLSgnqSlnKSVlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZipp7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYk6CilqOel6COlpSLio2Ol62PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZk5GdjX+NZqGzroSJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopammpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKK0yLOfqqSrlpaXmqedqJufpKuUnp6cn6quqaWjq6Gtm5+goZilnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpqPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFebIqJgHZcaHN3d5GAh4Jud4J4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6gnZ+qr6qro6qfqJumn6egrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwcF7gXuRjJrCv31rpbFvjIBvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kcq6KlqKWktKOdopKmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2dra6orKajoqegpaWdramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaGgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2mErnR9loe4YYKtWaPNbo91e9p7f5lwfoiSdX9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gn6ino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kqrCov8azqKmxrpaSnZyil6Cpqp6UoJ+cna6vp6qpm6enpKGrkq20lqWjqqqeo6emobCgkpqnmqGblJSRl6BwhYyXdYWoh3GwfJ1yrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuv1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqqfoqWfqKiin52wrJealqinrqyop6mel5Sao6KSlKGtm52mo6+so6y0qbnNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpGBgUqyEf66CmnaugaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XX2lYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOosay2yLK1qqyplZGcnaKZn6WznJqglJyfp6uro66arKmioaqjs62iqrOxoZuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ6UgdK4tLjJgIGyXl+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWGNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwMa5raiyrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWeopeTqKq2sqybpZyglZClrZGZnKejoKqnrqKjp6mwtMKxsqqtqJOJmJ2kmqGjrqWXoZWYnKWmq5qvna2opp6so7esobG5r52br6eztLOklJiopJqfjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKihtbHDsa2qramRh5GcppyjpJyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyubGzp5iesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1laGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamRlJeuoKCep6Scp5y1mqCqo7WrwrCpq6mhjISPm6GgpqKVmZqcmJqZpqSmmKunraKlm62nvqyVvbCsn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqKChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvZ2doQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKLySmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqmklomakK6wrKafp5utmJiPrKKhnaaimqWdrZifqKW2qL+vpamknouAjpuaoKaekpSampOamqWjo5moq6ujpJ+pqL6kl8OsqqOhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbWZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20l6CzqKqrna+tnaubla6ooo6Im46vq6imoqeZrpOZj6iaoZ6ln5mjo6WZnqOpsqi8r6Sonp2OfIualaGgmY+SmpuRmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8rq2slYGpkqOvjpuAhqSXmI+AgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRrqajrKGknKqhmIujkqaeqJyaoamimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mVlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCsrKOgp6yfuqOkrayspo6WramQjIWVlqyepaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMGopLOmrLGyq66sqLmjrriWiqGopbadiZail4apmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmZOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJjpynlqukoZmnnp6TlaOXqJupmZSmoaOPmqeZobW6qKqYmpCNfIGUi6GUipSRlZCQk5elj56ZqJ+ctqOdp6y3qK7BrqO3p6+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZiYlpCVnpGIoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJipnI6GiombopCunqOVp5+hkpeYm66Lq5aPqJqojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKvr3WkvqOyoHh6oKuyu5V3raSfioCqfmRcYnafjqSdg5d+bpOznKOnrquiZZ6fknN5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhZ2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqaUlrigoI+co52RfoiIm52Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSnoJmYi4l0dpONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqjr7eBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6tq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopafoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePomueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4uTkI2QjIyXi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ef5KFhqykh5yRipiol5makYelsKailZqIiYBoboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh5x7gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3qGf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6Oh4+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd2o7Oio3+IlHidequaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGZsaGhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Ccc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIeSmZV8kqShn6OIroZ9tYSOnp17pZZ5qYKWnZCKoZ19p2h2bX6Zc6BzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpnaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa0tbXJoXOUioCfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dJhxUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVcZ2tuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJr6eEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecl3Bnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oGxupmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2SnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6WEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiUoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOro6CQgHWUloh+gXmUrqN/gZtxj4Z4kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlrjIVbeXhxeXBobn6SiXF/dIGPk5NxhYSCZYx/X4F/i3d1c5R1b3lubodthIVed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxmjHN5e5h4hFtqWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9wd3lsanZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjZSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWlke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZmN5g3qWW1xpZm52W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH17dG9zY2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iSm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgoiRiWt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmuBg3x5mWpyaGBzinB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV7fHJucGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1rfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqg42Sl5WPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG15dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG5rfYB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2en5wa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt/eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnpri4FzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOjopshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2llamNod4dtZmxoaWxogHx6d26Qh3OBg4R9c4GGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5COkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKj5GKnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2xtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9rcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3lyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyZn5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eGd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zdb2JxYF9sbnlwZ3BmZnN0aHFsYXdlXVZmYWByU1BOXGZlXXhwiHxeXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6OjoR2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZKblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6UiZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR6go+VmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlfa3F3ZmtqYmZ4cnBwY193YGBWa19ddk9OS2BmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2jHx0eYaBdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5ucGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l3hoSNm5qYmY6Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2tVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOKbVtcZHheYGRlhV9jYl5YanJrbmtydox9c3eEgXh3e4lxg4R9foh7dIuIiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcWhmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWhbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNygX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY18kIx+ioV6dXuCe3CGgJWZjpKUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GEfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJSPkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJpYlFicnhsYWVdWmqDbXNiW2dfZWxfblRab05IT2dlXGducYBsWltjcl9cY2t3ZGVdXFpsbGNtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3Bte4F3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYmFdnd9gXF1hoGelIWUj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en2NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaGFOZnR4ZWBdXFhugG9zWWVhXmpuYHBPWWtRRFNnYVprbm18blpbXmxiWmNvdmNmXF1gbGljbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeIWDpZCEk4yDf29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2OhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneXFaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiJeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYGViXyDeG52h4SDl3dviIVrdXt0ZXmCg6eLg46LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF0gZqKgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZW5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgYyThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjouJdnBshYOHdXmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmZ1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccFxPW3JwZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMiHJyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnYF/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Rne39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHR+d4BwcX9thHSUhnh0a2B6gnmIj2Zxg29ndm1bbX2AkJN/gHmSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Yn16Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFtiV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kY15uYlRcckdCZl9dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX52eH53gYOBe3N+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmLjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hZuIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHJYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVyf4eFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x8i212gHljg4eXhnOSi2+FhYF5gnRjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveImjgYR/cZmTcYB4dYJtgIKRh3OViIyIhIiEfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXt4cGZsYm6Jfm1tVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KJf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxof3BvcoB0iWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4F1YneEinyUgG6LaW16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f394d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoR6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSQf3yBlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYnN7aWhtaWBiV19aaYBqa2+AZ2thaHl4anN0dG2EgXt/fXZ1bXtoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6h3gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXWxyX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4Ryh3FveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bnB3dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYB7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdcWl51gWlebmxcYVZcXGuBZnF0fWlpXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR1c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1wbnaDmHlygYB8f4iLhn51dYZ5h4t9dHV1gnh6eoKMjn1+hIhqc5eBeoqdfX6FeoF6fnyGiHNxj66Me3uGj35mcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFhdYmOQpWh4dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldmxgZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dW9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2t2gZB5bYN+gIGSiISAdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg3yZknmAgHh5fX90iINzcJmie3t/iJV4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdjaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2jnNbV1NkYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGp5bG9wenx7cYB2f3J6eXlkZXVoXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6DdXJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i25ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUWmBZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVveX51XmZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBiX5rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tld2RlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHh+Z1pWWGBreHx7cIRfYl5nVlhfV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcGZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh455bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipGOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aIhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYaFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk4Ojw8Pj07Ozo4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs7ODc4OTs6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT07S2VAPT0+PTw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QD89Pz1reFQ9Q0U/PkA9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD88PD1ATUxGSHd1WTc8Oj09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkBJblA7PWSBgn51enZTNzg4Ojw+Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1d7eVJlhIODg4R8eFI8PT89QkZBRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAWXR3e4KBgYN8gIN7TD9AQz9KUj1NRzw8PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQT9SdXN+gHuAhHt+hmJAQ0NFPk9bTG1oSUBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZrdX5/eYKEhYWGfUpERkRCY36FiIl+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR114f4KDhISGhoeNakFCVnSFh4eHh4eCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTFh/hIWFgIOGh4l9U22Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKXoSEhYR/gYOGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklqhoWFgoCDgYKCg4SEhYWGh4iIiImJjI5mREM9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWeGhYJ/gIOEg4KCg4SGiYqLjIuKiYqLjIlePzc2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaoSBgIGCg4ODg4OFiYqKiYmKioqKi4mJioJINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUF7hICCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89UIOCgYKEhYSFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJZhYKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouJi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERV6GgoOEhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKXYaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlFjgoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1FRUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VRUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE1SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQPkBWVVlbY2BWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp0g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkA/Pz8+a1FKYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1ldHR2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTEhISktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l9e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxKTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkdLTkhESERJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGRktOT0tGSEpGRURESUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHSkZKR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFLSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TkhIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl1cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS05NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTElMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRUpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSkhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpKT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTUtMU1JMR01MSE5KSUhOSEpKSUhOT01OTEpNTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNEQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBFSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZBTEhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLSktLTk5VTk9LS0xHR0tQU1NOUE9OTk5PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdzUWh6bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5NSlN0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUVVVVlNaUU9TUldVVFlWVFlVU1JVU1RUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFJSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VXWFVTWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNYWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZUlNZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZXWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlRWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtaX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pYW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWFhXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1tgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXFxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFxeW1hdW15fYWNiYWFdYltiZGFfY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3d6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x9e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx9e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAf39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39/f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoWFhYWGhoeGhYaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoeCgYKCgoGBgYKBgoKDgYGAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYGGmoiAf4CAgH+AgoGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoGDhIKCgoGBhY6djIOChIKBf4CCgYKCgYKEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChoWEg4F+fXyAk52Ng4WEg4eFgYCBgoOCgoSDg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIWUi4V+fH19fnuNn4uBgoGBi4t/hoSCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hp6Xh31/gH6LhYCRhIGDgX+PkoGTi4CBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEnKCIgYyCfYaFfYKEg4SCgZSYgomIgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGUn4WEiISHgYB+foWFhYSFjoV9fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4iQgYKBgoV/f359goeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgICAiYR/fn1/hYF/f4CAf39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpGRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgIONhoOAfn6Af39/gICAgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgICBhYSCg4KBgYKBgYGBf3+Af39+e3qBi4yJioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgYSFhIKCgoKCgoKAf359fX19f358enyPjImLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4OFhIOEg4KCgoOBfn1+fn5+fn59fX59fX6Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgYSDg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Cg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIODg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgICBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KCgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXp8fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHem19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERAXNLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/Pz9HTz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K4n9HRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdWyl5i4upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3MnaOosdGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwsWIm7bV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8vXpZu11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjU1aKatdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCewteimbXU06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/aopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp602aOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecy9eim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbVsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PTk7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfn5+fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0E+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmZeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZyanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqraioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxop+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKShn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopqYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7G+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLWzv8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBy8vIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJvLrV1snMyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxrnKypzBxsPAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq7tsC52pt+vMK+wLy7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbi9ycqDhKXHusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3ube6u7q7v9Gpe3+Jur/Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyYnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wtrmyvb67xLa3t6aYp6antsTIjHl+hbnJz8LAuK61tby+uLqyvsTEysXBysPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwutHTtLu+vMW6tI5uaHBja3mfrHt7goW70dHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Syxtm8vbvHrY54Y2JqTlJaYH55f4WJvMrMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLi9aXe9zr+4r29ZYmRTbGdTUVFbc32Ej7vDx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7trvBwHRpfau+tnBWSlZqSVqBd3NUUGZ8hZq8vb/GwLnAvL7FxL29ubKwrri3v8PHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJDQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5yb96d2l/qZdWT0p3dE1RbHmDe1BUgomht7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMjAg35zcZNsT0hciWhPT0+Brn1dS3ikqLGyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fEu4yDe3h+YUlgjGpeUU9ega6OXlBOe7a2sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4usGbjIWJflNNiJ54alpWbF51h25veqW8trG0tbK0r6y7uri2usDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO8qpCNlppMVYq9ZHuCiWdie2pibXagvriytLOwsa2wubi2vri7v7Kysq6xrrmvqqutrKOooZ2enpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrCkmqSdTGB+j3lseX1jYWprdHltgqS3sq2zr66srra2s7y1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKm0v7Ozb2GFb2lpV2NdXlNUWWNhXHF7oraqsrSuqquvsLK1raWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpsPDkFV1bmZvZldbUUhFR0lMS05hZXuzr6+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp27soN9YV9tYVRIRlFLSURJR0VKVVlcpbKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopueo6ehf2doX1RHSVZ9fmhTR0NCRkxQU4qxrqyvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhj3dqW1FKRkxxoKegbE5FQkA/QlSDoKuqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHlnXFJNS0pSjdnZwI91ZFZJRFORrKitqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJ5uVk5MTk1WZ6HQu6CXuKaQiZiuuK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVYE5GSkxWa36nuKqGjNTWxr+3qJ+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelFxKQkhMaHmpuKGQf7HLu6+pop6cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKJsSkpMVXWizdK7oaSzqqOcnJygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGsgWVydpCz0dvRva+pmZWYoJyaoKCem5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1eVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGloYKKkrTS0tXCraagl5aYmpucn52YnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp4FsiIfA1cywm5uWlJebnp6fnJSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vcnR2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKxqaH6T1tCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0c/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWlX213qtSqkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxczIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKylV5wd7i0j4uTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4Zgc4OwkoyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL66uMm1qbGGaHOTnoyGiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFfZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqqyptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fOwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmviWtjiZOIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RiYWNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62oqIpjZ4uEiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmyr7q6sbakoKSfprGnq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKKNYXuHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtru7uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnqiqppeeiWWDhYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgm5murq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lpJilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smn1ogIOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkuLCkt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqetsrClq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r66vqJuYoKeTkIp0e4B8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrrKaYl56ii4hyfYh+dm5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Geraypqa2soaKilZijm5yQq6mwm5+in56XmZOJnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdQT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLTE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJmam4h+cIeDe3RpaWlsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6QhJGHkJGPmZOVk5ybo5yboampq6isp6impJmlrqSUmaWvqZ+bmZugnq6ZnKuzoKWmn6KjoZWTm5aWkqmqrZqcoKGgmpSQjJmOjJGMkY2WlZCdoaCjnJujlZugo6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhTVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqairt7asu8q7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSWl5WGeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKman6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThomNg4+LkpWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqbl5aSgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVhcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omqGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCan6KVlJiZlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZnJSShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qYk4qPiZyIn5iIh5aemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH2KiZWLjZGSlouEioiVhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjICUg3yBj5iVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaWFdUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWf25pbm9uWFVXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXltZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKyoqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHN0ZWdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3NybFtdXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3GDnp+RnH92hYWKj4iQaWhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH96gol6em9na3h+en5yamReWlpdalxhZl9ZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCjqGflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gIGBc2FdY15aZmtca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp4en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJaPjoGIbHNyfH98cWhgXGBeYmdjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKynqLSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiZiZKKlnp6foV+Z2BoXGViXWRjX2ZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLO/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq6orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebtqmMpI6Rk6CHeIKDdVlhZFZlYWFjYGFlX1pVSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxWT15VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6CfGpXYmFYamVqZVdbY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNz9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAinp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu8wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oauonpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBf3FfYWFcV2FfaGZSWGFWUlVJRUZOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLSkhGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6t7m2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSgn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXV9bWF1hWWNjUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHta+5sLC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1hmWlFdV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaYFwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW09QVFBOSD5BRkFCRTxAQj5FRT4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yMk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWuAc3Jpb3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbiqpbSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2ZhICFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlth3Z0b312hHV5e521jDxBi8alfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZGR0pKRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoOJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eBbo56dHd9fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+grZyimpmfpZ6frJmLmoyRko2FfYiHg4SLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy9DJw9HK1NbY19jX1dvX09nb1s/b2tHWyNXLlXl7aGhbWVBTU11IQ0VJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgm+ShHR8gYV6doZ7ibfGpMLJuIGWm493cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYyBhpd7iIifl5CJjYqLgnyhiZCLvKGXk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NbZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A9Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKScfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvoIuRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNiYqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqfb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjISnkYSZk4SZjKKWoJmTiZqdopKpr5+RlZCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmWk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSs5mMoaGMpJuvo6SdmJCnlqeZrK+kl5WWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmbOWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdo7ikla2kl6mtt6ako5+ZqZepo6+wqZqZnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnYuclJKNkJKMmZuKkZ6Qi4mVn6GNlI2Ymp2Tm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FQz48Q0FCOD84NzU+Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2i6eyra68qpu7pKitubirpqaioaOjqK+ysaqcnKSYmpeXnqKlpZKkuq6pwLytrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydkp+dm5igoZSanqempKKksLKmwcbDr7C6tsXEwr7NpsfDx8O81dHNxMqIdHNiXFlfW01KQkxARUc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrDxKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoJikn5qgm6CUmJ6mpKampK+tpcDEwq6ot7XJw762zrLEvsS8s9HKyMK1dXltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3HyMnB0snKws28wbOtu76nur+9vMS3rMGprLO7vqqwqaOlo6yts622taCfrp6lopijtLypm6i9waO3t7CrkrCtq6yXhpqqpqWRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOalaCinLWmkJ6XpaOipZ6dppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmW15YVhXXFtLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipB/lqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWwv8Sxvrmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysqqebnqaXmJeYlaGkqKaftqupurzDtaaztcvBuKm2rLK6uK6ot7q9uIJsblpXVFVORkpTTks/QUdEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbe4t7KxtbO4s6umnKuruKqop6+wl6OvpKekpLXAsKqstL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqylmqCllJOZmY6cn6eimbSpqrO8vLyqsLLHwLilq6utsbGjobGytKRwbmZcWk5QS0RQUFBRO0dKSUdIQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZePnqCao6S1yLSpxrrCw8fJyMjMzca+u7OuubjAwc22yLrBuLW6sK+vs7Smo5uqs7SqqKatrJmkrqWkp6y6v6irtbe/wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq6lpJ+lqJKSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMYmVhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqKZqrS7pqmmq6qdqK+no6qqvrunrby0t73HvLe1uMGxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmWj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmaurnp2ko6iRlZWgg4+enpyVqaSiobS0urWtqLWys56coqWal5WYqqGed2BcX11KSEZHTVFJTUVGRkJSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5ekl5mpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqsraCgmqqqxKKlqKumnquvrKKpqL+3pq29sLe2x7a1uLi/sb/BtrSztK++o5ejlpSclK6gkaKipaOjn5C+pamdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylnJWyp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lo8GloKqtn6Spra+ipqe9taWxvLi2tsOys7e5vrLDwLe4rrO1taOdpZWSlKGuoJminamoq6Oaw62pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZiew6ilorOhnLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrLOzwr+yxrO6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7yypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSco66anpuukJ6Tl5SagJGhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+boMOopKqyoaO0qpWzrKeipLKsrqm7sqywtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrmyp7qzt7K5wKq3ssK8tMWnvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqaSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWVnpSMj5yelIupqaqhp6CYnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaudubCro6q0trGwubevtri4xb7Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tq27rLOzuresubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWlpyTiJCbmZSOqaimn6Kbl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKGpvaGqr6ujsbippbWzrKCttb2us7i8ur22tsDDv8jEucTBwMC4xL3At6+1p6u3sbu+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqquzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5iFlZeLnZmbk4qNlpeal6akoqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakramlr662qq+1uqemsLfFt7G3v8DBtbS6xb7MxbnCv7q/ucO3wLixtKupura6ub60qq2xtZiYp6yqq5usq46rvZ6rrrGjq6CxrbOurrayubeqra6xqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako2ipaeyqaKnsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5yTgZOYjZ2cmpWPiZSTnpqkoaGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkq7S3ybq0uru/vrS0t8PAzMi7w7y2vb+/t767sLytp7q4t7bCtqutsbeUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqa6rsae4r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpaWlt6eisrSsp7KnrbC1rKWZoKyom5ydm5SquJyUjo6LmZyil5CYpaGelYORlZCdnJiWlIeXkJeappujoJKWkJCVdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1uci4rsG8w7ezsbXCws7Fv8G9tL2/v7q+u7HDp6m4sLa2v7yvq7OynJ+nsa2mpbClnrK1rKuysKypqLS5rLSytay0raqsqKupuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6KjkayepKCfoqqlprmlrLW1paqrqKyvtq6jnaOpqpugmpqSpLSaj4mOh5GioJWNlJ2glJKFjpKSnZuYlZOGl5OVmaaanp+MkpGOkHd+jYV8fH2HiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrb3Luq7Au8extK20wsLRxcW+wLK9wMK8v7e8xKest6yzuLzAsKuxraCjp62qqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaGnqaKspaOtrLixsqCpoqCrr7Csnp+nqKmZpJiZj6CnmIaEj4qLnqCPi4yVm46NhYeQlaCdlpiVhpaTk5ekm5yci5KQjYl+foeFfHd/h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9yLuxvbfCr7Css8TDzs7Dvr+0wMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq6CinrC3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqukrKKfp7G3ra2jpaKbqquuqZ2ipaSkmKCZlo+YnZOCg5CJhZ2gjIqOi5iNj4qDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gISCfnR3jKSIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ub+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+rubCosbGvsqy2qra1p7S2rKykqauco560sqiopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6mdnKa1rqimqaKjmKWmp6qcoqSjn5mYn5GOj5mOf4eNh4WenoeEioqNjI+MhIaUopqOjJqRkpGPkp+WmJaLioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT16ZVkhteFVkVlFiUE1VVFVRT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuVjrCgpauumqylra6ztK+rpa+pqLq+vMCwrritobavycfI0cC+vbq8wr26w8G/v66ysrG1vLzCsbGzq7OopLWppa2zs7mwo662sa+yuqu5rqqutqyqnqmsn6Kgtq2ooZ+vs6G0qp6op6qjq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsamjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iMfVNYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6SmrKSnpKymtLKxqqSwp6q4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmeo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4KAiJ6Phn99i4eQjpCEf5Obk4WTooyUkouRmpGVh4h+f3F6eX58aXh8enVwcH1ohXiEiGRhaGNyhXptZ3ldXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLO1sb24ur62rbm2v62hs6aqq7C1uLWrnry8qLLAs7qgr7O1qqyfrrCjnKWoqaOenKWxpq+gn6qpqKKqnKSooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqKqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5qVjYl8fouGj46MioSSmJGHlKOJkpKHkJmPk4CIfHlrfXZ5eGN7enFwcXJ4aIB0aoNnZGhhbnOObWJpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8M09ZPSOSmayZn5inpKKfp6O4r66jr7Cpq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegp5ikqKCwuJ+jsa+hrKGspJymp6mampufo5WdnJqdqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfHyhjY2IeYOMhImMjIWIkpqOiZWfiZGVgouWjJF8hHtzb31xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9gW3Jqck1NfmhYWk1QTEpIUFJQSU5cX25URFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJ2WraCgoaSht6uxpLO0qqi5xLWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaewspugpKCkpKGXnK+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaarmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6Ei3qPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3OAX1prdWlaSX1dW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcSzsK6ita+srq+0xMS9s7+6t7Czubi6uLuursCztLivv8G4rL26taais6qnqbOrrrKim8G2pai1tamesruqp6apsKyZoqecpKaUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpqclqCiq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV9nY2Ki4Z5gISHiIiRhZWTkoyQlZSNjpR7g5eOind+e2x0cmxsdGJ4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPAtrCsorWtp6+vuMDAvbHBt7Gusre2uLe2rKq9s6+ysb2/t667u7Gln7arpaW0qauuoJ/Cq6ilsLOqrLS6naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6KgmZuZnJKZnZSlnq2jmJeelZSOlZiMj5iaqKCRiImKiHmFd4KCgp2Hi4KJfH+EiIaFkISWlY+OkJGRkY2Se4OVjYZzfn1meG9ra2xodXNrY2dkY3R/YmRlZmVpamNpcVleWF1tZGFOaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE7M0FmSCU1m6SgkYytoZmYoJaltLGisb63obHGu7mwsaO2q6uuqbm9vLutwLKvrq22r7O4s6iruLGurrS2u7avuL2tpp21q6ChsaWrr5+kw6CypK6xr7ettZ2tr62uo5mcp6qlnpWbqKWfmaWip5yaoJyUnJ2tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUm5ySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYmEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnluaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaWZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+prqW3ube4rLuvraqrt6q0ua6lsrWxrqmxtrawsrW6p6iftqmenqqiqq2cqcCYraSusLa1rKyesa2wqqKbnKOsqJuVnKejnZqpoqOVmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielZWfkYmXmYCXi6CPeYaTjINtaX53g3FshouGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYRmXmRmbmxpXl9fiZCEhmhPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi82NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6qtq6O9xa+pt8K4vbytp7awpqukuLSys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra2kqK6rrKWhnpygqKebmKGmpZubp6edkp+gmZGeqKqjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOSm5KIhHJ4jI6EiKF2iIxpl4hmfXN4oW+Ih4R+jXt/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJysnZmZnZ+rqqiqv8Ousbq8t8C+qqS3saqsprO1rq+ztquppbGtpbWznK21trSlp6izsa2yp6+fqqCyqJ+ko5qipJyutZWkpaa2vaasp6mqrKimoqCZn6ajmZmmo6SYnKSplpOinJWTo6WmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ+XnJ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrSop6a1pqe4r52zsbWqpaSnsa6tsaaqnqeksaSioZ+XnKCfr62VnqKftLqiqaigra6lop2bmqGon5ibqKCfmJ6np5Gcp5uUnaGno6Cwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKelnqOkqrG3rbS9vrC3xLK4usKnqbCsr6mpsa+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZibna2ml5uinrSzoaqboa2toJ6al6CiqZyZnqSgnJmhp6SQnaObmKGfrJ+mpqCboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZR+a4GmeoGFiJKUknerZ2qxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1U5KGXlCpbWNxfoeAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqGuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WlprKzp6Oinaeqsqiwp6WeoJ+vlp+ZlZaXmJ+topqapKi1r6Gpj6moqZuelZigpaian52jn5ygoqWjlZuemJqdo6ubppmbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+utqibqLquoq+xoLO0sKCknp6nqbCotKmlnJ2eq5eZl5eXlpehqp2al6itsKmjn46soqeWnpecoaWhmKKhoqGaoqKnm56gnpWZm6agnKeUm5qfoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOfrLCkmKa6rqSxsJy0uKqgpp2hqqSxp6yqpZqdmqmelpWYmZOToqegl5OmqrGmoZaSrJ+lkpShm6Smn5WbpqehmqOfrZqgnp6QlpyinpyllJyVmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQVRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgtKyfoKirn5WntqyosLGrrbSkm6mgoKihtaamqqOZnpWloZSUnJmTlqOlm5OQp6yvpqCVmKmfoo+RopmopqCVmqapnp2knqydoJ2gjZSfm56gmJmclpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQiJSqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljo+MTAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGknqWnp56TqrGpr6q1rKuvoZihoKako7mio6uhl5yRoqCVlJ+alJmgoJCNjKmwr6adl5qnpp+NkqSXqKunlJeqqJ+foKOto6CdoY2VoZifoJKdl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5cp09iUmtlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qqoJumpKGdkquqp7WjsqiuqqCXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOlmaWso5GXq7KkoJ6oq7CZoaKPmaKXoJuWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGtaVltqel5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaKeo6Gcm5GqpKqypLWnraSflpqqmaasuJyirpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZykrZ6RoKirn5ygqaSznqKkjqeilKGanJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3p9iWeDeW15YouscHWFf1lbp2pFZFpUZmBjXWJRZ2dxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/pZa0w7Ssqqesq6m7rrDGr7W0r7intbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnaSkoouSkqabpaublqikpZyboqmmpqOooJGtnpainpeXl52ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboN8e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdWlxUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSktaqlm5iVopumrai+p6mmlpSblaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gqmqikmpurn6OZm6OnraKfqqGZsJuUpqCXlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1ZHd9dmtwe21gY1xwaE1ZWWVqX1dZb3ptbWZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqSlnKSVlqCrpqyjo7esoJmWlqCXraqlwJ6rpJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6qnJygrJihm52ipa+moqSnnq2YlqadmZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeWZgaWRjZGZqWGt7cGlqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCmoqGdmZeopaimpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqedqJufpKuUnp+eoKquqaWiqqGtm56foZilnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iIj4N7aoVYXmt0ZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZefo56hmpmmqpuso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4pKKnr56elZ6jnqOco6mokZ6hnqCqr6qroqmfqJulnqegrJahm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYmqKgnJuqp6Kcq6KlqKSktKSdo5Omrqy3s6evopKRmp2lkpGgoZecn52Hpqukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ6dra6prKWjoqagpKWdramRpJupraqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ5lZabX66PXo6ngKGhfaeWm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2mErnR8loe4YYKtWaPNbo91e9t7f5lwfoiSdX9le4d2dmt9iG5+hZGSfm2BjmBxa3BmYF94ZFtwaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqorbSrprKsrKykrKawqqCnm5qmmJyisJ+hn6ino6ahnrCsm56Wpq6tsauorKCUkpufpZOPn6WXnqijnq6kq7Cov8azqKmxrpaSnZyil6Cpqp+UoJ6cna2vp6qpm6emo6Grkq20lqaiq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYWoh3GxfJ1xrH6hn4Klj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkI9lb3R2b2BmbWRfb2lpbmZjV1NcYVpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXVxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6OhrK62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin52wrJeblqinr62op6mel5Sao6KSlKGtm52mo66so6y1qbnNsq2mrqyWlJydopifrqydlp+ZnZ+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpF9gUquEf66Cm3augaeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb255eHdubGZlZHFwZntoY11XX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+inrC1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kdm5OqpLawrqCpm52WlKejkJqiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqgk5yfp6uro66arKiioaqis62iqrOxoZuqqK+vtqOTl6SnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXSZo5WnqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn5we3V9em1cZmpycWaBal5iWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylopyyuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdprWeopeTp6q1sqybppyglZClrZGZnKejoKqnrqGjp6mwtMKys6qtqJOJmJ2kmqGjrqSWoZWYnKWmq5qvna2opp6so7esobK5r52br6eztLOllZiopJqfjoKdTniagX+feoSjfIKkhIenn5yek4S4fHx5uYJ+zMXCtniboZCLn36alpeKdp6YiqSYo6h+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGJdXpzhH5wXG1ud3JqgW9aZF9obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJyhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6GptLmkm6Oeo5OQobKZnpynpqGir62dpKiitbHDsa2qramRh5GcppyjpJyklp6YmZmlpKiarqGtpaaYr6W8raK3t62enrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmqZo5yViZ98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIySi3h9eY2BbWl3aXhzbn90XWRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqbO0pJ2mnamSlJeuoKCep6Scp5y1mqCqo7arwrCpq6qhjISOm6GgpqKVmJmcmJqYpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqaCiloWfgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWfmttfmJ9dG5/emBnZXFvZ2doQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qZraGQqqmklomakK6wrKafp5usmJiPrKKhnaaimqWcrZifqKa2qL+vpamknoyAjpuaoKaekpSZmpOamqWko5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqaqZdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OnlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgLFsZ26Zl4yIsVt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJWWe3iNnH1kc31ig3d0gHxhamZwbWZlZU9VY1tBVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCunaubla6poo6Im46vrKimoqeZrpOZj6iaoZ6ln5qjo6WZnqKpsqi8r6Sonp2PfIublaGgmY+SmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmJCBgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srDHg2qrsL2teHeivrt0gJaOppyPmpCVnHmBkJp5Ynx6ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRr6ajrKGknKqhmIujkqaep5yaoaiimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWWGd2iNanl+eWRsY2ZsYktkWEprWTpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvraqnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJeNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMKopLOmrLGyq66sqLmkr7iWiqGopbadiZaimIepmpCUnZOqs5mbo6ygspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4t/dIJ2dIiMcadtfJWRlJOBgY+Pj4+dlKCVl5aggoeTjHBoj3Zwind2fHpqbGRkb2NVYFlAaVpHYmBPWitGPSsmITc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01PUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLu4qqKlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqukoZmnnp6TlaOXqJupmZSmoaSQmqeZobW6qKqYmpCNfIGUjKGUipSRlZCQk5elj56ZqJ+ctqOdp6y3p67CrqO3pq+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMhnWGdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyWoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1iUGBjUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7uvrKyhopl6naKwpKWxqZabuKailJmpnI6GiombopCunqOWp5+hkpeYm66Lq5aPqJmojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSehJd+bpOznKOorquiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2hnF8hoGAYWmIi5WTi1t2lZFnaJCOcnqkmJhkeZiGgXeXaYOKgm55f2twZV92b2traFtmY2Jib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqeTlrigoI+cpJ2RfoiImp6Nq5qjlKeino6XkZ6Fda6QiKaaqJGWo4iburSnoJmYi4l0dpONlZOKlJCQlIyPk6COmp+mmZyyloCMnLWdtIySj72noX6nonqjr7iBjo6nn4SLhY+xqa+MiZajmnmBi6yGnJ2ip6qoh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeYFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5yGmH6RiYGCmGqNjIRreHtxcGdkd25pbGtbZWppZXJbXklUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWVthYWhmWlFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKCVpai1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopWfoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWPiJOQipSPj5uLj5GfkpafpJaerIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqeg6CYgZl/iouDiJhvjJKEZ3d0e3ZnaHVwZ2dsXmNubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilaOptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZuamaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4qSj42QjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaGSfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWsrJ+crbWjqJKgn5+mm5mOmLSZkIuejJWLdYGUkY2KppaVl56ef5KFhqykh5yRipiol5makYelsKailZqIiX9oboiHio6OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RenZmzlm97l56zdHJbnrKCaWJvdHVxaG9Ya2xycmVcaV5iS0Q9RDVRQVlxMjxSRl9KUj08Mzk1Ojo2RDs7QElQP1RNTlFARF9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjaS4ta6toJuinKOjpKybmrGtrJOXoJigpJmak56rm4uIkniLhXCAlo2Kj6CQk5Sdl32QiY6ooYeYj4qRopObmoyLqKikno+WhoN9anqGf32PjIKLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2tpW3FpeHljX2VXYkFQRU43VkJSbTRKWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJynn52tmp2wqKudl6KZoZ+Ylpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlI+Fi52RnJuJj6ijoJmLkIl/f2mBhnl/lot6iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX5uZWBsaHZ8ZGNgUV5WXVRWQFlFUWdEUldbYlheSUQ9QjhAQjpJRThMRFdBVlFbVkRGYlxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaGhraZOdgbGumYRTX6Cns7mzs6maooubqZybqJKhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgIiYlJ+ahI6onJqUioqJe4NrhIVxgaCLd4WNiIeSmZV8kqShn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ5+p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRenG9+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+Ea2dmZG12eGhfYVJbZVFRYklXSVRfV1NbZWpcZFBGQ0tMSktCSkU4UD9QTVdTWE9SUmBmZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36pr7K1sLOjnJiFmKegoKONpKigmKmJmZeYk5mTkqCXjYiFe3B9hGh9j4KTmoF3kY2OiXB/hpCTkmyXk3yIkJGjlYOOqpqUkoqFiXmDdYiAboKfhnd/koaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHFuVl5UWWhQUmhJVUxYUlZcZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRnY2pmb21laW1lopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko2Ig3lqeYZlg4x+l6B5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl5f3yLeXCQoYZ5gJWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VvY2aIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXJqcYFtcGhreHNrcFJYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfX9/jnNpj6WEfIWTjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaUl5ygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVxc297dHFian5uaGxTVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY2AjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOrpKCQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJieoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3lvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cXBvd3hvXWyGbmlnVlpgV1xla2NVYVVeUV9wd3lsanZlampqdXxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ybmp6Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaCaHmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZbHFbX2BZXl1mdH17dG9zY2traXt8cXt4dGRtdGhsfH51eXx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeq2CkZiZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlJqfiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLnouFlH9+jIGBdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiI+BdmuBg3t5mWlyaGBzinB9enZ1b3d0gV1eb4dobl9fWlxdU2hxVWNbW2FsaHV7fHJucGRramh/e214f3Fpb3BsZoF7coGAeIB9gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXuAmaqNno2Fn5yKnpZ8eZSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXuqhI2Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GRind9iI6FpXt8j5CRhpiqoZ2TnI+Nq42RgJ6MiJKZnoKOl36GjYJveIVxdGB/g4+GdYuXgIOPgoaEfoWDlG55dXSToouNhZqEhI10gIp9fHJze4iEe3mMjoSTp4+GhI+Cg4qJiXaFh4mLe25rfX97bWhrbGdeeX5nfHt2c3V1e3dcYHB9bnVgY1tcXlFmbVNlWl1ha2l2en5xa2xka2pngIBsc4BsbHRveG6EeW6GgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enNlam1ti4qfuJqho5+SkpaXi5qfnp17eJ6lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHKAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIp5x/cIuKi5KGoKGKhYx8qJKIj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joR5gISPh6GAfoyNj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfYCNhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxxeXqMhXp7ko2DlqaTi4aRfIWGh4R1goOIh3lkcnt+eHlwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZYCAam1+aG5xa313hnlri4FygYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmN1e3tyYmpveomNn7KSpaWcjpCYj4adoJqcfHakoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqWbh4yJg6aWhZKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5Sceo+Fg3iFl42efoGKjoxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x8cn94iod5hZGKi5iilYKEjHeIhIKBdnuBiYV0Xnh3fHN9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaDaXFuYHlnbGJqdnBmeXx6cWBybIaGkJ2ul6aono2Nl4eGoJOXmH13qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefYuVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SNjopshpiQmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlqdWx7fot+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dniAfYaBfYSOhYyUpJB5hYN0iYd9f3N1gIeDbWB6dXlwe29hbmJke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2llamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXJjh2hxb2V3aG5sYXpoa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JviZmEZ4aaj5R6iYWQinCWmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXyLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW5/fYCHfYWNioWNlaiNe4h9fouFd31wb4CFg2Nod3N0bnpiXm9ganRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoVzgIGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdvbGV7Ym6AeXZxbHd3in+jmKKooaabh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4Wjg2eGnYqRf4uEi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2ttb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiHuGjHuLh4SJj5yjiHyEd4KLgHh4bmqAgoFdcnJwb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJdam1kYmZrkm1gZmZfaGuBdXJycIuAdH+CgHh2gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3BsdGpob2x2d19xf3l7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoKMkqSak46IlZiShIaWmYyTi4mPj4iehZCKfHOLhYmPiJyZn5uWlICUf2mGnIhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox7iX6DjJGfnYV8fXiCi312cGlrgYJ5X3dubGtxclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZmYGByU1BOXGZlXXhwiHxfXWhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIR7eZV3ZnJqg2CHfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+DmoiAi55/ipmTjoSIl42Oj4R2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIJ1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoiZKHbImkhZOIl4OGY4yRmI6UipaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen1+f4aOenpoc2tzi4+KgoWFfZWMbH5/b4CMf4yIfYR6gpCWmpuLfHd4g5B5c21mcH+DbGl0bmdoc21TXm5kcFlfa3F3ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn96iH5yiYeBkYqIfH6YdmVzbnxlh35ucGuAWmxueXlzYHZ6e412cneKd3mfi5uum6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eJi32LpIWSiZ2FhV6LlJeKjomOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFjH55ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmJ0bW9haHVmUmBwZ2tVX250eWByY19ofXFybVpicmFiV25ZXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3e4lxg4R9foh7dIuJiJaGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWR3eYaMaXaAiXJ/nIeYp5yjkoR9cIyUeHmLnYSFoY2OfJWMf5qIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GFgomHmaKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdmJ0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpORl4lucnqMhnVscWtyeIBfdGluXGp1YFJkcWhmU19wdnRgb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW9qdHeKfnNzgX56dnqIc4WDfH+HdneKho+YgY2Ce5N2bHd1eXmTdG54en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJWPkZOEbnB5jH91bW5qa3p9YmhqaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsbGJtaXN2hn9xbn98fHR4hniFgnyAh3V5iYGSlnyJhnaJgW94eXuEk3Bte4F3XoN/dIFtaXpzlHNncoh9cpKRg5qfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8iZidmIeUjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccWJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGpja2lzdoGDcG1+fH90dYN7g4J8goV2fomBlpF4g4p0gYhyeXh+jZBvb3yBcWmBeXp+bWx8dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHR7aF9lcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRjIVua4WSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYWbmZSLk5CUhYdwe5KCfYKDiYNugXhogIR4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2NhHhub36EgHd6ZWhqfHBfWXdaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtocXd/h25rf36AdW+Ce4CBfoN/doGFiZeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4qDoZmckoKGZ4eDb2h6lYh9f4SBmImBfI2MaXhya2xmX2FveG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjIt1fY9/hYKViXyDeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHV3g3mGnJCMkJGSjIuGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dheYSBcWRxaH5tdHF0gZuLgH+FfnJ1fYBzgXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1lvZExacnJlW0lwd25cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi254foB7e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzj4uJdnBthYKGdHmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn52gIF8jJmHgpOQmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4FyYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXN/fX+TiYl6bm5qboKCdW5dZ2ZzcVFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWWhNQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5CMiHJycIR7gnN1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dmNqfIOHnoF/f46PfXJ/dIV5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhsf3lzaXp2gIJ9aGB3h31qa3Rne4BpdoCLkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZHVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2pkUVpwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fnmCgYF8dn2DiIaDcHeDcm52goN9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHV+d39vcX9thHSUhnh0a2B6gnmIj2Zxg29ndm5bbX2BkJR/gHmRkn15e22HdoCQi4R0loqRjoeFhXt/hWx0dn9tZ3ZlbXt1bWp2d39/fGBieIV5aHR1Yn17Z3SGjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXl7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH13gYOBe3N9g4iHg29xf3RxdX6FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hpuIgoFzl5R3f3xtiHGBiouHcZeOkIiFi4N7eX5xcXB9ZmhxYm14cWprcXd8fHlcZHmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1ye3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZvd4qjgYR/cZmTcYF5dIJtgIKRh3OViIyIhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkVrWmFkV1lVeVlOVm1qWV1sZVxaZWNedGZtZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN4enpzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk39yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHR8c3x6bXt7kIV2mHyHhoKGg3x0cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ1Z3CAd4F1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpwenlzfmZ+f395d25kZmJuhnxta1ZqYnBTS2hqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39+hYV6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgot5boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2thaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9njqh3gXp8kI55dW9+b3J1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2lvgH55d2B3hIR3j4RyiHFveYByY3FpXG93ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0trZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFVubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR/eXZ0hYiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gICBc26Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXWt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ4b3qNfHaOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3JrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVlxdGJxcoV8dWRyf2xhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x8dXFuhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2JwdnZsYltsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtbnlnd218hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3BhcXGCfHNmcYBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSiISBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN4dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqal5abXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGp6bW9we3x8cYB3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZqaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGttYnFzgXpzZm9+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1FPWVJJY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIuPg4KXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5ue29md3B6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5waGlzcXNwdHVqbYSTgYh7hXFyZm59cHJvVFtmamZxdIF3c2JsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRVlNQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmt5dW5vaHZ2f39sg399hpd7f4iBin5rk4hyZ3SAe3WAg32Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHxwZnhyeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmd2RlXVhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3ltXHdxbHppdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB+bGZrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYiNfnyKiI56bpCKdGxzgnR/f4iFhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ucUosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2drPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHhoeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiMiY+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gICAf39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fXx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISUdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tKSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZDRkZER0lIQz9AP0BBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAgH+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTs3ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc6OkA/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT8/Pj09amk+PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlJSUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9CREQ/Pj0+PkBAPEp4c0w9Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRUo/PDtSb21nZXhzSDg8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNemM9V4GFhoaCeXJGODg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1Z3e2d9g4KDfoJ+dkc9PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0VAV3V0f4F9goN5gYVyREBAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBOdHJ+fXiChYGDhl89Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4CBgYSFh4aIhEtDRURDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1hzgYSFhYOFiIiNZT9BVnSHiYeHhoeCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSliChYaEgYKGiIp8VGyFh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKY4aGhoOBg4KEhIODhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aEgYOGgIGCg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGg4F/gIOEhISDg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFcoWAgIGCg4OEg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUaAhICDhIWEhISEhomKioiHh4iJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89VIWDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJdh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWGHg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKX4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9APkBAQ0ZKSlBng4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlFRUE1OTUtKR0ZDR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTUtSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/gICAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJbXE97Tk9PTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRExRT2FXUlhRUFNTUlVbT09RVlBNSkNGPjo5NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTElISktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg5R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fX1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9OTUlNTElLTExLR0ZGRUQ8QUE+O0BFOzw4OVRxcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPSEpIQ0lLTUxKRkZGRT9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEtNTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpLREdCPT49Ojo6O0FCPz1CQ0NDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETUZCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVOSENHTUxOTVBNTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lHSFBLREpNTFBOUE5PT05KSklNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj9AQj9AQkVHSkZKR0lIRkZHRUNCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBQT05PT0xLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk9QTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1IR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PU1RPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF5oZWNgZGVoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vc3N5TklIR0lEQUNIRTxARUNFPTg6Pj4+PT1BQj0/PkFCRkNFQkNHRENFRUZHR0dJRkhKSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY11cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF3cXVNSUtISkVCRUdFPEBHRERAOTw+QEA/P0JCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQUFAREFAQj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gYGFhYWBiZGViY2liZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRENBRDw/RUVFQz1BQUNCQUNFQUNEQUFFR0NIR0hHRUpGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxLTEdEQUBEPj5ERUZDQENBRURERkNCRUdDQklGQ0hKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRUVGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFREBBQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTU1GSk5ISUtKSUxKSkpLTU1OTk1NS05NTVtyb29ucHBsa05QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTklMS0lKTUlLSUpLT1BPTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZOSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tLTk1MTEhKSkhKRz9HRk5KS0tMS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJXXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkZIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9EQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNFQERDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFtcXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERWXklHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURAQkNGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpeXmFhZWZjaGRrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0dYTUhISkhHTkxRUUlMS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYERDX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2FUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09MUVROT1FQS0xPR01QUlpaVFFRT1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJiWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmNkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkRCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU9QVVRYWFhbW1VTU1dbV1hXWk9TVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU5TUlhVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWVtgXlZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZZVFdXVFJSWFZVWl9aXmBfVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VXVltcV1FUV1VXWFZUWFpUU1FZV1ZcXltfX2BVYVxgYV1gYl9cYF1jYWNnaWRmYFpjYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUlRWVlhZU1RZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15VVU5WV1deW1hRVVVYWFhVV1lbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVXVlNUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWV9aWVNUVlpZWlZYWVxWVVpdXF5gYV9lZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWU1lYWF1eWF1bVV5fWF9fWFxWUllUWVpaYFhbVFZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWV1VVltcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVlVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlRWVFhcXF9gYF1gXVdgXlteXFteWFZYWFtbX19bXldYXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYWZlWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVtfXlpZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2NiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6ent6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+waGKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCg4ODg4N/fHx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3d6eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXp6ent8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8enx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JycXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYGDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOBhoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH59e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f4CAgIGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4CAf4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoOCgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn59f39+f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhYaGh4eHhoaGh4eGhYSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBho2CgoKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKCgYKPm4WAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICBgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKBgH9/hZabiISChIKBf4CCgYKCgYKEgoGBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFhIODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhIOBgIKDioiGgH19fXt/l5yJg4WEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYSEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCAhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaZkIZ9fn5+h36NnIWBgoCBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4ODg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9+hp6dhoCJgH+HgYCMgoGDgYCAgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoKDgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICDmqGIhYmDg4GAfYGEg4SDg4ODgoCAgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSCgoSHfn59fYSFhYSFhH99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aMgoB/gIWAfX17goeGg4B/fn5+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgH+EjYR/fX2AhoF/f4CAf39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4CAgYWEg4OBf4CAf39/gICAgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CDhYOBgoKCgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEg4OFg4OEg4KCgoOBfn19fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OFgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICBg4ODg4OCgn99fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKAfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foGTkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyAg32Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXt9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+enx7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH+Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX57fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgIF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f35+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGCgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKBgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fn58fX+AgICAf39/fn59fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXt8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fX+Af39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoCAgICAgH1+gH2Ag4J7fn57e317enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgIB/gYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhIODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgYKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eXZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp7fYB+f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4WAfoKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4F/fX5+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn1/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhISGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SEhYOFhYGAg4N/fn+Af3+Ag398gH19f4J+gIF+foF+fn59fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4B/fn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYWGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn5+fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+fHt6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYOBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgoOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdGZrJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3ElIicnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwr/JmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8zSlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjZr5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCew86Lk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/P26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCrkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqefsaSkqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwc7DysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJus7TyMjNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu+wcfBxcPTianPxMTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbezrrq7tr7MtoSe0ry/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK63tbi/z5uBirXBusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube4tK24sra9xcWHgYCfxL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+xtrqxvb67xLa3nH53gnSEk8Gse4GCnMnGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owu9Tau7q+vMaynXdjbGRQW2F9j3qFhpnLztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Sistu/vL26fWRvYGBzW1RVWGx8hoibyMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLfBb2+wzcG0elpKZGNLcH5uYFFZeIKLoMXCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru/x31vdqS/m1VST4NnT1x8gYNsRmuCkKzDvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5x8iCf25/pXNRTGKVX1FRVY6Wdk5li5yuuLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMfIioN4dI1hTGKKcVxPVmSwundWUH6vsLKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDw5GIf395VlGOlGttVmVwZ5R+cW1eh7yzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucOikImQfkpemMN0gYqQXXZ8aWp0irS7tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK7r5SQnZZMYo2UdnCAemNqbHN+enOeurmytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrSmnaqOV4FvbmpcaF9dVlleZ2NpgJe4sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmxwLevaHh4a3NoWV5QSkhKTFFPWmtuoraqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpcTDjmBlY3JjVExGXUlQRk1LS1NeXXy2r6+ztaqnrKuinJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp25sYV6Z2pjVkhQXo57bFNLR0dOVFRkq7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueo6eafWxdVExJVYOqsZ9oUEZDQ0dNXpSwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGhhm5gVVBOT1yr4Nq6j3ViU0hCTYuZmquqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHRZUk9SUl11uNK6oKm5noR5ia7Eo6itqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJxmUElOUF11jbK9qYei3NbO1NnItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyUXUtFTFN1hbO2pJKJxePc0cS1pp+ZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmNKSU1cfqrR0Lags9PMuq+oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKV3XWdog7DS2trWyrqyqqOenZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGqiYGSr87U2drPvK+om5aYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGmlXuTksXW0tXCraahmJWXmZqdoJ6ZnJ2SfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppnZpf5TT1s2wnJuWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFysvMz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Sooahkb3yo2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfLy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raacXm93utCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxMvFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwLTDvrKyjWBygb+wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7rLw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8C4xb2rr35kdZC1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL64t8m1qbCCbXGXmo2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61r7uysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvr+8wLqys7TDrqmuhmhkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62op4dfcY6DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsn6KKYYKHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNn6Gjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadgmWChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyioqidm52lpqKmnKCgm5iurq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6SmndpgYOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWXoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqets7Clq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r6+vp5uYn6eSj4pweoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrq6WYl52hiodxfIh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkI6Uk5SdlZaXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOjJGMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAc2hgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWfm5pbm5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3tycG9sYFtcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHJzZmdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3Nxa1teXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gol6em9na3h+eX5yamReW1tdaVxhZl9ZT0tOV1JRSVBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+Bc2FdY19aZmpca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cWhgXGFfYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFgoaJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKyoqbSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9ZmBoXGViXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rbS/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhhZFZlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbS0wLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BempXYmFYamRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFfYWFcV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXWBbWF1hWmNiUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1pmWlBcV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW05PU1BOSD5BRkFCRTxAQj5FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSW09KR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZFRkpJRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy8/Jw9HK1NbY19jX1NvX09nb1s/b2tHWyNXLlXl6aGhbWVBTU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJuIGWm494cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiZCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiZKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eXdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvn4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqeb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdopKpr5+RlJCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqpmYnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnJm0l5WrnYuclJKOkJKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FRD48Q0FBOD84NzU/Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5paSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr7NpsfEx8O81dHNxMqIdHJhW1lfW01KQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrExKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762zrLEv8S8s9HJyMK1dHhsXFhbaVJMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nusC+vMS3rMGprLO7vqqwqaSlo6yts622taCfrp6lopijs72pm6i9waO3t7CrkrCtq6yXh5qqp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWmkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMSvpbO3zMC5rsSzu77CuK3Cw8LAmW15YVhXW1tLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8tLzLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypZailqysqqebnqaXmJaYlaCjqKWftqupubzDtaaztcvAuKq2rLK6uK6ouLq9uIJrblpXVFRORkpTTks/QkhEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7y/z7bEvbi4t7KxtbO4s6umnKuruKqop6+wl6OupKekpLXAsKustL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfr5yfpZSvrqulmqCllJOYmI6cn6aimbSpqrO8vLyqsLLHwLilq6utsbGjobKytKRwbWZcWk5QS0VQUFBRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK+vs7Smo5uqtLSqqKaurJqkraWkp6y6v6irtre+wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura+s7Ktvrm3oKOnqKWnnJytqamMYmVgX1FLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqOYqrS7pqmmq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7CrmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKKpqL+3pq2+sbi2x7a1ubi/sr/Bt7WztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaymnJayp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXt7GjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lpMGloKqtn6Spra+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtaOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbyxqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSbo66anputkJ6Tl5SagJKhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+utLKnqrmyp7qzt7K5wKq3scO9tManvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWWn5SMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLevqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWl52UiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbippbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SprrG2nperraitl6eojqe7n6Sts56rorGws6yptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ksra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5eFlZeLnZmclIqNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlr662qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytayqura6ub60qq2xtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurrayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5uSgJOYjJ2cmZaRipSTnpqloqGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2up7q4t7bCtqutsbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbG1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SquJyUjo6LmZyil5CYpaGdlIKSlo+cnJiWlYiXkJeap5yjoJKWkJCVdoSQh3uFgYSMi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q/vLLEqKm4sLa2v7yuq7OynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLSytay0raqsqKypuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOpqpugmpqSpLSaj4mNh5GioJWNlJ2gk5GEjpOSnZqYlZSHl5OVmaebn56MkpGOkHd+jYV9fHyHiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e8xKest6yzuLvAsKuxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sbKpsqmrpqWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+nqKmZo5iZj6CnmIaEj4qLnqCPi4yWnI+OhoeQlJ+dlpiVhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalo+YnZOCg5CJhZygjIqOjJmOkIuDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gIOBfnR3jKOIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+qubCosbGvsq22qre2p7S3rKykqauco56zs6iopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mZoJGOj5mOf4eMh4WenoeEioqOjZCNg4aUopqOjJqRkpGPkp+WmJaLioN/dIaBf395dIN/enh/gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra6ztK+rpbCqqbq+u8CwrritobavycfI0cC+vLq8wr26w8G/v66ysrG1vLvCsbGzq7OopLWppa2zsrmwo663sq+yuau5r6mttqyqnqmsn6Kgta2ooZ+vsqK0qp6op6qjq6GirK2ova+srq2iqKigrJmQr6GYoqCop56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoSDo5eFgoKLho6NkYSEk6CWh5CckJOQjZGclJePioaFeHSBf3x1eHmAe3RzemmBhqN1aV5la4F1ZoiLfVJYcF1KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsL0tnOjQ4Xz1hZD9GMUNQW1srSE45VUE0kY+yoKSmrKSnpKymtLKxqqSxqKq4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0p6essra5s6iovLWttbywvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeppKmeo6mnqb2rtK+unamkoK6cm7KjlaScpaWfpJuaqaulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4J/h52Phn9+jIeQjpCEf5Obk4WToYyUkouRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXlsZnhdXVVBVnptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9GakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLK1sb24ur62rbm2v62hs6eqq7C1uLWrn728qbK/s7ugr7O1qayfrrCjnKSoqqKenKSwprCgn6upqKKqnKSooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5mUjYl8f4uGj46MioSSmJGGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnONbGFpb19vP1t4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhZMTNTPWVfREw2S1dlTyo8M09ZPSOTmayZn5inpKKfp6O4r66jr7Cqq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSoqaqwrrmxqpu7vaSwv7W1oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6ehp5ikqKCwuJ+ksa+gq6GspJymp6mampyfo5WdnZqeqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfXygjIyIeIOLhYmMjIWIkpqOiZWeiJCUgouWjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2BmhX5fWnNqcUtMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MjxmZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKirsK2zsKeavrelrby1r56wt7CopaewspugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGrnqyjr5icqqWpnpibnqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6EinqOl4qNhniBh4SIi46FjZOYjY6WmIqOlX6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI5Xl5sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcWzsK6ita+srq+0xMS9s7+6t7Czubi6uLqursCztLivv8G4rL26taais6uoqbOrrrKjnMK2pqm2tKmesruppqapsKyZoqecpKaUmKGypZmepKmpnKKgk6WgpLmopKeup52loaiTn6mioaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV8nI2JioZ4gIOHiIiRhZWTkoyQlZSNjZN7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXpjYVJzVFtbU0xJR0lPU0AhKWleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPBt7CsorStp6+vt8DAvbHBt7Gusre2uLe2rKq9s6+ysb3At668vLGln7aspqW0qauuoJ/DrKmmsLOrrLS6naiqq7GlmJ2qnqelkZmmraKZnqSpoZuinZegnae2pa+qrqGhnp2hlaCmn6KgmZyanJKanpWmnq2jmJeelZSOlJiMj5iaqKCRiImKiHmFd4KCgpyHi4KJe36EiIaFkISWlY+Pj5GRkYySe4OVjYZzfn1meG9ramxndXNrY2dkY3R/YmRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPjlfbGlHQlVTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE7M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6irubKvrbS2u7avuL2tpp61q6ChsaWrr5+lw6Cyo66xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaWjqZ2aoJyUm52tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUnJySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGltq+prqW3ube4rLuvraqrt6q0ua6ls7ayr6mxtraxsrW6qKmftqmen6qiqq2cqsGZrqSusLa1rKyesa2vqqObnKOsqJyVnKejnZqpo6WWmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielpagkYmXmYCXi6CPeYaTjINtaX53g3BshoqGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYNmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrbSmsLWjqLi3tqmnrLazrrSts6Kpn7SrnqKknKeomq28laelr7O3ra2kqK6qq6ahnpygqKecl6GmpZubp6edk5+gmZCep6qjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6EiKF2iIxpl4hmfXN4oG+Ih4R+jXx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJyrnJmZnZ+rqqiqv8Ovsrq9t8C+qqS3r6qsprO1rq+ztquppbGtpbWznK21t7Wmp6izsa2yqK+fqqGzqaCkpJqipJ2vtpWkpqa2vKasp6mqrKemoqCZn6ajmZmmo6SYnKSplpSinJSToqWmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ6XnZ2lrbKpscK9srXAtbe+wqums6ysqaivtKqvtrOop6a1pqe4rp2zsrarpqSnsq6tsaaqnqeksqSiop+XnKCfsK2VnqOftLmiqaihra6kop6bmqGon5ibqKGfmJ6np5Gcp5uUnaGmoqCwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYCUeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKaln6OkqrG3rbS9vrC3xbK4usKnqa+rrqmpsa6ksLqwpKSus6Opuames7OxpKWgqq2wrK+mqJ+jorGdpJ2YlZibna6nl5uhn7Syoaqboa2toJ6al6CiqZ2ZnqShnJmhp6SQnaOal6Cfq56mp6CboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFiJKUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGnta2jq7WkpbOzp6OinaeqsqiwqKWeoJ+vlp+ZlZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5eZl5eXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrLCkmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmelpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyWmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWloZSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5yRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmkmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWto5GXq7KjoJ6oq7CZoKKPmKKXn5uWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpbVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5p5qeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaOepKGcm5GqpKqypLWnraSflpqqmaasuZ2jrpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZ2krZ6RoKiroJygqaSynqOljqailaGZnJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZVpUZmBjXWJRZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKeeoaG/pZazw7Ssqqesq6m7rrDGr7W0r7intbitqaOipp+gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnqSkoouSkqacpauclqmlpp2boqmmpqOpoZKtn5ejnpeXmJ6ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6ooKihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaeRnpCPmJywsr+sm6eep6KJk5Gqm6ikm5usoKOam6OnrKKfqqKasJuVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1xwaE1ZWWVqX1dZcHpubmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6rnJ2grZihm52ipa+moaSon62Yl6admpqgnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3l1g4iCa3RjeWZgaWRjZGZqWGt7cGpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLOgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqeeqZygpKuUnp+eoKquqaajq6Ktm5+goZqlnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYRzdoiJj4N7aoVYXmt0ZF1ziGlrfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6qro6qgqJumn6ihrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+Hb3eFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZecn52Hpqukq62/wLGhqq+ql5KfnqKZoqSqo5OgoZ6dra6prKajo6agpaWdrqmRpJupraqcnaqcrKKWmKWWoaOYnH/OlHl6pYJ5lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4d2dmt9iG59hZCSfm2BjmBxa3BmYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSqpbKsrKykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpugpZOPnqWXnqijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qpm6emo6Grkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkY9lb3N1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62rqixp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrJiblqinr62op6mel5WapKKSlKGtm52mo66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmZjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb254d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK6prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kem5OqpLawrqCpm52WlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquro66arKiioaqis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiaCWlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5WoqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6Se3CXkn5wenR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaWbqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglpGmrZGZnKejoKqnrqGipqmwtMKys6qtqJSJmJ2lm6Kjr6WXoZWZnKWlq5qvna2opp6so7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4fHx5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSZpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjlnt9kpGJdXlyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Oeo5OQorGZnpynpqGir66co6eitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iarqGtpaaYr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph9i4ySi3h8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnamSlZeuoKCep6Scp5y1mZ+po7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaeZgpSNlot6eYGWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWimqWcrZifqKa2qL+vpamkn4yAjpuaoKaekpSZmpSamqWjo5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4yIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omoqXkJWWeniNnH1kc31hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCtnqubla6poo6Im46vrKimo6iZrpOZj6maoZ6ln5qjo6WZn6Kpsqi8r6Wonp2PfIublaGgmZCRmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmI+BgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srHHg2qrsL2teHeivrt0gJWNppyPmpCVnHmBkJp5Yn16Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqhmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXl5iQlZ58h46UdWWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6OjoJGMpZOnmaiZlqOqoJacpaWnr7qrrJqbk5J7hJeNpZeNkZCYlI2YlaeUnpeoopqwpp6irbqgscKopLSmrLGyq66sqLmkr7iWiqGopbadiZaimIapmpCUnZOqs5mboqugspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4uAdIN2dIiMcadtfJWRlJOBgY+Pj46dlKCVl5WggoeTjHBoj3Zvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp6TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+ctqOdp624qLDCrqO4p6+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaKwqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyVoIOGl4Z5cZVyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7quq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJioj565tqSlmJuNiXmBk4yak4qVkZSQjZKWooydnqien7ikf4SwtqOxsHSkv6SyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSdg5d+bpOznKOnrauiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2h3F8hoGAYWmIi5WTi1t2lZFnaI+OcnqkmJhleJiGgXeXaYOJgm55f2twZV91b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqa2jp62kkparta+xpZqqpquXc4ucr5+oq6eTlrigoI+co52RfoiImp6Nq5qjlaeino6Xkp6Fda2PiKaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPk6COmp+mmZyyloCMnLWetY2Sj72ooX6nonqjr7iBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5uGmH6RiYGCmGqNjIRqeHtxcGdkd25pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKGWp6i1no+DnKucp6KgjZC+npmNn5qgkH2FjpmXiKudopWgoZKNlImGgJGnjYainKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GfkZafpJaerIiftIm0mq6Lyoerrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2drXmJubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilqWptqOvf6CnnKWenYmUvZmTjaCRnZB5g5aWkYermZuamqGFj4x3m5yPn5CInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZegoaWsrKCdrrWjqJGgn6CmnJmOmLSZkIuejJWLdYGUkY2KppaVl56efpOFhqykh5uQipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvdHVxaG5Za2xzcmVcaV5iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJuinKOjpa2bmrGtrJOXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Scln2RiY6ooYeYj4qRopObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2poW3BqeXliX2ZYYkFQRU43VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNHVD9ZUlldPkRiXVZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mnJynn56ump2wqKudl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVl455ioSWo52JlI+Fi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX1tZF9raXd8ZGRhUl5WXVRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRFdBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZycqZOhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5WHcoCJkqCccpGQgIiYlJ+ahI6onJqViouKfINshYVxgaGMeIWNiIeSmZV8kqSgn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+EamZmY252eGhgY1NbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UD9QTVdTWE9SUWBlZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKONpKigmKmJmZeYk5mTkqCXjoeFe3B9hGh9j4OTmoF3kY2OiXB/ho+TkmyXk3yIkJGjlYOOqpqUkoqFiXmDdoeAboGfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdmt4h2ZqZ2J0dXFuVl5UWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmb2xlaWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko6Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6mXjJGLgIl6gH2KeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXNrcYFtcGhreHNrb1JYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5COinuHcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKskIWQioGKfYCAj3Npj6WEfYaUjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVyc297dHFian5uaGxTVltVYWFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNjI10hnqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY6BjYmElHWCh5JvbIqogIKLlI6JnJ+JjZOro6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cnFvd3hvXWyGbmlnVlpgV1xka2RVYVVeUV9wd3lranZlampqdXxxcnRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW5qKaLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm56Oc5WLiHF0a4J2c4BZcm6GkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZa3FbXmBZXl1mc317c29zY2traXt8cXt3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHVvdWdrZ2RdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrChkKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiIaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iOl4iVi4udl4SDeqyBkJeZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlZufiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiY+BdmuBg3t5mWlyaGBzinB9end2b3d0gV1eb4dobl9fWlxdU2dxVWNbW2FsaHR7fHJucGRramh/e214f3Fpb3BsZoF7coGAd4B9f4R6bYKMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNno2Fn5yKnpZ8eZSCe46ZiYaEhIZteIGAcoCHfoiThG1rfnmXhoSDkH6AhoSGfYeDjZqckoeqnoNyio+FkpKLnZF9jXqpg42Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GSi3d9iI6FpXt8j5CRhpiqoZ2TnI+Nqo6SgJ6MiZOanoKOl36HjoJveIVxdGB/g4+GdIuXgIOPgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qKinaFh4iLfG5rfX97bWhrbGdeeX5nfHt2dHV1e3dcYHB9bnVgY1pcXlFmbVNlWl1ha2l2eX5wa2xka2lngIBsc4BsbHRveG6EeW6GgHaCgH2FdnGCjYh+e3p8f3uCimBpe2t1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXt/eHKAhX2KkHxraHyAl4iBiI58foaEh3yPgY+am5GIp5x/cIuKi5KHoKGKhYx8p5GHj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIKbkYmSl5t+kpJ+h46BdXSCcHZgfYCNhXGKlXyIjHKNfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4V1goOIiHplcXp/eXpwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9xa313hnpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmJ1entxYmpveomNn7KSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N8hZeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqabh4yJg6WVhJKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5ScepCGg3iFl42efoGKjoxzl6KeoZKYjo+ijIyDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIOCdnuBiYV1YHd3fXR9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBjamNtZmh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGoJOXmHx3qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefIqVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqnj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SOj4pshpiQmXqHiJCJb5edmqOTlYqNn4yGgpKcf5KSlYaZiHuKiYF6cXlqdWx7fot+bYWRgpR3cIKDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9gHN0gIeDbWF6dHpxfG9hbmNke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2plamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpImNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JvipqFZ4aaj5R6iYWQinCWmpShkpKIi5mMgoCRnnySj5KLmY57ioSHdHN1a3FudXyLdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wb4CFg2Nod3N1cHpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGZiZ3GObmRpZ2VqaIB6d3RujoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ6Kj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnpGQiImVjn9+j5d8kY2PjZqSfIp/gm92b2ttb3B7hWlzg46XinF3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwiXyHjXuLh4SJj5yjiHyEd4KLgHh4bmqAgoBdcnJxcHB4Wl5xYW9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJda21kYmZrkm1gZ2ZfaGuBdXJycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoOMkqSak46JlZiShIaWmYyTi4mPj4iehZCKfHOLhYiPiJyZn5uWlICUf2mGnYhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoF3g4x8eWd0bHSHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGlrgYJ4X3dvbWtxclVecGJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOXGVkXXhwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV3ZnJqg2CHfm9va3pgam10f3RfdH14hnh0c4V8eaGQmrGcpo6Din+DmoiAi55/ipmTjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkneUkJibj5h7k3KGkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoipKIbImkhZKIl4OGY4yRmI6UipaMjYqLcXuUiXuOiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen5+f4aOenpoc2tzio+JgYWFfZaMbH5/b4GNf42IfoR7g5CWmpuLfHd4g5B5c21mcH+DbGh0b2doc2xTXm9lcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdWVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eKjH6LpIWSiZ2FhV6LlJeKjomOi4qEiWx7l4J9iIWJkI+GdoV9fWt9Y3h1aW14c1eIepGGhXp+f4CFjH55ZXNqf4mOiYKDgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmFzbG9haHVmUmBxZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXd3fIhxg4R9foh7dIuIiJaGjH5+l3JndXF5bYx7b3RwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSFoY2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcYaJoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYV8gIOAhIqCdmJ0bIiBj4qCfoCTkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscWtyeIBfcmhuXGp1YFFlcmlmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKho+Ygo2Ce5J0a3d1eXmTdW94en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F5cnNub2RyfmlmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGemiIi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+CZn2RgH5/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH91bW5qa3p9YmdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlnyJhnaJgW94eXuEk29ufIF3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiY+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXKBfWZ+i3t5fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94goCFg39rXnJ4en2NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuaGd8dmNbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpF4g4p0gYhyeXh+jZBvbnyBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSLhJmRjIVubIaTkXp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYacmZSLk5CVhYdwe5KCfYKDiYNugXdogIV4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop8dniAhHmBa1xxfnKBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36EgHd6ZWhqfHBfWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoN/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGh6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYKViHyCeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHR2hHqHnZGMkJKTjIqGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgXBbbX91eYuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1pwZExbcnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgI2ThXCAi253foB7e4iSiX9oe35qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFsc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn51f4F9jJmIgpSSmYiKhIl8j4hwe32Ee2h+bGqAe3ppenaCh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG+Ad3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm5qboKCdW5dZ2VzcVFaek5cb1xPXHNwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t2jHlrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnoF/f46PfXJ/c4R5gJKRg3iWjpWOh4KIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qa3Rne4BpdoCLkJR+en1+cHt2e3R+YlZ3fnNzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWhicm5KZHVMXm5VVFpzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4d7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHR+d4BwcX9thHSUhXh0a2B6gnmIj2Zxg29ndm5bbX2AkJR/gXmSk355e2yHdoGRjIR0loqRjYaFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjo2Ve3SAdXF/enxtf1lWdH5wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqX3VkSG5uTFphV1ZWeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnWDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV7amx1Y4R1koF2b2ZefYJ6i4llcoJranFjWG16hpuIgoJ0mJV4f3xtiHGCioyIcpiOkIeEi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGaBdmd0h4uOlXxxh2pufYF5bnxdWHJ/bXSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmtaX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6AcmliXn94eYuEZnF+aGprWlZvd4qjgYR/cpuUcoF5dIJugYKSiHSViIyHg4iFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWNhpZ/b4tmanqDdW10YlxvfGt1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxaZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JwhYJ+gX9vZmxnWF1bXFtUZHBkX1dicnVpdW9lZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW5renFiZ2tnhnSNg21mXl99cHuJfmltd2ZpZFVXcm+Np3yEfHaXkXR8c3x6bnx7kYV3mX2HhYKGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2VgbXpnc3iKfH5idoN2amtxdHtxenl0fWZ+f395d25kZmJuhnxta1ZqYnBTS2lqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn90dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8e3WDgox6b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXJ6aWhsaF9iV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4NmZVhid2l+h3tvaW9nZl1VWG9oj6l3gXp8kI55dXB/cHJ1eY5/eJV1hoJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9yY3FpXHB4ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0tsaE9HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFZubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygnp2gX+BdW6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl50gWlebWtcYVZcXGyBZXF0fWlpXGt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KAYmJUZXBngoV3d2ZoamBXVllnY4+ob353gIuOenBxfmh4b3mMe3ePcoR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLc2NQR1ZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcoh6dH18dnJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1ccoRoWG9tWl5XWlxse2Jwd3ZtYlpsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaReV5dUmZma4OCdH1iY2lcVFhdYmOQpWh4dIKFkHhtb3poeG17hHt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3FicXGCfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNxbVpaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGt6bW9we3x8cYF3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1JQWVJIY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPbm1cVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvVFtma2ZxdIF3c2NsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZXxwZnpzeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmlsX1RWU29nc2xmeGRkXFhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiZmZmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkY+Pj5CPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLi4aOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDo2ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5Ok4/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTtGeV87PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DREQ/Pj09QElIQ1h5b0M+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRU5AOkBlfn54cndvPjk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNe2ZAa4eEhIOCenA/OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1V1eXGBgYKCfISAckI9PT89PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXV0gX98g4N8hYVoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBMc3N/f32DhYaGh18+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4GDhIWGh4eJhEtERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1h0goSGhIKFiIiNY0BCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSluEhoeDgYOGiIl9V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZYeHhoGDhYCBgoOEhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aDgIOEgIGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdoV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUiCg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88V4aDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWOIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUU1LTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSkNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QUEhLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTUxOTVBNTk5NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lHSFBLREpNTFBOT05PT05KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIRENERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNGQkNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURHQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExNS0tISUNFQUVDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkNCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2RlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bXFxbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVlcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1pYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWl5WV1pbW1taW1lbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNWVFhcXF9gYF1hXVdgXlteXFteWFZYWFtbX2BcX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmJhXWBYY2RiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8ent9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7en15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKFhIODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCAjYyBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKBgIOWloOAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKEhIJ/fX18h5qYhoSChIKBf4CCgYKCgYKEgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYODi4iFfnx8fX5/mZqGhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaakYZ8gn+Cin6QmoOBgoGBgoKBgIKCgoKBgoODgoGBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hZ2ehYOLgICFgIGJgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICCmaGHhIWIh39/foGEg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKQnIOAgIGBfn59fYSFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aLgYB/g4uBfX18g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCf3+Fh4SBf36BhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/goWCgoSCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CEhIOBgYGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KBg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgYKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhYSEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYSGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0tTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/O0dXU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR062Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrcuauriZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp68ooyAjcWemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrKCIrNa6maGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUorGorZumspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJrBop2Vp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCexKe0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qombDO2sGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCnkaGfoJmolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeet6Sro57DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmnj4+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1b+/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMjJx8XJx8jHv8XHxMTHyMrTz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwsnBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvHvdTTx8jNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxM2/kMvGxcTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbizrrq7tr/Rn4jAzru/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBQEM9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK23trjEy4yFm8i9u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube5uLC6tLm8ybqDhYa1xL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7mxvb67xLa4pYeAi3uOnMWjfIOFscvGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6OwuMnTtrq+vMa0onhlcmVVYGaHjX2Hh6rOztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs7/LyNu+vb28gWp2YGd2XldWXHOAiYuozMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLXGkHHB08C0fVtMb2FQfH91YlZgfoaRqcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru70pdyg7XCm1hUVo1iUmSAhIVtSXKGl7TCvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz5DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wteYf3KLrnZST2yZWlJVWpqUd0xujqK0uLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucPVnYl9eJVgTmqNdV1RXWy6tXVUV4+4tbKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAyp+JgX2AWFiSj2dxYHdyepd3bmtfi72zsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucWrlYmMeExmoMN9hpuQXX95bHV5ibG6tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO7t5aToIpNaJKTdm95cmhpa3aBd3ilvLiytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsremnaiTWIBwc21ka19ZV1hbYl9sgZu5sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmwwLGzfHh2cnRlV1ZPSUlLTk9PXGtwprWqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamhpsfEpmFmaXJgUk9KcFVWSk9KTFReXYG3r6+ztaqnrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnpy7vH1vaWphVEpXcJyLellMRkdOVFRorrKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk9PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueqauWfWtdVE1NXJ3Ey6lvWUxFQ0dNYZiwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGjim9fVVJRVWnA49K0nYdvWUpFVJGYnauqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQ0ZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjondZUlFUVmiDwMyzmLHIsJSKmLnFoqmtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQSD9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoZ1oUEtQUWmBnLW6p4ez4NvW29rItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVXUxHTlh+k8C4pJCY1eTb0cS0pp+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0dLVztPJvcC/w7vGxcjF0tTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmFKSk5mirrX07+vwNTLua6oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTW2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKR1XWdtjbzY3NrWy7qyqqOdnZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6Osin+Ts9LV2trPvK6om5WYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czRzdTX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGlnICUlsfY09bCraahmJWXmZudoJ6ZnZ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp39sgZTT1s2wm5uWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKpob32n2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWiX294udCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKykV9ygL6wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4NjdY+1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL66uMm2qrCBa3KZnI2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKvr+8wLqytLTDrqmuhmtkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWlxkbm9oZ2dpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqvo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbK0qL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DEt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0tbu1sK60u62op4hgbY2DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+lpaelraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGoq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S4tL7Aq7W7saukrrKsn6GLYYCHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypaapuK2ipqafqKyrmZ+gnpmdn6WamqOcm52vqaunqqusrbGyuK+4ubuwtry8uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadhWaChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyjoqidm52lpqKmnKCgm5iurq2usqCloq6sp6K1sbKyrKivsqe6s6a1oKKem6OiraOiqrWqoqOmnaamo5aZnpeZmp2gmpeenJybrKGrp6Okpq2rs7SqtbCzq7K5tK+pr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6RmnppgYOEf3hvcXRxaWZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoZ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqets7Clq66ysbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrry7tbu8tbi5r6+vp5uYn6eSj4pyeoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZqgZaTlYySlJSbmZ2Xl5ygnKCWoaCmpaSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu6tbKrq6WYl52hiodxe4d+dm5jYWZpaGZnamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtaWVpbV1VYV1RUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlZaXpJmgl5ygpaKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKKkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHkJGPmpOVk5ybo5yboKipq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CsqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tqyrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhJOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc2MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpuNkH52hXh7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4SSeoiNiop2cX1udHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5aXmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAhYuGdW91bHBsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFVUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCdIeMhXlwc3Fub2RwZl9URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWChGyViId7dXh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKS0VLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXI9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4FzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhloqOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+Lm5uknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Jf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIaEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYKAiYyKhJKFgoaIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhoiFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqatrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BemlWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5mfrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7y8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWFcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpZ+fmpmDpJ2spKqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Iz7Sku7C1sJusub2afnhrXF9cWV1hWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5WWh56Zppusr6ivp7O01NTV1tLLz9PVztPPzcXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltcXVhgV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxWX1JdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjHzc/IwsvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XU1lSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVZFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlYyGe5uIk4+uq5SVl56Ypq62vaitvcbLyMnLy8/JxNLK1NbY19jX1NvX09nb1tDb2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19TVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYuUkZ2Rgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk7Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Vm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmeo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKNkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE9FQz48Q0FCOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLStq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKics6WkqZSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJKPiJegmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSERMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gtq6yXh5qpp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu7/CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8K3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1tK6ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK7uK6ouLq9uIJrbVlWVFRNRUpTTks/QkhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5Wlra6upYuTlaGNdMGafpeZhY+WmoyxlZualZOTmpmlo5Wgm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKytsbGjobKytKRvbGVbWU5PS0VPUFBRO0hKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqKatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoamfqKCZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJytqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqoraywoqOYqrS7pammrKqdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wkk6+rmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56co6Wal5WZqqGedl5bX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylm5Wxp5mvp5+aqZ6gjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGloKqtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqppOYtaOfsqGgm66Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORkVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaMmLObo66anputkJ6TlpOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq+ysqerpqGem5qblpion6CYop6vsqKmjJeumKSrl5mepJGbjZOWmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurpp6YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6OwsbSrsqirn5ugoJuepZ2il52js7Can4+TpZqgqZqUop6VmImTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKqjsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sts56rorCws6uptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqWpoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+oo56VoZmbqLWpl5mRkp6ZnqCekKuel5eFlJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpuSf5KXjJ2cmpaQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpaCdlIKRlY+cnJiWlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLOytay0raqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqZlZOHl5KVmaebn56MkpGOkHd+jYV9fHyHiYhwc3F+fX1cU2RvXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sLKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvrfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0rqqwrq2xsLSttLukt7KrrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6qotqqmrq+qua+osbGvsq22qre3prO1q6ykqauco56zs6iopLS0oLatoKqoq6msp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dxeFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCxrritobavycfI0cC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zsrmwo622sbCzuqu5r6mttauqnqmsn6Kgta2ooZ+vsqK0qp6op6qkqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2OioeUiH2NhoSEpJaEgYKKho2MkIODk6CWh5CckJKQjZGclJePioaFeHSBf3x1eHmAe3RzemiAhqN1aV5la4F1Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6i5qqausMnHydHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeqpKmdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSnKGlnZiXqaiSmJqTkIqCj4V+j4J/iJ6PhX59i4aQjY+Ef5Kak4WToYyTkYuRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj06RFg/Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKWwprCgn6upqKKqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWl5Sfopabl6ari56RkJGMgoqAgI+Ae5qVjYh7fouFjo2LioORl5CGlKOJkZGHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1dlTyk7Mk9ZPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOun7ivq6i0u8jLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmfrKipnqCqr6ehppijqKCwuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpmTmZ6TmZahqZCaiY6Qhn2Hf4KOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJCVgouXjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbazrqC3rK6tsLXGyMG3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImLj4R6hX6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsxYFQsMpajoZeVnKmdpaGjobeqr6C6uaasvcWzsK+jta+srq+0xMS9s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio6FeYR8hYV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqX2hiaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enqS1rKequreorMPBt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At668vLGln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqelkZmmraKZnqSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSOlJiMj5iap5+RiImKiHiFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrY2dkY3R/YWRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkE6M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2tpp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWgmaWjqZ2aoJyUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY97gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoY2Fyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGmtq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6qKmftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WWmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGI8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppycp6eek5+gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrq9t8C+qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+fqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSql5SinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6op5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCraeln6OkqrG3rbS9vrC3xbK4usKnqbCsr6mpsa6ksLqwpKSus6Opuames7Owo6Wgqq2wrK+mp5+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WkprOzp6Oinaeqsqiwp6WeoJ+wl6CalZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygo6WjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrK+kmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmdgRU9rX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1iZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5uRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmlmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7KkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Ouu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoKiroJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/ppazw7Ssqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpdmolhZIeOlWtggJVjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKywtKy1o76xsqego6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6mknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhZiVjoqMmJeHlJWKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Plq2Pe5WbgpKBiamohYCYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLGgrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZicoJ2Hpqukq62/wLGhqq6qlpKfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ6lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFxxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLkowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKsraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnJyil6Cpqp+VoZ6dna6vp6qom6amo6Cqkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBFRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPCg9MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZucopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqhlJyfpquroq2Zq6ihoamis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ+VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGYm6aioKqnrqGjp6mwtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWchJ6DrH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1j5Gjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnZumpKGir62dpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iZraGspKWXr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT9AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoJ+dpaOcp5y1mqCqo7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ynvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioCkpYicbbJvoIetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiJOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZgpOLlYp5eYKWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6wrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5moq6uio56pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnqybla6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIublqGgmpCRmpuRmZennqGYqK2mpKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZKmm5OPkZiYj5iTqJmfmKmon6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppiOkZCYlI2XlaeUnpeoopqvpp2irLmfsMGopLOmrLGyq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiXmBlIybk4qVkZSQjZGWoYydnqienrejf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm55f2twZV92b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrigoI+cpJ2RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmZuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRqeHtxcGdkd21pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNlImGgJGojoeinKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rsIekjaqajJp+o3aAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpeeoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlZCGi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6Uo5+gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8k6SgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF3kY2OiXB/ho+SkmyXk3yIkJGjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UorOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/i5KHhpOPfXuBhJekjX+lpY2AjYmElHWDh5JvbIqogIKLk42InJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyPiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Pc5WLiHF0a4J2c39Zcm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoF7coGAd4B9f4R7bYKMhnx6eHx+eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnpZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1sfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8j5CRhpipoZyTnI+Nqo6SgJ6NiZOan4OPl3+HjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l2eX5wa2xja2pngIBrcoBsa3RveG6EeW6GgHaCgH2FdnKCjYh+e3p8f3uCimBpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXmNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+ampGIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXt7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHx1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCUlpWNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjoxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2c3N0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF5bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmJB4e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpOWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2Fub3Zyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZmxoamxngHx6d2+Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId317inx7gHZ3f4BwdHN6b4V9gYCJfXthXH6PkYZ/g4RzeoCGeo+Rh5GRnJKkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2SkJOMmY97iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGp6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZl1paGZiZ3GNbmRpZ2VpaIB6d3VvjoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3R7doR3eH9yc3uFa3JveW2JdoCAhm1wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoGaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHpwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8Y4Z8b3BsdGpob2x2d19xfnl7dHV0f4J/pZWarZ+nloWNg3+XlYOPnnWKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9sbVVRgauUh4J4gHZygnmCoIGRgZOSmJuRmniReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQe46MjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZlXXhwiHxfXGhyYmJlZpFpX2hkW2dwfm9rcXOKfXZ9hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW50f3RfdH14hnh0coV8eaGQmrGcpo6Din+DmoiAi55+ipmSjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZOIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYp6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYp0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn96iX9yiYeBkYqIfH6YdmVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmchoSfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH6LpIWSiZ2FhV6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6OgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn36IYX+Th4SHg4mNf3+CZn2RgH5/goyPkH9tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi459aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fpSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYdwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxfnOBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBf4N/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnV/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGd6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3dviIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGfnuShnd/hIyDa39yaIB+eG18fIKKhHdieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphwcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5dZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5deGhVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGtrWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tmanqDdW10YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6Jfm1uVmpfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYV3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbntnc3iKfH5idoN2amtxdXtxenp0fWZ+f395d25kZmJuhXxtalZpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx4Y3OAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx8a2tVaGFlU0prZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB6aGthb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JthXt9fXl1cmx5aGl4Zl1lc2h6d5KBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUlXZVFIYnhaXV9sW15cYWRef2lqX250eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbaHVmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3FicXGCfHNncoBlXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWldpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXlNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWVJIY3RiYEZValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaFNURlpcT0hydFhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIF3c2NsdlVicmtaX29mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNQSGRzX2FFWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ej25hZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybYh7f3acenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo5xYmdqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkZCPkJCPj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipCLi5CJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiIWJi4aIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhoeHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiOiISGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTo3Ojw8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5O0s7OTo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgYCBgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTpNelI6PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz49QEhHQF56aT0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpLS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFREg/O0BjfHt1c3hsOTk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBFc2I/a4WEhISBeWw7OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP010em2AgIOBe4N+cEA9PT8+PT5DRD88PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhtb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VATnN1gH57g4N8hIRoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBJcnN/fn2EhYWFhl0+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARURmdoCEhYWFh4eJgkpERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1l5goWHhIGGiYmMYUBCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGCEh4iDgYOHiIl7V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZIeHhYGDhYCBgYOEhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aCf4ODgYGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdYV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUeBg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSkxMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88VoaDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWSIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVRwdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4CAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9MSk1MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTktMTUxMTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zb3V0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKSktJSUxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFudnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZJR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMR0ZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eHhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRURUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUhISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NPUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlN0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFRS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUUEtPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXUlNTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VXVltbV1BTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGRgYWBhY2VfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmllZ15dZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWlNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVlYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taW1lbWVleX2BgZGNkZWViZFphZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVlVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlNWVFhdXF9gYF1hXVdgXlteXFteWFZYWFtbX2BbXlhYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBkZF9SWFlQWFZYWFhXVldWXV5eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZWdnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YV1lbWllXWllgXmFiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxmaGhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2RhY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlX2ZnaWhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6ent4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdyc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e316e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhoWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWIh4eHhoaIh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoOEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgoGBj4iBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYOCgISZkYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIJ/fn19iJuVhYSChIKBf4CCgYKCgYKEg4GBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYOCiYiFfnx8fX6BmpiEhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gIOXkYZ9gX6CiX6SmIKCgoGBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/g5uehYSKf4CEf4KJgoGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBmKKHhYSJhn5+foGDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSAgIGBfX19fYWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aOgoB/hYyBfX19g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OBf4CGhoOAf3+BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/g4aDgoOCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISCgIGFhIOBgoGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgoKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+f4B/fX9+fX6AgoODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqIi4mFiJGOi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIOBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fH19fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhIWEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGgoSEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWChIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB9fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KDh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhoaIhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeHh4iGhoSGhYOEg4ODg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeHh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4aGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhYWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNXAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImpzOo6CLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZu5qHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoL6ZkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJu+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZChrKCarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qom6CapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp+vnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbLkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkBCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4bnlqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3NiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvIu7rIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxMjGx8nDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1paWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq8tsfUucu+wbu/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbfTwJjUu7+8u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLe7vcHEube3trW5ubm60rSMuMPCwr7Ht7m4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wuLuyvb67xLa1uLa4wMDFu82ohJXCy8nGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Oxub2+srq+vMW4sbi4tsO5v8PEn4SLucrMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzCvc3EvbvEv7mxlYqOeoiVrZeFjK7GycjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vMbI28K1v7ywjGpxcVhiZniJio2owcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru8vbrSssHJtrSSdHloYn5pW1pccIqPqbvBvb7GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC30LamxraOZ1Jubk9zi393Xll+krG5t7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/tsm0lrGhZ1hVi3BTXXqCh4BNaJi1trKyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbvGspOehVhTZ5xmUldXkql+WFqnw7mzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ure7z7mYk3JSZY58ZlRibaW9hmNTdp67trG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO1uce+oJJkUouZcnp5i3KCknVwdW2iwbiztLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrLAvqycVl6UxJWBmJJmdXV2gH59r7+4sayzr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqnvcm1pFZkhZN+aXRsZ2Nma3VxcJCus7OqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqulqbGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHTlJOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamin7TPwKxdeHV4dGRpWVBPU1JXV2B3hqm1rq+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp6pzc2Zb3p2dGNTTVRIUElQTUxVZGeItbCwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVExTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopuepMqwaGprc2JSU1WFdWpTT0pKUVZZY6evrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGsmHhua2BUTFh6qrCgbFJIRUdMUVaNq6qqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby2vbOztaKsoqmosqmrqKeompmemqqnn5mnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoJ+IbWBVUFFbot3gw41wW0tEQERhlrCtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sqyisKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Uc2JXU1RZbbPcxrCrrIxtVVuBrLCmo6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7q6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXlxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZudiV9TUVVZboe1xbOUntjKrKOwrKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb6/vrW+s62/v8LDx8THxK6+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHh0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5ydm3xTSk9SZ4OitrKlia3Mu7Gso56cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydHZoY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoaVxTkVNVXeTxcqunKOxqaKcnZygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0snP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8XJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZvY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6GseE1JTl6Et9vVuK2qmpSXn5uboKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdLLztDAxsLHxc7N0dHRyMvNwMrMxdPOzM7IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKKjs4tbZW2Jt9fGr6afl5WXmZqdoJyZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3Oy87Ox8vQ0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dW9wbmthZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2po7ObeIqnztSzm5uVk5ebnp6enJSWmJWIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz8zIx8vExsHFyszNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBya21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKujiI2SuNSslI2NmJWQlJKRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfM0MTFx7vHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO1kmiAiMSukI2Ol4+Gg4SEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsW8vMDDxczFxbvAysLFx9LEwMi/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvuYJifo+2j4qSl4d6gIWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/tbW9v7vMw7y1usi6v77Lw8HFwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rrK5vZXaPk4uIioV5gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tL2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29v72xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL65uMm2qq+jZWl1jI+GiIl7eH6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK62sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4va+wp7KztLu8q621pq61r7uysKm5sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvsC8wbqytLXEr6qvm2Fsf5GIjo97eH6Khnp7hIF3bl5dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6mut7S0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqWot6yxsre6uruyvL2/vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w765yrfBw8G0try2sa+1vK6oqZdlb4iDiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+lpaelraCdm6SmrLKvtrensKuoqrSqtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S3s7/ArLa8sqylr7StoKKUbHiFhoaBfHl1c29ta2ppcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqayspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6y6urGinqmrp5edkHF/hYZ/eHJucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgmpiurq2usqCloq2rp6G1sbKyrKivsqe6s6a1oKKem6OiraOiqbWqoqOmnaamo5aYnpeZmp2gmpednJybrKGrp6Okpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqtsrWvn5qjqqGSmY15f4OEf3hvcXRxaGZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn56pnJqaq6evsKqbo6S4qaCfrqi2qqanrbCkt7Ckt6Cim5mZqqagmqy4sKKhpJyin5+TlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tbu8tbm5sLCxqpyZoamVkImMgYB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCmpaSmp5+cn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhoZStsbGfoqOdnpibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu7trOtraiZmJ+ji4hziYh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl5ygpaGtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9xMmssbjCtbzBvLS1q6ymlZmbm4d/coiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHkJGPmZOVk5ybo5yboKipq6isp6ilo5ikrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmprZqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJujlZuho6GXoaijoqiroKuvo623paOjoqytqqirr7K3sr21s6uvmIRzc2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8PIsay4v7e8vru0t6eqoJaWmJWFeXSAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivo6ian6yhlZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cXJiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba3vL7Bw7GwsrittLS7tLalpJ2cl5aSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52nmaClm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXnJGRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmYyZpKaopqGftLKosrehnKK3rKqtpLKypbW8taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsub20t8CvramxnqauurCwoZubnZWThnqCbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZaim5WNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+inpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqCho6OborSvrK+sn5iluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4r7SwycS3ucHOxb6zrLrBq63Draiip5KdpreupaKQlpeTj313fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjZyXi5SQn5idlZSWlI6WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOWjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZmDlJyxpJ2aiJSQjId8c3VdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiFlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpaOf4qUqZeYjX+OhIR9d3FuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3uBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpyPlIF4iHp9d3BwaVhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeomPjI14cn9vdnFsbmtYS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OSkNITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6q7wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAho2IdnB2bXFtZmxrWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dWp5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIRkJBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaOlJmLjYV5hJCYlI2QjI+GcYeCdIeNiHtxc3FvcGZxZ19URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqCVc3iAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdW5jdoN+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltaqusa7BsrvBxpaPjJSQgIh9boGQkomDioePhXWChGyViIl8dXh4bXdud2RpXklQRz5ANzQ0ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwc3p3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CBfnpodmtSV0xARTIxMTI2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3F5dmhta192fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4l+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYaEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gYl6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGZ4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6GgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiaiZKKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hHaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqq2orrW7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hoiFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiqiX6Be2pWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWnpifrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRTUVBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvbnU0M/Xz8nM0szPzsrHv7/Cyr3BvcLAxcTFyr/Iz7Sku7C1sJusub2afnhrXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pOm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5SWh56Zppusr6ivp7O01NTU1tHLz9PVztPPzMXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltbXVdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuQnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PjU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8fHZ8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjIzc/HwcvQ09HU087TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE1Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVVFRkpJRUU9Ojc5QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRWT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlIyFe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/IxNLK1NbY19jX1NvX09nb1s/b2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWIiIGFkJGenJmJhYuBhZd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19SVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuPkI5bg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjooaTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuoYOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6ShiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrWdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJieo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKOkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE5FQz48Q0FBOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLOsq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSofoiGnK29sIKMjIuQg4+DkY96gYeQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQktARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSENMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB7jX94h4KBkHqNoZaompqYur3HyMnB0snKwsy8wbKtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu77CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8G3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZR9iJGZkKqZmJOTj5KVk6Wdk52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK6uK6ot7q9uIJrbVlWVFRNRUpTTks/QUhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4Kcg4OVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5alra6upYuTlaGNdMGafZaZhY+WmoyxlZualZKTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGVbWU5PS0VPUFBRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZKFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqaatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaIm5imm3a/n4SZnY6TmZqLr5ehnJuWlZufoamfp6CZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfuq+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsHGyMXCzcjBvbmyr7i0wMLKtcWxwby0uqqoraywoqOYqrS7paimq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6KYkaKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52lnKiqnpmVj5SbipaJjKSilJ2inqC0r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl5bX11KSEVGTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8DCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKkqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaylm5Wxp5mupp6ZqZ2fjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCTo5+WpZ+mqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGkn6mtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaGdpJirq6ymoZmNmp+SnomOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKOframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrJussJypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaeekqGelJ6PkI2VnZqinqezpqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtb/EvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Grqpefppetu7Sbp7CbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKuhl5eSpqWiopiYpa+4rrK1tqCfqKSZlZWTpKC3oqSllq+xsqeqpqGem5qalpeon5+YoZ6vsqKmjJeumKSql5mepJCajZOXmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKawnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJudpZyhl52js7Can4+TpZqfqJqUop2Ul4mTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBv7+4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sss56rorCws6uptbS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqSpn6SXkJmfs6qzqqqzmp2nm5qVjqCmpLSup6Gsra6xp7OtsaqknJ+oo56VoZmbqLWpl5mRkp6ZnZ+dkKqdlpeElJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G2vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6uqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZWamrKjraCmr5ehpJqako6ipaeyqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpqSf5KXjJ2cmZWQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbiyqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJSbmZWxnqecoKqOqaOem5aYpqWlt6eisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpZ+dlIKRlY+cm5eVlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5CZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsC7w7eysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynKCnsK2mpa+lnbK1rKuxsa2pqLS6rLSytay0rKqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvo6mcnpybr5mjo6Kjkayeo6CgoqqlprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqYlJOHl5KVmaebn56MkpGOkHZ+jYV9fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrb3Muq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6a2sbKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSirqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6mwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesq6qtoaimprGypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6uotqqmra+qua+osbGvsq22qre3prS3q6ykqaqco56zs6iopLS0oLatoKqoq6irp6Crq6i5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dweFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCwrritobavycfI0MC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zs7mwo622sbCzuqu5r6mttqyqnqmsn6Kgta2noZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOioqOnmJqppZiXmZ2OioeUh32NhoSEpJaEgYKKho2MkIODk6CWh5CckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqN1aV5la4F0Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjM4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6e5qqausMnHyNHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqepo6mdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSm6GknZiXqaiSmJqTkIqCj4V+joJ/iJ6PhX59i4aQjY+Ef5Kak4WToYyUkouRmpGVhol+gHJ7eX18aHd8enRwcHxnhHiEiGRhZ2NxhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj06RFc+Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjua2oqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKSwprCgn6upp6Kqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWlpSfoZabl6ari56RkJGLgoqAf46Ae5qVjYh7fouFjo2LioORl5CGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7e3FwcHJ3Z39zaoNnZGdgbXOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy8zJiw6JDQxQmhZMTNTPWVfREw2S1ZkTyk7Mk9YPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmerKipnqCqrqegppijqJ+wuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpiTmJ6TmZahqZCZiY6Phn2HfoKOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJGVgouXjJF8hXtzcH1xc3RgeXhpbnBwbmh9cWN6bGllY19lhX9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFdaUmdPSExFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNioqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9YVzUol52mmZ2WraCgoaSht6uxpLO0qqi5xLWzrp+3rK6tsLXGyMC3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGWm6+moZ6ip6+hoKKTpKSit6+hprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5ScjpOXo6ihkIiLj4V6hH6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2logm1lcmprZGhbYnN/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVENUXWhFLjsxX1MsMpajoZeVnKmdpaGjobeqr6C6uaasvcSzsK+itK+srq+0xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpSWmo2Tk6OnpI+Iio6FeYR8hIV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhnaWdlboRnaGhkZmhqX2diaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGJOJzKepKOSjqSmnJ6enqS1rKequreorMPAt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At667u7Gln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqekkZmmraKZnaSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSNlJeMj5iap5+RiIqKh3iFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrYmdkY3R/YmRlZmVpamNocFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BkRyU1m6SgkYyuoJmYoJaltLGisb63obHGu7mwsaK2q6uuqbi9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2spp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaSjqZyan5yUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY57gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKvn7jAtqC0wbu9ubGltq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6p6mftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WVmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl1fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8K4vb2tp7awpqukt7Sys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppybp6edkp6gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOIhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+eqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSplpOinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6lk4Gnqp+XnZ2lrbKpscK9srW/tbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6np5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSoZWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa6ksLqvpKSus6Opuames7Owo6Wgqq2wrK+mqJ+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+7qqGnta2jq7WkprOzp6OhnaeqsqiwqKWeoJ+wl6CalZWXmZ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW2OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyhmyXh19TtbTIhoCJfGOkM0Kddl1RaWhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCjnp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+j5+kfrB2g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB2c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi6inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W0tKKysqOgrK+kmKa6rqSxsJy0uKmgpZ2hqqWxqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKSnoJWbpqeimqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXWhgRU9rX3FtVlVNL2VjaVNZUTtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3n52UoLiwmLPBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mfn6ihtaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6GcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qbu1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLmio6uhl5uRoqCVlJ6blJmgoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZuZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7OkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivtsSxurKuu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoairoJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolynsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoKG/pZazwrSsqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKWtqqa1qKifm5ago56spL6moaqYlZyRopuSj6GooZOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6RgnGUhV9yalpdmolhZIeOlWtgf5VjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xc3l9fGJbd3SBaFBcboN8e4pqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqkm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6iknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqampCWgmhufHF2kJeUkYSKtKmNhZiVjoqMmJeHk5WKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop6eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Olq2Pe5SbgpGBiqmohYCYloqEjp+Ie4OQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroSJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rautsbKgqqayraKss7DFsKqso7KvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzx7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iMbGhqepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLCfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWdhq1od7nEuHGSoaN7ppiZc6qCfMvAwLtxiqKHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msravqqamprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGfoZiboJ2Hpqukq62/wLGhqq6ql5KfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYF5lZabX62PXY6ngKGgfKeVm3SrgoCvXmSMqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKtraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qom6amo6Cqkqyzlqaiqqqeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1NcYFpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCc9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Oira62r6mxp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKoq66mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCHoJqHpF9gUquEf66Cm3WugaaGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqjn4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpqCbpZ+dpaempJysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquroq2Zq6ihoamisq2iqrKyoZuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkiIegepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOCoI6Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKarrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGZnKejoKqnrqGjp6mvtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esoLG4sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV0jpGjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWvrq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnpynpaGir62dpKiitbHDsa2qraqRhpGcp52jpJ2ll56YmZmlo6iZraGspKWXrqW7rKG3t66dnrazubGzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnIiTkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2Jzsrhod4+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqSdp5y1mqCqo7WrwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ymvayUvbCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoIetfKGPg6iWmYCsiISuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4nZ+OiJOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2UkKaZgpOLlYp5eYKWf2psfmJ9dG5/eV9mZXFuZ2doQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5mnqquio56pqL6kl8OsqqOiq7O6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzf3xgaWZwbWZlZU9VY1xBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBgYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnayblK6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIualqGgmpCRmpuRmZennqCYp6ympKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6trqWnlJSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqJmfl6ion6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eGRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOpurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspY2WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppeNkZCYlI2XlaeUnpenopqvpp2irLmfsMGopLOmrLGxq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHlpa2Rkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq6isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRl6yji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCMe4GUjKGUipSRlZCPk5elj56ZqJ6btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+aW5kX3BpYFtfWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiHmBk4ybk4qVkZSQjZGWoYydnaednrijf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm54fmpwZV91b2traFxlY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrifoI+co52RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGXo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmJuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjY+Si4NucY+IeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRreHpwcGdkd21pbGpbZGppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNk4mGgJGojoeinKOTl56Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkuLGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZmYhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rr4ekjaqajJp+onWAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipipmJmakoelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwcpKHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKekno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpacoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXmjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlY+Gi52RnJuJj6iioJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6ToZ6gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJMf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV5iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTXqGntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYUlXSVRfV1NbZWpbZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF4kY2OiXB/ho+SkmyXk3yJkZKjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHGehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUU9sXmhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5Zyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCDdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3WJfZB7ZYOHlYqKlZmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R1hnKRg21/i5KHhpOPfXuBhZeljX+lpY2AjYmElHWDh5JvbIqogIKLlI6JnJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYJ9e25/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450c4RwlYV7fZKLhoaQhXh+gIaZo4x7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Oc5WLiHF0a4J2c39Ycm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe310fnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gIOKm5+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZlIqenYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHiPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgoiRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoB7coGAd4B9f4R7bYKMhXx6eHx9eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfYiThG1rfnqXhoSDkH6AhoSGfYeDjZudkoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8jpCRhpipoZyTnI+Nqo6SgJ6NiJOan4OPl36GjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l1eX5wa2xja2pngH9rcoBsa3RueG6EeW6GgHaCgH2FdnGCjYd9e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUipiZeHqNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+bm5GIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyMj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHt1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam19Z25wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjYxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB4iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2cnN0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmI94e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpSWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2FubnVyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZWxoaWxngHx6d2+Ph3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXFjh2hxb2V2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpSIdn17inx7gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmY57iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+Bf4GHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGl6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZV1paGZiZ3GNbmRpZ2RpaIB6d3VvjoRzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+imKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3N7doR3eH9yc3uFa3JveW2JdoCAhm5wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0f4J+pZWarZ+nloWNg3+XlYOPnnSKn5OShYqajJWOi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSmJuRmXiReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQeo6LjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbXlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZkXXhwiHxeXGhyYmJlZpFpX2dkWmhwfm9rcXOKfXZ9hYB0dX+MeXuGgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW10f3RfdHx4hnhzcoV8eaGQmrGcpo6Din+DmoiAi51+ipmSjoSIl42OjoR2c3ZzgHBvhXNwcYNvaml2bYJufXxtdHNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZKIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYl6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3B4ZmtqYmZ4c29wY193YGBWa19ddk9NS2BmY115cYp0XFtldWBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdmVzbnxliH9vcGuAWWtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV+fImch4SfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp8amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH2LpIWSiZ2Fhl6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmuBdm6JkoORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhwenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmKnYOEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3CGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4V9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpLZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WCfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J2jpt9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn3+IYX+Th4SHg4mNf3+CZn2Rf35/goyPkH5tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05ITmZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcYCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi499aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18bllbXmxjWmJvd2RmW11gbGljbGlzdoGDcW5+fH90dYN6g4J8gYV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeHp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aXiYjn6AioKVl4l5jpZvenNwbGpkYHN6aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYhwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxf3OBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoJ/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKFZ4eDcGd6loh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGf3uShnd/hI2Da39yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaU1XZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2praXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyAgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoYltiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH5sWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5cZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWVOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ji4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZl9vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJvXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tjUFtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIWDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWDdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmIj2ZyhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfHNndGVui4Rtc1ppXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCa3JXal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpncmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x8i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGprWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p2Wmd9fHhlcn1thHRldYWMhZV/b4tmanqDdW11YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6JfmxtVmlfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pc3VzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYZ3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenl0fWZ+f395d25kZmJuhXxtalVpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3ZmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anNzdG6EgXp/fXV1bnpoanlqX2VuaIF2kIVnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21bbYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx5YnOAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx9a2tVaGFlU0prZ09HUWtFYHhnYU1TcVxKTVRZZWt3emVfbXFpZF1WYFZubldLU2hXZV5YTVVrVEpceV9bX2tdXVtjZWB5aGthb291bm94dXqYfXeAgXqAgIeFenh5g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JshXt9fXl1cmx5aGl4Zl1lcmh6d5OBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dGVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUhXZVBIYnhaXV9sW15cYWNef2lqX250eG5vbnaDl3lygYB8f4iLhX51dYV4h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJuhmx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbZ3RmdnaSel9dUmVma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVx3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3BicXGBfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWlZpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2mFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZm9+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWFFIY3RiYEZValBJUFpVamtrfGVtbnFhW1pYWWxwV1NPZldXaFNURlpcTkhydFhfY21jWGBgYl2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl8h22PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIB2c2NsdlVicmtaXm9mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlOSFdUVm1oZHxpa3drYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmx5dW5vaHZ2f39sg399hpd7f4eBiX5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnlyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybIh7f3acenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNeaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo1wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh455bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhoaGhoWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTk3OTs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5OTk4ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PT9APjxNTDk8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DRERBPj0+QEE/PmpvQj0/Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGREA8PD1ARERFbXlJNjo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAQVhAPlt4fHt5eVM3Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQT9GeFhjhISEg4J7Xzs+PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0p0eICBgoF7g4FoP0FAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFATHN8gHuCg36FhVk+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVKcH1/fYOFhoaHaEFFRURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSE1yf4OEhIKFh4iKVUFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGeAhIaDgISIiYxwTm2Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKU4CFhoKAgoSGh4OAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpdhYWEgIKFgIKCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWCGhIF+gIKEg4KCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCXoSAgICCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOjxqhoGCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+RXqEgYKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QENQgYODhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPjxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERlaDgoOFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCR0dKWYSCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZJSVBggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FER0pMVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GTU9QVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1daWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVU1VUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1TZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZlJRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3p7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9APzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUWFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48Qkc/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTE5OV0tMTktMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSE1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtHSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUZLTUhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9REVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VCRElGQ0ZFQkVHRUVGR0VJTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVtfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01NTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWWltdXltcXmBgYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93SkxMS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJITk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkVGQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0hJTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkNHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KR0hOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0FFQ0hJTUlGQ0ZKTElHRkpNS0ZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFeXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2RjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2FiYWBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RSUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUVRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVWWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcHd5f2NcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1dWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWW1tWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeXGRgYWBhY2RfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVVVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deWldRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVVNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taWllbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNVVFhdXF9gYF1gXVdgXlteXFteWFZYWFtbX19bX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXlxfWVpeXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9fXl9bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYCAgX58fHx8fXyBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4e3d5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGChIGCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SBgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYiRgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKChIKCg4KCi5iHhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChIWEg4F/fnyIm4uDhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCDjYV+fH5/f3+Zj4GCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIOWin2Af4KKf42NgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAgpqNgouCgoOAf4SDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKCmIyEhYeHfX9+gIaFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFhIOSiIGBgIR/f359hYeGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhIaDgYCEjIJ+fX2BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISDg4KAgYWEg4KAfn6Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCDhYOCg4KBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OAgYWEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4KEhIOEg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICBg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIJ/gIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB+fYB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4GBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgYKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/Oz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz8+il8rSxpKr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNeooKugzpmtmrPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3CnJWQobOVhp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbq52fp5m0wMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoMOioIygxdORmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjal8XJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCgtqCUlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonYufr7OdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqOQopqinJyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo4Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqedvp6poKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Nzo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmujpGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1cG91tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc2Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2dna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Nzk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29rb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2trZ2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29vb3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2tra2trb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/Pz9AOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ycnJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2cnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnJ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lSWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mpqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqaop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israahop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoKWorKempaWjo6eklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d3B9eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yjp6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2JsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqWnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclYyHkouYmJWanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkE9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKx8a/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmSiZWRl5WUmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eHp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL63vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWJqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbeyr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL7DwLrEwr7HuLm4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLSysbHysnGz8LBuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysLN2cjLycjMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbG18er1MXEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL66wMrCxtPAlMLDv8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e8trnBurq4uLXEwcTJuYydvLnBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4wLa1wLO1srKqrqa3ua+Lj6+2uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q2ttHAssC3sJ2QjH53io6fjIyltbOyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLnSzLC/rKGAbH1tYGdpeoqOpbezsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v7y+1cWyqYF4fl9sh2pjXmF6kam9trG0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7y/ws29oIBkWoRdVoWKjHxhW5Cvxrm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDo6QD08PDtAPkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6uMjFs4djWWuWXFdkeImLeUqCt8a5sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelraqota/Lx6ZzV12Ej1dWYWaypXZQaLe+trOqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamioK2owsaZYlp/inZlZHp1r6N2Zl93m6+0rq+ztaqnrayjnJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp6lpL3DlVZom5d0i5mJb4x+dX15eqKqs7GwsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopufoaHCyJFRc6W0gISGeGlwcXuDeH+oqbCurqywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ6empqSmZ6coqKfx82PVHaKinNvamBbXVxeZWFujaCqqKqsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmqqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjoMbRk2F8enloYFdMSUtOUE9RXGuDqq+uqaqmoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJibn6Cbn6DEyIdxeHZnVlJSbldXTk1ER2GNrK6mo6OioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxr66tLq6tLu3sLayqrqyrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqGcnqGinpuas51rbHBoVVBcfKaVeVJNZ5SurKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGx8rIzr/I0czHxcfFwbzDwL6+vrW+s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoJ2jn5ydmayVcm1jV05SaLTT06SNpLOupJ+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLNztPMxcfJysHGy8bIyMW/w7OzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKSsmHpmWFNSWHfT17+yr6ednJ2gpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2v8q/0czLz8XJx7/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKrtY9nWlRVVmiTua6kmpWYoJyaoKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/KzdLLzs+/xcLHxc7N0dDRyMvNwMrMxdPOy87IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7QwLzMyba+rqaqqKGksbR/VVBTUmWTraafmJaYmpudoJ2ZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNxMnPzMrLv8m/x8nNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHPz8q9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLGqrK2qpbGpbU1KTliSoJuVlJecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBwaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1sLWooauqrWFIRFGLm42MmJWQlJKRlpaWkIt8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTCyMDHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCt7y8rqWzp7NkSUuCmI6Nlo+Gg4SEgn6FhX9zYFxeXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXEv7Oxt6u5dVd5loyTl4Z6gIWGgHZ4dXJwX1pbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb+9ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr29tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G6x76trrKusIZ4kY2Ki4V4gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tb6yt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8fLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwcC7ucu4rbCxr5d/j5CGiYp7eH6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sbKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8XFw8PKwsnKv8C9wru0trbFsauwrqp8dpOIj5B8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq20trG9ua+3r6iut7S0vLizvK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkr6mypaeoraWot6ywsre6uruxu72+vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yre+xL+7yrjBxMK2uL63srC2vrCqqqqdboODiIuAe36Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaimrqCdm6Slq7KvtrensKynqrSqtLqxtrWutrmxr7q5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMq4vMa5tMW4tMDCrri+tK6nsbexo6Omj3SGhoaBfHl1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloqiem6KbnqqwrbG1oqmqqaurpLS5rbewrLO1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnIubm/uLPCtbK9va68vLSkoauuq5mgn4p/hoZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqKmnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2gmpednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGwMW3wsDHzrfAxL60urqzwLezuryvtbexoZ2nraOXnZiLf4SEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaq6evsKubo6O3qqCfrqi2qaanrbCkt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4wczHxcLDvca4yMyywcPCrr28try9trq7s7O0rJ6cpKyXlI2RhYB9d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2NiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6agqq+mn6KjtqigoaKotKGlqKWwpbCtrLWeoJ2VlKmhopStsbGfoqOdnZibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsbItsbEs8LAxqy4uL63vry9uLawsKucm6Omj412i4d/dW5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVVJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpqSkoqOinKqrpZmepbGpoKCdpauep6Gera2pqa6toaGilJejm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdQT0haXE9SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/Gyc27wcrMyLXKvbG+xMqusrnDt73Cvre3rrCpmZ6gn4qFdYiDe3RpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq6Zm6qzn6Wmn6KjoZSTm5aWkqmprZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirr7K3sr21s6uvmIRzc2hbWFhTVVFFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asu8q7tr+szMfGucHOz8i0xby3u8TJsq65wbi+wL22uaqupJqcnpqJf3d/dndubWhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJOSk5WnqqWamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLWwubXAsa2xq5F9cXJiVlNWTlJJRlZQUlJMTFhNSkxOUkdNSkFDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DLsbi4vL7BxLKxs7mutra9trmnqKGinp6YhYZ5amdsbnFucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyWlpaIopqak4uOi5CapKeclZWXm5CSh5SOjIGLjX+QipKSkqGan6KVlJiYlaKlmYyZpKaopqGftLKosrehnaK3rKqtpLKypbW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPGxre6w8rMxrOtu761uMGwrqqyn6iwvbKypJ+gpZ2bi3+KcF5fZnJwdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQlI6Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY55kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwycS3ucHOxb6zrbvCrK7ErqmjqJOfqLmwqKWVnJ6bloJ9hGdXVl9nZmlnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjJCGhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfYmBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMfCt7O9z7+5r6+2w6irxqqknpqElZ20pp+ejJqXlI2BeHteUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCu7aousi4tqiotbaqs76on5aPgIuVq5makIOUioqDfXZ0Wk1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2cnKSd2h1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmdgXFxKVk9RR0pYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe6sqqdnaypqLOwopuSj5WBj56RloR7jX+CfHZ1blpLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuwp6ybj5acpamloZiakIaTeoqRjo96dYJyenZwcW9aS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpJedjYSLlKGhmZmRlIt0jnqBh46KeHN5b3Vwam5uW05FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYV5hJCYlI2QjI+GcYeCdIiOiXxzdXJxcWhyamFURklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rXlpcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgIh9boGQkomDioePhXWChGyWiYp9d3l5bnhweGZqXklQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYWMfn6Cf3CAfnppd2tSV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1pcXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGRe3KEnp+RnH92hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8gH+AcmBcYl5ZZmpca2teV0tHT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYKCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hYiFioeRenluXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCssrqiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6CemlXYWBXaWRoZFZaY1lWVElHR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4aBjZWKgISBinp8i4eGfYqCgYuElX14eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qjorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0A+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNtc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Gg4yWi3+Df4N4e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop+iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eGxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762ssTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaaYpZWKk5OIkYmPkJKem6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PVztPPzMbDytC/ysnLydLIzc3D0dK4sMS9xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wLGrtaaluKesrqCstKSPsa6bmJiMkZSRhI+bgY2mkZyJg4uEiomEioOUlZiXlJuRm5eZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PWzdLRxdLWxsDOyMjDqb+40J14bGRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmGkJCNi4qIkYd/gntyfoCCh3qFdoWTkYl/b3ZzbHN8fHd8c4J4cWuAcnJpb3F6eXJ7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqaaqsbmrprSjoq2io62hp7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OWrIuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8yKcW1iX15XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBg253cG11f3Z4fXSGfHlsh3Z1b312hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+jo6aypKWzoKKlnqGon6KxnIefkpKTkYuOi4aDj4R+nJuMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzl5qbp5ynvcPFubbFzdLQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUVVQWVVFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKgoh9eYWXl4iPg4eGh3qEeXF6e4SGdnqGjo2deoxwfG9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WanCtoySgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpmfpZ6frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yNlYyGe5uIk4+uq5SVl56Ypq61vKitvcbLyMnLy8/Jw9HK1NbY19jX1dvX09rb1tDb2tHWydXMlHd5Z2daWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChH6EfH2EmI6HjH6Gh4B3gnlue3uHgnR6kp6NoXaPdYJ0dYF9dICEb4KQgm+ShHR8gYV6dod8ibjGpcPJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VoY19TVlZVTUtETkQ7PT08OTo8Pjk+QTY+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af398hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9gYmFfH6Re5CpjpDDoLyMnKOcfYmEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWRWXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f31/e4h7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAi4d/mIeAnJJuiKmFeqCLfJCOg4iEnH6akYmNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWUkIyPioiWm52PlZaRi5OUhoCLiZKNioqdlpmjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKWiZ2QlJeKiqeXcoqyjYSnkoSZk4SajKOWoJiTiZudoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmomPhpeXi4WPjIF/ho+liI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzoZann6WklpWuooORuJWRs5qMoaGMpJuwo6SdmJGnlqeZrK+kl5SWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOhsKyKmrWdorilla2kl6mtuKeko5+aqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkXyOjn2Dho6PlJWIiJOWjJCWjYuMl5iTnZm0l5arnYuclJKOkZKMmJuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVNdUE9FQz48Q0FCOD84NzU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKiyra29q5u7pKitubirpqaioqSiqa+ysaqdnKSYm5iXnqKmpZKkuq+pwLytrbK5pqSofoiGnK28sIOMjIuQg4+DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKjsLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo0PkE9PTU8Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6uutLCpm6Cqm6Gblp+wtaeLo7q7tsG8rKicsqWkqJSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ew66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmGlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtu76nur+9u8O3rMGprLO7vqqwqqSlpKyus622taCfrp+lopijs72pm6i9waS3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tLzLvMPBtra7rbO/ubyur6igqai2ra6psreanqyip6Geq7e4qqWwv8Wxvbmzp6q1s62ul5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56zpZahlqysqqebnqaXmJaYlaCkqKWftqupubvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhHRzk1Rk07Pjg9QEouMzIwMjVCNTVQV048TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Rg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7y/z7XDvbi4t7KxtbO4s6umnKusuaqpp6+vl6OupKekpbXAsKustL/DusC6s6e5tbizr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZUlrCfr5yepJSvrqulmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK6vs7SmpJuqtLWqqaatrJqkraWkqKy6v6irtre+wr++ubOyxLK5vayjrrWsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRE5KS0JDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvbmyr7i0wMLKtcWywby0uqqora2wo6OYqrS7pqmmq6qdqa6no6qrvryorby0uL7HvLe2uMGxvsG0qbW3q76lj6KYkqKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqC1r6Wkkq+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFITUVGR0JSTElCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfEvs3Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+3pq2+sbi2x7a1ubjAs7/Ct7WztK++o5ejlpSclK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7KyLa4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvLm2tsSytLi6v7PEwbi4rrO1taOdpZWSlKGuoJminqioq6Oawq2pnqytm5uemaahvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinLKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbamt7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOppKqyoaO0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Krqpifppetu7Sbp7CbraCutLKnq7myp7qzuLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eSpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7o6Odoaa/p6ivr6GptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC5qbakrLuswMK3t6qssbqila2xrbKWpaeRqrmpn6awnaugsLSzqqq2tq27rLOzubesuLDDu76/psOrsLeuqaurpp6YmauioqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG2nperrqiul6aojqe7n6Sss56sorGws6yqtrS1va6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWpn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKDi5ZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakraqmr663qq+1uqensbfFt7G3vcHCtbS6xb7MxbnCwLq+ucS3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvZ2rrrKjq5+wrbSurbayubiqrq+yqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKjraClr5ehpJqako6jpaezqaGms6yptaWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V6io+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tLmkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7qjrLGzp6ijsrSxsbC1sbi0qq6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqKOenJaYpqaluKeisrWsp7GnrrC2rKSZoKyom5yenJSpuJyUjo6KmJuil4+YpZ+dlIKRlY+cm5eWlYiWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra6rp6Wxs7Sqt7G3oKu1ucm5rsC7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1q6qxsq2qqbS7rbSytay0raqsqK2pua2yscjAuKW6sKmtraWorrCmpaOvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW2paqrqK2vtq6jnaOpqpugmpqSpLOZjomNh5ChoJSMlJyfk5GEjZKSnZqYlZOHl5KVmaebn56MkpGOkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqmxpKmls7SxtLWysqGsrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe2sbKpsqmrpqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpKyVpZ6YnpmsnaKoqqKspqOtrLixsqGpoqCsr7GsnZ+nqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhYaPlJ+clZeUhpaTk5ekm5ycipKQjYl+fYeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKGqs5yqqrC2rbi1rqulq6q9ybuwvbfCr7Gss8TDzs/Dv76zv8LDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLukuLOsrK6nq6CjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKslqqhlJugpp6koqulraKfp7G3ra6jpqKbqqutqZyipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmoqOi4p8hYCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaVdWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqy2saulrKqpvMDAuLizu7Wmsq/EycvRv8G6uL+/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3prS3q6ykqaqco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqaCsnJKqoZ2gpKOmo6qenKe1rqimqqOjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+Mg4WUopmNjJmQkZGPkp+WmJaLioN/dIaAfn94dIN/end+gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlVVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zMzEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrChpquumqulrLC0ta+rprCqqbq+u8CwrrmuobevycfI0MG+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zsrmwo622sbCyu6u6r6mttqyqnqqsn6Ogtq2ooZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnp56nm5mqsamjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSDo5aEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5LeHNTZVNRXk1NUllmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEuLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1srSE05VUE0kY+yoKSnrKSno6yntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr6wvaasrLWrrZypr6Sgpa2rp5yeqrKks6ibq6epo6mdpKmoqb2stK+unamkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joJ/h52PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVZBV3ptVGFQUlhLTE5xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UsZmfoKmmpaCqpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7G1sb23ub21rbm2v62hs6erq7C1uLWrn728qbPBtLygr7O1qqufrbCjnKWoqqOem6SwprCgn6upqKGpnKSooa27qK6wrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaWWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mUjIh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvQFt4a1VeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTmayZoJinpKOfp6S4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwbW2oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6egppijqaCxuZ+jsa6gq6GspJymp6mampufo5WdnZueqaaXnKCokpmUmJ6TmZahqpGaiI6Phn2Hf4KOfXygjIyIeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrckxMfmhYWk5QTEpIUFJQSU5cX25TRFdaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol52mmZ2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rva+0v7C8wripu7q3p6i1qairsK2zsKeavrelrby3sp+wt7CopaevsZuhpKCkpKGXm6+moZ6jqK+hoKGTpKSit7ChprGqnqyjr5icqqWpnpianqWTm52bnqermp2dpZaWmJSdjpOXoqiikIiLj4V6hH6Ei3qOl4qNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajoZeVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjnMG2pam3t6uesruppqWor6uZoqecpaaUmKGypZmepKqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52gkpudl6Ciq5ybmaGVk5WWm46Tk6OnpI+Iio6GeYR8hYV8nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZXpjYFJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKOSjqWmnJ6enqS1raiqureorMPAt6+sobWup6+vt8HAvbLBt7Gusra1uLe1rKq8s6+ysb3At668vLGln7aspqa0qauuoaDDrKmnsbSsrLS6naiqq7GlmJ6qnqilkZmmraKZnaSqoZuinZegnae2prCqrqChnZ2hlaCmn6KgmZuanJKanpWmnq2imJeelZSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkY3R/YWRlZmVpamNob1leWF1sZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI3ODVceU4yPkhpWkxaSlZiZkE6M0BlRyU1m6SgkYyuoJqYoJeltLKjsr63obHFu7mwsaK2q6uvqbm+vbytwLKvrq62r7O4sqerubGurrS2u7awuL2tpp61q6ChsaWrr5+lxKGzpa+yr7ettZ2tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa6qK2ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gnSCgYqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGRAQTFJZEMnNJOim4+PsZ2blKGaqbKwn7nAtqC0wbu9ubGltq+prqW3ubi5rbuvraqrt6q0ua2lsrWxrqmxt7axs7W6qKmftqmen6qiqq2cqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknZmpo6WVmqCdkZyjq6qpu5+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamRmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnZOgnKqtq6O9xa+pt8K4vb2tp7awpqukuLSztLG5raqnrLSmsLWip7i2tainrLazrrSts6Kpn7SrnqKknKeomq69lainsLS4ra2kqK6qq6ain5yhqKecl6Gmppybp6edkp6gmZCeqKqjtbCjoqOclpiYmKSJoY+SmoehiJSeoX+lf6esnpSTnZOIg3J4jY6Dh6B1iI1pl4hmfXN4oG+Ih4N+jHx/oaCfmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFxnXz1LMVVgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSlp6izsa2yqK+fqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amoLako6CjmJWTmJOciK6QmJSJqYuYpJyGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrOop6a2pae4r5yysrWqpaSnsq+usaaqnqeksqSiop+XnKCfsa6Vn6OgtLqiqaihra6lop2bmqKqoJibqKGfmJ2oqJGcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9Znujp4JZX4uraYCSeHpqqDhKr1tXVG1jW0xPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa+ksbqwpKSvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGdpJ2YlZibna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJmhp6SQnaObmKGfrJ+lpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXq5V+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKZgeXF1UpOGXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg5Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAyO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfBqqytr66nrrOqoq+8qqGnta2jq7WkpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZqdlpigpambn52jn5ygoqWjlZuemJmdoqqbpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyik5mxqKils6qltKekvLfBsbrAsra0vLO2p7Kxo7GzpqCvtaibqLquoq+xoLK0saGknp6oqbCptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GaoqKnm56gnpWZmqWgnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5ikjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQk5UX2VQNUc9YU02Mi6inZGlr6ykqrusprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrK+kmKa6rqSxsJy0uKqgpZ2hqqWyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrZqgnp6QlZuhnZyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLiwmLPBrKiyp6qyuri0ub65uLO2vbamuLSgta2goKmrn5WntqyosLGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5eIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi9qru1oLGln6anp56TqrGpr6q1raqvoZihoKakpLqio6yhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5qopp+NkqSYqKuolZipqJ+foKOto6CdoY2UoJifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6WjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9sa+6uazBtqqroZ2npKKdkquqp7WjsqiuqqGXnKigpau5naOtnJaZkKWjlo6eoZyZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5KXq7KkoJ6oq7CZoaKPmKGXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmSmYyXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivt8Wxu7KuvLCuwbKspaOfpKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ6RoKiroJufqaSynqKkjaahlKGam5eWpJiPsKCSlamfhZCZtYCRkY24lXiCk5u1d25sb3NueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZ2dxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYVc4Kk9dXT0rO1ZWJz06PKadoKG/ppazwrSrqqisq6m7rrHGr7W0rrintbmtqaOjp5+gnZiTrKStqqa1qKifm5ago56spb6noaqYlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpauclqmlppyZoKinpqOooJGsnpejnpeWmJ2ej7Cpk5ynoo5qfmmcp3iJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKyws6y2pL6ys6agpKqdo5uZmaynrqSltaqkm5iVopumram/qKmmlpSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6ikm5usoKSamqKnrKKfqaGZr5qVpp+WlJ2fnZexpZmiqJmckZ6co6SZp6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWVlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ2grZihm5yipa+moaSnnqyYl6admZqhnp6csKGdoqeVmJOZlKCilqOfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6grKORkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqKajq6Gsm5+goJiknpyfnLCkmZ+ok5iXnZKlmpipn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jn6ScpKqokp6hnqCqr6qqo6qfp5umn6egrJahnKWxpJecq5ahnpuTpZeeq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrWvqqanpbGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZoqSqo5OgoZ6drK6orKajoqWgpKWcraiRpJupraqcnqqdraKWl6WWoaOYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnR8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyBjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqCnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2up6qom6alo6GqkqyzlqWiqqqepKimobGik5qnmqCalJSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGMkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKipqJqqqKOiq5uvsaKorK+mmqesqqqyo5OXo6WalJGEpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmYaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J1aIyMl46BbJmRbm14d3dua2ZkZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+qraOop6qrq6mkpqCbpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqroq2Zq6ehoaqis62iqrOyopyrqa+vt6SUlqOnmJuSfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe3CWkX1venR8em1bZWpycWaBaV5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKalmKqjn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpGmrZGZnKejoKqmrqGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqpqunKympZ6so7esoLK5sJ6cr6eztLSmlZiopJugjoKdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8ko+Ic3pyhH1wXGxud3JqgW5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2mppqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQorGZnpympaGir62dpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6iZraGspKWYr6W7rKG3t66enrWyubK0qJmesKKknoaP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGfpaGgtaeiqaewo5Sro46kraSfkJqaqrS0pJ2mnKmSlJeuoKCepqScp5y1mqCqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOmmKqmrKGkm62mvayVvrCtn6Ows7qstaicqbKlqZh6p5F9fLB3ioCkpYicbbJvoIete6GPg6iVmoCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6t4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOMlYp5eYGWfmpsfWJ9dG1/eV9mZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmaScrZifqKW2qL+upKmjn4yAjpubn6aekpSZmpSZmaSjo5mnqquio56pqL6kl8Osq6OirLO6rK+oorSwqquZdq9+kIqchYd8uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaShopCEoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmomWj5SVeniNm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEtJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6lnpmjoqWZn6Opsqi8r6Wonp2OfIualqGgmZCRmpuRmJaonqCYp6ympKSipKm7nqDGp6Wpoqu0tq2vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+JppuapaqRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuOmY+Vm3iAkJl5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5uaoKiimZ6grKypuK2no5qXk3uHmZKmm5OPkZiYj5eTqJmfl6ion6mmoaKru56pxaOgr6Ors7WrsauivamwsJt0dqqktoVliZ9vZ6yPio9tb3ekkJqggXWwmpZwkI1ylqejm5iupHJtbWxlinhubYKZcYB6aXBpZomWlZhxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpePlJx8ho6UdGWGd2eManh+eGRsY2ZsYktkWEprWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPIvrSpnr+rrKOgpqufuqOkraytpY2WraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJeOppeOkZCYlI2XlKaTnpenopqwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbaciZahl4apmpCUnZOqs5mbo6yhs5ejoZ6hopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck6CUlpSfgYaTi3BnjnZuiXd1fHlpa2Rkb2NVYFlAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xbq3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqykopqonp+TlaOXqJqpmZSmoaSQmqeZobS5p6qYmpCMe4GUjKGUipSRlZCPkpekjp6ZqJ6btaOdpqy3qK/CrqO3pq+vsK2qq7W7orG+mpKmpKa1opGdpp6NqZ+Nkp+jrLCboaSyqbCZpaGdpKuenp2cl6uckpmim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5KgkZqUnoOGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsruuqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCun6SXqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiHmBk4ybk4qVkZSQjZGWoYudnaednrijf4OvtaKwr3SkvqOyoHh6oayzvZZ3rqWgioCqfmRbYXafjqSdg5d+bpOznKOor6ujZZ+glHR6mpZwgJiol2x+oqiKZZ2lm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+Ncnmilpdld5eGgHaXaIKJgm55fmpwZV92b2traFtlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppqqXc4ucr5+oq6eTlrifoI+cpJ6QfoiIm56NrJqklaiino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+Nmp6lmJuyloCMm7WdtIySj72noX6nonqksLmBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWHmXelm3qHm4GXpoKBe5yyeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmCnZqFmH2RiYGCmGmMjIRqeHpwcGdkeG5pbGpbZGlpZXJbXUhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8r6CVpai0nY+DnKubp6KgjZC+npmNn5qhkHyFjpmXiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPj5uLjpGekZWeo5WdrIiftIm0mq6Lyoirr4m3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaok5nCgn+riJihcZ6AmqV9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZrWGdHXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PD5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ+ipKqilaSptqKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2JtkIuTkI2PjIyXi4+Rn46SnqCZoah+oaeHrZ2glq6QoJ6dkYaCoI2sr4ekjaqajJp+onWAmJNrgat0Tat4h42dkpuoqIKqq36EoXt6p2mef5JsZ5eGl7WInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdoTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZefoaWsq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkYyKppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaGMk52fm6Klf5OBj6OhlKB3nJaQp4OiqICGqq2FpXmLfYSafaJwcpKHlnuejHlth5uLmZGcqZuPh518gqJzdqZmnn53pF6Ye32Sc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2xycmRcaF1hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqinKOjpKubmrGsq5KXoJigpJmalJ6rm4uIkXiLhXCAlo2Jj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uGfn2PjYOLj4+JjpOfgpacoJ2gn4uJd5yYoo2gcqKLiKmInKeRmKmrf66MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3BqeXhhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aXhJKVmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46Vmn+ToZ6gopOYcmifiqCPjHCSjIKpiJmgpKqhqH2wraSiuJd2o7Oio3+IlHideqqafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdZt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHZ7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maooubqZycp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5R8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnpGLop19p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl2jZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Da2dmY252d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkQ4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjYiFe3B9hGh9j4KTmoF3kY6OiXB/ho+TkmyYlHyJkZKjlYOOqpqTkouFiXmDdoeAboGehneAkoWHmKGWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZySfKSAopmGmHGehKKtromXi4CMpI2Wg66ilHa1trXJoXSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXantps7W0xqZzmH56nWqbmqt0gpptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWGdPUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU5sXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bko2Ig3lqeYZlg4x+lp95dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl5f3yLeXCPoIZ5gZSGiJaflH+UpaeclpaEZ254nGyiZHxxpXicmHBop4KYjHyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnJpqmt1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjG97f3NyZKVueKJkZqdomHKLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlVlWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnBnUGpoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5CNinuGcYCIaIuKfJeac3SJfZB7ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfX9/jnNpj6WEfYWTjIeYn42HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4h5qXSlj4SabqWijJKEjIO8bn2lr4KGhoeUl52gfaZ6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf42nn3effYWklZ2gaZqHdatmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpVYGBcakxcUl1JXmxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnhkY25zZFJsZ2hvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Xk3N1hnKRg21/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42InJ6JjJOqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyEgHtyp4xxfX16l5abhI14e35+iJSVk4p3kZmgoYR7fYlrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCgoaOqpx+dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cXBvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9wd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOioiNcoJ8j31+j4R6l450coRwlYV7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Xd3GEqoWNkZyPh56eh4uaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2DjIycnJ+Oc5WLiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKJkKeVhmaNj4Nud4uDb4SMeG5kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mc317c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPjoSofn+SkZKTnLGlmpSdkI6yk5iEpoyMlpygiZGbgomSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImHipGmkYSGjoiDjJCLe4aJh46AdWuBg3t5mWlyaGB0inB9enZ1b3d0gV1db4dobl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob29sZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg4yRl5WOm5aGhpumoKKanYaDkpqZmJCapqCmnp6QloGSi3d9iI6EpXt8j5CQhZiqoJyTnI+Nqo6SgJ6NiZSan4OOl36GjoJveIZxdWF+hI+GdIuXgIKOgoaEfoWElG55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mMj4STp4+GhI+Cg4qJiXWFhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1haml1eX5wbGxjampngH9rcn9ranNueG6EeW6GgHaCgH2FdnGCjYh+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKi5KGoKGKhYx8p4+GjpKXk5aSd42joKGdlpp/gZCZmJOMmqKho5qYkZt+joV6gYSOh6B/foyMjnyXpKCgkpmQj6aNkIGbkYmTl5x+kpF9ho2AdXSBcHZgfYCOhnGKlXyHinGMfoKFhY5oeHJ5jZmSkICXfoiLc4KIfX1yenyMhXt6kY2DlqWTi4WRfIWGh4V1gYKFhnlkcXp+eHlwbGlmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZFheYGdqdniBcWZrY2xnZX+Aam19Z21wan13hnpri4FygYF9gXR2go2Gf3x6gIF9f49pcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialnh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6WTg5GKlpeSkXaRnaGhmJSYen+Ol5aOlpqcpJ2Zk5SbepCGhHmFlo2dfYGKjYtyl6KeoJKYjo+ijIyDl5iDk5aaf5eMe4iMgHZxfW16Y4B8i4VwhpN/j4Frh4KBf4mEZnZvfYiTmY5+lHiMiX2AiH18coB5ioZ6hJGKi5iiloGDjHeIhIKBdnuAh4N0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3V5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkIqmj4yOipKfkIKQj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI6VlnSOj4tthpiPmXqHiJCJb5edmqKTlIqMn4yGgpKcf5OSloeZiHuJiYF5cXlqdWx7f4t+bYWRgpN3b4KDfX6LgGVzan2Bl5iFf450kYmEeoh+dniBfoeBfYONhY2UpJB5hYJ0iYd9f3J0f4WBbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9rdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfYB8jYmRo4iNio2XmYyFkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJl5FvipqFZ4aZjpR6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmo97ioSGc3N1a3FudXyLdG6GkI2RcXSAfIGCiHxlcW16fpuUfoWJdJGLgXSJem+Bf4KIfYWMioWNlqiNe4h9fouFd35wbn6DgWJnd3N0bnpiXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2RpaIB6d3VvjoRzgYGDe3WCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doR3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyHnJ2Jj4aSl5WDiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhpiIa4WkhGeHnYqRfouEi4F3k5iRnZGQiImVjn9+j5h8kY2QjpqSfYuAgm52b2ttb3B7hmlzg46XinF3gHSCiIJ5Z3RvdoKbj32KhXqVknp3inVxinyHjXuLhoSJj5yjiHyEdoGLgHh4bmp/gH5ccXJxb294Wl1vYG9qXm9pfHpwbW1qbXdgcG9qcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYZ/d4eGdoOFfIaMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCb3KFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKLkaOak46IlZiRg4aWmYuTi4iPj4iehZCKfHOLhYiPiJyZnpuWlICUf2mGnYloh6CIkoSRg4lxg5GXj5qNj4yLj413e5KQe46MjZKXjXyIfIBrdmlta2xsen9ieX2OlYF2eoF3g4x8eWh1bXWIlox/iYZ7lJFyeoVxeI57i417iX6DjZGfnoV9fXiBi313cGhrgIB3XndvbWtxclZdbmFxYV9tbnlwZ3BmZnR1aHFrYXdlXVZlYGByU1BOW2VkXXhwiHxeXGhxYmJlZpFpX2dkW2hwfm9rcXOKfXZ9hYF0dX+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqbm5yalZN5jXdpiZKIbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYqSkYl6hXx+bXxlcm9ra3l5W4B5j46Ben5+f4aOenpodGx1jJCKg4aFfZaMbH5/b4GMf42IfoR7g5GWm5uLfHd4g494c2xlcH+Ca2l0b2doc21TXm5kcFpfa3F4ZmtrYmd4c29xY193YGBWa19edk9NS2BmY115cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdXZ+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Fza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY6PdYp3cIeJjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWJkY+GdoV+fmt9Y3h0aW14c1eIepGHhXl+f4CFjH55ZnRrgYuPi4SDgIyXhmyCdm6JkYORhX+Ce4GRl5OZkHR0eIeMdXNxZnR5gWFzbW9haHVmUmBwZ2tVXm1zeWByY2BpfXFyblpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh3fIhxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjHWHf3GGgoqImqOElY2fhIlhg5WPhYiGiYyHgIdofZR/fYOEiY6NgnGGfn9yd2d2cmhzd2tajH2SgoV8gIOAhIqCdmJ0bYqCkYyDf3+TkX1ugmx5h5CHk4R9gn6Bk5SRl4lucnqMhXRscGpxd39ec2huXGl1X1JkcWhmU19vdnRfb2BdaIJxcmpXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX56dnqHc4WDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKTgYl1hId3hICLk56gh5aQn36IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH5tg3yCdGttd3VzdnVrY42Bjn+FfnyEf4SIf3Bgc3KGfJCOg31/kol6cYNme4SLh42EfIV/gZSPkZOEbnB5jH50bG5panl8YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiW2dfZG1fblRab05ITmZkXGducYBrWltjc19cY2x3ZGVdXVpsbGJtanN2hn9xb398fHR4hXiFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj15xcpa8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCJdYV8ipmemYeVjpyAiGZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3ZzbGuOhYqBin94goCFg39rX3J5e36Oi4Z8go+BfnKBaXmEiIyGhXmEfYKYjJCMfW5te4l9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR4ZWBeXVlvgG9zWWVhXmpuYHBPWWtRRFNnYFprbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8goV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniYjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndKYlqk2dCWcXuQio93fZOKhJiRjIVua4WSknp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEkoyDf29/g3aEeYabmZWMlJGUhIhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGh4cG91mY2Gg4p8dniAhHmBa1xxf3OCiYaKfoaJe4lygW5xhYePhYVzhXqCmY2NhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dGBdXFpZdH1zb1dnXWZqcWBvTldoUj9ZZl5ab2pnenFaWllrZVpjcXlfaFxeZWxoZWtpcXd/h25sf36AdW+Ce4CCfoJ/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjIt1fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH1ugHV3hXqHnZGNkZKTjIuGf3uShnd/g4yCa39yaIB+eG18fIGKg3dheYSBcWRxaH5tdXF1gZuLgH+FgHN1foFzgW9cbn91eYuDi3uHgHyIeHpxbImEkISLcoN6gJaLin90bWt3gIB0dFxoZ3ZvWFZ7UllwZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW5jaU1XZlE9XmVcXXVmYHVwWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5saYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iSiX9oe31qc3tyhntzd35/jHp4hH18a4yNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnaFlYVzjoqJdnBshYKGdHmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIgpSRmImLhIl8j4hwe32Ee2h+bGuAe3ppenaBh4ByYHeBfnFkcmZ0gm11e4aVkYF8goFvd3p9dX5sWXCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiIl6bm1qboKBdG1cZ2RycFFaek1bb1xPXHJvZFVLc3hpV1laWmFxgHRgXV1gZmRoaWZOWmhNQGBjW2B2YV11bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N6gnN1h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3mWjpWPiIKIe4iIa3h5fnRnemhsf3lzaXp2gIN9aGB3h31qa3RneoBpdoGMkZR+en5+cHx3fHR+YlZ4fnNzioSCfYNxh4p3eHFwhIKNf355fn12joWDdmlxaW2IgXBvXWdhcW1KZXVLXW1VVFpzbmJRT3N4YFJYWF1hb4JzW2FcaGVlY2tkUVtwSUNjYFtjcF5deGhVVlV3XltlbmhWa15haWdlbm5ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeEcm13g4J9iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RbWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d39vcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn14e26Id4GSjYV0loqRjoeFhXt/hGx0dn5tZ3ZlbXt1bWp3dn9/fGFieIV5aHV1Yn17Z3WGjo2Ve3SAdnGAe31tf1lXdX9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfXNndGVui4Nrc1ppXnRkR21tTFphV1ZWd21iUFJ0dldQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJe2JubVthWlthVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV8amx1Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzlpN2fnxvinGCi42IcpiOkYmFi4N7eH1xcW98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlHtxh2pvfoB5bnxdWXN/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfXpyZnNhbouBanJXal52W0htak1WVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGtqZmNZbmFZZHBHQGdcYGZfXFV6XU9VZHBaW2poXVdoYF5yZmtncWdwcneGeG6VinR/end+eIOHf3Vyf4aFjoNwcHt4dnV6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1pdXVRncmRgWGRxcmaBc2JrZVdbYGp/eL6ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqbmCHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmScYB5doRugYOTiXOViI2IhImFfXh0cm5oeGBqbWBtdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ+b4xna3qDdW10Yl1xfWx1fYx7gWZ1h31ucWh1f3h+f3N9bHt7gnt4b2VsYm6JfWttVmlfdlVKaWpPUU5oTVh7aGFOVXVqTFBUVV9mdYNmXmBwaGdhV2ldXGxoSkRqWWFkV1lUeFlOVm1qWV1rZFxZZWNedGZsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnV11aXFtTZHBkXldicnVpdXBlZWJXXFxpf3BvcoBziWRkeH5pdHV0coGDd4CDeXZzdW1renFiZ2tnhnSNg25mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkHR8c318bnx8koZ3mXyIhoOGg310cHFsZ3RcbGhebHRkZ2Zpem97cllngHZ1aHCAeIJ2YneFi3yUgG6Mam17gnFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenp0fWZ+f4B5d25jZmJuhnxsalVpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2llYFZjV2NwXUxLalhjYVVUVHNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNucn91dJqBd3+Ad39/hoR6fHSChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBpa3CAZ2tgaHl4anN0dG6EgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvaXBnZl1VWG9njqh3gXp8kY55dXB/cHN2eo+AeJV1hoOAhYh2anF1Z2huW2xkXW1yX2dhanhoe21bboJydGpvgH55eGF3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5YnOAcGdqeXRxbHh4dXhkg3t/eXdxZGRjbnx9a2tVaGFlUkprZ09HUWtFYXhnYU1Tcl1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bm94dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVZcXGyBZXF0fWlpXGt2dWdzdnJthXt9fHh1cmx5Z2l4Zl1lcmh6d5OBY2NUZXBngoV3d2doamBXVllnY4+nbn53gIuPe3Bxfmh6b3qNfHePcoR9f3+GbmR1cmRoaFxrYVxvb1xnX211ZHpoXXSAb3JrcXt9dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V9dWVygGxhbHtvaml7enVyZoV2e3t2cWViZW1zfmlsVGddXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmZVSlxjV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG5vbnaDl3lygYB8f4mMhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlWY2ZrX11ccoVoWHBuW15XWlxse2Jwd3ZtYlpsc3NndHVwbIR4fn94d25udGRpdGVbZ3RmdnaSeV9dUmZmaoOCdH5iY2lcVFheYmOPpGh4dIOGkXhtb3tpeG58hXt1iXOAeHx4f2hkdmxgZmBeal9cc2tZZV1vb2J6ZVt3fGtubm93eHN0ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm52aWRmeXx1bm+CdXR9dHJiX2Zub31kaVNnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xjXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGc3F3dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFtaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bm9we3x8cYF3f3N6enpjZXVoXWJaYGdbXnZoV2Jdb2hhd2Bbe3ZpanJud3NydWhxgpWDhn2DdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcWFfanF9bGx1fnNxeGtwYVxlbGx6YWdTZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFgW1pYWWxxV1NPZldXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmnyChHl8h26PhnFvd3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1ZnYWxrWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYV1ubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZYpWVY25wg4WKdGtofHBmc3dzfGx6dHVven51XmVyY1teVmFkWGF0ZVVfYG1kYXFdXX5waGlzcXNwdHZrbYSTgYh6hHFzZ29+cXNvVFxna2ZxdIF3c2NsdlVicmtaXm9mfWVtd31zc3NrbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3dqYVddVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaHZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU29nc2xmeGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nV1hfV2SbiGJrcIGHfXhsa3luXHdxbHtqdnNub3uAclhpbV5ZXVViY1dkcGNTXmFoYWJsWmB+a2Zrc3VubXd2bGmFjH+JeYdtcWZxfW5zbmNaYWlpb3SCdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWtgWWFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59Y19UX1RddVxUU2BmTl1hVFNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmd2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmako+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeHjIeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKh4aOhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeIh4yIiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo5OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0FAPzw7Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPzw7S0c4ODo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+OTdkbDs4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQUA/QEA9PUZJSmt5TTw+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fX5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RCQEBDW0FRdH2BfXtcP0BAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA/QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBvcXBydXR3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFCQEFvY3+EhYKDfmk/QkNFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZDSnaAgoGEe4CFdERERURDV3WGiYp+WEdJSkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSUlRdoF8gISBg4hwRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDQ0RGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSlV4gX6ChIaGh4NVTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKWH2DhISBg4eHiH1/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSUtRdoSGhH6BhYODhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJTEhxhoWBfoGDgoOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNES3uGhIGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1NfoSCg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ozk5OTw/PDxBQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo5Oz8/QUp9g4KEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PTw+QERDVYKDhIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0lJRkdIREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BP0JDR0VohIOFhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCRkZLSnWEg4WFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0RISFBbf4SFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A5Ojw4PT47PUE+P0FDRkhKVHGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUZJSU5UeIWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VWUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PUI/QkNGVk5FTE5NUVZ7hoSFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDR0VERUxYUk1TVFNWWHyGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1dZWFpZeIWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWVpugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjU3OTU8Qj1mdHR2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1lUVFhRTFhZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5MSUhDP0E6OTg4OTc4ODQ3NTc4NTg5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTUpMUkhJSkZBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xIRENKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFREJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSklNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUFCRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZJR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hfXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0JCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCQ0lGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpMRklISkhFS0tMTE5PU1RPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXVpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdKSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRRUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXRydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGVnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViY2ljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3Sk1MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGREdKR0dKRklMSElKTUpNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGViYWNpbmljaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhKSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkNDQ0JFRURGQkZGR0RESkVFSkxMSkxNR0dNSkhKS0dLSklKSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3BNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURDSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hJTUlLSkpLTk9OTk1MTk1MXGhkdV1scVdsTlBRblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSEhOSEpKSUhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b250c3Z0SEtISkNFRUVAQD5DQ0FGQ0hKTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aam9gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVERkFAQUVEQ0dCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1enl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpIRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0JKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eHl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdIRERAREFISUE/SUpHUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSUlHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JRU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1BRWVNeXFxdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VKTlFRTk9PTU5NTkhLQURBQ0RGRENBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVtdXGFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUhISkhHTUxRUUlMSktLTk1VTk9LS0xHR0tQU1NOUE9OT09PSExGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/anR1dV9hdl9ZY1xcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSaHxlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFSS0dneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp+bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHl9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRqaGhlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT05OUUlSbUhpd0tgZHZ1VVdsT25se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWhmZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9QSkhRTlBVTEtLUlNSUlRQVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZ2VjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVlRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVVFOVVNOUE5MUVBLSVFRS1FNS0tPUVRSUVFTU0lJTU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFhXXlpfYV1cW1pdXWBjXF1iYmRnZWVlYllgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hUUU5VUE5RTktTUE1OVVNOUk5NTlFTUFRRU1RVTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NVV1VUWVVWWVRSUldVVlhcWVtgXVZZX11eXVxdYGFeW2JiY2hmZWViWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPV1VQT1RQUFFOTVFRT1JYU1JRT01PU1VOV1FUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZZVFdXVFJSWFZWW19aXmBfVl9dXmBcXGBgX19aYmJkaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU05OUlBSUk9MUFNSVVpVVFBQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ddX1tfX2BWYlxgYV5gYl9cYF1jYWNnaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5f2NcW1ZWWVJOT1dTTlFSUVNUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1xWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRTVVVUS1JWVVpaWlNPU1JVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZW15VVU5WV1deWldRVVVYWFhUVlhbVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ15dZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWlZRUVRcVFRUVVVWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWWBaWVNVVlpZWlZXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZlYl9kYV9hYWJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFlYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZXFpYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhaWV1iWV5WV1pbW1taWllbWVlfX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXVxdXV1bWlxYWl9hXmBkY2RmZmZiWWNmZWhnZF5jYV9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWVlQV1ZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFVXW1tgXl1fWVleXV5eYFtaWllbX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYGZlWmhpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YVllbWllXWlpgXmFiYmBhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gYGBgYGAgX58fHx8fHx9fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3d6enp+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x8en16d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7fH15fXl3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp8fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKCgoKBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjImHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDgoODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKChIKCg4SCg4WFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIKIjoOFhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCBg4KBgIGBf4qZhYGCgoGBgoKBgIKCg4KCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gICAg4GAf357gZiMgIGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgIGJg35+f4J9j5WCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhYSDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGBgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBg4+DgYF/ioSDkoWFhISFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhIWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISEg4ODg4SFhIKFkoKKhoWCgX6ChoeGg4F+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4eSgoaEh35+f3+FhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDh42BgX+Hgn5+foCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4SEhIGAgYuFgH+AgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDgYCDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYKAgoODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiIhoWDgoKEhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoeDf4GEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH+Bg4SDg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+f359foOEg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISCgoOEgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgoSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaHhYWFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHh4iGh4eHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIWEf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4GAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx8e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt8fXp9fn5/gICDh4mJiYqIi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35+fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYB/gIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt8enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH6AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4KBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3p5dHF1bndwdXpydnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enNweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4WFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYGBgoKDg4aDhIOGhIGDiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4GCg4SFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/f4KKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf39/f4SEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4F/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4OFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDfoODfYF9fn59foKDgXx/gH1/gH59fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2d3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fH19fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhIaGhYSEhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICBe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFhoWEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYeGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHiIaGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYWCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af3+Ag397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaEhYOFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgICCgn99fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7O0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8W0nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q4n5qTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GdqJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnp+blq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigaCYm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuahZ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03a0sKacir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCVppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYwqKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh87GkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Bv8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE9Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7iztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7jAsK+1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcK+2MC0sbSyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHD0NK0yLS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v725vsC0v7u8uri+wrzCydXJl87EtLK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxu8W8wcvNwo6nybm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDs6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3uLi7tK+0rLCvpJywtreNibW6sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxr73KsqaorZWLjXZwf4SfjIWht7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqW91KuinZyAbIF0YWNlcoOKm7e1r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqSfwM+pknx3gV5rkXVvZV9ukKC+tLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnsLHmXhjYYpcV4KLkIhsUompw7Otraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6fp56coZ2empqSmZ6coaKgn6fJuYhhWnaXWlhhbZCPfk50tMazp6qsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3pLCmn56dnZeYlZmem5yjn52u0apzWWSMiVhbb2m3rXZaWaC6s66uqaumoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+drM6eYF+Ih3d4hYd1no1ycnOUsK6npKSioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpybnq3JmFZvn5l5kpx/a3p6jaayqqCanZyfnpqXmJeSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqa3zJFUeaCkentuZm+RqbGspJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSqw86KWHqGhG5ocZCur6WdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtc/Pj2R7fW9ulK2tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbTRx4xvdnGEqayhmJaYmpudoZ2anJ6TfXFlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxxKFtbG6QoZyVk5ecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7m9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFlYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dXZ2tvYzM3PyNbVxcO3sLWpoq2suLyhb22Omo2Ml5WQlJKRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3G0NXV2drb2NDKz9DS1MnEuLy8rqW2qr66oXeJlo6Nlo+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83OzszVz9XZ2NnQzNPOztDKw7bEv7Syuq++toh9lYyTl4Z6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0MbV1NbXzszQxsvHycS8yL+usLa0t6+CjI2Ki4V4gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7IysnLycrEz83Sz8/GycTJxMK+u8y6rrK3tLKrjJCGiYl7eH6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTGwMXFw8PKwsnLwcK/xb63ubnHs6+0tq+tppGJj5F8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre6uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzL+8yre+xL+7y7jCxMO3usC6tbO5wrWxsrOnqZODiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu4vMa5tca5tcDDsLrBt7KrtLu2qqyupZuEh4eBfXp1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMjBx7y8xcTPv7rIubnAubTDtrK9vrC+v7iopLC0saGoqZ6IhoeAeHNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwMa3wcDIz7jCxb60u7u0wLi0u72xt7q1paGss6qgp6SUfISEgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvsa4ycyzwsPCr729t72+t7u8tbW3saKhqrOenpabhoB8eHJqbXJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8bFtMPAx6y4ub+4v72+ubiytK+goKqtlpZ/kYd/dW5kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvMyLbKvrK/xcqus7rEuL7Dv7m5sLSvnqOop5SOfYuEfHVpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiprJqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmIRzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLPz8e0xby4vMTKsq66wrm/wb+4u6yyqZ+ipqKUin2Bd3hvbmhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5WnqqSamZmdnZaNjIyUhomNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLSwubXAsa2xq5F9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DKsri5vb/CxbOytLqvt7e/uLuqrKeqpqahkJJ/a2dtbnJucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5Cao6ablZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGftLKosrehnaK3rKqtpLKyprW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNxrStu762ucGxr6uzn6mxvrS1p6OlrKamlYqXdl9gZ3NxdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsKGwrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr6zrbvCra/Fr6qkqZOgqbqyqqiZoKWkoYyHkmxXV19oZ2lnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C5r6+2w6isx6uln5qEl561qKGgkJ+dnJiMg4hjUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrers76ooJiQgYyWrJuckoaZkJKMh4CAX01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqSAcmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrSwo5yTkJaDkJ+SmIZ+koSKg35+eGBLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYaTe4uSj5F8d4Z2gHx4eXhgS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY10j3uCiI6LeXV7cXp0cHR2YU9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIcoiDdomOin10dXN1dGx2bmVVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCCdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW2WiYt+eHl6cHpye2ltXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWdfW1pdU1tmXldRVVlcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4F0ooWMfn6CgHKCgHxreGtTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1tdXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ+hqWIiYCDiIZ5iIt/dYZ4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlH1/koaTln+KgJKbjoSBgoyLgoqOhICKf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8f3+AcmBcY15ZZmpcbGteWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpJ6gJGJkZJ9ioWZkpGDgICLjYmGkYeFiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW2BeYWZjYGdnXFJFS0tQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGCdFhgY1VlYWFiX2BmX1tUSkRFTFZRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6Be2lWYWBXaWRpZFZbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qkorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfXFeYWBcVmFeZ2VSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwbu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JJRUNJO0FEPkFIPz9BNztEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluKesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40J14bGRcYVxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqKeqsbmrprSjoq2io66ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yKcW1iX15XUlhSW1BKR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUlVQWVVGRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdnqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09rb1tDa2tHWyNXMlHd5Z2ZaWU9SU11IQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VnY15SVlZVTUtETkQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWNVXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZWVbW1ZSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6WmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9ZmFcXF1OSVRZQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mLlo6HfYyYnomQkJyamZOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVJdUE9FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKf4Fzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqqebnqaXmJaYlaCkqKWftququrvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhISDk1Rk07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKustL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqylmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6irtre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq6kpJ+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby0uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFJTUVGR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUA+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5uemaagvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLq0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy3uqWZq7Krqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKSdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6qssruila2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNEVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG3n5errqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKCjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6insbfFt7G3vcHCtbS6xb7MxrnCwLq+ucO3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq+yqLWvtLy9yrOqtrWxtLCvqKKzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaSk5V5io+Fe4yKg4qSam14bXV7YUVgallJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VeYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqqmktqCgp7GhpJScmZWxnqecoKqOqaOenJaYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5eap5yjoJKWkZCVdYSQh3uFgYSMi21wd3R7flxLZWxcS05jXD9ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1rKuxsq2qqbS7rLWzta20rKqsqK2pua2yscjAuKW6sKmtraWprrCmpaOvpKmcnpybr5qjo6Kjkayeo6CgoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqYlZOHl5KVmaebn56MkpGNkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe3sbKps6uspqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpK2VpZ6YnpmsnaKoqqKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhIaPlJ+clZeUhpaTk5ekm5yci5ORjYl+foeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLykuLOtrK6orKCjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKsl6qhlZugpp6koqulraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmYqPi4t8hoGBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvSv8G7ucC/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3p7S3q6ykqquco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+LgoWUopqNjJmQkZGPkp+WmJaMi4R/dIeBfn94dIN/end+gYidj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0ta+rprCqqbq+u8CwrrmuobevycfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zs7mwo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+vs6K1qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnqJ6nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSEpJaEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaGeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwsLSxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mdpKmoqb2stK+unaqkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+j4OAiJ6PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspmgoKmmpaGrpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6xrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Be5qUjYh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65srO/tLq9t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsa+hrKGspJymp6mampufpJWdnZueqqeYnKCpk5mUmJ6TmZahqpGaiI6Phn2Hf4KOfXyhjI2IeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrcktLf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rvbCzvrG8wripu7q3p6i1qairsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKGXnK+noZ+jqK+hoKGTpKSit7ChprGrn6yjr5icqqWpnpeanqWTm52bnqesm52dppeWmJSdjpOXoqiikIiLj4V6hH6Ei3qOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmpaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGzppmepaqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6CjrJybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZntjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqureorMPAt6+sobWup66vt8HAvbLBt7Gvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qauvoaDErKqnsbSrrLS6nqiqq7GlmJ2qnqilkZmmrqOYnqSqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq6jmJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkYnR/YmRlZmVpamNnb1leWF1tZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vbytwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+yr7ettZ6tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa5p62ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Fyf2BkZ2pubGZqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+PsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ubi5rbuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSztLG5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK6qq6ain5yhqKecl6Gmppycp6edkp6gmZCeqKqjtK+joqOclpiYmKSJoY+SmoehiJSeoX+lf6esn5STnZOIg3J4jY6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCgmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amobako6CjmJWTmJOciK6QmJSJqYuYo5yGsYCkrp6Vm5+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqihra6lop2bmqKqoJibqKGfmJ6op5Gcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ+elZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6ZoBpeGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGco52YlZidna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/lJeXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAgIiQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6moqpudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3ybl6eQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKikvLfBsbrAsra1vbS2qLKxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqiXnZicoaeimKKho6GboqKnm56gnpWZm6ahnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5mmjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlsK2lqrutp7Wlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+mk5ShnKWnoJWbp6eimqOfrpqhnp6QlpyinpyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOng5qao4qSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDMzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBraiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbKrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoaKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9srC6uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZuZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5qforyimLHCsK2pqqyxqLmvt8WyvLOvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqqmaasuZ2jrpmVoZCmoJONnKOfmZ+akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeWpJiPsKCSlamfhZCZtoCRko24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdXaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGsLa0r7intbmuq6Sip5+gnZmUrKStqqa1qKifnJago56spb6noaqXlZyRopuSj6GoopSel5KYlLK1tq2YnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4loc418hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyK2xtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iWopumram/qKmllZSblqCak5ilqaiSn5CPmJywsr+sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJeHk5WKg5OTkIiNkZSZk5mXmqChmpuUoJyOgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+ipLGxt6CpprOnpbC1qsmsrrKmtabAqLShnqWmnKWWlqCrp6yjo7esoJmXlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDsJqrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCdjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsaytpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlZ2Zma+mrr6grKOSkp6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iYnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbKrqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKKvpra5pa6jkI+aoZmTkpugmJmmlnulrKKotMO4paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrawq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevo5KSmZ2lkpGgoZeboJ2Hpqukq62/wLGhqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfqt6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5Wao6KSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKepqZqqqKOhq5uvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaajkJqiqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqqoq2Zqqihoamis62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpCmrZKanKejoKqmraGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqZmunKynpZ6ro7esoLK5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgW9aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQobKZnpumpaGirqycpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6eYraGspKWXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzboB1XWRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraSekZqaqrS0pJ2mnKmSlJeuoKCepqScp5y0maGqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOll6mmrKGkm6ymvayVvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6p4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOLk4l4eYGWfmpsfWJ9dG2AemBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmqWcrZigqKW2qL+upKmjn4uAjZubn6aekpSZmZOamqSjo5inqqqio56pqL6kl8Osq6OirLO7rLCoorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmoqWj5OUeXiNm3xjc3xhg3hzgHxhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6ln5qko6WZnqOpsqi8r6Wonp2OfIqalqGgmZCRmZqRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuPmY6UmneAkJl5Ynx6Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5yaoaiimZ6grKypuK2no5qXk3uHmJKmm5OPkZiXjpiUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivKmwsJt0dqqktoVliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpeOlJt7ho6UdGWGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY2VraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7g5WNppeOkZGXk4yXlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbadiZaimIapmpCUnZOqs5mbo6yhtJejoZ6hop2hpKGVq6eMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck5+UlpSegIaTi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeQl6yji4iJj5ynlqykopqonp+TlaOXqJqpmZSnoaSQmqeZobS5p6qYmpCNe4CTjKGUipSRlY+Okpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mpKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKqenp2cl6ydkpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZuVnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajk5epnI6GiombopCun6SXqKChkpeZm66LqpaQqJmojJiojp64tqOlmJuNiXmAkoybk4qVkZOPjJGWoYucnKednrejf4OvtaKwr3SkvqOyoHh7oayzvZZ3rqWgioCqfmRcYnafjqSdg5d+bpOznKOor6ukZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXqjl5Zkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62lkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI6bpJ6QfoiImp6NrJqklaiino6XkZ6FdK6QiaaaqJGWo4ibubOnoJiZi4l1dpKNlpOKk5GQk4uPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnpqEmH2RiYGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpai0nY+DnaucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5SdrIiftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ6ipKqilaSptqKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKh+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZafoKWrq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbaF1iTEQ9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqhm6KjpKubmrGsq5KXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhX2ZXYkJQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5qnn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIjJaXhJKUmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNgUV5XXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maoouaqZucp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVioqKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVJbZlBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkoqFiXmEd4iAboGehneAkoWHmKCWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilHa1trXJonSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWWhPUmhJVUxYUlZcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelX+TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlZmWVNtSVhPXEhYaGhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn46HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpWYWBcakxcUl1JXWxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5Oqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cnFvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5WMiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mcn16dG90Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh42AdWuBg3t5mWlyaGB0inB9end2b3ZzgV1db4dnbl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfYeThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumoKKanYaEk5qZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSan4OPmH+HjoNweIZxdGF+hI+GdYyYgIKOgoaEfoWElW55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mNj4WTqJCHhI+Cg4qJiXWEhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wa21ja2lngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhHyJkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5GIj5KWk5aSdoyjoKGdlpp/gpGamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqTl5x+k5N+h46BdnSCcHZgfYCOh3KKlnyHinGMfoKFho9oeHJ5jZmTkICYf4mMc4KIfX1yenyMhXt7ko6El6aUjIaRfIWGh4V0gYKGhnlkcXp+eHlwbGpmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xoZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goR9iJB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYeoCPmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAj4Frh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5ioZ6hZKKjJmjl4OEjHeIhIKBdnqAh4R0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegm5KQknSBjpKUiZ2dnqeZmI6VmHWPkItthpmQmXuHiJCJb5edmqKTlIqNnoyGgZOdf5OSloeaiXyKioF6cnprdWx7f4t+boWSg5N3b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iYd9f3J0f4aCbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2plamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfanJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZSRjY1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R6iYWQinCWmpOhkpKIi5mMgn+Rnn2Sj5OMmo97ioWHdHN2a3FudXyLdG6GkY6ScXSAfIKCiHxlcW16fpuUfoWKdZGLgXSJem+Bf4KIfYWNioaOlqqOe4h9fouFd31wbn+EgmJnd3N0bnpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2pqX3Fpc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2Lj5GEbomLj5GKnJahnJiWhpiJbIalhWeHnoqRfoyEjIF3k5iRnZGQiImUjX5+kJh8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3inVxinyHjXuLh4WKj5ykiXyEdoGLgHd4bWl/gX9ccXJxb294Wl5wYW9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWN9Y4V8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlZiSg4aWmIuTi4iOj4iehZGLfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIkoSRhIpxg5GXj5qOj4yLj413e5OQe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g418emh1bXWIlox/iYd7lJFyeoVxeI57i417iX6EjpGfn4Z9fXiBi313cGhrgIF3XndvbWtxclVeb2JxYV9tbnlwZ3BmZnR1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGlxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFrhGCHfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH9/cIGNgI6JfoR7g5GWm5uLfXd4gpB5c2xlb36Ca2l0b2doc21TXm5kcFpfa3J5Z2trYmd4c29xZF93YGFWa19edk9NS2BlY1x5cYp0XFtldWBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhZFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5OZkXV0eIaNdnNxZnR4gWFzbW9haHVmUmBwZ2tVXm10emFyY2BpfXFybltjcmFjV25aXHdNTUxjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qIm6OElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6OgnGGfn9yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRl4lvcnqMhnVscGpxd39ec2huXGl1X1JkcWhmU19vd3Vgb2BdaIJxcmpXZ2ljaVhtV1t1TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGneG5xd3txkpCNh2qYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hICMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIfnBgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkZOFb3B5i390bW5panh8YWdpaVhrdVpSaXJpYlBicnltYmVeWmqDbnNiXGdfZW1fblRab05ITmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoV8ipqemYeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFg39rX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjpGMfm5te4h9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR5ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2tCWcXuQipB4fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeEeYedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9f4R1Y3BzgGl5cG91mY2Gg4p8dniAhXqBalxyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo6OhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dWFeXFpZdH1zb1dnXWZqcmBvTldoUj9ZZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoOWjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHV3hXqInpGNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIGKg3dheYSCcmRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2JeXtybYmEkYWMc4J6gJeMi390bWt3gIB0dFxoZ3ZvV1Z7UllwZExacnJlW0lxeG9cW1tZXXR+dGhZYltnZm5jaU1XZlE9XmVcXXVlX3RvWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iTiX9oe31qc3tyhntzd35/jHp4hH18bIyNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFloZzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHaBf3Jkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WMg4d4iHaDiXt5dG+KgZGChnN/fn+UiYl6b25qboKBdG5dZ2RycFBaek1bb1xPXHJvZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWmhNQGBjW2B2YVx0bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uKjY+Dan57bXd4dop3fHiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpODc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3qXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h35ranRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96fn12j4aDdmlxaW2IgXFvXWdhcW1JZHVLXW1VVFpzbmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUVtwSUNjYFtjcF5cdmdVVlV3XltlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+ioyTf3CAe3d5eoGLdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aOgHqSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Id4KSjIV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIV6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnl8dIuCfnNodGVui4Nsc1ppXnRkR21tS1phV1ZWd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgomOint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubVxiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX57kYR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi4yIc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlH1yh2pvfoF5bn1dWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3JYal52W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNZbmFZZHBHQGdcYGZeXVZ7Xk9VZHBaW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVyf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR7fox+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoORiHSWiY2IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx8gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxuV2pfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmFxaGdiV2ldXGxoSkRqWWFkV1lVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSChHt+i4N7dnt3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CEeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kYZ4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngHZ1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXxsa1ZpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2NwXUxLalhjYVVUVXNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNvcn91dJmCd3+Ad39/hoV6fXSChH6XhW5zdHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1VWG9njqh3gXp8kY55dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx9a2tVaGFlUkpsZ09HUWtFYXhnYU1TcV1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bnB4dXqYfXeAgXqAgIeGenh5gn6Bk4RydXR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nb353gIuOe3Fyfmh6cHuOfXiQcoR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfmpsVGhdXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x9dHZ1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4foB4d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFheYmOPpGh4dIOGkHlucHtpeW58hnx2inOBeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2Zubn1laVRnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xkXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ3doJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH+AfHZvbmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcnGFhJF0bGx7bnBxe319coF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx6YWdUZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFiW1pYWWxxV1JQZ1dXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26PhnFud3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZY5WVY25wg4WKdGtofHBmdHh1fW16dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ29+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqd19nVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3drYlddVVt0ZFNSV2lSWWZUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7gHecenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nVlhfV2SbiGJrcYGHfXhsa3luXHdzbXtqdnRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcWZxfW5zbmNaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRdZVZhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBVX1RddVxUU2BnT11hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj46OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSHhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4aGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4qKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1c3J2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgICAgYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A/PT5BQD0+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QEA8Q2NEQEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pj0+PDxHe1s+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hERkhEQD48Oz5AREVEQEFGQlFlbnB5cUVERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHVWVhfoWFhYB6VEFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLS0peeoCDg4F8g35jTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS2R/gX6DgX2EgnuAhoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSEtLZn9+fYKEg4GChISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dIS0dqgIKCgoOCgoOCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUJERWaCgoKBg4ODg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOj1DU4GDg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj8+QT9ZhIOEhYWFhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PDs9P0NCQGeFhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/PzxAPkFARUJOfoOEhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDs+QD9BPkFARERIQ2qFgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APj8/QkNGRUxXfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD07PUE9PkBCREZHUW+Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT1AQkdGQEVHRUpRd4aDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkJGVk1ES0xJTlJ6hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxSUlBTVXqGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZYVlhXd4WEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RTVldXV1ltgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+a1FLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0JcXU97Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ01SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+REVDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXltYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZOTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxMTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUpGREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0VFSkxMSkxNR0dOSkhKS0dLSklLS05MTU1MTElMTUxbc2JkcF5sbFVNTmVzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTWlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkFCPT9ARUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JJSEZKREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRURUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQEZFQlZVRVxUXlNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlMSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5OSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZZVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFVTWFpUU1FZV1dcX1tgX2BWYlxgYV5gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVdXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1tbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXV9jZF9SWVlQV1ZXWFdXVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXF1YV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllaWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbW1hYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzM2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eX+DgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHh5eXl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH19fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn19fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4eCgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCkoyCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaGg4KBfn+RmYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhYiCfn1+fYWcjIaGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OJioCAfoWKf5OPhIF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDgoqKg4iCg4WAhISAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODjomGhouDf4CAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SQh4GCgoKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYiDgoKCg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoeCgYKEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH5/hISDg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59fYCEhIKDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGDhISBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOCg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4eAfYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42Ojo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGOi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYSBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5dHF1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7enp7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhIOEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOCfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gX19fHx9gH99fIaDhoaGhoaEhIKFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0M/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dG4oNDRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Szlpi6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q8n6OostGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv8eHmrTV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3ao5i11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvA16GYtNPTr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWq9ihmLTT06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5PToZm11M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ6k2aKZtdfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYv9ehmrPZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8vWsYPF1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU0dDD1NHSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3rqmqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr65vMHBy769ycTAwMrAscG/u7i7vrq1t7O4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u+v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDs6QD08PDs/PkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbq7v723sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4Oz9AQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW51ce1s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLesudmzu621r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK3prXUmcG3srGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCfoqCir6+ssLGqqKqyyZamyLCuraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ6empqSmZ6coaKgoJ2hpK6dn6mso56XhXuMkbGUiLWvqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+do6bOo5uloIl2g3NiaGt9h4Ohs66uqaunoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWen6GdnJibn6CboJ+fl6Kw0auUjoiBYnGObGJdYHigsa+npKSjoJ6lq6ael5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKcus6ihm5jh19Xh4iPj5ywqqGanZyfn5mXmJiSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmcbClWtcapdbVHGbsLOtpJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsmp/PtIFaXH2Ra5CurqWdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaWl0qhqWnWVo62tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWxr82hWmSfrauimZaYmpudoZ2anJ6TfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxtr7Ml1qQopyWk5ecnp+fnZSWmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XHysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLfJzZeImo6NmJWQlJKRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr25zsmhlI6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/ttKzkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubS7k42Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLW0m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szDxsLF0MfOwsTHwMbGxMTLwsrLwcPAxr+4urrJtrO5urOxqZGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS4u8G7t7W7w7aztbaprZSDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6OfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLEsbvDubOttr24rK+xqZ6Eh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7O+v7G/wbmqprG2s6SsraOJhoeAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy1wbm1vL6zuLy3pqOttq2jq6iWfYSFgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6+uL6/uL29t7e5s6Sjrbehopqfh4B9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usC6wL6/u7m0trKio62xmZuDlIiAd29kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLvFub/Fwbq7s7axoKarqZeSgYyEfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLs6+7w7rAwsC6vq+0q6GlqaaXj4CBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrSytbuwuLnBur2tr6msqKqllZiCa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CapKeclZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGgtLKns7ehnaK3rKmtpLKyprW7taursaOIeHFsXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysay0oaqywLa3qaanr6mqmZCfeV9gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKulqpShq7y0rKubo6inpZGOmm9XV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKqtyKyloJuFmJ+3qqOjkqGgn5yRiZBmUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFh36KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEdKTkxNVEtRUU9GSEM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestL+poJmRgY2Xrp2elYmbkpSPi4WGYk1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEzNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrOwo5yTkJeEkqGUmoiAlIaLhYGCfWJLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FocYB+jnBDioSCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnJqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6epsa+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYeUfYyTkJJ9eYd4gn57e3xiS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6CbGljbHmFkJKGa3NsfG5ye4ZobXB/c42JhIV6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY11kH2DiY+MenZ8cnt2cnZ5ZE9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26TjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIc4iEd4qPi351dnR2dW13cWdVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSdmx/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3pxcG9rXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW6Xiox/eXp7cXtzfGpuXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjXp2iH6JiI5zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4J0ooaNf3+CgXODgHxreWxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZmd4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxalpcXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoV0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CNlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn5/cV9cYl5ZZmpcbGteWEtIT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5J6gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdnXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSkRFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ/gI17v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AeWlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfXBeYGBcVmBdZ2VSWGFWUlZJRUZOS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFhfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bWRbYFxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzU5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcW5hXl1XUlhSW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRtY1tXUVRQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eFh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09nb1s/b2tHWyNXMk3Z4Z2ZZWE9SU1xHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4d2VnY15TVlZUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVpaGRVX1pST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZWVbW1ZSVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6VmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ako+KkIqXm4mLlo6HfYyYnomQkJyampOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJKPiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HJyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SMj42Vo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77CuK3Cw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5OWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKystL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmrKutsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlZugoaiep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJytqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5WZqqGedV5aXVxJR0VGTVBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk5LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUxKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKuzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSrs6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpUQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+vrSorrG2nparrqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkp6ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLq+ucO3wLmxtKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQipSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vr6/t768sbytp7q5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5iap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cS05jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7Kxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmtraWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fH1cU2RvXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLO+wcK7vre7xKest6yzuLzAr6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6moqK2pqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaQlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDur+zyMOrrretsri/vrKtraukp6qwqaeosaW0rqqwrq2ysbSstLyluLOtrK6nq5+jnrC3q6qtu7elt7akqqesq6qtoamnprGypKeloaGsl6qhlZugpp6koqqkraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8G7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoq6irp6CrrKm5tqmqqamiqqCtm5KqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaEioqNjY+LgoWUopqNjJmQkpGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLvBsbGyq7OopLSopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6qjqqGirK2ova+srqyiqKigrJmQsKKYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYGLho2MkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5ka4B0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mepKmoqb2stK+tnaqkoa6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6wraCro6Svn5+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh8fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLu+t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsK+hrKGtpJymp6mampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrG8wrmpu7q3p6i1qairsa2zsaibvrimrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hoKGUpKSit7ChprCrn6yjr5icqqWpnpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR31dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepaGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGyppmepampnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIiRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qquvoaDErKqnsbSrrLS6nqipq7GlmJ6qnqilkpqmrqOYnqWqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1tZGBNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OUROPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p62ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+OsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppycp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ11MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CjmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCraelnqOkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnq+ol5yin7Szoaqboaysn56al6Cjqp2ZnqWhnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6wd1dYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl5+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVxKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhmJOnq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOnm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6Kcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+RlJWrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0cqNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCsK2pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp6yjpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6VlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqukq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPRDVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqaiin56wrJibl6ior6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqqqKOhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5efKhVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqOsoaSfr6Kdm5OqpLawrqCpm5yXlaajkJqip5+gppyxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqihoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXVxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7WfopeTqKu2sqybppyglpClrZKanKaioKqmraGjp6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKumpJ6ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmamklKK1oqOVl6KqtbmknKOdo5OQobKZnpumpKCir62cpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGsoqSXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maGqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKCjm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eWBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqho56pqL6ll8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLFsZ22Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKG9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYk42XlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZOqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZSQjZGWoYucnKednrijf4OvtaKwr3SkvqOyoHh7oay0vZZ3rqWgioCpfmRcYnafjqSdg5d+bpS0nKOor6ykZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgY2RjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOTh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfGlFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkouFiXmEd4iAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilXa1trbJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWp4h2ZrZ2J0dHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiFlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uaGxTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1sfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yOhpuFhY51gIx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4KIfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5i4Z6hZKKjJmjl4OEjHeHg4KBdXl/hoNzXnd3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmqKTlYqNnoyGgZOdgJOTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3Jzf4WBbF95dHhwe25hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpShkpKIi5mMgn+Rn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgXSIeW6AfoGIfYWNioaOlqqOe4h9foqFd31vbn+DgWJnd3N0bnphXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZGQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3iXRwinyHjXuLh4WKj5ykiXyEdoGKf3d3bWp/gH9ccXJxb293WV1vYG9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfHOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qOj4yLj413e5ORe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIlox/iYd7lJFye4Vwd417i417iX6EjpGfn4Z9fXiBinx2b2hrf4B3XndvbWtwclVdbmFxYV9tbnlwZ3BmZnN1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGhxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIKNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Ba2l0b2doc2xTXm9kcFpfbHJ3ZmtrYmd4c29xZF93YGFWa19edU9NS2BlY1x5cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbG9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjV25aXHdMTExjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuJiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5ec2huXGl1X1JkcWhmU19wdnRgb2BdaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGl5cG91mY2Gg4p8dniAhXqDa1xyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBsTldxc2ZgS2x3dGFdXFpZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uIgX2JeHpybYmEkYWMc4J6gJeMi4B1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XmVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4eSiX9oe31qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXp4c2+LgZGCh3N/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFxgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan57bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p3eHFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHlsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgYmNint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVxf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR8foyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kY56dnF/cHR3epCBeZZ0hYOAhYh2anF1Z2duW2xjXW1yX2dhanhofG1bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1TcV1KTVRaZWt2e2VfbXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcYR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1zfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJvhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4fn94d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2iXOAeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d3ByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGt0b35reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319cYF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZVa1BJUFpVa2trfGVtb3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fWx6dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlPSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygY2LdndseoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtpdXRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2dsPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHiIeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKjYiQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IiIyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHh6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdXh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHSEVEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6PTxAQkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBREVDQD1IREFERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FBQ0ZKSElGSEhKSEZBQF9oREJBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMS0xIVF9ocXtXTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLTExgWGd/hIaEfnl/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT215g4SDf4CBhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hQdYKBgIKCgoODg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERU12gX+BgoODgoOFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxETniCgoODhISEhomKioiHh4iJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49QEBPf4KDhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFBP2KDg4WEhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4/PzxAPkFAREFNf4OEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz9BPUBARENHQmqFgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT5APj8/QUJFREtWfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs4PD07PUE9Pj9BREVGTm6Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT5AQkdGP0RGREhNdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkNGVk1DSktITE95hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxRUVBSU3qGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZXVldWdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1RTV1dXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaW1NTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f397eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0JBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0eHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NER0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1lgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QkFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFzb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0RESkxMSkxNR0dOSUhKS0dLSklLS05MTUxMTElMTExbc2JkcF5sbFVNTmVyXWdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHBxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURHS0pLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRURAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSUNFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlLSktLTk1VTk9LS0xHR0tPU1NPUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVVZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVVRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSVFVXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV5WV1pbWltbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXlhYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2FfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzQqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5eX+DgoKCgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl4eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnt5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4ODgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4OEg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4GCg4ODgoKEhIODg4KChIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYGBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CBgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGCgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoeNh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhIOBh5mMhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KFhoKAfn5+j4l/f39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODg4qGf4GAhYGAgIKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WEj4KFg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaDgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIWRg4SDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaBg5CEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEiJKRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf32AhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fICDg4KDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCf4GDhISBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBgoODgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWFgICDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHiIiGhoeHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhISFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNi4yOjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MjIuMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLioqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgX+Af35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChICDgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgoCAgX5/gH6AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICBgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXl7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgYKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fXx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYGBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSEhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4iGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIeGhoeFhYeDhIWEh4aGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoKEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag397gH19f4J9gIF+foF+fX59fX97f3x7enl6enl6enx5enp7e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tHtzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZo0KSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaePS4wMDAwMDAwMDAwMCposqurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamro0s8Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKycrKysrKysnJycnJyc3T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn08iUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Ccq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6u1lYecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv77ImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3TlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvEsp/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWrdCLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TK26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCbkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiMydkY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbu1vL23sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLets7Gvsa61r6+ztaqnrayjm5mUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK2pq+zq6mqtLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpKGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PUI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCgo6Cir6+sr7GstqiusbCoprGuraywp5+eoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ2empqSmZ6coaKgoJ2ioJ+en6mrp6ypqrSsq6zKwKSrqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+dpJ6bnZyloqSjoqqwrKao1LSlrK+uqaunn56eoaKdnp2anJyUk5WUnp2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubn5uenJ+lpqWgo8i0sq6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKgn5KZn5mSmpifmY+JorGzqKCanZyfnpqXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmqCavqOSjpaMgouaqbCqo5+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NXT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+8wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5anr8usjI2Ri5mvr6adnZ2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/Dw8jOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaear8TGpYaGoK+snJWYoJyboaKfnJ2alYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWyo7fLu5uUqquhmJaYmpudoJ6ZnJ6TfnFlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxuKq7zq+jnpyWk5ecnp+fnZSXmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAycHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLmvv8qhl46NmJWQk5KRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr24t8Osko6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/triwkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkVKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubSukY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLa1m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtMSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTHwMbGxMTLwsrLwsPAxr+5u7rJtrO6u7SzqpGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS5u8K8uLa8xLe0t7mssJWDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usG7vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLFsbzEurWut766r7G0raGEh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7PAwLLAwrurqLO4taavsKaKhoiAeXNucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednJycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy2wrm1vb+0ub25qKSvua+lr6yZfYSFgHlwcnRxaGVkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6/uL/Aub6/uLi7taWlrrmkpp+iiIB9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usG7wb/AvLq2uLSkpa+zm5+Hl4iAd29kYmdpaWZnaWdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQq6iwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLzGusDFwry9tbizo6iurJqWhI2DfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGGkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcn6GgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLtK+7w7vBw8K8v7G2raSorKmbk4OBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLfoyQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKefo6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrWztryxubrCvL+vsauuq62omZ6Fa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKiclZWXm5CSh5SOjIGLjYCQipKSkaGan6KVlJiYlaKlmYyYpKaopqGgtLKnsrehnaK3rKmtpLKyprW7taursaOIeHFsXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysa21oau0wbi5rKipsaysnJOje15gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCin+KmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3d7eio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKymqpSirL22rq6dpaqqqJORnnBXV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZOdlIOWjpCPg4Z9knhyb4WNfomAkI2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2op56XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKmtyKymoZyFmaC4q6WmlKOioZ+UjJNnUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaOem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEZLTkxNVEtRUU9GSEI8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestb+qoZqRgo6Yr56gl4udlJaSj4iKY01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cWdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qq7SypJ2VkZeEkqKVm4qBlYeNiISFgWRLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm1sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6ipsa+xq7y4rLu+ubOtqJuxp62ckJadp6umo5qckoeUfY2UkZN/eoh4g4B9fn9kSkZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42IhIV6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5WWmZeel4yDiZ+RipKNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKjmZqTlo51kH2EipCOfHd9c3x3dHd7Zk5FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH59g3RmZXR+hIOFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaJhoCQh3VpaW5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY+RjZKJc4iEd4qPjH92d3V3dm94c2lURklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqSdmx/e3xtcW1wf3pzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3lwb25qXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iQh3aDhW6Xiox/eXp7cXt0fGtvXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGEmYSbnGGGqp+dioKQjXp2iH6JiI1zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXd0hHpwc3l3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1bnFyZWZfW1pdU1tmXldRVVhcVkdKS0RMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEkI55g4J0ooaNf3+CgXODgX1semxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoKFcYSFR2uAd3F5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnFwalpcXFtjY1hnZVxVUFBXWVBETExGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxgZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CMlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn6AcV9cYl5ZZmpca2teWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5F5gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdmXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0dFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNk9rInZZzVpeIj4icj3yGjI+KinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSURFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRYmRXenVxgZR9hIaTdoZ+gIx7v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AemlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlWWndqcH+PhIGOhW56cniHYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu4tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfW9dYF9cVWBdaGVSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afXdpW15aWFtfWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamlpYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOmp6NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEon9sYVpbXFdfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5GLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW08zU2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcG1gXl1WUldRW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXRsYltYUVNQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrJyimpqfpp+frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NbY19jX1NvX09nb1s/b2tHWyNXMk3Z4ZmVZWE5RUlxHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uGgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKilpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4dmRmYl1SVlVUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KdkZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2Mm6ScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhYSApIaKi7iYnZGUlqGmoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVoZ2NUXllST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGOg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5bg6KRgo2fk5WMhoiMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZGRaWlZRVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGxkGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKKImZ6VmomPhpeYioWPjYF/ho+liI2TqJqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWlqShh52ako+KkIqXm4mLlo6HfYyYnomQkJyamZOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo66wqpqZnJSVkZefl5q7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJKWjJCVjYuNlpiTnZm0l5WrnYqclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paSofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q6tsG8rKmcsqWkqJSFjqnEw6SCi4+HiISGlZSNeoONkY+RooyMlJKOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HKyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXmFjZKQnp+Tj5SMj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqKalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77BuKzCw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbO/uryur6igqai2ra6psrebnq2ip6Geq7e4qqWvv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9h5GZkKqZmJOTj5KWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpqK+vmKOvpKekpbXAsKystL7DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI6WmoyxlZualZKSmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmq6utsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+urOuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlJqgoaiep5+ZmqqZoaeemJCNkZ2DbnaSo5qVnaKdkK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJutqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNhqKfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wcLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KXkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKShlJ2inaC1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5SZqqGedV5aXVxJR0VGTFBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/DyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk1LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVpLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYVZLopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7S3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawqypnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJbTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKnk6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r77EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaOTr6+spaefkqGelZ6PkI2VnpqinqezpqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUtKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwbSrtaiwuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKempqblpeon6CYoZ6usqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTU9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC5qbakrLutwMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesubDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSss6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpVQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sby+vrSorrG2nparraiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLSywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkZ2ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLm+ucO3wLmxtKypura6ub60qa2wtZiYp6uqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtK+up6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YEVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLitCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y2vb+/t768sbytprq5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKQlI+cm5eWlYiWkJiap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cSk5jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5r7a2v7yuqrKxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmsrKWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnJqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fHxcU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLK+wcK7vre7xKest6uyt7u/r6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6mpp6ypqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaPlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmJRc3FcSzuEfEU/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKsraukp6qwqaeosaW0rqqwrq2ysbSstLykt7OsrK6nq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6koqukraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8C7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoqqirp6CrrKm5tqmqqamiqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaDioqNjY+LgoWUopqNjJmQkZGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLWopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6mjqqGirK2ova+srqyiqKifrJmQsKGYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYCLho2LkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5kaoB0Z4iMfVNYcF5Kd3NTZFRRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzuqy4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKiaqqepo6mepKmoqb2stK+tnaqkoK6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAVnpsVGJQUVhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upp6GpnKSooa27qK6wraCro6Svnp+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh7fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1BRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLq9t6i5t72qo7Soqaqxrrqxqpy8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqrqagppijqaCxuZ+jsK+hrKGtpJympqmampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKfmhYWk5QTEpIUFJQSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9YVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrC8wrmou7q3pqe1qKirsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hn6KUpKSit7ChprCrn6yjr5icqqSonpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OHi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR3xdW1hPTkpISFJVRjI6Xl5sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxXlMsMpajopiVnamepqGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G3rL26tKWis6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZo6ecpaaUmKGzppmepampm6GglKWfpLmopKetpp6loaiTn6mhoaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIeRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysL3At668vLGkn7aspqa1qauvoaDErKqnsbSrrLS6nqipq7GlmJ2qnqilkpqmrqOYnaSqoZuinZegnae2pq+praGhnp2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1sY2BNZ1daYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BjRiU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxaGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p66ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFgU2JoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIY0InNJOinI+OsZ2blKGaqbKwn7nAtqCzwbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxtraxs7a7p6mftqmdn6qjqq2dq8OZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknZmpo6WVmqCdkZyjq6qpup6npKCXmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0M3RFRnXUpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2E8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom6++lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppybp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ11MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVfNzAojaaXhJ2snZmZnZ+rqqiqv8Ousrq8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CkmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5XYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+tsaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ2oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXU2xjWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWCraelnqOkqrG3rbS9vrC2xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnrCol5yioLSzoaqboaysn56al6Cjqp2ZnqWhnZqhp6SQnaObmKGgrJ+lpqCaoKGVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1NrZ19MS1xjWFxaQj6wd1dYQSNNaEZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGoj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hYN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyikpixqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijno6soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rum6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpJqdm6mflpWYmZKTo6qhmJOnq7CloZaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2ToLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqOZnpWlopSUnJqSlqOmm5SQp62vpaCUmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe4CLnXlvsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RklfQzE9N6KcmZm/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOi6mwr6adlpqnpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHSTmH+yaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpyduqKcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+Rk5Wrtq+mmZObrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn7Vlpu4eYmRmI2XiYynh3mitnR9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrZmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGam5eVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolynsG7vJl6gbKocIB0kbmDe4aGioaNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrOrqqisq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnqOkoouSkqacpaudlqmlppyaoamnpqOooZKsnpeinpeWmJ2ej7Cpk5ynoo9rfmmcqHmIc36bjnV6ZYd7vr/Aum6SgnGUhV9yalpdmolhZIeOlWtgf5RjbZt2YpRrgJqVlGVeX2Jxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKGfqqKarpuVpqCWlJ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeTkIOJtKmNhZiVjoqMmJaHk5WJg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5mrnKqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio6Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhYWakYaFiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6UlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJiknpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5qZ4yXkaJ3a2qLmKKemHJrbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnYycwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGNeZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvqqanpbGroKuYm6KgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScraiRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtrKykrKawqqGnm5qmmJyir5+hn6ino6Whn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq2jq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6Wlo6GqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6iqqK6rq6aio52ao5Wfpqufoqagqaijn56wrZiblqinr6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqpp6OhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5ee6hVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKsoaOfr6Oem5OqpLawrqCpm5yXlaajkJqip5+gppuxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqehoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKaqrKmmoKakmKujn66rnaahrJqeqaWdprWfopeTqKu2sqybppyglpClrZKanKaioKqmraGip6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKympZ2ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaWvrq6ppp2lpZqjp6CyrqKpp7KgmamklKO1o6OVl6KqtbmknKOdo5OQobKZnpumpKCir62co6iitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGso6WXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGepqGgtaeiqaewo5Sro4+kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maCqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKGkm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBvZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46apKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqhop6pqL2kl8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrIqEsIWmmaOhopGFoFtsaoGzYH+te3qCgLFsZ22Zl4uIsVp9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylo6SipKm6nqDGp6Wpoay1t66vqKG9r66ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpipL+9fX6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtlamliUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKrup6pxaOhsKSrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9ub3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomVlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2VsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYlI2XlaaTnZanopmvpp2irLmfsMKopLSmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZKqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjYuSkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqJ+MkZ+jrLCaoaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjI+NlYuBfmaNh3WHdnmIhHScaoeRlZWSiX2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kXnBpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZOQjZGWoYucnKednrejf4OvtaKwsHSkv6SyoHh7oay0vZZ3rqWgioCpfmRcYnafjqOdg5Z+bpS0nKOor6ykZZ+glHR6mpdwgJmpmGyAo6iKZZylnJCXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV91b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrifoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmAi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGoJeZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkeG1pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOpZZnlKR5tIyfn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1gYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgap0TKp4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnudjHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSiIGAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpwMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkXiLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIi5x9lZ+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbTRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFkfGlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG5xYGRlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHiceqqZf6KPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhplvkoKtfKODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFFQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqZqTkouFiXmDdoiAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi3+MpI2Vg6+ilXa1trXJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15pdWp4h2ZrZ2JzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJentUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7ltj4qiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FmYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYKHlYqJlpmCfIiFlqaQgaGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bXylr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uZ2xTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkY25zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e319iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gHmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYgoGbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6CLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Rjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH5vhYmEe31zfnlyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiHg36Sg4SGioF6gIOLmp+PgqaghniNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdj42xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJyio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZipoJyTnI6NqY2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yNhpuFhY51gYx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1hamh1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/b4uKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmPkKaMj4GbkomUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4OJfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8c39qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KdoJKYjY+hjIuDl5iDk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY1+lHmMiX2BiX18coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9fop/fpeElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmaGTlYqMnoyGgZOcf5OTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeYh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbF95dHhwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXVteXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGinqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+RhpGRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpOgkZGIipmMgn+Sn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgnWJem+Bf4GIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXW9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmRpZ2VpZ4B6d3VujoVzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZCQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknt3inVxi3yGjXuLh4WKj5yliXyEdoGKf3d3bGl+gH9ccXJxb293WV1vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmFda21kYmZrkm1gZmZfZ2uBdHFyb4uAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J4gHZygnmCoIKRgZKRl5uRmHeReoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qNj4yLj413e5ORe46LjZKWjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIl4yAiYd7lJFye4ZxeI57i417iX6EjpGfn4Z9fXiBinx2b2hqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZnN1aHFsYXdlXVZlYGBxU1BOW2VkXHhwiHteXGhxYmJlZZFpX2dkW2dvfm9rcXOKfXZ8hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZWLjImLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIGNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Baml0bmdoc2xTXm9kcFpfbHJ3ZmtrYmd4c29xY193YGFVa19edU9NS2BlY1x5cYp0XFtldWBhZWSOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5OagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbW9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjVm5aXHdMTExjZWFddnOKbVtcZHheYGRlhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWMf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyTkYGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiFiIyGgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl1X1JkcWhmU19wdnRgb2BcaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX57dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4OZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkIqFe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4iMf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdqaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXFlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmRnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5VvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKCiINugHdogIR4cn+Ag4qHfGV9foR2Y3BzgGl4cG91mY2Gg4p8dniAhXqDa1xyf3OCiYeKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaV3BsTldxc2ZgS2x3dGFdW1pZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWlhrZVpjcHlfaFxeZWxoZWtpcXd/iG9sf36AdW+Cen+Cf4J/doGEiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKVjH6RjIt/bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2IeXtybYmEkYWMc4J6gJeMjIB1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XWVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWBgY2ThHCAi253fYB7e4eSiX9oen1qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnN/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFwgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan17bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRf39+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx3hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4l4eXFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hcIJzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x0eoWNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhXt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH52gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYKHgHVxf4aFjoNwcHt4dnV6hoWHjIV6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F4gYR6fYt+d3dydm97dmVqb2CHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt4cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF9dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeHZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJthXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR8fYyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR8gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa2+AZ2tgaHl4anN0c22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1Tcl1KTVRaZWt2emVebXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXZ/gXmAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH6GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6Gbnx/c4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d29yfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+f4GTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZValBJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGppdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlOSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg399h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygY2LdndseoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenhrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFmZ3RcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKCeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGkpSUlJSUlJCPj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46Mjo6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYuGjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKi4aOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dDREVDRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMSktJSEZFR05HT2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS05MS01MSElPcHCAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT1FUT1hsc3qBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hLVHBlfIOEg4KCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkRdfH+CgoKCgoKFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP2aDgoODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEd4ODhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REZJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4+Pzs/PUA/Qz9LfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz5APD8/Q0JFQGiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT0/PT4+QEFEQ0lUfoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD06PT88PT5AQkRFTW2Eg4SEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDk/PT0/QUVFPkNFQ0dMdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QUFFVUxCSUpHS015hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVEREtXUUtQUE9QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lKT1NSUVVWVlZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1NSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaWlJTUU9SUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7enZ5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx5eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBQUlFQTU1OTEpMS0xOT1BRTE5OTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZKTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktLTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE9Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QD9CRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A9PD06Ozo6QERBP0JDRUVJRkpKTEZJSUdGRkRCO0JDQz4/QkNDREdMTkhLTkhESERJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFRUJCQUVAREI+Pz46Ozs9Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdERUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRENCQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJHQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSEtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmhjaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhJSUdISkZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0NES0RESkxLSUtMR0dOSkhKS0dLSklKSk5MTUxMTElNTExbc2JkcF5sbFVNTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLR0dLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKT1BRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZESEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURHS0pKREVJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVDREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJhYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGJhZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmFkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9OVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBJS1F/UUl8WVlyc1dQbUhxbm9hVlJycXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdmBZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZ2tRck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fW9+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym93UWRkSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofGlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUFFTUklJTU5PUVJQUFFUVlJYV1xXU1NRUVVVVlRaUU5SUVdVVFlWVFlVU1FVU1RVWFlYXlpfYV1cWlpdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1VZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1FUVFFRUVZXVVlaW1lTVVJUWFdXWVtTT1JUV1VUWVVWWVVRUVdVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNSWE1PUFFUWFVUVFNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYGNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVRUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNXUVNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV1VVlpbWltaWllaWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYaXFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6eXp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3p8en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn1+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKAgYGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaFg4WDg4SEhIWFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoWFh4eGg4B+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhoeHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFh4OAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoWEg4SCgYGBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4WDiIiDgYGBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOKjYKCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIeGg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf31+g4ODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB+fX59fH1+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjY2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGTkYyMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNjIyOjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH6Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyKiIqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fX5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChICCgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH5/fH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoWGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCposqurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyc3T09LS0tLS0tLS0tPS0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1dbW1tbV1dbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9GdkLmcvLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6yspo6AjcafmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GeqKGJrNa6mKGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnaSqrJulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6tpJyVqJCahZ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWraezq59/n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TI2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCXj6Cfn5iolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybrKWrop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8+pjo6t2MKPjbvV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1L+/1dLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ozw5Ozs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY0Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXVlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSUdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BP0pCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtq6mur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2s7S1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTExCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2srSrsrSuqquvsLKzrqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpKWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqa6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJqakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSpsa+imZydnqGZm5uamJmblJWblpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir6+sr7Gstqetsa2mprCuraywqKCfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmZ6coqKgoJ2in5+en6msp6ypqrSrq62rpaWrqKqsqqWgnpmSkpSYmZeWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKeompmdmqqnn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZyloqSjoqqvrKepo6ChrK6uqqunoJ6eoqOen56anJyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8bEvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6/uLK4vMTBwbq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzyMTLysrOxcq/vr+8wcfEzMzIycDDv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSsm5aployWjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0s3Lz8XJyL/Dw8jOzM/Qz8zKyM64t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLFsrapoqWmoaKrtaeasaCYnYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdTOy87IxMnGxsjMytPT0dXP0szSwbnFsqWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqrMOnqamhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzs/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0tHP0Mq9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp564trW1raWtrr60scDZ0tfa3NfPzcvE09DCwrKrra6sprOyuauyvMaioZyWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rEx8DFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaKZlpGVlpKLlI2akZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzc3QydbWxcS4sraqpK6submxssSslo2NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/GusS+xsm9wsfJzsTCx8DHzcfDy8rLz8fDw8/IxsHFyMO+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/scHKx7q9qrGyp6Wdop2YkJqQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3H0NXW2drb2NDK0NDS1MrFur6+sKi3q765uLOlkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz83W0NbZ2NnQzdTOz9DLxLjGwba1vLHAtrqtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcG9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73LxMHFwsbIxsjG0MbCzMiyx8rDzs3BxcPAvbO3sLOoqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cfW1dbYzszQyM3IysW+ysGytbq3uravkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wzu77AuMe5tLu2wMK8uL3GwcO8ta6ytrq+tMW3u7WruLy9wL2wuravtrqyxby2r7u/tLa0xb2+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwsO3w769trm+x7+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/IysbKxsTAvc+9s7i9ube2m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxq7W5u7TCurC/sb29u7a8yLnDt62qqLCywLa4vK+wp7GztLu8q621pq62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8TDusTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szExsHF0MjPw8THwcbGxcXMw8rMwsTBx8C6vLvKt7S7vbW1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RiYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6iuuLS0vLizvK+4ubWyvMGywa6lqaKrsbKzqLyqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yri/xcC8zLrDxsW6vMO9ube9xbi1uLuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSttrmysLq5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVlfSE5oT1RIRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8e7tsPGs73Fu7avuL+7sLK2sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLO1rrO1rrCqn52eo6KypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKurrCu7XFuLXAwbPBw7usqbS5t6ews6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKivs6e6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrG3sLq2ub2/t7KxlIV5dWVfZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LnDx8C2vL22w7q2v8C1ur66qaawurCnsa+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnZuaqqavsKubo6O3qqCfrqi2qaanrbCkt7Ckt6Cim5iYqqahmqy4sKKhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb+/ucDBub/Aubm8t6emsLulqKCkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbGtrLWeoJ2VlKmhopSssbGeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcW11YTkxRR1JhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK7wsDBvbu3ubWlprG1naGJmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCcpKqdp6GerK2pqK6toqGilJejm5yPq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Hu8HHw72+trm0pKqvrpyZh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmJugnq6Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcoKGgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOjoqytqqirr7O4sr21s6uvmIRzc2hbWVlSVVJGWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTU3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xLzCxMO9wLK4rqWqrqqdl4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1dXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJKSk5Wnq6WamZqdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q66nsLSwubXAsa2xq5B9cXJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72yurvDvcGws62wra+qm6KIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKeclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVlJiYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy0w7m6ramrs66unpanfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCPmpyioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCKmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyY1ZNUk9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMG4r7Swysa5usLPx7+1r73Dr7HHsq2nq5Wkrr+3sK+fpqysqpWUonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpGPg4Z9k3hyb4WNfomAkI2Pl5mYk4qPiZyInpeHiJaemqGgl6evqa2pqJ+XrbSipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBurG1sMnDubS/z8C6sbG4xKuuya6no52GmqK5rKanlaWko6CWjpZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ4iH9gSlFueIqShHyEjImEf39ufn+Ud3V2eISNmXBRjYiKh3x+eJR2aHeFiH6KiJWKjZCSlouEioiUhJqMgYSSm5aenJSko6ippaOem7CroaSkkKaqlqGqnKKmqIh0bGVeW0hRUVJNSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5t6mqt7ittsCqopuSg4+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho+AdX94c251cHSNjoF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ2WkpiGk6OWnIuCl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZudnqKdlo2KpJuPnZeOlpiPdm1sZWJaWFhUUUpTVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6ipsa+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkZWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2VgEqSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfm1obW5uV1VXVFFRWk9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voqyqqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qTl492kX6Fi5GPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmpF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nZFdRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6yn6a6rquysMOyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3Z5d294c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3lwb25qXlpcXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7Bs7vBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cnx0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+dioKQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bnFyZWZeW1pdU1tmXldRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKugsamvwLK7xrqWj5GUiHqGdmuAjJKDfouFkI55hIJ1ooaNf3+CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUktphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIh62wr4qAgJOKgouChJGph4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd35+cnFwaltcXFtjYlhnZVxVUFFYWlFETExHT0lERkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpehnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WIiYGDiIZ5iYuAdYZ5X2NXTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxfao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQfHKEnp+RnX52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZWPhomIiImIoqujlomOmIB7gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFNRSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+Lm5qknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKcjoSBgoyLgoqOhICLgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbnWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKowcOuyK94upSafIyhnpiEk4WCj6Gfk5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramt9fn5/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgIGLjYmGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4J9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8nRz76boHBpq6mfhJOShZyhmpqap5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkpqoiJeQjoGIbHNzfH16bmZeW19eYWdkYGdnXFJFS0tRT0lKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGkJCPgoOAiYyJhZOFg4aJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jEv7elo7CyrK2qo4uWmIWmpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN8ZV5mWmNgXWJjXmZnX1tPREpIVE9GSUxGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGBc1hfYlVkYGBiX19mYFtVSkRFTFZRSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRYmRXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XUF9VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6SupLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AemhVYF9WaGNpZFZbY1lWVElIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eCjpaKgYSBint8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby9wby4try8t761urPGYXWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+wLy8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG9dX19dVV9daGVTWWFWUlZJRUZOS0E+SEU9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Wi3+DgIN5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVVLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7t7q2ubm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDpJ2spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr7BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW15aWFteWGJiUVtgU1FLQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXlpZVEhLT1BKS1FMVFFITEFKR0tQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OJkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbXFdeVlhkWU9cV05RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4b2RbYWBLUFJVTllfUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaisr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXN7vsuaf42yhHZyhXdpYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoaSkZ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8yJcG1gXl1WUldSWk9KR0pJSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXZ5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWzoKKln6GpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4OqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRsYltXUVNQWFVFRkpJRUU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5GejH6HkoOJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgnFuYz1eaHJwcXBueHeCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk4+uq5SVl5+Ypq61vKmtvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V4ZmVYV05RUlxHQkVJST5BPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4F3hqKQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCWn5OSl6OemquWkZGLjpODjIWJiYGGkJGenJmJhYuBhpd7iImfl5CJjoqLgnyhiZCLvKGYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hXt+gpGKhYZ6hYh8dn51bX19h350f5KekZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZKOjpGMf5CPjouEiZOWmp+fiYyUkp2Rg4x/ppmIhY6DhoSApYaKi7iYnZGVlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZeSjJOUhoCLiZOOioqdl5mjooaTnZagi4qJjp2Qg4iPgIOHhaWFi5CzmJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29td4t4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eWmISAj4uZiI6QqpeXpKKImZ6WmomPh5iYioWPjYF/h4+liI2TqJqXlJaYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fIWHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlZmGhJGQnHWRmLOWl6Whh52ak4+LkIqXm4mLlo6GfYyYnomQkJybmpOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7raiyvbClrbOzqKOhsKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq3uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNlpiTnZm0l5arnYqclJKOkZKMmZuKkp6Qi4mWn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbStq7O2jKizra29q5u7paiturirp6aioqSjqa+ysaudnKSZm5iXn6KmppKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcXBfWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrsLy9qq6ro6Oep6uutLCqnKCqnKGclp+wtaiMo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+djKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOgoJikn5qgm6CUmJ6lpKampK+upsDEw66ot7bJw762z7LEv8S8s9HKyMK0cnZqWlVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaompqZur3HyMnB0snKws29wrOtvL6ou8C9u8O3rMGprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2uLCslLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qn5GlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpaOipZ6dppielZebpKOpp6KyrKi8wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p3X1ZVWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPNzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psrebnq2jqKGeq7e4qqWwv8Wyvrq0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlqurqaebn6aXmJaYlaGkqKWftququrvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1hVU1NNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qin6++r6HHvMTEx8bOzs7Syr67trG6u7y+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+vmKOvpaekpbXAsaystL/DusC6tKi6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boaCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSurqulmqCllJOYmI2coKeimrSpqrO7u7uqsbLHwLmmrKutsrKjobKytKRta2NaV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKosJmRl4eLqJaOiJOFoIiEnZePnaGbo6W1ybWpxrrCw8jKycjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubSzxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqq2jo5+kqJGRmZyHlJ2inpaxp6mruba9srKuvrm2oKOnqKWmnJutqamLYGNfXk9KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlZ+Mk6uckZKTiauNhqGejKOtlKOktsa+tMC6wsLHycXCzsjCvrmyr7m1wcLKtcWywby1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbyorb21uL7HvLe2uMGyvsG0qrW3q76lkKOYkqKgvZ+JmqCZl56ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5eJjKSilJ2inaC1r6Wkk6+rmaqqnZ2jo6iQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXlxJR0VGTVFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJabm4+qlpWnppWtrJiiq7bEwry+t8HCwMfEv83Gu725srC5s7/DyLW/sLy2ubampKusraGhmqqrxaKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjn5C9pKmeqKydnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylnJWxp5mupp2ZqZ2fjZiUnoOOoJqbkqWkmpirsbWxqqWqrqybmKCgko+QlaielGVfV2BcTkhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCTo5+WpKCmqayYtrGiqrO2xcS9v7W/wrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6quoKWpra+ipqi9taaxvbm3tsSztLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqioq6Oawqypnqyum5uemaagvaGdpJirrKymopqNmp+TnomOV3+Wn6WhoLiqppOYtaOesaCfmq6WnY2Yk5yBjp+XlY6ipJaQpq2yqqmioqWllZWdmIuPkZKknolfYlhiX0tISkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6foZmexKilorSinbOok6uloKOfrKmsnbuwqKy2scfFwcKywsO9xsS9xMm8r7C2rbC0r7/EtLmxsLm0rJmosamqmp2loafCrZussZyqo66xqaSovbant7u+r7fErbSzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6QkI2VnpqinqezpqaMmLOboq2anZuskJ2TlZKZf5Ghlo+Nn6GUi6arr6SmopygnpGRmpOFi5GNm51/X2RaZmRKSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoqS1qpazraehpLKsrqm7sq2xtbTGwMTDtcDEvsnEtb/IwrSrtaiwuay/xLO3rqy2uaWYqrKrqpifppetu7SbqLCbraCutLKnq7mzqLq0ubO5wKq3ssS+tceov6+utrWpp6yhmJeSpqWiopiYpa+4rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblpion6CYoZ6usqKmjZeumKSrlpmeo5CajJKWmIWVnpSMj5ydlIuoqaqhp6GYnpWLjpmPgYWUiJOed2JnXGppTU9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7pKOdoqa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6mssbqilK2xrbKWpKeRqrmqn6axnaugsLSzqqm2tq29rbSzubitubHDu7+/psSrsbevqaurp5+YmauhoqGRmKKxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ugoJuepZyil52js7Can5CTpZqfqJmUop2Ul4iTlpKVlpyTiJCamZSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjYxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKqsKyksriqpra1rKCttb2vs7i7ur63tsDCv8jEucXCwL+4xL3Bt6+1p6u3sry+vrSorrG2nparrqiul6aojqe7n6Wss5+sorGws6yqtrS1vq6wsbWssLSzwbvGt6y9sLG4rK2qo7KmnqWqn6SXkZqgs6qzq6qzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKudlpeElJaKnZick4qNlpeal6alo5+dlpWXkn+PlIV7jZKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BLTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelraqmr663qq+1u6emsbfFt7G2vcHCtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZiYp6yqrJurq4+rvp6srrKjq6CxrbOurrayubiqrq+xqLWvtby9yrOqt7WxtK+up6G0oJuoraCmlpaamrKiraCmr5ehpJqak46jpaizqaGms6yrtqWvsrWvpJmdrKeamJ+amau3o5eTkY6XnKGXlpSqnZqRf5KXjJ2cmZaQipSTnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqq2mpK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb+/t7+8sb2tp7q5t7bCtqussbeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaijtqCgp7GhpJScmZWxnqecoKqOqaOem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCck4KQlI+cm5eWlYiWkJiap5ykoJKWkZCVdoSPh3uEgYOLimxvdnR7flxLZW1cSk5kXD9ie0dJOEdnV2VcTF5jTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5Gapa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OxnKCnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnZybr5qjo6Ojka2fpKCgoqump7mkrLW2pausqa2wtq6inqOpqpugm5uSpLSZjomNh5ChoJSMlJyfkpCDjZKSnJqXlZOHl5OVmaebn56MkpGNkHZ9jYV8e3yGiYhwcnF9fH1cU2RuXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpamls7WytbaysqGrrr3Muq3AusextK20wsPSxca+wLK+wMK7vre7xKest6yyt7zAr6uxrKCjp62qqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypqLKmqqSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeUhpaUk5eknJycipKQjYl/foeFfHZ+hYSFcnFwiHVrX1lgbmJRc3FcSzuEfEY/V3RYYVpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKtraukp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6quoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6jpqObqquuqZ2ipaSkmJ+blo+YnJKBgo+IhZyfi4qOi5iNjomCi5eim5GQmouTkpGTo5mbmoqOi4t9hoGBg3pzf4KAfHJ1i6SHeGteYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtOaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsaajrLGYq6qttqy2sqymrKqpvMDAt7iyu7Wmsq/EycvRv8C7ub++wbnBucDErbG1sbO6wL6ysK6sqquotqqmrq+qubCosrKvs623qre3p7S3q6ylqaqcpJ60s6mopLS1oLeuoKqoqqirp6CrrKm5tamqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6imqqOjmKWnp6qcoqSjoJmYoJGOj5iNfoeMh4OdnYaDioqOjY6LgoWUopqNjJmQkpGPk5+XmZaMioN/dIaBf394dIJ+eXZ+gIedj29yZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJi8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrrmuobawyMfI0cC+vbu7wb26wsC+v66ysrG1vLvCsbGzq7OppLWopa2zs7mxo664srCyu6u6sKqutquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OomJqopZiXmJ6PioeViH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXNzeWd/hqR2aV9la4B0Z4iMfVNYb15KeHNTZFRRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnrKSnpK2ntbOyq6Wxp6q4vsC8r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essra5s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6meo6moqb2stLCunaqkoa6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WTooyUkYuRm5KVh4l+f3J7en58aHh8eXRvcHtnhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Svn5+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjYh7fYuGj42LiYSSmJCGlKOJkpKHkJqQk4GJfXlrfnZ5eGN8enBvb3F2Z4BzaoRoZWdfbHONbGFpb2BvPVp5a1VeT1BRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPmVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaOfqKS4sK+kr7Cpq7jBubOtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srO/tLq9t6i5uL2qo7Soqaqxrrqxqpy8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qPiZWeiJGVgoyXjZF9hXxzcH1xdHRgenhobW9wbmh9cWN7bWllYl1lhX5fWnNqcUpJf2lYWk5QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaSiuKqxpbS0qai5xLWzrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbCzvrC8w7mou7q3p6e1qKirsa2zsaicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GUpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqOlomNhniBh4OHi42FjZOYjY+WmYqPl36GmIyPeoF6cHJ3b290X3l3ZGtra2hngm1lcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZ1tIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiprqG7uKWsvcSzsK6ita+tra+0xMS9s766t7Czubi6uLqurb+ztLivv8G3q726tKWis6uoqrOsrrKjncO3pqm3t6ufs7uqp6aor6uZoqecpKeUmKGzppqepampnKGglKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycmqKWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSOjpR7gpePi3d/fGx1cm1sc2J5dGhmaWdlbYRnZ2hkZmhpXmViaWZZZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6WnnJ6enqS1raequrenrMPAt6+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLS6nqipq7GlmJ2qnqilkpqmrqOZnqSqoZuhnJignae2pq+qrqGhnp2hlaCmn6KgmZyanJOanpWmn66jmJeflpWOlZiMj5iaqKCQh4qKiHiFd4KCgpyHioKIe3+EiIaEkISWlY+PkJGQkYyTe4OVjoZzf31neXBra2xndXNrYWdkYnN/YWRlZmVpaWJmb1peWF1sY2FNZ1dbYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoJqZoJeltLKjsr63obHGu7qwsKO2rKuuqbm+vbutwLKvr662rrO5s6erubGvrrO2u7avub6spp61q6ChsaWrsKCmxaGzprCzsLettZ6srqyuopmdp6qmn5Wcp6agmaWjqZyan5yVnZ6tsKa5p66ioZqanpmfo5qlnZefmJyVmqGTqZetqJuUnp2UjZWajpWUmKenjY2KiY57gXSCgouYhYZ8iYiEhIqMiJKFk5ySkZCQkZePkH+BjY2DcIJ/Z3luaGtqZ3Fya1toY2Fyf2BkZ2tua2ZqZmRsXG1tdnFhU2JoY2VaSUdMTU9ZUVBWYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2blKGbqbOwn7nAtqG0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2lsrWxr6mxtraxs7a7p6mgtqmdn6qjqq6dq8SZr6awsbe1rKyesa2vqqKbnaSsqZyVnKeknpmqo6WVmqCdkpyjq6qpup6npKCXmpqeoY9ro5aZnXGDl5ylgXaSrKielZeikoqYmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQgGeIgGh2aWZYXWl0bk5QamNmcYJmXmRmb2tpXVxeiZCFiGhPS0M4RVRnXUpIUFBVVkxIU2FwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxTmE8Ky+OpJqIlbGbnZOgnKuuq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKicl6Gmppycp6idk56gmZGfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1iI1pl4lmfnN5oG+Hh4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVReNy8ojaeYhJ2snZmZnZ+rqqiqv8Ovsrq8uMG/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaikmpmno6WZnKWqlpOjnJWUpKamobako6CkmJWUmJSciK6QmJWKqoyYo52GsYGlrp6Vm6CXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5YYU9WTkZVXFhRUFKLXFdbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaWzQxIY+nlIGnqp+XnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5r5yysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6ShtbqiqqigrK2kop2bmqOqoJibqaGfmJ6oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elpuol3GuoaR+d7p8bKGPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraH+ReHpqqDhKr1tYVG1jWkxPWF9cV1Y7TohQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraeln6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6Oquames7Kwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoaqboaysn56al6Cjqp2ZnqWhnZqhqKSQnaObmKGgrJ+lpqCaoKGWlZGXkZqGtZu1eYaqmraZd4ezm7d/lJeYrJd/a4GmeoGFh5GUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbmNxfIaAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YtMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kota2jrLalpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6Cwo5uapKi1r6Goj6mnqpudlpigpqman52joJygo6WklpuemJqeo6ubpZqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2yXh19StbTIhX+JfGOkM0KddVxQamhkUEBYZllkYUpITWtKW1NPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLquo7CyobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpmirJ6bl6musamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoJiQkpWQnYiybmi1cauIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1g5HS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe6rqSysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKqhmJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaKelZmWkpuFrHx4qHajj4uHqXCui4SohJqao4uTmouifZKXh66Ef4KzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2Un7exmbPBrKiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWntqyosbGrrbSkm6mgoKiitaemqqSZnpWlopSUnJmSlaSnm5SQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpWfnJ+gmJiclpehoJSYkaadh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFeq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTZKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6KdmZi+rZizwq6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+UqrGpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ6alJihoZCOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4umdLR6dbSClKaklJ2NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1pRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpucuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurp7ajs6iuqqGXnaigpau4naOtnJaZkKWjlo6doJuYnqCRk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaKXoJuWm5ehk5ypnZSQqpmH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qfobujmLHDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOemJ+akZaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5ufqaSynqOljqeilaKanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsG7vJl6gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeW15YouscHWFf1hbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/p5azwrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyZoKinp6OpoZKsnpeinpeWmJ2ekLCplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpdmolhZIeOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwqSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OamqKnrKKfqqKarpuVpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVjoqMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5F9gHWJi4Jygnh5dnWKgHuJanOCdIN1ZHd9dmtwemxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkZmoqLLDr5mrnKqej5aWqZ6rnJ6hrZihm5yhpa+moaSonqyZl6admZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohoCXloqEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kIGAiWt1gXmIcml0f3l1g4eBanRjd2VfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua+/rautsbKgqqayraKss7DGsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhZ2qrKO0x7OfqaSqlpaYmqeeqZygpauUn5+cn6quqKWjq6Gsm5+foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYJebIuKgndcZ3N3d5GAh4JveIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2ln7q9uq+ss7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnulrKKotMO3paKnr5+dlZ6jnqOdpKqokp+gnZ+qr6mqo6qep5umnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN7ppiYc6qCfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1rpbJvjYFvynp/m3eRg46Ad3mBgHlxe4CGcHiFi5N5bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84lqK5w7Swr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ2crK6oq6ajoqWfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfaeVm3Srg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKuWaPNbpB2e9t7f5lxfoiSdX9le4h2dmx+h259hZCRfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6cm62upqmom6amo6CqkqyzlqWiqqqepKenorKik5unm6GblZSRl6BxhoyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiIqQj4Nsj45kbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5afpqugoqagqKijn56wrZiblqinr6yop6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnZ2psaepqJuqqKOhqpuvsaKoq66mmqerq6uzpJOYpKablZKFpGqkdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIyLl46BbJiQbmx4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwrqCpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKW0nZqhlJuep6upoq2aq6ihoamis62iqrOyopyrqbCwuKWUl6SomZ2SfKpsnoSIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5yRe2+VkH1ueXR8em1bZWpycWaAal5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKqjn66snaahrZqfqaWdp7Wgo5iUqKu2sqybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXoZWXm6WlqZmunKumpJ6ro7asobG5sJ6csKi0tLWmlpmppJuhj4KdTniagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jpGilnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GyrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJ2ll56YmJilo6eYraGsoqSXr6W7rKK3tq6enrazurO1qZqfsaKln4eP0bXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2Vip99l5mHh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod4+TpJd9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKjmZWjqaetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2mnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOWmpqcmJqXpaOll6mnrKCjm6ymvayVvrCtn6OxtLuttqmdq7SlqZl7qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBuZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySm4SpxsO2wbSfmq2grrmmo46ao6Ogr66pn6Oena2Znrmgo6ugr6qarqGRqqmllomaj62wrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZmpOZmaWjopinqqqho56pqL2kl8Otq6OirLO7rbCpo7WxqqyZdq9+kIqchYd9uq2JmGSwjGWWrX2hj4Onl5yCrYuFsIanmqSiopGFoFxsa4KzYH+te3uCgLFsZm6Zl4uIsVp9tFykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl46nmYiVjpOUeXeMm31jc3xig3h0gHxhamZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Im46vrKmno6iZrpOaj6maoZ6lnpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpuSmZeonp+Xp6ylpKSipKm6n6DGp6apoay1t66wqaG+sK6ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2teXiivrt0gJWNpZqNmY6Umnd/j5l5Ynx6ZIxneYF7YGtla2phUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqems6adjJelv6m2r6ehv6amspuesZ25qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkZiYj5eTqJielqinnqimoaKrup6pxaOhsKSrtLWrsqyjvqqwsJx0dqqkt4VliZ9wZ6yQio9ubnelj5qggXaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvboOZcYB6aXBpZ4mWlZdxaGmFhmdwhmRdimNpb1pdZ354pmBico+ScGZkgI2SjqGWlZeOk5t6hY2TdGSGd2iManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrayspo6WraqQjIWVl62fpqqin6SjoJGLpZKnmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZGYlI2XlKaTnZanopmvpp2irLmgsMKopbSnrLGyq6+uqrymsLmXi6GppbWciZaimIapm5CUnZKqtJmbo6yitJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo6ckp6UlZOegIWTi3Boj3Zvind2fHlpbGVkb2NVYVhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam0paeRmKyji4iJj5ynlq2koZqonp6TlaOXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6rrLa8o7G+mZKmpKa1opKdpp6NqZ+Nkp+irbGaoaSyq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYuBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGRl5GfkJqTnYKGl4V4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBkT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKKxpKaxqZabuKWilJipnI6GiombopCvnqSWqKChkpeZm66LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednrejf4OvtaOwsHWkv6SyoHh6oq21vpd3rqWgioCpfmRcYnafjqSeg5Z+bZS0nKOor6ylZqChlHR6m5hwgZmqmWyAo6mKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKJhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnaI+NcXmhlpVkeJiFgHaXaIOJgm55f2pwZV92b2trZ1xlY2Fhb1JZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4udr5+oq6eUlrmfoI+cpJ6RfoiImp6NrJqklaeino6XkZ6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6no3ulsbqDjo+nn4SLhY+xqa+MiZaimnmAi6yGnJ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlZiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJp0e5mCnJqEmH6RiIGCmGmMjIRreHtxcGdkeG5pbGpcZGlpZXJbXEhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eppZmUrcW8r6CUpae0nY+DnKucpqKgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOp5iNnXyoj3J7d5yOppZolaR5tIygoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+Yl4COlJyJmJKLfIWTho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmNubGZsWGVGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6ipKmhlKOptaKvf6CmnKWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x3m5yOoJGInqOblpiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjquajJp+onaAmZRrgat1Tat4h42dkpyqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jHtkZ4tzmX15l2xdfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q66imZafoKWrq5+crbShp5Ggn5+mm5mOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqykh5yRipiomJmZkYelr6ailZmIiYBpboiHi46OiYuNkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OjqYCGrK+HpXqLfYSafaJwc5OHlXuejHlth5yMmpKdqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOSiIGAtqhkgca4fHCVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJvc3VxaW9Ya2tycmRbZ11hTEQ9RDVRQVpwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJigpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLkJCJjpOegZWbn5ygn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfXqgmXmjk3iAc5eIjJx9lZ+HnI6anaeIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnYJzqmeUml2bhXaFnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmVWYUJQRU83VkJSbjRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtkY2loZ2tplp2JqracqIljlZysu7Kwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJ2JlZCGi52RnJuIj6ihn5qMkYqAgGmBhnl/lox7iI2OiI6VmX6SoZ6gopOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPnp2YiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp+c6paXW97l4t4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9saHV7YmNfUF1WXFRWQFlFUWdFUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTXqGntLqzs6iaoouaqZubp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B+p2h3bX6Zc6BzcXydhZhvk4KtfKOEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqKPdWuPs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+DbGhmZG11d2ZfYVJaZVBRYUhXSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS36pr7K1sLKjnJiEl6agoKKMpKefl6mJmZeYk5mTkqCXjoeGe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYOOqZqTkoqFiXmEdoiAboGfhneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUi4KfYJ6XqW15loegm3Whh3egfpCWi4FvTGajknGbiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdmt4h2ZrZmJzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1LSEtOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2JsKiFZUCUobOsr6+1oqKPf5anoqGji6SmnJumgpqXlo2XkJCbko6Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG1vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6JjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlFSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZqhoYCVmJONmo+Ll5COinyGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiUoJZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian5uZ2xTVVlVYGBca0xcUlxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZ2lhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJapqp6op66jmYiBlqmZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhX6Xk3N1hnKRg25/i5KHhpSQfXuChZekjX+lpY2AjYmElHWCh5NvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1xfX16l5abhI14e319iJSVk4t3kZmhooV8f4lrjIVcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh3dJR1cHpvb4lvhYZfd2l4jmeCg4aPqpx/dH2XaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbWlnVlleVlxka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdpdWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giZmmmqiYg4Gbi36WlIeOiomMcoJ8jnx+j4R7l450coRwlYZ8fZKLhoaPhnl+gIaYo4x7p6CKhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOokXhxn5OEfJRwf6qHcH2VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiHF0a4N2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyDjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNj4Nud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Rtc3KDZlxtimtrYllYXVlYa3FbXmBZXl1lcn57c290Y2pqaXt8cnp3dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqKOhfYKWq4yflIeaoZCklX97mIR8kpmJiIaGinJ9gIt2hYuChJaKcm+AcpiHhH6Tg4OGioJ6gISKmp+PgqaghniOl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaroqinoZOciZmQfXqQkIapf3+SkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdg4mSimx9jnd3ZoOGkYt8iZ6Fh4uPiIiBhYSRd3x7dZukioiLoIyHln+AjYOBd3F1hoV/eYmIi5GnkYSHjoiDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXt/mKmNnYyFn5yKnZZ8eJSCe46ZiYaDhIdteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkYapnoNyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iY+Fp3x9j5CRhZipoJyTnI6NqY2SgJ6NiZSboISPmH+Ij4RweYZydWF/hJCHdoyYgYOPgoaEfoaElW56dnWUpIyOhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+Cg4mJiHSDhoaJem1qfH97bWhrbGdeeX5nfHx2dHZ1endcYHB9bXRgY1pbXVBmbVNlWl1hamh1en5wbGxjampngH9rcn9ranRud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t2aGmDZWpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ylkJuJhqSTipiZeXmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh32PgI+bm5CIppx/cIuLjJKGoKGKhYx8p5CHjpGWkpWSd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWPiKKBfo2NkHyXpKCgkpmQkKWMj4GckYmUmJx/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9oeHJ5jZqTkYCYf4mMc4OJfX1yenyMhXt7ko6El6aUjYaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Bam19Z25wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGlsYl9xVnRvbG5geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbfHWjn42Xf4yhioialnd7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSYen+OmJePl5qdpZ6alJWde5KIhXmHl46ff4KKjo1zl6KdoJKYjo+hjIyDl5iDk5aaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZvfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9f4p/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqBj5igmpKQknSAjpKUip2dnqeZmI6VmHWQkYtth5mQm3uIiZCJb5edmaKTlYqMnYuGgZOdf5OTloiainyLioJ6cnprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI50koqFeol/d3mBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbGB6dHlwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22LgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY6JiIySnZOPjI1uhJCOkYmemaKhmJeKl5Nwi5uGZ4iaj5R6ioWRi3CWmpOhkZKHiZiMgn+Sn32Sj5OMmY98i4aIdHN2a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcW16f5uVfoWJdJKMgnWKe3CCf4KIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXm9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7e3N5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadICplJGNhqCMlZOQgHN7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaMi42OjJ2KjpGEboqLj5GKnJahnJmWhpmJbIelhWiInoqSf4yEjIF4k5iRnZGQh4iUjX9+kJl8kY2QjpqSfYuBhHB2cGxub3F8h2pzg4+ZinF4gHWCiYN6Z3NvdoKbkH2JhXqVk3t4inVxi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9ccXJxb293WV5vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Zrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eMgHt3in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7dHVzf4J+pZabrZ+nloWMg36XlYOOnXSKn5OShYqajJWOjHpyd3SCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKRgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXOLhYiPiJyZn5uXlYGVgGqIn4loiKGIk4WShIpxg5GXj5qNj4uKjo13e5ORe46LjZKXjXyJfYFsd2pvbGxte39ien6PloF3eoF4g419emh1bXWIl4yAiYZ8lZFye4ZxeI57i457iX6EjpGfn4Z9fXiBinx2b2dqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZ3R1aHFsYXdlXVVlYGBxUlBOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10f3RfdHx4hnhzc4V8eaGQmrGdpo6Cin+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJl4OGY4yRmI2UiZaLjImLcHqViXyOiYuUkop6hn1/bXxlc3BrbXt6XIF5kI6Be35/gIaPe3ppdWt0jJCKg4eGfpeNbX+AcIKOgI6JfoR7g5GWm5uMfXd4go94cmxlbn2Baml0b2doc2xTXW9kcFpfbHJ3ZmtrY2d4c29wY193YGFVa19edU9OS2BmYlx4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkYqIfX6ZdmVzbnxlh39ub2uAWmtueXlyYHZ6e412cnaKdnqfjJyvm6CQgoV4iJR+e4ich4SekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkeHB8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi52Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkpCGdoZ+fmx9ZHh1am96dFiIepGHhnp/f4CGjX96ZnRrgYuPi4SEgY2Yhm2Dd2+Jk4OShX+Ce4GRl5SbkXV0eIeMdHJwZXN3gGBzbW9haHRmUmBwZ2tVX250eWFzY2BpfXFybltjcmFjVm5aXHdNTUxjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyikoR8cIyUd3iJnIOEn42OfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6fhIlhg5WPhYiFiIyGgIdofZR/fYKFio6PgnKHf4Byd2h2cml0eG1ajH2SgoZ9gIOBhIuDdmJ1bYqCkYyDgICTkn5vg216iJGIlIV9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl0X1FkcWhmU19wdnRgcGBdaIJxcmpXZ2ljaVdtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp9iZmIiXuff4OZf4J5cXRub2RyfmhmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHi5mGgZKRhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoH+IYX+Th4OHg4iMf3+CZn2RgH5/g4yPkX9tg32DdWxtd3V0d3ZsY42Bjn+Ff3yEgIWJgHFgdHKGfZCOg32Akop6coVne4WMiI2FfIV/gZWQkpSFb3B5i390bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqDbnNiXGdfZW1fb1Rab05ITmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFtaHpzlHNnc4d8cpKShJqfm5+Gh3V1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1elpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+HjI99aYF+hHZncHl4c3d0bGuOhYqBioB5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmEfYKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fIB0dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYx2aXeXjn6BioKUl4l5j5VvenRxbGlkYHN6aF9lcXpaYXJ8eWdxeWBlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koeBhJiKfIZ/eHeJioSWgG+LiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZGVhYhwe5KCfIGCiINugHdogIR4cn+Ag4qIfGV+f4R2ZHFzgGl5cW91mY2Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX1yb1dnXWZqcWBvTldoUj9YZl5ab2tnenFbWlhrZVpjcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fW9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYx+bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hnyIn5KNkZOUjouHf3uShnd+g4yCa39yaIB+eG18fIKLg3hieoWCcmRyaX5udXF1gpuLgH+FgHN2foFzgnBcbn91eYuEi3uIgX6JeXtybYmEkYWMc4N6gJeMjIB1bmt2gIB1c1tnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW9kak1XZlE9XWVcXXVlYHVwWllVbmNZZHF5WmhdX2dtZ2lraXB3fY5taYKEfnlugHx9gX+CeXSBgY2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHp4hH18a4yNhJueloyBgGyNfWtofo2Len5+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdm9shYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CHjYp+b4B3goN/jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCiIFyYHeBfnJkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnOAfn+UiYp7b25qbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoamdtbGhwd3yTbGiEinx8cH5+e4GAgXp2f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/god/g359em2FjIiZo42Eg3t1i3hrbISHkHh+e4KRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknx3hpKCc5CLh3Jyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB4iH1ra3RofIBpdoGMkZR+en9/cXx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbmhWa15haWdlbm5ocHZ6k21piI14fXJ7fnmCgYF7dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZXmRugHep2qnHhoeycYh3b4x0e4WNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbX2AkJN/gHmRk355fG6Kd4KTjYV1l4uSj4eFhXt/hGx0dn5sZ3ZkbXt2bWl3d39/fGFieIZ6aXV1Y357Z3WGjo2Ve3SBd3GAe31ugFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnp9dIuBfnRodGVui4Nsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVmpfYG5lZmtwZ3B2eI50a46NdX52eH53gYSBe3N9g4iHg29ygHRxdX6FgomNint3f3iDe3yGh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fXpdZXqAeGp2eGaDd2d0h4yOlH1yiGpvfoF5b31dWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWtncGdxc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoNwcHt4d3Z5hoaHjIZ6fH90i359hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/d76ue6C2bmFzhWhze3F4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4RvgoOTiXSWio6IhYmFfXh0cW5oeV9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXRldYWNhpZ/cIxna3uEdW51Yl1xfWx1fYx7gmd2h35ucWl2f3l/gHN+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHBmcnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdn17bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWJXXFxof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXV9dH58b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Ma217gnFndGZhbnpnc3iLfH5jd4R3amxydntxe3p0f2d/f4B5d29kZmJuhXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+ZV1nc2lmYFZkV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJvaXRvcn50dJqCd3+Ad4B/hoR6fXWChH6XhW5ydHx6dXGEhY+BgHqLdXSQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3V8enWDgYt6boRzeYR9goN2b2ppZVZdW1paU2JtZFtYYXN7amhtaWBiV19baoBqa2+AZ2tgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnGAcXR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56d2F3hYV5kIZ0iHJveYByY3FpXXF4ZXJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt2emVebXFpZF1WYVVubldLU2hXZl5YTVVsVEpceV9bXmtdXVpjZWB5aGxgb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtzlYF7gp+Gfod9gH6GgoCKe3aEq59/eoeHg2tygXl1gH6BdG6GbnyAc4qAanBuZGRYX1pZWlRhamdbWl91gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBogoV4eGdpamFXVllnY4+nbn53gIuOe3Fyf2l6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3Jrcnx+dXZidIWLfImIgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2deXFRLcWJQRlVgR2J2ZmFLVG9YSk1YWGdrdXpkZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYnhaXV9sWl5cYWNefmlqX250eG1wbnaDl3pygYB8f4mMhn11dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZma4OCdH5iZGpcVFddYmOPpGh4dIOGkXlucXxpem58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZHODkn+IhIl7d29yfnNieGRccXFicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFhUTXZfUEpZV0hidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNR2l1WF5gbFtbX2JiXIRpZ2FueHltb2p2gZB5bYN/gIGTiISBdnSIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeWg3yZk3mAgHh6foB0iIN0cJmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3Bxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWhxgpWDh3+FdnNqcX1uZndYXWxuY3J0gXp0Z3B+W2BwcmJga3J+bW11f3NyeGtxYVxlbG16YGZSZVRXUVB1W1FPWFFIY3NhYEdWa1FJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXl4bHBpdXmHe2uDfX+EmnyDhHl8h26Ph3Jvdnp9dIKCfIuPg4KXdHiClIWBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2p0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXZrbYSTgYl8hnFzZ3B+cXNvVFxna2ZydYF3dGNtdlZicmxbX3BnfmZtd35zdHNrbmFaZGpqd15lU2NUVVBUbFZQVlJQR2RyX2FGWGlPSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5hZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+He3+GjHSBhnN9gnZupItygY2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmFjH+JfIltcmdxfW5zbmNbYWlpcHSCdHNeaW1TZXFlVWNvY3tkcnd8d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyPh5GbhYB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlJCPj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj42LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIWJioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSJhoaHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeOiISFiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiISKkI+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MioqOio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgYCAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9/f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERUVDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dCREZERENBVnSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktJSEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01NSUZKVmyBhoWEhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREFDRkhJSEhIS01MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS09VZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZFZnqDhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo6Ojo8ODk4OTk4Nzc6Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEQFF/g4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEdoODhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw7Pj4+Pzs/PUA/Qz9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJTEdHR0ZIR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo+Pz5APT8/QkJFP2iEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj4/PT4+QEFEQ0lTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTU5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdnZ4ent4eHp6fHx+fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PT5AQkRETW2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0dDSEpHTEpGS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDtAQTs9PDg/PT0+QEVFPkNFQ0dLdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFFVUxCSUpHSkx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEtQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVVWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdPSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnd1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lHQkFCQD9FRkVIRExvcHZ6eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0xHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0dDRDtBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGS0NGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDREZMTkhKTkhESERJTE5NSElMR0ZGSUlMTktKSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1d3ZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz46Ozs9Oz0/REI/QUNGR0tGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURFSUlIS0lGSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWdxcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHS0ZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYW5qbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoaGdrZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQkJHQ0NERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVVlaWVxaWlxfX15gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpJR0tLTUxKSk1LTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQkNEQUFFR0NHRkhGRUlGQ0dKR0dKRklMSElKTUpMS0dLSUhLS05RS1JRTFNNSk5NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpJSUtHSkpPS01LSUxISk1LWmZKZFxLbFJHTk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1VgeHZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkZGR0RESkRESkxLSUtMR0dOSUhKS0dLSklLSk5MTExMTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3FOS3J5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURCSEhHREVLSEdLTU1JTExGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUVFMSE1NSE5KSUhOR0pKSEhOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19kW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUUtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHREVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmRfWl1gY19ZX2JbYF5bVVlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRUlEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREBHSEE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYUFJSU1xUXF1eXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUExMS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYl1iYldfX1RRUFFSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhMQkRBQ0NGREJBQ0RATEhCTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXWGRWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUE9OT09PSEtGYEVEXkxEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFVUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUUtJWnhdVHhkaFhRU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cl9gYGJiW2FhaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFTTEhneGxjeHFtWkpMVHlwdW11Ym52UGRkSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnblh1dWp2dXCAYXNofWlseHxvX19fY2JcXmRlZmlqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dPVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW58bHF2dXheX19iXl1fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhfWnB6e19genNjcm94cWhkfGlye11US2xfdnVsanZ8e21+eWt8cF1eXmJbXmJkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NTWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VRUldbV1hXW09SVFdXWFFdWFZdVVNPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSlJRS1FNSkpPUVRSUFFTUklJTU9QUVJRUVFUVVFYV1xXU1JRUVVVVlRaUU5SUldVU1lWVFlVU1FVU1VVWVlYXlpfYV1cW1pdXWBjXF1iY2RmZGVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFJSUVZWU1haW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVVRUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2dmZWViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1FYVFFRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFdVWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNkaGdlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlRTWE1PUFJVWFVVVVNVWFdbXl1cW1ZST1VWVltbVlFTVlVWWFRTV1pTU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVVZWVFdaWF1eXFxeVlNOVFZWW1tVUVRUVldYUlNYW1NSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFZcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFVYWFhTVlhbU1JWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWF9ZWVJUVVpZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxXV1dWVlddWE9VXFleXV1UU1hTV1VTUlNXUVNWVFhYWF5eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tdX19aX1xWX19aXV5ZXlZTWVhZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl5eXt4bm9vcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHl7enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH18fXx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx4e318fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgIGBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKCg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgIGBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4OChIKBgoaFhIWEg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiYiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoOFhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SEhYWDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4OCg4WJiomHhYeFhIWFhISGhoOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFh4iIhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICCgoKAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgYB/f4GCfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX5+fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foCAgH9/gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhYOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoOCgoKBgICAgYGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bf39+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgIGAgYB/i5OPjIuNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEhIODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp8en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfn6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg4CCgoKCg4KDgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYODgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt8enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgYF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f399fXyAgICAgH9/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fX1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYeFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fwd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4KCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEf319fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYWFhIF/goR/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4GEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFhIWFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYaGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn2BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB+fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+gIiHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhYaGhYWDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaGhoWEgoOCg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYOCgoKCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGh4WGhoeHh4eFhIaFg4GBgYCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGiIWFhIOFhYeFh4aHhYaGh4aGhoSDhIWCgIGAgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYGAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx+fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaChIWEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8PClLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q+pKCLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GbuJuHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7CbkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6qq6+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuZlqKarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA0YWVpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ+gn5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYw6erpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh83NkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTo8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njc3ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc3Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5uLOysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHExLu7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZl5KTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaWn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmemqqmn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqyrru2vrq6qretq6q4urS8rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2v8m/0s3Lz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGVlIyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7apqKihqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzc/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm56jp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuyzrmrn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOyszMz83Ty8XIz8zIx8rExsDFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2bkZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzMzPydbWxcS4sraqpK6submwttWhlY6NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsbIzsTCx8DHzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q766t8GukY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8rDv8O7ycbIusfGxMrAvcHLxsXDvcW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qwkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe5tLu2wMK8t73GwMO8ta6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2r7u/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwrKynnqKqp56rrLOtqaups662sLKprqassry6tsO5urqxqrW5u7TCurC/sb29u7W7x7nCt62qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+4r6iuuLS0vLizvK+3ubWxu8Gxwa6lqKKssbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSstrixsLq5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKeusqe6s6a2oaKemqOiraKhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56onJuaqqavsKubo6O3qqCfrqi2qaamrLCjt7Ckt6Cim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCtrLWeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2toqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6Wmn6OjoZSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZSloZ6SkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlpWHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpyioaOYpJahm5WNh5iajHONgn2NlpaFkJmQk46Oe5mOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQn5edlZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHiJaemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QU1JSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPREpIVE9GSExGS0dGRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5dX15cVV9daGVTWGFWU1ZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLSkhGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW11ZV1tfWGJiUVthVFJMQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbW1ZeVlhkWU9cWE9RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtUXlFcWk9PU1BPST5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIcG1gXl1WUldSWk9KR0pKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNsYltXUVNQWFVFRkpJRkY9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJxcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZmVYV05RUlxHQkVJST5CPj04Oj5APD5IPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4J3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGkJGenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9QD49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dn51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZOWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZOOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJKOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyra29q5u7paitubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+cjKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLws29wrOtvL6our+9u8O3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qnpGlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTEx8bPz87Syr+7trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIiEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+amqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzsjCvrmyr7m1wcLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG0qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC1r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/DyLW/sLy3ubampKusraGhmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pKmeqKudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylm5WwppmvpZyZqJyejJiUnoOOoJqbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY6ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilorSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS9xMm8r7C2rbC0r7/EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6PkI2VnpuinqezpqaMl7Kboq2ZnJqsj52SlZKZf5Ghlo+Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwrSrtaiwuay/xLO3rq22uKWYqrKrqpifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6usqKmjJetmKSrlpidoo+ajJKWmIWVnpSMj5udk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js7Can5CTpJmfqJmToZ2TloiTlpKVlpyTiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksriqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+4xL3Bt6+1p6u3sry+v7SprrG2nparrqiul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKqclZaElJaKnZick4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZeYp6yprJurq46rvp6srrKjq6CxrbOurrayubiqrq6xqLWvtby9yrOqt7WxtK+upqG0oJuoraCmlpabmrKiraCmr5ehpJqak46jpaizqqGms62qtqWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t7+8sbytp7q5t7bCtqussbeUlqauq6ijsKmUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLKnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5kXD9ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLDp6m5sLa2v7yuq7Kxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2fo6Cgoqump7mlrLW3pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaabn56MkpGNkHZ9jYV8e3yGiIhwcnF9fH1cU2RvXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKast6yyt7zAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStrLiysqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaTk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRc3FcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMLDur+zx8Oqrretsri+vrKtraqkp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4uTkpGTopmbmYqOi4t9hoGBg3pzf4KAfHJ1i6SHeGtfYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbnBucDErLG1sbO6wL6ysa6sqquotqmmrq+qubCosrKvs623qre3p7S3q6ylqaqco56zs6mopLS1oLeuoKqoqqirp6CrrKm5taqqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqQkZGPkp+XmJaMioN/dIaBf394dIJ+eXZ9gIedj29yZ2Zwd1xhc4hrT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqymrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wsC+v66ysrK1vLvCsbGzqrOppLSopa2zs7mwo664srCyu6u6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXNyeGZ/hqR2aV9kaoB0Z4iMfVNYb15KeHNTZFNRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essre6s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6ido6moqb2stLCunaqkoK6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyVkYuRm5KVh4l+f3J7en58aHh8eXRvb3tmhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGspbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sr24ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Sunp+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBvb3F2Z39zaYRoZWdfbHONbGFpb2BvPVp5a1VeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srPAtLq9t6i5uL2qo7Soqaqxr7mxq5y8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppijqKCxuZ+jsa+hrKGspJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYl1lhX5fWnNqcUpJf2lYWk1QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWiuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbC0v7C8w7mou7q3p6e1qKirsa20saicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGtramdngmxlcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqurb+ztLmuv8G3q726tKWis6uoqrOsrrKkncO3pqm3t6ufsryqp6aor6uZo6ecpaaUmKGzppqepampnKGflKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGhmaWZjbYRmZ2hkZmhpXmViaWZaZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLW6nqipq7GlmJ2qnqelkpmlrqOZnqSqoZuhnJignae2pq+prqGhnZ2hlaCmn6KgmZyanJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBra2xndXNrYWdjYnN/YWNlZmVpaWJlb1leWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGu7mwsKO2rKuuqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spp61q6ChsqWrsJ+mxaGzprCzsLeutZ6trqyuopmdp6qlnpWbp6agmaWjqZyan5yVnZ6tsKa4p66ioZqanpieo5qlnZefmJyVmqGTqZetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iYiEhYqMiJKFk5ySkZCQkZePkH+BjY6Cb4J/Z3luaGtqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXFhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7nAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqmdn6qjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKeknpmqo6WVmqCdkpyjq6qouZ6npKCXmpqdoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hPS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKquq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKebmKGlppycp6idk56gmZGfqKqjs6+joqOclpiYl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX97h550iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqv8Ovsrq8t8G/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaijmZmno6WZnKWqlpOjnJWUpKamobako6CkmJWTmJOciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5rpyysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6Shtbqjqqihra2kop2bmqOpoJicqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Okq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6OquamdsrKwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoauboa2sn56al6CjqZ2ZnqWgnZqhqKSQnaObl6GgrJ+lpqCaoKGWlZGWkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6CwpJybpKi1r6Goj6mnqpudlpigpqmbn52joJygo6WklpufmJqeo6ubpZqcmqKgl5OSk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2uWh15StbTIhX6IfGOkM0Kddl1RamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLqupLCxobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpijrp+cl6iusamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoZiQkpWQnYiybmi1cqyIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4ZhlohdWcqdb8CAdE1LtVNVxmRWUmpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKuimJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaOflpmWk5uFrHx4qHejj4uHqXCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5eIal2vd5Wfj3dsNXnIrrNgRFVvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWotqyosbKrrbSkm6mgoKiitaemqqSZnpWlopSUnZqSlqSonJSQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpSfnJ+gmJiclpeioJSYkaeeh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFtNdF1iZk1aYV9ydF9KVTVKmpFYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+Tq7KpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yWnqGWl4+snI+ubnK0dKmMd4umdLR6dbSClKakk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOtnJaZkKWjlo6eoZyZnp+Rk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaGXoJuWm5ehlJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaSfmZ+akJaTr7mxq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKljqahlaGanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyboamnp6OpoZGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpem4lhY4eOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fIpqWGx5gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OanKOnraKfqqKarpuUpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOCdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkJioqLLDr5mrnKqej5aWqZ6rnJ6hrZihm52ipa+moaSonqyYlqWdmZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaSqlpaYmqeeqZygpauUn5+dn6quqKWjq6Grmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+aIWKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJveIJ4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGnr5+dlZ6jnqOdpKqokp+hnqCqr6mqo6qeppulnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKqBfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+Ad3mBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ6drK6oq6WjoaSfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h2dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6dnK2upqmom6Wlo6GqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhYyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnp6psaeoqJuqp6OiqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKWznZqhlJyep6qqoq2aq6egoamisqyhqrOyopyrqbCwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXopWYnKWlqZmunKympZ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaavrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJyll56YmJmlo6eYraGso6SXrqW7rKK3tq6enrazurO1qZqfsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOVmpqcmJqYpqOll6mnq6Ckm6ymvKyVvbCtn6OxtLuttqmdq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmpsfmJ9dG1/eV9nZXBvaGdoQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgoqugr6qarqGRqqmlloqbkK6xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinqqqhop6oqLykl8Otq6OirbS8rbCpo7Wxqq2ad69+kYuchYd9uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgLJsZm6Zl4uIsVp9tFukg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl42mmYiVjpKTeHeMm3xjc3xig3d0gHxhamZwbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iZrpOaj6maoZ2knpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp6yko6SipKm6nqDGp6apoay2t66wqaG+sK+vl4KqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2seXiivrt0gJWMpJqNmY6TmXd/j5l5Ynx5ZIxmeIF7YGtla2piUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAurK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqinnqimoKKqup6pxaOhsKSstLassqyjvquxsZx1dqqlt4VliZ9wZ6yQio9ubnelkJuggnaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCWlZeOk5p6hY2TdGSGd2eManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkraytpo6WraqQjIWVl62fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrK+uqrynsbqYjKKppraciZaimIapm5CUnZKqtJqcpK2itJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkp6UlZOdgIWSi3Boj3ZviXd2fHlpbGVkb2RVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp6TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56atKOcpqu3qK/Cr6S4p7Cwsq6rrLa8o7K/mpOnpKa1opKdpp6NqZ+Nkp+irbGboqSzq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpGfkJqTnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqJabuKajlJipnI6GiombopCvnqSWqKChkpeZnK6LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednbeif4OutaKwsHWkv6SzoXl7oq21vpd4r6ahioCqf2RcYnafjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McnmhlpVkeJeFgHaXaIKJgm55f2pwZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4ucr6Coq6eTlrmgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPkp+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MiZaimnmAi6yGnZ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZXFaXEdTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmUrcW8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjZCdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsV2RGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6ipKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi46Qno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xraFdmTV1YRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZafoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuOkaCLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtycmVbZlxhTEQ9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOegZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUJQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX6SoZ6goZOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V7YmNfUF1WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKOEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211d2ZfYVFaZVBRYUhWSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKefl6mJmZiYlJmTkqCXjYeFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkoWHmKCVeZGhopmfibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdHBtVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJumgpmXl46XkJCbko2Hg3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6So6ablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3Nqb1FWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaafin+WqZydo4uhoZqhoYCVmZSOmo+Ll5CNiXuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWTjIeXn42GkKilnImmeJabfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ21TVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmYiBlqmZnaKJmqScqJ2EjJqQhpyRhZKNjIx0hXqIg2+NhX2WknN0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Imp2Ii5KqoqCPgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmlnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roqCDg5aqkJ2fiJmmmqiYg4Gci36WlIeOiomMcoJ8jnx+j4R6lo50coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh52choqaqJ+gqoOJjZWbf36Kl62okJOokXhxn5OEfJRwf6qHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoNud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKKhfYKWq4yfk4aaoZCklX97mIV8kpmJiIaGinJ8gIt2hYuChJWJcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeZk4mcm4aHoaqfoaKji4iTm52jmZaroqinoZOciZmQfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x6dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHN7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXp+l6mNnYyFn5yKnZZ8eJSDe46ZiYaDhIZteIB/coCHfoiSg21rfnqXh4SDkH6AhoSHfIeDjZudkYapnoJyio+GkpKLnJF8jXupg42Rl5WOmpWGhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpipoJyTnI6NqY2SgJ6NipSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW96dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhY+BgomJiHSDhoaJeW1qfH97bWhrbGZeeX9ofHx2dHZ0endcYHB9bnRgY1pbXlFmbFNkWl1hamh1eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeHmMhXuJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpSRd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWQiaGBfo2Nj3yXpKCgkpmQkKWMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9qeXJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQfISFhoR0gIGFhXhkcHp+eHlwa2pmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnd6hYd+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZaRkHWRnaGhmJSXeX+OmJePl5qdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KdoJKYjo+hjIyDmJiElJebf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZ3dwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnZ3fHN9dmZrY2B+amt2c3N1fXB7Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnFleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqAj5igmpKQkXSAjpKUip2dnqeZmI6Vl3WQkYtth5qRm3yIiZCJb5edmaKTlYqMnYuGgZOdgJSTloeZiXyLioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWZ0an2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ8f3FzfoWBa2B5dHlwfG5hbmJke2Jub3ZzeHdyc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4ibkJV7ioWQinCWmpOhkZKIipiMgn+Sn36TkJOLmY98i4aIdHN1a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEd31ubX6DgWFmd3N0bnphXm9ganReb2p6eXlscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4uTgI2EjIF4k5iRnZGQiYmUjX9+kJl9ko6QjZqSfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9bcXJxb292WV5vYG9qXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx3eF9xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShYqajJWOjHpyeHSCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLj413e5ORe4+MjZKXjHyJfYFsd2pva2xte39ien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fXiBinx2b2dqf4B3XXZubWtwclVdbmFxYV9sbnlwaHBmZ3N1aHFsYXdlXVVlYGBxU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Fqg2CHfm9va3tgaW10gHRfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqViXyPiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5uMfXd4go94cmtlbn2Bamdzbmdoc2xTXW9kcFpfbHJ3ZmxrYmd4c3BwZF93YGFVa19edE9NS19mY1x4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh39ucGuAWmtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4J+ioeKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeMdHJwZXN3gGBybG9haHRmUmBwZ2tVX250eWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6ghIphg5WPhYiFiIyGgIdofZR/fYSFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlvcnqMhXRrb2lwdn9dcWduXGl0X1FkcWhmU19wdnRgcGBdaINxc2pXZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXuff4OZf4J5cXRub2RyfmhmbHZ2W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKRhoaXjHuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH6BhIyPkH5tg32DdWxtd3V0d3ZsY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFb3B5i350bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqEbnRiXGdfZW1fb1Rabk1HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYmlzeVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmot7ioZ8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5gICIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgW9zWmViXWpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYt1aXeXjn6BioKUl4l5j5VvenRxa2lkYHN6aGBlcHlaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koeBhJiJe4Z/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZKWhohxe5ODfYKCiIJtgHdogIR4coCBg4qIfGV+f4R2ZHFzgGl5cW91mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX5zcFhnXWZqcmBvTldnUj9YZl5ab2tnenFbWlhrZVljcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eG58fYKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cbn91eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bmt2gIB1dFtnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE9XWVcXXVlYHVwWllUbmNZZHB4WWhdX2dtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjYp+b4B3goN/j5uJhJaTmYqMhYl8j4hwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251e4aWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRucVZqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4iIa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoGMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbWdVa15haWdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnt/hGx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358Z3WHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnp9dIyCfnRodGVuioNsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVWpfYG5lZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNint3f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinOFjI6JdJmQkomGi4N8eX1wcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2d1iIyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ6fH90i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4Rvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXRldYaNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2f3l/gHR+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkXR9dH58b359k4d4mn2Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneGi3yVgW+Ma217gnFndGZhbnpnc3iLfH9id4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+Zl1nc2lmYFZkV2JwXExLaldjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njqd3gXp8kI55dnGAcXV4e5GBepd2h4OAhYh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kIV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhHx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt3fGZebXFpZF1WYVVublZKU2dXZl5YTVVsVEpbeF5bXmtdXVpjZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3aEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3JrcXx+dXZidYaMe4iIgYB5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZzZ4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGdrdXtlZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYXdaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31lcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOPpWh4dIOGkXlucXxqem99h312inSCeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk3+Ig4l8d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldpbHF8Y21sc2NiWlpbYXdcU0tjXVhpU1dHWWBNR2l0WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHJ2doJ4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIN0cJmhenp/iZR3Y3SGeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+e3ZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gHN6enpkZXVnXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3J/bW52f3NyeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpVa2trfGVub3FiW1pYWWxxV1JQZlZWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Jvdnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYeCdW+hlnN6houGemR2iW5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBndXh1fW17dXZwen92X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol8hnJzZ3B+cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH50dHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygI2LdndseYtgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyAc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjICKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxTUmBmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1EREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlJSUlYqFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46PjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yLjY6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4aHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4iGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS01UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkVKYniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP12Eg4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9Ed4KDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFgoSDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSkhIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZW1xZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXd1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESERJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRURDQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1qbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQz1APkFCRkNFQ0NHRENERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkZCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRUlMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Vfd3ZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RESkRESkxLSUtMR0dOSkhKS0dLSklLSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOS3F5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHREVLSEdLTU1KTExGSk5ISktKSUtKSklLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSE5KSUhOR0pKSEhOT01OTEpOTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eZGNiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSU5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJWVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYV1iYldfX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTkhMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXV2NWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSEtGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9wgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRSUFFTUklJTU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlVSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF5ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXllZVFhdXF9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5fWlhWW15cXGFhX11bYGFiZmJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5ent9fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgYGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIaGhYaGhYWFhYSFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYODg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOGhYOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaEhoSChoaCgIWEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fX18fH2Af4CAfoB+foGUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goGCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBg4OAf4KBhYODhIGBg4CCg4GBgICBgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYSFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaGhoWEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIaFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0s+hlsvRxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8WqoKufzpmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6uxn5WPobSVh52dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gep52fp5m0v8mWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7WkoIufw9KRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvFmcXJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A9PD09QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuXn6KVlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDs7OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03mbsLOdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8+PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haKCo5uinZyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyasqCpoKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BQ0JAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiM+wjZGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8OT0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1cC91tTTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD1CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo8Pjs6ODo7Pz8/QkJBPkE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY7PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5Ojw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT4/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw/Qj86ODc3Nj0/P0A9QEA/Pz09Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj08P0A/PDU2NzY8Pj8+PEBAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQT8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQ0BDQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo7PD47PT07Pjw6Ozg5Ojg5QUFCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCOzk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz07Pz06OTk6PDk7RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2O0RBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Njg1OEA+QDs8OTw7PD46Ojs5Ojs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg6ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3NzY2Njg3ODQ7Pzs+PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg2Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2NzU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc2Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODYzNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzg2Mzc2Nzo2NjY1OT4/Ojw/Oz85Ozo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTw/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3ODc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc4OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs9Pjo7Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRURLUE48OTg4NjU1Mzk1NjY3Njg3OT46PT46PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+Oz08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODU3NjY6PT88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBODw7Njo1NjUzNDY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6eoKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eWlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ycnJycnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpeXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXkpSUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZyam5ubm5uZmJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb64trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5uam5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrOvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/Ojw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4Ojo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBRQD87Ojg6ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTL0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxcm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhYmNjamJmY1pZWVxZUU5FPTs4Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwcq/scK/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njo6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G7u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozo2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs6Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm+urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1u7a5xLi0vLa6vcG8u762v8G/vL+6wMvCx8jAv7y8wMXCx8vIwcPAwMnLwsC7u7C0vL3AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+ytLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLaqr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFvru/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGsq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZGYkJaVmJafmJuZm6OZl5SVmp2gnaeopaCjo6Gjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/NzQ5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKeonqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSkqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlXFNaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmdmqqmn5mnoJ+fp6ilpJ6dqqKinpufqKClp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopicm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREFEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Wvs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijoqGknqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUM/QUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ+lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jBwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qretq6q4urS8rq24oqWinqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6on56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk9Pjw8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8Oj1BP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwL6+vrW9s62+v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9PD0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHR19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czP0MzSz7/HxsrDzMzLzs/Fxse2v8m/0szLz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0NDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazpLaqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jNw8jOzMnLv8i/yMnNzc/K0M3Oy87Ox8rP0MrOysLJxsnMyszR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzNDw9ODY4NTU7PkA8OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuxtqmjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vM0NHTys7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvN0NHGz87NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa25oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6tuLvBxcmhl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qsXd1sexkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vK/Yw3V9koyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq603BWjo6Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9vblYf5KGiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+5uLWwrKynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxqrW5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vbetd5OJj5B8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquprKqwo6afqq21trG9ua+4r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuvspKEiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKOFh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE9QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8tayrsaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09KRkxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLT0xNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkIqMZE1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYWFgmRLSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB+fn9iSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dHd5ZE9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94cmhVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvX0pQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1remxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIl7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWhmZp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqekh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W/v7+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ7hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrm0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCMiZKOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1vi397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnZSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaSzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq2+q5u7paetubirpqaioqSjqa+ysaqdnKWZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywa6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC+u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUlISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr+7trG6u7u+z7bEvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra+upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjCvrmyr7m0wMLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pamdqaudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05eUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqZqZmJOio7igoaOSr7CspaefkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalZaUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzo6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmam6mgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE9ZXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6srrKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaizqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWkJiap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2bsJqjo6Ojka2fpKCgoqump7mlrLa2pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rquxr66ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvs623qri4prS2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm5taqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKifrJmQsKGYoqGoqJ+onJmqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKho6MkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRXk1NUlpmTk1WWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWsrZypr6Ogpa2rqJyeq7OltKiaq6epo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eRjY+Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKSooa28qK6xrqGro6Svnp+tppefm6GknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp5bFVeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJf2lYWk1QTEpIUFJRSU9dX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saicv7imrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKkncO3pqq4t6yfsryqp6Wor6uZo6ecpaaUmKGzppmepampnKGflKWfpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZSTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFBzVFtbU0tJR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Cusra1ubi1rKq8s6+ysb3At668vLGkn7aspqa1qquvoaDFrKqosrWsrbW6nqiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJegnae2pa+qraGhnp2ilaCmn6KgmZybnJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlIQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGvLmwsKO2rKuvqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spZ61q6CisqWrsJ+mxaGzprCzsLeutZ6sr6yuopmdp6qlnpWbp6agmaWjqZyan5uVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuVmqGTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaGxqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7jAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqqeoKqjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKaknZqqo6WWmqCckpyjq6qpup6mpKCXmpqeoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXGl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2rq6Whn5yhqKebmKGlppycp6idk56gmZCfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98iJ50iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqvsOusrq8t8G/qqS4saqsprO1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqqClpZuipZ6xuJWmp6e3vqasp6mqrKeloZ+ZoaijmZmno6SYnKWqlpOjnJSTpKamobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbi/wqumtK6uqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqels6WioqCXnKKgsq+Wn6Shtbqjqqihra2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksLqwpaWvs6OquamdsrKwo6Whqq2wrK+mqKCjorGcpJ6ZlpmdnrCpmJyioLWzoauboa2tn52Zl6GjqZ2ZnqWgnJmhp6SQnaOal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Goj6mnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKglpOSlJOdhNWTmblxscJ/xod91pScu32cl6iSjp2NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLfBsLrAsre1vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpSZm6ehnKeVm5ufoJiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlp7a7vLK7v7i3tby8tKa1taOzsqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaKelZmWk5uFrHx4qHejj4uHqnCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhtq6goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpalopSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclpehoJSYkaeeh6l+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKimtLC4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5yVnaGVl4+snI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurp7epuK+1wbW9srG7uKzCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk5ypnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62qqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKirn5yfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4uGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlppyboamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fItqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysn6OanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKmtabAqbShn6WmnKWWlqGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWPm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpauUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaN4a2qLmaOfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCgrZehpJ6impqnrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqokp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKmwr62msravqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OgoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G0qKuplZGdnaKZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mop2zuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmeq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchYd8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm31jc3xig3d0gHxhamZvbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLassqyjv6uyspx1dqqlt4VliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYF6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCTcGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkplV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKppraciZejmIapm5CUnZKqtJqcpK2itJiko5+io56ipaKWrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd2fHlpbGVkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dl62ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am9kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoXl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6hpKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVvn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yMmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0Q9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6OaoqCZlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYOpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhsaZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhndOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkYWHmKCVeZKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKOtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3igfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboOLd21kZWN6gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeYk4mdnIaHoaqfoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo6Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHR7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkoapnoJyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChoaIeW1qfH97bWhrbGZeeX9ofHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXhkcHp+eHlwa2pmXn5zaXx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheX2dpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlp+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+amt3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSTloiain2LioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohqX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GlqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn36TkJSNmpB8i4aIdHN1a3Fvdn2MdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp7eXlscnBleV5ubHNtc1haXV9haVpPVldkYmdwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVidW+EgWFda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZOSmJuRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe4+MjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBwU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Jqg2CHfm9va3tgaW10f3RfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyOiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGFVa19edE9NSl9mYlx4cIl0XFtldWBhZGSOY2BmYlhpc3RubHF2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbn1lh39ucGuAWWtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlxb4RvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVXm5zeWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnKJbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt7bnRwgFdwenZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJaNgJqIhHxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxc2pYZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnRub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkXGZucYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEk29te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVi4GEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SDcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxbGpkYHN6aGBlcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4iem5aNlZKWhYhwe5OCfYKCiIJtgHdogIV5coCBg4qIfGV+f4R2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdrcmBvTldnUj9YZl5ab2tneXFbWlhrZVljcHleZ1xeZWxnZmtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZ4aDb2d5lYh9foSCmIqBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eW58fIKLhHdieoWCcmRyaX5udnJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV+dGhZYltoZm9kak1XZVA9XWVcXXVlYHVvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cWdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjYp+b4B3goN/j5uJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXGBd3WNg4d4iHaEiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgHRgXV1gZ2RpaWZOWWdNQGBjW2B1YF11bFhXU3RgWmRvcldqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f352j4aEd2pxaWyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSUNjYFtjb11dd2hVV1Z2XVtlbmhWa15hamdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7aHSFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnx/hWx0dX5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoKEhX98fnp9dIyCfnRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXKEb1xgY21lZF5vY1RccUZCZV5dZWddW3tiUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50a46Ndn92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSDeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWGx6hZuIgoFzl5R4f31vinOEjI6JdJmQkomGi4N7eX1xcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2h1iYyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN0hWldYGxqZmNab2FYYm9HQWdcYGVdXFZ7Xk5VZXBZW2poXVdnYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYeNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2gHl/gHR+bXt8gnt5cWZsYm6JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoNmXmBxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4SHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ3YneGi3yVgW+Mam17gnFndGZhbnpoc3iLfH9jd4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d+Zl1nc2lmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5GBepd2h4OAhoh2anJ1Z2duW2xkXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kYV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhXx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVVaZWx4fGZfbnFpZF1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR+enZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1xnX210ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZmRaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRodGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem99h312inSCeX15gGlkdmxgZl9eaV9ddGtZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHF2doF4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gXR7entkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3N/bW52f3NxeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpWa2trfWZub3FiW1pYWWxxV1JQZlZWaFNURVlbTkhydVhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXh1fW17dXZwe392X2ZyY1tdVmFjWGF1ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH5zdHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhrYlddVVt0ZFNSV2hRWGZUU0dZWU9NeHZbX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZGBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1ERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlZWUlYqFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46NjY6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yLjY6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIeHi4aJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhoaOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WGh4yJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6JhoaGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6Ni4qMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/f3+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn1+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8+P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlMTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERERDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkNDVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxHUmB8hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+PDo8Ozw7PDw6Ojw4Ojo7Ozk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pk93gYKDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA+Tn2Cg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQUBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9MfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmeDgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVdVdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTExIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPklNRlVvdXV2dHR2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QEBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTkhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGR0tOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZJR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhES0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHRENEREZHR0dJRkhKSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIRkhGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmljaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lGQkhKSUdISkZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RES0VFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkZDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBsa01PUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVdsTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSERGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5bY1leXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYldgX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTklMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSExGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09MUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUFRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWhiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlJKS3JvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1tbXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVlJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cW1pcXGBjXF1iY2RnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTktNT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FTVFVPTk5RVFZVUlNSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aYmNlaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1FUUVJZT1FTU1ZbVVZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhTVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYl1gVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZYW1laWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWldUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19bXldYXFxcXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eXt9fHx8fHx8fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6enp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH18en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn18fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fX18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp6e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgoGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgIGBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgoCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR0d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKBgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhYWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoKDg4OCg4OEgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFhIOEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDgoSEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iIiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiJiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhISFhIOCgoKCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGhIKCg4SCg4SFgoGCgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoWBhIWDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWGh4iHhoCBgYWDg4SFhIeIhYOBgICBf4GMhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358f4eDg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+gYODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoWDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYKAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn5+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIyLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgH+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgX+Af35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAf31+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4GCgoKBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhISDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeGhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhIB/gYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX59fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwgoOTzdKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4m7C3nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4nFnpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjTvpihnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pK2cobSZlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6mQm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmsK6fgJ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEnIK4r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ+Zp5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgwaKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdjFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXS1MfD1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXNjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TFycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVpqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJSQjI6PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJaVn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosamqqKenmpmdmqqmn5mnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBnV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/T08zKwsXGxsrHzr/I0MvGxMbEwLvDwL6+vrW9s62+v8LDxsTHw62+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMzdPNxMfJycDGy8bIyMW+wrOzx8TLysrOxcm/vb+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR0tTU0s/Rw9DT1tfV1tLLyc7Qy8bN0snS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnDy8vLzs/Fxse2v8m/0szLz8XJx7/DwsfOzNDQz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HH0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHHxc3M0NDRyMvMwMrLxdPOy87IxMnGxsjLytPT0NXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzc/K0M3Oy87Ox8rP0MrOysLIxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vLz9HTyc7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtamYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6submxssChl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHwsjIws/Avby/sMHKx7q9qrCyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q765ubOlko6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTCysnBwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8W/w8TFx8vFwMbGu8fLv8/Jx8PGwcO3w769trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLKzsLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVtbW1xYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xgnpya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIR5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaSrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGjpZujq6WipKqjq66krbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKefo6y0q62nsLSwuLXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFpZWVlcXF1haoB6f3aJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn5ziY16kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUtLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eho7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WMfYmAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ6WrbSipq2YrKuYp7Ohqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtPSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFh36JiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7GroaSkkKaqlqGpnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyip52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2cnKSd2d1hISEhHqViYiKjIuAf4OKjH+Tg3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgn5WdnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ7c4ytjYiAaGZiaW1xbW+DdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6Jh45zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIh4mIoaujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4SCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Ql6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mehJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrrO1opWmqomaipKKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CGeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/uLq4uq2tsaaxqq6+sL28wsOsmbuola6PmJiriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVlT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6Weo5Oip7CzqLGyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5SWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBKUFJVTlleUF1dTVFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQm5iZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnqLh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYaIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoJ3haGQi3l6d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl4+JjoqLgnyhiZCKu6GYk5eanKimpa2ep7W/v7+4xsnNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfYmFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApIaKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4J+dYOGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZKOioqdl5ijooaTnZWgi4qJjpyQg4iPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eXioWPjYF/h4+liI2TqJqXk5aYoZifmZOcmqKytKWjvMG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doCDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqijnJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJuampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmZuKkp6Qi4mWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaSzuKzCyMS1ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq69q5u7paetubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtARUc+QUBDOzo1PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywK6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjarDw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY2RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0tKQUI9Q0Q8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC9u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXhpqppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3Lu8PCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKGjqKWetqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTEs/QUhFRUhHRzk1Rk07Pjc9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr67trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2cn6eimbSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0hLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKyMjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjBvrmyr7m0wMLJtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW2q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFBJTUVHR0JTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJmpnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAssDCt7WztK+9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69oZmjn6Kpq6Gdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSU5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+drqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6mtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbi5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafBrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7t6yztq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqJqZmJOio7igoaOSsK+spaafkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tcaov6+ttrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalJaUpKC3oqWllq+xsqerpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9NTlQ9QkFOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptaueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psOrsLauqKurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KwsbSss6esn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptrS1vq6xsrWssLSzwbrFt6y9sLG3q6yqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE5aXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6rrbKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaezqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHV6YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7KhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJuUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1raqxsaypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2eo6CgoqumprmlrLa2pausqa2wtq6inqOpqpugm5uSo7OZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCrsK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqWjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOEcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rqqxrq6ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnp7KypKeloaGsl6qhlZugpp6loqukraKfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvsq23qri4prO2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhteVRkVlFjT01WVFVQT1hbYlVIT2lUVlNHT1hVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKmttquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGira2ova+srq2iqKifrJmQsKGYoqGoqJ+om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRX01NUlpmTk1WWWRYR1JoUVE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWmraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWrrZypr6Ogpa2rqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY6Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3tsVGFQUVlLTE5ydV1IWltnWUVVZVBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn7+9qrPBtLyhr7K1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svnp+tppefmqGknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fouFj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp4bFVdTlBSS0lNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoJiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppikqaCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjZF9hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJfmlYWU1QTEpIUFJRSU9dX25TRFhaUmhOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XrqGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saibv7emrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYJ6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnauepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKjncO3pqq4t6yfsruqp6Wor6uZo6ecpaaUmKGzppmepKmpnKGflKagpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenq8PAtq+sorWup6+vt8HAvbHAtrGusra1ubi1rKq8s6+ysL3At668vLCkn7aspqa1qquvoaHFrKmosrWsrLS5naiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJihnqe3pq+qraGhnp2ilaCmn6KgmZybnJSanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkIOWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1daYFZJR0hLTVJYPjlgbGlIQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoZqZoJeltLKjsr63obHFu7mwsKO2rKuuqbm+vbutwLKur662rrO5sqerubCvrrS2u7avub6spp21q6ChsqWrsJ+mxaGzprCysbettJ2sr6yuopmdp6qlnpWbp6agmaWjqJyanpuVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuWm6GTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaWtqZ3Fya1toY2Fxf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUZMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rLuvrKurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6qjqq6drMSZr6awsbe2rKuesK2vqqKbnaSsqZuVnKaknZqqo6SWmqCckpyjrKupup6mpKCXmpqeoY9ro5aZnXGDmJ2lgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZXXGl0bk5QamNlcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5ramnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsLW5ra2jqKyrq6Whn5yhqKebmKGlppycp6idk56fmZCfqKuktK+joqOclpiZl6OIoY+Sm4ihiJWfooClgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98h590iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpb26GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprO1rq+ztquppbGtpbazm6y1trWlpqmzsa2yqK6eqqGzqaCkpZuipZ6xuJWmp6e3vaaspqmprKeloZ+ZoaijmZmno6SYnKWqlpSinJSTpKanobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5uZWm8krxuaHltcY/YfVJrYrayfX5wlHWaoaqQVk5XYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqelsqWioqCXnKKgsq+Wn6ShtbqjqaigrK2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVGxjWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbqwpKWvs6OquamdsrKwo6Sgqq2wrK+mqJ+jorGcpJ6ZlpmdnrCpmJyioLWzoaqboa2tn52Zl6GjqZ2ZnqWgnJmhqKSPnKKal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYepmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNweoWAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7t8KwvMOtubbCq6ytr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Gojqmnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKgl5ORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlqLa7vLO7v7i3tby8tKa1taOzsqSgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaOelZmWk5uFrHx4qHejj4uHqnCui4WohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyure1ub65uLO3vrWmubWhtq2goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpaloZSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclZaioJSYkaadhql+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKintbG4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5uVnqGWl4+rnI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurqLequK+1wbW9srG7uKzCt6qsoZynpKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH05Sau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX2MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZGmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKiroJyfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aMe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLiotbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlpp2boamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVsgJmVlGVeYGNxmolocox7hpRman5wdHh+fWJbeHSBaFBcboR8fIpqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysoKOanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgXmkhWxpe5B9gHWJi4Jygnh5dnaKf3yJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnprC1qsmrrbKmtabAqbShn6WmnKWWlaGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SfmaGOmJWLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhYWakYeGipWPm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp+d3l6b2d5kYCBiGp1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraOss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ+VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpayUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoWTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNrbXqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIFud4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlqfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCnrq6wvbGqqKWusLCgrZehpJ6impqmrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqpkp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF7gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKqwr66msrWvqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OhoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNzpTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWrprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJLBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtm52no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qKuplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wqmp2Tfaptn4OIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mopyyuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmqppyhkIOeTneagoCeeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaCir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaSmoIiQ0rXDt3mHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+oGJzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmdq7Smq5p8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchod8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIaomqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm3xjc3xig3d0gHxhaWZvbWZlZk9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2OfIualqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqZ2apquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXknuHmZGmm5KPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLWssqyjv6uyspx1dqqlt4ZliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6qkm5mvpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkpkV0lqWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeNppeNkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKpprWciZejmIapm5CUnZKqtJqcpK2itJiko5+io56jpaKXrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd1fHlpa2Rkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCMe4GUjKGUipWRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dmK2ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiHmCk4ybk4mVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoHl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5lwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZF92b2trZ1tlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l0dpKNlpOJk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnelnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCm5mEmH6RiIGCmGmMjIRqeHtxcGZleG5pbGpbZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKucp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6hpKmhlKOptaKvf6CmnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMfmJtj4uTkIyPi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKprg6NucqVvn4GbZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15eY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfaNenJmzlW97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0M9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU43VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZ2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYKpiZqhpaqiqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QjpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhsaZSdgbGumoRUX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMd4SMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWpTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqFiXmDdoiAboGfhneAkYWHmKGVeJKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKKtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYZ2XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamatzgZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUWdJVUxYUlVcZ2tuVWdXTUpBSU1KR0pOQVFKUGRjam1ldXNzfnh7bnSJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZT+UorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCQoIV5gZSGiJWelH6TpKablpaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmGbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhOW0hXaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6WDfYWSjIeXno2HkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhYeVl56ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gZ5mHdaxmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xbUVtJXWxtdl9bcVlbX1pnc2Rtb3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpbn6TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351e4J0bWxmjHN3e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFRdUV5vd3lrandkaWpqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dhoubp5+gq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboKKd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXV1kcn16dG90YmpqaXt8cXp2dGRtdGhse391en17eXqAgH9vhomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoKGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoOIhox/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2BsZ3R7e3Jub2NqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5eioZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjJqckoapnYJyio+FkpGLnJF8jXqpg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjXh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZWboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChYaIeW1qfH97bWhrbGZeeX9nfHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3GCjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI6bm5CHppt/cIqKi5KGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqVmZ1/k5N/iI+DdXWCcXdhfYGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXdkcHp+eHlwa2pmXn5zaHx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheYGdpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WMlZ6afW+LgZCThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KJhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+aWp3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF4bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgHhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSUloiain2LioJ7cXprdm17f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5gbWJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohrX2lkamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXFih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5GkmpOBfYB8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5NwjJyGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdHN1a3FvdX2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp6eXlscnBleV5ubHNtc1haXV9haVpPVldkYmVwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2trX29odH9rcW5tcWdva2V7YW1/endwa3d3iX+jmaOooaabiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3qGbHJveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZuXoJKWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIemhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3B8hmlzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVhdG+EgWFca21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWN8YoV8b3BsdWpobmx3d19xfnl7c3Vzf4J+pZWbrZ+nloWMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKSmJuRmHeQeoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4poiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe5CMjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBxU1BOW2VjXHdviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4ZnJrg2CHfm9vantgaW10gHRec3x4hndzc4V8eKCQm7Gdpo6Cin+CmYl/ipx+ipiSjoSHl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF5kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGBVa19edE9NS19mYlt3cIl0XFtldWBhZGSOY2BmYlhpc3Rua3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh35ub2t/WWtueXpyYHZ6e412cnaKdnmfjJyvm6CQgoV4iJV+e4ichoSekI6FjJeEk46HgXV3b3lxb4NvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoeUi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am95dFiIe5KHhnp/f4CGjX96Z3RqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFybltjcmFiVm5aXHdMTEtjZmBddXKJbVtcZHleYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt6bnNwgFdwenZ5cWR2eYaMaHaAiXGAnYeZqJyikoR9cYyTeHiJnIOEn4yOfJaNgJqIhHxzdnBzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTe42Sh4KIkHqRi4aPgoB3eIOEcoeCkpuWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajH2Tg4Z9gIOBhIuDd2J1bYqCkYyDgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxcmpXZ2ljaFdtV1t0TEpLZWZeYXFzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qc3eKfXNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdG53en1YeYVxgG5neHaRgmR2hoVxipeGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHipmHgZKQhoaXjXyMjICAiY17kI19iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJiRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEkm9teoB2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI6WgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hoGdk4WUj4SDcoGKd4Z+jJufm4iVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCi4B5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFlqbW18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcW1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxa2pkYHN6aF9lcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCEk42Ef3CAhHiGe4iem5eNlZKWhYhwe5OCfYKCiIJtgHZogIV5coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXWdqcmBvTldnUj9YZl5ab2pneXFaWlhrZVljcHleZ1xeZWxnZmtpcXd/h25sf36AdXCCe3+Cf4J/doGEiZeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZ4aDb2d5lYh9foSCmIqBfI2NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCan9xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeLi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV/dWlZYltoZm9kak1XZVA9XWVcXXVlYHRvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx8gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNg5ueloyBgGyMfWtofo2Len1+g5SCfn2KiGt2cWdoYltiZ3JvYGFrc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKHdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjIp+b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoamdtbGhwd3ySa2iEin18b35+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2EjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9wcF9gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0hnSId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WCfYRxh4p4eXFxhYSOgH96f352j4aDd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIN0XGFcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XVtlbmhWa15hamdlbm5ocHZ6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXNhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F5bYmGdHpsdoKEhX98fnp9dIyCfXRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYHKEb11gY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50ao6NdX52eH13gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSCeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpR3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmhxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOlX1yiGpvfoF5b31dWXN/bnSBi3yCb2+KgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVdXFZ7XU5VZXBZW2poXVdnYF5yZWpocmdwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoWHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRnc2VgWGNxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXVldYaNhpeAcIxna3uEdW51Yl1xfWx1fYx7gmd1h35ucWl2gHl/gHR+bXt8gnt4cWZsYW2JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoRnXmFxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGVtZHFncnB1gHdwmYZ2f353f3yFh311c4KIgJWCbnN5e3pzcoSHiYiDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ3YneGi3yVgm+Mam17gnFndGZhbnpoc3iKe35idoR3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNkX3ZnbWJwaXRvcn50dJmCd36AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5KCepd2hoSAhoh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFyY3JpXXF4ZXJ0iHx5Y3SAcWdqeXVzbXl5dnllhXx/eXdxZGRjbXt8ampUZ2FlU0lrZk9HUWpFYHdmYU1Tcl1KTVVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZV95aGxhb292bnB3dXqYfnZ/gXmAgIeGenl6g36Bk4NxdHR+enZ0hIiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cWx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1tnXm10ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3t2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZ2RaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYmNdfmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoGMjnx+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJuhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11cc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9+iH12inSCeX15gGlkdmxgZl9eaV9ddGtZZVxvb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfHRncoBlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNnV1hTTXZeUElZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2FiXIRpaGFueHltb2p2gZB5bYJ+gIGTiISBdnSJdIyGdHF2doF4fX1+jJB/fpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZcXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubWtkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH19c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHpzZ3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVNWUU91WlFPWFFIY3NhYEdWalBJUFpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPgoKXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3JjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl1fW17dXZwe391X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2c2NtdlZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF5djm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jjn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbXxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYmKioqKioqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpOOiI6OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSJhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYWEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPztBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZEVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9DdoSDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUZDQkFDVW9wdXd4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtHQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHQ0JBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNOS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZFRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5JSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUUxKS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0hDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkdLSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUpISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tKTExJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxMS0xHQ0NBRTw/RUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JQTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFtLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERERkRDQ0JFRURGQkVGR0RESkVFSkxLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtpamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk5ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz5DR0RFR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTElISk5LSE9cV15PXFxgXk9YWVNcXGJeTVhaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExMQUNEQURJRUdHRktKS0dFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTElKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUhEQ0JDRkdFR0dJSkpJSERGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lKSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9ZX1tdVVhYT1xcUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZDQVVVRVxUXlNWX1hOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1RRUFFSWVNeXFtdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUhKS05MTEtNS0pKR0VKTlFRTk5QTU5NTklMQkRBQ0NGQ0JAQ0RATEhDTExQT05MRk1GRkhJR0ZMS01PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVtdXGFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSExGYEVEXkxEZmJDTFpIXlxzbU9NVm1YS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9YYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fW9+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTUtGYF1HQUVNTUhLS0hKUE9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFBSS0hneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSVJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTT1RQUlRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVBWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtaVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFNZW1dVT1JOU1hVU1FUUVFZT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1FWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWVpaYVhbVFZYW1laV1hZWldWXV5gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmF4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFhdW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2VnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3M2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5enp6enp4b29vcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z5fHp6enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp8eX19e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en57fX19fnx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX19e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIh4iHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4ODg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt6fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAgoGGgoSDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaFhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18h4aFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8ODo8Pjs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0M/XdLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztHU1NPPztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STztO4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7u4na+3l5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPgInJnaOostGSfX6vsdLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqfQ08KGmrXV082ensTQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pKycntHWo5i01NPAoKDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6W32KKZtdTVsKKp1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1Ojo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bptmimbXU1aShudTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKDZopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87PDk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ2o2qOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgv9iim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdXWsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvdXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PDo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PTs8Pjo8Ojo9PTk8PD08PT08Oz1ESERDQTw8PDw+PkA7ODw4MTU6QUZFV661tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzo6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjo+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ2PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1N0JGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCMf4eNjIuLh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNTZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjI0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtq6WppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ozs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVRhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8Oz5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7WzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpiUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S9wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc1NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzU7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVX1lMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw76+wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ozo6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojw9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa8vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3wL/EvMLFxcfHysnGz8LBuK62tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oz48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjs/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipaqsr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJiamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dvfG91cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NjpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqmamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg7PT47PDw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqSeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo9Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pzk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Gbnpqjp6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJuakY6RlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJWalpicpKGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlXFNaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpaCsoaGioJ+amJaVn5ubmKShoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWfnpmSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKenmpmemammoJmnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ6foqOen56bnZyUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1xRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenZ+lpqedoKCssa+npKSjoZ+mrKafl5yUkZmdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrru2vrq6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfnpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5OOjZCMgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM08/T08zKwsXGxsrHzr/I0MvGxcbEwLvCwL6+vrW9s62+v8LDxsTGw62+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1dXT08jMx83NydLMzdPNxMfJycDFy8fIyMW+wrOzx8TLysrOxcm/vb+8wcbEzMzIyb/Dv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0srS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnCy8vLzs/Fxse2v8q/0szLz8XJx7/DwsjOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWZoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHGxc7M0NDRyMvMwMrLxdPOy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnZ3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jOw8jOy8rMv8m/x8jNzc/K0M3Oy87Px8rP0MrOysHIxsnMysvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ09fa3NbPzcvD09DCwrKrra6sprOyuauzt6mjn5yWlJecnp+fnpWWmJWKbF9fXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvMz9HTys3R1dLV1crAycHFzMLIycLMwsXHysrOyszM0M3Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzM3PydbWxcS4sraqpK6tubmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O/wMfLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk7Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKm3q7+6ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NHMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ozw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3u7avkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7ta6ytrq+s8S3urWruLy9wL2wuravtrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Hhnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo5Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6vLvKt7S7vbW1q5GJkJB8eX6Khnp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbW9oZ2dpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6lqKKrsbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDx8W6vcS+ure9xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXV1cXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+lpaelrZ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sbekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLGtrayxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD1APTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8TGs77FvLewub+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrLG1oqmqqauspLW4rbevrLK0rrO1rrGqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK64ubuwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCxLytqrW5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpqGkm5+gmpitra2vsqCloq2rp6G1sLGxrKeusqe5s6a2oaKemqOhraKhqbWqoqOmnaWmo5aYnpeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn56hnJahoaijn52onJuaqqausKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYq6ahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnKOqqrCtqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBusDAubq9t6iosbumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFpbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSro6Wwp6Wjq6utpaiurq6rqKmps6Wmq6+0sa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uramp7K1nqKKmIeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GdrKypqK2toqGilJeimpyPq6mwm5+in56XmJOKnpKNkpKVj5iYk5uhopykoKGVoKGjpJqjq6WipKqjq66lrbGppqWmprWmqaits7W0ubqvqayei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PTY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtr3Hu8HHw72/t7q1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OkoJSTm5aVkamprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaijoqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWVlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbMtbG9xLzCxcO9wbO5r6Wqr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqaatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloZ6RkJKSkpWnqqSZmZqdnZaOjIuUhoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y0q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMs7m6vsDFx7a0t7yyurvEvsKxs62wrrCsnKKIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkqpynmaClm5KPnqKal5aEg5Gao4+TopyVlZaHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKaopqGgtLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy1xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaCOmpuioKOYpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmPnIyCiX+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCcmpmZkJWPnY2ioo2JmqChpKOborSvrK+sn5iluaalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhITVNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWjrb+4sbCgqK2sqpaVonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqGgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raeolqalo6CXj5ZpUE5SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZKTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+Zsp+imo2glpiUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnKSeGd1hISEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpqbo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hYWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c42Ig4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZF0c3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjpqRdmx/e3xtcm5wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5b4WPgnpugXdzhHpxc3l3a25pXXeHfYd8iIePgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgXODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSgHt1i3Z8eG1vd359cXFwalpcW1pjY1dnZlxWUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iYqAdYV5X2NWTEM2MC4vMjMxMzM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgJqWgqChmJWbmqWtk5m7sae7yMSnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3h9d3xxaWNcWVlcaV1hZ2BaT0xOWFNSSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSBgoyMgoqOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWEtIT1NRTk5MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn2Fk5J6gZKJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNze3x5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJiNeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO2o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtPRElIVE9GSExGS0dGR0hBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj3yGjI+LinuJg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQTg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q4uaicuKqNpY+SlKCGeoGAcldfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKt7zEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7qiqbK5tbu+zL/Fxb29s8K4uri/uLu4uq2tsaaxqq6+sb28w8Otmbupla6PmJmriX6AeWhVYWBXaWNpZVZbZFpXVUpHR0xSSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU3Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5SUjpCXkoeHfIeBjpaKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNVFpUXpSvuLW7ucnAu73Kzby9wby4try7t761urLGYXWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9dXl5cVWBdaGZTWWJXU1dJRUZPS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGOl5KWlo6GiH2Hg42Win+DgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7trq2uLm0uLW1rre3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW11ZV1tfWGFiUVxhVFJMQ0JGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iYeMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVpaW1ZeVllkWlBdWE9SQ0JIRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6Li4uQiHyFgnB/h4KGe4dyg5KMj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSRhI+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsbmrprSjoq6ipK6jp7KgiaablZORipKPiIKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tgXVxWUldSW1BKSEpKS0A7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW52f3Z4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2ZobG5pboGDiZKMnp+gnpGXmaCjpKaypKWyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNrYVpXUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4eGh3uFeXF7e4SGdnuGjo6eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnZ5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiHg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09rb1tDa2tLWydXMk3V3ZmVYV05RUlxHQ0ZJST9CPj04Oj5APD5JPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZGLjZODjIWJiYGGj5GenJqIhYyBhpd7iImfl4+JjouLgnygiJCKvKCYk5eanKimpa2ep7W/v7+4x8nNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETkQ7PT09OTo8Pzk+QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bn19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZOOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Rg4x/ppmIhY6DhoSApIWKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d1dXRnZmJUXVlST05IRExDPj0/OTk7Ojo6PD42QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoR+d4WboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOioqdl5ijo4aTnZWgi4qJjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVdDQElEPz8/OjQ5Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hYKEfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiI6Qq5eXpKOImZ6VmomPh5iXioWPjYF/h4+kiI2TqJqXk5aYoZifmZOcm6KytKWjvcG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tMSFRaQkJIRDxCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fIWHin6KorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWRmbKWl6Whh5yZko+LkYqXm4mLl46GfoyYnomQkJuampOYl5+UoJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ06bOzdTS0NbY09DYum92clleU11VTkdJTkVBQ0U1Pzs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eYaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5iTnZm0l5WrnYqclJGOkZKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKvCyMS1ur28xcfHwtGhxsrNzcXX1tHL1J9td2VZV1FcUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwcCvvca7s7TAvbWtq7O2i6iyrq6+q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKkuq+pwLytrrK5paSofoiHnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42MlZeUkZqXnaibsZqRrJyOmo+SjpSQkJaXj5GgkYmVm6OslJaPlJydkqCdm5ifoZSanqalpKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tHNxcqFcG9eWVdcWUxKQktBRkg/QUBDOzo1PkE+PTU9Nz4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6lwKSrsLu9qq6ro6Oep6uutbCqnKCrnKGclp+wtaeMo7u7tsG8rKmds6WkqJSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSHl5+hs56UmZOfoJeknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSENNS0xKQUI+REU8NUFFPDszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6ousC9u8S3rMGprLO8v6qwqqSlpKyus622taGgsJ+lopmjtL2qnKm9wqS2t6+slLKsrKyXh5qqpqWRgoyTpZaKgXWKknmFjpKQnqCTj5OLj42Uo5mXnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMOvpbO3zMC5r8Szu77Cua3Cw8LAl2l2XlVUWVhKSkxJRkRESURDQkRMOjRESTo7ND04Ri4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtre8rbO/ub2ur6igqai2rq2psrebn62ip6Geq7e4qqWvv8WyvbqzqKu2tK6ul5alrKefkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39oa1dUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUsuMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+wmKSvpKekpbXAsaystL/DusC6tKi6trm0r5alra+upIuTlKGNdMKafZeahI6XmYyxlZualZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7uqsLLIwLmmrKutsrKjobKytKRta2NZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCao6S1ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istri/wsC+ubOzxbK5vq2kr7WsuaaIm5emm3a/n4SZno6TmpqMrpehnJuXlJqfoameqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm3oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLKtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2ucKyv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZymopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLays56do6Wbl5SYqqGedVxaXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJaamo+qlpWnppWtrJmiq7bEw7y+tsHCwMfEv8zFu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6gkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqrqybmKCgko6QlaielGVfV19bTUhHSU5MSEZESUE+UUlBPEdJSVxST0s9SU9VNUJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCSo5+WpKCmqayYtrGjqrO2xcS9v7XAwrvIwr7Jx7a4tbSxs7S3wcW2vrG4tbm0n6asqqydnp6lpMGln6mtoKSpra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma6VnY2Yk5yBjp+XlY2ho5aQpa2xq6mioqWllZWdmIuOkZKknoheYVhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOok6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC1r77EtLmysLq0rJmosamqmp2loafBrZussZuqo66wqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52TlZKZf5GglY6Nn6CUi6Wrr6WmopygnpGSmpOFipGNm51+X2RZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/HwbSrtaiwuay/w7O4r622uaWYqrKrq5ifppetu7SbqLCarKCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpedoo+ajJKWmIWVnpOLkJudk4qoqKqipqGYnpWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpVZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6Odoaa/p6ivsaKqtaueurGso6u0trGwubewt7i4xb3Dx729xMLGwLjAxcC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegt6mmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6Kcl5uShY6Zi32LlYSNmWhma2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk5NUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7ur63t8DCv8nEucTDwL+3w7zAtq61p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpbSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6qclZeElJaKnZibk4qNlpaalqalo6CdlpWXk3+PlIV7jZKCi5RkanFmb3FeRllnVkRDTVdEWjlIQjY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1BMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLiytKypura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsbWvo5mdrKeal5+bmau3opeTkI6YnKGXlpOqnZqSf5GXjJ2bmJaQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqqympK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y1vb+/t768sbytp7q5t7XCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrG1q6SZoKuom5yenJSpuJyUjo6Kl5uil4+XpJ+blIKQlY+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUtQS49RUxRPDNya0lDQ5GZpa+lra+rqKWxs7SruLK4oay1ucm5rcG7wrizsbXCws7Fv8G9s7y/vrq+vLLDqKm5sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2wta6jnqOoqpugm5uSo7OZj4mNhpChn5SMlJuekZGDjZKSnJqXlZSHl5KVmaecoJ6Mk5GOkHd9joV8e3yFiIhwcnF9fHxcU2RvXk5YZlxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkc+M0JIUyw+kGs7R0iPnKqsoqqxpKmltLWytbaysqKsrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKestqyyt7zAr6uxrJ+jp62pqaWwo6qyqrCrr66wrquzvKe2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7CsnZ+mp6mZpJmZj5+mmIeEjomLnaCOioyVmo2NhIWPlJ+clJeVhpaUk5eknJ2ci5KRjol+foeFfHZ+hYOEcnFwh3RsX1phbmJRcnBcSzyFfEY/WHVYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODxCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Gss8PDzs/Dvr+zwMHDub+zx8Orr7etsri/vrGsraukp6qwqKipsaW0rqqxrq2xsbSstLykt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqZyhpKOkmKCblo+XnJOCg4+IhZugi4qOi5eNjomCi5ejm5CQm4yTkpGTo5qbmoqPi4t8hoGBg3pzf4J/fHJ1i6SHeGtfYG1lV2SGY04/Z5NMRWJ5V2JZUmVVTlZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRv8C6uL++wbnBucDErLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrGusq23qri4prS2q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqrqqqiqqCtm5KqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6mboqOjn5mZoJCNj5iNfoeMh4OdnYaDiYmNjI6LgoWVopqNjZqQkpGPk5+XmZaMi4N/dYeBf4B4dIJ+eHZ9gIedj29xZ2Zvd1xgcodqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVlNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGIwMj9mPU5YPkMsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u8CwrbmuobawycfI0cC+vLq7wb26wr++v62xsbG1vLvBsbGzqrOppLSppq6zs7mxo664srCzu6y7sKmttqyqnqqrn6Ogtq6poZ+ws6K2qp6op6qjqqGira2ova+srq2iqKigrJmQsKGYoqGnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGeHSCf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFJYcF9KeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLOyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6Ogpa2sqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyUkYuRm5KVh4l/gHJ7en58aXh8eXNub3tmhHeFimRhZ19yhHpsZnhdXlQ/V3tsVGFQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaasuMG9ta+iua2oqLDCysnMwba9wLS3v7rItMK0srG0sby4ub21rbi1vqyhs6errLG2uLWsn7+9qrPCtL2hr7K1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svn5+tppifm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouGj42LiYSSmJCGlKOJk5KHkZqRk4CJfXlsfnZ5eGN8enBub3F2Z39yaoRnZWddbHONbGBocGBvPVt4bFVdTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbPAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq62taemp7CzoJ6lpqiipZmfraiqnqCqrqagppikqaCxuZ+jsa+hrKGtpZynp6mampufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjpF9hXxzcH5ydHRgenhobW9vbWh9cWN7bWllYVxkhH5eWXNqcklIfmlYWU1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qqi5xLSyraC3ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7C9w7mpu7q3p6e1qaissq20saicv7imrr24s5+xt7CppaevsZuhpKGlpaCXm6+moZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqWpn5eanqaUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBh4OHi42FjZOYjY+WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGpramdngmxlcmprZGdXYXJ/XllrdWlYRX1eW1hPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcSyr66itbCsra+1xMS9s766t7Czubi6uLqurb+ztLivv8G4q726tKWis6upq7StrrOknsS3p6q4t6yfsruqp6Wor6uZo6ecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaGZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gIOHiIiRhZSTkoyRlZSNjpR7g5eQi3d/fG11c21tdGJ5dGhmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Gusra1ubi1rKq8s6+ysb3At668vLCln7aspqe1qquvoaHFrKqosrWtrLS5naiqq7GlmJ2qn6elkpmlraKYnaSqoZuhnJihnqe3pq+qraGhnp2ilaGmn6KgmZyanZSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIaFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNqYWZjYXN/YWRlZmRoaGFlblldWFxsY2FNZ1daYFZJSElLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mzo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhko2uoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm+vbutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2sr6yuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaa6qK6ioZqbnpmfpJqlnZefmJuWmqGUqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJOFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2pua2VpZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6awsbe2rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqeoY9ro5aZnXGDmJ2lgHaSrKmflpeikoqYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eYuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINmXWRmbmtoXVtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrGbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSztLC5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/lainsLW5ra2jqKyrq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZmKOIoY+SmoehiJWfooClgKitn5SUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GV11oWmtqWohwa3lyh2iHhFleRk4+Rl5NRlJWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprS1rq+zt6uppbKtpbazm6y1trWlpqmzsa2yqK+eqqGyqaClpZyipZ6xuJWmp6e3vaaspqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWUmJSdiK6QmJWKqoyZpJ2GsYGlrp+Vm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuCbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY/YflJrYrayfX5wlXWaoaqQVk5XYU9WTkdWXFhQUFOLXFdbUEFcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqwtrSoqKa2pqi5rpyysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqaigrK2kop2amqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99Znujp4JZX4uraHyMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6OquamdsrKwo6Sgqq2wrK+nqKCjo7GcpJ6Zl5men7CpmJyioLWzoaqboa2tn52al6GjqZ2ZnqWgnJmhp6SQnaKal6GgrJ+mpqCan6GWlZGXkZuGtZu1eYepmraZeIi0m7d/lJeYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXVCpbmNweoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWBUNTAcl6CVibSmp6GtqaizrKq7t8KwvMOtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbKzqKOinairs6mwqKafoKCwl6Cbl5aXm6GxpZybpKi2r6Gojqmnqpudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKgl5ORlJOdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1QamhkUEBYZ1lkYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTw3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqrGptKmmnZ6frJiZmZiYl5mkrp+cl6itsamjno6roqeVnZiboaehmKKio6GboqKonJ6gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm+fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGlQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGmsK2lqbutprWlp7a7vLO7v7i4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaampOVpauimJOmq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn52mlJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4KClWySW7BXS5p1mHlmYK1ednaGZ5eIal2vdpWej3drNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub+6uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqTl6WonJSQp62wpaCUmaifoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiclZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB+gpVuk12rXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbWRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW/uruzsri8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLqjo6yhl5ySo6CWlZ+blZqioZGOjKmwsKadlpqnpp+NkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4eSa5hdrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqSbscCurqurqLequK+1wbW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn5+RlJWrtrCmmJObrKmWjJSmmqWto5KYq7OkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo+von6NdYerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYWNmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNj85p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaetuZ2jrpiVoZGmoJOOnaOemZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGanJeVpJmQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3toxegHl9iGeDeWx6YouscHSFfldbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqitq6q7r7HGr7W0sLmotbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqacpqudlqmlppyboaqmpqKooZGsnpeinpeWmJ2ekLCplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phZIePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqV2x6gnJJSm+FcE5xTURWXGZgTFpXZmNfT1ttdWpxUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUtPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6mknJysoKOam6OnrKKfqaGZrpuUpqCXlJ2fnZixpZmiqJmdkp+dpKabqKSbnpucm5GXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnh6dnaLf3yJanOBdIN1ZHd9dmtveGxfYltvZ01YWWZqX1dZb3lubWZTT0ZTOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXl6GYraqmwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZihm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSalaKkmKSgmaKPmJWLi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6cGd5kYGBiGt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWWt7cGpqXFNMUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr+hrKKRkZ6ampSSlqKdl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqZygpayUn5+dn6quqKSiqqGrmp6foZiln5yfnbCkmZ+plJmZnpKmnJqqn5yYZoWTfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbnqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4Fvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziWlqfHJtY11RTlZKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrOunpakkKOwpre5pa6jj4+aopqTkpugmZmmlnukq6KotMO3pKGmrp6dlJ6jn6SdpKqpkp+gnqCqr6mpoqmeppulnqegrJeinKWxpZidrJain5uTp5mhrJqgf72EiXO0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46AdnmBgHlxe4CGcHiEipJ4bHWRYmVed2NfZYFiXXRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvq6anprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrq24tKevopKRmZ2mk5GgopicoJ6Ipqukq62/v7CgqK6olpGfnaKZo6Sqo5OhoZ2drK6oqqWjoqSfo6ScramSpJuprqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdX9le4h2dmx+h219hI6QfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylrKawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ6Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiq6qepKino7KilJuonKGclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLiuv08bHsrOfnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaioqJuqpqOhqpqvsaKorK+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwcnW1sChmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyoZyrqrGxuaaUmKWpmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hWGNtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjItJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7ago5iUqKu2s6ycppyglpCmrZKanKejoKqmraCipqmws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56ErH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhH5vW2xud3NqgW5aZF9obmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSGLh5mprKSruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ybo6eitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYraGroqSXrqW7rKK3tq6enra0urO2qZqgsqOmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI2BbGh3aHhzboB0XWRkbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJColknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmJ+po7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oytbutt6merLWmq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGWfmlsfmJ9dG2AeWBnZXBvZ2doQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiQpKbySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK6xraegqJutmJmPraKhnaWhmaWcrZefqKW2qL6upKmjn4t/jpuaoKaekpOZmpOamaWjopinq6qhop6oqLykl8Osq6OirbS7rbCpo7axrK6ad69/kIqchod8uq2JmGSwjGSWrn2hkISnl5yCrYyGsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtlo2lmIiUjZKTeXeMm3xjc3xig3d0gHxhaWZvbmZlZk9UYltBU109SCg+OT00ISEtJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46vrKmno6iarpOaj6maoZ2ln5mkoqWYnqKosai7rqSonp2OfIublqGgmY+RmZuRmZeonp+Xp62lpKSipKi6n6DGp6apoay2t66wqaG/sLCwmIKqk6OujpuAhqSXmJCBgLjDuoSPnZSFqJmeg6yMhK+KqZ2apquSf9a9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4VvnX96srHHg2ursb2seXiivrt0gJSMo5mNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdr6ems6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2grKypuK2no5qXknuHmZGnm5OOj5eYj5iTqZielqionqimoKKqup6pxaOhsKSstLWssqyjv6uzsp11dqqktoVliqBwZ6yQio9ubnelkJuhgnaynJhxkY5yl6qkm5mwpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2Npb1pdZ354pmBicpCScGZkgIyRjp+VlZeNkpp6hY2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fpLSqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVl62fpquin6SkoJKLpZKmmamalqOpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZanopmvpZ2hq7mfsMGopbSnrbGzrLCuqrynsruYjKOppbWciZejmIepm5CUnZKqtJqcpK6itZmlo6CjpJ6jpaKXrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdIN3dIeMcadtfZaTlJSBgY+Pjo6bkZ6TlJOdgIWTi3Boj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYV5NVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXmBhYl1eVVFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp6Yp56atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpaa0opKdp5+OqaCNkp+irbGboqWzq7OapqOfp6ygn56dmK2ek5qinJSQl6uZjZmal5CXn5GHoJ6VlIaUjZCOlo2Cf2aOiHWId3qJhHScaoiSlpWSiX2MlpGSlpCekJmSnYGGl4V4cZRyeYl/cXt+am5kXnBpYFxfWGxiT19iTlg5RkZEPTI8PTcuKiUrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCotqqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6Giomco5Cvn6SWqaChk5eZnK6Lq5aPqJmnjJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaednbeif4OutaKwsHWkv6SzoHl7oq21v5d3r6ahioCqfmRcYnegj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlwgZmqmW2ApKmKZZylnJGYmZeMk5yRhJ2bkJWElIiPj5OLhnlskYh2h3F8hoGBYWmJjJWTjFt2lZBmaI6McXmhlZVkeJeFgHaXaIKJgm55f2twZWB2b2traFtkY2FgbFBZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXV9nZ2dYUUo8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWdIucr6Coq6eUl7mgoI+cpJ6RfoiJm56OrJqklaiino6Xkp6Fda6PiKaaqJGWo4ibubOnn5iYi4l1d5KNl5OJk5CQk4yPkp+NmZ6lmJuxlYCMm7WdtIySj72non6no3ulsbqDjo+poISMhY+xqq+MipajmnmBi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgpGXloSammJ5iJKFjpCTi4RucpGIeoJxgYGGgId0iIaXk3iWaJN0oJp0e5mCm5mEmH6RiIGCmGmMjIRqeHtxcGdleG1pbGpbY2loZHBaW0hTS1BARTUtWVNUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpae0nZCDnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhqmPqpqNnXyoj3J7d5yOppZolaR5tIyhoKiqlJrCg4GriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfIWUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOptqKwf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x2m5uOoJGHnaOblpiXhqK4rKWZm4yMfmJtj4uTkIyQjIyXi4+Rno2SnqCYoad+oaeHrZ2glq6QoJ6dkYeCoY2tsomkj6ycjJp+onaAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX15l2xdfZhvYVRyhl1gbXqEYFllgn6FgZlyqKprg6NucqVvn4GbZ2SebFpsiXtlWV+CfmFXUG92ZW90cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU5NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8q6+imZaeoKWrq5+crbSiqJKgoKGnnJmOmLSZkIuejJWLdYGUko2KppaWmJ6ffpOFhayjh5yRipiol5makYelr6ailZmHiYBpboiIi46OiYuMkYuPkaGKkp2fmqGkf5OBj6OhlKB3nJaQp4OjqYCHrK+HpXqNf4SafaJwc5OHlXuejHlth5yLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgca4fHGVtoxygZukZHSsq2F+ap2zfm5+iYSPg4yYcYCjbHKjcp6CfaNenJmzlXB8l56zdHJbnrKCaWJxdHVxaG9YamtxcGRbZ1xhS0M9RDVRQVlxMjxTR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARF9eW1pXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4tq2uoJqhm6KjpKyamrGsq5OXoZmhpZqalJ6sm4uJkXiLhXGAlo2JkKGQk5Sdl32Rio6ooIaYjomRopObmoyLqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ygn4uJd5yYoo2gcqGMiamJnaiSmaquga6NfnqgmXmjk3iAc5eHjJx9lZ+Hm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXaEnWiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE42VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11YZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIBye5eIi5aWhJKVmI96i4SWpJyJlY+Gip2SnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6foZOYcmifiqCPjHCSjYKpiZqhpauiqn+xrqSiuJd3o7Oio3+IlHideqqZf6KPn52ZiZhyoX6IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4t4nmJNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUWdEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbGumoRTX6GntLqzs6iaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniVhZCbi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6om5mVioqKfINshIVxgqGMeIWMiIeRmJR6kaOfnqOIroZ9tYSPnp17ppZ6qYKXn5GMo59/p2l4bn6ZdKBzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iKdKqyqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZeYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSktBSkQ4UEBRTlhTWE9TUWBlZWpTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobWiYm3+wrFRdS36qr7G0sLOinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoiFe3B9g2h9j4KTmoF3kY6PinCAho+TkmyYk3yIkZKjlYOOqZmTkoqFiXmDdoiAboGfhneAkYWHmKGWeJKho5mfibOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3KbiXSle3p1YoSDbn6hbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15qdmt4h2ZrZmJzdG9sVVtSWWhPUWhJVUxYUlVcZ2tuVWdXTUpBSk1LSEpOQVFKUGVjam1ldXNzfnh7bnSJentVUU5tXmhca2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laW1lop2JsKiFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aAiZSVj7lukIqiYn2Zo5eJbnNrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWFNsSVhOW0hXaGhzallrVlBSRVZcTVhSYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRtjKeupamwsaWfi3+WqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6aDfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V6mIl7qXWokISabqWijJKEjIO8bXylr4KHhYeVmJ6ifqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gaJmHdaxmnq2MtnN2voykk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUVtJXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqudgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3R1hnKRg25/i5KHhpSPfHuBhZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gp1xj4Z5k46HgXtzqY1xfX16mJabhI14e319h5OVk4t3kpqhooR7f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnFvd3hvXWuFbmlnVlleVlxlamNVYFRdUV5vd3lranZkaWpqdXxwcXRzYW90YnR7gXh1eYJ1f4B/gXmLhYJ+e26AbWR5bl5XbmdodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaObpqSZpJ2roZ+Dg5aqkZ2fiJmmmqiZg4Gci36WlIeOiomMcoJ8jnx+j4R7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dh4uap5+gq4OJjZWbf36Kl62okJOokXlxn5SFfZVwgKuHcX6VcWpvfIGfi3+RjYpnbV2EjY6dnqCQc5eNinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBboKKd21jZWN5g3qVWlxpZ252W3t5d3Rtc3KDZlxtimtrYllYXFlYa3FbXmBZXV1lcn16dG90Ympqant8cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZwdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7KikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIaGinJ9gIp2hIuChJaKcm+Ac5iGhH6Tg4OGioJ6gIOKmp+PgaWghniOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKki4eTm52jmparoqioopOdiZmRfnqRkIaqgH+TkZKTnLGlmpSejoywkZiEpo6Olp2hipGdhIqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYmIi5GnkYSHjoeCi4+KeoOIhox/dGqBg3x5mWlyaGB0inF+e3d2b3Z0gV1eb4dnbl9eWVpcU2dxVWNbW2BsZ3R7e3Jub2Nqamh/e214fnBob29rZoB7coKAd399f4V7bYOMhXx6eXx9eoR4TmR2anNucXtlbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYeDhIZteIB/coCHfoiThG1sfnqXh4SDkH6AhoSHfIeDjJqdkoapnYJyio+FkpGLnZF8jXupg42Rl5WOm5aFhZumn6KanoaDkpqZmZCZpqGmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZySnI6NqY2RgJ6OipWcoISPmICIkIRweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyNh5yGho91gox+fnNzfIqFfHqOj4WUqJCHhI+BgomHh3OChYaIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcYHB9bnRgY1pbXVFmbFNkWl1gamh1eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2Fd3GCjYd+e3t9gHuCi2Bpe2t1aGqDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqOhXyKkYOMgoKCbHt/eHKAhX2KkH1raH2Cl4mBiI58foWEh3yPgY+bm5CIppt/b4qKi5KGoKGKhYx8qJCHjpGWkpaSd4yjoKGdlpuAgZCamJONmqOipJuYkpx/kIh7goaQiaGBfo2Nj3yXpKCgkZmQj6WMj4GckoqUmZ1/k5N/iJCDdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqTkYGZgImMc4OJfX5yenyNhnx7k46El6aUjIaQe4SFhYJzf4CEhXhkcHp/eHlwbGpmXn5zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWhUZFheYGdpdXmBcWZqY2xnZX+Aam19Z21wan13hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoNudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWjn42Xf4yhioiblnh8hod+hIp+iIKAf3B+e3R1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aVhJKKlZeSkXaRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImI+ff4KLjoxzl6KeoJGXjo6hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIF9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5+lXmNi32CiX59coB5i4d7hpKLjJmkl4KEjHaHg4B/dHh/hoJzXnZ3fXN9dmZsZWF/aWp3c3R1fXF8Y2Rhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamJrZmh8gmtodGhsbmh/fIJ5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuKmHmWnIuMmZB5fIGMfX2De4CDgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5egmpKQknSAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqRm3uIiZCJb5edmqKRlIqLnYuGgZOdgJSUloiain2LioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiFgI91koqFeol/d3iBfoeCfoWPh42VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohrX2lkaWNod4dtZmxoaWxngHx6d26QiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3h4bmyIa2hfaXFih2hxb2V2Z21sYXpoanx7eHBhd22LgZmaq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8npORl5SJd357in18gHZ4f4BwdHN6b4V9gYCJfnxhXH6PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJiKl5NwjJyGaImbkJV7iYWQinCWmpShkJCIipiMgn+Sn32TkZSNmpB8i4aJdXN1a3FudX2LdW+GkY6ScnSAfIKCin5lcm56f5uVfoWKdZKMgnWKe3CCf4KIfoaOi4aOlquOe4h9foqEdnxubH6CgGFmd3N0bnpiXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcX+HZV1paGZiZ3GNbmNoaGVpaIF6d3VvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t7e3N5hGtrX29odH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmaOooaebiIuKgY6chpKadH+olJKNhqCMlpSRgXR8doV4eH9yc3qGbHJveG2JdoCAh25xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ6Kj4aSl5aFiJOYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIimhWiJn4yTgI2FjIF4k5iSnZCPiIiTjX9+kJl9ko6RjpuTfYuBhXB2cGxub3F8h2pzg4+Zi3J4gHWCiYR6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnyMiIWKj5yliXyEdoGJfnd3bGh9f35bcXJxb293Wl5wYHBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFNZZWVhdG+EgmFda2xkYmZrkm5gZmZfZ2qBdXJyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4eLf3x3i39qcWN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShouajJaOjHpyeHSCcHKEdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZygnmBoIKQgZKSmJqRmHeQeoKMkqOak46IlJiShIWWmIuTi4mOj4idhJGLfXKLhYiPiJyan5uXloGVgGqJn4ppiaKJlIWShIpxg5GXj5qMjouLjo13e5ORe5CMjpOYjXyJfoJsd2pvbGxte4Bien6Ql4J3eoJ4g419emh1bXaIl4yAiYd8lZJyfIZyeI57jI58in+FjpGfoIZ9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BOW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfm9scXOKfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Jrg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+ipiSjoSImI6Pj4R3dHdzgHBwhXRwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cmtkbnyAaWdzbmdpc2xTXW5kcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19edE9NS19mYlt3cIl0XFtkdWBiZWWOY2BmYlhpc3Nta3F2i3x0eYeCdnd+i3OAh396iX9yiYeBkIqIfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSekI6FjJeEk4+IgXV3cHlxb4NwbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHaDdYShhJFulY+Vn5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am96dFiJe5KIhnp/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJvZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFzbltjc2JjVm5aXHdMTEtjZmBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3eEgXl4fIlxg4V9fYh7dIuJh5WGjX9+mHNndXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn4yOfJaNf5qIhXxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaKmoiMaZePj5uUkoGIcIWIoI2Fi5WKjJeTe42Sh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjHaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml1eG1ajX2Tg4Z9gIOBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIlucXmLhHRqb2lvdX5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaIRxc2pXZ2lkaVhtV1t0TEpLZWZeYXFzhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgn97dnqIc4WEfH+HdnaKho+YgY2Ce5N2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp8iZmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3twkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXyMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0eHZrY46Cj4GFf3yEgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaHd5X2dpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRjXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWlticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYGSlXyJhnaJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYeQg4qNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiHGBfWZ+jHx5f4CIjI99aYF+hHZncHl4dHh0bGqPhouCi4B5goGFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV6c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBPWWpRRFNmYFlqbW18bllbXWxiWmJvdmRnXF1ga2lja2pzdoGDcW5/fIB0dYN6g4N9gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVqaneEc2yTjYafmZ+ZhYdufYt1aXeWjX6BioKUl4p6kJZve3Rxa2pkYHN7aGBlcXpaYHJ8eWdxeWBlZY+xsndLYlql2dCWcXqQio93fZOKhJiQi4Vua4WRkXp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCDk42EgHCAhHiGe4iem5aNlZGWhYhwe5OCfYKCiIJtgXZogIV4coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4p9d3mBhXqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Vnem5dWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdqcmBvTldnUj9YZl5ab2pneXFbWlhqZVljcHhfZ1xeZWxnZmtpcXd/h29sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmIqBfI6NaHhza2tmX2FveG1fYm94XGRrgnlhcXVfZWXU6r2LMjo+i45/cXmFh42NdYKWjH6SjYt+bWuEjIx1fY9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo6LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCa39xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCGgHR2f4F0gnBcboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bWp2gH90c1tnZ3VuV1Z8U1lvZExacnJlW0lxeG9cW1tZXXV/dWlaYltoZm9kak1XZVA9XWVcXXVlYHRvWllVbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9gX+CenWCgY2ThHCBi254foB7e4iTiX9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZ3JuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjIp/b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9g4FweHp8dYBtWXCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoa2dtbGlwd3ySa2iEin18b35+e4GAgXp3gH+Ki4NxfIdvcniDf3uJjI+DaX17bXd4dot2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZ19wb19gZ3Bmam6JdGF0b1thZGp1eoC/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0h3SId5OIeXlwY3eHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkpV/fH+AcXx3fHSAY1Z4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353kIaEd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJ0XWJcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XltmbmhWa15hamdlbm5pcHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm53goJ+iIuTf3CAe3h5eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGVZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39wcX9thHSThXh0a2B6gnmJj2ZyhHBodW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1pgV1ZVd21iUFJ0dlhQVlheYHKEcF5hY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtbZ2tgVmpfYG9mZmtwaHB2eI50a46NdX92eH13gYSBe3R9g4iHg29ygHRxdX6FgYmNinp2f3iDe3yGh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIaDdIWGhHiKe2JubFtiW1thVmlzYmBbZ25wZodyYXFlV1xia398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpV3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmdxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOln5ziWtvfoJ5b31eWXN/bnSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3NhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZXBZW2poXVdnYF9yZmtncWdwc3eGeG6Vi3R/enh+eYOIf3Vyf4eFjoNwcHx4d3Z6hYWHjIZ5e390i319hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1tcXVRnc2RgWGNxcmeAcmJrZFZaX2p/eL6ue5+3bmFzhWhzenF4gYV6fYt+d3dydm97dmVqb2GHdY6Ac2piXn55eYuEZnF/aGtrWlZvd4mjgYV/cJmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYaOhpeAcY1oa3uEdW52Y11xfWx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh7aGFOVXVrTFBUVV9ndoRnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGZsZHFncnB1gXdxmYZ2f353f3yFh311c4KIgJWDbnN5e3p0c4SGiYmDeIF9dY9+fIWKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkoByjoFxhoJ/g4BwZmxnWF1bXFtTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Zpem97cllngXd1aHCBeIJ3YneGi3yVgm+Na257g3JndGZhbnpoc3iLe35jd4R3a2xydXxye3t1f2h/gIB5d29kZmJthXtsalVoYW9SSmhqT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFpfa2BbWmNkX3ZnbWJwaXRvcn91dJmCd3+AeIB/hoR6fHWChH6XhW5ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Ad3ujpYp5h4WDa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF5aaX9pa3CAZ2xgaHl4anJzc22DgHp/fHV0bXpnaXlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJOCepd2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanloe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFzY3JqXXF4ZXJ0iHx5Y3SBcWdqeXVzbXl4dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVElbeV9bX2pdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenh5g36Bk4NxdHR+enZ0hIiRfYF8kWtylYB7g5+Ffod9gH6GgoCKe3eEq55/eoeHgmpygHl1gH6BdG6Gbn2Ac4qAanBuZGRZX1pZWlRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGt2dWdzdnFshHt9fHh1cmx5Zml3Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cX2PfniQc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXpoXXSAb3Jrcnx+dXZidYaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d3e3p2cWViZG1yfWlqU2ddXFRLcWJQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RbV11Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sWl5cYmNefmlqYG90eG1wb3aDmHpygIB8f4mMhn11dYV5h4x8c3V1gXl6eoGMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXmVWWVlXY2ZrX11cc4VoWHFuW15YWltremJwd3ZsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9/iX52inSCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2J6ZVx3fGtub3B4eXR1ZXOEk4CIg4l7d3BzfnRjeGVccXFicXKCfHRnc4FlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVRtU0pOWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbX2FiXYRpaGFueHltcGt2gZB5bYJ+gIGTiISBdnSIdIyGdHF2doF4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cZmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNybltZWFdfa3ZkaXVqaV1ZbXNwa3Nzc2mEfH5+enZubWtkaXBjW2pyZHR2jnNbVlNlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHp0Z3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVRXUU91WlFPWFFIY3NhYEdWalFJUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp8dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnVvYWdla1JdW1VnYWxrWlxxjGRPb25cVldUZmlzaGJ0ZWRcWG50bG91dHhqhnx/e4d2j3NjZGtuYFxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2dGNtd1ZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2FGWGlPSVhUV25pZX1qbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF1ejm5iZmt5dm5vaXZ2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jjn+Mk3J8ipGEh5+Ge3+GjXSBhnN+g3ZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R8bWNmZ2hTX15VZ19rb1tebo1oTmltYFVWU25mc2tleGVkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXh0bnxrdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNfaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJiI15bpCJdGtzgXR/f4iFh5GElo95fYyPh5GbhIB8jYVzgIFzdHlzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5vckosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2hrPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYqKioqKioqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOPiI2Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf3+Af4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+AgICBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH9/gIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5PT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn9/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTkxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwcHJ4eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz88ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQkI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTkpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pz08Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgIB/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQUA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQDtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAPz1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHt8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9REJERkZEVniEhIKCg4KGiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs8PTo+PDo8Ozw8PTw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSUxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYSGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQUBDRUNDQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpKRUpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXd4ent4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT5AQkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEtHTEpGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh4enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQT0lOT1dWWFpaZHF0d3Z0dHZ4eXl7e3x9fX1+f319fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXx9fX1+fX19fn1+f39/f4CAf319fn5+f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt7e3t9fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFJSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87Qkc+XHR1dnZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNSTk1MSUhIRj8+PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05OTVBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTFBQTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJAQEdKRU1PYmVQTU9NV0tMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHV4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tIQ0NLS0xOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxMTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUpIS0lHSFBLREpOTFFOT05PUE9KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISUhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZWVFlgX11pYG5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFRkFCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlWWF5aXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QUI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlFPTVFXWlZaWVdaXlpYYWBhYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TkhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhKSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWlxfX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVpamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUtKR0tLTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFiYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUxMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1KWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSktKRkI/QEI/PERERkRDQ0NFRURGQkVGR0RESkVFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTUxbc2JkcF1sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUtKSklKTU1OTU1NS05NTltycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBcYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHTEtLTklJSkxJS0pJSUtMTU1MSUtLSlNrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISUxNSUhKSktLSUhJR0tLS0tHSEpJS0tMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISkpISUtITEpJR0hISkhISEVGS0hISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKU19ZYFhgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZER0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKR0BHRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKR0ZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9YX1tdVVhYT11cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNXYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5NTklMQkVBQ0NGQ0JAQ0Q/TEdDTExQT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVpYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9NVm5ZS0NQX1RrVmdKXVhVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHN6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPR01QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUVJUWVdXUFRQUFBTTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2NlZ2pqZWdiY2RsbXBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1NXUGFeUlZRWVNNUEpTVFZYV1dPVVBPTlJLTHJvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcaHNfXFtbXV1fY1pfZGRlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpVUlpdVVVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1NQUVVVVlNaUU5SUldUUlhVU1hUU1FVU1VVWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNnaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVdZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVVYU1dYVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SU09NUFNSVVtVVFBQTFBXVVBWUVJSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXV9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOU1hVU1FSUFJaT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWdeXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTVRQUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlNUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVlRWWVdMUlpWXFtcUlBVU1dVVVJPVlBTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZlYmBlYV9hYWJiX2BeVlleWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV5gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2JiYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFVVWVBUVlRSVVVRVFVXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxiWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZW1laWVlaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZGFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXl1fWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZqZGZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVXF1dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGpnZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNoaWdkYGJgY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4OCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+wqKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3Qqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXp6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCg4ODgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4fHp5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eXt4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eXx6fHd8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp9fHp8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgYCAgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXl5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgoGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoKBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSDg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoOEgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoOCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX+AgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgIGBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGCgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f39/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4SDgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgYKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEhISFhYODgoGCg4GAgoOBg4WFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhYWEhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgoODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6QjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYGBgYGAgICBgYCChIODgoOCgoKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiYeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SEhIOCgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhoWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGCgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIGCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWEhYWEg4SFhYaFhYWEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoKCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHh4aGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSFhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFhISDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaFhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWFhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKiYiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SEhYSDg4SDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChYiIiIeHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f4CAgH+FhoaFhoaGh4eIh4aBgoSEg4OFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgISEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYODf35+f358fH+Dg4KDgoOBfn1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn+AgH59gH9/gICBf4CAgYB/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYGCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKiIeKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4KDgoKCgYKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCg4WDgIGDgYCCgIGBgYOCgoOBgYJ/gYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKGhIWEhIWEhYaFhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8g4OEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoaIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIGCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiKh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjoyIh4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKTkYuMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHt8en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjoyKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gICAgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gYGDh4SIjYyKiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYqHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhoaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+fn1/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIODgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGDgoKEhYWCgn59fXt7fHx6d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GBgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CBgYGBgYKBgIB/f39+fX9+eoGSi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBg4OAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChYN/gIB+goOBgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOBf4GEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fIGBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhISEhIWFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4F/fn1+fX2Cg4F9e399foB+fXt8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4WGhouKhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgYGAgYGAfX9/gX6Afn1+gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYmHhYSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4aGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFhISEg4KBfX9+e3x7fnt8fH1/fn18fn6AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeHhYWFhYaGh4iGhIaFhoaFhYOFhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoeFhoaFhIOFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4eHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fX5+e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeHh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYeGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGh4aGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhIB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFg4SEgoWDhIaCg4WFhYaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af35/g397gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p6enp5e3p6enp6enp7fHl7fXx8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8ODo8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ozo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb3NvZ19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqIoL+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTTnqvqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz0/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1N+sKyrq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJehbKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STz8mUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4nayeq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4rClIecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjQ1LvImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pa2cntLRlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCfk6W8s5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bp9CLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKHQ2qWZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ6gkqeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGjpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqtackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk7PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw6Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUtPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX0xIUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXFlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmFaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yYGhfY1NRWFRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NtaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJacnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbWFfZGBQT0FAPDs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFdWVNhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ6OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpeUlJGUmpiTj5OdlpKLkX56fH90a2xuY29saHF3bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MrGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZWZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIuLjI2SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlpZ11pb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmBndWdpaXRteGxdZFtVX1lMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8jKx8zIx8jNxszPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0MKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs7Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/t7yxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLe2uLa3wL/EvMLFxcfHysnGz8LBuK+1tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAuK+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1urW5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenJ2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHFzd3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXIur2+trGnpJ6hqbGutbi2srCrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3Zve291cm1iXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyxrrKppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlxdnNtdGlrXVtqVFxcT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw7PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUUNNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+nn6iqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJSQjI6PkJOQlpWWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeYN8dn95YnZsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqSmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfX2AdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6xqqWqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Ganpqip6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJqakY6SlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2ysLSpsa+imZydnqGYm5uamJmblJWalpicpKGgmqOgmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5SZkpKcmKGdqqKmoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp5+fo6CXkZScoZyamJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJWVn5ubmKShoJ2joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj83NTg9Pj9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56boZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWgn5qSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vLKytKGroqmosamqqKenmpidmammoJmnoJ+ep6elpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODY3PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ+foqOen56bnZuUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK6trOpsq2qsrSvs66prqOdq6a1sayir6Wgoq+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKGcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubnpqenJ+lpqedoKCssa+npKSjoZ+mrKefl5yVkpqdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8vSxr6/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrrq2vrq6qresqqq4urS7rq24o6ainqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5SPjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/S08zKwsXGxsrHzr/I0MvGxMbEwLvCwL6+vrW9s62+v8LCxsTGw62+uLG4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBPDs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeSkI+Mh4SEiYeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrOytPX0dfS1NXT08jMxszNydLMzdPNxMbJycDFy8fIyMW+wrOzx8TLysrOxcm/vb68wcfEzMzIycDDv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTs5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOeoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0cnR1dbZ1dfS1tjO0snO0czO0MvSz77GxsnCy8vLzs/Fxsa2v8m+0szLz8XJx77CwsfOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09DH0NjX2NDX0tfZ1dXMzs/JzNHLzs+/xcHGxc7M0NDRyMvLv8nLxdPNy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzo9NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6ZnZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dXN0dDY19fXy8jOw8jOzMnMv8i+x8jNzc/K0M3Oy87Ox8rPz8rOysHIxsnMycvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnpWWmJWKbF9fXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08rL0NHTyc3R1dLV1crAycHFzMLHycLMwsXHysrOyszMz83Ty8XHz8zHx8rExsDFycvMz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozo7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrnL1dbZ2tvYzM3PydbWxcS4sraqo66tuLmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nKz8fDw8/IxsHGx8O/wMbLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qr65ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrCv8O6ycfIusfFxMq/vcHLxsXDvsW8vL/CxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaylpZifmKyjoKWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NLMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcXCvcbAt7vEyb/Cybu3urrFw768wc3Cxr69tcC9w7q8xrrCubO7xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3AxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3uravkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrvBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7tK+ytrq+s8S2urWsuLy9wL2wubautrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Ghnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqessru6tsK5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHHy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6u7vKt7S7vbW1q5GJkJB8eX6KhXp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq20trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6kqKKrsbKzp7yqq6irrK20s6WoraCkr6mypaeorqWntqywsre5uruxvL2+vsS/tcHAx8i3v8DEt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDxsW6vMS9uba8xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+kpKekrJ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sLekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLCsrKyxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BsYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8PGs77Fu7avuL+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippuen6OloKeemqKbn6qwrLG1oqmqqauspLW4rbavrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+fnZmdn6WamaOcm52vqKunqqusrbCyuK64ubqwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCw7usqbS5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpaCkm5+gmpitra2vsqCloq2rpqG1sLGxrKeusqe5sqa2oKKemqOhraKhqbWqoqOmnaWmo5aYnZeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK4s66pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+6qqawurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn52hm5agoaijn52onJuaqqausKubo6O2qaCfrqi1qaamrLCjtq+jtqCim5iYq6ahm6y4r6Kho5yhn6CTlaGUlpabmJeWl5yVn6idqaOhnKOqqrCtp7OrqqassrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NTUzMzk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tbnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBur+/ubm8t6emsLumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+lpKOlpp6cn6Sfqq+mn6KktaegoaKns6Glp6SupLCsq7SeoJ2UlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSrpKSwpqWiqquspaiurq6rqKmps6Wmq66zsa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc1NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uralp7G1naKKmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFNVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWpJmglpyfpKGspaOjoqOhm6qqpZmepbCpn5+cpKqdp6Gdq6upqK2toqGhlJeimpyPqqiwm5+in56XmJOKnpKNkpKVj5iYk5ugopykoKGVoKGjpJuiqqSipKqiq62lrbGppqWmprWmqqits7W0ubqvqayei3Jwb2BbV1ZVUkZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtbzHu8HHw72+trq1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OjoJSTm5aVkaiprJqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaiioqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbLtLC9xLzCxMO8wLK5r6Wqr6uel4aBd3hvbmlubm5xZ2hpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTk9RWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqqatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloJ2RkJKSkpWnqqSZmZmdnZaOjIuThoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y1q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZQU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMtLm6vsDEx7W0tryyurvDvsGws62wrrCrm6KIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkq5ymmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjICLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKanpqCftLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPRE5OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzsq62oqy1w7q6rqqrtK+vn5enfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaGOmpuioKKXpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmOm4uCiX+JmJ+inpCTmJaEjoGTfn5ziY56kIaSkJCcmpmZkJWPnY2ioo2JmqCho6OborSvrK+sn5iluKalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0ODg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+0r73Dr7HHsq2nrJWjrb+3sK+fp6ysqpaUonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSVk46WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeIJ6hZOdlIOVjpGPgoZ8knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqCgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg0NDg3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raanlaWko6CWjpZpUE1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk5LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoeFlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Td3V2eISNmXBRjYiKh3t+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoB7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnGSeGd1hIOEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ60qa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGk6SWnIyCloiPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoaPe3Z6b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2dzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpubo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkZSAe4p6hIB+foBlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c4yIg4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2woq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH13dHd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZFzc3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorp6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cZ+Uc3iAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjZqRdmx/e3xtcm5wf3pzdW1idoR/hoCGkZGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Xiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnWhmXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5boWPgnpugXdzhHpxc3l3a25pXXeHfYd8iIiPgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MTA0NjQ2NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgHODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d3oZmIho+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSf3t1i3Z8eG1vd359cXFwalpcW1pjY1dnZl1WUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iIqAdYV5X2NWTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlXBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiQgJqWgqCgl5WbmqWtk5m7sae7yMOnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GHgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3l+d3twaWNcWVlcaV1hZ2BbUE1OWVNSSVFLRE5HQ0tEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSAgoyLgomOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01RSUlLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaSjrJOotqKnwcKux694upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlWxvdYmLgZWMjY93kIRxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWUxIUFNRTk5NR0lRRERORkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6FlJJ6gJGJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8QFI1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpeXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNzfHx5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUdHTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJmOeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5PEZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbSssLeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO1o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtQREpIVE9GSExHS0hGR0hBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj32GjI+LinuJg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0pHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbPAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxspiWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q3uaicuKqNpY+SlKCGeoGAclhfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUtIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY1OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpLRUZXVFBej6StpLK0w7a4wczKt7zEvbO0wri4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7mhqLG5tbu+zL/Fxb28s8K4uri/uLu4uq2tsaaxqq6+sb28wsKtmbupla6PmJmriX6AeWhVYV9WaGNpZVZbZFpXVUpIR01SSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5STjY+XkoeHe4eBjZWKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0pMVFpUXpSvuLW7ucnAu73Kzby9wby4try8t761urLGYHWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y9uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9cXl5cVWBdaGZTWWJXU1dKRkZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGPl5KWlo6GiH2Hg4yWin+CgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7t7q2uLm0uLW1rre3mWR1qZ6tcF6irZ2YoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nL0czPzsrHwMDCyr7BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW1xZV1tfWGFiUVxhVFJMREJGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZaRm5KFiop/iYaMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOm56Nj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVlaW1ZeVllkWlBdWE9SQ0NJRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6KiouQiHyFgnB/h4KGe4dyg5KLj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSShY+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN8fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsrqrprSjoq6ipK6jp7KgiaablZORipKPiYKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tfXVxWUldSW1BKSEpKS0A7OjxFQ0U9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW51gHZ4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZKMnp+gnpGXmaCjpKezpaSyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNqYVlWUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4iGh3uFeXF7e4SFdXqFjo2eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnV5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiIg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NfY19jX1NvX09nb1s/b2tLWydXMknR3ZWRYV05RUlxHQ0ZJST9CPj04Oj5AOz5JPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNUxHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZCLjpODjIWJiYKGkJGenJqIhYyBhph7iImfl4+JjouLgnygiJCKvKCYk5eZnKimpa2ep7W/v7+4x8nNzsTNytHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoJ1dWNlYV1SVVVUTUtETkQ7PT08OTo8Pzk+QTY+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEw5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bX19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2NnKScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZKOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Qg4x/ppmIhY6DhoSApIWKi7eXnZGUlaGmoJ2dnaOutrm0q8DGytDHx8zP09LS2NLV18DX2Nnb2Nra2dnX3LZ0dHNmZmJUXVlST05IRExDPj0+OTk7Ojo6PD02QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoV+d4aboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOi4qdl5ijo4aTnZWgioqIjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNx8bPy8/MztbQ0dSt1tXY2tja2tfW2dmca3hwY2NZWVVRVVdDQElEPz8/OjQ4Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hIKFfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiY6Qq5eXpKOImZ6VmomPh5eXioWPjYF/h4+kiI2TqJqXk5aYoZiemZOcm6KytKWjvcG+x8XFyMjJwsrSzc3UqNLR1tbW2NrU09rOf256ZF9bWltMSFRaQkJIRDtCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fISHin6LorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqmarK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWSmbOWl6Whh5yZko+KkYqXm4mLl46GfoyYnomQkJuampOYl5+ToJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ0qbOzdTS0NbY09DYuW51cVldUl1VTkdJTkVBQ0U1Pjs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxLPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eIaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5mTnZm0l5WrnYqclJGNkJKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKzCyMW1ur28xcfIwtGgxsrNzcXX1tHL1J5sdmRZV1BbUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTDpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fX1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbWtq7O2jKiyrq29q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKjuq+pv7ytrrK5paWofoiHnK29sIOMjIuQg46DkY96gYiQjY6ciIiPl42LlZeUkZqWnaiasZqRrJyOmo+SjpSQkJaXj5KgkomVm6OslJaPlJydkqCdm5ifoJOanqalpKKjsLKmwcbDsLC7t8XDw7/NpsfEx8S91tHNxcqFb29eWVdcWUxKQktBRkg/QUBDOzo1PkE+PjU8Nz0zMzMyNDFBMTdAQk0+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6mwKSrsLu9qq6ro6Oep6uutbCpm6CqnKGclp+wtaeMo7u6tsG8rKmdtKWlqZSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKQoZSHl5+hs56UmZOfoJeknpqfm5+UmJ6lo6ampK+tpcDEw66ot7bJw722z7LEv8S8s9HKyMK0cHVpWVVZZ1BLSENNS0xKQUI+REU8NUFFPDszPTlCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WiouIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6nusC9u8S3rMGprLO8v6qwqqSlpKyus622taCgr5+lopmjtL2pnKm9wqO2t6+slLKsrK2Xh5qqpqWRgoyTpZaKgXWKknmFjpKQnZ+Tj5SLj42Uo5mXnJSUo56qnpGlmoyPj4+Vloh8j5aTk6OblaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMSvpbO3zL+5r8Szu77Cua3Cw8LAl2h1XlZUWFhJSkxJRkRESURDQkRMOjRESTo7ND04RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZraekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtra8rbO/ub2ur6igqai2rq2psreanq2ip6Geq7e4qqWvv8WxvbqzqKu3tK+vl5alrKigkY6TssWnlo58kpV8h5KZj6mYl5OTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39naldUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+vmKSvpKekpbXAsKystL/DucC6tKi6t7m0sJalra+upIuTlaGNdMKafZeahI6XmYywlZqalZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacm5WapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7ursLLIv7imrKutsrKjobKytKRtamJZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1K0M1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCbo6S0ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istre/wsC+ubOzxbO6vq2kr7WsuaaIm5imm3a/n4SZno6TmpqMrpehnJuXlJqfoKieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm2oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlKCMk6uckZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLJtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorL21uL7HvLe2ucKzv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLaysp6do6Wbl5SYqqGedVxZXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvKDsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJebmo+qlpWnppWtrJmiq7bEw7y+tsHCwMfDv8zFu725srC5s7/Cx7W/sLy3ubalpKurraChmaqqxKKkqaulnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqraycmKCgko6QlaielGVfV19cTUhHSU5MSEZESUI+UUlBPEdJSVxST0s9SU9VNUJGOT5HRzVDYVpLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCTo5+WpaCmqayYtrGjqrO2xcS9v7XAwrvIwb7Jx7a4tbSxs7S3wcW2vrG4tbi0n6asqqydnp6lpMGln6mtn6Sqra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGun5minqmorKOawqypnqyum5uemaWgvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma2VnY6Yk5yBjp+XlY2ho5aQpa2xq6mhoqWklZWdmIqOkZKknoheYVhiX0tISkpORkVBR0s/PktCOjlKS05dUVFJPUxXXDlGST1ETUg4SGJbS0NMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOolKuloKSframsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC0r77DtLmysLq0rJmosamqmp2loafBrZussJuqo66xqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWjrKGfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqrj52SlZKZf5GglY6Nn6CUi6Wrr6WmoZygnZGRmpOFipGNm51+X2RZZmVJSExJU0FDQElIOztHPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsmVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+boMOppKqzoqS1qpazraeipLKsrqm7sq2xtbTGwMTCtMDEvcnEtb/HwbSrtaivuKy/w7O4r622uaWYqrKrq5ifppetu7SbqLCaraCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpecoo+ajJKWmIWVnpOLkJudk4qoqKqipqCZnZWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzs6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjIzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6OdoabAp6ivsaKqtaueurGspKu0trGwubewt7i4xb3Dx729xMLFv7jAxcC5qbakrLutwMG3t6qtsbqhk62xrbKWpKeRqrmqn6axnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6KbmJuShY2Zin2LlYSNmWhma2BsbVdQUVtVQUJFVEA8O0lBODpYUGReUFdXRVlfXk5NUk5eS0o+WWNeT0hQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmM/MTY0N2dZYEYoPzhsfWdbVjuJe2NDPqefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7u763tsDCv8nEucTDv7+3w7zAtq61pqu3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56sorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpLSuqKGtrq6xqLSts6qknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6mclZeElJaKnZibk4qNlpaalqalo6CclpWWkn+PlIV6jpKCi5RkanFmb3FeRllnVkRDTVdEWzlIQzY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1FMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX15fVDE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbekrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLixs6upura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsravo5mdrKeal5+bmau3opeTkI6YnKCXlpKpnZqSf5GXjJybmJaQipSSnpmkoaKgmJaSkpV6i4+FeoyKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYF9RTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqq2mpK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y2vb+/t767sLutprm5trXCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrK2q6SZoKuom5yenJSpuJyUjo6Kl5uhl4+WpJ+blIKQlI+cmpeWlYiWj5eap5ykn5GXkZCVdoOPh3uEgYOLimxvdnR7flxMZm1bS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYFxeUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUsQS49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7SruLK4oay1ucm5rsG7w7izsbXCws7FwMG9tL2/vrq+vLLDp6i4sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2xtq6jnqOoqpugm5uSo7OZj4mNhpChn5SMk5uekZGDjJKSnJmXlZSHl5KVmaeboJ6Mk5GOkHd9jYV8e3yGiIhwcnF9fHxcU2RvXU5YZVxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEoqOkc+M0JIUyw+kGs7R0iPnKqso6qxpKmltLWytbaysqKsrr3Muq7AusextK20wsPRxca+wLK+wMK7vre7xKartquytrzAr6uxrJ+jp62pqaWwo6qyqq+ssK+wrqy0vae2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7Gsnp+mp6mZpJmZj5+mmIeEjomLnaCOiouUmo2NhIWPlJ6clJeVhpaUk5eknJ2bi5KQjol+foeFfHZ+hYOEcnFwh3RsX1pgbWFRcnBcSzyFfEY/WHRYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0VGNjtCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Grs8PDzs/Dv7+0wMHDub+zx8Oqrratsri/vrGsraukp6qwqKipsaW0rqqxrq6ysbSutb2kt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqp2ipKOkmKCblo+XnJOCg4+IhZugi4mNipeNjomCi5eimpCQm4yTkpGTo5qbmomPi4t8hoCBg3pzf4J/fHJ1i6SHeGtfYGxlV2SGY04/Z5NMRWJ5V2NZUmVVTlZVVlRPXF1hVUtNaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWS4wSmdBQTs7Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRwMC7ub++wbnBucDDrLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrKvs623q7m4prS3q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm5tqqqqqqiqqCtnJKqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6qcoqOjn5mZoJCNj5iNfoeMh4OdnYaDiImNjI6LgoWVoZmNjZqQkpGPk5+XmZaMi4N/dYeBf394dIJ+eHZ9gIedj29xZ2Zvd1xfcohqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVVNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGEwMj9mPU5YP0MsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u7+wrbmuoravycfI0cC+vbu7wb26w7++v62xsbG1vLvBsbCzqrOppLSppa6zs7mxo664srGzu6u7sKqutquqnqqrn6Ogtq6poZ+wsqG2qp6op6qjqqGira2ovrCsrq2iqKigrJmQsKGYoqCnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY2LkIODk5+Wh5GdkJOQjZGclJePioaGeHWCf3x1eHl/eXJxd2Z+hqR2aV9jaYB0ZoiMfFJYcF9LeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wwp6q3vcC7r6e5qqausMnHyNHDvL++uL2+vMi6wLevr7Oxurq3wLKyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6OfpK2sqJyeqrKktKibq6epo6ido6moqb6stLCunaqkoK6cm7OilaSbpKagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4aQjY+Df5OakoWTooyUkYuRm5KVh4l/gHJ7en58aXh8eXNubnpmg3eFimRhZl9xg3lsZnhdXlQ/V3ttVGJQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHaUkyNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaast8G9ta+iuaynp7DCysnMwba9wLS3v7rItMK0srG0sb23ub21rbi1vqyhs6errLG2uLWsn7+9qrPBtLyhr7O1qqyfrbCjnKWpqqSenKSwpbCgn6upp6GpnKWpoa28qK6xrqGro6Sunp+tppefm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouFjo2LiYSSl5CGlKOKk5KHkZqRk4CJfXlsfnZ5eGN8enBubnB1Zn9yaoRoZGZda3KMbGBocGBvPVt5bFVeTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWdZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr6+pq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbLAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq+2taemp7Czn56lpqiippmfrKipnqGqrqagppikqaCxuZ+ksa+hrKGspJynp6iZmpufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWfiZGVgouXjpF9hXxzcH5ydHRgenhobW5ubWd9cWN7bWlkYFtkhH5eWXNqcklJf2lYWk1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxlYzI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qai5w7SyraC4ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7G9w7mpu7q3p6e1qaissq60saicv7imrr24s6Cxt7CopaevsZuhpKClpaCXnK+moZ6jqK+hn6GUpaWiuLChprGrn6yjr5icqqWonpeanqWUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBhoOHi42FjZOYjY6WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGtramdmgmxlcmprZGdXYHJ/XllrdWlYRX5eWlhPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcOyr66itbCsra+1xcS9s766t7Czubi6uLqurb+ztbivv8G4q726tKWis6upq7StrrOknsO2p6q4t6ygs7yqp6Wor6uZoqecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaCZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gISHh4iRhZSTkoyQlZSNjpR7g5eQi3d/fG11c21tdGJ4dGhmaWZjbYNmZ2hkZmdoXWRhaGVaZXpiYFBzVFtbU0tKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmBzQjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+soraup6+vt8DAvLHBt7Gusra1ubi1rKq8s6+ysb2/t668vLCln7aspqe1qquvoaHFrKqosrWsrbS6naepq7Gll52qn6elkpmlraKYnaSqoZuhnJihnqe3pbCrraGhnp2hlaGmn6KgmZyanJSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIWFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNrYWZjYXN+YWRlZmRoaGJlblldWFxsY2FMZ1daYFZJR0lLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhkoyvoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm9vLutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2rrqyuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaW6qK6ioZqbnpmfpJqlnZefmJyWmqGUqpetqpyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2ptamRoZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8RU1hODo/MjQ5QDM3ODE4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnY+Psp2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4ube3rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6ewsri1rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqdoY9ro5aZnXGDmJ2lgHaSrKmel5iik4qYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eIuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINlXWRmbmpnXFtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEVHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSys7G5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/laiosbW5ra2kqKyqq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZl6OIoY+SmoehiJWfooClgKitn5WUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GVl1oWmtpWYdwa3lyh2iHhFleRk4+Rl5NRlNWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6tnZqZnZ+rqqiqvsOusrm8t8G/qqS3saqsprO1r6+zt6uppbKtpba0m6y1trWlpqmzsq2yqK+eqqGyqaCkpZyipZ6xuJWmqKi3vqatpqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWTmJSdiK6QmJWKqoyZpJ2GsYGlr6CVm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY7YfVJqYrayfH5wlXWaoaqQVk5XYU9WTUZWXFhQUFOLXFdbUEFcRFBOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaivtKqwtrSoqKa2pqi5r5yysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqqigrK2koZ2bmqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aWk5iSmYWva2qMjqp/aIWWh61mcqCflpupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99ZnujpoFYXoqrZ3yMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraeln6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6Oquamds7Oxo6Sgqq2wrK+nqKCjo7GcpJ6ZlpmdnrCpmJyjoLWzoauaoaysn52al6CjqZ2ZnqWgnJmhp6SQnaKbl6GgrJ+mpqCan6GVlJGXkZuGtZu1eYepmraZeIe0m7d/lZiYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXU+pbWJveoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdLOWBUNTAcl6CVibSnp6GtqaizrKq7t8KwvMKtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbO0qKOinaiqsqiwqKafoKCwl6CblpaXm6GxpZybpam2r6GojqmnqZudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1RaWhkUEBYZ1ljYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2p7KxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqbCptKmmnZ6frJiZmZiYlpijrqCcl6musamjno6soqeVnZeboaehmKKio6GboqKonJ6gnpWZm6ehnKeUm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4RhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGhQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk1UX2VQNUc9YU02Mi6jnpGmsK2lqbutprSlp7a7vLO7vri4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaZmZOUpauimJSnq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn5yllJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4GBlWySW7BXS5p1mHlmYa1ednaFZpeIal2vdpWej3drNXnIrrNgRFVvXWdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA8VV9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub66uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqSlqWonJSRqK2wpaCUmaieoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiblZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB9gpVuk12rXFuTf5F/aGeqY3J6gGqYhnFdq1qJoI9rbWRPSkOhXFtNdF1iZk1aYV9ydGBKVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MFRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW+uruzsrm8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLmjo6yhl5ySo6CWlZ+blZmioZGOjKqwsKadlpqnpp+MkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4aSa5hdrWBOoXyHkVJzo2x5fn1umIZvXK9WPJx3ZVRvbi5bp09jUmtlYmxaYlxgcXxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi5VXmJMNUZNXjgxQTilmpyeuqSbscCuraurqLequK+1wLW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn6CRlJWstrCmmJObrKmWjJSmmaWto5KXq7OkoJ6orLCYoaKQmaGXoJuWm5eglJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo6von6NdYerfb5uc7x0soN1eICJbZqIcG2NpHS9XXd9W2F5vGpaVlxqel5pYWNmYm55b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvU11gSzU8TFstNj85p5qforyjl7DDr62pq62xqLmvt8Sxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaesuJ2jrpiVoZGmoJOOnaOemZ+akJaTsLmxq5WWo6enlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGZm5aVo5mQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3totegHl8iGeDeWx6YouscHSFfldbp2lEZFpUZl9jXWJQZ2ZxbnVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOsqqitq6q7r7DGr7W0sLintbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spL2noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqabpauclqmlppyboaqmpqKooZGsnpeinpeWl52ej7CplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phY4ePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqWGx6gnFISm+FcE5xTURWXGZhTFtXZmNeT1ttdWtyUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZURUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6iknJysoKOam6OnrKKfqaGZrpuUpqCWlJ2fnZexpZmiqJmdkp+dpaabqKSbnpucm5KXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnd5dnaLf3yJanOBdIR0Y3Z9dmtveGxfYltvZ01YWWZqX1dZb3pvbmZTT0ZSOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDUkdLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsirrbOntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXlqGYraqlwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZmhm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSZlKKkmKSgmaKPmJWMi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6b2Z5kYGBiGt1gXmJcWhzf3l1g4aAanNid2VfaGVjZGZqWWt7cWpqXFJLUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr6hrKKRkZ6ampSSlqGbl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqJygpKyUn5+dn6quqKSiqqGrmp6foJiln5yenbCkmZ+plJqZnpKmnJqqn5yYZoWUfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbXqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4FveIJ4gHJteIRzdoiHjoN6aIRYXWp0ZF1ziGhqfHFtY11RTVdKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9eWlRPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrSunpakkKOwpre5pa6jj4+aopqTkpugmJimlnukq6KotMO3pKGmrp6dlJ6jn6OdpKqpk5+gnqCqr6mpoqmeppulnqegrJehm6WxpZidrJajn5uTp5mgrJqff72EinS0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46Ad3mBgHlwe3+GcHiEipJ4bHWRYWVeeGRfZYFiXXRobWRiWExVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvqqenprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrqy4tKevopKRmZ2mk5GgoZeboJ6Ipqukq62/v7CgqK6olpGfnaKZoqSqpJShoZ2drK6oqqWioqSfo6ScramSpJqorqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdn9le4h1dmt9h219hI6QfmuAjF5wanBnYF94ZFtxaGpjZWBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylraawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ+Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmnm6aloqCqkqyzlqWiq6qepKino7Kik5upnKKclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPSg+MSkzVkBGIRxHO0MxLiuv08bHsrOgnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrJiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJqqpqOhqpqusaKoq6+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk6NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwcnW1sCgmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoqyZqqagoamhsq2hqbKyoZyrqrGwuKaUmKaqmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hV2NtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMS89LTRPVFEdHDs8RjIsJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7WgpJiUqKu2s6ycppyglpCmrZKanKejoKqmraCjp6mws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmtnKulpJ2ro7aroLG4sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56DrH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhX9wW2xud3NqgW5aZF5nbmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtTHBs2P0csLSCLh5mpq6SruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ycpKiitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYrKGroqSXrqS6rKG2tq6enra0urO2qZqgsqSmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI6CbGh3aHhzboB0XWRjbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlVRT1FbVSUhMkFIIyolknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmaCqo7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mmq6Cjm6ymvKyUvbCtn6Oxtbutt6meq7Wnq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGXf2psfmJ9dG2AeWBoZW9vaGdoQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK2xraegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuaoKaekpSZmpOamaSjopinqqqgop6np7ykl8Ksq6OirbS7rbCpo7ayrK6ad69/kIqchYd8uq2JmGSwjGSWrn2hkISnl5yCrYyFsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtlo2lmIeUjZGSeXeMnH1jc3xig3d0gHxhamZvbmZlZk9UYltBU109SCg+OT00ISEsJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46urKmno6iarpOaj6maoZ2kn5mjoqWYnqKosai7rqSonp2OfIublqGgmZCSmpuRmZeonp+Xp6yko6Sio6i6np/Gp6apoay2t66xqqG/sbCwmIKqk6OujpuAhqSXmJCAgLjDuoSPnZSFqJmeg6yMhK+KqZ2bpquSf9W9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4RvnYB6srHHg2ursb2seXiivrt0gJSMo5mMmI2SmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdrqels6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adppuaoKiimJ2grKypuK2no5qXknuHmZGnm5OPkJeYj5iTqZielqinnqimoKGqup2oxaOhsKSstLWssqyjv6uzsp11dqqktoVliZ9wZ6yQio9ubnelkJuhgnaynJhxkY5yl6ukm5mvpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2NqcFpdZ354pmBicpCScGZkgIyRjp+UlJaNkpp6hI2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fo7OqmJK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpquin6SkoJKLpZKmmamalqKpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZamoZmupZyhq7iesMGopbSnrbGzrLCuqrynsryYjKOppbWciZaimIepm4+UnZKqtJqcpK6itZmlpKCjpJ+kpqKWrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdYN3dYeMcadtfZaTlJSBgY+Pjo6bkJ2Sk5Kdf4WTjHBoj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYl9OVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXmBhYl1eVVBLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKC3sZCOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqomZOloKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp2Yp56as6Kcpaq2p67Br6S4p7Cwsq+srba+pLPBmpOnpaa0opKdpp6OqaCMkp+irbGboqWzq7OapqOfp6ygoJ6emK2ek5qinJSQl6uZjZmal5CXn5GHoJ2VlIaUjZCOlo2Cf2aOiHaId3qIhHScaoiSlpWSiX2MlpGSlpCdjpiSnYGFl4Z6cZRyeYl/cXt+am5kXnBpYFxfWGxiT19jT1g5RkZEPTI8PTcuKiUrKSYdJjQxNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVVQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCntaqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiomcopCvn6SWqaChk5eZnK6LqpaOp5injJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaacnbaifoOutKKwr3Wkv6SzoHl7o621wJh4sKahioCqfmRcYnafj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlxgZmqmW2ApKmKZZylnJGYmZeMk5yRhZ2bkJWElIiPj5OLhnlskYh2iHJ8hoGBYWmJjJWTjFt2lZBmaI6LcXiflZRkd5eGgXeXaIKJgm55f2twZWB2b2traFtkY2FhbVFZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXV9nZ2dXUUk8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWc4ucr6Coq6eUl7mgoI+cpJ6RfoiJmp6NrJqklaiino6Xkp6Fda6PiKWZqJGWo4iauLOnn5iYi4l0d5KNl5OJk5CQk4yPkp+MmZ6kmJuwlICMm7WdtIySj72non6no3ulsruEjpCpoISMhY+xqq+MiZajmnmAi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgZGXloSammJ5iJKFjpCTi4RucpGIeoJygYGGgId0iIaXk3iWaJN0oJp0e5mBm5iEmH6QiYGCl2mMjIRqeHtxcGdleG1pbGpbY2loZHFaW0hTS1BARTUtWVNUNikhMDk9Pjc0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpaeznI+Dnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2FnrixqJ2ako+FcHWQiZWQipOPjpuLjpGdkJWeopSdqoaftIm0mq6Lyoirr4q3hY2whLOzh6mPqpqNnXuoj3J7d5yOppZolaR5tIyhoKiqlJrCgoGriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfYaUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePommdgZ2WgJmAiouDiJhvjZKEZ3d0fHdnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBKZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOotaGvf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x3m5yOoJGHnaOblpiXhaG4raWZm4yMfmJtj4uTj4yPjIyXi4+Rno2Snp+XoKZ9oaeHrZ2glq6QoJ6dkYeCoY2us4mkj6ycjJp9onWAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX56mGxdfZhvYVRyh11gbXqEYFllgn6FgZlyqKprg6NucqVvn4GaZ2SebFpsiXtlWV+CfmFXUHB2ZW90cWpqb11pb2xqZ1dmTVxXRThBNEZDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8qq6imZaeoKWrq5+crbShp5GgoKGnnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhqykh5yRipiol5makYekr6ailZmHiYBpboiIi46NiYqNkYuPkaGKkpyemqGjf5OBj6OhlKB3nJaQp4OjqYCHrLGIpXqNf4SafKJwcpOHlXuejHlth5uLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgcW5fHGVtoxygZukZHWsq2F+ap2zfm5+iYSPg4yYcYCja3Kjcp6BfKNenJmzlXB8l56zdHJbnrKDamJxdHVxaG9YamtxcGRbZ1xhS0M9RDZRQVlxMjxTR19KUj08Mzk1Ojk2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4taytoJqhm6KjpKyamrGsq5OYoZmhpZqalJ6sm4uJkXiLhXGAlYyJkKGQk5Sdl32Rio6ooIeYjomRopObmoyKqKekno+Wh4R+anqGfn2PjYOKj5CJjpOfgZScnpufnouJd5yYoo2gcqGMiamJnaiSmauugq6NfnqgmXmjk3iAc5eHjJx9lJ6Gm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXeFnmiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX2ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE43VUJRbTRKWlpeTlpEQDE1MTw7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11ZZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7Gvq52lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIByepaIi5aWhJKUmI96i4SWpJyJlY+Gip2SnJuIj6iin5qLkIqAgGmAhXl/lot6iI2Oh46VmX2SoZ2foZKXcmifiqCPjHCSjYKpiZqhpaqjq3+wrqSiuJd2o7Oio3+IlHideqmYf6KPn52ZiZhyoH2IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4x5nmNNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs399mZKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUGdEUlZcYVheSUQ9Qjg/QjpJRTdMRVhBV1JbVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbCumoRTX6GntLqysqiaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniUhI+bi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6onJqVioqKfINshIVxgqGLd4SMiIeRmJR6kaKfnaKHrYZ9tYSPnp17ppZ6qYKXn5GMpKGAp2l4bn6Zc6BzcXydhZhvk4Kse6OEp5+bg6RwX6lodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iLdauzqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGima5rTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZfYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSUtCS0U4UEBRTlhTWE9TUWBlZGlTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGdobWiYm3+wrFRdS36qr7G0sLKinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoeFe3B9g2h8j4KTmoF3kY6PinCAho+TkWuYk3yIkZKjlYKNqJmTkoqFiXmDdoiAboGfhnd/kYWGl6CVeJGgopmfiLOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtr4qXi3+MpI2Vg6+jlXe1trbKonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3GbiXSle3p1YoSDbn6gbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15pdmt4hmZrZmJzdG9sVVtSWWhPUWdJVUxYUlVcZ2tuVWdXTUpBSU1LSEpOQVFKUGVjam1ldXNzf3l7bnSJentVUU5tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2Ir6eFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l6B5dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWjJGLgIh6gH2LeXCPoIV5gJSGiJWelH6SpKablZaEZm54nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aBiZSWj7lukIqiYn2ao5eJbnRrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GKl22hb1KIj26gXmSnVItdVJhtbXNrcYFtcGhrd3NqblFWVVVlWFJsSVhPW0hXaGhzallrVlBSRVZcTFhSYVVoal53dXt8cH18coN7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52mmaZ7ZXRtjKeupamwsaWfi3+VqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIqKfJebc3WJfZB8ZYOHlYqJlZqCfIiGlqaQgKGqj4SQioGJfYCAjnNpj6aDfYWSjIeXn42GkailnIimeJWbfqWJloyymZ6RhK+Xn6V6mIl7qXWokYSabqWijJKEjIO8bXylr4KHhYeVmJ6jfqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gZ5mGdKtmnq2MtnN2voykk1mDpo2rYXZydG97dXBian5uZ2xSVFhUYGBcakxcUVtIXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3OEfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqqdgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+MhH6Xk3R1hnKRg25/i5KGhZSPfHuBhZekjX+kpI2AjYmElHWCh5NubIuogIKKk42Im52IipKpop+Pf3STl4h+gXmUr6R/gp1xj4Z5k46GgXtzqY1xfX16l5abhY54e319hpOVk4t3kpqho4V8f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnJvd3hvXGuFbmlmVlleVlxlamNVYFRdUF5vd3lranZkaWpqdXtwcXRzYW90YnR7gXh1eoJ1f4B/gXmLhYJ+e26AbWR5bl5XbmhodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9gjpS5qaeLoaObpqSZpJ2roZ+Dg5apkZ2fiJmmmqiZg4Gci36WlIeOiomNcoJ8jnx+joR7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhI+PhJWCho6Yd3GEqoWNkZuOh52dhoqapp+gq4OIjZSbf36Kl62okJOokXlxn5SFfJVwgKyHcX6VcWpwfYGfi3+RjYpnbV2EjI6dnqGRdJeOinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBbYKKdm1jZWN5g3qVWlxpZ252W3t5d3Vuc3KDZltsiWtrYllYXFlYa3FbXl9ZXVxlcn16dG90YmpqaXt7cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZvdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIeHinF9gIp2hIuBhJaKcm+Ac5iHhH6Tg4OGioJ6gIOKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIWHoKmeoaKji4eSm52jmparoqioopOdiZmRfnqRkIaqf3+TkZKTnbKmmpSejoywkZiEp46Olp2ii5KdhYqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYqIi5GnkYSHjoeCi4+KeYOIhYx/dGqBg3x5mWlyaGFzinF+e3d3cHd0gV1dboZobl9eWVpcU2dxVWNbWmBrZ3R7e3Jub2Nqamh+e2x4fnBob29rZoB7coKAd399f4R7bYOMhXx6eXx9eoR5T2R3a3NucHplbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeCjJqdkoapnYJyio+FkpGLnZF8jXupg42RlpSNm5WFhZqln6KanoaDkpqZmZCZpqCmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZ2TnY6NqIyRgJ+OipWcoYSQmYCIj4RweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyOh5yGhpB2go1+fnRzfIqFfHqOj4WUqJCHhI+BgomIiHOChYWIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcX3B9bXRgY1pbXlBmbFNkWl1gamh0eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2FdnGCjYd+e3t9gHuCi2BpfGt1aGmDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqNhnyKkoOMgoKCbXt+d3KAhX2KkH1raH2Bl4mBiI58foWEh3yPgY+bm5CIppt/cIuKi5KGoKGKhYx8qJCHjpGVkZSRd4yjoKGdlpuAgZCamJONmqKipJuYkpx/kIh7goaRiaOBfo2Nj3yYpKCgkpqQj6WLj4GckoqUmZ2AlJR/iI+CdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqUkYGZgIqNdISKfn9ze3yNhnx7k46El6aUjIaQe4SFhoNzfoCEhXhkcHp/d3lwbGpmXn1zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWdUZFheYGdpdXiBcGZrY2xnZX+Bam19Z21wanx3hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoRudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWino2Xf4yhioiblnh8hoh+hIp+iIKBf3B/enN1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aUhJGJlJWRkHWRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImY+gf4KLjoxzmKOeoJKYjo6gi4uDmJiElJebgJqPfYmOgndyfm57ZIB9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5/lXmOi36CiX59c4F5i4d7hpKLjJmkl4OEi3aHg4GAc3h/hoJzXnZ3fXJ9dmZsZWB/aWp3c3R1fXF8Y2Rhc291cm1hWV9dWmpjUmJXX19nanR4hnBiamJrZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2p5uKmHmXnIuMmZB5fIGMfX2De4CCgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkIKPjpOWkIqAj5egmpKQknOAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqSnHyIiZCJb5idmqKSlYqLnYuGgZOdgJSUl4ibin2KioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiGgY91kouGe4l/d3qCf4iCfoWPh42VpZF5hYJ0iIZ7fnFyfoSAa2B5dHlwe25hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohqX2lkaWNod4dtZmxoaWxngHx6d26PiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2V2Z21sYXpoanx7eHBhd22LgZmZq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8n5ORl5SJd357inx8gHZ4f4Bvc3N6b4V8gICJfnxgW36PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyEj5eRlI2IiIySnZOQjI1uhJCPkYmemaKhmJiKl5NwjJyGaIqbkZZ7iYWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdXN1a3FudX2LdW+GkY6ScnSAfIKCin5nc256f5uVfoaKdpKNg3WKe3GDgIOJfoaOi4aOlquOe4h8foqEdnxubH2CgGFmd3N0bnphXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcH6HZV1paGZiZ3CNbmNoaGVoZ4B6d3RvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t8e3N5g2pqX3BodH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmKOooaebiIuKgY6chpKadH+olJGNh6GNlpSRgXR8doV4eH9yc3qFbHFveGyJdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ2Kj4aSl5aFiJOYjpaLio2OjJ2KjpGDbYmLj5GKnJahnJmWhpmJbIimhWiJoIyTgI2FjIF4lJiSnZGQiIiTjX9+kJl9ko6Rj5uTfYuBhXB2cGxub3B8hmpzg4+Zi3J4gHWCiYN6aHVwd4KbkH2KhnuWk3x4inZyjH2Ij3yMiIWKj5yliXyEdoGKfnd3a2h+f35bcXJxb293Wl5wYXBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFJZZWVhdG+EgWFda2xkYmZrkm5gZmZfZmqBdXFyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4aLgHt3i39qcGN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShYubjJaOjHpyeHSCcHKEdHF1iGxubHRsh3aCfX9tblVRgauUh4J4gHZygnmCoIKQgZKSmJqRmHeQeoKMkqOak46IlJiSg4WVmIqSi4mOj4idhJGLfXKKhYiPiJyZnpuXloGVgGmJn4ppiaOKlIaShIpxg5GYj5qNj4uLjo13e5ORe5CMjpOXjn2JfoJsd2pvbGxte4Bien6Ql4J3e4J4g419eml2bXaIl4yAiYh9lZJze4ZyeY98jI98in+FjpGfoId9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BNW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfW9scXOJfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+iZiSjoSImI6Pj4R3dHdzgHBvhHRwcYNvaml1bYJufHxtdHNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFj52hk5OQiZKak4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR7jndpjJSKboumh5WKmISGY4yRmI6UiZaLjImLcHqVinyOiYuUkot7h32AbXxlc29rbXt6W4F6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cWtkbnyAaWdzbmdpc2xTXm9lcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19ddE9NS19lYlt3cIlzXFtkdWBiZWWOY2BmYlhpc3Nta3F2i3xzeYaCdnd+i3OAh396iX9yiYeBkImJfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSdkI6FjJeEk4+IgXV3cHlxb4RwbW1+cmNkd3B8bXl8amhsY6Sawdyu76JzbHaDdYShhJBulY+Vn5OagJFwhYqhlomOlYqQnJWCgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQd4x3cIqLjoCNp4eUi56Ghl6LlJeKjoiNioqEiWx8l4N+iYaLk5CHd4d/f2x9ZHh1am96dFiJe5KIhnt/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJwZHJ2f19ybG9haHRmUmBxZ2tVX25zeWFyY2BpfnFzbltjc2FjVm5aW3ZMTEtiZWBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3aEgXh4fIlxg4V9fYh7dIuIh5WFjH9/mHNodXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn42OfJaNf5qIhXxzd3Bzam+BbGpsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaJmYiMaJePj5uUkoGIcIWIn42Fi5WKjJeTe4ySh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjXaIf3GIhYyKnaWGl46ghIphhJWPhoiFiIyGgIdofZSAfoOFi4+Pg3KIgIByd2h2cml1d2xajX2Tg4Z+gYSBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIpucXmLhXRqb2lvdX5dcmhtXGl0X1JkcWlmU19xdnRgcGBdaIRxc2pXZ2lkaVdtV1tzS0lLZGVdYXFyhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgX57dnqIc4WEfH+HdnaJhY+YgYyCfJR2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp9ipmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3twkpCMhWmYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hYh5hoOOlqCiiZiSoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag46QkX9uhH6EdWxtd3V0eHZrY46Cj4GGf32FgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaXh6YGdpaVhrdVlSaXJpYlFicnhtYmVeWmqEbnRiXGhgZW1eblRabU1HTmVjW2ZtcH9rWVticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYCSlXyJhneJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYePhIqNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXB+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot7ioZ8eomLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEc4GKd4d/jJygnImWj56BiWZ9k4J/hYKIiHGBfWZ+jHx5f4CJjZB+aoF+hXZmcHl4dHh0bGqPhouCi4F5g4GFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV7dGJbcGJXbnFTU25zaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBQWWpRRFJmYFlqbWx7bllbXWxiWmJvdmRnXF1ga2lja2pzdoGCcG5+fIB0dYN6g4N9gYV2fYiBlpB4hIt1gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraneEc2yTjYafmZ+ZhYdufYt1aXeWjX6AiYOVl4p6kJZve3Rxa2pkYHN6aF9lcXpaYXJ8eWdweWFlZI+xsndLYlql2dCWcXqQio93fJOKhJiQi4Vua4WRkXp5koaBhJiJe4Z/d3eJioSWgG+LiHF1fntqeYWDpZCDk42EgHCAhXiGfImfnJiOlpKWhYhwe5OCfYKCiIJtgXZogIV5coCBhYuIfWZ+f4V2ZHFzgGl5cHB1mY6Gg4t9d3mBhHqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Zoe29eWHZaV3BsTldxc2dgS2x3dGFeXFtadX5zcFhnXmdqcWBvTldnUT5YZV1ZbmpneXBaWlhqZVljcHhfZ1xeZWxnZmtpcXd/h25sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb2+BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmImBfI6NaHhza2tmX2BveG1fYm94XGRrgnpgcXVfZWXU6r2LMjo+i45/cXmFh42MdYKWjH6SjYt+bWuEjIx1fY9/hIGUiHuCd211hoSDl3duiIVsdXt1ZnmBg6aLgo+LhH5ugXZ5hn2JoJOPk5SVjoyHf3uShnh/g4yCa39xaIB+eW58fIOLhHhieoWCcmVyaX9udXJ1gpyMgYCGgHR2f4F0gnBbboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bmp2gH90c1tnZ3VuV1Z8U1lvZEtacnJlW0lxeG9cW1tZXXV/dGlaYltoZm9jak1XZVA9XWVcXHVlYHRvWlhUbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9goCCenWCgI2ThHCAi254foB7e4iTin9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZnJuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9rhIKHdHmJeIh8kod5fnJmdYh+fphvcYd/aXZ5bmZ5h4SkhoCHjIp/b4B4goSAkJyKhZeTmoqMhYl8kIhxe32Ee2h+bGqAe3pqe3eDiIFzYHiCf3Jlc2d2g251fIaWkoJ9g4FweHp8dYBtWHCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bb1tOW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXWJoa2dtbGhwd3ySa2iEin18b35+fIKAgXp3gH+Ki4NxfIdvcniDf3uJjI+Dan17bXZ4dop2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZl9wb19gZ29mam6JdGF0b1thZGp1eoC/nKakyLhxhYJyknt3hZKCc5CLh3Jyb4N6g3N0h3SHd5OHeHlwYnaHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOBdYd8g5aThnuZkJeQiIKJe4mJa3h5fnRnemhrf3lzaXp3gYR+aGB4iX5sa3RofIFpdoKMkpV/fH+AcXx3fHSAYlZ4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353j4aEd2pxaGyHgXFvXGZgcWxJZHVLXW1VU1lzbmJRT3R4YVJYWF1hcINzXGJcaWVlZGtkUVtwSUNjYFtjb11deGdUVlV2XltlbmhWa11gamdlbm5ocHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDb3eEcm53goJ+iIuTf3CAfHd4eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGRZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3N9dn9vcX9thHOThXh0a2B5gnmJj2ZyhHBodW5bbX1/kJJ/gHiRk355fG+KeISUjod3mY2TkIiGhXyAhW10dX5sZnZkbXt2bmt3d4CAfWFjeYd6aXZ2Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1phV1ZVeG1iUFJ0dlhQVlheYHKEb11hY21lZF5vY1RccUZCZV5dZWddW3piUVVbdFtaZ2tgVmpeYG9mZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgYmNi3t3gHiCe3yFh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIWDdIWGhHiKe2JubFtiW1tgVmlzYmBbZ25vZodyYXFlV1xia398ys6HuaFqbW2Ja3GDcXuDiX56kIR5eHN4dHR7amx1YoN1kYF2bmZffYJ6jIplcoJranFjWGx6hJuIgYFylpV3f31wi3OFjY+KdJqQkomGi4N7eX5xcG98ZGdwYW14cWttcXh+fnpdZnuBeGp2eWaDd2h0iIyOln5ziWtvfoJ5b31eWXSAbXSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3JhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hWldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZG9ZWmpoXVdnYF9yZmpocmdwc3eGeG6Vi3R/end+eoOIf3Vyf4eFjoJwcHx4dnZ6hYWHjIZ6e390in19hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1pcXVRnc2RgWGRxcmeAcmJrZFZaX2p/eL6ue5+2bWFzhGdzenF4gYV6fYt+d3dydW97dmVqbmCGdY6Ac2lhXn55eYuEZnF/aGtrWlZvd4migIR/cJmTcoF6d4VwhYWVi3aYi46JhYmFfXl0cm9oeF9pbGBtdmtoa2t5eHt3W2d+fXlmc35thXVldYaOhpeAcY1oa3uEdW52Y11yfmx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh8aGFOVXVrTFBUVV9ndoNnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1pWV1rZFxZZGJedGZsZHFncnB1gXdwmYZ2f353f32Fh311c4KIgJSCbnN5e3p0c4SGiYmDeYF+dY5+fISKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkn9yjoFxhoJ/g4BwZmxmV11bXFpTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeXxoc3VzcoGDd4CCeHZydW1qenFhZ2tmhnONg21mXV99cHuJf2lteGdqZFVXcm+MpXyEe3aWkXR9dH59cH9+lIh5m36Jh4OHg311cHFsZ3Rba2debHRkaGZpem98clpogXd1aXGBeIJ3YneGi3yVgnCNa257g3JndGZhb3tnc3iKfH5jd4R3a2xydnxyfHt1f2h/gIB5d29kZmJthXtsalVoYW9SSmhpT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFlea2BbWmNkX3ZmbWJwaXRvcn91dJmCd3+Ad39/hoR6fXWChH6XhW1ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Bd3ujpYp5h4WDa3R7enWCgIt5boRzeYR9goN2b2poZVZdW1pZU2JuZFtYYXN7amhsaWBiWF5aaX9pa3CAZ2xgZ3l3aXJzc2yDgHl+e3V0bXpnaXlqX2VuaIB2j4RmZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJODe5d2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanlofG1bboNzdWtwgX56eGF3hoV5kYZ0iXJxeoFzY3JqXXB4ZXJ0iHx5Y3SBcWdqenVzbXp5dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4e2ZfbnFqZF1WYVVublZKU2dXZV1YTVVrVElbeF5bX2tdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR/end0hIiRfYF8kWtylYB7gp+Ffod9gH6GgoCJe3eEq55/eoeHgmpygHl1gH6AdG6Gbn2Ac4qAam9tZGRZX1pZWVRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGp2dGZzdnFrg3p9fHh1cmx5Zml3Zl1kcmd5d5KAYmJUZXBogoV4eGdpamFXVllnYo6nb353gIuOe3Fyf2l7cX2Pf3mRc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXtoXnWBb3Jrcnx+dXZidYaMe4mIgoF5c3aAdmJxbltydGNxcoV8dWVzgG1hbXtxa2p8e3ZzZ4d3e3p2cWViZG1yfWlqU2ddXFRLcWFQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RaWF1Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sW15cYWNefmlqYG90eG1wb3aDmHpygIB8f4mMhn12doZ4h4x8c3V1gnl7eoKMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXWVWWVlWY2ZrX11cc4VoWHBuWl5YWltremJwd3ZsYVlscnJmdHVva4N3fn94dm1uc2RodGVbZ3RldXaReV5cUmZna4OCdH5iZGpcVFddYWKOpGl4c4OGkXlucXxqem9/iX53i3SCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2N6ZVx4fWxvb3B4eXR1ZXOEk4CHhIp8eHBzfnRjeGVccXFicXKBfHRnc4FlX253amVoe311b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVNsU0pOWldqbHJ8ZG1tc2NhWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbXmFiXYRpaGFueHltcGt2gJB5bYJ+gIGTiISBdnSJdIyGdHF2dYJ4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cJmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNxbltaWFdfa3ZkaXVqaV5ZbHJva3NzcmiEfH5/e3ZubWtkaXBjW2tyZHR2jnNaVlRlYXKAf3KCXWJjXVNZYFtjkJ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlheGFcfHZqa3JveHRzdWlxgpaEh4CFd3Rrcn5vZ3hYXWxuY3JzgHp0Z3B+XGBxc2Nha3OAbW52f3NyeGtwYVxlbGx6YGZSZVRXUU91WlBPWFFIY3NhYEZValFKUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp9dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnRuYWdla1JdW1VnYWxrWlxxjGRPb21cVldUZmlzaGJ0ZWRcWG10bG91dHhqhXx/e4d2j3NjZGtuYFxtbWNzeIdrWVRWY2R4fX1xhl1kX2NUWl9YYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzaHB/cXRwVFxna2ZxdIB2c2Ntd1Zjc2xcYHBof2dueH5zc3NqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2BFV2lPSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3VaX2VraVlhYF1ejm5iZmt5dm5vaXV2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jj3+Mk3J8ipGEh5+Ge3+GjXSBhnN+gnZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R7bGJmZ2hTX15VZ19rb1tebo1oTWlsYFVWU25mc2tleGVkXFhvc2txendya4d6f3acenlrYWVsbV5gbmplcXh+Z1lWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbn1rdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKfIlucmdxfm50bmRbYWlpb3SAdHJfaW1TZXJlVmRwZHxlc3h9d2twbWtgWWFmZ3RcZFVgVVJOV2RRTltOT0hkb1xiRllpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2c3uDcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5KElo95fYyPh5GbhIB8jYVzgIFzdHhzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dlkKGgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX12QpaOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiY6PkJCPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOPiI2Mjo+Ij5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqHjouHjYeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSMi4aPhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/f39+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gYB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJQUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU5NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUtPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9PTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRVFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FBQUBCQT87Pjw+Pz88ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+BgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH9+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUNEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJEQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFR0ZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+AgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVWyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4eIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhEQkA1Nzg4PTo8REJERkZEVniEhIKCg4OFiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQT88OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjXo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs7PTo+PDo8Ozw8PTs6Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ojs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg5Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYWGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4+Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4eIiImIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpJREpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW9xdXd4eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT1AQkNETG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0tKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkNEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5PUHmGhYeGhYaHiIiIiIiIiIiIiIiIiYiUnIyKiox9YYqLi4dsW2RVOlhYWFNRPkBWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWllXV1d6a1haXFxeU1BQT0lOT1dWWFpaZXF0d3Z0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lSTk9RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZFRkZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt6e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz89PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8enx7fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fXx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEVDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fX19fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkVQUFVZU1RPSk5PVVNTXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05NTFBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RQT1BPUU5RT1BPTEpMTE9QTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDP0JFREFAR0hHSEZGSEpNTERHQ09SQzhFTVNdZ1NRU0FHVU9PUVBQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NPT09MTU9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CRD49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NVktMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8endzeHR4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEE9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BSUEtHQ0tIQ0NLSkxOT05JSklHRENDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWdubGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUlIS0lHSFBLREpOTFBOT05PUE9KSklNUlVVUk9YZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISEhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFR0FCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlXWV5bXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QEI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlJPTVFXWlZaWVdbXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhLSENJSEdJR0ZESEtJR0pITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWl1gX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREdERURGRkhIRkhHSUtKRUpISEtIRUZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBfYWBiZl1kYGZoYGVpamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIREZFSUhGSUhKTUhISkpJTEpFSktISUpKR0tKTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlFQ0dJR0dKRklMSElKTUtNTEZLSUhLS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUtMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhJSUdISkZES0pHSEpISUtHSkpOS05MSUxIS0xKWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSkpKRkI/QEM/PERERkRDQ0NFRURGQkVGR0RESkVFSUtLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTUxbc2Jkb11sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURCSEhHRERLSEdLTU1KTExGSk5ISktKSUtKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBdYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3Vob11gc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEpISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGpPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN0dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW11cG5zc3Z0SUtISkNEREVAQD1DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklISUtJS0pJSUtMTU1MSUtLSlNrYllpXl5pYnJyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpJS0tMSklKTE1TW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVHSUpISUpITEpJR0hISkhISEVFS0hISk5LSE9cVl1PXVxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0dFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKVF9ZX1hgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZEREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZDR0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhJR0BHRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNFS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRUBFQkhIQUBGRUNTXVleWF9YX1tdVVhYUF1cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNWYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgXmJjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5MTklMQkVBQ0NGQ0JAQ0Q/TEdDTExPT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVlYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9MVm5ZS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVNUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHJ6fX1+gYOEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdJTVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlFxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoODgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPSE5QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUlJUWVdXUVRQUFBSTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBZYFpYS1RXUGFeUlZRWVNNUEpTVFZYV1dQVVBPTlJKTHJvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NtYF1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFKTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHdeWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JrZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhaWlRRUldbV1dXW09SVFdXWFFdWFZcVVRPWFJXWFhZWmBcaHNfXFtZXF1fY1pfZGRlZ2RkY2JaZGJnZmZtbm11ZmZnY2BmXl1nYGRsZ2Vna2hwemhnZ2t1amhoaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVFQUFBTVVJYV1xXUlJQUVVVVlNaUU5SUldUU1hVU1hUU1FVVFVWWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE1RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVWU1haW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVZZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1lbWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTU5RVFZVUlJSVFdVWl1cWlZWUVJXWFVbW1ZQU1VVVFVYU1dYVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFtiXF5dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SUk9MUFNSVVtVVFBQTE9XVVBWUlNSWE1PUFJVWFVUVFJUWFhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOUldVUlJUUVJZT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjXlxiYWJfZGdpZWdeXGRgYWBhY2RfYl9aWl5bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTlZRUlpSVFVUWF1XWFhTV1xYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW1+bFtVWlZRUVRcVFRUVVRWWVdMUlpWXFtcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllZWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5eZGNgXGdlaGZlYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntpWVlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVNXUVNWVFhYWF5eWF1bVl1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV9gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1cGlaXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFRVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxhWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoX11dW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZWllaWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFhcW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXV1dWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYWFxcX11gX11bYGRcXFhaYmVjYVJcWU9YVlhZWFlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYmNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXW1xbW1lbW2NgY2NjYGJkYWBjXmBcXl5eWVhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNpaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlZNWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PYWiUrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5etUExsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXp6eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDhHdzc3Nzc3J8hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z5fHp6eXl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9enp7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eX14fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX15fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5enp5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKAgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYGBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/fn5+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoOEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISBgoKCgYGCgoGBf4CBg4GAgIB/gIKCgoODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIKAgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SDhYOBgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGCgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgICBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4SDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4KCgoGAgYCAgICAgICAf4CAgICFhYaFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4iFg4KAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/gICBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SFhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aGhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn58fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX5+e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgICAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH19fHx+foqCe3p7enh6e3p8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUkYuMjI2PioaGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fXp8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p7fX1/hoSCgICBfX59fn99i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fH5/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+LioqMi4qIhISFg4SDg4OCgoKCgoKCgoGBgYCCgoGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5+f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjYuKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCMioiIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeHi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+EgoSIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYmHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6AfX1+foCAfoF+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt7enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoWEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYGEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgYKDgYKCgYCBgXyAf36AfX59fn+AgIB/fn9+fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B+fX18f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn9+fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t4enp3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoCBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+eoGRi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAfn99foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoKBgH+AgoOCgIKChYN/gIB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAf4KChIGBgoKEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoKBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX5/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgoGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBfn+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4F/gIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0fnZ1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgX+Bg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBfoGEhIODgoR/gYSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYSDg4OCg3+BhYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4CEg4B/fn1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fX59foKDgXx/gX1+gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWEgoWGhIWFg4KDhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIiIWDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3prc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX17fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXt8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fH5+fHx8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eGhoeGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn99f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFhoWFh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYB/gYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXl6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHh4iIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeGhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKDhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoODgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p5enp5e3p6enp6enp7fHl7fXx8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYWFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnt9gX+Ag359gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzExMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2RhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDY5IEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2CisyODAgMSA2NDAwMAorMjgzIDEgODUzMzMKKzMxNyAxIDEwNjY2NgorMzE4IDEgMTI4MDAwCiszMjEgMSAxNDkzMzMKKzMxMyAxIDE3MDY2NgorMzEyIDEgMTkyMDAwCiszMTcgMSAyMTMzMzMKKzMzMCAxIDIzNDY2NgorMzUwIDEgMjU2MDAwCiszNTUgMSAyNzczMzMKKzMzMyAxIDI5ODY2NgorMzI1IDEgMzIwMDAwCiszNzYgMSAzNDEzMzMKKzMzNSAxIDM2MjY2NgorMzUxIDEgMzg0MDAwCiszNTAgMSA0MDUzMzMKKzMzOSAxIDQyNjY2NgorMzI5IDEgNDQ4MDAwCiszNTAgMSA0NjkzMzMKKzMzMCAxIDQ5MDY2NgorMzU5IDEgNTEyMDAwCiszMTYgMSA1MzMzMzMKKzM0NSAxIDU1NDY2NgorMzU3IDEgNTc2MDAwCiszMjUgMSA1OTczMzMKKzMzNiAxIDYxODY2NgorMzM5IDEgNjQwMDAwCiszMTIgMSA2NjEzMzMKKzM1MCAxIDY4MjY2NgorMzM4IDEgNzA0MDAwCiszNTMgMSA3MjUzMzMKKzM0MCAxIDc0NjY2NgorMzMyIDEgNzY4MDAwCiszNDAgMSA3ODkzMzMKKzMzOSAxIDgxMDY2NgorMzMzIDEgODMyMDAwCiszMzMgMSA4NTMzMzMKKzM0NSAxIDg3NDY2NgorMzQwIDEgODk2MDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmFmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsNDQzIEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2Cis1NjMgMSA2NDAwMAorNjM1IDEgMTA2NjY2Cis2MzQgMSAxNDkzMzMKKzYyOSAxIDE5MjAwMAorNjgwIDEgMjM0NjY2Cis2ODggMSAyNzczMzMKKzEwMzYgMSAzMjAwMDAKKzEwNDAgMSAzODQwMDAKKzEwMDkgMSA0NDgwMDAKKzEwMjAgMSA1MTIwMDAKKzEzNTcgMSA1NzYwMDAKKzEzNTMgMSA2NjEzMzMKKzEzNTEgMSA3NDY2NjYKKzEzNTEgMSA4MzIwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODI1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE2MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTQgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorNDEgMSA0MDAwMAorNDEgMSA2MDAwMAorNDEgMSA4MDAwMAorNDEgMSAxMDAwMDAKKzQxIDEgMTIwMDAwCis0MSAxIDE0MDAwMAorNDEgMSAxNjAwMDAKKzQxIDEgMTgwMDAwCis0MSAxIDIwMDAwMAorNDEgMSAyMjAwMDAKKzQxIDEgMjQwMDAwCis0MSAxIDI2MDAwMAorNDEgMSAyODAwMDAKKzQxIDEgMzAwMDAwCis0MSAxIDMyMDAwMAorNDEgMSAzNDAwMDAKKzQxIDEgMzYwMDAwCis0MSAxIDM4MDAwMAorNDEgMSA0MDAwMDAKKzQxIDEgNDIwMDAwCis0MSAxIDQ0MDAwMAorNDEgMSA0NjAwMDAKKzQxIDEgNDgwMDAwCis0MSAxIDUwMDAwMAorNDEgMSA1MjAwMDAKKzQxIDEgNTQwMDAwCis0MSAxIDU2MDAwMAorNDEgMSA1ODAwMDAKKzQxIDEgNjAwMDAwCis0MSAxIDYyMDAwMAorNDEgMSA2NDAwMDAKKzQxIDEgNjYwMDAwCis0MSAxIDY4MDAwMAorNDEgMSA3MDAwMDAKKzQxIDEgNzIwMDAwCis0MSAxIDc0MDAwMAorNDEgMSA3NjAwMDAKKzQxIDEgNzgwMDAwCis0MSAxIDgwMDAwMAorNDEgMSA4MjAwMDAKKzQxIDEgODQwMDAwCis0MSAxIDg2MDAwMAorNDEgMSA4ODAwMDAKKzQxIDEgOTAwMDAwCis0MSAxIDkyMDAwMAorNDEgMSA5NDAwMDAKKzQxIDEgOTYwMDAwCis0MSAxIDk4MDAwMAorNDEgMSAxMDAwMDAwCis0MSAxIDEwMjAwMDAKKzQxIDEgMTA0MDAwMAorNDEgMSAxMDYwMDAwCis0MSAxIDEwODAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NjAgQEAKKzQxIDEgMAorNDEgMSAyMDAwMAorODIgMSA0MDAwMAorODIgMSA4MDAwMAorODIgMSAxMjAwMDAKKzgyIDEgMTYwMDAwCis4MiAxIDIwMDAwMAorODIgMSAyNDAwMDAKKzgyIDEgMjgwMDAwCis4MiAxIDMyMDAwMAorODIgMSAzNjAwMDAKKzEyMyAxIDQwMDAwMAorMTIzIDEgNDYwMDAwCisxMjMgMSA1MjAwMDAKKzEyMyAxIDU4MDAwMAorMTIzIDEgNjQwMDAwCisxNjQgMSA3MDAwMDAKKzE2NCAxIDc4MDAwMAorMTY0IDEgODYwMDAwCisxNjQgMSA5NDAwMDAKKzE2NCAxIDEwMjAwMDAKKzQxIDEgMTEwMDAwMAorNDEgMSAxMTIwMDAwCis0MSAxIDExNDAwMDAKKzQxIDEgMTE2MDAwMAorNDEgMSAxMTgwMDAwCis0MSAxIDEyMDAwMDAKKzQxIDEgMTIyMDAwMAorNDEgMSAxMjQwMDAwCis0MSAxIDEyNjAwMDAKKzQxIDEgMTI4MDAwMAorNDEgMSAxMzAwMDAwCis0MSAxIDEzMjAwMDAKKzQxIDEgMTM0MDAwMAorNDEgMSAxMzYwMDAwCis0MSAxIDEzODAwMDAKKzQxIDEgMTQwMDAwMAorNDEgMSAxNDIwMDAwCis0MSAxIDE0NDAwMDAKKzQxIDEgMTQ2MDAwMAorNDEgMSAxNDgwMDAwCis0MSAxIDE1MDAwMDAKKzQxIDEgMTUyMDAwMAorNDEgMSAxNTQwMDAwCis0MSAxIDE1NjAwMDAKKzQxIDEgMTU4MDAwMAorNDEgMSAxNjAwMDAwCis0MSAxIDE2MjAwMDAKKzQxIDEgMTY0MDAwMAorNDEgMSAxNjYwMDAwCis0MSAxIDE2ODAwMDAKKzQxIDEgMTcwMDAwMAorNDEgMSAxNzIwMDAwCis0MSAxIDE3NDAwMDAKKzQxIDEgMTc2MDAwMAorNDEgMSAxNzgwMDAwCis0MSAxIDE4MDAwMDAKKzQxIDEgMTgyMDAwMAorNDEgMSAxODQwMDAwCis0MSAxIDE4NjAwMDAKKzQxIDEgMTg4MDAwMAorNDEgMSAxOTAwMDAwCis0MSAxIDE5MjAwMDAKKzQxIDEgMTk0MDAwMAorNDEgMSAxOTYwMDAwCis0MSAxIDE5ODAwMDAKKzQxIDEgMjAwMDAwMAorNDEgMSAyMDIwMDAwCis0MSAxIDIwNDAwMDAKKzQxIDEgMjA2MDAwMAorNDEgMSAyMDgwMDAwCis0MSAxIDIxMDAwMDAKKzQxIDEgMjEyMDAwMAorNDEgMSAyMTQwMDAwCis0MSAxIDIxNjAwMDAKKzQxIDEgMjE4MDAwMAorNDEgMSAyMjAwMDAwCis0MSAxIDIyMjAwMDAKKzQxIDEgMjI0MDAwMAorNDEgMSAyMjYwMDAwCis0MSAxIDIyODAwMDAKKzQxIDEgMjMwMDAwMAorNDEgMSAyMzIwMDAwCis0MSAxIDIzNDAwMDAKKzQxIDEgMjM2MDAwMAorNDEgMSAyMzgwMDAwCis0MSAxIDI0MDAwMDAKKzQxIDEgMjQyMDAwMAorNDEgMSAyNDQwMDAwCis0MSAxIDI0NjAwMDAKKzQxIDEgMjQ4MDAwMAorNDEgMSAyNTAwMDAwCis0MSAxIDI1MjAwMDAKKzQxIDEgMjU0MDAwMAorNDEgMSAyNTYwMDAwCis0MSAxIDI1ODAwMDAKKzQxIDEgMjYwMDAwMAorNDEgMSAyNjIwMDAwCis0MSAxIDI2NDAwMDAKKzQxIDEgMjY2MDAwMAorNDEgMSAyNjgwMDAwCis0MSAxIDI3MDAwMDAKKzQxIDEgMjcyMDAwMAorNDEgMSAyNzQwMDAwCis0MSAxIDI3NjAwMDAKKzQxIDEgMjc4MDAwMAorNDEgMSAyODAwMDAwCis0MSAxIDI4MjAwMDAKKzQxIDEgMjg0MDAwMAorNDEgMSAyODYwMDAwCis0MSAxIDI4ODAwMDAKKzQxIDEgMjkwMDAwMAorNDEgMSAyOTIwMDAwCis0MSAxIDI5NDAwMDAKKzQxIDEgMjk2MDAwMAorNDEgMSAyOTgwMDAwCis0MSAxIDMwMDAwMDAKKzQxIDEgMzAyMDAwMAorNDEgMSAzMDQwMDAwCis0MSAxIDMwNjAwMDAKKzQxIDEgMzA4MDAwMAorNDEgMSAzMTAwMDAwCis0MSAxIDMxMjAwMDAKKzQxIDEgMzE0MDAwMAorNDEgMSAzMTYwMDAwCis0MSAxIDMxODAwMDAKKzQxIDEgMzIwMDAwMAorNDEgMSAzMjIwMDAwCis0MSAxIDMyNDAwMDAKKzQxIDEgMzI2MDAwMAorNDEgMSAzMjgwMDAwCis0MSAxIDMzMDAwMDAKKzQxIDEgMzMyMDAwMAorNDEgMSAzMzQwMDAwCis0MSAxIDMzNjAwMDAKKzQxIDEgMzM4MDAwMAorNDEgMSAzNDAwMDAwCis0MSAxIDM0MjAwMDAKKzQxIDEgMzQ0MDAwMAorNDEgMSAzNDYwMDAwCis0MSAxIDM0ODAwMDAKKzQxIDEgMzUwMDAwMAorNDEgMSAzNTIwMDAwCis0MSAxIDM1NDAwMDAKKzQxIDEgMzU2MDAwMAorNDEgMSAzNTgwMDAwCis0MSAxIDM2MDAwMDAKKzQxIDEgMzYyMDAwMAorNDEgMSAzNjQwMDAwCis0MSAxIDM2NjAwMDAKKzQxIDEgMzY4MDAwMAorNDEgMSAzNzAwMDAwCis0MSAxIDM3MjAwMDAKKzQxIDEgMzc0MDAwMAorNDEgMSAzNzYwMDAwCis0MSAxIDM3ODAwMDAKKzQxIDEgMzgwMDAwMAorNDEgMSAzODIwMDAwCis0MSAxIDM4NDAwMDAKKzQxIDEgMzg2MDAwMAorNDEgMSAzODgwMDAwCis0MSAxIDM5MDAwMDAKKzQxIDEgMzkyMDAwMAorNDEgMSAzOTQwMDAwCis0MSAxIDM5NjAwMDAKKzQxIDEgMzk4MDAwMAorNDEgMSA0MDAwMDAwCis0MSAxIDQwMjAwMDAKKzQxIDEgNDA0MDAwMAorNDEgMSA0MDYwMDAwCis0MSAxIDQwODAwMDAKKzQxIDEgNDEwMDAwMAorNDEgMSA0MTIwMDAwCis0MSAxIDQxNDAwMDAKKzQxIDEgNDE2MDAwMAorNDEgMSA0MTgwMDAwCis0MSAxIDQyMDAwMDAKKzQxIDEgNDIyMDAwMAorNDEgMSA0MjQwMDAwCis0MSAxIDQyNjAwMDAKKzQxIDEgNDI4MDAwMAorNDEgMSA0MzAwMDAwCis0MSAxIDQzMjAwMDAKKzQxIDEgNDM0MDAwMAorNDEgMSA0MzYwMDAwCis0MSAxIDQzODAwMDAKKzQxIDEgNDQwMDAwMAorNDEgMSA0NDIwMDAwCis0MSAxIDQ0NDAwMDAKKzQxIDEgNDQ2MDAwMAorNDEgMSA0NDgwMDAwCis0MSAxIDQ1MDAwMDAKKzQxIDEgNDUyMDAwMAorNDEgMSA0NTQwMDAwCis0MSAxIDQ1NjAwMDAKKzQxIDEgNDU4MDAwMAorNDEgMSA0NjAwMDAwCis0MSAxIDQ2MjAwMDAKKzQxIDEgNDY0MDAwMAorNDEgMSA0NjYwMDAwCis0MSAxIDQ2ODAwMDAKKzQxIDEgNDcwMDAwMAorNDEgMSA0NzIwMDAwCis0MSAxIDQ3NDAwMDAKKzQxIDEgNDc2MDAwMAorNDEgMSA0NzgwMDAwCis0MSAxIDQ4MDAwMDAKKzQxIDEgNDgyMDAwMAorNDEgMSA0ODQwMDAwCis0MSAxIDQ4NjAwMDAKKzQxIDEgNDg4MDAwMAorNDEgMSA0OTAwMDAwCis0MSAxIDQ5MjAwMDAKKzQxIDEgNDk0MDAwMAorNDEgMSA0OTYwMDAwCis0MSAxIDQ5ODAwMDAKKzQxIDEgNTAwMDAwMAorNDEgMSA1MDIwMDAwCis0MSAxIDUwNDAwMDAKKzQxIDEgNTA2MDAwMAorNDEgMSA1MDgwMDAwCis0MSAxIDUxMDAwMDAKKzQxIDEgNTEyMDAwMAorNDEgMSA1MTQwMDAwCis0MSAxIDUxNjAwMDAKKzQxIDEgNTE4MDAwMAorNDEgMSA1MjAwMDAwCis0MSAxIDUyMjAwMDAKKzQxIDEgNTI0MDAwMAorNDEgMSA1MjYwMDAwCis0MSAxIDUyODAwMDAKKzQxIDEgNTMwMDAwMAorNDEgMSA1MzIwMDAwCis0MSAxIDUzNDAwMDAKKzQxIDEgNTM2MDAwMAorNDEgMSA1MzgwMDAwCis0MSAxIDU0MDAwMDAKKzQxIDEgNTQyMDAwMAorNDEgMSA1NDQwMDAwCis0MSAxIDU0NjAwMDAKKzQxIDEgNTQ4MDAwMAorNDEgMSA1NTAwMDAwCis0MSAxIDU1MjAwMDAKKzQxIDEgNTU0MDAwMAorNDEgMSA1NTYwMDAwCis0MSAxIDU1ODAwMDAKKzQxIDEgNTYwMDAwMAorNDEgMSA1NjIwMDAwCis0MSAxIDU2NDAwMDAKKzQxIDEgNTY2MDAwMAorNDEgMSA1NjgwMDAwCis0MSAxIDU3MDAwMDAKKzQxIDEgNTcyMDAwMAorNDEgMSA1NzQwMDAwCis0MSAxIDU3NjAwMDAKKzQxIDEgNTc4MDAwMAorNDEgMSA1ODAwMDAwCis0MSAxIDU4MjAwMDAKKzQxIDEgNTg0MDAwMAorNDEgMSA1ODYwMDAwCis0MSAxIDU4ODAwMDAKKzQxIDEgNTkwMDAwMAorNDEgMSA1OTIwMDAwCis0MSAxIDU5NDAwMDAKKzQxIDEgNTk2MDAwMAorNDEgMSA1OTgwMDAwCis0MSAxIDYwMDAwMDAKKzQxIDEgNjAyMDAwMAorNDEgMSA2MDQwMDAwCis0MSAxIDYwNjAwMDAKKzQxIDEgNjA4MDAwMAorNDEgMSA2MTAwMDAwCis0MSAxIDYxMjAwMDAKKzQxIDEgNjE0MDAwMAorNDEgMSA2MTYwMDAwCis0MSAxIDYxODAwMDAKKzQxIDEgNjIwMDAwMAorNDEgMSA2MjIwMDAwCis0MSAxIDYyNDAwMDAKKzQxIDEgNjI2MDAwMAorNDEgMSA2MjgwMDAwCis0MSAxIDYzMDAwMDAKKzQxIDEgNjMyMDAwMAorNDEgMSA2MzQwMDAwCis0MSAxIDYzNjAwMDAKKzQxIDEgNjM4MDAwMAorNDEgMSA2NDAwMDAwCis0MSAxIDY0MjAwMDAKKzQxIDEgNjQ0MDAwMAorNDEgMSA2NDYwMDAwCis0MSAxIDY0ODAwMDAKKzQxIDEgNjUwMDAwMAorNDEgMSA2NTIwMDAwCis0MSAxIDY1NDAwMDAKKzQxIDEgNjU2MDAwMAorNDEgMSA2NTgwMDAwCis0MSAxIDY2MDAwMDAKKzQxIDEgNjYyMDAwMAorNDEgMSA2NjQwMDAwCis0MSAxIDY2NjAwMDAKKzQxIDEgNjY4MDAwMAorNDEgMSA2NzAwMDAwCis0MSAxIDY3MjAwMDAKKzQxIDEgNjc0MDAwMAorNDEgMSA2NzYwMDAwCis0MSAxIDY3ODAwMDAKKzQxIDEgNjgwMDAwMAorNDEgMSA2ODIwMDAwCis0MSAxIDY4NDAwMDAKKzQxIDEgNjg2MDAwMAorNDEgMSA2ODgwMDAwCis0MSAxIDY5MDAwMDAKKzQxIDEgNjkyMDAwMAorNDEgMSA2OTQwMDAwCis0MSAxIDY5NjAwMDAKKzQxIDEgNjk4MDAwMAorNDEgMSA3MDAwMDAwCis0MSAxIDcwMjAwMDAKKzQxIDEgNzA0MDAwMAorNDEgMSA3MDYwMDAwCis0MSAxIDcwODAwMDAKKzQxIDEgNzEwMDAwMAorNDEgMSA3MTIwMDAwCis0MSAxIDcxNDAwMDAKKzQxIDEgNzE2MDAwMAorNDEgMSA3MTgwMDAwCis0MSAxIDcyMDAwMDAKKzQxIDEgNzIyMDAwMAorNDEgMSA3MjQwMDAwCis0MSAxIDcyNjAwMDAKKzQxIDEgNzI4MDAwMAorNDEgMSA3MzAwMDAwCis0MSAxIDczMjAwMDAKKzQxIDEgNzM0MDAwMAorNDEgMSA3MzYwMDAwCis0MSAxIDczODAwMDAKKzQxIDEgNzQwMDAwMAorNDEgMSA3NDIwMDAwCis0MSAxIDc0NDAwMDAKKzQxIDEgNzQ2MDAwMAorNDEgMSA3NDgwMDAwCis0MSAxIDc1MDAwMDAKKzQxIDEgNzUyMDAwMAorNDEgMSA3NTQwMDAwCis0MSAxIDc1NjAwMDAKKzQxIDEgNzU4MDAwMAorNDEgMSA3NjAwMDAwCis0MSAxIDc2MjAwMDAKKzQxIDEgNzY0MDAwMAorNDEgMSA3NjYwMDAwCis0MSAxIDc2ODAwMDAKKzQxIDEgNzcwMDAwMAorNDEgMSA3NzIwMDAwCis0MSAxIDc3NDAwMDAKKzQxIDEgNzc2MDAwMAorNDEgMSA3NzgwMDAwCis0MSAxIDc4MDAwMDAKKzQxIDEgNzgyMDAwMAorNDEgMSA3ODQwMDAwCis0MSAxIDc4NjAwMDAKKzQxIDEgNzg4MDAwMAorNDEgMSA3OTAwMDAwCis0MSAxIDc5MjAwMDAKKzQxIDEgNzk0MDAwMAorNDEgMSA3OTYwMDAwCis0MSAxIDc5ODAwMDAKKzQxIDEgODAwMDAwMAorNDEgMSA4MDIwMDAwCis0MSAxIDgwNDAwMDAKKzQxIDEgODA2MDAwMAorNDEgMSA4MDgwMDAwCis0MSAxIDgxMDAwMDAKKzQxIDEgODEyMDAwMAorNDEgMSA4MTQwMDAwCis0MSAxIDgxNjAwMDAKKzQxIDEgODE4MDAwMAorNDEgMSA4MjAwMDAwCis0MSAxIDgyMjAwMDAKKzQxIDEgODI0MDAwMAorNDEgMSA4MjYwMDAwCis0MSAxIDgyODAwMDAKKzQxIDEgODMwMDAwMAorNDEgMSA4MzIwMDAwCis0MSAxIDgzNDAwMDAKKzQxIDEgODM2MDAwMAorNDEgMSA4MzgwMDAwCis0MSAxIDg0MDAwMDAKKzQxIDEgODQyMDAwMAorNDEgMSA4NDQwMDAwCis0MSAxIDg0NjAwMDAKKzQxIDEgODQ4MDAwMAorNDEgMSA4NTAwMDAwCis0MSAxIDg1MjAwMDAKKzQxIDEgODU0MDAwMAorNDEgMSA4NTYwMDAwCis0MSAxIDg1ODAwMDAKKzQxIDEgODYwMDAwMAorNDEgMSA4NjIwMDAwCis0MSAxIDg2NDAwMDAKKzQxIDEgODY2MDAwMAorNDEgMSA4NjgwMDAwCis0MSAxIDg3MDAwMDAKKzQxIDEgODcyMDAwMAorNDEgMSA4NzQwMDAwCis0MSAxIDg3NjAwMDAKKzQxIDEgODc4MDAwMAorNDEgMSA4ODAwMDAwCis0MSAxIDg4MjAwMDAKKzQxIDEgODg0MDAwMAorNDEgMSA4ODYwMDAwCis0MSAxIDg4ODAwMDAKKzQxIDEgODkwMDAwMAorNDEgMSA4OTIwMDAwCis0MSAxIDg5NDAwMDAKKzQxIDEgODk2MDAwMAorNDEgMSA4OTgwMDAwCis0MSAxIDkwMDAwMDAKKzQxIDEgOTAyMDAwMAorNDEgMSA5MDQwMDAwCis0MSAxIDkwNjAwMDAKKzQxIDEgOTA4MDAwMAorNDEgMSA5MTAwMDAwCis0MSAxIDkxMjAwMDAKKzQxIDEgOTE0MDAwMAorNDEgMSA5MTYwMDAwCis0MSAxIDkxODAwMDAKKzQxIDEgOTIwMDAwMAorNDEgMSA5MjIwMDAwCis0MSAxIDkyNDAwMDAKKzQxIDEgOTI2MDAwMAorNDEgMSA5MjgwMDAwCis0MSAxIDkzMDAwMDAKKzQxIDEgOTMyMDAwMAorNDEgMSA5MzQwMDAwCis0MSAxIDkzNjAwMDAKKzQxIDEgOTM4MDAwMAorNDEgMSA5NDAwMDAwCis0MSAxIDk0MjAwMDAKKzQxIDEgOTQ0MDAwMAorNDEgMSA5NDYwMDAwCis0MSAxIDk0ODAwMDAKKzQxIDEgOTUwMDAwMAorNDEgMSA5NTIwMDAwCis0MSAxIDk1NDAwMDAKKzQxIDEgOTU2MDAwMAorNDEgMSA5NTgwMDAwCis0MSAxIDk2MDAwMDAKKzQxIDEgOTYyMDAwMAorNDEgMSA5NjQwMDAwCis0MSAxIDk2NjAwMDAKKzQxIDEgOTY4MDAwMAorNDEgMSA5NzAwMDAwCis0MSAxIDk3MjAwMDAKKzQxIDEgOTc0MDAwMAorNDEgMSA5NzYwMDAwCis0MSAxIDk3ODAwMDAKKzQxIDEgOTgwMDAwMAorNDEgMSA5ODIwMDAwCis0MSAxIDk4NDAwMDAKKzQxIDEgOTg2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzYwMjcgMSAwCis2ODc5IDAgMzMwMDAKKzUgMCA2NjAwMAorNTMyIDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNDU4IDAgMTY2MDAwCis1IDAgMjAwMDAwCis0NzUgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEyNjIgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1NCAwIDM2NjAwMAorMjcgMCA0MDAwMDAKKzY5NzEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzYwMSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzI3NiAwIDU2NjAwMAorNSAwIDYwMDAwMAorNjU4IDAgNjMzMDAwCis1IDAgNjY2MDAwCisxNjgwIDAgNzAwMDAwCis1IDAgNzMzMDAwCis2MTAgMCA3NjYwMDAKKzI0IDAgODAwMDAwCis2NzI4IDAgODMzMDAwCis1IDAgODY2MDAwCis3NjQgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI2NTYgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0NjIgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTQ1OSAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis2MDggMCAxMTY2MDAwCisyNCAwIDEyMDAwMDAKKzcwMzggMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNzIxIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMxMDIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNzUyIDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MTUgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNzU1IDAgMTU2NjAwMAorMjUgMCAxNjAwMDAwCis3NjU3IDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzg1MiAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszNTM3IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzY3MyAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxNzc0IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU1NCAwIDE5NjYwMDAKKzI0IDAgMjAwMDAwMAorODAyOCAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis3MTUgMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzM5NSAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis3MzYgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTc1OSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis2MDUgMCAyMzY2MDAwCisyMyAwIDI0MDAwMDAKKzc2NTEgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNjE5IDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI3ODggMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNTU2IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEzMzUgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNTIxIDAgMjc2NjAwMAorMjQgMCAyODAwMDAwCisyMjc0IDAgMjgzMzAwMAorNjc2IDAgMjg2NjAwMAorMjUgMCAyOTAwMDAwCis2MjI0IDAgMjkzMzAwMAorNTc5OCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0NDggMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk1MCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTIxOCAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMzE2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzU4MCAwIDMzNjYwMDAKKzI2IDAgMzQwMDAwMAorNjY3MyAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0NzMgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjQ2NyAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCis0MjkgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTQyMCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1ODMgMCAzNzY2MDAwCisyOSAwIDM4MDAwMDAKKzg0OTIgMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNzIwIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzM2MzUgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNjIxIDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE5NjkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNDkgMCA0MTY2MDAwCisyNSAwIDQyMDAwMDAKKzc0MTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorOTQ3IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzM3MTMgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNzE0IDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzIwMDMgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNzUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis4NDcwIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzczNyAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCis0MDk0IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzEwMTkgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMjE2MCAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis4MjggMCA0OTY2MDAwCisyNCAwIDUwMDAwMDAKKzkyODIgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNjU1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzM0OTEgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNjUxIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE5MDYgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNjYyIDAgNTM2NjAwMAorMjQgMCA1NDAwMDAwCis5NzI0IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzYxNyAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwCiszMTQ1IDAgNTU2NjAwMAorNSAwIDU2MDAwMDAKKzU3OCAwIDU2MzMwMDAKKzUgMCA1NjY2MDAwCisxNTkyIDAgNTcwMDAwMAorNSAwIDU3MzMwMDAKKzU2OSAwIDU3NjYwMDAKKzI1IDAgNTgwMDAwMAorMTAwMTUgMCA1ODMzMDAwCis1IDAgNTg2NjAwMAorNjA5IDAgNTkwMDAwMAorNSAwIDU5MzMwMDAKKzM2MTggMCA1OTY2MDAwCis1IDAgNjAwMDAwMAorNzM0IDAgNjAzMzAwMAorNSAwIDYwNjYwMDAKKzE3NDggMCA2MTAwMDAwCis1IDAgNjEzMzAwMAorNTUwIDAgNjE2NjAwMAorMjQgMCA2MjAwMDAwCis4ODA2IDAgNjIzMzAwMAorNSAwIDYyNjYwMDAKKzQ5OCAwIDYzMDAwMDAKKzUgMCA2MzMzMDAwCisyOTEzIDAgNjM2NjAwMAorNSAwIDY0MDAwMDAKKzU5NyAwIDY0MzMwMDAKKzUgMCA2NDY2MDAwCisxMjM1IDAgNjUwMDAwMAorNSAwIDY1MzMwMDAKKzM2MiAwIDY1NjYwMDAKKzI0IDAgNjYwMDAwMAorNjU5MiAwIDY2MzMwMDAKKzUgMCA2NjY2MDAwCis0NjggMCA2NzAwMDAwCis1IDAgNjczMzAwMAorMTkyMCAwIDY3NjYwMDAKKzUgMCA2ODAwMDAwCis0MTkgMCA2ODMzMDAwCis1IDAgNjg2NjAwMAorODQzIDAgNjkwMDAwMAorNSAwIDY5MzMwMDAKKzIzNyAwIDY5NjYwMDAKKzI0IDAgNzAwMDAwMAorMjY4NyAwIDcwMzMwMDAKKzUgMCA3MDY2MDAwCiszOTkgMCA3MTAwMDAwCis1IDAgNzEzMzAwMAorMjAwIDAgNzE2NjAwMAorMTQzIDAgNzIwMDAwMAorMjUgMCA3MjMzMDAwCisxMjYwMyAwIDcyNjYwMDAKKzExMzkgMCA3MzAwMDAwCis1IDAgNzMzMzAwMAorNTYgMCA3MzY2MDAwCis1IDAgNzQwMDAwMAorMjczIDAgNzQzMzAwMAorNSAwIDc0NjYwMDAKKzQ4IDAgNzUwMDAwMAorNSAwIDc1MzMwMDAKKzEwMiAwIDc1NjYwMDAKKzUgMCA3NjAwMDAwCiszOSAwIDc2MzMwMDAKKzI0IDAgNzY2NjAwMAorMzYzNSAwIDc3MDAwMDAKKzUgMCA3NzMzMDAwCis0NiAwIDc3NjYwMDAKKzUgMCA3ODAwMDAwCis2NDcgMCA3ODMzMDAwCis1IDAgNzg2NjAwMAorNjEgMCA3OTAwMDAwCis1IDAgNzkzMzAwMAorODI0IDAgNzk2NjAwMAorNSAwIDgwMDAwMDAKKzY5MSAwIDgwMzMwMDAKKzI3IDAgODA2NjAwMAorNDU3MyAwIDgxMDAwMDAKKzUgMCA4MTMzMDAwCis0NzMgMCA4MTY2MDAwCis1IDAgODIwMDAwMAorMTYzNyAwIDgyMzMwMDAKKzUgMCA4MjY2MDAwCis0NTEgMCA4MzAwMDAwCis1IDAgODMzMzAwMAorOTY5IDAgODM2NjAwMAorNSAwIDg0MDAwMDAKKzIzNCAwIDg0MzMwMDAKKzI0IDAgODQ2NjAwMAorMzM2MSAwIDg1MDAwMDAKKzUgMCA4NTMzMDAwCisxNjggMCA4NTY2MDAwCis1IDAgODYwMDAwMAorNjYyIDAgODYzMzAwMAorNSAwIDg2NjYwMDAKKzEyOSAwIDg3MDAwMDAKKzUgMCA4NzMzMDAwCis0NDMgMCA4NzY2MDAwCis1IDAgODgwMDAwMAorMTgzIDAgODgzMzAwMAorMjMgMCA4ODY2MDAwCisyNzY5IDAgODkwMDAwMAorNSAwIDg5MzMwMDAKKzE4MiAwIDg5NjYwMDAKKzUgMCA5MDAwMDAwCis4OTAgMCA5MDMzMDAwCis1IDAgOTA2NjAwMAorMTcxIDAgOTEwMDAwMAorNSAwIDkxMzMwMDAKKzU5OSAwIDkxNjYwMDAKKzUgMCA5MjAwMDAwCisyMzYgMCA5MjMzMDAwCisyMyAwIDkyNjYwMDAKKzIzMTYgMCA5MzAwMDAwCis1IDAgOTMzMzAwMAorMzMzIDAgOTM2NjAwMAorNSAwIDk0MDAwMDAKKzc1OSAwIDk0MzMwMDAKKzUgMCA5NDY2MDAwCisyMTAgMCA5NTAwMDAwCis1IDAgOTUzMzAwMAorMzI0IDAgOTU2NjAwMAorNSAwIDk2MDAwMDAKKzk4IDAgOTYzMzAwMAorMjMgMCA5NjY2MDAwCisxMTA3IDAgOTcwMDAwMAorNSAwIDk3MzMwMDAKKzQyIDAgOTc2NjAwMAorNSAwIDk4MDAwMDAKKzE0NSAwIDk4MzMwMDAKKzUgMCA5ODY2MDAwCisxMDkgMCA5OTAwMDAwCis4OSAwIDk5MzMwMDAKKzI0IDAgOTk2NjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliYWNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTc4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCkBAIC0wLDAgKzEsMTY3IEBACisxMjU3MSAxIDAKKzk4ODEgMCAzMzAwMAorNSAwIDY2MDAwCis1NDQgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI2NDIgMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzUzMSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTM1OSAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTUxIDAgMzY2MDAwCisyOCAwIDQwMDAwMAorMTA3OTEgMCA0MzMwMDAKKzUgMCA0NjYwMDAKKzY1NSAwIDUwMDAwMAorNSAwIDUzMzAwMAorMzc2OSAwIDU2NjAwMAorNSAwIDYwMDAwMAorNzExIDAgNjMzMDAwCis1IDAgNjY2MDAwCisyMDA0IDAgNzAwMDAwCis1IDAgNzMzMDAwCis2NTcgMCA3NjYwMDAKKzI2IDAgODAwMDAwCis4OTY5IDAgODMzMDAwCis1IDAgODY2MDAwCis2MzAgMCA5MDAwMDAKKzUgMCA5MzMwMDAKKzI3ODcgMCA5NjYwMDAKKzUgMCAxMDAwMDAwCis0MDQgMCAxMDMzMDAwCis1IDAgMTA2NjAwMAorMTUxOCAwIDExMDAwMDAKKzUgMCAxMTMzMDAwCis0OTMgMCAxMTY2MDAwCisyNiAwIDEyMDAwMDAKKzk5MDAgMCAxMjMzMDAwCis1IDAgMTI2NjAwMAorNjIwIDAgMTMwMDAwMAorNSAwIDEzMzMwMDAKKzMwNzIgMCAxMzY2MDAwCis1IDAgMTQwMDAwMAorNjY4IDAgMTQzMzAwMAorNSAwIDE0NjYwMDAKKzE4MjEgMCAxNTAwMDAwCis1IDAgMTUzMzAwMAorNjgyIDAgMTU2NjAwMAorMjYgMCAxNjAwMDAwCis5NTYwIDAgMTYzMzAwMAorNSAwIDE2NjYwMDAKKzY2NyAwIDE3MDAwMDAKKzUgMCAxNzMzMDAwCiszMjQ5IDAgMTc2NjAwMAorNSAwIDE4MDAwMDAKKzU4OSAwIDE4MzMwMDAKKzUgMCAxODY2MDAwCisxODE2IDAgMTkwMDAwMAorNSAwIDE5MzMwMDAKKzU0OCAwIDE5NjYwMDAKKzI2IDAgMjAwMDAwMAorOTkxNiAwIDIwMzMwMDAKKzUgMCAyMDY2MDAwCis2MjggMCAyMTAwMDAwCis1IDAgMjEzMzAwMAorMzAzNCAwIDIxNjYwMDAKKzUgMCAyMjAwMDAwCis1OTAgMCAyMjMzMDAwCis1IDAgMjI2NjAwMAorMTU4MSAwIDIzMDAwMDAKKzUgMCAyMzMzMDAwCis1MjQgMCAyMzY2MDAwCisyNiAwIDI0MDAwMDAKKzgxODIgMCAyNDMzMDAwCis1IDAgMjQ2NjAwMAorNTUyIDAgMjUwMDAwMAorNSAwIDI1MzMwMDAKKzI0MTIgMCAyNTY2MDAwCis1IDAgMjYwMDAwMAorNDg5IDAgMjYzMzAwMAorNSAwIDI2NjYwMDAKKzEyMjcgMCAyNzAwMDAwCis1IDAgMjczMzAwMAorNDMyIDAgMjc2NjAwMAorMjYgMCAyODAwMDAwCisyMDE3IDAgMjgzMzAwMAorNTE2IDAgMjg2NjAwMAorMjYgMCAyOTAwMDAwCisxNjYxOSAwIDI5MzMwMDAKKzY3MTAgMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDI1IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NjQgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzExMjkgMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTE1NiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis0ODYgMCAzMzY2MDAwCisyOCAwIDM0MDAwMDAKKzEwMzA0IDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQxMiAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNjA4IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzM5NyAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNTE0IDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzUzMyAwIDM3NjYwMDAKKzI2IDAgMzgwMDAwMAorMTE2OTggMCAzODMzMDAwCis1IDAgMzg2NjAwMAorNTQyIDAgMzkwMDAwMAorNSAwIDM5MzMwMDAKKzMzMzQgMCAzOTY2MDAwCis1IDAgNDAwMDAwMAorNTQ3IDAgNDAzMzAwMAorNSAwIDQwNjYwMDAKKzE4MDkgMCA0MTAwMDAwCis1IDAgNDEzMzAwMAorNTUgMCA0MTY2MDAwCisyNiAwIDQyMDAwMDAKKzk0OTYgMCA0MjMzMDAwCis1IDAgNDI2NjAwMAorNjU4IDAgNDMwMDAwMAorNSAwIDQzMzMwMDAKKzMyMzIgMCA0MzY2MDAwCis1IDAgNDQwMDAwMAorNjAwIDAgNDQzMzAwMAorNSAwIDQ0NjYwMDAKKzE3NjYgMCA0NTAwMDAwCis1IDAgNDUzMzAwMAorNTUwIDAgNDU2NjAwMAorMjUgMCA0NjAwMDAwCis5OTUxIDAgNDYzMzAwMAorNSAwIDQ2NjYwMDAKKzYyNCAwIDQ3MDAwMDAKKzUgMCA0NzMzMDAwCiszNjE3IDAgNDc2NjAwMAorNSAwIDQ4MDAwMDAKKzY0NCAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisxODQxIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzY0OSAwIDQ5NjYwMDAKKzI1IDAgNTAwMDAwMAorOTkwMSAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis1MTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMjgxNCAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis1MTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTUyMSAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis1MDkgMCA1MzY2MDAwCisyNiAwIDU0MDAwMDAKKzEwNTc5IDAgNTQzMzAwMAorNSAwIDU0NjYwMDAKKzU3NSAwIDU1MDAwMDAKKzUgMCA1NTMzMDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTYzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MiBAQAorMjggMzIgMAorMTAgMzIgMAorNDc4MCAxIDMzMzMzCis5NjAgMCAxMDAwMDAKKzQ4MCAwIDY2NjY2CisyNDYgMCA1MDAwMAorMjY0IDAgODMzMzMKKzExNjAgMCAxNjY2NjYKKzQwNCAwIDEzMzMzMworMjM3IDAgMTE2NjY2CisxOTMgMCAxNTAwMDAKKzkzNiAwIDIzMzMzMworMzg0IDAgMjAwMDAwCisxOTkgMCAxODMzMzMKKzI3NSAwIDIxNjY2NgorMTA4NiAwIDMwMDAwMAorNTIwIDAgMjY2NjY2CiszMDEgMCAyNTAwMDAKKzI3MCAwIDI4MzMzMworMTIzMiAwIDM2NjY2NgorNTU5IDAgMzMzMzMzCisyODcgMCAzMTY2NjYKKzI3NCAwIDM1MDAwMAorMTA4NCAwIDQzMzMzMworNDg1IDAgNDAwMDAwCiszMDcgMCAzODMzMzMKKzI4NCAwIDQxNjY2NgorMTA1MiAwIDUwMDAwMAorNTA0IDAgNDY2NjY2CisyOTggMCA0NTAwMDAKKzMyNyAwIDQ4MzMzMworMTE4OSAwIDU2NjY2NgorMzU4IDAgNTMzMzMzCisxNzIgMCA1MTY2NjYKKzE4NSAwIDU1MDAwMAorMTExNSAwIDYzMzMzMworNDYzIDAgNjAwMDAwCisyMTggMCA1ODMzMzMKKzI1NSAwIDYxNjY2NgorMTE1NSAwIDcwMDAwMAorNjIyIDAgNjY2NjY2CiszNTYgMCA2NTAwMDAKKzM0MSAwIDY4MzMzMworMTI0MCAwIDc2NjY2NgorNjEwIDAgNzMzMzMzCiszNDEgMCA3MTY2NjYKKzM4MCAwIDc1MDAwMAorMTMyNiAwIDgzMzMzMworNjIwIDAgODAwMDAwCiszOTYgMCA3ODMzMzMKKzM1MyAwIDgxNjY2NgorMTE5NiAwIDkwMDAwMAorNjIzIDAgODY2NjY2CiszNzUgMCA4NTAwMDAKKzM2MiAwIDg4MzMzMworMTE5MiAwIDk2NjY2NgorNjU0IDAgOTMzMzMzCiszNTkgMCA5MTY2NjYKKzM1MiAwIDk1MDAwMAorODI4IDAgMTAxNjY2NgorNDM2IDAgOTgzMzMzCis0MDEgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YzY4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmM2I5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MiBAQAorMjkgMzIgMAorOSAzMiAwCiszODQ2OSAxIDY2NjY2CiszMjcwIDAgMjAwMDAwCis0NDMgMCAxMzMzMzMKKzI0NiAwIDEwMDAwMAorMjE0IDAgMTY2NjY2CisyMjgwIDAgMzAwMDAwCiszNjggMCAyMzMzMzMKKzIzOCAwIDI2NjY2NgorNjg4IDAgNDMzMzMzCisyODcgMCAzNjY2NjYKKzIzNCAwIDMzMzMzMworMTcyIDAgNDAwMDAwCisxMzYzIDAgNTY2NjY2CisyNzMgMCA1MDAwMDAKKzE2NiAwIDQ2NjY2NgorMTgyIDAgNTMzMzMzCiszNzMxIDAgNzAwMDAwCiszNDkgMCA2MzMzMzMKKzIxNiAwIDYwMDAwMAorMjI5IDAgNjY2NjY2Cis2MDYxIDAgODMzMzMzCis0MDggMCA3NjY2NjYKKzI3MSAwIDczMzMzMworMjQxIDAgODAwMDAwCis3MDA0IDAgOTY2NjY2Cis0NDIgMCA5MDAwMDAKKzI2MSAwIDg2NjY2NgorMjI5IDAgOTMzMzMzCis3MzU0IDAgMTEwMDAwMAorNDA0IDAgMTAzMzMzMworMjY0IDAgMTAwMDAwMAorMTk4IDAgMTA2NjY2NgorNDU0MiAwIDEyMzMzMzMKKzI4NiAwIDExNjY2NjYKKzIwNSAwIDExMzMzMzMKKzEzMSAwIDEyMDAwMDAKKzMzMjkgMCAxMzMzMzMzCisyMTYgMCAxMjY2NjY2CisxMzYgMCAxMzAwMDAwCisyMzUzIDAgMTM2NjY2NgorOTg2IDAgMTQwMDAwMAorODA4IDAgMTQzMzMzMworMzE4IDAgMTQ2NjY2NgorNjIgMCAxNTAwMDAwCis1NTY0OSAxIDE1MzMzMzMKKzE2MDYgMCAxNTY2NjY2CisyOTM1IDAgMTYwMDAwMAorMzU2NCAwIDE2MzMzMzMKKzMzMjQgMCAxNjY2NjY2Cis0NTQzIDAgMTcwMDAwMAorMTc0MCAwIDE3MzMzMzMKKzI3MzcgMCAxNzY2NjY2CisyNzYyIDAgMTgwMDAwMAorMzE4NSAwIDE4MzMzMzMKKzMyMzggMCAxODY2NjY2CiszMzk1IDAgMTkwMDAwMAorMzQyMSAwIDE5MzMzMzMKKzM0ODIgMCAxOTY2NjY2CiszMzcwIDAgMjAwMDAwMAorMzY1NiAwIDIwMzMzMzMKKzM1MDkgMCAyMDY2NjY2CiszNjg0IDAgMjEwMDAwMAorMzczMiAwIDIxMzMzMzMKKzMzNjYgMCAyMTY2NjY2CiszMzc0IDAgMjIwMDAwMAorMzIwMiAwIDIyMzMzMzMKKzM0NDkgMCAyMjY2NjY2CiszMzYwIDAgMjMwMDAwMAorMzM3MiAwIDIzMzMzMzMKKzM0NjAgMCAyMzY2NjY2CiszNTExIDAgMjQwMDAwMAorMzQ3MSAwIDI0MzMzMzMKKzMzMzAgMCAyNDY2NjY2CiszMzc3IDAgMjUwMDAwMAorMzc0NCAwIDI1MzMzMzMKKzM2NjcgMCAyNTY2NjY2CiszODY3IDAgMjYwMDAwMAorMzc3NiAwIDI2MzMzMzMKKzMzMjkgMCAyNjY2NjY2CiszODc2IDAgMjcwMDAwMAorMzM4NSAwIDI3MzMzMzMKKzM1NjYgMCAyNzY2NjY2CiszMzAxIDAgMjgwMDAwMAorMzU3MCAwIDI4MzMzMzMKKzMxMzIgMCAyODY2NjY2CiszNDg3IDAgMjkwMDAwMAorMzI3MCAwIDI5MzMzMzMKKzM0NzIgMCAyOTY2NjY2CiszNDg3IDAgMzAwMDAwMAorMzUwMyAwIDMwMzMzMzMKKzM0NDMgMCAzMDY2NjY2CiszNTI4IDAgMzEwMDAwMAorMzI1OCAwIDMxMzMzMzMKKzM3MDcgMCAzMTY2NjY2CiszMTIwIDAgMzIwMDAwMAorMzM0NyAwIDMyMzMzMzMKKzMzNzIgMCAzMjY2NjY2CiszMTYxIDAgMzMwMDAwMAorMzM5MyAwIDMzMzMzMzMKKzMzOTkgMCAzMzY2NjY2CisyOTA1IDAgMzQwMDAwMAorMzU0MyAwIDM0MzMzMzMKKzMxMDMgMCAzNDY2NjY2CiszMDk5IDAgMzUwMDAwMAorMzQ1NyAwIDM1MzMzMzMKKzMxOTEgMCAzNTY2NjY2CiszMjkwIDAgMzYwMDAwMAorMzMxMiAwIDM2MzMzMzMKKzI5NTUgMCAzNjY2NjY2CiszMzQxIDAgMzcwMDAwMAorMzEwMiAwIDM3MzMzMzMKKzMxODYgMCAzNzY2NjY2CiszMTgwIDAgMzgwMDAwMAorMjgzOSAwIDM4MzMzMzMKKzMwODkgMCAzODY2NjY2CiszMTEwIDAgMzkwMDAwMAorMzE2NSAwIDM5MzMzMzMKKzI2ODQgMCAzOTY2NjY2CiszMDgyIDAgNDAwMDAwMAorMjY5NCAwIDQwMzMzMzMKKzMwNTEgMCA0MDY2NjY2CiszMDAyIDAgNDEwMDAwMAorMjkyOSAwIDQxMzMzMzMKKzI2NzYgMCA0MTY2NjY2CisyNDExIDAgNDIwMDAwMAorMjg3NCAwIDQyMzMzMzMKKzI1NzIgMCA0MjY2NjY2CisyNDIwIDAgNDMwMDAwMAorMjUwMCAwIDQzMzMzMzMKKzIxMzcgMCA0MzY2NjY2CisyMzQ0IDAgNDQwMDAwMAorMjAyOCAwIDQ0MzMzMzMKKzE3NTQgMCA0NDY2NjY2CisxNjI3IDAgNDUwMDAwMAorMTM3NSAwIDQ1MzMzMzMKKzEwNjkgMCA0NTY2NjY2Cis4MDEgMCA0NjAwMDAwCisyMTY4OSAxIDQ2MzMzMzMKKzI2MSAwIDQ3MzMzMzMKKzc2IDAgNDY2NjY2NgorNDUgMCA0NzAwMDAwCiszMzQgMCA0ODAwMDAwCis2MSAwIDQ3NjY2NjYKKzE1NzcgMCA0OTMzMzMzCisyODAgMCA0ODY2NjY2Cis3MiAwIDQ4MzMzMzMKKzQ3OSAwIDQ5MDAwMDAKKzIxODEgMCA1MDY2NjY2Cis5MTkgMCA1MDAwMDAwCiszNDkgMCA0OTY2NjY2Cis1MzQgMCA1MDMzMzMzCis0ODYwIDAgNTE2NjY2NgorNzU5IDAgNTEwMDAwMAorNjc3IDAgNTEzMzMzMworMzEwMSAwIDUzMDAwMDAKKzQ5OCAwIDUyMzMzMzMKKzMyNyAwIDUyMDAwMDAKKzIxMyAwIDUyNjY2NjYKKzE2NDAgMCA1NDMzMzMzCisyNTkgMCA1MzY2NjY2CisxNjIgMCA1MzMzMzMzCisxNDggMCA1NDAwMDAwCisyMTMwIDAgNTU2NjY2NgorMzk3IDAgNTUwMDAwMAorMTkxIDAgNTQ2NjY2NgorMTgwIDAgNTUzMzMzMworMTc1NyAwIDU3MDAwMDAKKzMzOCAwIDU2MzMzMzMKKzE5NCAwIDU2MDAwMDAKKzE0MSAwIDU2NjY2NjYKKzExMDMgMCA1ODMzMzMzCisyODkgMCA1NzY2NjY2CisxNDkgMCA1NzMzMzMzCisxNDggMCA1ODAwMDAwCiszOTE0IDAgNTk2NjY2NgorMTAyNSAwIDU5MDAwMDAKKzcxNCAwIDU4NjY2NjYKKzQyOCAwIDU5MzMzMzMKKzQ2MDQgMCA2MTAwMDAwCisxNDU2IDAgNjAzMzMzMworNjk5IDAgNjAwMDAwMAorODkyIDAgNjA2NjY2NgorNDUzNSAwIDYyMzMzMzMKKzEzMDEgMCA2MTY2NjY2Cis3MDggMCA2MTMzMzMzCis1OTIgMCA2MjAwMDAwCisyMTc1IDAgNjMzMzMzMworNjAzIDAgNjI2NjY2NgorNDExIDAgNjMwMDAwMAorMTgxMyAwIDYzNjY2NjYKKzUwNTUgMCA2NDY2NjY2CisxNTM4IDAgNjQwMDAwMAorMjIwMSAwIDY0MzMzMzMKKzYyNDkgMCA2NTMzMzMzCisxNDIwIDAgNjUwMDAwMAorMjI1NCAwIDY1NjY2NjYKKzI0NDEgMCA2NjMzMzMzCisyOTMgMCA2NjAwMDAwCisyMDYyIDAgNjcwMDAwMAorMjEzIDAgNjY2NjY2NgorMjQ1NSAwIDY4MDAwMDAKKzM0NCAwIDY3MzMzMzMKKzIwNCAwIDY3NjY2NjYKKzM5MjAgMCA2OTMzMzMzCis3NTEgMCA2ODY2NjY2CiszNzYgMCA2ODMzMzMzCiszMzcgMCA2OTAwMDAwCisyODgyIDAgNzA2NjY2NgorNDU3IDAgNzAwMDAwMAorMjIyIDAgNjk2NjY2NgorMTg0IDAgNzAzMzMzMworMjczNCAwIDcyMDAwMDAKKzQ3MiAwIDcxMzMzMzMKKzE4NSAwIDcxMDAwMDAKKzI1MCAwIDcxNjY2NjYKKzI3MzUgMCA3MzMzMzMzCiszMDEgMCA3MjY2NjY2CiszMDcgMCA3MjMzMzMzCisxMDkgMCA3MzAwMDAwCisxODUyIDAgNzQ2NjY2NgorMzIyIDAgNzQwMDAwMAorMTUzIDAgNzM2NjY2NgorMTk1IDAgNzQzMzMzMworMTUwNiAwIDc2MDAwMDAKKzM1MCAwIDc1MzMzMzMKKzE3MCAwIDc1MDAwMDAKKzE0NSAwIDc1NjY2NjYKKzIxMjMgMCA3NzMzMzMzCis0MzAgMCA3NjY2NjY2CiszNjQgMCA3NjMzMzMzCisxOTAgMCA3NzAwMDAwCisxMjk2IDAgNzgwMDAwMAorMTk2IDAgNzc2NjY2NgorODU4IDAgNzgzMzMzMworMzg2NSAwIDc5MzMzMzMKKzY5MyAwIDc4NjY2NjYKKzE2MDYgMCA3OTAwMDAwCis0ODg0IDAgNzk2NjY2NgorMjgyMSAwIDgwMzMzMzMKKzIyMTEgMCA4MDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNSBAQAorNDIgMzIgMAorMTM4NiAxIDAKKzI0MDEgMSAyNDAwMAorMjMyMSAxIDQ4MDAwCisyMzY3IDEgNzIwMDAKKzIzNzAgMSA5NjAwMAorMjMzNCAxIDEyMDAwMAorMjM5NiAxIDE0NDAwMAorMjM3NSAxIDE2ODAwMAorMjQzMSAxIDE5MjAwMAorMjQyOCAxIDIxNjAwMAorMjMzNCAxIDI0MDAwMAorMjI2MSAxIDI2NDAwMAorMjEyNCAxIDI4ODAwMAorMjE1MiAxIDMxMjAwMAorMjI5NSAxIDMzNjAwMAorMjE4MyAxIDM2MDAwMAorMjM5MyAxIDM4NDAwMAorMjQwMCAxIDQwODAwMAorMjI0NiAxIDQzMjAwMAorMjI4OSAxIDQ1NjAwMAorMjQwMCAxIDQ4MDAwMAorMjMzNSAxIDUwNDAwMAorMjI5NCAxIDUyODAwMAorMjI2MCAxIDU1MjAwMAorMjIwNiAxIDU3NjAwMAorMjE4NSAxIDYwMDAwMAorMjE1NSAxIDYyNDAwMAorMjExOCAxIDY0ODAwMAorMjA5NCAxIDY3MjAwMAorMjA1MCAxIDY5NjAwMAorMjA1OSAxIDcyMDAwMAorMjAzMCAxIDc0NDAwMAorMjAyMiAxIDc2ODAwMAorMjA3OCAxIDc5MjAwMAorMjA4MiAxIDgxNjAwMAorMjA5NCAxIDg0MDAwMAorMjExMSAxIDg2NDAwMAorMjA0MyAxIDg4ODAwMAorMjAyMyAxIDkxMjAwMAorMjAyNCAxIDkzNjAwMAorMjA1NiAxIDk2MDAwMAorMjEwOCAxIDk4NDAwMAorMjEzOCAxIDEwMDgwMDAKKzIxNDAgMSAxMDMyMDAwCisyMTExIDEgMTA1NjAwMAorMjExMCAxIDEwODAwMDAKKzIxMzcgMSAxMTA0MDAwCisyMTU3IDEgMTEyODAwMAorMjE3NCAxIDExNTIwMDAKKzIyMDAgMSAxMTc2MDAwCisyMjAzIDEgMTIwMDAwMAorMjIzNyAxIDEyMjQwMDAKKzIyNjEgMSAxMjQ4MDAwCisyMjE1IDEgMTI3MjAwMAorMjEzMyAxIDEyOTYwMDAKKzIwOTEgMSAxMzIwMDAwCisyMDg4IDEgMTM0NDAwMAorMjEyMiAxIDEzNjgwMDAKKzIxMzkgMSAxMzkyMDAwCisyMTQ2IDEgMTQxNjAwMAorMjIzMSAxIDE0NDAwMDAKKzIyODIgMSAxNDY0MDAwCisyMjczIDEgMTQ4ODAwMAorMjMwNCAxIDE1MTIwMDAKKzIyOTIgMSAxNTM2MDAwCisyMjU1IDEgMTU2MDAwMAorMjE4MSAxIDE1ODQwMDAKKzIwODEgMSAxNjA4MDAwCisyMDEyIDEgMTYzMjAwMAorMjAxMSAxIDE2NTYwMDAKKzIwNjYgMSAxNjgwMDAwCisyMDY5IDEgMTcwNDAwMAorMjEyMCAxIDE3MjgwMDAKKzIxNDEgMSAxNzUyMDAwCisyMTQ4IDEgMTc3NjAwMAorMjE4MSAxIDE4MDAwMDAKKzIxNzYgMSAxODI0MDAwCisyMjQwIDEgMTg0ODAwMAorMjI5NyAxIDE4NzIwMDAKKzIzMjUgMSAxODk2MDAwCisyMzM2IDEgMTkyMDAwMAorMjMyOSAxIDE5NDQwMDAKKzIyOTkgMSAxOTY4MDAwCisyMzIyIDEgMTk5MjAwMAorMjM0NyAxIDIwMTYwMDAKKzIyODcgMSAyMDQwMDAwCisyMjg2IDEgMjA2NDAwMAorMjI2OSAxIDIwODgwMDAKKzIzMjAgMSAyMTEyMDAwCisyMzA1IDEgMjEzNjAwMAorMjM4NCAxIDIxNjAwMDAKKzI0MjkgMSAyMTg0MDAwCisyMzcwIDEgMjIwODAwMAorMjM2NSAxIDIyMzIwMDAKKzIzNjEgMSAyMjU2MDAwCisyMzcwIDEgMjI4MDAwMAorMjM5MyAxIDIzMDQwMDAKKzIzNDIgMSAyMzI4MDAwCisyMzI1IDEgMjM1MjAwMAorMjMzNCAxIDIzNzYwMDAKKzIzMTYgMSAyNDAwMDAwCisyMzE3IDEgMjQyNDAwMAorMjMwNSAxIDI0NDgwMDAKKzIzNjAgMSAyNDcyMDAwCisyMzMxIDEgMjQ5NjAwMAorMjMzMiAxIDI1MjAwMDAKKzIzNjEgMSAyNTQ0MDAwCisyNDE3IDEgMjU2ODAwMAorMjQzOCAxIDI1OTIwMDAKKzI0MDMgMSAyNjE2MDAwCisyMzg2IDEgMjY0MDAwMAorMjM4MiAxIDI2NjQwMDAKKzIzNTAgMSAyNjg4MDAwCisyMzU1IDEgMjcxMjAwMAorMjM4MyAxIDI3MzYwMDAKKzIzODQgMSAyNzYwMDAwCisyMzgzIDEgMjc4NDAwMAorMjM3MyAxIDI4MDgwMDAKKzIzNzQgMSAyODMyMDAwCisyMzQ3IDEgMjg1NjAwMAorMjM1MyAxIDI4ODAwMDAKKzIzODEgMSAyOTA0MDAwCisyNDAxIDEgMjkyODAwMAorMjQwMSAxIDI5NTIwMDAKKzIzODUgMSAyOTc2MDAwCisyMzgyIDEgMzAwMDAwMAorMjMyOCAxIDMwMjQwMDAKKzIzMDMgMSAzMDQ4MDAwCisyMjcyIDEgMzA3MjAwMAorMjI3MCAxIDMwOTYwMDAKKzIzMTIgMSAzMTIwMDAwCisyMjczIDEgMzE0NDAwMAorMjMzMCAxIDMxNjgwMDAKKzIzMzkgMSAzMTkyMDAwCisyMjk2IDEgMzIxNjAwMAorMjMxNyAxIDMyNDAwMDAKKzI0NDAgMSAzMjY0MDAwCisyMzUzIDEgMzI4ODAwMAorMjM0NiAxIDMzMTIwMDAKKzIzMDMgMSAzMzM2MDAwCisyMzA4IDEgMzM2MDAwMAorMjI4NyAxIDMzODQwMDAKKzIzMTYgMSAzNDA4MDAwCisyMzY3IDEgMzQzMjAwMAorMjMzNSAxIDM0NTYwMDAKKzIzNTAgMSAzNDgwMDAwCisyMzk1IDEgMzUwNDAwMAorMjQwOCAxIDM1MjgwMDAKKzI0MTMgMSAzNTUyMDAwCisyNDE1IDEgMzU3NjAwMAorMjQ2OCAxIDM2MDAwMDAKKzI0MzcgMSAzNjI0MDAwCisyMzcyIDEgMzY0ODAwMAorMjM3MSAxIDM2NzIwMDAKKzIzNDEgMSAzNjk2MDAwCisyMzI4IDEgMzcyMDAwMAorMjI3MyAxIDM3NDQwMDAKKzIyNDQgMSAzNzY4MDAwCisyMjMzIDEgMzc5MjAwMAorMjIyOSAxIDM4MTYwMDAKKzIyNTIgMSAzODQwMDAwCisyMjM2IDEgMzg2NDAwMAorMjIxNyAxIDM4ODgwMDAKKzIxNzkgMSAzOTEyMDAwCisyMjUxIDEgMzkzNjAwMAorMjE5MiAxIDM5NjAwMDAKKzIxOTkgMSAzOTg0MDAwCisyMjEyIDEgNDAwODAwMAorMjE5MCAxIDQwMzIwMDAKKzIxMDIgMSA0MDU2MDAwCisyMTIwIDEgNDA4MDAwMAorMjE2NyAxIDQxMDQwMDAKKzIwMjQgMSA0MTI4MDAwCisyMDEwIDEgNDE1MjAwMAorMjA2NyAxIDQxNzYwMDAKKzIwMzUgMSA0MjAwMDAwCisyMDUxIDEgNDIyNDAwMAorMjAxMiAxIDQyNDgwMDAKKzIwNjYgMSA0MjcyMDAwCisyMDI1IDEgNDI5NjAwMAorMTk4NyAxIDQzMjAwMDAKKzE5NzIgMSA0MzQ0MDAwCisxOTY2IDEgNDM2ODAwMAorMTk5OSAxIDQzOTIwMDAKKzE5ODcgMSA0NDE2MDAwCisxOTIyIDEgNDQ0MDAwMAorMjAyMCAxIDQ0NjQwMDAKKzIwNzIgMSA0NDg4MDAwCisyMDIxIDEgNDUxMjAwMAorMjAxNyAxIDQ1MzYwMDAKKzIwOTkgMSA0NTYwMDAwCisyMDY0IDEgNDU4NDAwMAorMjEwOSAxIDQ2MDgwMDAKKzIwOTMgMSA0NjMyMDAwCisyMDkwIDEgNDY1NjAwMAorMjE0OCAxIDQ2ODAwMDAKKzIxODQgMSA0NzA0MDAwCisyMTc5IDEgNDcyODAwMAorMjE1MiAxIDQ3NTIwMDAKKzIxNDMgMSA0Nzc2MDAwCisyMTU5IDEgNDgwMDAwMAorMjEyMyAxIDQ4MjQwMDAKKzIxMjkgMSA0ODQ4MDAwCisyMTQ3IDEgNDg3MjAwMAorMjE5MiAxIDQ4OTYwMDAKKzIwNTEgMSA0OTIwMDAwCisyMTE2IDEgNDk0NDAwMAorMjEyNCAxIDQ5NjgwMDAKKzIwODggMSA0OTkyMDAwCisyMDczIDEgNTAxNjAwMAorMjE0NiAxIDUwNDAwMDAKKzIxMzMgMSA1MDY0MDAwCisyMDczIDEgNTA4ODAwMAorMjA1OSAxIDUxMTIwMDAKKzIwNDQgMSA1MTM2MDAwCisyMDEyIDEgNTE2MDAwMAorMjAzNCAxIDUxODQwMDAKKzIwNTMgMSA1MjA4MDAwCisyMDEzIDEgNTIzMjAwMAorMTk4MSAxIDUyNTYwMDAKKzIwOTQgMSA1MjgwMDAwCisyMDc2IDEgNTMwNDAwMAorMTk2OCAxIDUzMjgwMDAKKzIwMjggMSA1MzUyMDAwCisyMDMxIDEgNTM3NjAwMAorMjAyMCAxIDU0MDAwMDAKKzIwMTkgMSA1NDI0MDAwCisyMDMwIDEgNTQ0ODAwMAorMjAxNSAxIDU0NzIwMDAKKzE5NjIgMSA1NDk2MDAwCisyMDcwIDEgNTUyMDAwMAorMjA4NyAxIDU1NDQwMDAKKzE5NjQgMSA1NTY4MDAwCisyMDY5IDEgNTU5MjAwMAorMjAzNCAxIDU2MTYwMDAKKzE5OTQgMSA1NjQwMDAwCisxOTg1IDEgNTY2NDAwMAorMjAzMCAxIDU2ODgwMDAKKzIwNjYgMSA1NzEyMDAwCisxOTU0IDEgNTczNjAwMAorMTczMyAxIDU3NjAwMDAKKzE2NDkgMSA1Nzg0MDAwCisxNjUyIDEgNTgwODAwMAorMTYzMSAxIDU4MzIwMDAKKzE2NTYgMSA1ODU2MDAwCisxNjcyIDEgNTg4MDAwMAorMTY2NyAxIDU5MDQwMDAKKzE2OTYgMSA1OTI4MDAwCisxNjcyIDEgNTk1MjAwMAorMTcwMSAxIDU5NzYwMDAKKzE2NTEgMSA2MDAwMDAwCisxNjc0IDEgNjAyNDAwMAorMTY5NSAxIDYwNDgwMDAKKzE3MDIgMSA2MDcyMDAwCisxNzA3IDEgNjA5NjAwMAorMTY5NCAxIDYxMjAwMDAKKzE3MjcgMSA2MTQ0MDAwCisxNzMwIDEgNjE2ODAwMAorMTcwOCAxIDYxOTIwMDAKKzE3MDQgMSA2MjE2MDAwCisxNzM1IDEgNjI0MDAwMAorMTc1OCAxIDYyNjQwMDAKKzE3NTMgMSA2Mjg4MDAwCisxNzQ4IDEgNjMxMjAwMAorMTc2MyAxIDYzMzYwMDAKKzE3MzcgMSA2MzYwMDAwCisxNzgzIDEgNjM4NDAwMAorMTgzOSAxIDY0MDgwMDAKKzE4NjEgMSA2NDMyMDAwCisxODMyIDEgNjQ1NjAwMAorMTk0NyAxIDY0ODAwMDAKKzE5MzkgMSA2NTA0MDAwCisxOTI2IDEgNjUyODAwMAorMTg5NiAxIDY1NTIwMDAKKzE5MDkgMSA2NTc2MDAwCisxODY5IDEgNjYwMDAwMAorMTkwMCAxIDY2MjQwMDAKKzE4OTYgMSA2NjQ4MDAwCisxODgzIDEgNjY3MjAwMAorMTkwMyAxIDY2OTYwMDAKKzE4OTUgMSA2NzIwMDAwCisxODY1IDEgNjc0NDAwMAorMTg3OCAxIDY3NjgwMDAKKzE4ODEgMSA2NzkyMDAwCisxODYxIDEgNjgxNjAwMAorMTc5MSAxIDY4NDAwMDAKKzE3ODcgMSA2ODY0MDAwCisxNzk4IDEgNjg4ODAwMAorMTgxMSAxIDY5MTIwMDAKKzE4MjQgMSA2OTM2MDAwCisxODk1IDEgNjk2MDAwMAorMjA3OSAxIDY5ODQwMDAKKzIwMzQgMSA3MDA4MDAwCisyMDM4IDEgNzAzMjAwMAorMjAxOCAxIDcwNTYwMDAKKzIwMzAgMSA3MDgwMDAwCisyMDY3IDEgNzEwNDAwMAorMTk4MiAxIDcxMjgwMDAKKzE5MTEgMSA3MTUyMDAwCisxOTA0IDEgNzE3NjAwMAorMTg3NCAxIDcyMDAwMDAKKzE4NzYgMSA3MjI0MDAwCisxOTQ0IDEgNzI0ODAwMAorMTk3NyAxIDcyNzIwMDAKKzE5NzcgMSA3Mjk2MDAwCisxOTc5IDEgNzMyMDAwMAorMjAxMiAxIDczNDQwMDAKKzE5NjEgMSA3MzY4MDAwCisxNzczIDEgNzM5MjAwMAorMTc4MCAxIDc0MTYwMDAKKzE4MDEgMSA3NDQwMDAwCisxODkyIDEgNzQ2NDAwMAorMTg2OSAxIDc0ODgwMDAKKzE5MzYgMSA3NTEyMDAwCisyMTU0IDEgNzUzNjAwMAorMjIyNiAxIDc1NjAwMDAKKzIxNTkgMSA3NTg0MDAwCisyMjUzIDEgNzYwODAwMAorMjI4NiAxIDc2MzIwMDAKKzIyMTQgMSA3NjU2MDAwCisyMTExIDEgNzY4MDAwMAorMjAyNyAxIDc3MDQwMDAKKzE5OTQgMSA3NzI4MDAwCisxODgyIDEgNzc1MjAwMAorMTg4NyAxIDc3NzYwMDAKKzE5OTMgMSA3ODAwMDAwCisxOTYyIDEgNzgyNDAwMAorMTk4MiAxIDc4NDgwMDAKKzE5NjYgMSA3ODcyMDAwCisxOTYyIDEgNzg5NjAwMAorMTkyOCAxIDc5MjAwMDAKKzE4NzggMSA3OTQ0MDAwCisxODU3IDEgNzk2ODAwMAorMTg4NSAxIDc5OTIwMDAKKzE5MTkgMSA4MDE2MDAwCisxOTA0IDEgODA0MDAwMAorMTkwOSAxIDgwNjQwMDAKKzE5MDkgMSA4MDg4MDAwCisxOTMzIDEgODExMjAwMAorMTgyNCAxIDgxMzYwMDAKKzE3NTYgMSA4MTYwMDAwCisxNzMzIDEgODE4NDAwMAorMTcwNSAxIDgyMDgwMDAKKzE3NTUgMSA4MjMyMDAwCisxNzU2IDEgODI1NjAwMAorMTcyNSAxIDgyODAwMDAKKzE3NjEgMSA4MzA0MDAwCisxNzM2IDEgODMyODAwMAorMTcwNiAxIDgzNTIwMDAKKzE2NjIgMSA4Mzc2MDAwCisxNjA0IDEgODQwMDAwMAorMTYxMyAxIDg0MjQwMDAKKzE2OTIgMSA4NDQ4MDAwCisxNzM2IDEgODQ3MjAwMAorMTc3OSAxIDg0OTYwMDAKKzE3NjggMSA4NTIwMDAwCisxNzU4IDEgODU0NDAwMAorMTcwOCAxIDg1NjgwMDAKKzE2NDIgMSA4NTkyMDAwCisxNjQ1IDEgODYxNjAwMAorMTU4MSAxIDg2NDAwMDAKKzE2NTEgMSA4NjY0MDAwCisxNzMxIDEgODY4ODAwMAorMTc0MyAxIDg3MTIwMDAKKzE3MTcgMSA4NzM2MDAwCisxNzE1IDEgODc2MDAwMAorMTY0NiAxIDg3ODQwMDAKKzE1NTEgMSA4ODA4MDAwCisxNTYzIDEgODgzMjAwMAorMTY0OSAxIDg4NTYwMDAKKzE3NDIgMSA4ODgwMDAwCisxNzI0IDEgODkwNDAwMAorMTY3NiAxIDg5MjgwMDAKKzE2NjQgMSA4OTUyMDAwCisxNTg3IDEgODk3NjAwMAorMTQ5NyAxIDkwMDAwMDAKKzE1MDMgMSA5MDI0MDAwCisxNjQ0IDEgOTA0ODAwMAorMTY1OCAxIDkwNzIwMDAKKzE2ODAgMSA5MDk2MDAwCisxNjExIDEgOTEyMDAwMAorMTY5NCAxIDkxNDQwMDAKKzE2NjggMSA5MTY4MDAwCisxNjc3IDEgOTE5MjAwMAorMTYwNCAxIDkyMTYwMDAKKzE1NjcgMSA5MjQwMDAwCisxNjM5IDEgOTI2NDAwMAorMTU1MiAxIDkyODgwMDAKKzE0ODYgMSA5MzEyMDAwCisxNDk0IDEgOTMzNjAwMAorMTQ4MCAxIDkzNjAwMDAKKzE1MDkgMSA5Mzg0MDAwCisxNDU3IDEgOTQwODAwMAorMTQyMyAxIDk0MzIwMDAKKzE0NTkgMSA5NDU2MDAwCisxNDQ0IDEgOTQ4MDAwMAorMTQyNCAxIDk1MDQwMDAKKzE0MTMgMSA5NTI4MDAwCisxNDk4IDEgOTU1MjAwMAorMTQ1NSAxIDk1NzYwMDAKKzEzOTMgMSA5NjAwMDAwCisxNjM4IDEgOTYyNDAwMAorMTkxOSAxIDk2NDgwMDAKKzE5NzkgMSA5NjcyMDAwCisxODk0IDEgOTY5NjAwMAorMjAwMiAxIDk3MjAwMDAKKzIwNjIgMSA5NzQ0MDAwCisyMDk4IDEgOTc2ODAwMAorMTkxOSAxIDk3OTIwMDAKKzE3MzggMSA5ODE2MDAwCisxODkwIDEgOTg0MDAwMAorMTk3MSAxIDk4NjQwMDAKKzI0MjkgMSA5ODg4MDAwCisxODYxIDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNGExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACitrb2dPx8XY1Up2Q3VzWNPVSXZKfn1LdVldwcjE9PT0ythJcnRCUlTz+cfaxtZUxfns7OP/1U9lYn3Z/u3p6+HBW3NnZ0T05eDg4OXGXkxMS39lWlFJ2ffx81B2eG5tcFXk7eT+3GBoFxRmdvno7+bnw3VnbX90ZXdYW99fWNjE1M/P2MFY0NZ5ZX9ncVLb+OX/4fhUR2VzRnxPwvXJ0FnfWXXC5u+V5shKaxARa3f465CX58d3YmltTPnk5uzk2EN6fHlicMPl4+fh6Phbdnh4SkL0//X+9F1xZ2F1X9374OPlwsZWZXxVwVRPcElwYGRx0PTB9+TYTEJGS3JldnR5c2dmfXNP1EJxUtzcRnHczU5OTXF3WsL75+X79NlzaWHY++Po6u39W2ViZtzk6ZeV6O/4WXhkeHxK9+fk6JTq4thzeGdmZnnE/NlQTGRme0/azPbx0UBxYG96QM7l/8vaX31ibEPw5ef53UZmaW1iZFvN5OVWRkhyfHxkdlzYx19F29ZJcGF+0Pb64+fwUnx/YG9w8e2U7fj0RGRua2Td5JeWlevu/dVwcENE2PbxzcnE9vHdW8fDU397UtPczM9U3FNX1FDVzsnI1XZGRVb3+M1dcUtyY2dV5O3nxtRIYGtuY353w/vJU0FDd3hjZmR4fntmZ2d8TGRmfNP1xdX299BNf2dnZ0bn6ZeRkZfhQn1M3O2Xk5yTle3UeHx19OX18fzSxdvA8VN1XHFmZ3tYxEFzS3dbV01eWHN2cmF9Rc3g+PH/U3J9YGVyT+Xp4Of2XHRqEGpk2eHm+sx2Zm9qYEPR8/BTTnN6f3hjZ2B92d/B5+TnyHh6fED85OXi/9hVc39I1uTu6Ori5uH42F5RxPb3wsbx8vPY0MzOz8NEeWdmc0TZ8v7m7ufHX1rfV012fU/TWETcychXeGJrbUzf/uXATmRpFxMVc9bb3U12Tn9kY3p1R1DO/fz58FB2fmVAzOTh5P/7wtXTdVDw98/G9OD/0F15Y2Rwze3t7+HwXGRhRcr65vnQRFpeVMbglOrk9Vp1cmR8V8T64+uX4PzwUHthY0jM8PnES3Nja2kVYnfW0lde1Hxua2oVa2FBzcPfXVNkbG59xff/+spBdX5yclj85/XIw/3n/eTk8ddERcfVz+Ht4MpGQkRJ1tbGwtvd3VNV091cdUpCXF9dVV5AUNj4+szLzER9Z0jl7ZWW6u/k8fr/8eXn5uT+4e7g+9t+axViWsn67O7wZxYdEBdrZ3N5ZG8UERIRb2FxV9TRRnxhFRdpZVLA9//890lkZXBE3cHL13d0SFzGwffn+PDH3dtXdnxmZVXy5fv75+VRSktT9uCVl+/DQHN5ctTllJTs4+Tk4+b3wNXw5OHol5Xv+8L2wNrExVNYcVLD3NxacX17Y2Jsek5Kc3lvFWtgcV9VQXtpaxcUY0hAfWZkX9rIzdRXUXJB19/NyM9efk7G0dr28f3+8/daQ9Hw5uX09fnCTnZc11fF+OHg4uVHZm1iReXrkZCRlfzIxkHT5O3o4uDs91BTU8z3UVDEz9rFwt9naGJlfHZFcXhjbmtvbXxGRndkfHVmaGR6c3BLUEt/R1NBdGFkTcLbxMHIRnx0XPLtleDMWVZT39/Dy83C2Mv4+8DK0n1tYUjZzufs7eDOTXxxckpaxMfL5OHk5eTx0vXj7+iUl+79X0tfz/fY2MLaU9jFUUlFd2VkZHh4fX9hb2NkfnN6e0p9bhMSam14UPb+8txHSklexfHl8NL0zVFaREbW9eXnzdDbSGRsaXteXNv65fNEeXJibn1bVcDe9OPm5/tX18fE7ZSXnZPp+sPI5uXn6eT5/dfBzdTe887cd3pFXkhSTndBfXBBc3h+bGoVanxAd1xPenh6dFxzZmVmfktI9/vDUUFPWNb2+PL1x1tDdmdJ2fb588fQRnXR1kBS3FTXVMf28FB5Z3ZxTfb9/ufg7eHeQHBzTlfL5eT6/cvxwczl/MT++v7KzdZU193z+eb6ytNaeGVwXt9V1ttYS1J2f01XV8nTWEdKQX5gYGJiWPDl+cbTUGVhdnHR/8nCz3FjZmRmZWV/c0rSVXJsamhnTf3hydXXdk13bGZQVcDzxtrA/u/r4/rA2vP64+P5+OH64uzn4OPIzfDRTF3F+OX08cj+89Hfw07Xydj3W2Z5cmB+fGdmS17a0k5KSEBzfHx/amF3cXRIfNrZZExxZnBYX/73U3F5fnp3zfz/7f1QZGhpc1nJ5v3FxcrI/t53d9BUVfD788fRRllKcEPz8/bMRUlc0vPg5eXm4/3Lzlh1xczD//D84+D3X3l5dc/tlJTnRnJ8ZUxRRM/429jef2Zlf0tCd3N8dUJ0Qn1gckl8WVlC9NZ+c2BqZUFU0FpCTUbdVl7NWHVWRndbc3xAT0LWTHLYyfH4zkBbUs7+//rWRNjUxePh75Tg8s5cxufk4/7WQFna/+fs4/Lz1WVgenpF2Pf45PfFzt/GVXVwRtn65PdAfnZwdtfeVvbMUEtlZnBISXJ5dnVMfGFtaxMRFGpgZXh9f2NtbWNkU//n5clIeHl+1/H1zObg+/7z/ebg7erv5/nm4frw/eXj6O+VlO3j4MnSxcXw5eTl+sBCcnZweXh9SVzeyvJTZ2dydFHe3/b499FQd3NfysJDc2Vnenp7cGVlfXtkemV8c2BsY2dsaGF7YWBiahVsYX59Z3PS/uDm9trFx/Pk5f3n6e7g4eHj6Orq6unj7Ojv5vn+5efh4u7j+f/ETX18ZWVycUREfWFhfnx/SUTc9fv6z3xsYXp+d0dXzfTN2ll+c0xHQ0TRUEVGTnZ8f3XezdrYW3Nkb25taRRoYGFiaRUWFhVpYWdkcF/VUERLTdH94uns7eqRlpGQk52dnJyfkpCQlujg5+fg4+H7yXVnZ3BJ387d1tRSRnxjYGR+c3VP1MP29sFQfXNX3tXcUUVU097K30BOc395eWRkZmZhY2Jiel9cREV8Z2ZgZnxgbGJubmkVa25sZ3xzcEJTw9zf3l7Rz/D55PP94ef65OTs7uuWk5CXlO7o6OqUlZaRl5Xk29TaxMP0y/Px//ncdH1wXM3z8fn9zMxUVk1zSV9MdUt8enpkZ21pb2xnZGBsFRERFW5jZmR6ZmxpFRRpfkxTVkVY0d3VWEBHVPLk5ffGxs/EwvL98PLz9cnY0dz3y/b8/Pz/5uHl9s7I9Pzm4+Pj6eqV7/754e3m5eX65eDu7+fz8ufm5Of98/XPwlV9bWgVFWhtb2oVamgVEBYVaW5qahYWFG98THZCU1TXX3N7ZH1Z199SXNFWUFlxcE3c+ef2x/X8+uTh5/j+++zo4/7E3NFT0NTY8eXn/ld0R1rJ5uDt5vj69NNHRtv38+Xh5f/z/Pn08fD77Ozo4v7yy8rAXnR6Z3p5f3BnYXx7cHNkfmdsaRQXEx0QF2ttb2JhbW1ib2Jhd9few0F0RXFa30Re08bl5/3w9PP29/zZUMr+4eL78vLw/ubg5/7k+Pvn8fT88frv7Ozu6JXt80R6XMPw7eTOyNFXx1TR/OTj4uPh9cvFWFhxZHxxcEx1YWoUbmd0cmNgbhcVFxdrbXh5ZWFpbGZjYWZpbX59RkB9fWRkZHt8clbz5ODl21fYzv/k5P7P8PP2/NnF8/rpleP/8fXL9ffK8OHi4+n7z/77+/30y8nxysP3z9r95eXn/fb65O3o4/FfUVVb0VNxcXJ5dHR+fHdGd2FqERcXFmoXEhMRFG9jYWFmZGJjZmJxwcDI2FHR0VDW1ExKUc78+/deTkpwXMXKz8312VZZRtT95uzj/Pnn5+Lm+efm4u3p6ODm5vvxzMfD/Pvm+vfCQlrR9P71/vr55v3WW1La3tFeSWdgYmx4Z2Z5fUd1Z2FjYGFhYGFmZXl+SH5kc0pdXk5wZXZIc3F3cHtne0l3c3dJVNZOf2RJ38Tz99dbUt7/5/709fzywsj3++Lh5uT8/vzk6JeV4ePg5+T68vqVlZeWlOjk5ubn5cn19MLHd2BifH98dGdtFBcUaGFra2NkcWZ4eHVEeWRpbmJkdVjFdXNxYXxlfnZfydreQ35jYE/X9t1Y1HZFdnt8cFBRys1CcX1aXcfNy+X54ebk4Pri4+Pt5+bk5+Lp7ODt5+Dm+Ob9+fr65cBTX/Xj7+zh/lV/eXxfRkFUX0luERIXZ31DQnBweGRhZH56fHBBdGRnZVNEdU98cHl4fEZSTdLB9MdMcXnWyfTMWlt/ZGFlRktaXN3BWnB618rK/cXPVElU0/r58Pn45c/D3v/j4+/n4eHx98nm7ePi4Ozk9Nv07euV4+TyV9ZW39vW01LSWHhtaG1gZWFkdX94ZHZAdnxkcHRkbWlie3V5Z3tjY2Z8RVHD1F9Ycn97XvDl+VFBcGFmf1XT0URA1kpyenTM9fP1ws7Z2sD/5ebj5+Hk5P724ePu7uDh5efk7e7m5vv48cZdQfP5//jZ1kBbW1L3wMTHUHd9ZGthc0zDUHV/e3lz3dVER3NnYGBpZ0F0TXFia2tpbnJDSVh1cnN2eHXO9/L2UEhJQn1IQXNd3tzS1XNldE714+bl8sNQ2vHH9P3x/f/OUPLm4uri+Prm5+Lr4u3s+vHK9sH44f/kyXZ+fnl3yPf0/dNHTHBgYXd23cFAQnZkYn50c9XRWV1ccWR8enZEemRnYWJiZ2N5Q0t0cHtjdFLR91BBdnhnZkJKTEB9f3t6Y3lfwODn/ffx/P3v7u3s+v3MzNTd+eTt4O3r65Xs6+vi7+Pg+/PFUsz2+/7aWnJ9ZXNTVsTRVE1+YWl6TMDz9cZFTX1yQUBNQkhIcXF7fkBT1UNMcHJkbGNgYGBkenNwZGVH0cTRRnJgY2J4SHBzRFhMSnV1w+Tj6eP/w8NV1vD6+fn9wtNCeUDJ9Prs6+3t4eft4efj6O7j4vL0+v782k1hZntkQtNQRNzL2sRIdtvS0tXaQnxKf0FU1NnA901xfmB9c0dU1kJhZG9vYGFlZUZDdX1iZUvVwcLEdE12dFpweGRxSXhlYnt1QtvB/cTA98n7+/jk5efxwFxH39r4+Ofk+uf74+/v4u/r6ebyx8rD8c5fcWxnZ390Xt3a9/331F7T/efk8fndR3h4dEdddVFaeWxuaWNyW0NQdnpkZHt+W3FH0Nd0eWdlQtZLQFpzd3RdS1N1Q9xSdmV9cV7w9cTER0xN3dPl7PrlydRMT1DC4+zk5/VTRsn/++3k7+/ky8Hx/eLp5f1XcmV/SHHNyPXOVktw1d724/v22XxgYEldw/TJzFxyZHVPXsba1U9nY2FxdUHS0VRwYxVqaWVW0F52Zm1gStLAyc3fSmZrZkrR/PPz2X1sb3DG+u/s7PzTQlPSxODr6uDx11rF/OCVlZaW7vzazfXn4OT2W2ViZnZFw/XOxkp+fkzX9ODg81Z9ZGd32ff0TXhib2lve0bw+9t3YGsUbnNa29fRXnhiFWB32/jIXHF8c3zZ/u3i/vTa2EdcxfT7919we2RgTfXz8MnN3tPR2vH74+LwWHZAQF/2/ubl8/z8997J4eDn33J5e39wy+bn8trG3VTcxP79+PNBcnhxS9nwy95KTk11S3fF8cnce2ZtbGJlQ0dCS3R8ZmF7S0xwQH1nY2RLVtjH2lJCQ1zW08XY09xPf2V5S974/MNRWVBdU/fg7OLj5cNGTcfy4ebh5vL19/P44e3g/sjXTHt9cdv9ycPeyPTJ9vjk8MXNxEN6cXRFWWV4e3l/fkNG0cFdQnNlYnp/ct1GcmVnf2RxRNjxRHRBdmdkTVP29NfWQ1/c+eb85/DYWnlnZ3d3V8NBdnxPXNX38u3mw91fQELSzvDl8szW1sTy5Pvk5/DM09JU28/z4eXDQFzA8P764+P82VledUPcy/3AW3hhZHfe8Ofn8UVjaWlicnFBSXtuFGx4QtDT0kR5Z3p0fUxS09JOeGNlWt3x98PLxVt1QULR211RTHBneNfK5u3t4/ze1vXy/uLt7+bPWE7c9OHu4Of+w15CR0bbwsLZQH5mcNH+4eX49VVMTtTUzcnT13NmYGVE2v/zyNZOd3x1RllQdHB6bWlve0fBVUdHQllf28LaxtzbRXl6eVrf/OTk/sPVREZf0cZWR3JgbG961fvm5fPfRXVI0c31z/HAdXt4RtPz5+fn/PHl+eXm4Ob78s/G2sDy5/rHVdVHRdHJ5fr03NF0ZGV/Wczx9/fad3FMc0hBQ31lbBYXam9y1UB3SHJ4cH1dzt5UVlh5ZXdN0PHM0dJ1eF/cwvzk8tFbeH53cNf//s/CyMrl5OTt7OX199dIUlHS/fn19/LA9Pn85eT+zdBFcUBId9z210p0cnRV2/Lh5dxRQHpgZ3PS9sbL9ttd0NFc19R0fWBqamlub3BKfHdJXsb0/Ofn8crOwMbQ1dfC2EFHQnRax8Pe3l9LfmVleHhlTtFWRUZcx9rcy/r4zdVSTXB8cFTw8cr55Prl5+3t5vnw8vn9983C981cTVhX38X19cjcQdfC2VJc0tJQRljH39LB989RTnlkYW1tb2xvenFnenNKVtvc3sFSdUZGSHh/SURfdE9SR1vd2lfSUHNLUFTb2tv3/fbJ/uXm4eHt4uf3xPbRdndIUtldRMTCwf76+vnJ9fTxz97fXU5wc3J3Q0hX2N3O9N1Y3dZYU1DQ31fAxNRd1s7B0kBKcXlkY2R/ZXBMR0N1TNzTQVzT39vDzsLVWElxcHNE19LGxd1U10twQEFIdEhPd0Dfxs3H9P3+5/rw09jAT3ZxXd7e0NXMyvD///r8/fb/5/D18P3EXl9Q1tBFVVfX0kBAdFTE19je2lXYwlfP2NjF3d9NcXh+eGJhZHp7en5ke3JwR0Vd1tzcXcXbXVNPcXh/fnBTW9fSz8pXWkJXzc7I9/P98/bB8OX45+T58cvA1NZU1trbzNXVVV5RXkFb3MLG2tDDylJHTndNSE93cnVARlLE3MzNwf768vbKw9vRUtjw8sDdVUh6YWd6d3V0Qk12d09IS19S0tJX0VNU3s3D1lJZXVp3fX9FQkxHSEBMQkVfUltQR0FcUNLC8/bz8s7C3FPVw/D3w1RUw87EzPz65OH48Pzw/OT69dvdU052cUNTW1nQUF3T0NPeyc7N2ltOU9bQ2FdYV1h3cHlkeHB9fn18eHx8emR6c1pAd0pV3NLKyszZXUJDQUZfUFNFTUxc2dnSwPPw9MrG9/vh4+f6+/7CV1tEX9ffU053QFBV38XJ8fPxzN7Y3dPdx/XJxVZBc3ZJcHRLWkZDUdzYxPT+/Mvd2sv98szbVVN0cXJ9dENaTXZ9f3xzS0dGVdzQUnd2WdbE287w3050TEBNQV9Td3FwfXlkendSVtjNzcr38MzFzMPDxNdU28PbxMTZ11NbxMXQz/z58/j7/vjn4Obm/cZXcXRNR0DR01HRXlhcVtza9vDC39zEy8Fe289bdUNxZ2FjZ2RneHlzdnR1dHVOcHxLd3xC09r18vXUQnVAX19WxsHE0V51c3FCUdrL9fP88f388vrl/PL9zdlVVFVYQU52dF/S2N3f3VJEU93exvH98/LI2FRbWVtQVNLT29BDdXdP183/4ef5/PL2ytzYw8PYU0h/Z2BnZXh8c3BDSnZBSkpDW19X3cnzy95dQHR+fExTU9RfQFlxcnB+e3TRzvfBwcPExM3AyfDy/d1PR0tY3NrJ8PPJwNzXW1xUx8zJ/fz48/H48vTA1lFV2N/Y3VXUUUFAX1DGyfXE0NJXxPXN09vPzF5xf2VgbGBkZXtzd3Jyf3xDRlBV2cvAV9XSV8XSUkdMUdFXWtfeXUV0Rl/S8/7//Mnd9cfRw8jz+P3Nx1FYX0BfUNDdX0NYQ3dEQF3C28bPxl5fUNHI0FTWwcXX3NzW0cfWXtRU2fTx8PDByv7y/fHw8MrEQmRkfHl8TF5dT3N5cH12QUFYXtdVQEx3dFzRUVpOdUdBTEBEWVfTU01CUVJB0tpX0cLx8svC983H2t7T2N/QxsP2wEHXXVHd0sfY2NTA1lPWUcH28vbN1NHEVMPfVMTY3NDVXtnEyfTDzs3P2txR1dxIQndzcntlZX1lfWVjYGB5d0lH19HeydjLw9jx/8zURXVTWltRUF9dXElKcUpd1s7M9vnl//j79PLwwtxWW1BdSFDZ3dVDdHB0UNhV3d1Rx8bS1tTWzM1ZTnd1Ud/S2vbl5cja0F3T2cL28PH+8M3LzdnE0kBOTnZweX53dHR0fX58dEd1fHZMQltGRlPYwffDQXR/fUpNR1fEwdFeQ0JE0NnQ2M3F0tDdycja8Pjz9vTB0FBd2vfJxlJWy8TZ0kVZ1tfb3Nb3/8LH1E1BWVXZ38HwzNzfSHJDdVrYy/j+2d7H2cjL2sbQUlVxZX9nZ31nYWRnf0pzdnxlQ9DcwM325fLL89NHX0tA09HGy1NCTHRAUlTYwMrzxdn3yv3k8cPz8PH0WnZIdVrT0VxYVtVfR1h1QFh3SdjL8vnfU152d0Zc1/Xz9cXawMbKx93F/fr58lZfUFDYyMnSwtFKS0p2dVhMd3lzT0h3fX55fX11Q0FRUFpQVEXR3UBAWcD/9tBBcXl3dV7Hxfb82lDX3ff//vv45+Hlz8TVUtDQwsJQXlZ3cVFXVdZbSUTB8vDExdpUR0BU2NrK/N1U31lW11lN2vT0995VXFpZ0svJ019GeGRzfXRKcnBKfHt/eWV/dnNLTF9d38PT28/1z99dXcDCyffdQENLc0BX2s7L9dvc28PO8PL74+b45fbV01BHW1hfUUZ9c3RDWVtBSU5W29DPy9bH0lJHT17AztPK9Mfb28PJ8+fm8/DOW0BMR1lT1NdNe3JyfndZVlnVxN93cXR6e39yfnxxT0h2QURIQFZWUtLK/fX2ytlVWUROX1DBx1XQ2dVf3vfz++Hn/PTG3sfOy/T0yPXfRkhYQUtXVEFNU9LQ3d3a1V9RUUNNVNxWVcfZ3s3KyfT02NBTdEp1RdTFxMrywFx0SHV2R1dRU19MS3ptYWRlf3d3SnRDX19V38THycPMysTP0F5ZTXZK0d/AzcvBU1bYwNjy5fr8yv/L1NDDwNr2ysnQ0V9PWlzV1MzA1FhGXEt2SVpDQdLB2V1V1lNXxPTOzP3k8vT0219IRVJUxvLL0dVNcnxNRUPVxNF0d09+YWFyfXhIVVlzcnJ2dElPSF3R0dRXV1pMR9VQRNvzyMXBxtvcwc7P9eXh5f/8/snE9vH2+uX2997U1VbQ1VXWwdFEdXl4ZXxaR1/O8vTEV9LH1dPEwcL29vDHQ0x3cEp3TdLa1VJZ1dVYU19MV8fd3F92cmVjZXpxRURHT3FydFpdTkHL98v02FJVQ0FVWlbZ2N/W3MLM9cvYwPHy5Pr0zPXEzcrD8PjwxN/b1FtQWHB0V8TGUEx3eWZ9d3XS9/fB0tHU2cjbV8P65P3w8cZdRNdeRNXfx1VSx8XRUnd9c0VXUFpAdH1lYWNmfHdJcnxDdXZLdnNOzfb12N9ZdHN0SErX9/bR2f/x9MfF0tn3wfbw8/L988jY3/jh+vLw5uX/w1BFQcXS1Vl1dnttYmFlRcP39PTz9cLd1FfD+PPPzvXfXXN9fH5cVURG1crC3lNBcHdaR1pCd0lDeW1uYn9wfU5QV1tYR0NB0vfz/v3M3V13fnJayfTPzvXw9M5QR1be8fXx+/r6/c9XW1rC8fT98OXl/sNRXkXUW1nXXnVzZGNneF3X2fL299nTXVtY2vn09v3y99pfd092R9dS393Mzd5ZSHZwRkhDWXFwc3tnZGR3RndCR0p8f3lxdFrJw/P4xkV2cnt7edH3x/Xx/fHK3lBQVfX2+ODn5+Xx3tZUyvjl4Ob7+fn31VDfysXY0kFxemFgZGRJVlfE28HPyMjHwcn+//bHVN9HcmRgZnBNRNLfy8jG1ElBRlTR0tVCSXtnbWlhdE1GX3VKd0p0dd3K+P3y8c/fUkl+f3xaUNvA0Mjz9FZa1d3K9uTg4eDn9FxNTVXB9vn9/fzK2lTS9/3N2MVETnZlZmR8QlZdUUVd29jS3fT+8MLBzt/Iy1FNdUtBU1XCyvT321J0SV1dV1FRREllbm5tZ3deX1BBdnB9e31fxMHa39nQUUdITk5f19RSV9VSVtBbTEVZUdjw5u3v7+HwwsnO9vvh4OHk/8TVxsba2VFSRHRzeXp9dUpFWUxDX1HY2cL++/DI2dBVWV5XTnV2c0ZEVsTNxMnUSUROcU5KW11JcmVgZ3p5RFRR0ldYUnZ319BV2tBdX0FYW0pbVVnW3tTe0dPP10dRWF7BzfLj7ezj+PDD0M3x8+Xk/vZXUthTUdNcW1BFQEh2Q0ROQUR1dEJUzPX85P/y8cza3VdWVklMSndFX9XG9srE0tVQdnFEUdzWU0pnY2FmYH51dXRITUh3SkFcWVpfQEhGXllUxlNc1VlaWVfW1tNWWUhMVM7l4Ovu4eb7x8nz+OPt7e3n98fcV1hF3d/R31BGR0xwX1JJQ3ZyR13UzMjB29jMxdjN1F5TTnl2cUpVUd/32VtEdnJ3dVfR2FJ/emVjYXJyS0VHXdVQU9ZRU97dVdfd0dfY3NdXUkBfXEVR09dTUEx1RNPF/+Hh4uX5ysXL8ubk4OP69dLTTV9ZREVa3ldVXdbdXFZTRHx5dHRe2szJw8TT3sDO8vHJwVZHTF1UUsXD2ENyfnl/fERS3snCRX93cnl/dEN9cU90dnJ3WkRBWHV9TEh/T9ZWXltQXl/V2sDE31NcSEDWVv3u7uLn5Pjl+vvi7Ozj5vnMwt1SUl5NQ9RVV1RWxM7TU19PdkJIc17fVE9MT0tUxdvT0dlFSHRB1F7A99pcSkp5cHRxXsXAQ3Fwf3hlf3dCWkBFQdLc1sHfxVBFX1pZdU1TV0BwSkBF0N/ExNvRQ0Zd0s/84+Hk5Pz1x/fx/Prk+szOx9rRVNFW38XSX0Dd39XZ3NxRTHN/d0Nb3dve0dHfyfbK8crMVEN2cNzD3MXEy1RDcHBTRFPQ30RyfGV5eWV+dkt2cXB3WkZCQljVU0Zyc1pJcHdOcHp2SllQ3/bE3UdFR9z75Obg7Ozh5uTh4O/t5eX/9dzYxd/SwsjGzMPdwvTBxNXQ0HFlZXF1cnNwcHdNWtfDwPTEWl9CfHNS29dT1lZMSnd1UtbV0UxKdmFlcXRxdkBIdHdHXNPP2Mbf2dNDTU5AR0BQSXZ2dltQxcHSUEBOf3bUwP/55+Pj4+Ht4+Lj5/rA3VhBWXVe0NTW383R3vXz8/XLxdNcTE13dnVzcH9xdljb9Pj/98XZ1U9NWl7VUVNXV1tJQtDSXl5Gd31/c3ZwdXJ5cXR2cUDc0kRQVE1HQU51cXFwfXNzcnND18/N0N9YQEdGV8Dy8v/n4u3t7+7r7+Hj/NjIy9rU091X3c339PX++vv0wNJBXUVzfnN+YWdgZXZL0s33w9/ER09Kd0pOWENS0tDb0VPfxNVBW3N+Sn5zcH9nZHFySF/cz/TL0sTcVsHWVlR1fnh/ZX5JVsbBzNdeTX53RkHSzsz2+Pvl4u/v7O/g5P/Az8DT2NVKStDXVM79+Pjm+fb309TQRUNOZW1nYG9+R8H2///J8t9W0tbf2t11XNdKQFXf0NnZRF5KfnNwc3JlY2Z9YWFNVlTEytXV0VNEXl1OdmRgZ2BgfFlTVsJRWkdIT1PG9uX75eDj4+Pp6uiV6+Dn5P/28vXF31jd3FTF8OTk4+fz9MdRdEhMZWFva2hpY39T0dv329vUW1xc11FSSHF1fHFMU9zT99tARXZzdUt8e35hZWZmcEPU2/P0w/XA0tRQQHFNZWJkZ3xCV1zayVLQVk7QzM71+PDJ5efm4unu6ZXg+uTKxcnEV8XdS0NHTtb/5+bi4f79xVpQR3l/f2xoYGZ6Rl1SxsjAxsTUyfHdxM1SdExDRtLAxcHeT3B2eHhzZWF6Z25sY2F2V1THyMfXVFBFRUtzdnhvbmZmeUxe1sDa1MbZwP/4/fzn+Pjj4uuXlpSV7ufk+//7+/TAz9ZNR1jW/Pr+5fjN2FRFVlNPeWFjaWlubXpzcUJVXkfZ3czzwFNV10J1Q1DFz8LSUXZlfnl5QkB+eHlgYmV+WMfJyM7EW0VQUtjN1XB/eWFhZmV0R17Q2tXdzM795fj19vn8+efi6ZXr5uT+z/Xx8f/w31NXWnFEw/34+Pnyy9tX1sfJ9V19f2ViYmZld19U09jb0Mj///XIxtTZUVvX0NrGR3dycmVkZXh8eGdjYmJuZENe3NVTWUROdUPU2lRJfXpkbmNgZ0tbRVPG2NXO/fz7+Ofh4+Dt65WWlu7t4+f//f729PfNxNrU0ff8+OfyzMDTW0JZ1lRFfGZvaWtqbGZF0EPZwNlXxvTFy9rfUUNPd0zV2NtDSURPfH5yfHJyZWFhen5wUMXP0tLXWF5f2vXOxVl9ZGFtYHtN0NhXV9zaw8Dy+f/n+PXL8fv47eju4+fk8M7Yz8rbzNBF09rI9ubj5+X13VFS1VbY10RyYmNvb2dK2cH131LPw97N/v/MxEd0dHBQ38/HVVh8cGViZHN8YmJpFGJjZEXf09PTc3xNR9j39Vd2eGxvbWFP39Ff3El0yPXx5u3i4frLz/7m6JaUlOvnyvP5yvnh/9FbRkXI/uTu7uLn2HV1REVUzdV/bWoUFWxkUsFTW3BlSsH38v7/zExlZ2V8V8Hw2lRYZmZlfXRHXXlsFRRif9Pz/vj9zHZ+QsX8/PDQdmRvbGNy0drFQXd6Z1rP4eLh4vnFR1zK5uqV6uL6y0xSzvnm/vdQc3xI2P/rlevv5MlMcVXA8PTaTGRibmF7VfD3x0JLdEnZ9+fn9NJ3emRkdN318slBdn9gZHFAXHluFhAUbmFC9//2XHdOfX3d9/HHU31jY2BmSMLa1HFhfExexPjt4uf2x/H65OKWlZXo+fLy8v3g7+XJWnxIzfPy6JTq7czQ28bTzfDTQXJtFWlmZ0PSQ05kYX1DVNLy8dhEZWZ/XkbcwlbQSXplc0BR00R4YWoVbHJG1f3z89x/cVBWxfLx0FBzYWB5RNHKUkJxY2d0VsH45fb21UfU9/rn6e/m5PfBzPb/4+3HWktzSFP/4evr5ufzzszy/P3620J9e2djddXP8UFLdHBwQ8vx5PBQQHZxftfN0cBddHJ/eX1QWlZwbWsWFRVjdEzT1UN1S09e9cLGy9V9bGd4e1Lcx9J3ZWdyTsf0/+H+yVDN/Pnv7ujq6PjK+f/h4uLs+N53SdHF++Lp4uXM2PfJ+uT098V3bGtiYH1EU0N8ZmtsZnPCzPHCQn9ldnHW98TbUUxnYX9xwdxATX5jFGhjf8TAxNvXR0Df0vrmzfbTSWFmcnTNw9XQXXxvZXfd5fzk/MZWUcv35u/s4/rwUFfO9+Lg4eXbRHND0PLs7+P4/vDL+ubv7uH0SHNhYn1H2N9AfGVgbGVI2/H3zFhNSnJYxc/2xnF/f2JnSlnTXklnb2gVbHpxdHd4eH97SNXSyfXDQXdxZHhBUlZXQnlkZnlY2frn5fn++PPl4u/v7uD9+vHA8vjh4+znzsBW0ffk5Obh//vy/eLs7+L7yE5xZWNkcX16emxqaGlnd1re39JeTE5JV8/MV19Ff312cVfHz8VYfGxiYGF0R0t1QHBzU9PL//7331FIS0p8RV9NdH1hbXpyQsny8vT28fX5+ubi5vL2zdfYxdzw+fryyMXQz8L0+fzy/vD3+Obj7ent+vDFWU9xf3R3cnpmYGZ7cUNV3dzZV0dYV9XdwdRXVVtGT0xPWlxJf2Fvbm1iYXx9f3Zyc0JW19bF21FAcXJyfnJ1dnN8f3lzSFPY9vn///Pk5uDt4uzg4OH58/P88/P9z8fPyvTx/fz6+vv5+OXk4+/g5/nLwVxPd3N5ZGdvb29obWNlenh3SUtBUlHd0VNU19TWV15QRXV9dn1le3t7e2V/SEJITkVY1t7b0t/aWVhPdnVIdHx0dntyfXFdVMT18s/B8P/n4ebk5ub++/zx/sva1dVXWdrexvP08frg5Prh5u3s7eHm5sraU0xaQ35+cX5kent9SnRbX1VfSlld19jZw83O0V9cRF5AcmdhZm1gY2F+eXh5dnN4c0JBXEdBVlJMdE90QU99d3J9emdzSV3byfT/+fvn4u/r6O7p4+X58/Dw8NpSV1fe2cDx/Pn9+/Lz/P3n4+zm+eT13VdHSn95Y2xpaGJjZn90QHZ3S0pZRl7R31XZ9N3SUFvc0VJKf39mZmR6fXFHRkF2Q9VT29nNx19bS3FDTV5BSHF8fHhzfVjY2trRVNTB/OTj5uPv4ub4+PXLwNVRU0hLSV3Y9f765uf6+Pv65uHg7eD48PT39/fKWXR9ZGNgZX9yTl5dUF5S2fXxzd/SXEJOdHNydnB/fXN7YWBmYGFgZ2BmYWBkcEx3Xc3YXl9CdXN2c31kenx6fnTYxvb8/fHz/Ofs6O/p6ODh+ubn+vH1wNXWVdLX28728/D0/vj5+uPg5eHn5fnxy81fcXB+YWdnYWZ+dndBQkFGRllFWNDW01JeWkhMT0lKSX5kfHh6c3FwdEt0dXBzd3VHWNXa297F3dpfdHJyfmR5cnd0V97J9c7L8f7k/v/l/v78/MvAwMHU2cze1N7YxdxY2MfO9ffP8f/74+nu4ODk+vz9w1dIdnF9c0teTltV0ERYTUVX3FNT0tbUV1NCd393cXBkZ2ZgZHpkYGZgZnplZH1ycEpSUFFTXUVPTHZwfXx2Tk9Vx8TP//n19ffx+efh4+zs4uLj4fjw9MBUX1NcVNvLz/Xy/PH98Pf++Prn5vjw/fzwydjXTXNycXV3SXB9c3V2c3RNcUzQVlTWUERHdH9kZX9+fnl4c3t6c31zd3FzS09IWtdRWVBFT0RCSkhKSU13S1JTU9TUVcPC3sP39c38+uTm5uTn/vbI9cDS3EZMRkRH1tzH9v32/fn5+/rk5+f+/PP89vbKxcfcUN/M0NHUU0RFSktIdnRaVtzJwN/R13VzfmZsYm1pYGRlZHllf3B/f3dwcHJ5d3BycUVCdndDdEtbXdDZ2VxW0NPFy8/J9fng5uDs7OPh5uT98/fIxtvYx8TdUFTF2vXw8/j75fr99vD29cPIzNjaxNpWUFPVUV50Q152dnRMdEtOS09HU9zF1VdGQ0pwfmRmZmR7fmR6fHJ2Tk1fVF1FUV1PRkZBWUR2dnBydF3DxN/TV1LTVlZXVdnI/v3+/+X+/fDxytrHxNBMWFbWXEROXdzA8uXg5uT65/j09PfD9P/4/PD39/bx88PYXVLU3FBHRtHWW1NfXkdRVldfQXF3dnlkYWBtY2NiY2Vnen59d093cEtJfXtyc3V3cXNxcFhd2d/FzdffxN7Q2Mby++X+5OHm5ebn+Pz3/vnywsHC29VfS0Nb1PXy/vnm5Pvk/M7B39Pf3tDdxc72zMnN3UFPRUxKdHNJRUx2SlxCWVtWWE1MQ098fn9+Z2FhZmZ9c1rVRFDZ2EBDQUpwd3dKd3J1XlDQ3t3RXFbW0FtGXMTTzvXIycj9++fx8vb2zsjPzsTQUlZZdlpEVN3I8vrn5OTk887w/fPy987K9fj65/3y8szExFlMWUFT0NZxTF5GXttVRkJPTUl2Zmd7ZGdnbG9pYmRxdnNDSXd1dmd7enllf2VmeEtG1cXV01DVUMfVUdzJ8f799P75+Ofu4eXn4eTl/8jOy8XW0kF1Qd7K8Pzl5PnO9ffQ0sDM2M30zMryzf3/3NXVXkxNTXV0R0NQWHFKXVhU3VNEQUdzSHZlenN6ZHllZ2R5eUVTXlNGd3Z0cHR3c3BOcXZDQUPX31FUXVte1l1X09/S9PHK/Pj9/OT6+PzK2svP2djdWkxAQ0XUUtz2+fz+/8L19/fx/PX0/fz8+vP2/vn4/f3Dx9jb0NpWQV9bQVfEVNDS3lhadXx6Z2FhYW9vYmdneHtwSktwSnBmZHp6Zntlen58fEZDSEfdVkTQ3NJWVND39fXz5ufg7O7u7+zm4vv2yvbb09zcX11cWcrFwsj0U1LT3Nbc097zxsb189rL8ffPzsTf9NPX1lNAUVlGQlxOU8lU29FBcnVIc3x/ZnhyZH9yfnlJRFLVXXBKQnF3dnJ8cHBzcXV5SF9T1FxERl3R1tLXVs/OwfT98Pbl5ubm//fw9NvTVkVNQVtBXl3czfX28cVZWNPH3MLI8Pz8+eTl8PD4+f35+/v/8vfIxNvAydBQ39jf2NrWUnBnZHhhbGBmZmFnZ395ZH50cHxze3p+ZGdzfH5zcXp/SU9CW15R0VHS39ndzff++Pr/5+3l5eHm5ODh5+f6wMHN0FZRWUJV28LMxVlRUE12T3NwWNfDyszU9ffC39jXzvb9+f/O1PTJzMvEQVTZ397aRUJecXJzZG9gYX5yfXh3S3VGXnF8TktfRHRlcHZJXdRwckBH09RZXcdS1t5Sdlzd2/fx9/L68Pzy9dHM9/f3wlFeRkvX0FxLUNTJ8s7c39VUVV9Mc01czfP/9Pz9/P3z9PD6+Obh5Pzl+vr++/bQ1tzR1ddeW0B0ZWVia2hjZ2Rlenl9f3xzZWZnfmR4eGd6cn90X3VycE91U8bPyMjc2cDd2/X//eHj5uHn8v7l/fDyy9PQVFNU0NDE0lHW29vC98PF00x3TnJ9SEFb3vXDyMHFzvH18vDCzfHx8f/w9/78w8fRU1/f0dZdd3hlY2NkenhwSXZPW0BNWUBJSXBnZX55cUFMQVFaWEZbT1Df2MbHVFzWVdHb9cLz/fLz8vTAy83Y3ddIcX13SFJZWldcWdnN28j3zNDUT3FORkHdw8TL8fP0+eTn4efl5Pv8+OXl+uDh5fv9zMPA19LURnlkYmlpbGNmZGV7ZHh8cXJzcXJ6ZGFgYGZ+d0RMSUlCS1nWwsDLysbR3NnHyPbl5+bk5uT65eXz9MLURUN0cVhX1dzZUlLV09zb29BURXZyfHhyTUdbVlZZXNPO//7+/v/y8fL+/Pzk4ePm5P/398nLwlVMfWdgYGRke3l5f3BycUFZWkNBSXN8e2VleHJ0TEJCTU5cVN3OwMDH3NRX2cHO9v34/vz2y/b1xt9TTnR+e312cUJHRFJUUlbbxcTd3VNFS3dKWFHc3N/Aws7L+eTn5ufn4eX65Obg5uHj7ODn+v/KzdZBcmRibmxiYWZkYGRlent9d3Vwfnl4Z2JnZmdlfn5zdUlQxNrM8PXL9/TBzMj85fv45+Dh5+fn+/HDwFVGdEhOdHd3cXZ1SVnQ08TP0lFaRXV8cExERUReR1pR0PTx8fbx8/Ly+OXn4efl5Ofh4eTk5fPaVU9+emRmZXtlZHp+e3N1SUBAd3J8fn9+e3N0cnB3dUhE1MH19/bw8cvM9fb08fH38/P9+vzI9MzWRHF5e2Vle394Z2R7eHlDV9Hb09TXQEpbR0BV2cTMzcv28/P85eT65ef55ePs7+/h5+bl+Pv58vfKzFZ1fGVkZGZkZGBmZ2d7cXZ3dn96ZWRhZX99dkt3fHR1dVPb2Mvx9PH3yPf/8vLy8/Ll5eTh5vrz8d5YX0VLQ0x3dHZyfHNzdkdfQUl1dndzeH99cnFAQEBZU9LAzc728fT18vj75Obn5OXl4OH65ODk/PXH2FdPdHZ+ZGV/eWVyQkRfWkJJfXp9f359d0BESElfUlFRxvb39Pz+8/7++PrwzPTIzM/08fb0y9NCdXByf3t7fmRnZ2FhZXp/dnN9cn1ycHJ1TEVEQ0VUUFTAyPL8+Pv4/uXn5ubh4+3j5uPg4eDm+vTTXVBAcHJ0d35lZ2dlZHt0d35yd3J6f31zdHFwdHdwTl5S1Pb//P7++OHk+uDg5uTk+vn+5ebg5fH39dBbXU91TEp1S3h5cH55cndzemdmYGZneHd3enl3eWRne3Z1cUdYRFDezMrO9vn+/Pnl5OHh7eP/8/fZ1UVb3N9UU1BYW0tIWlle1VFWR0NQVV1bQENEdUhAW9fL8/zy9vD89/P65uPk5ebl/vvy981VU9dPfXZ3dUhxf356Z2V7en5NWHV+e3t+cnl3RXRxRUF3dkxT19RQ1sTVU8XJ9vT3w8TI9v7n+fz4/M9TTX94dk9ZXXdLWURKSV1SW0VCTkNLQ1bSXFxWSXJyfE3W3sv45Prn5/764O3v7OLg7O7j7eL5/PLD2NReVMHF09RHcH9lZ3p8cnJ0fGR6ZmNlZWV+fntkemR7f3h7f358cEtHVffI98rawcrawcHF28fN3dZaQV5VXl1bXFNR3cbw9M3a31xSXVHV3NjBylVAS0BHU1Taz/L8+OT5+/rm5fr5+uXh5uDm/Mrf13RLQFHT2NPD2tVGTFpxfXxzfXJ/c3RJfUlRTkpyfXdNSEVSWXZLT3xxdEFR2N/fz8ZRxNhFW0dEX0Bzd0x2ckx2enplf0pYRlfHV0JUUEXVUFbHw9zGxVZfV1lV0dTD8Pj74eLh5+Dk5OX9+Ofk/+Tn/fb1xsjPwPH9//Dz88jM21JdTXN3S0p3RFpaWE9wfXpnen9wd0F2c3J4ZX95ZXJySUVTXtZRX0BBSXBLS0FZUV3Q1FJNRHV2REdX29JW01RcRlRHR1Nd08PQVtRSXkXcV9HY3vDn+v/+//D08MzJyvb75/3K9ffNwMraxcTazfHZ1sDAUl5SXlfW08PyzMz29tvZ0dHUUVDfz1NBUlNEUl5CTk5D0NlYSEBIfnllZmBhZn9weHhwc398fnx3TkDS0lhCWURNTXVwcUtMVddWVt/Q3d/WUtfcx/b29PX3z8/MwNrL9PH+/vL8+Prn5vr9/Pfz/fHK9dnZxttQUdzTw8PBxsjDwNzWQl5RX9RTWlbWQl9WWUtbR1/S39vP2UNAQUF+f3l/cXdzd3BkeXB8ZXBzWlFTXNZQRVNZQnNKSk1JWkbWUHRMXEVGUVzR19HQ3lpJTVtHS01ARFDRVczAxPXxxNrByPfw8/L59M7N8fHx/P7x+fvk4eX5//r4//HM2crMzc3b3sPLx9jMxN/1wsDfU1hSWUp0Qnx7fnp8fWVmZGRnZXJkeXF0S3d4e3B0cHZKfkBeXF1ES0VfRkRbRUlUXdzE0lHQXV5dVVFAVFzByszB9MHJy8vRUNbV9M7a28vAys/B0NbSxfLx9/P/9/TOzNrB0tr2w8H09cnx8ff0983z+vD298ba2tZSRVlF0t9bQUR1SEB1d3VwfkpwfnNxf3Z3cUpNS3RZXllYXkBbWkBNSnBxTXd3c318dnZ3fX5zdU9IRkFdWF9TUFhGU9Hexc3L9sv18/zw8Pnl5uPh+v738f/wzvfz8fn/8PD+/OXl8cv398L1zsv0ytjG21ZV3tNW0lxYU0FPV9FYR0xyfH9leX96eXdweX58f3ZJdE1eQkFdQEpEQU5eXkVXXHVCUkdDXl5aUFBR0ldHXVRCdHRxcElKTkRPdEFfRV3U2sbP2sHD29/B9c/JyvbO8P3k4efm4uLh5uXl/vv9/vPIz8rKw8DDy9rB3cDE0sXD2dXX0tdYUl/a2VZXXkBKdHR2cEJOWU99fXJzfHN8fn59e3xkZ3l6fn1yf3h5cnFNTkFEQUZDWkRDQFhd3VlFXFnR397R1FDU3NnQ1t3bx93b3tjA9v76+vrl+/r45OX7++Hh5+T4+f7+8Pr/9Pf98c/bUF5RUkBTQ3ZKUVBWUlpEXkVAVl9CRlNATEt0SFtBTUVMdkJWVtZVVFRVREx2fXp3XFpOdEp3SnJzcH14SkJOcXxwcn15e2V6Z3FGWklHRkdZXNbawcf8+vrw8PP39fHx8fz2+Of+8f38++Tk5eX78/n48Mn28vbK9d/S3tbO8Mv18ffKzcHQUVJd19VbR0FHS3Z9ZGRkenFxfXZ2dn96emR4cVjWUFlfWkZLSEFNWtfE29ZXVF9fT05IdnN3SnB/eXxycH5xdHZLUd3dVdXZwcLa9vbPw/b08fHy5ODm5eLh5P77/Pzz/Pj72l7UT3RH19XYxcfPw1PRxFTUw/b2yfD2/PNRVtvT3srOz8zA3PfFd3N9eXJEXkR3SnNMf2R8cHh9SnN0fXByXHF9d0B1d3Zzc31xc0R5ZXh+ZXFKT3VPRk9cQlxWXU1c3dnQzfD8+vP9+/r9/ufg4eno4uL78vv98eXl5eX6/P3/9srG2NDa2tfRxlRQXnZJWEVY29zdxN5U0F9LSUR1SlVBSHVKcEZCTVfVQFrTUFRTRHVPc312cmR/S31NR0VCWkpwSnBlfXJlf3h+fndycEdxc0NbR9bd01TcVN3O3dDByc3+/P338vX3/ML0++f55+X48PbO8PfewvP58Pj5/PT0w/f2y/Xy//zk+Pvz9d7NwtDU2NFR0UF1c313TnB+eHB8f092cnh4e3x/eXlycnRGTkh0dXdHXExFX3VGQXF9e2RmZWRmZnp7SkRPSnR1dFBQWlDS0/P89/T39ML4/vz/+/zg4ufm5vry5v/98M7b98na11NOddPV1t3a3vHN093EWlHBxcnew8L298LAz1lQydDV10RD1UVxTHdnc3d2W3VIQkZadkVKeU9PQ0h9dUJeVlvUQXZNSUpyZmdkZ2RkeGBgYGd+eXxJQltaX1RKSEDUxt7D9vL/5eHh5ebg7ezg4OHm4ebl/87MxPX08fH3z8PB2N9eU1FUXFBURVhW2sjNwPXxycTD3kZLSXdOdnl8SXJ0XEBOS0t1RUp2fXJkf05xfndwdV1JRdVSdllEdHJ9enJ7Y2xtYmxzSHRxcHh3dHV3RnR3VtPYxtvZ9/f8++Hl5+/o7uD6+OT7+P7l8/rn5Pv1VtXSVN3W1FnU1t7cV0DTw8jy/PHB8/3l/vTe2NVX2t9cWtLSyvbSQlhNXdddSnRHR19fcHtxckDVXHB2QU5Od2VhYm5gZ2VgZmVmZ2Rpa2pqbWZgYH13dXdGT0Be0vbn+PDk4efm7eHm4O7ql5Xqlerp6e/n//H//eXPxMHTTVjcVVbXwcHxxsHGx1XfxVBaU9rI/fT19/Xaz8HTR0VeWVBAXlZZQVbWU1lYRFxTWF1YQU1Md3d0d3RGWVhSRExNS3lnYGFmYWNtYW1ob2NjZHh3WlXW3tnS0NNW18PAzvzg4+iVlerq7uzi5+Tm+/3l/c3I8sr0xdzDyML3887C2MxdW8/f0vjz+u3i5uzt5P7y/Mrwxs/0XnBFSXdLc0lbXUfTVHd7emxuaWlgYWZ4Qk91d0Z1dXB9dnN5ZXJ5ZmBlZH9+ZUh1dkPXUF5VUkNaRFHH2Nr95Pnl4uLg7ODt7ePm4eD7/fH38f71/Pv99/DK10ZAcXl7enF2dUXHz8PP9sPOzMLy/v/x+fn0ycrN8/f0+P/K2szfWkF3ZXpmY2ZmZnp8ZWVxcmV4eX12dn56eXh5c3BycH55c3xle3pnZmZibGBkeH5wQdjawfD9/fLw9PD8/+Tg4+zr6+ro7OPs7efm5/78//XWV0VY0dFFV9Zd3dvTVtLd3sHeV9nH11fe0sPD3MXKysbJ29jT1UdPfX18cHBwTUl0Qlt0dn9/e3N+e3t5fnB3cnB+fmV3eWR9cmV5eGFhYWBgcnp6dEN1Vt5X1VRARsZeWt3e3f7+8eft4O+U7uiU6OHv4fL8+vHz/Mj5+PTOztRX3UV3X1xIU1VFUcDY9/jy/OHl/+b+zfLz2cPAXFnXd3BNfGd6ZGdzfGBnem1hZWNmeWV5S3Z5dU5zWl5+dkR0cHR4ZXxmYHx2f0pJdUpDc3xKcX5IW0De2N3C/ff08ff1+fn3/vv7/fr99/XJ2ff2x8zIz9vKx9bRUU1ZVVFX3t3c/vjw5efy+vrx9vP12vb2yPbL3MvI3M3xw9HfWHB0fGZ+cXFwe2JtZm1vZ2JrbWJjZ2VgYHl/eXF+eE1EUd3a3NbTVFbZUENVwsPD39naxcHL/cjFxsrIztvbxPH28f/39fL4/fD199He1dFTSnl3T3Z2dExwQU5GR0NK1cP28vL//OT4+f/w/OPi4u3u7OLs4efzV1fA19TX2t3VXnR1Sn5/fH9/eHpkenxkfnlhfnl/fnZ2f3lwf3xlYXZNQUHd28X18cPz/f35//3w+/nw8v3M8cr3/PLw9vn2x9jRX1FITltdXFTK9Mz0w97bVNLe0F5f0VRX3lRbXdHQ1t/W3vb3xs7IyPTx/fv7++Xh5Pvk+fPy+vvwzMHFwNBRVEZ2d0RbW0VaRl9bdnN2d0pMTUxCQVHH3NDXUFlTUEF0SENLQERYWkJPRl5YXNXR3drX1FFR1VFUVFTHwM/w9szQ09TRV1pc3NdU0tLJz8jK9vz/5ODm5/n88fTwyMDC2M31z/Py8sjSUVZdUEFbX1PcVNnazdrdxsjbzMPBxFNe1cPG0kJPWl1DTUdHT1pRR0FEQlhUTUtY1dPMx9vb2tXU3tRSV3Fnf3pkZGRlcHJ8SkZ5eXByfH19cUVGSk1URlXB39/P9PH+/cHP9tXSw8zPzvX98vfO/uX18fLw/PL09crMxcPFwf3xy8LB9c7EXEFbdn1Ld0dPS1HXXlLZ9PXF0lLZVF9TQHVFVdjZ31PW2FBZUllKTnRzZ2dhemRjfEd1SUxLXlpFZGR8d050ZXp8fXx7eGVxd0XFwlFUU9VcREFa2c7w+OXl5uf6+PbYwfX19MzYx9vf01VU1FHUxf3+98nAzMfcXERNRNbYXVLX1NjXUk9BQV9dR3dyXdxQcXxwRUFGVs30/P/2yl50dUl1Wtbfw/TN2ddOcHx4ZmRlYGBhZ35lb21nZmdzdEhaT0hAdGdhZ2d4SnBO29vG999Y01VFU8bQwfbK/frxyf31zfvk/uHi5uPi/c7I3tzL2FX28/f98NRdUEx3RHRyW1dU19Z1f35nZXd8S9FRQXRyfntkZH11S1/E9fHN0drRUlDWUUJHXN/11lLUXtdX0FfezMbAwEJ1cWdgY21tZH52UFRLXtVKT0NyfHFyc1BZdlFbdUFDSFzY3svl99vKx9PcXVXK9vPl4Pj54ef65PfP8PDL+OT9+vz3wsdT3s/H1cncQUx1fHJ+ZUp0TF/SX9Td3lZTd3l/Z2R+cH9KT05NWndMU0dF0NLX3FdeRUN8T0l/Q93Y9fz+//P21NVbdUVfUlnQ1tbFUF5XUFbM9/3zzPXCXUdNUlNe0trL9cPKwFTY3FBSUdfF9MPc8fDEy8rZ2tBW9PHIzvrxx/fIwMHY0snx9P/g8Mn0VE10ZXpCRk3Uwlld31h1Q3Nbw9BbUUR/fnNkZ3hkTNLFxPLIWVtAcXN2fELd19LOzdbB9cPx9/X64eXk+/jz8PDF39PSx/b0/+Xl5eX9yd/Z3MbVxfTA9t/Q0lJwQkFIQHR1Rl5IRVFTc0Za18HP9PH8zsHVU0XW0cLN8/jm4OTl8PfB9/XLwMHb3lxPdHJ5eHdL1FPHyvHM39RadmVzdnR2SUfSVNHWXkRHV9DeXdbJ8M/fwMFQV9HY/fbl7+vt4OH59PT19vv55O3s5vj11F3eVFfBUFf198nL33B+cX1BVVzC+8RAS3xibWdjZXN9UvPZ2cTZ38zYVcnIVMLywvT131jf3ML7+v3j5/T+8VVaW3x5f3thSkl0XUJN1FdKWtdRX/Dc0M7TTkp3fV3HwvDk9v3m/c/CVUbe9cXK5fL65fD09Mbd9ffJ8vnK//LBUlFYQ9PC2sfWSEZBd3l9eX1ISXFbVF7ZwNxMRXVzd3Z/c395fXFkZ3BydltUW9vM2cH33F1XSnBOT3ZW0N//4fHM99FGXFZLW1BE1llkZ2RmZHZ0dtzH3/by01NcXEXVVlH39cn99sbM1l1QydlVzczDwldbW0HU1vXb199bX9VXUFxTUUFQUFDV0vXF2sBRRnF8dHB2SnBKf0pNf3B3dEtNQkt2THNLfWFiaWpqa2hieXB+RUlxcHFPQ0ZQ0dLVWsfSxcfHwPP5+Pz///z79cvY29bUW1hRUkJaUVxYdVrU3VXb01ZRVlFX3dbVVlJYXkFMR1FRWnR5fHh7ZXdDRFXEwsfURFPQ0Fbe0NjMyszKysHOw97SxFFVxN9McnhlenplenN5fEpCS3dzf0tOfXl6YWNjY29ubW1me3lzTU/Uz8vb3Mzfz8jJzfbx/Obm+/j7/uHm+vPwzsXYwNbXx9FRQ3V8cHNH19dOT1tER05OfUdBSVnVT1lcV9lSQFtQQ1jQVHdE0ltc19xX0838yMPd1d/EUNXEV9HZwt7aV1bR2URZWXZ0dEp9T3N2RUFzWVJCWt3TQFx3fXZ3ZXJ7YWF4eX9ATUHY9Nv29srN9vX0/fH55vr2+/vx8vr28P719fHI3dFfRFlEdVpVWNXTQUhSQkJW0d3bzc3121ZQ2t/RxMHZwMXRzM7B29RNREZ1S1JeWtFSV8bdTF9fRlpTWcDxxfT//PH48sjwzdbGz9HR0Ux0REpPV9vH8f3Yzs1EcExye3t4fnVKckhNcEjT01f28ffk/vDPyNDEzPP0+OT+5PTx/fbRwfbK28fNxPTI8cnF297OwdDTUVPcx9rS3d7R2tddVFHQ0MD0ytBS19pSWdPc0t7Kz8ja0t3dVt3F09vFxNNQRk5DX13O9/z65+bm5/XE3l9b1tPd0N/f09FQVNbSw/DJ09NdTXN2ZHh+eHVETUtRwMj58vP0+8b0x8nd8cvO9vHw8vjb9MrE3c/F2sHP9f3fVtr6R87w2Pz311pRfHx0Rl5QXtPD0F7W3VdVx8LYxMLP2dDAy9/Tz/Hz8Pzw9cDe0tteTUVeVNVcdVzcXcPw9//n4Of98fTP39n2xE1exdLe3NPfx9vazlNITHZ0UVh1c0xMRdR0f3B1TUVFU1NbXvXy2VPd3cfw8vn9ysjKx19SXF/C8PbO9cPI8sDW0FDWwNZNS31nck53c3d0Q1xdUNJQQFRXXtXY18TKz8v2ytnCwcD12NPFUEhPR3Z2WVpZWUp2SEFC1trTzMZU0N/W1VTRxcrI9vzKwcXT01R1c3J1SHBxdEp3f3F0dV9V2NZXX3N0TnRBdE7RxNrD9dhFXlhb2VJ1fExaQkhJWN7Q1NtGSkZe3VFZdHhxdE11cnN1W1THzsPa2sTMyNFcV9v38fz8//P9/P79ytjD9cHTcHtnfHhnZ2Zmf3J8dnhgZ3x/c2VgY2V6enJ9fHJycF1VWdbB2Pb001TazdnLzcP8+fjl/87Yx9TAwEB1Rlddx/XAz8JT3MFdU1ZLT01+ZGBlZHx0eUFHQFHMV3FwZGFlYhVpam9hcH9wdXJ/TUZI2dvcx/XF3sj3yvzl5u7s4OLp4Ofm+ufl8dLQxtLM99leSX1kc35hZGFvbWJibWFnYHh5eU9PZXx8ZHl0emVkYGFmfH3V3lLe31/XyNfW30VPV9Ne0M7Yyfnl7Ovt7+rs4O/s4frx2dvJyMjyyNvDUVnB00xEfHp4Z2NibBVqY2xgeWdtbGNtZ2RkeGZnfE9R3ffO2/TJwv7y9/Pz9vz8/P/45frj7Ozo7+Ty8cTF9M3eV0tDQFBX0M5QRV9LTnZ/cmFiY2NnYmBlYWd2SFhXRHdDTHJ0cnJ/ZmZhfkhwXNxZ0Nnb8vrh5+fm4+zj4uLt4+yVl+rr4OXn5fj//cva39da1FpcXXBlenxkfnJlYGJiYWFnenFCSdrw8PfE1NPe1VbQxlNT1NX1/fnk+f7++fr++87VRUBQUNFARtbV3PDx/v/Pw8fYVNRdRUxDXt3My/PJ0FJTVtXT0FxHdnZHTXd4f39wQ1Pa3llb0FRc3MfG2Mjy+u3s4uLk/vrl++Tk/fLwzPD4+vz/+v78+Pj/9t3SX0tISUx9enBzW9rM8c3A2M30wcvdWlN2S0FDQ3BbUF/dxPDyxs/H11hGT35kZXpxWtbP29dU18DYwsRG11NT3N/MVd7NxvL+5ODk5f78ysj8yNvAxs/29vLxwFZeWVheWXZwcHJAU9LV19zf9/z+5+Xl/PTBUd9QQF3c2/X55+Hh+v3588PRRXZ3cnt9QV1Y1dJUxvf98/z7/PLeVNVLdkNHWlLV39nO0E5bUlxaRU9zeGVlf2Rkf3hzdV1SX83cVd9NR0xLQFD0y/X//uPi+ufn5P/09tZT1FHJ9/Dzw8vPxt9e2VxyTXFzcXx2ZU/QUcfE9fzCyPb1wMX1Uk5QRVjUUVZMR1bQzN7Pz97Kxk13cX1hYX95dExX2VXczcLFxsrTX9LQ2cLw/c/bx8TLwMXEX0ReRF5eQXx8TEp3dEJDf3ZCXFZBR31leHJ2dk1FSEPX3sr99sjBzvTOxdhRQHJKUN3FxvXPw/Xz8c7dX3J5ckpZT0NGdkbR3sjb28HT2NPV3l9HdHtxQ0BISF5NQVTZwF9OS35+cHd8ZntmYH5yR0B0WktFVVTf09rQXNXTz8rJ8cnB9vvn+/fCU1vW28BU19JF1sbYxdfTUkFER013d3xmZnt5en5NdUlQ3MPAwlVDc3N9ZHh5eHpzUtZRwMfU09PVSUFYTUp3dUl2Q9ZHTFje2cD2yN3TU1BW09hNTk1YUlnc1kFcXV5MQNRBd3F8ZGdnZWVlf3NxT1BMeHl/Z2VzcnJ3W1bb8Ofg5fn6/Mnz/PTw8//K9fbJ8fH1zNzJ8PHGx8xTUtzUSHB2fX9HXVLXWVRQdUfQUlRFT3l5fWdlfUh0d19WVllNdWdgZ2ZmZnl6ZUjW2dr1zFNZWVHSyvD0wMPx9cj1/dpS0NrM8fPz9Pb2w8xVXn1keHp0Q0VZdEh3c0BQwddNS319T1NQV9TFzPzk88rY3NNBUMPEVlHYx/z68/3Mx8DQx/L688LG0NjL9P31xNfQ2/Pl/Pb28MLJwlRcdn55f0lNRUJ2d3FKTEl2ZmJgbWJkZX94e3l03szQXHV1cHFTWt/F3cjz5uT55/z++vjn4e/i5v7/+Pvz9PfJ1N3Gw8jPxFXX2cheSEN2fX5IdHFdXltWXNzc9/LBRXNDQ0zcxdBXUN/Sx8bc19fe2VVc0l1JW1Xay/P/9/39//vn4uD79vXL9vv+y9nYzsn29/Tb0VZTX3R9eGZgbWJnZHZ4eHpnT1bB1EdIcEfVxfPz9vH1/uXm+v3w9/D7/P389fTax8r39sbIxtb18fzwz/TRUN3K8tza2dTMyvj99fLI2svwz19Odn9zQlBcRltZdkHa2VJKW3RwdUxcSE1KcEhQwNjR21TQ9f/9w8vKzsz3/PPw8f/45OPt5vrl/szS0NzH09PSxvXOwNvHxtzZzthVQnJ9cUxDQE13TUVF3NXVVUBQUdHUUNjW2NRfw19EXExFQlbbXNBFQ19ayvVXwcTGz/bn/Ofm//vz5P9Q3sHF3ND+zMD1xPfSx8x3dnFkYG15Z2Jhb2JtZV59ZXB9f39WVnJFX1zVVv/01sbGz8b74P/75f/Lzuf6xVbXxN30+/L+//LKy+f42FtR11Ta8PHK9vXfXvXw2VNOd2RmcXV2cHhkYH5KfmFiZmFnfX1kZmR7en9KR1hPdnx7dVXb2tpQUlfI8/D3zcPD9/Ty5eDm8f39+uTO3ltC1lDS2MHHS09bWlBeWXNgZmFld0pec3hyekpaT3BgfXR4dEFff2VweHdaU1Z5fnV9Q93K3kxQVlH05OT3zv3y+ODu6ebg5/344OD3x8rH28v6+M7YWkhwSlx9Z2wVamphZGJjbmoVbHlhYmFgYWRM0FxEdHN8StnbUFBMcU/V//D19dZaXvH+y/PCUFTF+v7+/fbOyPrk8PbHXVbC8vvl/vFRSFbD2VRffWFlf3F0cHxmbGNnY2ZhaGpoYWV5cHl5Z39CQVlHTndO0sD35ef7z/X+5eXm4eX45OHi4u3i5f7z8fPwz1dZ1NXRyM/B1lteTHd0d3F6ZXt/d3FPS3B2Z2ZnZnlkZXllcXRDR0BBQUhIQnVKcnZ4fUJT0NBYT03R0drL8uH68uXm7OLg4f775eTl+/r+/Pz45Pr/9dFNdnRwf3Jyfn94ZXFKSHZgb21tbm1hZ2ZneH53S3d3enxYTVxeXVRB3fT85fPx3MT88+Tn4OL75ODs7u3j8sHz/f/68P798ufg4ef+wUlKSnZxf3J+ckhHWElQRGZmYWFiaGNhYWR+SHVZRn98cnR0c0N1cUTQ9sjK8Nbdw8X3zvjj5uDi6O/j7fr+//X10s30w/D95Of75cNFTUpLeH9zfnFeXEBNX0B3fGV7YWNmYGd0QEh2WUlySEpEQEZZSURW9Pz34Of0yMPzzPHl+eHtlZfqlerp4ubh//n69PLk7ezn5+Txz9JGcXh5Z2FnfUBLW1VHdHhmbGxhbG1he0h0RlpGQUlCcEhRS0NS3fTB8PHMzN3cSUvc1tzw/ufg7urv7u3m8t/188/z/+Tn7JTs4fv/xEbT0UZaX9RJRthVXFtccWNnZGBsY2dtYX53cXhzfmBld01NW97R0eTv4+bm4fL0++Xn4+jq7pSQkJeUlObx/PX1ys3HVMb4+vHGwVlkZ3xkZHB6ZHxJXkJJR3dkZ3pnZ31wf3t1XnN1TXhkYX5xfkp1cUlQ9cjI99VFdU5WUfT+++HjlJSVlpXu4uTn+eTh8fz65+Dm4fv030FEQUxZcHp/cHV+dndkYG9uaW9hYGF4e314cUJ9ZmZkZHbUUVrc9vz+5+Hl98zFUkXN+f3l7e/s6JSV6eD+wtD2/8jK8/j++uzi/MRWWnBYVEt0cE53fnZKfmVnYxUVYmJvbW1jYWRxZG9paRUXbmdnfktU3Mzl9sXRXkF3XvTI9vvj6emXl+no7+T98f38zsn19/Xy4fDCx1tKc0NeRl5KTUZ3UVp+eGFtbmlmYGFlZ3h6eXtjbWhuaBVge3tyd1bC9fjE0ldzSHZPy87z+Ofp6JGW6pXi5+f+5/r2w9DP38bxwdladUhwSk5ITnxxSn10fmFiFRUUFGJmZH52RkJCSXB5Z2ZjY3tOTHNHx8r19M/cUk9OdUrX1lf3+OTm4+3g5fn2ysfE99Pdw97M8f75wtnZ2tfWxlVfWk5McXZ0ZGdgbhUUbGBhfHlzQnJ9emJtaGppZHZ3QdTJ/OXk5f78ydjfxvLx/OXn4O3t7e3h5/zx8M7Iz8XfV9LD2MFUWUVIXNDWxtrWRkpTSXFwf3JnZnplcHRCW03fU319e3pia29vYX98S3FHVUdfWk1yZn50SdTO8/Lk7+zt6Oro5+fh5eT6/Pfa9PLw+Pn8xN/Kycj9ytRGSk5xfHN6Y2JjYWdM0VlYWVRSQ3dweGdgZmZ4dHRKRNnH19TcS3F8eHJ0UNzdwf3n+vrs5vjk5fjk5/j28P344eHu7uDj4Obg4uP58MhVX15eQWRjYWJgZn1wcHB+eH58Zm9raRVqaWd5ZHxB1cfB2FBKV0Z3QNfAx8P85+fh4+Hl+vrw8Of798Xexsf08/3z/Pj6+uDj5P39/MPYwNjRWU9MSVlUVNjF3VRCXltlZmZjYm9gZ3pIfXpzWNdBfXZNSkhbVlTYx/X9+OHi4uvr7Ozh7eDm4fv65OHi5eTj5Obg7e3m5f/330VFcHh4YGdlZXt5XFBNXnVMT3p/YWltbGJhZXFleHJ2UUN2S3ZOS05dVc3Y1cb0+Pr64ubg7ePs4+Ph//7/5OLn4uH64OXk4uLm9s/dUtJcWUx+d3FKXVbD1kBbdENBcnltbG1uZH5ydX12S0Pb3V9MdnV2Q1PbxdDdXtPl5frl++Tk7uni7uH3z/b65efh5ebi7+7p6OfyzlPc1VFZfH9kYXp8Q3R4f2d6f3l5YmoVF2ppb2xubG1geUpTWUhASFlQ3/TYx9lR3c345vrn4eXm4+Lg+vTazfXw+v/z/fnk+ODg/PfMxtdSydpFTHV3cE3VV15U2NZG3NZwZGBiYm1hYG9vbWFgcEV8ZX5zfGd/d3J2dEpyQ8L3yv/k5+Xh7+Lj7eLk5+Lj4ebk5Pv44eXx88jQXFdXS3ZyeGZiY2NjZH55eXlyZ2BjY2Bib2xpYmZiZ3txdH1wTHV0dEt2dF9LSEdaR0XY/f34//DO2M7NwvD9ydvD9MDK8vP3y/b8/Pn7ztXZxlFWVFFwenBPVdvJ1HJ0d3h+ZHpiamtobWB7d2R6SHVHX9HUT1pT1cz0/sxQxN/M/+bj//T2zvzg7OTI8snExs3I3lfVU1Hcy8dKd3x5dURNcHhkZ39Ezs5WRnFkZUtFcH56YGF6QlxDSX9+fUDfXFxIZHhz3PTdxUV1Qd/78v7kz8DM/+Pn5vzXRlz1yMXx0UBf2P788vVEdHZU2U9ecGZmfdfBzMBLemRJ1kFUV3RmZU9Z0c1feGVK0t/391ZxS9Px+Of80EhV8fTx5fvaxPD+5unv5cLK/vz74efYRNzfw//4xn5hfnB0fnpnYmZlfV/SUnptYWV2TXV6YGZgZFrB9VN5cVvdyvLNW1PZ2/3k5PRTQVjS9Prm8dPUx+Xj4+TyztTXx/TzwNNdXcjy+fzB2FpewfDwV1hRSV7Mw83VdX58TF/TWHV0YWZKWVdYSWRtckFOQHd0f39RyfDF2dhB0f3n4eTk9sf74unu4ufIwPb45Pz+zlDd8Pz2y8BPdFtUxdZYR3Fz3/H03NxxenNBxsL1wFhPQtTIxM9FeHh+SEJOcGd6dlvb1Ntcd1lSwc7FxUFJQFzx8vv63sX1/Obh4uTy9cf28/fCWVtW18nO9ttd0tj38MrZTXNyeH12Xl90dXFH29r0211YcExNV1Jxd3VCVMTBxVfX08P1/Pra09Rd3PX4+vXC2cT28f/12sFfRFbR3F5aTV7ayfbJx8FQU8Pa0E9/fWV/TFLG0tZXRMLx9PTfUnV9dExFQ3ZxcU/S2sTM9cLWyP/9/vfSW0/Q3MH02sdFWcvM9MPEU3ZTRUBWSXZwfk5QXNDQXnZE1FLeyl1zfXNJ0crHzEZHxdvL8fTcSEpKd1hbXU1fxMX29//31sfB8/n0/NVL19T25+fkw9jdyPjI/cNMSnl2T0VQe3B1cddBTkd+cHBBUUxGe2NnYH1EUVRKfXJD9P3/9VBFcUDb2MjXTk1P18bNzN7Z1dvz8PLCX0ZF3sr99N5TQkPG/vjwwV93QlbFx9JPdHdN3cTWXER1d17F3F9wZGdkck9ASXVyf0fC8cLVU0hxdk9Bd3xne3DA//H2wsPb8OHt4fRXTVLNy/fIxMBcVPT6+vfZUUdf0cPOWHB7endNREF2TENZwsHZWnlkYHdEU1Fxcn1/X8HOyNNQdnNwf3J4ZmBsZE1f11PRXElFTVlTd35/d8DLxtjR31PF/uTi5vfDRdFcRFBFWnZM1djGy9vc19DG08TQdX55d0pGXV5YTln3/uX78c1FQ3Z9SnVwfHJLQEXE3tJXXFFITUBMdXBBUtv39czc3vT18//0xVldX1HA9PTTRUdBXcXe10FGRUdWUER9ZXtkfk1c2sXSys//4fnM1l9bcERXXkJwS0bVzMza9NrXT0bdR3B7eXB22vfA9NZeQVv1wFDVRUV1RvRcQkZ3cnlHXXRR0V5NUPnzyMDcV07Y/dXN8s3P/Ozi5eXy2EBP3lBcxddKdMrKVd3G10VezszZ0VZeWvLn9fb59NfX8vfNwdrddVjZ1FRFS2Vtf316f31Nck3D3NZYS3Z9VNJX1tjP0sDh5+Xm5fPc09lUU1hBTHNY3kdBWEd1SVRcWdFQWlvb9d/dx8TYzfb3xcr03dv39Pbw8dJETHZDfXp9fkvWx8bQ30R/dU1RW01SXFDA/OX3/fzFw8Lxx1PZWUhcXNjTxc3VzfTyydTER0jW2vLKzvTczN/0/sr59sTx8fvxzfVSW0RCSH50fGFwQNP3w/fFXltMXUNf1nVZ2srl+Pr8wcfT3NFaXUxLR3dJcXRAdnJycV9aUkd1RUxZxPXz9sn3yfT39c7a9/TK+fv329VVQXZNRV5BdXVyRt7DxtXXUVDZ38HF1MvI/uHg4ub78sLK8sDZQHR0dERNUVh3fm1heXl2cnZ/ZHNxU9zWx9TY8vT++Pj68/nl5Ob49tVW0VPR10RwZnlwd0BMTHNkcEpewdnAVlTczvnk5uTy9vT29/H82NDU1Mrz/Nl3fnlxdmd5cn18YXtF2FN9fHZEVlHEysVQS1rM/v/FV0VJXtfY9dbVXVHL//PeXUhORFXN9MPdV1bB8v798cDQUsTO2sFbd39/QFNV2dFZSEhbU9RRTkNQxPb3zNhXWkZXV9LFwt9e2PHN9cVad35wfn5IcXl7e3ZeUEBbdXNPQVnf3lZf0vHy5efm5PL3//P95ctUWddX1NjSTHx9d3BzdHV6YX5+ck9YX3FxdV7ZzfHLyPHz4Ozs4/jxxt3A2MPTSXV1SFVQQXR6f354ZWR5ZGV9cFLb8cjZ31LByfT79szH2s/2/PPa00ZGUtdRWEJ0dnxwcXd0SHdLRE5cXVPe38Xw+fr2zvf09PbM8/31yUND3NNTWEFZdH18enB1TkB3QFhFT0bU0dzcUF1YUlxYXVBX3l1QTkHU11VaWdVRR190SUp1W0hMWVhXX1HSVMDA3NHS2dvQ19vPwMTewPf5+cna2t/UVdD3/fDz8fT2yMnY1tNSVtdc1lVYQHVOUk1GSn53fH58fHl+Z2FjZ3JOW0FeWkFdx/X28fDx///y+Pz8+/X08fT1xN3cQnZmYGFtZ2FvZnVcWV3G8MPM8Pz7/fj6/OTg4+bh7+D79ffO1UV/Z2NubmsVaGxnZGZ/f392ZUxDcVNZUdNT9Pzz//Hk4Pvj6eznx9hPfH95ZmB4cVnT28nH3MTK8fH2zlN0d0hGR0zW1FjH9Pvn+MpJZHt/cn14c3lzWtD3z9BXTNX09/v+9sxTXUTVxtvcUlfayfv58d13fX59fXt4fH1MRdTK/fj2/eX7/fDwzdVV3VJCVN5RU93x8dpWWXpgZ3pmZ35ycWV/WlTQ1NpQ3vbM9vXFwNDC9cbx8d7a2PTw9ffWS31/QHZ4dH1lZXJGUcz98PXz5fz4+/3w3MTK3vP+9c3TxcDH0ExyfWVjY2JkZGFleHdB3PD3xfX18eTh4uD55+T/+eft4OTn5ufk8ffCW3FnYmtrbm5vYXF1RVJJSklbXljT0kF3fHJPcl/R3fby+PnIyMnVW1pDQkpfXExHUdfa011EdXFaVtPE0t7VWV5Q3cj08+Xt6+Lg4fD+8vH/y8n339v2/Pv+9MtQWdVQ3UV2dXpkdn13TXZOS0zGxF9Nf2RmYWVnZXdOR01D09bF39Pays7z5eXn5fLxyfPn4eT+8ufk+vLaV3BhY2hvYGB6Z2V2dVvdx/TI8vrm7e/s4+T65frk4eT9+uX/8tdfd2FtbhUUFGpubmZlYXt8dF3U0t7U39vFyvT08cfM2t7DzvTx9d1acUxHfHhkeUtY9fbBzNXb2tLk5+Xs4OTk/OT5wsvP2tlY28rf/cFGVEXd2HZIfXtxfUZedEh8ZnB3XMzT09dX3FDQ9MfM9MXHx/fk+vPcTUNyenx7fnd2S0RNXU93dHREWVfAxMrI39rG8vv+5eX8//Hl4fv313RwcHF3SHR2fHB8e3Rwfnhke3xwTVhMdHZzT09ERUJWU1Hdz//6/cTVR0BPRlxEWdRU2fT/4ePg4uPt4uDn9tLQR0pBS3BxZGR7eXx9REdxfXdwcHxkcn55WUXQxM329Pb65eXl5+b7yvX3wN1eXU5ySU1LSEpNR35wdH1ISXNlY2R4e3RN0VdE1M738Pjk5PbK8srHyPX1V1fF18TNzcFPQ1JxfndKZWgVY2ZkenRac3bR3sL3/+X49+Tg5uLh5vzC8crN8Pb310jf0d/dTFpJeXZxenl+ZmJgdEB+fnRZcX1HUU5F3FZMSVLAU17Y21RA0fzM29zRRUJF39zc9/n29vHz8/f588z38vz+ys769s71989SQFRDQFDR1U59dn1neWFgY2VbQHRDdk52TsDx8fH19/785fn09snL+drEw1HTcmRlfHFnb2gVaGJjZmVlcHF2VNnE3cDOzvnm4Ofk+uX8zOHo6uj63lZ3Wk5ydUpGTXRGXkVId11AS8XH3tzRWllMRN/C98XK8s/F3Ex8dXtzfX1FQNfx9snO8vry9vHD0kZAXEtCXkx2f2FnbWNyfXp6aW1ibmF6fklf9f30+Obl5+fol5eQk5Tp4+bn++zo5v/15OHzwdZ6Y2JtbhQWbmhqaWtjZ2VxfWV+en10Rc3A1llT9Pnw+Pzn7Ovu4vvB2VNDTEXey/bCQHR2dEVRV1NRXUt3XlxTV9fZzvL6/P3//PFQW1hG0NZNdXRMV9j38fH33sTPxMrJws3YVdJdTktMdGRmfkhZTn5nbRVsZ3l9cUXW0fL4+uHj6+ns6paX6uns4fj65Pj6y91RSUZXdXJ+YGlraWhoYmZ5eXp+RF9U09jTVd3AxtDT219cRcT2wPT/8PH///f0zvX0y9v3/v7x+f30y/D1xsDF3V9ATU9BW3Vyc3RwdHddxcfKXUxHck5NcnZydVdWwNlc0tNT2dLD9MHNxdfG2Mf19/nOX9XezvPdQHNmYGNiYW1ibWljZXBMQtbQXcP38+Hn4e7i7O/t6O7p7ubm4OT5VHZ+bmkUFxQXF2lqFW5vZnh+c1ld0vf+4efj5vL65OHv4ebg5uzi//jJ0NBGdXZ4dE1Id312T0xZXNHbVnVOcHZxZmBsbmJvZn513NFzc3BCUExW0VrF/eTp7Ono4+Tn4uni4PjJzdZG1kJNSmdhYmF0eG1vaGttYnx+fk1wdNfS++T//PXJ8/Dn4eXu4+Xk5ezn9PXRVMLKxNZwemFvbG5jemFnY2NhYGd+YWVyfEpxRMzc3tBRy/775ubl4uLm+//48NnfSnpydF/QQNBdQsPJ9vHUydVJVNzN8VDawlDYy/rt5OH8xdfSX9x0c0xGU1BU99HQwdvM8/zt5/H729BXd01IenpgbXpnfmdpbhRrY29hY2lhY2B3Q1TWWcb25uqUl5bql5Xu7u3t4vHw5OHj4fn5V1hfXltyfUN8ZWFgentmZmNmYWZ4cUlfRVhCXd7E9srZxsn8//zl+uf+ytzZx/fP3tnc3VVHSXVPSktNW1tST3B+fXFAdUhF18fH311ZU1JHXEZbUlHT2sL98/r6++fl/P/x/P329N5d1UZGcXNxfHt0fX55Y2dgb2dhcFJRzczb9vD/4OiUlemUlJXr4Ozkwv3/w9NPUkt3dnd2eHh4ZGlubGhvY2dkYWdlZmdlTEJxSVtRWUVXWXRUzvT2+u6V7ebh4+3slO/k++bt7ebg5PTYxvTaRUVwZmNtZGRgZXp+cnp+fXTG9dHWXNvdX8TLwPb35fv0/PrJ0FjN/Pfx+fbaT0NcdV7C0nVmcFpwfX1wZGJgeWBvZn97ZH1S0MLy+uDh4+rv6ZSU6uDk5frw8f3Pw97KXE9wc2RrFxRqam9kYWxtZHBIVf/k+/z85Pr64OH65eT4ytHP9cVVRkdVW1NUd311QUZHV8ReQn5yRVjb88VSR3Fxc3xzeGVibHp5Q1BDcXBAXNPa8PL7+f7n+ufg5OTn++T5/uXKwlZLTXdJUkVze2R+fHt0dX1ga29iY3FBREt+Tl9R3N7a21LV2sfK+/r/8Ofs7eDj7e3m+vzK9cjBX3Z8fHphY21saxRqa2xnfnhmZHx1TV7azFRSUc/+4ejj5fj75P/Jy8dQRkpBWkTUQndHRdnHV9rdRXR5cV5Q3VRbUFrQyd/IwdDTR3ZBV/T0xfb09/j45+bl+fj9/fj6ylTURHd3cnpgaWhqFhYXFRQXa2huZHFDdHReVFHT8eDh4Ovp7O/p6+L65/r1wcn68Nn19djBy/PCWkVeTHFP0FVxdkx/fnNEdXJzcX9kZ3ZKdXdGTkTV9vLM28vC38r98/P65vz19Pnw3lNXUkp0VFZId0xOc31GQHR1TldedVBYQk5HUVhYw/fGWU5U3dbGzsfAy/L8/fPz2tRS0NJfVMLa3MZEdHNzd3hnYGB6ZmRNTk9QzMLK+OLs5fvn4efk7O/78frn5/jn+dB2dk9zZXtwemBkfHp6ZXByZmF/e2R4c3N+eXZ3dUBU0VxNWVFAXd7H3Mz65efg7+/h7ent/vb98dnXzszawM/LWn11SHtkfHZ6YHp3S3RN3FHT9+fk8cjMwd7Y9/rl8/v2wMTazsLRVF5AQdPJ89tTSnZwdkl0S39jaGljYXJJRXFkfnZBUNLL1U5KWcL08P/l+fvm7e3s7OHz0d3188rI9NdLd3dDXdNVVEd3SU1fR0bQxd/C/+bh5/XQSEpaWFRcQ0lNR1fH8fDLws3AwPfNwtVCUfX2/fLN3XVwSHRkYWlrEBMWFGJ6c05ORsX1/v7z+vjn7O6UkZSU6eDv6JWV4uH0XVJ8fE11dXxmd3J/c2V8e2N4cEpaTEZHd1lX0cnD9VB9SlBT0NVV1UrXysjw/OHi8Pz75ebz9MhXQFpV0VFEW3BtbGZhYWF5eX1lZXl8d0NSy9zH/fzl5OTl+v/55OT73lfaSH14ck9yfXVbVlPC9N1BXN1bc3RQ0UBd3fb99/rk8c/05PfW2cjfW9/GxtJWxvTw9vT31XBLRFxFQFJQQHd2cHB5ZHtkZmBsZGBjZX5JTHXZ21XVyvDCWEdSSUJaVtld2ubg5+Xi4vbL9sj12PX5/fT4/OTl8OT/1tzVVk9nYGJpbmlsYGd4dn96ZHl2X8b28vrz9fPy/ffx5fDD9vbK8vL29NHXQEp1YXh8bxVrYmRlc0hwc3VY1d/Z9fTLVUfW1dbM9/76//zD08LL9c/AzffAwPf09MTeVFTUR1bcTHxlfXd9T1ZeUF1CVdNW98/eWHFEWnRex/P7/cn1zsPP9M1dTHByTEhS1EpaREvUXNPx91RFemFmbXtzf3FmYXB7eVjR2FhHUtdXxv/+9cD38vv4++Pkws7I+Obh7OL8wtZHTHB0V0N/Z2NhZXJYXNHQXF5R3NvB0kF2cUjc98P0/NHVX1fw9v/m8VZd3ff3yv37w1t0S0pzRkZ9YG5tYWFlfHZ6bGBnc1tQRE9/ZUpa9Ofm7+L4/vv+/+bl/shdTk1W1cH28sZbTF1W38fSVnVTyd/z8PP7U3Tfw/Tm5PfPSVPRWcn8+MNYcnllek5QW0B1d0pB3P/yzlJ5e3pnQklhbWoUbWB9x9hRVkxx1VzC/8zJ1NjH9P3g4+Hn5Pn6+v7k8dVOTUzdzv/h91tbQ1DC8+T8xlZXU1TYzP7LV0l+ZXp+cnh9ZmZlZ3xa3MfXTl1TUvT88vJV08LI+uHu6eb3x15JV9hSRnxgZGRmfllU3ld0THt32N/SWHVbQF31+f33UXdweVn29M7cQ9HDyfng4uHn211DWsvMzcnS0cff3PD+wd1zeHpyUl1FQn5lcHXT++bn/93Vx/Tt4PnyyNRbRU3DylXRcWZkZnxlZ2dtbmtvYH1Dd3FhbHtO18bH88zc1cHI+eLg+8jaXdPJ9/X+8/7/+OTj7OP5yt9SXMzC21x0eGR318HO0VtxYW1lQFJBTElKUNXE2Mz0+/HD2ML9y8TD2FlV39JX2dnYQWdsY3BOTkdAcXxyf3bZxMBec31/Wl93QVFWU9Da0/z5/chAT0bAz8Hy89pfV/T94u7j8VlzfV3V2NhGdE5H38D2+8pdUtVR9fLAyMVwT9nf3PHwyt55Z352RV1aRUhzTVFS3M7RQHF/eHRWWkhMdF/0xNHa3kN5YWNlcEJeTV1Yd0HT3fTm5v3ZWdXH9/zy+v325eH65uD7xFxCTNPQVFpYRE9a0cXJ+vbcTnNmZnNf1lTbUEBAWN7+xFJDcXt5RVxWXl1RzeXv6OvnxkJ3c3bZ2FdDTn5keHJL0VZwe2ZjaWV0TnxxTk1QV8///cRd1cPR9/v+xdJVVNjc+eT2VUdxfHxGxNjC5efk5OTs6OL5ydfVWlrG3kdXUF/axPb533JhaG9jY3NGSUFSRlba/ODlydZJdnBkf3Z7ZXJ5S0pGxUZjb25oY3pY1El1XkbR8eXplfrP29FWV87w8fHh4+bh4O3j9dNUUFRd1FTUWlbF8uXt6+/0dX5nbmptYGBtYXl1QdP38V13QVtLcFTf3FXTyPvn75Xr5Nd0dnN4REBwe2dkc3130txedXtlcH5LX15Y0/Xk5Pjj4PLVSXdwfnZCd3VCdVbL8+/q4fRQSUFLW8HLzPTx+ebn7u7kzVJZTH9lenxwf3dU98nx5PfTXHd/c3dOVN5QWFzHzf/t5MRecHhmY2FnZGFlStPQzuX5U3x5fGVnZHJJf3Tdwvzg65X611h2fn9mfVp1WfHk7ZSRl+Ph4Obx01t2dXN30/Hz5+HkyUd9fWBvbGJ/cmd13N7y5ODk8FTcWE1JRcFCSETI8P7l+MDVTnF9ZWRlcXZJXs/I9OXn/PTVdWVsYWdnfEBD29za9P7y30l+dXBkf09b0N735u7qlJTo4cdUXn92UdDM11tX9+Xt4fT0XnV/Znl0WFfV2M7l5uLg8MdRTGVvaWBtZnpgZVzE9/n85/3fTGBjcWF3UklKwfzw//PzxNVwZGBgYGd5eHJSys3z8/n/+tjQ08Lx3vLw/fvn++fg4eXg9Xdyck9PR0DRxff2wM3229ldentjYmdNX11TzcPX8Pz19lJgY21uY39IWNz1//jg7eLt7fFYR312dHl8SFHQ19PEWUx1ZWtubmRyfH1wWFbbzfP8//LefE1VU9/Z2Mv98Obn+fr69Fp+dVREU0Z1wfn95+Lu4+flzlNESHB8dnBdyd7UwvTR39tVRHdlY2hpbGFzd1jP98b3/PTQS0p0dXN3SHB8fEhTXlTOUXJlZWVMQEVXdFpd1M718+H9wF5OUcTBU8TGwcj54+iV6uD2VU1JR9FIVNFTXVfazvLzwkt8e2ZmbGtiYW16ddnK8P7I9dxRQV9YX19VVlPf9fH099jJ10dxfXZwck51TVBCQVvZ1lRAdnRySkxaRU9T3cXYyeHm+cB0fXtgYHhaV8H2//3m6+/t4/XMwF5aSUp0QV3cwvzv4eXm8lVFd35PTmV5e3FDRsTE3MNVS15bcXV0fHdxRsVW3tNf0E503vReTkl5cUNf3tv1x1XA03RzdHpyQXt/Tdfz/PfP0M/8ysz+9/Dy1UZUyOTn5+3h5/7M2vP0397G0Ex2SEVTXkdWTnNx1VxOdUxe3tjQ2FJGd3FnZmdPQklbXEdVVt/4/OTz/8hUV1BAd1nRVlrayP748FxSfGJjYXJ4eH9hYXl8Rcv49vH23dr18/b45f36/vb47+j6wVB+cVle18DGX0dJWdD95M3FU3t+UNDC9/fF1vTJ2cr+99ZceGtiY21lZGBhc3Z2Qf/819JZX8bP3vz10UBCQEpW9fHUV0dPd3JkfUp0c3VPd0FQx93S28rz5OXj6O3n5Pzw5eHs5M/Fxt/bVd/323VLSnBLQt3ZVHVdVl9aRdvTSnVYRlLexsXXcXdP1/T1/89OcX1heEBR0tNDTFVZx8LzzVzV1URM0txGcGZmdEBT2/L5w11DRk/e9vXBTnBG3sb85Obk+vnz9f3n/v3Oz8HI3vT68vXHzMfT3vj101tNXllE2/v0ydVAd3x8RFpKS3B3d3ZNXV/WVVNKdEBdVlxAfn5ySl/O9c7AWXdKUs/wwtxBQV5d2Pz78/HM3FZX2sbbxtnK8/D8+fjw9s3X0sfIwdLSVlNC3f3n5/nl9E90d0p2fnNkZ3hyTlPcVM7MVFZYXVNb3FFBQVdQV8P08s3USXRE2dNUU0p2Q0Jb3ND1xF5OdElbdnFdRFzcxMLHXMfUS3dxc3x0UtXUUkTcwf398vvI2M/E3lVa1kx/1MLQz9rDytPU31VUXU53T0tA2F1SVdv0z9veV1DM2NLf2NvbV1dZR1FOcXdOcXx8cUpA1MzYxd/ZydddXkVDf39zeXROWF5U1dT1UHR3fHhkZ398SETGyvHw9eHl5ODk+ffEw99dXVXX0FTS/fLdR3lnZm1lc3t/TkpY1VTI8ff3//z79fT0wfT8/efk8/v3xtJaZ2ZjYGRhYX58ckJbxvXFX1hOd3hkfHh5Wkdc39b1w8nY9fz+3XF0fHt9dUlUVczL8sjb0dVVXcfKzM3CUtPW11XSzM3b3NrU29deX1nVysLA2dzWV9LV11xRVNrXW1/Y2dL2+fDZQUNMYWd7cUNRTk9FdUp/cnh8dEpxfXl4e3l0SVjN+P/z8fPe0dDH8OXk8N/N/PL2xMbf00xLU9dGS1RcV8Py+v3QXUdEQXVLQFbUxlVR1V7G9//k+vRddGFheGdgYXp1TVrEx1FRWE9V2fT2W3VAQ1pF08bC2FRWdHNzT3dLX1tAc35P287OwsvB9/PH9fXQxcLO+ebj4fvNUkpMSk5b1cLWRkR1SlDX3cbAXk51fX18fnBOTF9U0cTdVFFfXdnZ019EUlhCVvX0/ffMxltIQ0db1s/z/MjKyMvN2d3XWEtLf2RneHB2dEfB+efg5vLNRHFMW0pF299QXNP3/frh4ubJVF3XW05JQXRxWdNQSXV8en5EUdNZd0x2c3N20/Lw8PzP1dHP8cz54+Lg+/D++v7J3NFQQHB3S3FyfGRhQt7T0lt0c3xyeXF3TFPDz9vM+uX54+/u7uPl9sHDVNTJxc1QQ3F0SXR4ZnlwdlfEVdFTxtvZ8PLzytBBR1xV3/T55+Tl+Pvn4ObTXUN9fmdjYmNnZHJQ9fb+5cjAyfP03MTLwd/Z287x8/3/9vD29NNxcH5nYmxncXN8cnFzeErYx878/fPI1tn0/f7w/vPP9M3GUM78+//5/8zEVVFfQl9LdUB8ZHp+fHZbz8jK+/v6+Mne0t7OzNvZ09vx2F7X2svCz9hbWsTAWklxTllX10JKd3ZxfHh5dFRZd0NHWVf34ePg+/fS2MDb28T38vz78+Xm5Pn3zMLG39JNdklMRlzZy//l/VdV3UZ2cUlxcXJyfn9GXdTPyPfyyNbcyvXaRlLZV9/bXHZORkBSRVzMyMVNcXl/fXRHTkBIcXN7fV3C/Pv74efw+/rl5uX1wt1QWk5MeX1PU1lE1NbRXUJMWN/94ef59tvdVMPz5f/N111ESUB0c3d0Ql9EWNTQdmdhZXl3WlJYVFF8dlzdxsr/99FRR0xS38LE09fX3c/eR1dfWFfWUnZ/dnZ+dFPEy/rn//fPWk9YU83K9dlCdEBJXt7N9crzwsf/+M7dVldaQFxLf3pkbW5sZmRwdHd1c2Vlf0hV3c7fW19d3cnw+Ofl4PvNwVfURX1wcH1wdnx4ZGd6dVrW28NWTEN0QtL95Pj5+fXE2/bl+sfVRklJfnpmYGRkeXZLQVZCTV1awvD9+/DxwEBwdn90Tk1NdV1FdnF0SdVWVtfXwMbfydJRwcT0yMXaXk1GdV/Y0cnDWFlYcXBldcTRx95EcX1wcXZFRV7UVtfVR0RaUdvcxvbI1kR3c3txT3dBRHV+eEBHTEXeWF7e0FBC3fbx4eH65/v98cnFU0VSQHdEVkBKcHJxWcvN0fDO01xyeHhJSHVf0VdVUVfYxvTzzvT68s7dUl9f1NVE2N5GR3d6ZXBf0kdKcGBjbWxne3l7cFdWUcrLwvng6+nplO7h5vbNzsTZxPHCXtXRdk5FR0VHR0Vye39lcE/Vxvb88/Dy8PT//vv+8fbeW0FPTVlZRl5dQEl2fWRkck1NQNFQSkp2eHxzf3ZGSn1wS3Vf8+Tn4e3s4+f+8vbIzMPG2Nnb1lRX18fByfD2UHB3dEDUV9POyfH8/Pz8/fr4+Pz7+sjV19VT31PQ8MxXR3xnZ2R9fXx1SnZzfH1wc3ZKW1hWx8HCxvXk4Obv6O7i/sPdVFxOdHR+dEBMQEBQ9PX1+fz999JWWEDX2PX+/ffKwN/O8v/08v3y8s3f0NBXV1VRX9jSWXBnfnV3Wt9cV150dElycE90fnpycHVNVMnl5u3s7u7h+8ndW1JTX1hbTnd/eHdARltHcUJASktKd0VR2vb+4+7v4ebg4Prk5v73wdfQUkFS0k7WfEtQZnRPTkbd1tHGz9VGd3hlfX13TnZDdkPcxP/i7+/g5OTzzF1ycHx7fHZDR0hF1dHL9cjCXtZWWtZGQdBR1dbX0NrGzNHZ+fL4+//+21xFTNfd0NVGdnxkZX16QNRaX0FaUEx0fGR9cn1O18n3zfb65uzi4uLh/MRdTnFzcXN/fX1ydEJWVt3Z1tHRV093QUZHVsPK9PL/+fXO9c/y+fHwyNhTQ3RyfX13fH9/cXF8StXQ0VFc3VdAc3h7fnlzfX1xdl3Q2cz84O7plOri8tLSxt7c10taQ3Zxd0hRV9fUQd1cTXZ+dUZN3Mz3+v395f3/5/nl9vTy3Ul+ckpKSnV8f3hhZ396fFnQVU1YWHFlYGZ/eXNzfEdDTlbVxvjm4Obk4P/TT3F2R1dRRF5VRFfGxML6+vHDwtpfdnJPRFRV1dPM2t3FwdTH4ezh4ODz2F5S1cH1xtTVUnB5fHJ/T0d3fnB8YGxoahVjZmR4dk5NXtbM/eLp7uzj8MrZ01dV2lxOT11MRkxNS9XOwNrf1ExPeWVKxPT/8vb29ffz8v7j5Pj55cnXWH14f3d/f399f3xzd1jT0FRYR0t4eWRnZmVnZXlyTXB9TkBV8Pjl5+Xzz9nW38jIxs/b0FRd0djQ0UdKSEp0eGRjY2ZkcUHE38PI9vb84e/o7O3n5fnKwNrd3FRfWE9GSX5kZ310cH1+fXFnaGpoY3h5R0ZL1dDH8+bt7eLu6eD8wszSQUdTQEh1QEp8fkpEWV9GQk1GfX5yfXNH08TZ18Le0cPy8/bx9/D88MfQ0tnY9/DPWV1VSHdKQXdwQUZLcnhgaBVrbXp2cH5BUkpa9+bm7O7t4eTk/8zdwvHz9dNd2tBWX15IcU10fWR6ZGBhfkfAzcLIy/j/5eHm5ODi5vr8+vRVRUxKQ0p0eHhnZ3hyfmd2dENJdXB8f3l9TVVQUlfX3ff45f/h7eDj4Ob/9/H99fLyzM7b0djB0kd2Ud1Y1dZNdXNxQlvMwNbY3s/KyfLz8+Tl//r+8PnKw1ZFUXV4eH57cnlkZWV5ZmZkYmhvZmV6ckNCWdTx5+Dv6O7q6u3p7Ofl+vP9wtxUS0ZBdHZyc3dxdXVYVlJFV93GwdLP9vf+5OXl+ufh5OTm4Ob6+/PNyVR1dHpkfn5xfX5xdkhNdn54ZWFiZnpmeX9mfETU19T35//64uLt7O7u4e3g8vPL0szG3FJydH9gZXpleHl6enbQQ3HT1sD/5Ozs6JaVlZaV6e7k/M/IxWVjY25vYGNib21mY3hOdnB2fXJ7fHx6dEhG3fXz/fP65fj6/P/l+vPw8ffSQk90fUpbRVhaWUFGU1BCQU5OQ1rWXlld0d/L9/P5++Tj7umVleru7ebyw19wfXByd39nY2JsaGpsYWNibWNjZGVmek1V2vjt6ZWX6u7p6+7h5+TyyslccHl/eWdgYmxtZ3lyT1VZXtbWU17e19fY9P/+5+f4+uT75eTh4+Pm8V1EcmNiYmBlcHB2TkxIcXBxf3lkZWdjZGRgZnFDWNXXzPjk5uzr6uqV6unt4uXCXVHdWUhlYmJsaGtpYWdneHp5dHd8cELb8ufs7pWQkZaWlJTp7+37yFV5bWsVahVqahZqbmhmcnVCTUBKSERFWFhf2/Tz5+Xy+cvGw/X9++bm//zKXUtzdERZ1t9EXdNUUFBWVN/VWVlMcHxnY2d8d0hHQcDx8uTi6peU6+/s5vPFREtPdX5mbRUXEB0SExEWFxYVbm5oa2Z2xfzk6JeUkZfqlZWV6pTo7OfeSnd6Ym1oF2tqamxsZnBHU93W3s71y8D+5eTj7e/v4eb++efn4ef21lxyYmsUFW9gZ2dyfX92cH1/fXFNRERBSHhgY2Nmfnp+dE5Q1NnM+uPv6ejrlJXp7eHn8MjWQHBlbWhrbmFmZGdlZHtiYH5ewfHh7ZWXl5eVlZSUlevs5PnZdGdibWoVFBcRFhYWFhcVaWJhZUzR3cfO+OXk4Ofk5/v98vX1/OX5w1pOcHpkZ398cnR9d0JEQXRKVvT39PfK8cdSSEpDTdfGxvHy//rg7e/u4+Lt6e7g+M/N00t+Z2xoFRcREBEUaG9sY2BgZ31UwPLl4e/v7uLg4eTj7Ozt4f7wy11LeGdkZmBiYmhpbGJnfUxJ1Mjx5O3t4eDv7Ozi4+Lj5ubm++f/zdlYdntkZmZkcnllc0tyfmFiYGdwSV9YR0p2cn1wSllfVczH3sDK+efg5uLo6+jr6eL929hPf2dhYmtob21jenxyTU9wQdXSyuXg7e6VlJWUlJWV6pXu5v7IX0l8Zm9tbxQVFRYSHRAWFG9hcFHN5eLq6+ro6Oju7+/n//nxxNHXSXZ2dnZ3dE9NW9VQUlHVUNDK9cbw+vr998/WRE91R9PTwcrLwcL45P728Pn+5eHm+8jAUnZ3fmZjbxVraGsUaGxuaW9kck5RzPX0/efm4eDg7Ojo6env7efk89tIfXFlYWJjbWtraWliYGVG2fPg6e7u65Xr7u7qlOjp7O3g+vj3w1hzfHx+f3B9ZmV8e3phYGBgYXt5dHZ2WllETEBHXd/Z38fd283N0dbQVMTw8uTn//X2/MXW2tHR2dddRlnV1lZFTlLXV9/P8vLK+Ofj7O7rlZSRkZbq7+LkzVpLeWFsaBcWEBITEh0TFhRuYXBU2/X85+Dn5+bm5uTl//P3z9vSdHh7eX1+Tkp2dEhTX3R0W9PfwfL55OTh5/LS2sHf3M3z9Mj0/OT6+eHj4OTn4Ob58/7y009LdXZlZWZiaBRqFBYRFG9sbXpOXVHc8eX7+Obt4uuWlO7k5uTBXnB2dmFsbm5vFW5hYWBmd0NS9eTm5efi7+Pg4+/p4uHi7+Lh5/LeUkVdSUpIcX9mZXpkZmNnfmVnenRxeXBBSXVxQN9dWkNMSXRHVllaWlbVQEXWycjb9c/Jw9faxNNVU1l3SVtOfWV4cHB5c3FFSE3R0MHO/uzr6paRlpWVl+vh+vDAU3tmbWkUFBUXEBARF2hoY2V4f1/3/Pz8+uT6+vrn5P7l/dBCcXB0c35/ZWBtZHN+fUhYVVfY8/r+/uX68PX85eH4y8dQdXXUx93Qxc3Axcv++fH29MDWUVhSXXRxfHtjYGRvFRUUFGpoY359eXp/cEzT9uHt4uzs5/vm5vXc09VRR3Z1dnlmYWRnen52R3RLUlNVwf3k+P7+/vn9/+bn++Tm+Pf/8/T2ys3HRXZ1dX1nenh5enpzSXJmY2FibGd6dkJBW0BPTlvdx1fQ0NtQU83K3tVXXkJB0tDBxtvY1VNR28RFd3R3cHTS8P3A2tjd3fb74O7vlZaUlerq4vPLxN1dRV9WSGZpFBVqbG9gYWxvYmFmcEVNS0ddVNPK8vzz9MHWRUZDdXZkZGRnZH5CSX95dkRWwf7j7ub998DByMr/+fL39Pb1zcNXWF/Qxs7y+ufi4fvl8vrj4Ob7/vLC3d3cXXJsFRQQExYXam9ubWNmcUTA/fvj7O7p6+jj89F0c35zQ0BMd3pjbWJkfHR0SE91Rcb75/j75+Ps7ZWUlpXv7Of//f38/dnUREtIT15adH1nZHFJV8X2ysRFd0tOdnFKd3BzdnbU01hAcX9xdkXW2FB1dXFzdFzP/Pfx//Lz/eTk8dFKcHFyf3ZaQ0x0dkxfVcX9+f3/4e3rlJeV7+f6+fn65OX3ztZCd09AQUt4ZmdjbGBmYmxgYXh2W83l5eXk++Xl+fz99tFMS3l7f35le3pnZXZXzfHx8vbD9fL5+fz48vT1wfPn+8j1w9zQ3sH/5v/3z8fE9/765P/M98ja9fHYW0pkYGBgbWBtbmhqamx4S1zd2cH8/Pnj4cjD3lpGSk9W0kJ0S01LSF/Rx9Z1QFVWxM7BVd7Fw/Tz8uDs5/v45Obh5+fk+PX3zMn/8sZEWF5TVtXC+/7KxcddSUJ0ZWBtbmFsbmFlZGFlcUXX0cTy9MPe0lfH8fL298TRw9/byNdHTnZ3dnVDUVJDWlBfWMbz/v/+5eHs65eRlO/g5/ry9/H+99VEWENKQVxZTn17fHl4eGRtaWlvYGR8S11cRFNXUdD08NtTQE9KfXRAcGFjZ3x2S0bSzsXE8vn++ebn/PfFyM3S39xEdnRNU8fO9//+9M3w//vm7O/i7ePv7eDm+8NSWllMcXxkemEUFhVqFWhsbW1nc9/Nzvjn+PH28svc1NbcRnl6fXpkZ2RnZ2d9REBEXllMXtLbyvnn4uPk5ebj4eLs4uf4+ef5wsDD1UhPX1NQX1Lb111ex8za29dYcmdnZWFsbmxqFxVpY3h2QlxaRFDWW1ZWWU1IRtrBUE1ETWVkf3dxd3dDR3FwWl5CW11dWFjc/ubn5OPi5fvm4Obm4eDk8872wtLVU0B1R9TY1kRISGVjYH9xeXBAQXF5fndxdVlWRkJE0NVMdndLf2FkcHx8fHVMdkFX0NzezM1fUtDL9drH3lhLd0BSXMX/5/rk4O/j5Obg5/3+5uPn/fTO1kx0X1hNSXVwZ2BgYGFgY2diaWJlSEdfx8vCzfT/8cvLwF5KTkF3ZGBgbxQUb2dkeXF1dHdL3Mnw5+Dt4Obi4uDm5+fk8fXLw83TV19bVlTazsnK98vP8fjn5/7z8NlHRkVCdXF8YWxram9ubGZ/SkxWycjH3djB0Ffexd3UWU1xfXllfnl+cXZ+fn1wcE5Q38DbwMj08OXi6JWV6Ono7+jr7ODm4efzyNxcT3pnenlwdUt1c3xlfnN1XFRFQ05KQ3V1S0hPdHVKc39yf2FiYWV7e3p5eGR6dl5X38PE21JMVtvJ9vzl/vz2ws3DxcLCzPPk4uDl/vL5+PL65+bm5Pj9/fzy9/b099pSX0dJcX1+emVhY2NtYmRJRFzbw8TAwsXeV19GRU1JcWVgbWtraG9jZ35zdXF2Q9PI/Prk5uzu7O/v7ePm+/n+/Pjn+/H39PH28P3wx9DU2PX2/Pn3zt3W0lJeWkJNdHx8fmV7f3tmZHJCU9DSU053cHZOQFtRUHVwcHN9f3t4ZGFhZnhwcHdOT0XX9PP45uLu6euUl5Xq6+7i5uTl//Lz8MrfVVdXVdXZ8czHy/b5+/HMx83I3FxaQF3RU0R3cUpNQEJJdXdwfXt6fHFyZWZmZ2V/dUBPc35yS3V0W1fW3sTJ9v76/PHJxvX44e3v6e7v4uPi6ZSV6OLm4eDg5fPD2lVATVnR1kdzfXx4ZXhydHR3T1hXx/TC0EVJcnpmZmZkZWRkYGNibG9ub21gZHl2QkVbU1HH9fng6erqlZWV6ujo6O7v7+/j5OTk5Pvzys7C9v/55+fm5fvg4OHl88BSdXR2fHlmbWgXFxcVbmxjZmdgb2NmeX99cnB3dEFCR05/emFhendaUdXBzcL85eDi4+Pk5OPplZSXlOjs4+Dj4+b7/v329/D00FJaTU9LTkFGQnFlZ2Npam5hYGZkZWVleHh+eHp6ZGVlZGR6f3J3Ql5W3N7W2cDOxsj++Pn4//3/+f7/+ufn5uT+8fD/+Pn6+//L2tveU0JwfHBwd3RKcXF+ZGVkeHFKSndzeWV/d3RyfHJ/c31xRkJCW1lZWUdS1VFWVt1R1c/LzdJcWlDTx/H//f/78v/88/7/+Pzz8Pf///fC2V9aU1lbT3JnZ2R7f3ZMQE1KTlpDSV3TxNNZWVlCdEtHQHVHRFpdUlbR0tLbwM709MbMzMLI9/f398bQ1tRFcH14enxyeHx8enx3RF1ZWNDQUtPA2NRf1NBW09LAwdFFRU1IR9bFxs3H9M3J//j5+Pv/9cTCwsDAyMPeXV3ZycZWX1NScn98ZWZtbWJtZ35KRXRydUdISl7Z1lZTVlJPQkl1QEt1dXZDRdfZ3N3I8fHl4eDn4eDj5/rm5+T78vLOwfX3+fHCwNxedktbTnB3cHJkY2NibWhubmhsYGZ7ZGFnZmZkc0hJT0tJc35zSEBbXllbWt3A8fn8/uTg5uHs4uPj4ef4/Pn98PTY1URX2vH6+fD29/b38PPA00VAdHhlYW1pamoUFGpobW9obmxub2Jhe3t6fnd0T1hdVdPby8n25ODp65Xq6O7o6O7s4Ofn5fnl5Pry/f3x9PP6+vj2zthWQURETUhyf3thYWdnZGNhYWxvbWFnYWBhZ2NsY2dkYWJmYWNld1pcRNDa3MX94+3t7+jr7+zp6Ozh4eHn5OTl5P/398DS1dzA2Nvf1dVFX9rQRHVJT09T3NvAUk9GQ3RwTEl9emdleGR4SnJmenVzcNHB9fDCy/f09Pby8/D28f788vj68vT19MLw5fj7+ffI9MDf2ttQWkZbWUBbWk1yfX9/cHRNT0xLfXN8fnFCU1NZ1tnA9v3l//Py/P/85ebn/vbCzddHXlNHdEtXXE1d1tpWW11eXV/N88reVlTVREFdXVh1Q1FCTdXXUElxdnJ/dVJTRExLX1JOW9LHzc/2+Prh7uqV6e/v4uLv7u3n//DxwtLGzsdWV8XTUNbe005/eWdjY2ZnZ2BsYmNvbmNjYGB6dHdJV8fD0VHc0lHfy/f3xtTbx9/GyMjK9uTm5eHj4OHm5OX9/uXm5/r75eT78ffK09RU2dNEUldQW0l1cmdne35lZHp4emFgZmZjY2Z5Z2R9dEl3cXZweHRU9v3w/vv+/eTg4uHi6e7i7JWV7+Pt7+D65Ofh5fn+99rbz8nF0tzRWXVITkx9emVkYm9sY2BsbG1jbGxtYm9ubGBmYXpzcnB0WlZZ1Mn///rj4uTk5uHi4+Di4uHk5+H7/P775+X7+vnx9/PO3dreUUVNTXV1dEpHQ0lPQVFfS0hJdnx8fmNtZmFhZ2dkZ2Rkckl2TVDR2NPXw8vN9P7l9/T88PD9/P74+fzk5+Tn5Ofm5Pj/9sHS1Ul7c3N8fnh6ZWVkZXRJc3B8fn99cnFzf3NGd3JEX1HV2cH19drL/vfMyM7MwcDax99bXdZEUNvT39ncxM3b3czD0VNeX1NYWEJLdXdxdndF0VdU3djYwldFUlhKdUh2Sk90d3Z9c0pxfHTQ3dr38/rk5fnk5OXk5Pr75f33xsHA9cfB8fTZ29rH1F1FSXR7ZGRkY2NibGJvaW1hYWZ7fnN0Skxxc3N0SXx4f2V6d3F3RFLXyP3y5+/s7+/r6+7u7O3g5fv498rw8crE2c/PwNnCxNHeVER9Z2FgY2Jpb25rbm1hZHl6eX12Sl9fQ09EUkZxT3d+ZGZ5fHF0RNHOyvb6+vnn4uPg7e7o7ePi4OH4/fzz/vr5+P/w/P32yMv3VUZBd39nYWNvaWhoaWlsbGxtY2JjY25rbGNuYmFlemR/TlhBQFncyvT94eDn5uLi5+Ts7OHg4+Pl+OX48/Dx8PXN9Mr3wtrXWUdLTUNOQkh2dUpN0NvT3lVaTEZcX1JDdHJ6YG9vbW1tbWBgY2V9cHROQ1xUzfP5+vnk+vn65OHj4eb4+/r45uDm+vj48vXx98zfVF1NTXd9cHZzcXFJSExZS317fnJ6ZGV4ZGVnYmNjY2RzcnZZ0c33//r6//37+vbI9vHPwsDB3NzR2cjM2trXW1xX2t1cTUZBd3ZMVl9dWkNAV9PN/fny8Pbz//L8zVhaV1p0TVtaXF1Mf3VDXMDz8PH8/Pb0+//3zs70wdnc08TE1VlOdU5U11BSREFHWlPWTndyf01Lf3VId3V3TkF0S1tNR09OR0BGR3V8ent2TEZZVt3awvzk4+/u7u3v7+no7+zs4fjy8PL0xt3dVFdU1VNaSkpxe2Rnf2VgZ2Rgb25iYGd4dEZT1FfT2VfX3FFdRVffW0ZRX0FOW1xQ3sXx5eXk5uDt4u7p7O3t6e/g4eDk88/KyM/I9Pz88PT1y8zS3Vp0cXt8fmZkZGNpaWxvYm5jZHtgbmJtbGJ6Z2ZleHFIcXRCUVXC8fH45eDj7+7q6urq6pXu4ubh4OTk+v3bVsbGx8TDxt1XUFBbTk1HSHB9cE5SR0deRk1eUl1RUd1QTHR3dHF4fHlkYGNnfnZ1Xd7F2Pfz//z75frm4uzs4uHh/f3x8ffC9c/38PXI9czb2snJ28HCzczQU1ZeWVtQREFOTFtBcHBHS315e3p4e3NzfHh5f3l/T1tT19r28v32+OT7+uX6/vzl5ubn5OX21kJEX1VdV19PdXt8cnVPdHR1c3dI1cHCx9FSXFHbyMPw8/vl/PLy8PfN3lZdU17U39rc39LaxszI9/bO/fP2//fNx1VFTkdT1FdFTEtDRFxTW0txemVkZ3pySnF5Z2RkckpGWVBKfXl0QFpEX9ReU13VxMvI2d3X19/Ew/X85Pjy/Pnn5uLp7uzt5fz1/fbG3tTc1k1yemVnYGZjY24UFBcRFxVpbGN5fnl5ZXBMWllF1tFU2tnK/PP2ztvb0MDM8vj1wd7CyPTy++fg5+Hh4ejo6ezn/vXJ9vLm5/nw2Fx3d09DdHlnYWkUFRUVFxcVFWpoaWJtaWsUFxdqaWxjZnJ2eX50RFle2vTz/Pjg4+Tk4e3u6JeRlpeVlOrv7e/h/v358/vl/P7PU01AREJEQ3lkY25paGhsYmxqaWxhZWdlZ2dgYmdleUtaVkB2cHZJRcXw88j3//Dl5+Tm5ebn5uXk7e7t4OTk+vH65/rx9/v6/P398MrB11hxZXh9eWZmYGBvb2BibG9iYGBhZntkbWdlZ2F6XNBFTkRRU1H18cRfU1HczfLh4+bn4+Lm5eDt7+X2//LIyMvJ1EFFUt3U3fb00UdAdGdgZHt6Y2F8e3x9cHF6e3ZdW03H9sNRU1TZ08n98/HM/eX48vv69NzQ3sz28OTh5fD19NJYXNrDXEBQXktCRFhLS1ZR3d7C/PPdUkV1emNtY2Jvb2Ntb25sbhVrbGFmZ0/W0dTF9PPz++Dj4+Dt6enu6ent5/7w8fTx+Pv029NecXp7f3pmZXl6ZXN0cH1wdEhNRN71xEdMdGRibmhvbm5jc3F2XlBBQdfB9vHx4enh5Ozp7ezqlZXq65WXlJSX6+H+9c3bVVTR01JAQ3F4ZGd/fGVncFl3S0F0fXxJW3R6fnV9Z2dnbhcTExATEBYVbmR5d0tIR8Tz9PHm7OLg7u7s6eqQkJCQkJKQkJKR6+L69NNJTlpIeX5+e2VmeHFwc3x/eXlwR3Z/ck7SQnB9d3d3cX54YWJibWJhY2FmfVZWWkVRyf385+Dj7OrqlerolZeRkJOQkZGWl+jn8cLUdn55ZXpmZXByeX90QUNXwNlfWMXaTXphZmBibWxvbmtvbW9pYmBgYXp2c3JMxcrNxc3PyfHk5u3p7+vq6+jo7+zrlOvt5OXg5c7URHJ5e3l7f354fn1le3J+c0JQXHV+d09Lcn5kZnpOWVbF3t/axNjMxdbTzPH0zcPx+fj/+/3w8eTj7e7u7e3k5eb89Pvm+f339fDx0UR0fnp7ZGd7cHRxdH57ZWRhe2RmfmZtY2ZpFWxgY352QFDYzPL+/eTk+Pj88/fA9/vn4ebn5uHi4O7r7e7v4PjxysH0wtRcREJFWdRTdHB4Ym9obmNne2V8e2R7fHt7fXJ9eXx0QXBwVtFaVNz0+ODulZXp7+/t5uT9/Pvk4unv4uzv4+Ph5vvx9MjGV1heVlhATXVDQ11QRXR5ZWFpFWpoa25iY2xubWhvYWBuFRVobGRxTVHbz/b45u3v7O3v4+fn5OT65+Hg4+Lv6pXv6JXt58He3dVV19hX39FQVVfXWXZ7Zmdmb21gbW1iZmVmYXh/ZnNBXHNgZ2ZhYXJB2vTx+uTl5P7/+/z8/+Xk5+Li7uno6Onr4umXlOL4/t1adU9Z09vewcLIxF1ERXFkbW5raW5qFWoVFGprFGtheWBoaGlraGxgZGVI3c3z//799s/Kw8TL+Ofm4ezv6Oro7OqRlu/4+vHEWE1OdUhNXNzbxVBQ1112f2VkZGNgZXp6cXZ6ZnNZ0n9sZ29pFG5lf3h0VsD09PX++P/y/v/98Pnk+eTt6Orp7JeXlOPH21pxfnxxSXFwd0FbU1Ba1FRDcHFJdn95Z2JvYGFmaWllZmNqFhYWFhZpZmZ7T1TC//v+8vDy9fTN9v318fvk4e3i7ePs6ezo587BUHR5c3Zzd3FNWE5DWdNSdHl4ZGBjYGV5eHVLfGFmdHR2eWBua2hvYGR/SV5Vz/Pn4ePv7ubz/eTn5uDs4uLi7uztleju4fTI0lhfQkRPcmV5d1pbREVKZWBnZ2Fjb29vaW9vY2FgZ2ZsahQUFBcVa2hrbHpwXNHx///h4+Hk4ePp7+bj7Ozu7uvj7eHg7P/5/PTAVtHWSEpKQVFHS0pFQ3VzcXtgYGd6ZWR4cnZ6eXN/eGdlZGBubWRken5xd3VZ9P3m7uiV6uiV6pWXlpeU6+7p7+/v6eLm+v722cv3zMDUUdNRVlXVUU58Z2ZjYGdgYmgVFRUVaW9uYm9iYm1tbWBmZmFnc3ZF2c/M8ebh4OLs7eqU6uvt4eDv4OHg+/vk4O/u7OPj4f7x8vH28vbIycVSXVlOdnhkZ2RnZX5kZWV+entkZmR5ZWBnYWNkeX1KTNTO+eHplOvp6+uVlJWUlJfp7+3h4eLs4OTl/vPz8uTh+Pb29Pf19v3xwkR1dnt6cnllY21vaWJjZX95ZWZgbG9pb2JrFGljZnNS0sX0/OTi6OqUlpTr6Ojs4uDg5fHy5+T++OTk88jG3M728vvl88n39MzK3lFHf2V5ZHl2T09yemBlfUpDTEpyeHpkY2B6f3BwWsf24OmUl5Xp6eqVlZWV7u3h+8zK//H2zdHdwPTy/PbOwdZX1trb2dFbQ3V8e397Z2JoFBVubGNsbWJtYmBkfnd2eXxycEpE1c/19Mjw5+DolZeXle/j5P7z8/TE3trHzPP45f/+yvf98//88/TYW051TndzfXt9fXh5e39+ZGNqaGxgZGV8fmV7fn9xd05GX970++Hs6Onv4uHj6JSUlerv5fDH38Lb39rQz/L74eHg5PRSSkpZ1NbTX3NnYWJiY29ubWxub2ZjbW9qFxATEWliZnJ0e2FmfHFMR9f38uft6pWVleL9wNDE8/j68vTMxdLby/D85eTn4+Lg5fLBU3xhZH11S11RR3JkZGdmYGBmYmxkeHlkY21oFhEXFWxleXd1dE3d/Obg7O/ql5CSkJfr4fZSRlTQyfHy/vvy/fjm5Pn99MzN//7OUkl7aRcXa29gZ3t5ZW5oaWsVFxcVFRVvYmxuahcTEhZrY2VzX8r89vvj4+Dg4OPm5+H78cZQdXxyXtv45uyUl5To7uH4ytxTX0Fc3Ed3fXpgaW9kckdMSV1Dd3J7ZGNtb2xtZ3dLeGdmbWxtZXTV9PHn7+/p6O7s5vvz8vvk4OH+8cza1FXb9ufj4+zt5OT330Z5YG4Vam5mZ2JjbG8VFG9menpydHJkZ2diaG5vbmB/Q9VbT090dHNC3c/9+uHj4ef4/cnb2NPfxPng4Of4/+fl9v7h7e/s4OX1VEVwZ2xoaWhuZHF9eXt4cH9+SEd1cXV1dHJzdX1lZH9IWc/l4eDk+fv/9/Hl5P7k5+bg5OTk/vjl5ufl7Ojp7Ofk5/zPwPL1yc/XUFt2emIVFxEXFhRvbWBub2JjYGBme2FkeXhwc3Z1dnZ0X9rJ5OPv7+Pm+PXcUFZbQ9DB9v7k4eH65+Pv6emVlZXp7eb9yNlU0FTR397d1tNScXhlYWFiYmd4fXllYW1jZmR5dndOXdbfzcDX0MP2+eDplJTp4uD6//n98Pb39vrk5eDt7OLs7+/p6e7v5PD00Ex2emFiYGNhZXt9dnN5Z2NsbG1vbWJpbGBjYWV/cUxT3/fx/P7+//398vH18f388MPy8Mnz+fjn4ebj4+3v6ens4+Ph5+Tk+vjOxdvVWktBTXd+cUlFX050SnRyfHlyfHN6e2Vlc3F2QlXB8v3h4OHg5+fk+f7wz8zI+frz9Pf98fP64O/v7urp7+7t4uX/9sHE397dWnZ4emdhZ2ZhZmd+d2VnZmZhYGBjYWdkfHFwcnBAUNPAwPTz9/nl8/b1wdNQ1lNc0Mrz/fD2/f7k4+3t7+/v6ezh5Pz1V0dfXkFdUNHfU0dOdnZKfX1OW0REdXNzfHp7cXZzdElE1t/Cyc7L9PH3ycvx/f788/32y9rQ38DNyvP38f7l+Pn8+f3O9PT129TWXXd7Z2Zjb21nZ2R7eWRvaGhsbGJhZmdmZX5lemZhZ2R5TN/H2MH0xVxYR1nU18r2ysn38MjDxcfEx8rl5Pr5+/7AVlxX0VFUxcfUVlVQR3F/f2V6cEJMcHxzfWdgZnh8eXtye2V9cH1lZXJ0dEbL8M3JyPfO0d7MzczNyMPbzsj29vfy/P308v/w9sDH3FBOT09JSnxyfH98fHp6e3thYm9tYW1iYGJvbmxmY2RleXhnZ2d7fnJ1SHdxcURTU9DWUVlHRVfVwPT///D+5+Hh5Ob7ysbW0tTR28fH29jX0cr3z9deXdRSfWVxRk5zZHh0TEhwemdkemZhZHZQRHVJ2vPO2M3P9PDNw97EzcXWQUFWUtnO+eDh+vzk5/j+9t3DwvfH3MLZ0FhBQnVwS0xAX3R/ZWRgYmdnYWdmZGZhZGRnZWdkZ3hFVNdSWlhTWHZ0WFxETlhcUFXWxsb18ff0/+Hi4Obm5+fy8Pn6+uXk+/3y8vz32d/UWENd0t7e0FxGXkhNSnRDSXZwSERbUUdBVFJVwPTz9vbD3MPD0FNd0d3SXVHN9fP7+vj45eTh7eLm5/z28snN3tLAVFBbQUJ2dUl1dXZxS0FZdElNcHJ7ZX9lZ3l/f39yS0t1T01CT1lR08VX2dJZX1NT1lBd3tjBxsnx8fvk5ebk5+Dg4+3u7eDm5Pv7/PDyy97c3dvbwMv1wcL28cvC31NeT3R3QFZaWFxDR1PRx8z39MnJw8DB1FdQWER3cUhaxcn2/PHz8PPy/f3x8vfz+/Hw/vPI0Nfe1V1cXERYVFNc1NNYSEtKdHF1fX97ZmdhYGBjZnp5eH53SlzT0tFcWkNxSU1LS05aXV7Q9/Pl4Ozs75WUl5GWlpaXl5SV6u/t4P/L3ldX38fMz8/29/X2yt7SU1leS3Rzc3F5ZmNiYmxjZmR5enZ1cnNyf3t/c3RH0M/I9/Hz/P775uHn+Pr65uDi7+H6+P7z9vPz/Pj9/P3O2tFfRkp9e2Z4f35/e2ZjbW9paG1gZWdlfnl9d0pzfmV7c0pwS090dVjR1t/L/ubs7uqVlZeQkJGXl5eUlOvp4/nLztvR1NLR2tvcyfXMwcxXWElLcHhlYGJvFRYWFxYWFWtsb21nYWBkZGdkZXFaV8H28fH18fn+8vfz8vP/++X65Ob4//H28v745ebl5fvy88nGxl1Mdnl7emVlZm9rFRUVamhtZHt+fH99fHlzfHl4f395ent+c3x+c09GXcL74Obj7+rr7urp7eLh5P/AxdxZcnF1fHtwQltCQ15QXFhSWU53dHF5ZmBmbhcRFhQXFWN6cHx+eXl9d09BX1JW0sfO9/fM39LYzvTx8/L9ytvf29/Y09fW2PTy9vf5/cBd19raUV5V29VeQnNyc3N7YGBnentnend1WF1cVtDBwtzUXFtZT3dxc398cHB4fXdOR9b2/fH++vrk+v/D29d0f2VkY25sbGBnZH52dElWzvfw/vr58cPWRnNlYWxuaGBnYmJmf3dOREVfUsjl4+3m5Pjx9vbI09HcVF7Tz8bTwNpV3djF9//++vz7//zzzszaxdrE9fXEwcLUU15dXUJBQ3N4fXhyfXdaQV5VwPfO0t7fVFNYWkNxdHZ3ZGd7Znh9SFtHVsL29vP/88rLwcXfUk5Od3x4fH1xdHZxcUPa9/7m5Pn7+//89N5UREdKf3p+f3BIS3V1cU7D8vL/5eDi4OPg5fP1y8Lf297X3NnE2trBzfD/5+3o6urr6Ozh4Of88PHNxd1fUkJJQkFFXkROR1laWEZCdXFNT0BaWFhIdHx9dn1nZ3p5fn94eXJ/cnZ2d17V3/H/+ubl+eX9ysjy9dzWXUl9fHplf3FFxPHw5Ozu6evo7uD6/PTN0FxJf2V7fX1xd0tGTFb18OXm4OLv7+Ps4uPm+v/2zcLE19fS0tXawPX95OTm5uHh4uzj+vDN2dReU0JxfmFmeX95ZGRkYWd7ZmdkZmFmZXt+cXd2Qkp0QklNT09RW9bUW93c2dvQVlTZyfzk+v/+8f388v7z9MLa11NNdnlnZGR7f3ZCRN3A/Of7++Tl5OXl8NNQTXZ/f3NxdkLS2s308Ofj4+6V6u/s7e3s4+fw3lRYREhbXkVfQlPHxsf1/f35//3339NSdXB6YG9rahQXFxVubWNmemdgZnp0QkFXXE9IXFBbUFBVXU9OXlDXwtjaz8Px8vb55fv65efn4+bl5P7y/PDN29BST3d9emd4emBjZX1K1MDO9P/4+ODi7e/h5P3L2FBPQkt3cXB2TkVdVNr0/Ofj7uno6+no7Of8zlJKZWBnYWBtbGxtb29me0BXUN7e0tJcRU54Z2BsbG9sb2JgY2BhYWd4fHF0R1xY0MDc0dHEyM7Lz93XUkTV9fH39M7B2sPAzvzk///9//bBwcL18ffOwtzUUljW0FlCSUlFXFJGW1TWzPfx8/f2+fn9+PfYVVRCd1lQSERVXNPY2djaxd3fwffKyNvS1E92fGFiY29pbm5rFRQXaGNhe0faz/D58fX0wdVQVl9wYWZjZnphZ2dmZHtNUsDB2fb18vvM9PHAx9nGxlBdT05JSEJXUNXdwvbz8PTw8vjg5uTh+fLw9v3xz9rfwcXWXFt0fHtlen97enNN3Pf38Pfn4Pnk4P7K30RIcWVhY29uaG5jZmFkZX5EUU9E0NDAyMTWWXVwcH1kZWRjbWJtZmVleHxyUvf9+fv45eX+8MrfV15SWU5zcmVge3Fzd0FTXFnRwsTexMD08/bKzMfS3M/F3dPQ1Mb/5eHm5uHn4uno6Onj5eXl8d5RRU1JSFhYR9TX1NvfUEVPdHZNR1BdTnZxT9RAcHpnZGZmYWNsaBVqbWNiZnxB2fX/5efh5f/h5vD13FladHx4Z2RkZnlMRVbSx/bl5uPv7u/j4u/j+srRRnBkYWBhY2BncE9EU1Ha8fvk4+/p7OHj4+b69vf98srDysbc39bWyfHw9fH4//zk6JaR6uzu6e37911JREl6bGoUFWhvb2gUamN5cXJzdE1FVll1dHVMSnF9eHxzfXB7ZX9xS3VF1vf/+ufk5+Dg4OPh+PfBwddAdHx8cX1xQVNWX9PO8f/z/eXm4Ob6/cDb1FlYQVhZSVxSU9LN8PP45ODu6+7p6eDk8vXFVVJNc3dMQUZY0sDx/uXh4uLg4uDm5P/3z9FbeGZnYWgVFBYXFxEQF2tpbWFjfk1aVMb2ys3A2txc1UZ1TX5ne3t4f3NMR1vTyvHk5uHs7uzj7uzm+vLxwt9Rc3JxeXtkZ35IQE1Uwf//5e3s7+no7u3g4Ofy9sRSXkNOXkFMRlBeW9DG/f/65OT45+Dg4fvyy95RW0txcnhkYWZkZGR5fUpDQlzRWU5SVFNOc3F6e3lmYmxmZ2FlfHNxcXVOQU5DUtVR0/39xsLMxNPBw1VVUVxAS1rRx8XayPDk+Ofh5OTl5fPJw9rY3VVSWVnV11Tc2NvLzPfk5eXh4eT75OX7+/nwysPcUVhMdXRKT1v08vLy//3w5eDn/v3EX0NLfGZtbhUXFxERFWpqbm9oaWxkc0zD9vb8+Pj+//P1w9BFQnx7Z2FhYGF5cnFKTFLQ2vb1wsnDxtjSyvLOx8bQVEdEX3Rxcn92Xk1H3ML0++Hg6JeU6Ojp4+b6/9NUXUtKRl9PdndMdUfT3sfx8/37+ufh4+Lj5vvI0VZYTHB5YG1sbWV/fnxye3p7fnBzf2Rsb25oaG9tb2JkZ3l3dXZ2dn95cU9JQFTQ3czw8/X++/P2xd/R39FMSnZyc1pX1tnb39nFz9lUX3V2SkZc2cDD9fHz9/L5+fj7/P3//fz45ubm4eHk5OT+9NhCcnxxdndLTk1e0dzT3svA9fDz8cjcVdBaT3VOSntnY2xvb29rFWhobm1gZHFS08PI9fTx+ffF1E1xe2dnY2FgY2d7cURXV1RZUtTd9fD2yPX39/34+Pr69MnLwtlcQkhweWdncVBRwPf1/OXm4eDs4ufl+vvy+Pv998TVUdVUXkNJdXVTwcby5+fh4+Ph7e3j+vTNXHZ5Z2dnZ2BibGxtZ3h8cnNkY2Zkf3hlfnB3SlVeT1NQW1tW1HV6ZHNbxsVfQklTyv7l9dxdUN3WVHV5c0RSUk1/ZXVU1lVTUFzR3tnH1lXawv3n4ezv7Ozt4ODm5Pj1zcv18vv/987N2dRXUtbZ0sDbwsDEzMjNy/TFzPD09vH2zMD0x8DxzcXa2VFFdGVhbWlqFRQWFhQVa2liZ0vDyMj19fT02vX83VJcSFtbdXV1W1xCTF1UU9LeyPPz8/f39s3E9v729/Tc09VAcXJ0S354cnxyQVHY9PX3/Pjm4O3rlOrr6+iUlOnm//XBV9XeUV5V0NnNycveyMrJ9/Ln4+Hk+Pb32kVZUkJPdnNxfmVlYW1ibGhsZX1wQ0dwRlNF0sdXT0lxeH54ZWdmZGdlS9HXV9zEwNvP9M/29/D7+crRV0F2dnFIR9HY19DS2trc1MXPzMjK9v37+vj898rBwfP6/v/z8PPz9MjC1lxc28bA9/3//+Tk5+Hh+v77//fKyffwzdJR1NRFQltEdHllZ3t2fGFib2lub21gZmRkeHRDU97b2d1WUdv1yNtRXURfUElNW1tMdnFydkxc11FTU1LSxdjbw8dU1N/L8ff2xNNcdEhKSE52dELcz/fx9v/65+Dv6ujp7+zi5vzO01FLdnN/cnd2S1pNR11V3sLy5+Hh4eHs7uHk+v7x9MrEUEp5YWBgb25ub2xtbW1iZ2BiY2RxS0N2cHVzcEpOSnR3SkZHXV1ORVFRVtfB28XBwvfN3lFcR0pBQUlyc0dFXFlIdHF3TE9Z3tNSR1TJ/fD8//v7/P/64ePh5P/88cPeV9XXWVtU2cH38PHy9fb12MDEVFZFRFxcQUVBSE9E0MXd3tJRR3RBSkt0fH56ZGBgbWFgYWR7dnVHXlFU2VdU31VXW0t3dn9lZHp9ZGZ4cHVf3NLb0NTNws3w9s3E1N/E2FHXWX1ycndATHRIdkxaVdDW39j08eTm5eXn4Of65OT49MfG1lde1NnU3d/W1ldR0tbc9PP18OTj4+Dm5P7KyszWXUpzemxoFRQWFhcUFRVsYWdyTkNeU8T08fb39fT239BXUNVBS3Z1TU9MWF9WVsfx9MbT01FHdnJxcXZxdUxARkFf09RXV1DYyvTz+fbLx9PBzNvAyPT/+vz8+/rl8PP5ys3A2d/bwcXG39bW0MXEw/by//n6/f7l5fjy+Pzxw1VZWF1GWEpxdnV3dn5gZmdmZGdgZmZjY2NgZ2VkfXFKVs7y8PPxyPfy/fLy/fbx9M3d0t1WRkNSXVHHyfX29/fIy8Da1tJaf3FyfnZzcHZ3dULb8PP28fj65OPt6ZWV6ePl8PDz9dBcUEdGQEhPSFrW19LN9v3l5eXn+vD/+ffw9sj38PfH11JcdXx/eXpgYm1sbWJgZHh8ckhGXt3Yxsj09sfXUFRWUUNwe2FtZmV8SktE1MXFyfT2/f365+bj5vj0wt9fRkFLdXR1S1pX1MD1/P3y8fX19crbVtRXUt3ezPfNxsH3yvX38v71yPf9/fDPw9jX2/TJyMFU3d3axNJXV93R3tLU0VdRUVtxZmJiYmNgZntnZGZ6c3NPfX9CTFzW11JdXF/XzPfY3NDdwM/2zNfBUXVW0FZPdnZ7e3lzd05NTF3cxNDRwc/K8Mz19vXB9PzFVFZ1S13G29LI8fj64+nu4vj/+/z3xdJNfmFubWRnZn5P38/L8f/+5ODj7+zg4OH4xtdbdUl0cHthbRUXFGhpb2dkZ3hydHVJdnlzfU9V3ddfUlZVXNnL3tZcQV5aVVVcWkp0cFvc0trG2MH0yPbyyMTXREJPdHF4YWJhZ2d9dUdd09nTxc7z/+Tj4+Lp6O7s4//B3VFFSFpeRUJcXlHB9vLyysj0zt1TX1l2eHt7e3NDT05Z3cb08/LJxNLdX3V0fGRjYmBva2hrbGlrYmR8SlPcyvfy5Ofk+v3EVFdMfHFPSHRARkJSVNbSxsnOwcD1yt7QRUlcR0NT0lVXx8PBycnf3szfV1nW10ZEUNnYxszK8f7z9v39/fz5+fv4/PXI9/XbV9HXUl/R2Nr3/fn+5+Dh4ODk883fXk59Y2oXERMQFhRrbmFkcl3ezPT98/X08PPKxcXXUVdDQ0VMeXp5cnFIUtbN8/L29PLxyvXB1F1bdXJMQnFwcXVNU8Tz/vnxxc79991Q19HUVd/K9/H/5OHg4Obh5/DA2czHXUhyd0tye35M1VdU3NDb8fD44O/u4OXk+/j//PDG2F9Y1Vl1SnF+f3xwcHh6ZGFkZ2xrFWprbGZ9dVbB9P/74u/v7+3m5f/02tNST3V/ZmBgYWR5S11ZXdfYx/T+/v/99MvDwdFHSXJyfH1+e3dwdtPz+ubi7O/t4u3n+/nz9MDEV9TF2tvYVFPQ28fLwsTEVFTW28/N2tVQUdHMyMrAx8nI9M7YUFdQQkBDdEpze2R4cnJ9fXdKT0Bb197Ozsv33l5PdHB9f3p7eX9JXdPT0cf3+uHi7ef7/drWU0t8Z2BgZ3t/d0lDdEhXxvT08PP28vP+/P/xxMXZ11NfXdXF3t7ayPn9/uT7+f/wzsbA21BBTUpCWFxUVdTfy//5+/ry8/TC21pLfmZjYm1sY2NsaW5jZXJxdFbCwcPz/Pjk5fr+//P1ysLOxdfRX1hdR1lNcHFwfnh/ZWVkfn12Q0Fb1NLbyvz65uDl/MnA2ll0cHJ4ZGR5c3F1RVPVyf7h4+Lv7Obm5PD1w1dbXH9mYGNkfn1wcUHRz/f84ODt4+Hh8vrxyfTc1Ed2fkp0ZWBsYXp7eGRjbW1jYWdkYWZ6cXV9dkpCVvT/8/374eDk8sT18vn1WFhd3VdzcFpddXxydkl3fXZ1QkN0dEpIc3JOWFld3drY08Dx+ufk+PP1zsb3/PTNx9VRXVFYSUJDdUJU28XewszY2dVeUFhOQVlYW11fWUVeU17Tyc7MwMDb01ZRR0p2eWVnYWZnZWVlfnl5dlpd08XaxdzC8PfOwtpWW0F2Skh2fGV8Sl5U3d7ZycvN9Pz98f32zfb3yt1XR3Z3dElIcU9LfHBxdk1MTVpR18f2++T65+T4+f79ycvIzsvT39hSSXB3dXJzSU9OWVjQzfb//fLy9ffKxsHDVnd1dnN5Z2ZhYGZhY2B4fXBAX9De0NHYx8D28vv4/vr89/TLwN1EW0ZNQU1JS0tNdH9+cnx4eHdaVNHU09rC8/n5+vrm5/vl5fzLzMLDwM/b11NYRVpfWFbU1lTTzMbS1dHc3Mn1zcDA39PdV0RPSkhBXtXdzvTPx9vG2sTK9/bKysFRXFtfRU51c3J+f3t+f2VmYGB6fnJ3QNbbwM7y/v///Prk5uT998HfVNXX11FHTUFGQE11d3Nyc3RNXN7e3FZFRltX19VfU9fX09TX3tzZwPf/++Xk5OT4+/j5+/r/9vXOzNnXUERNdHF0cnJ1dnNzdkhe19rLzMv09vXD29FSTE9ZUlNUUkB3fH1wcUp1cnx+fHJ9c3dOTUZUxsz2/PL0wMXBzc3N2tjc39BeV1dTRk5Z19dX111GS05R2MP09/f09PH1wdBXWnd0QkVEXF1aTktAQUfV2dvGz/fx8PL9//Ly+ubh5ub+ztLVXFpZRU10cEtaX1FRUl5EVt/T3dnRWE9BX1xQV1FQWUdOcXlmYGJsbWFnZXxJTUbSy/3k4+Lg5+T6//31xtZfQkxbXV5cT35/c3F2dUxNQUVQVNHf39PS2sTNzMDNxtbX3sbHxcfBz8HGwd/Z31ZdWVtW3cTOytnV0t7awsnD2VdfREBFQUhJRlndyPHz/ffP9fD3zsLMxNHX1FFeRU9yfHh6enp4fnthYGZnenJJWF9cWFffw8nCx9rA9Pby+f/0wPXx9vTOwtFTWEdLdHF4fHB0RllQ1NRVXFfQ19be9Pf19cjH399VUV1cV1fcwMLM0tbEy/H95fr48/T0zMLQR3R9f3xwSUBGTk5EXNRWV9DWV1lYR1heWlbZzczO9crD0lFeQEpzf3tlZGd6fnBMRllX0dvI/Pv78MzD2NLfwcHE3tbUV1FTWkt2cX19cUpGX1/Szc/AzsLG2djG39fR0dVW09/d3MXGxdvb297c39ze0tVUUV9b1NxX1trY2MTHxdZfWFpGVtbSw8fHz/fJwsDXXURAR01aU1lHWF1YW1xfXkZCSnF9e3h7en58cn1xT1tcUt/excnCzs3GzcDBzPf39/H28//+//LJ0l1ZUV1CQ0t1dUpFRkZcW1nU0trAy/XLzcnI0F5HQkZBTUNHRkRER1pZXVBQ0MXO9/Dz9vTJwdjQ1tHX29vQ3NfX2N7d39nR3dbX0NHd09LV1t3VUklxcXx/eGVnZmV+fnhzSHdIX1TX3MPOy/b0ysj09cj19vz9/PLx9vD32dBWQUFHTEl3SEFMdUxARkBMTVpS0NvbxMbDwd7d3dDV1d/c397awcPDzM3CwN7T01RRW0BaRUdESXVEUNba9/L8/vrk+v32xUZyf3pke3h5fnNJRl/W19zDwsHNzNrWXUl2c3N2dU5BUNTd2N7fxs7Pyc7Ext/VVNVW1dHX09lRX0JLTE1HQVxSU9Te2NdRUUxMQVtf0cHI9PT0ysL29vXx/Pj99cbY1tPUW15cW1dW3cbAy/D3wdrcUFhNdXZxdHByd0NBUtVQX0VGX1HW2ML18/T08cnMzMXd0ldZT0hATEpBQk5bV9TT2MzLyvf321NBdn56ZWdne3xzdFLf2MLIxsbKzdrF2NJU1FdWUlTW0sfPzvH//fPz//788vfF1lJAT0BGRFtdUFdZX1JaRV5BWFfXVFfX1UZNX0ZCWFPQzfP6+uXl+PP99szPwdBTTXF/cnd1TERZXFZUVFZdVtdcW1tAdHJ4emV7eXJ2SUFf3tvX1tfU3djDy/D+/fHw8M7d1lZETE1CSEpMT1rX3drCz8jNwM7Aws3E29vT1FRRXkZMRVNdVdje3dNUQEp0c3BydEtF2MXGyMjPwsn09PP+/vn65eTk5f/3wdrdV0RCdXR0cU9DRkd1d3J6ZGRkYWZmZ2V+c3x+cXRD1PT+5efn5fn588DdU0FBW15d0d3HzPTx9vb3w9/X3NBU11RWUFJSR0l1c3Nyf3N3dHZxdHd0S0hCWdXbx8vy8vT09sjaw/fz/OXk5eHj4ebn+/LJ29BWXFlERl5ZXlFfQ3VwdnVxdEl3SklIS093cHJ6fnB1VlVV0FFdUFxFWFHR28bIycL0ytrf2tdWXUFBQFLfxfTy/P31w9dEd3lnYGFhZ31xdnZ1SkpCXNPN8vj4+uX/98/ZVNfdx8LM9c70/f3+/vzLx99RUlBcQU9S0d3F31dbQUFOQlPd2MDK8PbP2150fnp9dkBZR1BRUlheVlHX19bQ1t5VWF1SWF1eQE91d3Z3Ql/Xxc7DxMXf0NBQW0dMSUpNWlxAdn1nZGVlfUpb0cfI8vHNwsj09fX0ycnOwM7x+/r6+//w9ffK9fTLzsPG00ROd3N8cnd2dUZfVNLZ0lZGTElAXFfR2cHF09/R1N/Zw8DPysPM9PL9/uX58dtfT3xnY2B7fXN1Qk9LSUBBQERBQklKSnF9f2dib21menN1WNnO9/L65frk5eX6///2yPH++uHi4eTzz99WWUdGXNDV19FSWk1zc3d3cXJ2QkdAXFVdX1hFVtLG9PH9/fXO9fTKy8LBwd9SUtfZxsLx8vbN011NcH9+cnVPTFpYWl1SUl5HQE9KQ0RHWUF0cXJ5ZHp7eH5zSE9AUdfe9/Py/////vnl5uHh4fr/9NdETXR0TVjX093Y39/Bw9rZ3lNBTU9ER0xPdUxMTkNbWF7dx9jEyPTIw/XC0lVQRUVd0c308fLw8/HJwNlX0cLG2dnd1VFbUVRdQHdyfXl5fXJ8fH9ycXJ8fmVleXlxWFTQ2cD29/TK9Pfw/OTj7eDm5fz33V5DdHd1S0NGQUZFRF/R2sXQV1RdXVxEQEBPSExPTU5OQ1zWxPTy5fr/+Pvz99rR3VbR29jE2NHV1VpBWkRfVtbYxsTPwd3a3lhJcXN9f312dnFISk5MSk5EQkhGU9Tf2sPFxc3G2Nje287y+fn4+vj+/cne1110fHZKdElMQUJMWl5GTkhITFlYW1lERUh0SE5MQ09b18TK/f78+fzy/vfKysnNzdvEwtra29DUX0ZBdXVAWVLe2N/Bw8bVQENKd3F0dnB0SUxNTEFISVpFX9308/Px8/HKy99SV9bS2cPJyMj18fXNwd3WXEReUldTXUFPR1lYQU91Sk1EQE9GQ0h0Tl9eRk9LS0JS0dvAxMTG9fXE3NrNxdPHyPfxyMTF3lRETUNMTljXxc3DzcnA1VNVVNRfR0N3dn18cnNzfHF0d01R39Pa9PXx/ffMwM/18fD8/fL5+//y8vHN2dBU0NDeVltFS3R9eWVnenlwcn1yfXF2dEdR0VRQUNHHzMrPy83P9MHT1tfQ3N7f3sXD9cPHwd/WX0dDT0xAXkVaV9DUQ3VKT0RfQUpCTUtCRUdMd3F3cUtaV9vCwcn95fn3yvDx8P/7+fj//f7998vD2NBR1dza3tVfU9VcTUp2cH1zdHB/cH1ycHVJQ19cXl3bzc/29sr39c3TUl9RXVTVWV/Q3NDQ3tjW1dRRXVdQXl1ZRVbR0kVOQERDQUJKTk90SktNd3l+fHl9T1pV3dLE9fXLxMHw8vD75+fn5+X48vDJ2N/RUlbe3FVSUddWX1xaR1tBTkZeRUVcUFhNQ0BMSEBc1NnFxsr1zcTf1ldU19LT1dfSxsLH397Y0FZcVddTX1hbXVBdXEN2fXhlZWRlcXRKTkxCT3V0dHVbV9bAzMz19cjIwMXIycnIyvH+/P398PH0zMPQVdbWUVZTUNzS1F1FR0B0S0Vf1sbF2N7WUVpBRU9GVt3FxsPDzsPExMb1ys3PzMLGw9hUX1TWVNRSRkNHQUBGXlHW0dVTW0Jwe399cnRNSHJ9fGVkZWdkfExb1MHPy/XIycnw/fLw8fL9/Pzxysr29/X1wt/T2d3R38fE3VBGS3FyfXxLXdba2N3W0VFaQE9NR1fE2NrH2sfY2sPK8fPw9vz5/v7zys739MDdVEx9eXJ+fHNxcXx9f3xzcHNxRdHQ1ldcTUl0c31/eHx1R1bT3MDa1tvC9/D1z8/Dzs7NzPTL9fTAwN9U0tLWxcr0yd9fQXFycUtAU9Pc011SUF9TQXRLW1Tfz/b3zMfF09HYx8HM9fX0/fzxy8rw8vz99d5UVl9ZUdVZT3RxfmV/fX9zd0RfRk91dnJzf3tlZmR+fXRAU1VTUdfW2/f08P78+ufn5/r4/vfMxtZEU11DW1XY0FhfRHZ3dXZD1dLY3dnZ1dHF1l5aQURW0djDwvTN28bF38Xc08P08Pzy8/DNwM/Gxt5WUlNeWNXRVk5xcXxycXZOQFDU0dfRU0BBTEt3cXN7enl5ck9DS09KQ1he0drN8/z55eTk+v309c3ZxdfX0lDX01RWRHdOTHF3WtbaxMTPzsLJ2tLXQUlBRlxX1dzSVNHXVNFUXVTb9fL/+vr//fbIysrDxsXe3tvY1kVOdH1/f3xycndCTEFYQUxNdnNzcXJ4e310SFlV0NrY3Nvf2sDP8fnz//v88vb1y8HZ0dRSUFJGQUpPRklLdnFxd0ZW3dfawsHPyfTKwNFDRl5V38TD3Nbf3NddV1JT2Mvy/OXl8vb19vbxyFRXVFBeRkx2fXx8f3h9dkpCRkVeXFZfQkJNTkhxeH5wdUpLWlPV1VXX3sTD8PPy/vv4/vD09vf1ztJR1tjQWUBYX1pcWk9CSHVDQVNUV9Pe1t719MRUWV9d0NpVX9VTX1NeWVlaXdbXyv/8/fDw8/Hx8vbZ0t/e3llbW09Idn99cX95cnBNQEZeQUxDT3dzfXt4fXBwZXFFQFjVxMHO9/34/OXl+/v98/z5883Mz8La3NZHWFZSVFJaQU92cHd1W11YXVzTzcDd1NbU0dHZ31TR2d/FzdjdxdPX28n1yML09cz29snOzcDbVV5ZdHB3eHl3c3xzc0pJRFdSQF5FSUROdnF9cHN7eHx+ckhG1cHFwMrL8/L+/vPK9PXK8vbO9vf29cPA3lZXVF5V01JfXkVZXtHTXFtTUdbGycbHxs7QU9NUXERbUF5QXV5bXtHbyvbx8fb8//Ly8PH19cXR0lZaSXZ3cXN9c3NzdnZIcX98eHh6eXx+f3JxeX5zc3RPU9zY9/b08Pnl+Pr6/PH38fTKys7BwcPY1FBUW0xFXFNdXEdMRkdCQV9YWdHGzvHw/P3x9cfc19RXVNFU1NVTX1PZ2tvB9c/HyMfGzMbD0tnYVERZXHV0dnZNdUtPTFhBd3dKc39zc3RKdkJ1dHd+eH9xd0RSVMTZz/P9///y8fXBwcTYwszN9vT38cLZ3tNRUlpc11NSUF9ZQkpISUBR0NnK9/X39c7HUVhfUVFSXV1dWV3dwvb3yvH98/3x9vb39ff99sjYV1FaS3NydnN9cEp1cX15e3tlenh7f3l6eXd9eX9yd0xf3dzN9PT/5Ofn+//w9cDJycHJyPfw8vP03tNUWlpcRlfUW1hDdU5KcHRFU9nAyf338fDMwNpUV93R1tlX0dBf0cXM9cPEzsnLyszN9sj08MnA3lJcR3V2dHZxd3F0SE51cnxxcXB2d3B2dHBzfXxyfnl8cUleUFzdyvD+5eXwyMzAwsvw8f34+fn/8vDBXkRTW0VcX1JFQVpCSHV3QVDWwcvO8PPPwsHc09RfW1tRVEdaV9LbwfTNwMf198jw8PDy/fzx8/bP0llFRl9Hd3B9cnByfHt6ZGV+fnllfn96emVwdnx9fXZPV1NSxMz8+uTn+P799crx8vL58vDy9PH10Ft0dnR3d3d0d3V3SkJLW1Xdz/f9++T7+P3098zY3VZRVFtbUFPczcbBxtPd2sfA2trA29Lc3NvfUFJcQF5UX0RGRF9WWFpBSUpKT0t2d3Z+e3h6cnF8e2V/c3B2SVzXxff28fP2w8/1z/X9/Pzz8/3w98PXWUdOSUhOR1pHRkJaXVXe9ff08v758/Dwzd7b0EdPSH1ydnVY0sDPwcvKz/Xy8Pf28fzxy/TC3dvdUFTWV9ZZTUxNQnd/fXJ/c3B/fnpkZWZneHl8dHN5fXN0S0ZUzfzl+/j6/vbw9vfw/f/99vfLwdjTXk1DTHdyc3dLTkl3dUBY1cbJ8PD8+P38+f3wzNnXW3Rxc3BMRdzLzvTOx87LyPXKwc/H3d7S0dZZX1RSVtPUU19FUVRTVkdPR0xLSkhzf3hke35ycXh6Z2BkeX13W9DP9PHy8vPw9PT28P398ffMz/bG19zUV9dYR0xMQUt0TUdb1MXN9/Xz8vT0ys/39VZHTEp0fXJ3TVzWxcD39ffz9v3//f/9zsLF3MXcVtXT3Nrd0dRdWk9JT0h2SEhwc358f2RkZXh5fH96ZGZkZGVwT1zfwPX39vL8/f/5/fj7+fz2/fTAwtxUVNZdQUlCXkxCW0NDWVPT2szIyPTx9vTy9sLFXl9QREZAX1bU18fPzffLyPD39ffB3tFE1dBYXdZd0dhX01ZU01pb09Rc1VlFX3VKcHp/eGR+emdlZGZnZmF6en9Kd1zf3vfx8fvk+uX58fL39ffLzMjAxcPZ39xT0NVf2d7S2tzW3sHAwMbBzsXExNRURU9EQk5EWFlQXlPYw/Tw//n6+/7y9M7H29NSXFZR1dXX09bQV19cWk1MQkpLcXBwfmV6eHp7Z2ZkZ3p7ZXxzcHFxd1hd1PXz8/r65OXy8/H18PbMysvHxt/V0V1XVEdH0dDU2NLGysXPzMz3yPTx9MDa29jeUERWVlZYdVpWUdbay/3yy87E3NRFU9dWRl3b3tJX0NjYw9/cyMbTVNfc1l1BSXB5eGRnZmFjbGFkZmdkZXl7ZXpwSEdUyPzl5OX5/vz09ff38vH18/LKz9vcxsXSVNjG0tPC9vXKytrOwtbVVdZXR1vU115FWkBCTU9LW9jezfnk5fj/9vfI3trGwNjR38fH0FFRVldV0NRXUUZBXFlZREp/eHlnZ2dhY21hZ2R+eXx+fHB0Tlnc2Mzw/f7+//DKz87Mw87L2trF2cdRV9DV01DS39rCzPH9+f7w/Mvewsfe2t7TxM3Q2lVIREBKd0BR08fG9Mr19NjSUlnR2NrHzsL2wFLfVlHV1VfFzt3FxlXFxtBST31keHphYWBjY2FjY2ZmZGFhenZNRdTfz/38//7+zM/39ffO9vTz99/Dxd7J01fdzMXE99rM+//x8fXS1VFeQ0paQFxXUMPVUNZ1SkncW9f33vD78/7OwttWVtbP0MfxzsfR1lpDWEpHVNBW19VQ3tBXV3RPcnJnZ2RvYWZiZmBmZGVkZnRxT9VU2fT+8/D8ycv298PCw8PIxdLURdFeQNTTz8DMwtjK8Pj5+v73/PfM3lBdX9NcV8XfwlVPXlNeW9HS2fb18/HPycDRUlfY2tvL9MXe21dcRVtDXsXRUVLPwFLG31dQWnB5c2ZtYmJgY21tbGJsbGJmeXx0XfXx9fP18fTDzf/+zvf7//H09d1f0NFdxvPLxPX2yMr7/cr6/M7O/lRK1kp9Ul9G0txKV9R/UsFH2v3L/fvK8PDQyPRWx/Hexs7LzVxc0Up10k1N2tRBWsTeX17bXXbQSGd5eG5ofmZpZ2RtZmZtfkp7Wchfy/vdzPPW2vbM8v7Y9/nGzcTW1kFf2FfG5cDd8cnN9uf7z/Dh8djlw3RX03J2xlN3WkV+cV9bxsldyfrTyPtS1vNTVvDb8fvXzfJZU95cX0NV8t9X/l9M8NpEWMHadXdNZGJkbWliYWJuYGcVbXlmckRd1sXwwFTCw0XB98zw+Ofz8eXGVfxRccLNx8vz/dzW+8ta5eTU8ePDW83MdnbcR3TawH1z1ER+1v3WUef4W/PkXEX5z3XO5sHP5cZNw95xSt9OQ8zdXtPaU1vXV3dQzUN2WXJsZX9paXB5FWd1aWhOdWxB9lhb5cxx3/lJdOf+X/vuz87gx0zI9XPV5cPf5P/b+ubF9OPwyefnzfTwR0PG131U9HB+UXVlVtJ2VeTdXv/AdVnKSVn+ydbk4MXN/dZMx9Z32PBdRPbaT9v1TkDNQXbCxWZ3U2NudH5rZHYVFHxtFH1cYHL8003y9nNS5FNN4+ZV5+jWUeHDecn/ddbv9V/j4NTn7tLO7vDV5+RB3vhDc/TYe97+e2TyXWfN5UhX7vR8+fxmTeVEfeD5SOXgdFbgUWTwwXrC/n53/kxh/N9sUfZhcfN6YM1/FEpIF2RdFBZaYhFBUWtJ5n1z4Nxm8OV60e7FWen5e/DjeUvhQnrg+3P561bKlPNS6+Nb4OhEz+5AceRQZvP0bUrwZXzlWHrk5XbO5n12/E1n9PN2yuNXW+D0Sf72e9HmTHHn12Tw92BE83p+8kJh9cVifV1ubUdmF2VmEGB3am/eTGHDymXQ5U915/FG4ONC8+JeRubWZPDzcczmU83p/lfh5lP77NTN7vVE5PR7y/x/SPFxZ8raZ1f5TUbn3n70w2VZ9kxS4P5Z8ubV3uHbTP/9T8HkTUb+X3hQUmd2w0p/y9B5X19iZF9iaHNkFWFzaGl2fmZQ039Y9Fhb9spf+uRTxeTTTPHAfcX/dEbnxkjn4lHK7cDR4/rT5ezAwuHES/PwcET1dH7GUHvR9HVf/ld8wdp/WfNCW+DxWPnnXNrk1F3l8kzO5E9L8l1nTVhhdsF3fc3Rf1rSZHpTZmt8fhVgcBVrfXpjQd56dfJcdP75WvDhV9f/xXTe3nhE/lx3/vlI8eBT2+3/UOfswfXu/lz45UTS51J9w8t8ScZKc8rFed/7cnP+VHrM+nXR5sRC5eVy3+dU1uL2dfzkd1vwdmfcVmdG8HFw/lFgX8ZkZlhkFGRIaxR4Yxd7WGxlyF9lzf9Bz+7CRuT4fNL+fXryw3H05UTQ7P9K8+3aze74X+HvVcbsx0Dl+n9b/HR+99ZgX/t9cPxUc/X3f1v/VEz++kHB41R3881x8uLf3eH/TMX7c3jyUWJb8Wd781htRctlYtFzFnhRFBdNYxBkRG5g9lBnwuR3QO7wdPrgWln6U2Pb+X9K4cZ45ONNx+n2W+3sW/aV9EPi4UD16NZ++PFlWPp3Y8z3YHXk1H/x/3pP4NF7/uF2QOPYZM76f9bsx0nj7UlR4ll6z8Vjc/9xYcrLZ3X8dGxGShVtRm8QZH8Ra0Z6aVzIZHX62nb74UbF78Vy88phdv5cffnnRcDp9dfs7FfK7/bf4+bdyO3z1Of+S1bzdX7YR2ZYz3FC5fV1yP99dfnVcvP7Wtjn2HLHw3ZY/8Re5eVSwvjVc9NCYHfTcnnBX2RVzHx/02VpfHwUFWRqEXp2YnDBS3/OyHTY5sFM/edH1v9JYdfcZ0b5VUjk5tD76Pbf7uHE45XwyePyxuzt1MDn13PaUGJyV31x8vFA9f12dPPQfc38S1Pm9kL29X1F/9RB5OVW9ubWU//cZ0DKc3P1UXtb2XlbznNjdH8UFWEUFmFgaXNRZH3GQ3/a91/F59BC+P99TvRxesnGfdDg29Lj4dv67vf06ebE5ODX0OP9Vf72cETMfWx3cGJJ90FF5v902/5eQfLad8f9WdHk1nfJ9HTW+N1R5f1Dx/tVTfdXZdTBe3ndSmZZ0WV9V3prZGYQFX9vaEpIZkb2Q3X890vZ/kZY+t583cl9SvVUc8T1WfXiwt7t5Mztlfvklf5R+OfHyeHGQf7BekfWZ2JQV3tZ9l9S/cx39ORDd89RfPT1eVr4XmX28nTD5sFX5fF19fpKTPzActfFZn7Kdm1cRG9nS2gWZ2wRYXAUYtB8Z/XOdN7l1XXzzUvBwn1H+99wwfxB1uPxVuDg1/jq+fGV7Mzn4EDf7cdy/PNM0fd3ftFKZVXCdkXk9F764NfF4NV9+P130+dVdefyf9rhQFjtzHjx9nxf80dy99RkXFJhe814b15CaXlKaxV1ZBFgRm9i2VBw8/tZx+dWdfPWf1DQenTxTWfGwE/c51VF5fFf4en9+pbjVuPiXNrm30/6/1jJ+Ut09U1kUNJlUfvUVOf5TtjydEzy0HH29k7d5NZ28/FFwf1YRPPHc9/zTVDIQXffQ2RERWNmQnhofn4UYnNqF31/aXLNQnXzzE735VjS599xyMt13c1KXuXCW/v6Ttznw1bj49nn6cfd4v931/JPWfzZSfTCfV3MRn7S1E398tzz5lNE+8db+eVf2+LLQv78d13+1H3E0ntOVnJ+3VJkRdJ6cN11ZF10YUpEYWJMeG99e2hkRWZn99x/0vN0R/vMTvbwc0LISmVfRH9UykTV8NtA9/zQ8+P28Onh9O/s3MrgzVD7/17a59RC+dp8U810QvbUSd/YdlH5x0bl4dXL4cBS5/VK9PpGTvdfelbdZHbEe2fMU3tH2XZx1XxndnFuYHdjaH56a2dHZWbHQmJR8HRa4fdY5u1H0OFCevTMc8bkRlb82Uf980DN5d7E4ufa/+TezeHNS/HzStX62FPz3Xva+nVO/9B8xclN9OfawO/hwOTkVFT7zXXK8X9yxX9iRXRse0ZmZd9DZt73eEPwQGVTSWJ3RGFhRmVvT1Bnf9hyZ93Yc8ThxNHm+VjHxHpK9XV88fR7UftZQeTAefTi3MPp5fXs5sPm49XT5vVF8/tHXPFJcvVQYV7cZ3zHTXPz5Vn2lfPU4PpL9eLRUfvXfVTYZHPWZm1ESWNN2GVE9kl391FgS1lhZkZhFXBxFGREY2dQemH11HvC48jA6OfW+vBx1uVNTvnWf8zxdlH7W331yXfN4NnD7vPL7OVO9+ZD1uHBcfb1edn7dXPy0WXE8HTW4MPF6u3I5eNT3eDJS/PNenXEZ2PUexR+dmpn1GVkz91zwv9yTvBKZdpYb3JSb2ZXemdWQ2BAw3JG819R4vlD/+V6Rfx9evfUYlP8fFv7UHzJzHH04t3xlOb8lejK5O3C9u3JX/vIZFz9fHz0c23b3mZN+EFF4PDE7ORa/eZBzu1XQubWZ87DYnLWbmzffG7d1mZX8Xtw8XJj2k9pT1kVYkZoa114alLfY1z4dU3i/F/v71zz7E5x+tB+yMF6Uc58SPVxZcZRf87/W/fpzsHs+1Tn/tPg5lf7+nbS5kx359B68vBl2eRF3u/3zuj/Xfv3cMz9SdDzc3vWcW91cmpldmt5zHp6/FF78MV/yvB6X/JkettmbVVxaV3TbF7JY037d1rvylLi2n/9VmzTxGBc/2RC5Hdy/Fp95fRI4uBT4eja+uhXxunXR+zIdPjFZ/f2ZtvxYUT8ZXHgQXDs/Vzu4kH+4XnW4kbS71p9+Xdv2XYVXVhrXshjRP5kcv5+ZvdKadRbFHPUFGPebG3Lf237Um3l92TmlVrkl09W7X155Fp++1xh+d9t9MBv1P9nxOlI0JXGUuvzcO38YOTgcPzsc1fqXE/q9Hzk2nvk5Xnk607/lV/N6HJx4EFw4l9h8VsUW0AWd04RftpueuV5ZORwbeVGaPTea1v1anbzYnLyZHr/fGP8TWD69Xjh4n3x5GFO8GFz5Hpg+khh4N5m+/h79u9D+ZXQ/Zbxx+vLcOPAeOP/ZPz4ZPfnZcfgZHXnemTiUHvp/HHt4HL24GXA73BR7Ut5+XRty0hr2UFqQdhjSsZ7cdFiYVFnZl9+bF5Jb0raenTOcHfxWHHwzlrk597h5HT0/GVQ8XNC9HB09nR393R9y8V2yvxe9eba2frfUvfXWffL0PHK3fn5zv3828n0x8POxNj48sr4/NvN0XVbxXdbxXVEw0B/R3NmdXZ4dnJ8TlN0ddZJdEFydk10d0B1fFhAQdNcQtDQTF7dTlDF1dv88dHJ0X1bQ3NEX3VA3tFX3Vzc9szE9PHDyv339/DAz/HKzcnDz8zd0dLFw8TZwMLaz8/X3sXZwvT1zPD+xNDHxd/NxVPaxlbW10xKR1hAQXR9c3NlYWdne357fHZyc3J7f31/c0VYQl3azdnZ9cz38vb08/7I39vRRUVXQ0xRU1tQX05CW13X3dfS2NjVVlZaUtnO9PL8/P32yv3z+/D1zsnwz/L88PP9+f//8MLOxFldV1pfRUNKWlBNd09wck9NRk10dnF5ZXpnfHd0S0dV1UVPSElJdVnQU15X3tXc1FLezMfTx8/WXkJ0SEZJT0dHRVxR1NPV28H39PHMz/bFUdDUXdbO9Pb55fLy9d7S29vFxdJX2dlQztvb9f398P/By8ZX29j09NbDUdffQ9lXTNRXVlJfQ3h+ZmxraWNhenh4XklzTH15f3NCXtld0sLN8djx//fkzfX008JEWlZaXVZXX0xYWl1FR1/cxlRX20RNWXd9cEpb38v3/v764fXz/vLn8fn29PnG9P7L9/L4//HL3dvRTUFfxlLX03hc0UpyR19OUtdJWkRxeGZnYWJleHxMSVlDSnRHd3VU19ff9MtSwcPU08rE3cDNRkFDcnZyQ0dJW0FAW13TXtDE/fTBzMHfUVlWTkZRXlTI8PT2+PTN9fDw8/zx9Pf12MfT2sHN2PT9x9jHVFza9cXI8Npd2sNSVsXG3cfcXEx1fWZtb29saWBhZGV7e2Fkfnh/WN/Qzvnwz/3/8f34/v748s7bVURDRERCXkdFQUdGdVheXcHTRNdbd3ZAcX53RnXZy8H0//z45uTh6eHj7eHk5/vx98HJ8fXAx9tXUkNaUVhU0FBFWllzdltBSdfa1FjXQnl3c2ZlZWV5cnFIc2d/cmV5dELVwvX38PP888HN9M7DxVRRU1tOdnNydUB8Q0ZZWdHZ0c778dLD1l/RXUVJdlTI1FHGw83BxtXM/v35+Pvm/P/z9NlWw93dxtPU3cXRVs7xx97O2srRQNBR1crd0c7fWUh0eGBgbG5ibWdmYGJiYGhtYGx9X9zz++Tk7eLl5eb4+vLZxsvB2VhwSnR2c3RwZXBJSl9Q08bRVktGQk1IZ2VCTF5R08339sj+5eTn4uHt6OHj7frN8/DQ2lZYX1/UWUZf1lRHWtxHdkVxcFhSVNvMxNvWX1laZWF8ZGR2cmB6fGJjZ2V6fk1T2vLm5P/45PD0+PZHVt1eTUBGfn95e3FzQtFCTtTJxvf79tv1yNFcS3d0cFpCQt7B29/G9/bl5OHh5+Dk5Of78PbOw0dAV1pd01jXwMTU3cTU11RFXF9P0sLByP/C1s10YGFnYmlkZGN4Y2JgaGBpYnJ9V9L44efu7O/g5P/LyPXe391T1ExPSXh9dnpxSkhKV8/b9PDewtBxd318eEpzcdle2fT18PXg5fmU5OqU/pbk5pVFlGfHwWL3Y/VmX0vRR9hDX0Z4wGHGZfNbwPje5NHNRXxKZGV7ZH1kfX19ZXpmYH5kck1Xxcjl/PPizP32dP530M1l+G7BdnrXY8Zn23THUf3M4fL+4dj6ffdgSXFkQWRES0bYWdjO9+Xy4eTm5+zh4OL45crFXkBUdErXc8/SWudy9lFD+m/mctj0VOZb5Nf3fFhjdGh8em1latMWc21pZWhwYHzfc/L88+Ph7ebh//z1yMHbVUVbQE94c3pOeHZZcd5ezvxczeVlydJp/2xg9RbwZn/pau7VzJFDnfDp7uSQ/Ojh7OX61P1IUHd9SGHZfPVKX0taW0xYTNhHydjb3/Hw1tZGTkNgdUAXUH9p9hd/Wxf6F3DJF+tj/+Znk3Tr1cXgevBxxXZS3MRkxmTXT3r/ZOZB4M3l88HnR/t5UkVgx2p9fWzIZUzYd/7D2ezd5u/Wlvb5lMjs517j2X7vb/bLY5FgyvhslWNd5BWXeNjjapVi9MJq7BdGchHxH3F8EPAfzW1nzBT8Yc7EU+fY4//i+OTh0+da9cFOztLSXXNIT2dScHfEcfTXdPVYSPNswF0V4RZeRBHgaFX4b5FA5Zdynt/skXGeTuqXZZ5g4coXlBD8SG3pEeF6fPZq/mbS0V/zS/Hf+Fzy1NbJZs1vSH9uwRRLfmj0F9F1auAU+V9ml2aU29nrfOFwzlRN9kX9RvR0wnNx2WXzcPT0ced95c9742zIcWrhE9Z+FeYQ53VD4nDq0eTl++PC7fjo8O7+9uR05HPG3kLie/jEeOBo8lhs7mrjXWGVa+l0SOFr+mNKe2tyFH9oZmF/YXtNe1ll9klW/VTqweDjUe1Y0eZn+/R+62fL9272YHNXZkvIdnbzf9zSec5OZMx5efVvxlZt7H/F4n2U8MSRQZTuTp7S75VBlkbU+UZTy01E+nrSxW7Xf2/0Yn/mb/33Zpd/0pRo48NglBbQzx3iE37HHuARdMAT7GlZ/W+XfObhfpdp4MdtlhXsx2eWbfjFYfpkcf969Mtm7mTc+mrvb1vzFulpTMMX4hXf2m2UaOL8eJxilO1QnkyU61aVxc/sT+bmeJR7wfgX6Gp49xDraU7gF+hpV+YWl2rz/heWEvVkFvIbyGpnwRbmbsnGeJRl6v/fkmaRWcLubpFm5fZ47hX+d3D2F/pjdfNo7GrC1GvhFedxdORl4mXA1nf0Zv5E/fRM60ri4VSS0ejrWpZU+eRE5tXOU89ed9MV2mdvwhHAfmLtYvT6ZuxeWe9SzuJT0PJtU0UT1W8V2BZyURHcQnvhccftdffkZOfIe+t3X+xj+Ntg53p14HrQ8Hnm9GHtQ3/ibVLnYvv4buJ0augUeOYT5MpolmBck2zo73ef9MOcWf6Wc+rsYJbXZZUUXOQf4XoX6xbF+BCUdGKWa/PnF5N0fpcQ+EMd4R18RxP5alpdZuFk48rJlHaW3EaWbe7JZJBt2+cX72Bs7xHLWGmUa/T2ae9px9Rv52L5X3XubOVxcuMU4EFa6W/s8EnoXeXu1e/n0uPN9Pjf8dPAS1rSbl5iZ0IRx2BwyWnsWXXqSOTnTerL1eBC11F6fWRlaXJnFFBrSkxo5mTN/H2XfdfjZPrQceZZRf/UQ/dCdM1zWfdQVf3+Q/70cfxDZPBYYvZYYPV0ZMp6Zst/evJLQudA9uLf4ez75O3k+e3k9+79derFZfp7YVFobMNvYflmc+149u5g7P1t6lNn42985RF3RBbZa27zFUfIbeJUXZBe+JZy5OVl6VJ973FR+W3SzRbQSGv8Y3TsavHgbu1NfuJq3v5o+UZy42P09GbmZFL7YedT2OB06fzz7FSV3MjuSezTXO162chtw2JtVhFAcmPwYfD00eLU7v7T6U7m333jZk1Ua1VsakUQfn9q9GPU/WTj187gd+fTwfhw5lTPynbgdkb8ZdjXc+XUSuHAWvvUXfR9R9plc9R9QVBkV0tkXXxAcXP5X1jh9/Ti8eTq3+WV1OHpXu3ndfLJfUNWZmdCYmRUYnn7XnHi/3Xn8XL/3mT/0GDCWm5wcxR8fxRFUWPA5k/87lTz4lNU7E9D4k125k52+HN58HRjykNn9Ft7+dty+8d6xMphWPxn3/15z/hmRPlkZed+d+t91pRAzJZF05Zzypdm+O1p/Mpu/3Zu9mFo8G1n/WvC/Gfq8sOXWODte+DdS+dk3NdsWGxjZhVLbnnTY/BOSu9/8v177l5P4nbZ+XDO5UzS4UhX4nHf5n3b+09c4FBl5XFjymd7z3hb237UcmLBYGP4e1zkRvj33ePa5eZd6OXblfX+4VX/3dXJdPRze/BiREJs9WZf5XjmwXLicXT6fFb5SkPIYWfcFWNRaXbbcEX/yULn/Xz6+EzJ8VzX3c1aWfV0XPF3XUfQRGDxT2Hg3nzl0mXc0WRC/09L7cV25slgz8lv2eBl2O5xRpVWfJXSZZfdZerYZO7IYefYYedUZvFaYNBYYNPbcPjOVuTBwsNH/NdH4VxzwnpkfmJnY312YVpUZ9b2fET/UETlwHD4yn7l5Hv96HTb6llT60B67VZm7M9p5NoX9FYXzcNu8vpsw/VtWVFhUM5x3PZO/c5M5l/b7U365lLt8dHuw17j20DlQ3H5cnjGZXrDdHP0RHPIUXPJ0Xbz1dX9fttdbNtkZ9lmQcZkVPl9Ufh/xeV8x/553vhIx/pAxOdX2vpe0v9wXNVy/XBw82Fd0WPSR2fNyUjn/nbkyXr20H7wxHnGwHbJzXDBz3Xy8EH539HmdfzlSuTDRPNWRPZbf8B1dvZ31fN+2PBwU/RZXfjdXv7Vf9dfY3LdZmTJc2HcR2Vc3UpAz9FLw8tXycny9dfl91z5+9nN5VZQ9kh313RjSkZvcVBhQfBEUv7ST9XbS3HL1n3eyl5x3vR9X/5XU/743Pns9cLn/kz34WVF4XR99NBlX9NmSdhmecN/Zs1Ze/XyTNn40l/HXEhNWkR2W89aePTYbs//YET/QHPk8nTy/Uv05XNY50Fx+Md1wMV9dVhweXN2eXl31UVX49BHlfF///hzSfpIe+XeZsrEbV35YVHtc9TryNbtz3b69mP35mDQ7WVO4nlx4WR45n5n5nBj5UZz5kRC4VFx8Ndkx91nxVZt9NRq0dBrUcxjwft//Oh11pVIce5feOL9feDnZf3gbU3kZmH1f2jVTmz0ymP752f85WLU52Za52dS4WZO5GZ99n1a49z1kfrBlMpC7Uxk+Ep65lJn+N5v2sJuWslodfRucuNyZe3LZePnePvKZPjOZv3zYc3/Y13xaU78bkeVcVPpXFj+cUn0ennkT37jVHvj1m3lxG/32GlXx2Hc9XH75Hfm7mbG72ZA7mV24Xdk/UFuUVFqROR7zetC9+pwVux7ZeNEZezQZeNDZufRYuXMYvvcYfrcZufwZ/jmYdPlZkD/e0z2YXL5e2H/eGjIcGbmynHp537t/mT5yGb6+Xzh5Gb25GHf/2ZR9W5H9mlz8Xlw9lh2/Ud6/lll5fZl9Od53PphWPVsRfhw3un1xOr/WuDfZvbYY/b/Y0X0YE73Ylvwbkb4Y33mf3/iW07rQXTpQmfs8GTk82f5+2PI+mp15Gl743B87dB+49Ri+1Rqz/xgVOVhWuNlde5wZO7QYuXCbf35Z/jgZPHsZ0Tocn/tdmXiS2HgdRT00RVQ8mBW4nPE60pC7k1n4Mpm+vxsyv5vw+Bh1u9Id+LYeuXPZufwYPvkb1fgZH3meWTlS2fkX27xxRTR5Wxc7Hzf6XJc7kB44/xn5edj8Odg2OFiT+J6Z+F2b/9RbfzJbPXlb1btYUnuf3LuW0jvXWb7xGnN52DQ7HTX6VBf7F164c9t9/ppd/lsZf9gZOFwYOLBYOf6ZP7mfv3tZNvsYXfsdnPg1HLj22flwGjL8RVF5WxJ52Rw535k41Zt5/Nu9+Rs2eNiU+xhTeh5Ye1dYe3IZu/0bOb7FfTgblbvZlzoZXHpY2LtZWrmRWnmzW7l/2747WL26mRE72R47WVk6EFh7spj4+Rg5+9j/O5vwO5pd+1jZ+B5ZuJNYOLfaOXwFcb7at/maVHiaU6VfXOW2XKVzWHv9G7g/Gr95Wnf5W5K4GBw7GVm7HFo5F5v4MNi4/9h4eZjxOFnT+Fkcuxzeu90beLRY+H9Z+X7bM38FE36a2Tjen7ufHuVXHCX9Hvt+mHy+G3K5mPY7WVelU5K70d4501t90pq2lMXUsBoXeVi3et/ROh2fO9Wce3We+DBY/LwYffjfNbjdHX4f2f4TWPl9WH95GTG5WNF5G16+GZ54Xdg51li581n4Od75vFj5NNp4E9s7XZ37nrT6mHh7mPr8m3uYWfpFdrmEexaYpFgUJQU4/cVlm156xPCwBHrZGSUa+fsbpfQYZRgdettwe1s1fRu3vlhz/pmVf5ncPV/cvxZceT3SPP6cFPmXH713WdZ83dz8VRnRsl+cfvyc13kRWDf/WZi/slsRe/VYeGUQHeU7md17lBq0OtGbf3sfWPl7X144OdhYvr+YWL2wWpt9sBoZufkZXPv4n9+4eFwfODvdGDH50Blzu3TZljlUm1w/MBhfvj6dH725URl3OdQYHn02WZ49v59Z9L+WnrD4vRwR//0fHvf8EV9U/DEdlHl5NFa/OTSf17OUXJ1zslOd9L1VEDF+/DVV8731U9QxEV/cFlfcXfE991e2/fAQ03T2dFd1cdQd0rT3FlJUsRYc0nTxF5Gzf3a0M/xydHXzchWREVWUXV3WlVYd3dGWXRa19FURV9QWHR1WF1QQFHZ0d7C8/7x9v3wx97a0tLW1dzQ3NVV39rHxMHHxVdY1tVedXVCdHN9SltEWFDf09bGwdnf28jIwN7b015d0FRfU9dQWFxXVdVVVF9H19xWUdPa3lFUUVBeXlpAQ0xBXkFZXlfS295VVNRSR09CQVNQXFHU1tLDzM7Nwc3H2NvE3NXS1lJV3dRTVN/Dzsr098/IyMzYVFFCdHR1SU1YWFNSVNDUVFRTWFNUUdReWVNbWFxU09dSUtRV1Nvb0tPdxsfawcDG3sXE1lJX01NAX1xES0pCQnZOX0Z0SUdDdXV1RkFBWFlcV9Hfwcvy//788PfOw8PO3Vzcxd1V3djGzMzLzMLHxNnR1V9MdnF2fHRNWEZJWVVRU1De39/Az8bd3tNWUV3V09bf3dNX1tndU1ldWERQUlTX19DUU1Ld0VZfX11YW1BTU15TUFxER0dJTVlJSkVSWEZEUNHV0Mf1y8v08Mnf2dxSRV/V0NDb2t3FyvDLzPbz88r28czWXVxCdHREREpLQURbU1BaXFJUX11RXkNAQlpdV97b293d3trEVtfd19Df29jDw8TZ0NxQV9VXUl5eUdVaTlpEQHBycXx4fXB2cE5bR01HX0BY3d/D8frl+Pj88/TO3FNfVsfCx8P19vf0z8rKxtrF39Lc1VpJd3NwSUx0dXRPXF1E1M3D2MXEwNPVVVNcV93b29vZ0NXf1FpYUlNeWVzX1VHU1VxTU1NcX1RXUVTXVF1VV9BdQkl3cXFwdkhCTFtaQkZaRFhTxPTM9Pz0x9jH0l5HVNLdzfT28//5+fLz+fD39vH1xNncX3dxSndzfXN3dnZATUZR1dXQV1FfRkZbWVXQ28bZ0NvG1FJU3dnfzcrB38PC3dfQ1FhMWFpCQ15QR09HVkVIRHV8eHt/f3lzQ0NCWlFQW17d2Nr25eX+/fLwzNzY0NfazMjNyvL+9Mry9MXFzMJXW1XXTHVCT0p0TnRwS0F1S1jT2cHJ9/Te1NbR11TTxsDVV9PXXVpYW0VU0tdU1NdQXl1UVEVc1VlPQVTUUlbW39HS3tZeWkRze313cXZGR0t1W1NHRVHX0sf19c3B2tfUVd3O8fD2/fz45OT68Pbz/crNwNrVW1tdWEVfQ3Bzd0x2dnZ1dUhR0VTV1UZFXFXb3tPc0Nbfw8ZaVldd3c/N9cXR2lBYVlLd1VpAdU9OQEdIRl9XXVpSRnVxfH1zSnVCQkFAT1DQ0dPUxPb19PH+8dFS2MDZy//PzvH58PTx//bGzvDB0VdfRHZwTlJfTUBbWXRJW19BRVfU19/J3lfTyMXfzc/aVtDEXk9eVkB0R9fRV1DdVkNCQldXV9zcV1TYT0XTVcRYXc3HVFDWWnd9dUF0cndZRHp2XEFESl3F3crMzFp21lfe/uT28/7l//D74Pzw5eT+9/PbXlRIX1hxT0Nxc310cXNzX0Nye0xVQEpSV3dS9M5Q0/T+zlhVV1NSwcvW8crA5XhK/cNwS/bMwsZweV5GdXBPR9NZddJfcnJZR0t6W9tfW3F2UVff1Udd28LZ3vTK1dHb8PzTwv71yeTl+/zx8MHb9/RdStdU13VJ3V9PXlDRTU9YXFtDXdFWXV5VVkLU2lZexclR11PV1HRG0VFDwlFAW1LbVndcxVRf2PXdWlxUVUhHW1ZR1FZQUURc3Etx11hGTXFMQ3ZyX1l12sXVU1XX1lHC28r++OTk+uHt4Obm5v3w8/PN08bP0EVX00hwTkJ3cU1ZT3VCTlNAdXVydXZzS0zV0tLT29/d11/d1tbZzPHYxMbdxVZRRUBYWNRcW1lRREVMSklyc3V9c09DS3R3dUZGTEV1QEZYVFNTWFPSXVJX39RT2sn0//7/+fvn4+Hk5fj59fTI39/XVtFfVN1TXU5Y0trAVlxe09tcWkBdR2VyT01KTVFcdnVcUElAXd3FwvXK1tTTxNBYXlTQWl5XwNDFwMnDWFVET0lAX0BHQlpJdkp0fX1zSk5xdkxIWlhJdXVGTnJB1t3V9+bn++fs5ubh4+Pj//j39NDV9tHU0tHaSXtZ0V5T3NBaRtddTEx3Q3xnZHFzc0lZQkf0xlldytr1+OPk/vbA9Mzb0MfeT0h/ckHOVVHW0MPYfndRdXN0Vk5yd3tzcEbVTFdEd1dcR1BB1HRQWXx3dHXR+/v54ePl+cb65v/x2/TJ11NfUVZGTMzQQkd2wlFFxc3SxtnaRHdfRE1HXUBCdnJATXx0d159cFlf9/nC/tLN9NxWc9J1dvHQ+9j5xUrwy/3P9MvAWvTaXVhM1091dmV4Q2ZKRnZddlJPfVhxSnhkcnRXw8vy5uf45+b9/vvl/fP3+P39XE1QW9lMd3l/RnZSW0RWRdVBQVhwekJDc1V3RVhATE1WVltZUljB/ufk/OD49PDd0/XS2MnFz8LfUdZUU99Z01FCRnNHQnFIdEx1d050dUtFUltC1kNNV19fXkxITkJdwPb2/vzn5/n+5frk//z2+ufH019W38fS319S1V/T0NnQ29JUWEVYcH5+fnl8SXBzTEpGSEhLdnBE2MfI9PHxx8T1xMDQ0fT0wMXeycjRVMTxUNFXUlRMXkhBcnt5fHl8ZXx0dn11RU10cEZPdHRLcUpD1MbEyv/88+Xn4+Tk4Pv45OTw88HDy8DcxcVcU1RQ1V5K1EBcRl5UXXRJcXBEQUVFXkBSUddZSljT0dLZ9f/wyMjHVN/R1FNd1sXZ1l3U3lFXUVN1TltdT3NPSnF2SnR1S3FzS0tf1F5SWUVaWF9CdHZ2TVDQx/XI/Pj38uTg+uXk5fzx9vHF3dvBzNHW2VFbW19Q1dFT1NjUVlJfSHVJTU5OWkNJRkZIdXFNT0pBVNXc2sbExszB0tLE29LczczBx/T1wMXG01NYR0B1d3R3fXB3cHxkZHx7eXdPdHd2dU5ycHZ2dEhX0sT25eTn4ezp6ezs7OPg4eH/8vf2zsDZ1FdTRU5ISEBBTUdSREdGT3R1TkVaTFtaWUFBWlNFWdDV1FDYwcTfzPTMVdHQRE1e0VJZV9jb09fa3lhJTHV8c3JzcXR2TUlNd3RBR1hdUFJZREZNTnRKdEpCQVjSx8bx+uT75OHn+Pz7+/30/Pz2xPT031bQ2FdaXNdSWlDc0lZX11NcWFNfUk93QUBOS0BFR0JbWVlZUlHW39vMzMTdVVHVUlbT2dLczPXMxdrF109JTHV8e31wfH53dH14cEh3cEtJd3NwcXZ2cHRIQU1c2/T8+eHt7ezu4uHm4OXk5fj4zvPa1t5NWFBIX0txUkRAdVtXQkhHU1dYUldQWkxZX0NCUdVQUlXS2t/Zz8Xbx9jQXEdYR0FHW1bUUtPY39/W1V9ATkNDSnZ2dUlPSVhZWkdOWFhJT0NPcnxwc3xlfXFzdETe8P3l5uHm5+Ph5Prk5Pr65+X/9cn3wdTQ11dfWFDR1llW11BETFlTRUBBTE51dk1GdUlbXlxZUN/Z0NrNwMfR19RcXVbU1tXR3tnU3cPd1lRVUkxJREV1cnJPd3FDXVhLSk5DdH1wcXJ/fnNxc3x8SltY3fL7+/rm4Obm4eDm++Xl5Pj//PTB0tHQ1VBU1F1ZU1NaTU9EQEpDX19DSkVdQU9SU0VBSV1WVtbFxsbZ3cXeUV9YW1taUNHX1tPS3dLT0tVRUVNSXV9fWEJ0dUBbUVfV11tMQEVCdnJzfXh7fnlkZHx1RFHD9vP/++Tn5+Tn5/v55Ofm+v748vX0ycLB2NnY0NZUWVpAdEtDSE1KcXR0TEZNQkVaQEJLQ1dQ08Xaw9vfxN/W1dfQ1NXXxcff2NzQ1ldUXEBeVlJFTU53cn10dU5HX1lETHdKdXFxe3t5en9+f3VNX97az/bw8uXl5uDg4+X/+uDm5fvl/8709MLG2MDF0tdfR0FPTHR1TU9MSkxHWFtSU1hGREFCQkdZ1d/T0dLW1FFQU11cREReUdfewcffUlfTUFhbUN7T1FVWWU5MRF1aRVRcWEZARXV3c395eH96ZGV/d01f1djayff+5eTn5+T45efh4eDm4ebk+P3x8PPx8/HB11BeTHV1S3RyfHNzcXN3dUBId1pZQXVBVtRRVdDQ09HfztjF39HWVNvFxMPCxNZQ0VxFQ0RT1V9DT0hwf313SHB1T0dKd3VCdH18fXN+fXdNT0RR39/cxPfy8/nl5fr4/uTn5+Tn5OX8/f3LyfXw9s/C2tRcWEZKdnZKTUpJQV1aQEdXUk1FU1ddU9feUFBW0FRSXlfUWkVfVVdU3M/Pz8TA01tHRVxSV1TUV15FWUREQktOTUNfXkp1dnZ8eHl9f2V7dE1IT1/RUtHF9vP19/388/365+Hh4eLg4Obk+Pb3/PLLy8bfV0RMSnNwc3ZxcHZLSnZCSUNKTF5cR19fXllcUFTWXF1X3dFU19nd19jMyPXP2d5cRkNSRE1HR0VPQEBNdHRKTU5EUlxLcXZ2cXNxdUl2S15XX1bW3dPQ2Mr0zMvw/PHw+OX7+uTm5vr7+fPJyvfKwcHMxVVaR0dMdE9BQXRJQUVMTlpWXEhE3NxFXlTUWEVfV011T1pYSUdX1tbTxvT1z9jZW0hHUF5AR1PVWlpfUEJ0QFFERl9SS3J2dElyfnF2cXZMU1pFWNPfVlHZytzQzPH29vL65+fm4+3m/vj68vT08PbKz83DVFheWUZCTFpOdnNLQUpKW1NMQtXdWUFF1NRYX1RdQEBS1V9aUNLR1d7z/c3d3lVBT01DS3d0XV9AQ1laTUFd31JCSUJ0c3BIcGRldnVKSUNWVlPTztre2cDOzc/w8vX08OXk5eTh+Pz////x9fDyycbDzd1SWVRdX0VAQEpzdEZDSHVBWVFT1dFWWVfWUkRfUEdYX1xQU1lTV9faz8jA31TUU0Z0T0ZDT1hWW1lZU1ddU93QXUxAQkl0cHx4eXlxd3ZxQF1U1N/HxdPRxMPBxcjMz/X55eX6+vr5//zz9/fx//H0y8ja0FbV09ReR1xEQ0BEQ0h0TUFaREZFWVxZXFJVU0daU1JQXlhaWlbX2NrA2cTF2lRfWURDTkZTVFJTUVXW3NHVXFlGREZPdHNwfXJ9d3ZzdktCXtDDxtnJy87Nyc/H08f19/D45fv7/uX7+f3x9/bOw/fI3FZV1lFHUtFQTFpZW09KQENNT0ZaVFpFWF5bWV1YXFxcUVhBREZfRF3Q3tHd2thURVFURXVGUltHR0XU1FZU0dxcXtdWSnd1S3l6fEp3cENHXF9XxMnF2c33wNzYwdxW0s/x9v365PL8+uT48PP88c7K9/Te1tzQWVHR291RUdLTQ0lAWndyQ9VSQkBRWU5G1dZFTUNDdXB3QURDR9PE397AzlVcVtBSR1bRUUNd0dBdXdXXUlNQ3FlxfHJyemV8dH1/cENBWlzby8Ta9PbI3NDbUljT8PL8+uHj5uTm5vnz9fLzycH3wlNFX1RER1HRXkdYUkZPTURIdUxc1VhHR9VXX1ze3VFeWFhLdU5ZWFlQ2cPM2sHE0VJaVlNYUdRaR1xXU1NYUNFWUVbVRnN5cnx6fEpHT3dDU15R3dvT29/ExtRQWVtbU9j39PLk5ubk5Ofk/cr08fX0zc/bVF1XVFbXwcfVUVFRRURCT3VPWlNaTk1FXFlHW9VST3dJdHJxT0VCXtDGx97Z2NZcXlfV2cXFxNTR0tReR1HT1VNdX09zf3h+e2VwTkxOQlNURFnT0Nbfx97R1dPVVt/By/nl5ePi4Obk5/n08/z3x8HG2FRaXFxZXVPX0F5aUVxAQkFGQUFbWE5IQkBERFvR1lNYWVtPdk9eWVvdwt3V0dxWWERfUdbcxMfZ1tVUXkFCU1ZYQV5FSnZwcHN2dERQU11U0VRDXdPQ11PQ31dd0ddW0ML38/764eHk+/r58fXy/cjCwMfSVd7E2NzSxcXf1FdXW01AW1hCSVhJfXNLT3dOQkdaWlhZQEpxdFpf1NzY2dVR19RSVtnFxcn39sPT0NBTWl/XWUhBQUpzcnN8fHN0QltQVldWXlpaUlBc1N7XXtTa2NnM9//5+ufn5/j88/zw8fb2yNnX09FR1d3R1dfT39ZWVF1GTEZXXUBPQEx3R0VEQEPX3t/d0VBfQ0tCRkZcVFReTEJBTk5FXdHc2cbHxd9WUFNZW1xTQ3R1Qk1OQk9NRFNUUFfc0VZSWVtW11RQWVJHWNbd0t7J8vj7+uX58vb38//+8vfPx8bax8faxMHOw9LY31ZYXFpKdU9bS3NxcXxzcHZKT0RRV9VXR0FMSE5bUNfW0t1XUNLT1t7YzfTPzMvA3lZQUVlbTUp0dnJ2d3d2dE9IR0dHUVJYU1BX1dvZVV1S19bT2Mj39PD45fr/8vbL9c/28/bK9cLF3t/T3tvZxcTa3tvdUUBHR0ZMSE9AdHdATUJZVlNRXlJSXlJJSndKSUNFWERGQUBNQFDU19zN9ffMwNjf1FfVV0ZJTk5CdU5DXltbWl9fXVNSX0dd19BaXVBYTU5HWF3U2szK9//4+PH09fTK9Pf28fb98/H09/b2zs7L98jG0NDVRE1OQnZ8cHR8fnZDR0dBR0JOQE9IcUpCTU1AWFNfX1LU3VTfxsLbwcvx9MbZ2dRGQUBCdXV1cXxwcUpLdEhBWkVbRFNWVtXa01dc1NFaXNrLysj19srw/fz0y/TI2trAz8LHz8PJwcTPz9vezPLwx9zS2ldaR0ZOSE1ETEVd1NDU0VVYTUpxcXN2dXV0cXBPW3V0RdDUV1TCz8HL98nGxcXeXV9cU1lWWF1YTFpSWkxDX1BDTFLRXVpY1VxMS0BIcUZQ393Tx87HyvX29/f28fTDzc/0yM/0/v3x8PLw9ff88MLH3tlfQ09LdHFwcHRLSUFSWVtNR3R8eXNyc3Z1dXBORV1bVMH09cjK8ffOycv0xtnd1l5NTlhcWklAW0J1d3V3dU1GTEZZU1NTVVRZQUFGWkRX38LNzcH08MjP9vL98PHwzdre29bd2cHB28TAzc719ffIwMDC3FZDQkdATURfU1BT0dNUWUV3cXNwcHx9cn54dkp1SF7T2sXNw8zJzcDMys7D2dzXUllVUVBX19dRVl9HTVhYR1pcUlxYXF1HdXZ0dnZ0RF1SUd3FzM3J9/Dy/P77+fXMz8jbxvX0ycv39/X2/fD29PbO21ZHSHV0SnRITU1dUFhPRkFKfX1xc3l5c3Z+fndAQkzXzff19/P/8M/098rG2N/fX0RbXkVMRVVRW1hBdHdNQURIWNXUXFbUUU92TkNHTFnRxN/Ty/DMz/f9/fbw//Hb2treUFbYwsffxM7Jzc/y+Pf28vHFXkFYQnZJXFBX09zbUF1dRHRxcHZ8ZXt4ZWR7fHR3T9fOx9/E8fHYxvHxwsHDz9xT1NDU0d3EwdxVUV1ERU9YW0NZUFhOTkx1fHlzdHB0Q1RUUtDMzsn2//v7/vz588vAy8nCwcrxy8j18/b0/fr+8crO0UV1d0pwcHRaWF9YXERPSkh1cHxydHJ+fnJ5eXJNXlDWyff0y/Tw9/XK9vTN3tDQV1hdVVdUUVFSW0lCdnZxd0hERV1TRkd3dXRLcU1MQV9U3Nzd2/X28v3++f/28fTPwMTBxd7dxcLDxcPI9/Xx8v788c/eV0ZHTkBFXVXU3NFdW0dDTHZxc3N4ZGZhZ2d6cnRJQ17X0NbTxNjCw8739fTN29nGxsTAz8LA3cTfUlxBSHR1S1tfWkt0dHRydkt0dUtBRFpDUtTRxsjw+OX6///98fb198vKys/098j38vL98/P8/fXFUV9FSHd0TE1JS0FDSktMS0p0cXdOcXp6ZXh5fXVHXNbZxcfAzcLAxcfAy8rN2NrR1NvF29vb2FVfWUdCdHFzcHVJWkVCQkFcUkdbVlxEWFBSX1Dd3t7by/P98fXz9s3AwMfY3cXE2sXPz8719/38/f/w9M7c3N9QRF3VU1pFUFFeU19aRkp3cX5mYWFmZGR/Sk1AX1XVVdTT39DbyPT29fTw9MPI9MrKyc3E09Dc1ER0dnByf3J2dnBwd09KdkxYS3F1Q1hBRlXBzfX8+/j//f/y8PDy/PbOy/D09vLw98n08fXH3sXdU0dFW09zcUp1d0paWU5MXVJcWk11cnh6eH1xd0dWVVTZwNvR1NLc2djBwMbAzs7NxdrH39TV0tBUV1ZZSHROSnZxdENGR0FeU1xBR1xHSU1SUllW2sDDwsv09c/Gwcj0w8zOwsHJ9/b29/Py/PLw9/H0yMDa09HRXFhaXFBeXlNZR0FGTktweHtmYWBkeH98cUJHW1pfXVxV2cXA9fH8+/7y8/LwyfXLz8bAzsbdV0F1dnNyf3F2c3JxSnVIdXV2dnd1TUdS1d/O9Pfw8/L09vTw/PLx9/L//P/88/H19MnKycXGw8DdVFRQR0RHREVERUFAR1tAQ0BJcXZxfHx9cXZ1QkZEUFNQU9VV1dPX0N3D9Pb19MnBxsPH2Njd1tPT1VdcRExOTnVJTk5IdUtCQE11T0xKS0xcUVXWwsjMxs70zsHNy/b39fb9/PHy8vH0yvHx9fX39srMydrQ1tJXU1RQU11FT050c3x+fntlZWV7enhydndxTkJaRUFW2dLYzPTOyfLy/PL88PLwyMvz9MPbxdNaRlxYdnZ2Sn18cn14eH54f395c0pzdF/Fx9vI8vf08PL98PL/+/39/vrl+fHw/cjJy8vax8/P3NDQ0ddQXlxVXltGWkh3dEJ3eX5zfWV4fHBzd3d1TEFDXFdfR9TN3tDey8Pay/L0zvfw9cnIzc3H2FBX01VeVFdEQkVNcXJwcX99cnNycnB0SnRMX9HUVNvx9c/08Pb28PLx9vLy+fr+9vn58vby/PTGyMrd1sHH1FdQ1FlYQXR2SXZ8cn9lZHtkZGV8fX9zSnR3TVpdRVDFzMPAwPfz8Mry//Hx8Pz29PTJ3NJRX15cW09CQEJ0dHB+eXZ9eH5yfmV+dnZKWVDV0cbP9vL88P/6+fP9/vHw//r98vn4/fLz9vf0z97Y2dRR1VNYW1xASkpJSUlYQEpxdnJ5eX94fHB9c05BSElFWERW2cTT0trHz/f09fDz8PX8/vTBzMRTVtdQWVpFQE1bQEt0S3FzdnRxcnJ+enl0d3VZ1lJUxMr3yvH9/v3z8/789Mr8/vz/5eXy8P3wz87A3NfWWUdZXk1PRk90T1xCSEBGd3J2cXt7c3N+cE91SE1MSkRV1dDM9MLH9/TO9/3+/fPw8Pb0wNLf015FU1tDTk9KSkxGSUlNd3B1SHB8fn94fXdIR9HZ19v09/Xx//z2/fj//Pnz9/L5/v/6+vL08PTDwcTVU1FeQ01bQndIXkFDUlBERE12fn9/ZWV4e2R8cXFzd3dKQVDT3cHOy/Tz8PH++/z9+fry8PHB1dPZUFDXXUFNQkxLQENwcHRyeXB3e2Flcnhld09OX9Dcx/b09/H8/PL45Pj8+Pv4+uTn5OXl/ff3ydnb11lfXk53QkZLdkJaTExbRUx1dnN9c397fn15eXRBdnFBW0ZQzMrNy/H09fDw8fHz8fbz/fTCxdFZVtZRRV5eQ09FXEdNSHR2dXJ9cXF7enxzfXNORV/U2cfI9/bx//zz8vj68vL48vf85fv++/zKwMzH0N7WXF9fR0BeVERJX1dHTV9ad3B0cH95emdleHt+S0J3SllXXNLPzsLJ9vT19/f28v3z8v72x8HHV1/W3F1b1NVYWlxBTkh2fXNxeXp8c2RneX5lfktGQlfDw8r8+/765Pr75Of4/Pr7/fvn5P/y9sHR0FNGRVlBRVdXW1peQ0tEXEJOR0J2dnRwf3t7e3x2cXZFUkRf2svHxsv2zvX3ycPCxsD28/fL9M/dVddfRllXUl3U1lhNQ093dEh2dnV2fXJxeXtydnBwQ15Q3Mz08f/6+fvk5P77+/HO9/H08P7998vA1lNTREZcVNfSxN9dXlFWWFfXREhDSXN/fmVmZHplfndwcUdUUNXByMfF9PbOz83Z0dvCw/Xy9sj3ytBV29xQ1Njf1NZQT3V2cHN2dHJ8cHJ6en55ZX12c3Rf1dfC8P3+5eTn4OPn5eT49Pf+/PT3/PbC2NZAT0FMTlxVXVDRUEJCX0ZLRF5Od091fXxyfHl8cXBLWVlY18fCwvHz9fXwytzS1l1c1NLfw8jAxsfXW1DWUF7U2dBQUVFaQUZLdUJCdXRId39xSXFySEJJRFXQ0sb09/b65+Xk5f/29Mja2sjLw/T8ztHS0F9aUdfU09nexMPcVdfdUEFFUk1ycnN6ZHh4e3xwcHRER0NR2d/H8fP09fTFVNHZ1VHZzc/K9snYx9pXVcfSXNXYUEBdWXdwSHR8dktyf3Nwf310cX1IWUxO1cfZwvz65ODt5ufg5Pz9/fTJ9PbNxMVVQU1ASUpFXUFA1d/R0tZdVtPVWFzVRnRIT3Z2Tk91SkBGRFJUUtTPysn098Pf29xaRFFZR1Tb0tDE3lZQ19dd1dFWVdzQUlBVWElFU0x1RFpJTkNKdU9PcXZMS3Va1dfb9vn45ebk5eX68c/1y8zMztvQ0VBAQF9FQVjX1NDMzsTEwNvT3dFYQFpGdHd3fHlycn59dEx3SllQ1cTNwc3OzcXH2tBQ1t/T28zNwMfHxt7Y2FRR19FV1VZbREZETHVOSnRKSXVKdXR3d3V0d0hCRlHbyPH+5ebh4ODk5fvz9vT1z8TF1l1HQUl2SnV0QVfX1tHe2NPf39VRUFJYX19ATk5PcXFCR0BGW11U0djFx8bGxMXZ0FNfXF1fVtPd0tBUVNHXUVlTUdXXVdHW1VFW1VBQU1BXUltbRUNOSnFwdnZxdUFFUNjM9/zl5OX6+/7x9/T1y8LG29LWU0VYWkNAUdPcxMHCz8/MxN3R1FNbXF5AdHd3c319cHB2dkpYUlxX3drF2dzd09fU1tTc2MTPz87Cz8PF3tDRV9fdV1HVVl9eRUdDQERCTkZMd3d0cXBwcHN8dVtd18zK9/zk5ubm4eT4/vD08fTG3tzUWEdGSnN3Tk1aU1VW1tLc2djbVlJUXF5XUEFNRUNISUVHQF1WVdLY39DbxdZT1tFHRltbR1zS19bc09TX1lZT1VRW1d/e19na0VfR31Fd1VVQX1pOS3VzfHx8fnZEXFLXxs3I8f7//fz/9vT3ysj1z9rax9JXUFFeQVzX1tzaxsHY2cXa3tRZWlJGSExKcXx9cXBxTkBHXlbT2NzY2tDVVdfQ11BR1VRU3cPIxcTDxN3T0tFXUFNXV1VVXVJeQEFGQUJMQ0h0Skl0cHFwcUla1dvOyvXy+Pn55OT+/PLzyszLwN/Q0FdbW0FJSEpMQVZWU9fS3NfS2NBTXlJQUllbWk9LT01FWVLU39jawsPBxtrc1tRQXlhBTnVPRkVcV1VWU9HQ1VTVV1DV2drZxMPF0dVV19dXVlJZR0hITnRwc3ZLSUdU0tPYwcn09vDx9PX0ysPZ3tjc1NDS09fW111cVtXcxMLGxMnMxdjd1FJTUkZCQnVzcHd0TkdFWlPX1NbY2dVU19VTUFVQWVlBR1DX1NXexd7azMXU3N1fVtnY1tHe0VNSUFhYXENKSEtxc0pLcXZERVrS29LG9/H38/7y8P3y9ffxx9za3lZeVVVFRFxCS1pFTV7d0VHdx9ZX0tNeVtBQWltbTE1RVVPWxcXGyMPewM7bV1FXQUxaQXRJTUh1TUZGXdHQVNTdUV1WU13Sz8PbwsvBxcXfVdDeU0BHRkJMQUBLTl5cXFBV1tjAxNjFws3FwMDYwMbd1NbQ0NLd2NZXVFVRUlTcwM3NyMv1z9/c119ZWUJ3d0tOTUBbWlzVVFTVVdDU1VddX1XRUVFQU1HU1FHV2MPHxcLb3dRdWkdT1dXQ0t7d2MRUWFtFTXR3dndOQkxCXlHU0tnc2c31y83J9PT39cjLyc/Z0NNUV9HTVl5TXEdDSXVDXFxf18XDxsDA2d3f01VWU1tY19nV1MTA2dDc3t7YVV5eWUFPR0VCTkNEQ05DWllR1VBX0NFeWlxcVtnGwc31y8n29cTa2VFDQ1pDQkRbT01YRFpRVl1X2d1R1NrTVdDd0sXD3NDaxN/ayc7T1t1VUlldV9Pb3sTP9M/GztrVV1FYQ0FCTkNfWEBQV0RGXFdX11VcXlZXW1/WU13U0FZd3Nre2MXc197RR0FcWUZR2dnfxcfS3d5UXF5AcXNOTUpIX15bV1Zd18fY08bMxMXKyMbAw8Xbxt/W09rSVt3YV1hbTXF3TklOUdBX3sjOxsr3xt/Z0FJU09RR0trT0cXZUFTc1V1RUUdNRU91QkZ0dEJPS0VWUVTW1lRWVF9c19zW3czOyfXxysP1z9PX0FpIRERISEVbTk9ATUNQV15d1VVcUt7d1NvB39PBw8bNw9jbwMfWV1BbRVJRVN7a29jHz8DAzdrVU1dZRFxbQEdRX01ZUVlbV1dfV9RTWFFTW17UUUZf1FRW3dvd3sXdU1BWWFtRVVfT2dzcxdvR1tNXRkdeRE9NRkFFWEdaX15dVdzc0d3ExcTNzMPAxN7Q39nT0dLX1NLTUF5ZR01CX1lbVNDR0MTMxsXa2NbT2NPX0NTV1tzT1dfdVV5WVl5EWltZX1lbQE1NdUlHQUBbVtXU1dbX1NzS09jZ0t3Gw8PPycPZxNlWUVFHSEJaTEhDREJMWV5aXV9EWdLZ3sDK2FHcxtPW2tnX0t7c38XfUlfZ3NHc3FVX3d/Sxc3cU9PZUVDXUVtFWlpfVFJBUdxVUtTVWFpSVFBV0F9AXFJGW1VSWlbZ09Te2FfSzN9V3dxRXNDfVlXY1FvU011FXkFLTFlBSFhfT1vXVl9V0NbeyPXJ9/bF1MbB1lTXUVtR01VX09VHU9hUWlfQX13f2dXcwtZT2sVXVcXcUtXb31XZxdfSx9RZV9VFW9DXR0VVRXRARkpMREBHVN3VV9vH3dvM31fd01xT3t5Q0szS0c/DUF1cQ0JFWkt1XF1ORFdEQl7VVNDL98DD9cfdwdheWVRQXtTdVVTHwtzYxtnR0dddUd7cV9XSVNXd1l1d1lFe1t1X18bG0dLe11BRVltX2VFGWlNFQl5SQUJRU1tW1lDUwsze3MfeUFBQRlnX1FJUxMfY2tvVWF5ETkJATERcWU1HUVJd0drAyvP2zc71w9vf1VtFX0dBXlBSUdna1NzD3FJQ11BQ0dZT1MTcVNLT1t/c3dDZzsHfxNvX1NbVXF1QU1ZRXUZaX09MRUdERUVDRl1V19HZ2dDc3NZXV1RW1d/f3M/IxtjExNRRXE1ITk1MTUBMTENHXlzSwcPPzcnNwMLH3dfUUlhaRkVW1dXf3tjH3NFUUtTW1NVQ1t3Q0NzQ0d/R3d3V0Nvf1tTR1lddU1JT19ZVVFZXV1xfXVhfUVtaWEVaXNXR1dPZ0VfVV11WVVdR1dzY3sXY2dnd1VlaRUNCRFpAQEVFR1tS1MfOzMDOycPDwdrc0dReQURER1hSUFBV1tRQVlRQ0NnR0dja39nHwNrbxNHV3d/S0t3UV1TUVltW1VFV11ZZX11bWlJTWVhSRENbR0RfUlRX1N3W0cXe0dPc0NTc29jYwNnW0tFYRVhbRkRZRk9AQE9DUldX38Xf08XAxcXMxNPc01BeU1NZX1JdXFZVXFbQ3dfR2d3Q2cXe29rT1tDS1NTf3dbT0VBTUF1bU9HW1dDTU1BUUF1cUF1bUlNEQ0RBQFhTU1BU0dTQxNvT39zX0N3d3dBVUl5TUFleUF1T1VFfW0VbQ1tU1dbc39Dd2MXHx8Xc0NzVW1lfRURbWFlZXVBTU9TW1tzY2drDwMHH2t3T393X3NrT1tPWVlBXVFdX1FBcU15fUlZRXVZRUlxdWUBCTUhCXVFQ0d/excbDwcHE2dnaxNzQ111ZWFNSWl5eRVpeXkVaWERbXFJT1dRWV9TS2cbCwcfb39bUVFNeWlldUVdXVNXW0N3bxd7Y29LQ3Nrf3NnS0NLS0NDWVFdQXF9RVVdSXVFXVdfW1dXR3dbRVV5EQ0xPRl5cUVdWVdzHx8fDxNjY39PUVV1FRlpFWF5fX1xU19VVVFxbUVdSVtPQVNHc0t7Dw9jZ3NFXXV9GRkVbWkVTUVNRVFXW2Njcx8Tf28HG2tvF29/f39PbwdLUVVRcWF5bQENYRVvVVVfQ29xU19BQRkFNdUZTU9TS3t3Eyc7FwsvE2MbZ0NZUXkJARkxPWFtBUlVdWV5eR0VcR0JW11xR0NLewc3Nx8fY3d/cVlHQ1VxcVlRX1NNRXddXXtXSV1TT01XU2NNU38Xd3MHfV1ZUVl1WVV5YV1BcVd3c2cPC297Z11lbWkxJQUVf1dfU3MHA3tvDxNLZ2dbVUUVNTkxJT1/UUlHd1FPU1lJdVFFaXNLVXdPd193Bx8TE29NU1FReXFRfRFxWXllR1VNW39dU39JU0dzX1tvH2NnAwNrBx9DV1lRbWlFdQVlRRERX1VbdwdvfxttRXlFFTVxXU1XZ3NbewMfZwsne3MTRXlJTR0lCQU9AXEVHVlVeXdBRW19RWFpRVF9R3NDSzvTOw83B3NDQUFLQ11heVFlDWlJYXtHcV9TXWkZWVlPV39jd2Mba3sbH19HZ11ZUVFlFU1FEXtHU0MLPx8PH3NVSXFpbVNVcX1ZTUdfY28XPwtPX01hGXVxERVxdWFhaRlpXUVlS0ddfXVdcWFJRU1ffxcD39MbEx9nVU1BQXVFcQUNCTEJEUlHX2MTUWFJcXFbX0d7Hx9nZxMbExsHd1t3Z0VJfWUVbXkVF197T0tva3tzdV1xdUVBSUFhFUNPQ0s31zsLD3FBV1F1fU1JFW1tPdExFQkBcU15WVVlGXVFbXNfWVMf3ycPLyMTF29RSVdNdWlJbTEVWWFjU3VZS11xMWFRZWNPZ0dTd1VfEycXayMPT2NhQW1bVW0XVVF/extHU28Lf3drVWFTRW0RTXUZT0NHez/XS1drdUdHSXVhV1UVAQUp3QVhNRdTVX15cRUZTVVhS3tPRxM/a28vM0tLe1V/VVVpbVVdHWVFfX1VUWlvUUVpcVllZ09JRV9PW18fKz831zt3T0lZTVFRdUNzTUFTUVtfGxdLT3FRaXFBYX9ZRRVDQ0tzEx9HXx9vV0NNWVlddQUZfR0pMXlpe1VBFRF1TX1LWVVfe01TW39rHxdnQ19LRXVJXU1JVUVBWVlBZWFJTUNdQWl1VVFdUVFZV3d/TxMnD2sXZ11XR0VFW0NBV19VeXlXT1NDa3tbQ0VNQ0NBQUdbW0dPc0t3F2tPQ0tdQVVVEQ0VHRkVHTENdWU1GWFpGXlNS19nT19bR1dbDwNzHz9vW3trR0tvWXlfYVFpdW01HU11BWl1EWlBQW1LQVFbdx8XEzs/c2MLE3tnH2sXD3NTS0ldR19RQ1ddcRVlSWF1WX1lX0tVW097S3sXTV9Lb1lfQVFxR1FNZVNReWlhaQERcRUNf11FdV15BW1dWU9De3NPe1lbd2NZW0d3R3NjQVlXWVFFWUF5dVV1bV9VRVdbX0NrF0dfc3VfQ2dbU2MXd0NDUUdTfVVfZ3VbU3dZX0NlUU9Le1t3Z1tfexdJX1tdfUFRZRVhEQ0dYWV9WUEFCRUVEWVhYUFdVU1DWUFpW1tTdxNvc3d7d38PbVdDa39HS3NRdXl9HQVtaQ0dYWVLV1FbX3tncxMXe28bE28TGxd7f39HW0NbV0dPT0tFXX1ZXW0VQVlJTVlVV0tPR3d3T1dTQ1VFXVdRWUVJSV1BfX1FWX11WU1NfWFhZW1pYXllERFpcUlFQUNTW093T28Tb2trFwcfb39LUVFNHRVpbXVLV1tTd2Nnc3dPe29jd3NnY0FFUVFDV1FfV3N7d3NjS1tLS1ldUV9fS1lfX3t7X0Njd1dRVX15XV11TUlpbX0ZPQURFWFfUXVHXXUFEXlpYUlJYUtPUUNfUUlTc3d3aw9rfxsfcxc7F1NfRU1tHTXVIRERf1NDV09xUVN7ExcbMw8TAxtdTVFRdVtbWVdzE39Dc3dHc3FZcVFReW1BQUlfR0NPe3tVQUFxS1N3T1tPQVl9FQUFcUlzV3ddWUFlDQUVaRVpbWllcWEdeUF1SVNVUVdLR19zExcTNw8XGxtJQXFxYWF1dXdbS1dXUU1DR3tvY2MfZ0FRfXFdWU9Tc3NLc29vfxMHc2sTT3NjXXFLX0NbR3t/Ywd1XVFJaWVJXX1lRX05KS3VMWlpZU9VRW0RFQVhSXFNVVFBRV1Jd1NzXV93d19bWVlHX2d7axtvbwdtVX1JbQkFfXFlU11JfV1XU0tje3sbB3NPUV9Tf39Df2t7W1tzS0dnZ0tLd1lRQXUFFVNVW0N7fxcHZ0N3c1VDU1lbV1lNbW1lZXFBdXFbVWUNAQE1BXl5eUlFaR15YWFfW1VXQ3dZWVlBQ19PT2cfBwcHG2NDT0VNZXl9YXV9EWFFTX1fWVNTQV15eXVNU3N/f3sfb0N3ExtrHwMHGzMPd0NFX1Nzc0N/F2dzFxN/T01FfXVNdW0VATUFYW1tZWVpZXkRNRFlaWlPXV1XXVlDU0dHS3tzc2NvRUlxSXFJU1dPe3tdX0dFWVNVTW19cWkZYWV1V0FRR1tPW1NVWUNXS3djDzcfa2t7d2tvR1NLY2dne1F1SU1NX0dDS2dzX0MXG297S0NDQ1ldX11RW1NRQWVxfQUBBR1hSXVlcVFRbW11fWVNWUlXQ3NPR0VBf1dDV1N/e0t3S0dHf3FRX0ddVVFBZWllTXF5SXlhfWUBDXlJR1t/F2sLB3tvF29jb2Nzd38Tb397f3d/d1t3F2t3S393Q2d/X0dzXUlJdXF1V1F1dXEVAQEFJSEVTXdfY01TUV15T09NQUNbR0N7Z0VVXVlBW09RV0VVfXlJQUVZRU1fT1lBXUVxdVtVXXV1ZRUVbWFPc39Pay8vAwMbb2MPa1tPRVV9TVV9ZVdBWVN/S19LS19Xf2dbcx9rZ2tjR0d/Y3dLf1lFQXkxJR0ZDRFdUV9BUXkZGQURSXUZGUlBYXdRVUlZUVdDE29fS2dbX29jVV9LS1t7Y0dfc1F5TUVlOTk9xdkFZXtHH2sXMzd/fwMXX3drRVFVQW1lWV1bd2tPfwsHc3MXZ3d7Z1tHF3dTS0FNS1tFXVNZSREdHT0JSU13Wx9rW3dxQWF9HTEFETUxZWUBY1NVdUNVX1dDTVVTQ0VXT01RU0t3W3Mba0t/cVlZWWk9CRkNAX9fR3s3OwsDF0tPS1VxdVF1GQERCRlNX19/a2NnGwdvYwsDb28bBx8PG29jE39HS3NVRVVNbR0VaQEReXlLW115FR01KdXV2dkpIdU1bWFDT3t/f28Tf39re3cXE3d3Z2d/bx9jZxN9UVdZTW0ZPdHZ1Tk9HVdLdwcLY3dzdVFfVUVxWUVtfVVdX0sXExcfDxMXCwsfBwNnZx8Tf3NvSUdTWU1fS1VBWUV9FWV5FWNXUVdDXXEZDTHdzd3ZwdU9LQ1JSXNXc0FXS3FXU2N/cxMDb2sPD39jDxNPd3FTV0VFaW19DS0ZFQV/c29nExtzQ0FFHWVFZR15SWV3X09HFz8HFzcPFx8rMx8zLwsHIwdPbxVVQ1tDV19zWUFVVWUZYWkZbV1BfU1NBSU93cnZ1cXFPQUNZVFdR0NzW0NjY39jF2dvMysnDw8Xd2cXS1dHWVlFWXkdGQ0tLR15R0t3W1tzf1lFcWEZaXF9S1NbX097Ex8n1wsHPyMnKyMHDzszGxdjS1VdWUNXR0tLW11dRVlNYRFteX11dXFFRXkBPSXR1d3Z1SExEX11cUNVWU1dUVdDd3d/Ew8jOx9rc09PW1tbS09bUVlNQU1lEW1pFVtTV0Nnf0NVVUlleRUBFX1FX0N/c2MDNwcHOzMLOyczO98jHx8XQ0N3RVdfT1tHb3tbR39RfUl1aRkZBQkVfQUlDQXV0T0p2dUlOQ1xcWlDUXlhU0NfQ2NvEyPXMwM/N3NjE3NPc39XV3dRSUFREQllbQlhWUlbf2VdT1V1GRFlFWtXVVtLE2dPaz9rFyvXJ9/HKzvbO3NzY1F9R1VBV3NHX2MXQVNHVWkRYQU5GW0BBX0RITUZLd0NHSkJZWkVSUEZGXlhGU9dRVNjH3sXIz8fBzMTawtrW3dnVV9vG3dPdV0VaWkJaV1BT1t7Q1dVWW1pZQUdSVlxX2dzX09vY3MbBx870y8/IzN7Zxt/X0tNTU9bW0dvG2N/e0V1bRE9LQEZMQkRDSElJdHVAQHVPWkdGXl5HRFlaWlbQ19PGxtnBy87Mzs7CzvXB3dLTVVTd3dHW119HWlpCR1BdW1HWVlJXXUdZUl5bVlRSVN/Q1t3e2tjBzMn19/XPzMzE2tvd1dXVUl9dUVbQ0tfW0FRZW0RBQFpYWkRZWk1MTUNDRFlFRlteX1lZQEZEQ0NFXF1W09jZxcbDzcHGwcHa0tDWVFXR2d/f2d/UUF1QUFHV1dDR1tVVVlJQVl1ZWFxZWlHUVVfQ3N/f3NvHzMHBws7AxMPMxN7S1lNeXV1R1tLQ3N3XUFxGTUdEQ01FRE1MQEBARkBDTU1PSUBEQU9BXkRaUddX1tvZ2cbMwszPzMLMwtrT0NRTVtLe0dHc01BQV9VX1VfV11VSUlVdWVBVXV5WV15cVNdU1NjFxMbNwMj0z8PKzN3fxttV0d7WXVBRXFxUVFRXU1tHXlpDRFJbQFhSRkBZXFtYUV9GQ0JMQUBMTkdZR1pU11fTxcDYwc3DxsTH2dve11XUVlPV29/S2dtVU1TWVVTQ0NHU0NTQ01RQVVZbW1fVXVHS0tfd29jf2djExsfDws7Y3cXB2dLe2tZcVtRUU1FQUVxYR1pEQ0xEW0FaUlFeUFVVX1leREh0dXVKdUhGWVpaUtPW1N7AxdjGwMbFxsHCxNnT0tBU1dzb3tnHxdfV1tdcU9TR1dXU1NPR11TVXlpcVlJdUNbRV9Df3NPex83AwszJwNzSxcDf28bE09VXV1xbWkVBSUpPQ0lOTUdFXlPVVl3X01RfXF9YTU9NQ09MQVlbQV/W09Tc2sHe3djF39/YxcXS0t7cV1fTxNvc2sXR1dVV1FTT2MXb2drA2NbW1lJFXVdWXFHU1VJQVNTU1dTQ2Nnf2MTe0d/D29zfxdrS19HQV1JSUlpMTEZNdU5fVFFU3sXXVdbVWkNGRUJ1dUBCdHVPREFbV9bV0NjF2NDdxsbbxMPMxtvFwNjR38TF09De29RSUNRVUdXH2dDYwN5SU9VVRERTVVxeVtZUUNDExdPSx8LS1sXB3N7Bw9jYwcLa09PS0VNbWURIdEtLd3NLW1tZVdjb3tJVV1FeW1pYTUlDQHV3TVtbWVXW0NPZ3N3f3Nza3tHT2sfT1t7H0tLc3tTR1NzTVlbT293QwvTA2cTBVlhR0FNAWdVRREZf1FNc0cfc1NLH1lpW2tvV2M/G3cXPwd3awcfSUVJTXkxJQk9KSkZcXdTbwNtVU1lfRUJOQUJ3cXV0cnBGWUBG1d7VU9Ha3t3B9cjY387J0NbDyN7R28bW1djF1VLX3dFW0drF3t/XVF9bXl9eWV9eWkFBR1zX3N/bzMDc19/e1tPIy8fb9fXb0cfO39TS31NBR1NAcXdDQnd1WFBbU9zSWkJeUUZCUldHSEhOSHRMW1tbUNTVV1TU193EwsTHwsfd0NvH3trC2VfV2t5XUdLSVlbazcTew87cUNHb1FlQ0FdaWFNHdExTUVhT3d5TX1TT1NbByMLazfTN2dja2sTa3N3f01VQU19GRllcWURc1lZZWFJZQE9ERnV0QnR4f0tOdkpSUEFEVNdSXdjOx9/P8PXHxM/N3d7Mw9PRxNhVVdLQVVXU1tbT0NVUXVxX1NfU11FcXVtHW1JQWV/W0NfTxN/X2MvJw8vw9czK9czb38HFUV/U0VtORF5AS17XX0JeV1lJRlJdWV5SXFlERkZPSkNaREBEX15bXlJdUdHf3NjZ39jF3lRV2trX0drfVVfQ01Bd08bb1tLDxtVV2tvR08ba1FDT01lHXFBSWVtfWkFCRFhFXNLGx8bI9PT09c7CwsLHx8fb09Lc1V1W0dVTVtDXXkVfWEFDWF1AS09Bd3xzSnV0T1tEQVteX15fV9zbxMLJysrKysvMyMvPwMHY3NHQ1V1X1VBS1VVTXllaREVQ19fX1dLRUllRV1BS1dVSX1ZRWFhR1tLDyPXK9fTLyMjLycDY2NzTVlJcQUJEUl5eVNFQX11QXF9QUF9eXVxcR0NDRlpeU1BcW1lHQkNZUlbU0t/c2dzS09LR3NrGxMXE2dFVVVXQ11XU393X0N7SV9HY2tLYw8TWVlZSXl9WUllEWkdMdEpCT0BT3NvGzsvDw8/LysrLzMDH29HX1tVWVNfW09DRV1FdXVLVUkVaXkRIS3V2cHdLTk9EW1pGTE1EWVnQ2MXFzcjAxcz0zsn09/XLzcbS1NZV1FdTXVFcWkVeXl9SV1dV3dzS1dVcXVFUXVNUUFpGWkZBWFdV38HK9PTKxsPOy83IyMHd01FFRF5ETUdbWV9WUF1fVldRVF1fUVReR0BDTkJBQENYVl5aRVpGRV9TXdfd2d3R1NXYxdvbw8LAxsHY0tjY09fQ0dbU1FBX0N/e2drZ2sDD3tbU1FBQUl9fWUFKd3Zxd05DR1Lc28TGwMPMyMjK9Pb1w8XdVFdUUF5dVdfR0dbU1FZTV1FZRFxeQEpJdXZzcHF3dUtOQkBHX1NWVNPa297bxcfAzsrJysr1zsjB29ra09TR0NVQUV1YWF1SV1BU0d/f19Hc3VFV3dNU1NRSQE1GQkBDW1LX0N7HzcfAyMjCzcrJx97fVl1YRU9CW0RaXVRdUtXWUFfU0NfUVVNdXltBQEh1SkJLd09YRE9bXVxaUVVVVtHZxMbax83M28TDw9nYxdjR2MHb0tbRV1VU1VTc2NjawsbS0t3XXVBQX0ZBT0lOSndIQE1GU9PR38L0yMv28fXI9crP2Njd0FBZWVFYRFJXUlhQUV9bUlJZWltGQENCQ0h1d3dxdHRIQ1tbU1RX1tPT0MTGwMP0y8LO9cvDzcLD2d3e2dbR1tRQX19eXF5Q1t7T2MDC38XA2tLX11BYRFlaQU1GRkFGXlHV0dvIysrL9MzF29rS0dVXXFheR0dHWEVeU1ZR1dHf3dHT0NFUV1JTWkdGTXdxdHV0d05CQExFWVtEXNTR0dzAw8bEycvMxs/OwcTMy8Db2cfZ3NHW11VU0dLc3tjGxNnQ39zWXVtATUp1T09LdUNEWkdS0dzZz/Dy8fbx9M3Hw8HcVlTRVlhcUVNZWVdQXlpTV1NaWFNdWkRaRUFJTEt3cXRLTE9MRF5YR19WVl1V2MfawvX1zcL19MzEw83B38XG2dTU39NTX1TXUFLd2tzR28bY0t/F3lZYXllASE1AQ0xBRVtZUtbS2cfI9/TJw8zA3dTT0ldSUVRQXlfR11XU0tBVVNzf0VZV1FJEXlFbTExBT3FxS0txcUlATEpPRkZBWFTQ3NjDycjOzsnPzczLz8/OzsLF2Nva3VTU0tJU1dvG2NPY2tNQVNFRREBaRU51SU91dENYRERR39/ezPHwysr3yMXS29rc0NPf09dU09/WVNXR1FFXV1NfXlJcWEZFRE5ISEl1cXdLSHd0RFlET1tTX15Xxs3Nz/fxzs3IycHbw83Bxdva0NfQ09RdUFdQXVPR39zQ0t7Q11XR01BcXFNYQUJBRUNNR1lTUlTc29vB9cvCxdjY1tHS1tRU11RQUlTd0dbQ3tvR0N3f11ZVV1FfXVNZRUJJT0lKdHR2dUt0dHRIT0hAXtfd28PPysPBw8zLwsPI98vBzMLC2t7Y3NzX1dHQ3d3f0NHSV1JQVVdYWFJXWExDQ0NKdU9CRkRQ0sXGwMrLysvDx9vB293f28fRVNXX1lBR1NDRUVZXVF1aWFlbQUNHRVpPT01DQElOTk9NTk1DRUVGW1PT3d3FyffPwM/Iz9rHwsPY0tjZ2dDR09fRVFJSUdZU1NHc3tXV1NzSVdDf2tBQUFNdQU1GW1hEX1TS3dDbxMTe0dPS3dTV093c1VZdXVdSUdXZ2dfQ2drRUNXUVltFX1xcRFteW0FLSEp1cXF0dU9OSUJAWltS1tnCwcDP9fTK9fT29MPDzcnB2cfG29RV0t3RV9bQ09dRUF1SXFtcUFRQW1pFW05JQ0ZFQVpQ09zdwMv1zcfBw8Lb2MbAwdLT0dRWWVHV1VZW19TVVl1eRVpGQ0BEW0ZGWFxbTUJDQE93SkNaQk9FWVxYUN/GwMDLysrL9ff1yszExdnb3tPQ09/UVdfT3VdTVdzQUNXT0FBT0NDWUVNWUlxaWFhYRUBaXVfW0NLYx8TZ3N7F3NLYxMfT19bXVlhT0dLUVNPe39fV11RdWlhfWVleU19eXV9bQEBNd3Z1TEp0SEZZRERR397W3cL1ysrw8vbKycvCxd7Y297Z3tnZxcXT1VXd31dTUNRQW15RVFlGWF5BS0NZWkNDX1BTUNfc3sTF29rGzcDAwMPMxtre3tJTVtTXUV5TVVRYRV1QXEBDWVlZRVlfWFpaXkVBTE5OSkhMQkFYU15ZVtvA3d/N9MrO9PD3z8HAxtzV1d/T11XT397c0dVV1tRXVtfT11BU0dJUXV1dWk9CWl5aRFLU1V1cVdHWVdbZxcbBwMfExsXf0dPXUl5RVVdQ1dbVXlhT1VdbWVZWUllfUFJeWFtGRk50dHRKdUtNW1pBWlzW39LfxM7Px8z28/TOyvfO2NzF2NPX3NvY39Ld09ZUVNXX0FVSU1fUUFhaXFlKdUdfREBfVFRcUtHe3dDdxMHGxcfCzMbaxdne111eU1dTUlBQV15ARl5eQVhV0FdfUNRVWUdaWkZOSk1GQklDQ0JDQUFEU1RU1tjCwMTDyPfJzM/Lztjf2sPF093Z2N3X0t/d19Hex9rS3d3R1VFSXFxeQ0lCW0ZDWl5XX1tX0tNWUNDa39LGzs/DwcLG2tzVUVTVVlBW1VReRFtfXFldVtZUXFJWVlhAR1tHSXRITU50S0BGQEJBWVFQV9LbxsDNy8r0y8nOycnG2sTNwd3T2djT1NTS2N3R39vb1FdUVVNbWF1SREFFRFpEQVpcU15fUNXRVdTQ2MXZxcLPw9nZ29rQVNfR11JSUVRRW1hZXV1ZUFXR1VNU1FVTX1lFQUlLSE5NTk9ARURPTUVcWF7V2MLCwMn09czNzMPE3NvGxtrY29jY3NDR39jQ1t/FxdPV1NZWWEVYXFpARlldWVhSVFdYW1JQUF5dVdDT0t7Hwdrf2dvb39LT0NdTXFLV1VJdV9RXUlXd3dRW1NVUUl5eRUBIS0xMSUpOQEVaQERbX15bXdDF2tjA9fTPzMjLwtvFwcHa39rE2t7f29nf1lXW093UV1TVV1hHWl5FQkdcV11c19FUX19SU1JYXFXd0tbex8Pa3N7Z2dPU1tDXXV9TVFFfUlfW11fU3NvQV9bQ1FlFWVhBTk1GRUdCQUdAQ0NGRV5bRF7V3NHR3sDPxsfNyM/Ex8PMxtvGzcLExMDG29PR0N3c0dbc3NZdWkRbRUBDW1BTXFDUVFlEWV9ET0dSVFFS1tnY3dLZ2Nje3d3d3NFV1NDT0dfW0tZWVNPSVVNX09VYQVhZWkFHWFlbRkdHRkFBWlleXl5TV9XX1NzEwsPDz/XKwMbCy8za28HG3t7E291VVdbXVVFX0NdRXFxfXl5YXFFX1V1TVNVRXVBWVlhbXVBcW1HT3NBV0d3QV1fR09HV19PS3dbV19TR19fR0NZW1NHWU1pcUlBZXlZXUkRER0FDQ0ZER0ZGRUVbXlzV3NvFx8PDwMXHy/TIws7IyMLbwcPF3NLZ09bVV9ZVUF1cXFxfWF5RVlxZXF9dX1pdV1BZRFldXF5R3Nvc0N7Y0tfU0tjf0dDZ3NBUVtTU1VZXV1JTWV1WUVNYX1NQXFxU1lFFRFleW0daX15FQkVZWVlS1t/F29rBxsTe2cfPzMXFwMbY0tnF29/U0N3WVVfU1VRTUdVUVFbV1tFVUlHUVVNeXVJcQE1GREVGWNXXVFNR0dfV193Hxd3d3t/TVFTR0tPT0dDRVVxdUFNRU1BUVFFQV9RVX0ReXkRPQ0dASXVJQ0RaX1Xc2tnZx8HAxMDOy8vNws3NwN7bwcfZ09/Z0FFS1dVTX1JQXV1bX1JQV11U1VdTXl5aREFCR15TU1PU3dBXV9Lc09PYxMTF3d/f0NVX0dHX1FXVUFlHRV9ZXl1RVNDXVtfQ09VXV1VRRUFGQE1OTkZYRVpR1tbX19/Z29vZx8bHxcXHx8XZ28HGwdvZ2t7QVNXR1FRX19DQV1fT09ZV1NRWXkRHTUNMSUFaW1heU1ZXUVBV0t7f2MPD2t7Z2sTd0Nnf3d3R19RRWVlcXFxYUlZRUVJU1tfQVFZWXEdOT0lJSE9BRVtHXFRV0dTZxcbAxc3PzMHHw8DDwMHE2NvS09PWVVJR1VRWUFZUVFZS1dDR1NfTVV1FWkVGRkBbXFNSUlVU1dXX3N7f0tnE29jQ0dDW19TW09BUUVdWXVlfXFxSU1HU1NbU097Z2dbS1lBZR1pEQUJPQEFBTUdeXlhZVd/e3tzb29vY3cTBxsfHwsbG2d7Z09FV1tbV1ldV3dbQ3NDd2NbX0lZTRkNBTU1ITkJBRkNZU1JQVNDZ2tnawMTa3tnb2N7R3NnT1lTX1ldTXFNSUV1dV1TUVlfWVVVRVVxcXEdETUFDSUZGQ0BHX11SUdPe3NvFxMPHxcfDzczG28Xf2dHQVdVVXlxWU1RSUdfWVdXf093S1tLVVlJcXV5EQ0ZERVhYUFBSVlbU097f0tnZ29LW3tPR1Nbc19VR1dVXVlxUVVVXVN/T39Ld2dPR1NVUUFNYW15aQUxMS0lITkRHRFlfVNDd09/b2NjYwcPBwM3OwMbF39jc3dFW0VXX1dHc0t/Q09/T0FfUVl9bR0RATkhIQklCQVhSUlRX0d7Y29zHxsbH28HH3NDQ3t/Q1NXSUVJdUdVcVlbV0FXW1dZV1VVdUV9fXlhdWF5AR0RBR0ZdV1dWUdbd3dPexsXa39nG2Mfa2sTf3tfR1FBRU9VXV9HX3N/Z0tLZ3tPU19FUVV1SXERBT0ZCQltFUFJWVFTT0NDT0Nzf0tHS3NDRVd3Q1NRX1NFUVFfcUNDE0sFX3t3R2NVXX1BcXFlGWVlEQkhCQk5NR11bX19V1NbQ18bawMXexMDMwMfMwcTY3NnQ11HV0NHc09/c3tzS293UUlxEUVNZW0FASXVISEBGRV1WVtXR3d/f097AxcTF2MXa2dPexdnQVNTVV1ZS19dVVFfW1ldWV9RWXFpFXkdbWlhcW0dNQURcXlnW0NbV1N7c09DZxd7f3dvE2t7Z2NzT11TXVlBQU9bX09bT393e097Z09ZWVldRU1BWXFhHQ0VERFtdVFdUVlfXVVVRVdfV11TR09PT19ze0NTU0NdUVdPY3NLS2MbY09Dc0FZQX1JcXFhbWUBDS0hBT0xBWVBcWVlQ1VdX1NnZ3dnYwMDBwMLNxdje2t7X0tDd2N7f0t/Z3tPW3NZTWUVeWkdERUVATUxGRkZeXVFWUVdX1tDS0d3b39jc28HEx8XAwMTZ1tPVUVdW1tdWUFbVVlJSUVZcXlheUlxZW1hYWkRbXVJQUFbXVFZRV9DW1tLZ293c3Nja39/e2N/Q11XXVldXVNDX1tHQ0tDT0d/Z0NZU0dZWUFDVU11fX1NYWVhbX1pZXl1SXl1eUFFR1NXS3tzc2MHH2N3c3tDW09rE2NvY2dLX0NTT0VRXU1FbREZCQU5MTk1GQ0NAWlhfXF1VUVTV0d/e2djHwcHNwczOwcLHwcHY39zf0tDWVNBVV1dSV1NdWFtbQUZDRVpFW1tdWVpaWl1YXFBX0dHS0tzb3tjexMDFxsXBx9re09JUVlBT1VFSU1BRU1BSVFFSUVlSXVhZRV9fXlhcVl9fXVBXUFRV1NRU0dTR3dHR0NDX1tbW09TX19HS0NLQ3N/d0NfQ09Dd3NjY3t3S01RUUFBRXVJeXlpHQUxAQkxCQlteXl5dVFRUV9fc3d7ZxcDGxsbAwcfGx8bE2tjd2NzQ0NDQVVdfXVJFQUJNTklOdUt1S0hNRURZWVxXV9XX3djZ2trGzMLAwczDwMHax8TE29PT11VWUVVUVlPV1VFTXlJSWEdBWFhbREZFREdGRV9eXFHR0tLc0tra29vZxMfb2dnFxdjc393R1lZQU1JQU1ZUVlZX1VZSU1BWUFNZWFBSWVpeXFhYWllZXVRX1NDW19fT19PX19zQ09bQ0d7V1NDT09fW0N3Q0NDY397awMTEw9jZ39xRXlNdXkREWkZCTE9CTEBHW1JQUVPVVdfU19/T3t7Yw8HHxcXHxtrYxcbb2d/d1tzZw8nFUN1fWVROQE1MQU53TkxbSHVMQUFSX17WUtNU2NxTxsDG2sbf3N3SwtDQ2sLc3NDf39dWVthW0N1T1d5XWVVQW0dDX9RFQF1YQlhAVd5RVsHBxcHazczc3sfazdvBzczZxtvSxdRRxNJRVFhWXlxf39ZSw9RXUVPRWl9eX0pWWnBccVt0RtZQVVxRXtzWVt1b1dhUVFHZV9VRVFVVVdjR1trfV9rFU9jHy9nE9crfxfTeVdXS19VcXUlBQ3REckJbXndBVkNHUtR308BF0cPbwApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYjljZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpAQCAtMCwwICsxIEBACis/Q0te5ebq/VxYYFpUavL+XVhbUFNcW2tv49zl2dra3OpdVFpgcHzVz+Xo5Ph758/ExMfR/l5NRlPr0MXBwMnjaVVLS2bazcjIyM3kbF5eXFFNaHZd69nX1XRYT0JFVn3MxczQ7khAPD1KWM/Aw8rL4VtLRVFaTVlpaextaunl+97e6eNq9fdPTVFLV3Dpz83Ryc99ZU1VZFJe4Nvd9Gvsa1vgysK+ytxcPzk6P1nPwLm8y+VZRkFFX8/MysTM6mFNUU9GVuHNx8vJwM5oV05PW2Da0dvQ2m9XS0lbbO/OyMfN4ON3TVJ94nxeVl1WSExX89nj2MzqX2BjXFRNWFpPVUtKU1Ve/WBXcO7uZFfu311dX1dZaODOy83O2upVQUnqzsfAv8XTaE1GSu7MwLy+wMPPa09MT1Jc2cvMwLy/xupVTkpKSk/m0up0X0xKTl7n39jX92JXSENNYt3N0dznbFNGRGHWzcvP72NKQUVGTGjfzM13Y11UUlJMV23q5Gxm6fhdVklQ9NjOx8vWcFFRSENW1sW9xc/aZkxCP0zuzLy7vr/C0/5WVWBm6djW393m2NfuaeXhc1FOcPLu3t597nJ5/HT+3d3d/1hkZ3jZz99vV1xUR0t+zMTL5PtdSD9CR1BZ4c7dcWNgWE9HSUxPUE5KS0pSX0xKUvLb5/7Y2fRfUUtLS2TLwby6urzJYFNe7sW8uLW4vsX8T1Jb2szb1tLw5+ni13JbbldKS05q5mJVXFlpel9salVYVElSZ9/Iz9fRcVNSSE1UXs3ByMvYbVo/OT9M6snKzt9XSkM/SGH31dVxXlVNUU9HS0hT6+3jy8zL3E9NUWHSzM3G0ep9VFFd+czCwL7GysnP6Wx15tjZ4OPX09Xq9N/e3uFmT0tKVWbq1NDKwcvlbGjte19YU17yamXu3d16T0Y/RV/t0M3hXkxBPDg+Vfjp7l9YXlFMR01aZXXe09LP1XNYUE1i38zJzNHO4P7zW3XW2N7k2cjR829PR0xW38XFw8nWbkxJZ9zOys/zZWdsfeTIvb7L22hbVExSeuXOxr+8x9LVdU5JR13f1c/mXFVHQEA9Rln48Hls+1JCPz4+P0li3+HtbnFMREJT59nRztxjWlBUVGrSy9vd4dLL0szM1/tmZ+X+3snFyNxkYGZd9/jj4Ojv7nF+8e9uW1tgbm1vfmxidOnPzt/c32ZTSl3Nxb67vsPL187R18zLyszQycLIzulQQD1GaN3OxMLWSzs2OTw/S1VPTEM9OjY6Q0lXev32ZFJJPjxBTXDi2dHS2V1MTVZm7+Lc+llaXG3j49nLztbl7ul5WFJKTX3Uzc7Oy811XFxy2Mi+vMPgYlVQU/zNvb3Ex8zMx8rZ4f7WzMnAvL7DzuDY4ujm53JqVnDh7u5oV1NOR0ZETl5bVU9DPkBIV2x+Yk5BPzw9R11hU0pMbefc3/16d1Rj+uzf3d5sUF7k9+jY19PQ1dloYfbVys3a28/gXlhu+nrnzsnIxs1lSUVGZs2/urm6vtLc42PzzMXAxsjE2XRyc9/YdXTl3ujm4O1LQEZMUldnV09HQkBDRVJkZFlMUltKQExOVVVcdFxRZXFiWklMX+Dp5uPcZFJZbtTFvsjfa3dx7ezh3N/g6tzPzuHc8FNFSF3r3cvExcjeX1JWVFxo5uXczMjMzczX8NvHw8C9vMLTbVxt3tnp6eDoc+rmdl1nWU1MTE9PUlFJQ0dMUFVOTltTQjg3P0VPdNjQ1O5lW11s59fN1vDa33VoZWP42s3L3/PpXUxEQU5sbenOzdVmT1NGQVJpfeLs2sfJy856+uXmxL28trjBzuHcys3LwczP0/nj3/vs1d3uWU5ma11wXlljU1ZjVU9QQz8+PlJiWW5eTk9OWm5VSk1KUFxd2c7gdmNeavjYz9Tb5GlhWEtd69jP1eX0ZFv3+WJw7nz7e+XY1nVPS1dXX9jT0MvIxcnrYlZVXXvczczN09zX49/N0ubQzdDb3/h7+u/Vz8rO3PJoT01WbO1+9+lpXHBXUV95et3xaWRbY1BISEZGatbNz+TxdE1JWFf20d3g3ldHSkxKTU1RVFzxflNEP0BLX9PJ3f/7V19ZREp0fuLV5Oji0MO/x87i6NXNx8fPz8nOxsTLyMfd39b2X2/nz83a1tzQ1fft4V753enYaUlPVEhQUktKXGzo8F5cXWFVUlJQP0lZV1pcUufqTF9XSlVqbNDYc1dPUE1Z39LRxdN0TEBBVWvdytLm59zd0OxZWPN8ftbO1eX2ZGtcVmHV1djeZ11u8NXIzc3Kx9Pc3Wpa59/h0dbSx8jZbE9PW97Fvb3LZFRSTV92Zt7P6ersUUpNUVxgWVVSW2BaYFNIVF1Sa2pg2vhQVUg/TWN89GhgX2PueGzfalt4ZFloVVFiXmD4X1Tq3dfP3mJpcN7Q0M74Zun858bJwr3I091t5MvMx9D3Ymvo0cvEx9TU/01ITU5n6dnPzNnn3e3kfVtVZOrNzNhiUFhWWPrseNffdFxNSlZdXVRPWFtfUUhFPzg6PT9ITU9TUUdFRUdMcdDLzd1dT09Q+tfb38rIztDV08rIxb7Dy8/Kyc7W083HwMO+vcXHyN3w5ubWzczNzuJgVFhWT09TXW7s29RxS0tUWnbs7djP2fZzWVVt2+BhVU1LTU5OVk1NU05LTk1SVUhERktEQElOSUhGPj5ESVBTS1Xw0MjJ2Ojn5dTMzdPLwcLIycnHwL6+v8HHxMDDys/QzcvJxsLHz9HlX1NSTU1UV2VmUklJUFFRXWbu287N3lJESU1QWWR739rf52tQVV9lYWb1c2ZjXlhSUVvs3+jpaVVMQ0JFQT1ASElGQT47Oz5ASUtMVm3/c2ZcX/fTxsHExb+6u7q4uLa2tbW0t7m5u8DHy8vIx8nO3VtLS1Zd7N7v+PtwZFJHSExQVVte++HY2ON0U1V67P7td2d88uzb7WJeVVFPT0xMSkpJR0ZGTm1tZmdSS0pISlJIREZCQkE+P0FES1JVVmBy4e7s7Gz33tXPzNXTycvOzMzEwr+7uLm8vcLAwL+9vru6vL7M6fzn5uHZ3NXX0c/uWlNWbt/V18/T3998eF9VXW1fWlxSTk1MS0VBQ0RLTEhEPjo5PkJHSkxOSkRBPj1BUF9yd2dq9+/+amJle9TMzdjk5N7m4NTT1tTV293q9e7Z3NjS0tLRysnN2N7d2dLKx8fGwb++wtDPycXKzc3NzcjBw8vV08vKzMvT1dve4H1TRUA+PkBFQz8+P0A+OTo+QUI/Pjs7PUNSXldgcnv6bVVOTFNr+u1wbvZ4dWtXVl/uz8vY5NvSzszJy8/QzsTAx9Dm7vdz9Pvq183L0HtaZWjdysjFys/O2vNlZOnZ1c3JzdHV0tDZ19bOxMPAxtDU3NzibFpNS05PUVVLSFJOVlVMUEtEQT08ODY5PD9FQ0ZJRUVGQ0ZJWfvs4GNaZldo7WZs8uTNy9PW2tXY2dLrdNzQycbO1NTW0MrIy9DMz87L1trS187DxMTCwL7F1WZObuHWxczd3fV65Hv20szHxsfJ29znaWpXTFJXVl9bST89QktaVEdIQjw+PDxARU9PTUlBREpHSUpBRVBSZGJTU0xMTE5SVHjVzMjN6Xrq3tHMzNDe1tXY0uvm1c7BvsfR19vc29nc1snGx8HO3tDOztPa3N3X3OHZ3ufTzc3L09jOzMXAx9dtd35p9nJWV1RPWlpQUVlkWEk/Ojw8Oz88Nzg6PUNHSUlKTEZHSkZX4+Ld6nf293T4/F5cdt7RztlsXVtWbufc3t/a6nhrZPzTysTH0s/Ly8bK0MvKxsXBwMjKys7X3+Xh0s7KzdngYGj22tDb0M7PytP3aHHo7PVsXUpIRUROSkpPU2VbS0lHSElJSElKTU9QXFBMVVtvbF5WTFhcVFdZVU5LTl1ZVVldfPdeUUxd7ObV2flpcOzRy9Da29LU4N3ZzsbJyszS0NLMwLy+ycfIy8zO086+vry7vcDMysnLzd3a2uDlWUhGUlFSWktFPDw9QEk/P0dMV0pPT1tmT0xBQkZMW2nmW1VXSVJNUFhs3ejsYVBHSF752O9q/FhmWE5SVnR13N9gV1NobuTf3M3PycnMx83Gx8fFy8rMysbAxMjFy8jKz8rTz87OzeJybNvHw8TJ0H1RUFJtZGJ7bV1COjc8S1JgYFZWTkxJTFBOUlZjWkxLTXJlW15RVk9PUmNwX/Hj2uVfV0/43drfaGlRTElNZFxnbu/jaFZO+tvc0+befF198s7P1s/Pzd7h69HHx8PLycnX2d3KxcfGyMTM2unZxcC+x8zUevl47en58nDwak5FQEVITUlMW1FPTFhiV1JMVlpMRUFGTlpPS05HR0pSZ3fh+21qVFFObNbNz3djVUlJUX7x9WZi+FtUTlrf29Tb4N3r6OLRzcrHy8nMzNDYycfCwsjIzcvMxcLKys7O1uRuYtXP0c/q+GJpaXDZ4uXldVlTTEBJVV/hdFpRTk9V7/1lZFRLSEhBS2NaX1ZGQD9BQlRhXWpbVFVYT1ve2dTYdF1dYFNdYlVv7O7x/VVNWV7bx8rN1OF06Nfl2tPX09Hdc9TKxr/Gz87Ky8a/xsXEztfb2OPPydHM3VhQUE9Z3dna0/NlX1ZISVlX7+JhYFhMRlBaVf71a25uV0xSTlhlTkxLSUZGSkdPYVxaVk5HWnD22XNjWE9LSmBbX2JTUU5OR1Bt4sjK09nX0tLDwsXEzdLe3/3vz8vFyMW/v77Ev7/Gw8fIztTmcd/YztDoaFRTTVRyeeb1fV9QSUFNX+LV2+NnX1NUY2JfYF1dV1dOUGJy/WFfVlRMREdISEhMTlVWTE1l9eX1ZFRIRkZPXVZVZmpfW1tb4czHwcfR4eB9+NbOz8/T4PNgT2Hd2s7Ev8XFycvFycvHwMLHxtTaztDS6F9JSk5MYPJ0Zu3c5+ZcWOnw8P7oYFJbUWN9/Ovi2V9XUEhTVGV7+WBJTENDSElNTWRhW1JGTVz+4uDmWl9YWmhWT0xXXU9NRk5bYOnj0+Xh2d3Ozs7MzcvX4m5k7OjPz8vMzsrOxsPDxsO/wcrU5dzg195tV0RLSlFabO/n2dPZ/Wzy08rM18/vZU9PWmVvW3VnT0RCQUdUaWF0WE1MTE5QaFZl9PpaT0tNYPhcYmhVWVluXHFbYO5wV01TV2zW2+blZV9f7/HMxM7N3ftfXnTgx8TMy9txY93RzsXMw8PM3OPX08bBzdN7VExRXVff3dveeFxW/uzXx87Y61JISF1v4drd325UTFtebOPn/15LR0lXWmPx9ntWRz4/QU149GxXSkVIXPDi3d/sXEpASlv20tXU6lJEQ1bkzcPExNLyYHHw5si/v8jX+mjn0si+vru7wtLn39vLyMzXaU1FSlhn4dre5FtQUF/62sjI1XdTTEtZ69naX09GQ0FDTmTWzulZSD89QlVn6fr3bE9GPkhZ6c/dblZSVVLr0MXG0Nrn6mVu5tnO2W1WTkxIX9rV1t3f7PL36NfOx8bWalhiYmzY0MrN1dLS2evdycjL7VRPTlFW3MrL1Ofk73zu5tDTz9RjVE9XXOrW3OxcXl9bXFnn193uTkpFREZNYWVgXFlSSkhOXF5VYlNLR0tceerl6HFgYG748+fp8u5eUU1PXOvP0uB2a3Ruc9nIxMbHzeFjX+TUycrJytTb2NXPycXI0N35X05TV+nT3eHs3Nrd2M/M1ubf5mFNVllnak1PTlBRUGFk9eNvYFVNRk1RVO9kU01LUUxXZurXZlpjWEtLX3LX2vr5YW3uz8rSy9bqaE9LS1lZe+FjWFJebv7Z1MXK4O9tYmDw3tbN1N/4+OXUzM7Ly9bf8fB86N7Vyc3hYm7i1tDNx8fS62tsW2Hu3NLiaE9JTFjr1srL12dHQUFGVFdiXU5CPURPYPTx8WZPS05aU19w8vBeT0dNaO7X2eHc5mlbY2D26W52X1ZLT/rbysXFx9Hr+NvU0MbFw8real7t2sjCyMvQ4WxgZWTp4ODrYlBKVffQyc3P235fXfz9393x+VVKSE1m59HV3fheWVJbZGtzWlZNRUFDTmTjfWVlYGtt6eDo5O7pZ09OUGfs0svM0OH/ZmRt9uR4ZVRIRENN/c7KzNXsZ1td9d/b3tfhW05OZPLVy8vL0tfNz83KyMrO1N7k6OHUy87kfv5lZ/fdzc3a7vVaTE1Ra9/X2dnoWVdfVVxiYVNNRDs8P0NU/mJYXVRPVlNv3ut9eWlPTVlf9Nff9/BbT23u4NLL1PZpT1BZVvrR0N7g3dzNzMzFw83b2fldcXbw08/b2dTh2s/SzczQ3/RmV2FdWe7Y+lxZVFp+6NTJze13Yk1IS1Xw2OTc2Olv9fVu+/xaU0g/P0FCQ1ZcUlldbOTa0svL19ze4uT1/vvg6mNlYFpo5eHs621cUE1NT09NXvd4Z2Ru5efu3M7P3/5wX1ZSVnzW19zPzM7Ny8XFys/W1M/T2d/g2d9uX2l67efb29zuYvvg63Fu8PB0Y2rl7fDj2N51Xk9MSUVFQ0RDTldLTlVceenu7OJwW2RkXU9RXWZtWl5wZWnu6HrwdFVcc3zp6OnZ09jd0M3KycnExsvZ5tj2WFhdcOtvZubg49DOzs/d29nX3uztb15WVVRYYVx66u/e2u9q7/hqc3Pz7Hnh5vxu997j8GJcV09LR0xRTVVfZWFaX+7yY23x7enh3uD9al1XVlVm+fDk5+97+lxWYmJcWl1eWWLt5N/l2tLQy83V8eniXlhXbuvs9P7e29bQ0c3S09jRy9Xb1tPlbG1z+PNnfnn58GJiWnvm+err6H7p4Hre6urm7+1fV09QT0ZJTE5OTVBMTlRWZWdv9+7ubufpb3NeVk9RUFZzaPnw3tx5aGB6397d2NXT1dfi1s3Oy8zP19zi/Pl99+jp3/3+fmx1a2Jo7eDj6PXg3HBlXllfXF5ZVFtiY3Dm7d/f49DN1Njb4On1cOrW1OLufV1OSUtNWVtaYF9XWV5cXG1x8fB59nJ769/g+HFrb2hZU1BnYF9lXWFeYGdtcWhzZWNudPHg1djV1N7g7XL+4dbZ4Xx94d7m39LNy8nP1tLW0szO2+jucl5YVmFyaWr0dW7y9PPs3d7f6Ghec/jz6npqempZVk9LT1ZTUFNST1JSTUxNVWhiWFx+7vDc29/rb2BhY2Rtc3FnX15u6uvx4tXW2tvk2c7Jx8vOztDgemhlbPrscV5ZYnR97efd19XX3+zq7/Hv5dvd53ljVVddVlpcZ2Rgdu3q5trQ0tzv59zT1N/pfXJaVlRTWmFnX1hTUVJVXGRkfu70cFlYavjm6d7W7V5aX2JfY21yWVZWU09MTllweerf39zZ1t/n3+Hh5vp76ODp5ubr+XFp5uf03tLP1c/O0M/LyMrK0+N6V1pfZWL28XX2a2ptd+7n2Nbg7e3l3ONs6N5pW2FXS0lHS0xLT09VWFpbWlteVlJcWVJg8ujb1Nv8YFthbWx54+Pm9WtbVVdgd+jc2tXS19PR1M7N0tTT3+t9e35qY15YWm3w6u/t73Bmcu7s5NfT1dTd6ntoa2h1ffHx6PRgW1le+t/RycvP0tTY3O7q4OHqcV1RS0hLTE9RVVZgW1hjXFxhaWx5793V3OtuYlpQUl9ycvxtYWtXVFZQTlr33tnj4uHl5t/h3dbU0+9eZVxq7ujd1tXd4u77aW175d/d09LP1dfO1Nnh+XV+6u3p7378dmNibHTk3dvm9fF75tvf8uje32xXUE1IREhMTU5VWVRUUVJhZHV+6tzief7weufwcGVfdvZ6aPnsb2dZZG3w1NDR0d3u2+X24d3Vz9Pf5XdpbWJsdPPubWFpYVlmYm7g6OTe42xtdfXd9Hz44uf77e739eX5a/x869rX1tXi29DU0tfW1tzmYExMUk9SX2xvXlVPVVNYYmNqbPp+Yl9ZWm72dmheWmVjX2Jma3vzc19gd3Bj8Oh69eDX1Nzg2N/l5+vy6u3z4+HY4mP6b3bu8OXq6vvi+XP4deLY1Njf/fflfOHtfOXq7fT/a+rm3drh3d/e6O52/u5dYFhVU05NTVNNU01HSEhPWF1l+fbs3enc4enX0d/8Z1tyaGl2dWxvbl1bV1xv+N7e2M/N0c/O2tPW4O53aXNuXXTr7/5hWlZadOp97u915eTx+Pv4399rXlladu3w6NjNzd3o82/x6+DY1tbQ1d/c3+vl8WJeXVhWT1BYWlpaU1BSWmVaUlhfYGhkZHHq4tjgY1pRU1xfZXnm4/VrYGBm9Ov06d/n8PPv3d3n1s/U2Nrj9XNv59nd5HB33Obr8Gdr+fro7vfZ0eDl/F9ja37r7eLW3+7sXVRhW2fq3M/Q6uzl693c6OT1cX1XTVFLS1NLSUtLUVxVWFFNYfTu4t/YzdTc1fJlbFxi8vfk3HFgX1picHzp4tzV5+vZ29PM1+DV1tfaZ1hcW2jy9m5qeP9tZWpbYmpZXerc1M/scmxYWGNu+tvV2+bo4eTc5e7n087P1HdtdHTq3N3x4PdbXFxYW2peWU9VXl1ZU1BPU1NbYWN3dGhze2f372Jha+LR2PVjV09ZW2zl59jS6HT579jR0M7Py8nN3ub9cfP04OB0bHhZV3Z6fvhoXWbi1NXl5+h7ZWJ86ujb0u997Wt5+mtf59ra2ex+bmdr8Nzd8mxkT0xVU1pcVFZcUk5RT01QWFVcX2xv7eHz6d7b3u1vb+Hg3dnvYmFcVWJ66N7c2+ju6eDe1tTOx8rPzdj98nVlaWptdWRTVVpga2liXV546fXe3Pjl8HBlXmvi3vLc2uTp6eHd1cvK1dbdaWJfZWty/PpfTlRUUFhqd2v95e1ZVlpNTlFUUFJXXl1YY2VdYnh4cPDb09vY2+t+amZebHTj5X306v5s7NnVzsnK0trk7OXd3NrZ3dvtZF1qYlx5fGJfcvD17u7o/m13dmFfe+15fuXr7N/c3dra6vRyWltaZvzn5tzU4W5aXVtYZHp2cW1fXE1FSUxNUVlZXFphbW1+7ebl3eHf3Obe9WxrX1hc9+3h39zjcXfq4urUzc7S29Dc+/Xh4ujY3N319m1eaG7//N/i/GpjblxYXWhhYvDi629++XJ65dre39PM1Nra6W1dZnF75NTc9v9fVFJfZ2H+5vZaWV5QSUlUU05cfmtVVFRYWl1eXW/39fx7eWhfZf5zZejV3efj5Oju497e283JzdHS0N3l2NbYzc3Y2ez7/njz/3344/ZmW09PTVJoZWze1NrmefHk/vHm4+DY19bkYV9ZVltZX/Do/nBq/v5qc21ee+Xu7m1YVE1HTU5XZ2ZlXldUWmhvXmPc2dza6XB+YGJ+aHjr6e347uDf29zq4dfTzM7a39vm39vh1s/W5u3p/Gh1alZaeubjdF5ZT0pTWFvx2dnj8PX8693peuHOzNPW1+NvZvpsZv7t5X5w5eb1cFlTVWd6dWdiWlNNSUdKUlldVFFhW1hcWFVd39jb6u1qWlVaXVz52dj169HX2uXn8evZ49jW1dTT1d3p7c/JzdTWys3R4XNnY+fx/WtbWE5FRkhNZ+HZ2drV2+Dv/Hnhz9Xe3tvtblVTUlBufmZk/9vg7HJiVVloZGhgWV1hT0RCRlFWU150eWlpZWFj8NjV0NPe729ZUFRo3dre3dvV2t1zZXfr19vXzs3O0956aWjg19rT1s3N0OB1a2f9aWv7bFtVTEdLT27569PY2evybmlq6M/a2NPU2ehtWV5YZPtx7e/f3+xrXVhWZF1ga1ZWVU5LTExZZFlgZVtSUE9XWWjd4NTP5GdYVE5OT/fZ5dvX09fb7HR0ftvXzsjLy83X6/h828/NyMrOz8/Z/nPs2+fp8GJXTklITExdeHrm6OLe3N3l493Q0djle+1lU0xISlVfZvDt3N3k/F1jZHz28f5gXU5KRUFJWl9kbVtbWVxaW+/cz9PU197tcF1QUVJnc+nh9d3V2ndo/+/c18zIycjL2m5fX37i2M/T0tLc53zw2dPf6edlXVhNSkxSYHdudmdv6erw79rQ1uDj3u3d3HZfW1xjcn7g29rZ6XBaXW5veXd1Zl1NQkJFSllsbXRjWFZTTlNt5ePo7ev0dWRdXl5t+vxxe/1xePNpX2drd+rWysTDw8nW4N3d2M7JyMnM0eb95OTn6nZwZVpVT05TW1tna19hbHXq6+DQztbc6/V+a2x6XltYVWNmeOXf5d38XWVdV15baG9dVE1IS05PZXx18HlqcFhZ+/R+6PRvbWNpaVxpfmv36/zs9/Pe+WV3amzj39PHxcTHz9bh89/W1c3M0Nh6cOpxd/JtaXRnYV1YYWZeY2VbWmB93trSzNHU19/o73p4eF1fW1hnbP7j19vm8f10WFdmde73c1tLR0lKSFBbW1pdX1xYW2Jta2htYl1kbGt75HNu/mtoa3v4+PF4a11ffN7NyL/CycrO5d3Vz8fFxcXL2eXueWln7+z27HRjZV9WbXBdYVhUZW/7393j6erf5+nf/WxyXk9YV1x+du3Z6mlmWFRZW3r26nBRTk1HSFRTXGdlb/90cfl1cuvvfvrv9fnq7vp6cWFtbmd28vtydF9aZvLn0cnJxs3P3Ofc1MrMyMfO2/DyX21qZmdn7Hp9b/nubnhyZlFPWlpr6N/d4ebz7OLe1Nfd4nhlXm97cObh6mFUUE9RUmZw7N3gZ1FZU09RWmFTV15aWFRZaGVjaVtTXl1RXvh5bGlza2395+Lm7XFuXGL4edPBwsbLzM/Mzs7GxMTHyc/f4O9wcGtfYfx9en145d3yc21eWGBdVWztfF5fXlx75+jz9etmXVlj/Gvi2eduW1tPVllXbOfiYVZWUU9NUVlgZ2JnYvDu+OPt53RmbWdrW19zemJWXGJm9e3l5un2YGRu8N7Sx8nMzNLa5dnX0s7Mzt/e5ej2fPZ57OfwbWHv7f/r7u11X1VRWWBp7+ns9vbs3djb19zffWFYVu7g7efm3HthVlZyZnP07GZUUk1PT0xQWFxXV1ZZZ2RgYGr/cmRUVWddVVleVk1YW2t07djm72VnZO7OzMrIxMTJyszJyMPFzc3Q2+7q5+zw4N3j3uHv4Nrj5v/181dNTVZaU1VVVlhfaPrh4trmaG1gUlVx6fpy+HdfXFlbcPf99l9cWElMV1pWV2JdWlllbvLe6uTt6/JhX15iZWJzXVhYWGh15+PwdGJeUVj94dHPy8fHx8nFx8bGy87i72lja1tr8/z47d/27NvV1dvc5/JuX19ZWFtVVlFXWGrp2s/R2efq/V5faGv9dnN5e2ldYPTwbGxjWVNRVVhWW1RPV1pYV2Lu8GZ0fV9kY15bV1dWU1VVVFVg+t7f8+1qYmVjeeHU1NHLxsXFw8K/wsnH0unc3Oj98e967t/Z2tvQzs7a4fBib2ZVUFVQSUtITVdc8d/Z4OzmZV5cWFxeaWBw8PXp9nLt5v1jaFVQW1BVVlFLTFdUXW3u3tnc8ebueOP5eHtbUE9RTVBdeOPj3/tsX1BZZGPx3d/Yz87NxsPDxMPIzNHi3uHy6v1cW/X6fN7Tz8/Kz9jZ8v31Z2BdTUVLR0NQZeLY0dHd1Ox48Pjs6O9bbvlcYn7t8+rqZmxcUFVWVVRNR0pTSUlfd3vm3P7+9nFma29eWExIS0hIUmpyeeB2aGVdXnPk2M3OzcjHx8fBv8C+v8jLzNHY09rn7Wrv7nzn1szMx8vU2uV2Wl1fTUlDQEBBR1Fx9ujZ6en9aW5u+ndwXVdbUldecu7x2eliZ1hVW1xSTlBJTEpKVmH76dXa4dvi8fx1YldfTUZMS1Fgem3o3XDzeV703t7bz9XdzcvKxsHBwb7Izszc593meefvXGBlXvfRy8rGydDT52h1ZVBRUURASEpOZG9w5N3i5Ob93dbu5t9wWl9hZPDi5+PsXlZYT09VTUlOS0JER0lYe3vk3eX6e3RnZlxVWE9DQkpKT19s+OLo/OTq4dHP0tLLz8/Hxr+8u72+wsvMztHOztri3vdfZWr40s7Qzc7f6n1meHFeT0lHQUBCRU5VV2B9bGXq79/V4nN9+2BbYXPm3uDwdlhNUE9PYGJQT09IRk1QauTd3d7maWd0cOrf/lZRT0lJSk1aZWzz6P7v397Tzc/b2M/Rz8vGwb6/yszQ3tvX19HW7HN6Z1dm4dPPzs/U3Ol5+OTd225TUU1GRkpNWW198urp893R0dvd5Pzqd2n79OjkZVlTVE1MTU9STktHRkZCTGFs7f5xa2ZeW2H953xdU01MQkdIS1xpZ3Hk6v7e09LOz8vIx8jFwL67u8LFx8vR09DY2tnf5uj799jSz8rU3uLxaWBr+XtmUUpDQT8/REpn9GHr4ut75Nrm3Ojtd2FeWF/+6ulhXWVeUlBTUlRUTUlJTVBWdOfe8fD6amxt6Nve5mtTTElFSE5f9Op6eu7o4OHUz9HLz9rc187PxcDCx8vM1t3q3tvp3/Nm8+jd2MrHy83b73Zx/njq+WZURkZDQ0tc6uLa7HDe4Ozf0NHf5mVaWlZ07d7kfmlSVkxGTFVRRUZBPUZHTGft8vLyVVJfZerZ23pYT0RDRUle7Pdt7l1a3dvXysXGyc7c3tDKwLu8vb/L3NXP3M/J0fVpZGbd0MzCwsbL6ltaZmZ83/5RRT89PkRMcONzaVZNXOPZ1NDR319NS01SeePW53xqSkpNU1llb09EPj1GUPLV0M/T31hQYOfS0tb0WExDREdU9+fnY1lOS2feycbJxs/mZW3cyr++v8bN3F9w3c/K0Nl0VVJd6tG/vr/DzN1fVn3i1troX0xFQklOftbY5GBcWl3r2cvL2fBZTkxMWu/b1N1iV1FITFdibk9COzk9Qklg2dHYblleU1Lv2dflc1NHR0hKXeDn/FdJUl9r5c/FxsvY5dfOzMa7vb7Az9TU1NPIw83daFJd39XUwL2+xd7z6eTx39byY1REPkFKS2DwYV5MSVNgfPDU1+lmTUpRa2Pt4Hn0XU1NVWJ28mZPST8+RFRk/tPU1e5RV3R459TX9XRVSUhPZvXccGBXRktaeePPzdjY/mX92c3LwcPKzNnj39jRx8TlZ1xVXXHQyb+/ysvV3t/U0tLN6WBTTktHW//e12NcWlZWYNzXzNZ1YlhXUPnf9+JvWlNRT1N0aHdWRD87Pj5HWl/x/mBbXF5r2+Dk3P9SREtPTnHu5fBZTUtUXuTa0cnQ3XXf0s/DwsC/wM/cz9HJxsbEz+tZXffnzsbBxs3f6tndzsza2edZRD9GSFNmcWFSSj9ESlXg39fgYFFNWFf42Obodl9LSVBW4+5iX1BHPUBGUebh5uj5ZWLt8M7K39jyXUlKVFrf4f71b1FDTVnvzdLM0uR4dtzYysPEx87WdHrd2cbIyM3pZlVh9dTEwsfO0NbczsrDwsnaXVVJRlNl6e1iUk1IRE1d6dbZ32pfW1Rq5t7Y5FdRUUZLW2vybF1LQ0A+RE5XWllPT1FOXf/w3dvhYllWTE9jcHd6YE9MSk9q687Lzc/Qz9TNxsPDwsjTztbi1M/Jx8TL3uJ59tnMzMrJ0c7U08bEw8bO3V5XTUdMV1NOTUQ/QEFLWGjr7fBsXl5ded7ee21nUVNXV3rl3udqUkRGSElaZFxbYVZVcfLc0dDY7XZdXFxSZmxfWVNJRU1TYN3U09rY19vPzcrFytTY3/nq5+7Wz87U3ef03uDaz9LU0NbYz8rHxcHFztXna15XUVpZU01KSEpOV2F+7+7qeWVqef/u4/x6fWljXl9eaG5dUElDQkVGSVJSUVhUVWB4+vjn6XViV1NUUFRbWFVSUU9VXHLq18/R0dXMysjFxsTIyMjP1dXS1dXT3uXe3NrX0tHNzs7Pz83Mx8PIy8/c4m5eWVVPTEtDQ0JARUdNTk9ZXVxicHbv9nF9+vz5emt0Z1tTWFNNTk5OTk1RXWBcXmZq+Ovp8ezoa2peWFpdWlJaV05UU1dve+Xb1N7j1tHLycrMycrQztHW0Nzo/v16a+js5NXa187IzM7JysXExcnKytvocl5oYFBQV1BMTk5TW1ppbX5tXGpv+urr4d/e9WxtZmxhVEtJSkVIR0lQT09PWFRPVWBibmVjeXBeWl5aY15TWVNTTktVXW/p3drR0M7LxsO/wMLBx83P1NbW1uhweXrs6+LX0s/SztTV0tPLx8TKz8zb73pkW1FPR0RBQEZHSlFaYlhZXFxqZGv37H7r2e7xdWnu9XBcUVFKSkxOUldkY2NYYf5y6evf5W1pXFdgX2tjXVdSUk9VU2rq5+j1ffzj0szHysfDxsrPz9vc4f52cl1cXW7p29DNysvNz87OysnIxcjP1drY2dnba1lTS0dHTVFUXWxvdGxw6tvX3+3wbmBeWlRUWFZRU1VOSUhKSElIS0hKSUhMVl9Yb9/qa21gW1VYVVNMTlJNUFrp5NjS09fV0svEwMPBwMjJzsrLztfb4v75fvD66d7Y1dXZ0M/PzcfIzcnLzc/X3N9tV1ZQSUpLSUpQWFhjYGJkZGtmavT48nBsaF1fXl1cXVBMUU9OVVdWWlxaWlVVWVtlav/o6evn7+hsWlRUUExPVFlae+zd293c19DM0NHN0NDS0tzh4uL969/s/Ovq5+5q6eXe29ne19HOx8HCyMjMzdLT4XpdV1ZTVVxrXmh+9WVpX2d67XFy8Pn8eXFgWVFZVlZMS0pITE1LSEpISk5NTFNUVltwdXZzb2deXlhWU1JYXl5+5ebe0c/b2tjX0MvJx8TExsXHyc/W2uJ8bXJtfenc3tvT0tfT1dnQz87Lys7W09LW3er6X1VUV1tZXVZTVVtYVFpfV1/zd3v4dGVlWlFMTVFQUE9PVE5OVVNVWVdUXF5daPp2a3RmXmZgXFxbXV9ZXHFycfz8fuDg7ODZ2t/SzczKyszL0Njc2+Lw7mReZGZl9+7l2NPY08/Pzs3My8vQ0tXS19jc5uXude3e9Pb7cWZnW1xdV1poee3d4u32+ltVUEpERkVBSExNTE9NUFZRUVlWVVRPWVZUV2ZgWFlhWlxpbvTr62558/Ln3N7d28/IysjExMfJyczT1dnd5Ojp5ebvdXvn6NvW1M/Ozc7T19bY2+Hd3+nn5eh5dHP+dmxaYWxYWFpfWlxeXF5kcu7n/ntkYFxWUExKSkxOUExOUlRYXl9tfG9ndm9eZGNja2ZYWFZUWm/h5ezxenHzeHh6fuvc0NPQ0c3Q09bX3Ojk5fVfanj4bmZeb+7i083IyszOy87a2tnh2tHP0tXZ2djX1eDqbnH87nNlZPf3aXNtbGV3eHtsYlZZWE9LSUhFRkdGR01LTlBTWV5ZVlxdU05UVVtZV1VWVmlv6u3n3/vt5uz06eTUzs3QzMnKzcrLz9LZ0M/U4OPg6P5tXGFp+9vU0M/JzM7M0d7j7fPs7PXv593X3t3f72NeZl9bWlVdZ19XXG1gaml4al9fYF5SUFFQS0lJSkpTVWj9ZnTr6mFhY1xWWVlcWVRbbHPz7O/1bnj582lkbuby3dvd3d3TzsvX1NjY3t3e3ub1cHhrWGhmfe/d1M3LzMzL1d7W09XU2d7c28/Oy9PU1N/m5mtfamJy9fdXX2xkbOl9Y2BeX11YSUtOTEtKRENBRkxWWFVhXVlbWEtOTk9NUU1KT1xj/+f+8XT/dOX/d+7d19DT2dDPz8vCyc3LyczN0d3d3Of48GJbY+zb1tLNzM/d29n18OHe6t/a39zU39PR7v3+bF9fX1taZWBzaldcb2p97nNmYmVVXVhNTlVOTE9NS0xPUGZybHJkWFhaVlpZVVVeV1hhY2H77XV7b2lr+G958ezw2tfb0s/T0szNz9Hb59ze6+rvZ19hYWf8ce7Yz9LQ0eDa2dnX0tva09LSztXY0M/P09Ph5erp9Oh5Y21pY3rme/Tw7GloW1JOSklJSUNDRktLT05VXFxWXFZKTE5OSk5NTlBSUWRhXWXueWbz7vF5fPPZ29rUysvIxMLCw8TKxs7Y3Njp8e7ubG9uatzn4N3acXDx7vfu8+zU5OTb1ejc19ne3ebs2vL6+HJidWtkYG5dct176fZiVFtdVVJRSk9UTFFUUE9dZnH+b1ZcYFdZWFRSVlZVVltPXW1y/G1mY2/39/H7eN7e49rT1dfNysrK0djW2unxeGZfYmlia2/u39vY1+dravPl7uDd1tLSz8zN1tbOz9PQzs7R1Nnd5uni3fV07Ort6uj4cFZLTE9JREhKSklLS1FPTFBaVlFUTk5QTEtVUlBVV01RXV5gaWx39Xfx7evv39nQz83Ry8XNzMnKzMjJy8vO4uPf83l2a2B+6eDf52t3dF9YXlVWavvh29/829jg7en53tjTz9He/drd39zmY3zr7evoZ2BsV1RVTENISVBUUk9ZXFtkbFdSXlxsZlpNVlhdb/1WVGJk8vtrbuVw9+xwWG3v6dnX2dTO1tLU2/bf2djY4HZsZFz69G5cdPzd1N3u7f57fW1eVV9t39XR2tLT0tPV2dbOz8rJzNLNzc7Qztjz9+72/fpraWJaTU1GQEBHS0xNTk9TUVJVTUpLUExPTktOVFFZbVtUVl5bc+Te3d3t6+Lv6drR0sjGysnL1NDN09bU3PL0fHJ89PPm8Xb36ejg2eHn819YXVRTXWNp7Nvh3ePn3tfb1Nbg39fX19HW2dDS4OX3cW3t9vdvWU9NR0dMTU9WXVheaWJfa2JdXVZLTFBPV2NfY3VoamRoXnPt6uTkfW75fvbp2+DV09TV1Nrh3N/q7vtdV1NZXHBqZ3lua+rf6d3Z3vT7XldeZGPv4ebc19Xaz8vLycvNzM7Sz83NzcjJzM7T3+Hi+/D7ZFBMRkFBREZKTE1OTE9SV1RVV1RNTEhISEpQWWVfXV1gXGv34OLc2+T17uvk3djNy8rMyszOzc3V2eD8Z2FaV2p6/u7rcHD+8e7p6fR8ZlhUUU9UX2Rpd3lrbfHd0dDQ0NHU19TQ0dLMycfKzNHZ2d3c4H1fU0tISExMTk9PUVZTV2NrZ2BjXVVSTk1NT1RaX2BgX15tfe7d4uHk7v166+Le2NPP0NHY3Njb5OxyXlpQTlNYV2BlZnB8cHjp5+bv7nNnXFhcanbu7uzi4N3cz8zLysvLyc3NzMrIysnHxMjLzdHc3/diVExFQkRGSUpLSExNTk5TWVtWUE9PS0ZLSktNUFBVW1115ujf1trc2dnj393Szc7PysfJy8vLztfh4n5kWl1eWllZV1hbXWv08ube8HdoZ1tSVl5lZmZsZWh19NrX19jX1NTUzs3LycvNzMvJyczMzdTofl5QTkxKTU5NS05QTlVbXWFiWVRSUFFQTlVZVFZZW11m/OPb2djV19zf29ja19fZ1dXTzdLd2t/4ZldPTk1NTlFPS0xOT09gevbo8/v6YlxpZGJ+6ubf39zY1dXSzMzNzcvPzcfEw8PJy8rNz87P1Nnc33hbUk1MTEpMTEhKS0tOV1hZWFFNTUxJTVFTWFxZUlpaW3Lp6tzX2tfY3dnR1NTU1dTNzczJys7V1+xpbWdcYV9ZWlhUUlRVWGRtYl1bWFlVT1FTVFdiYmJrc/Di397Y19rb1M/OzMrLzM3NyMnNzMjM0tvl6npeWlhQTE1RT01UYGVtZ2BdU05TUVBTWWJmXV1scHZ249jZ2tLQ1dDQz87W39rc397a19jZ3PFgW1ZUUU5OUExLS0lJTU5RWFVTVFNUVlRbX2dmYWd7dX3i3NPSz87P0M3LysrJx8XHysfIycjJzdrxb3NiVlRZWVBNS0tMTE5ZWVBUWVROUVNVWVdWWVlWXWtw/NjR0tDQz8nLzsjIyszMzs/QzcrIzdfZ2/Robl5bX1xbXE9PVlBPVFlVTktKSEpLT1lZTU9ZT0tLTldbV2VqZnTs3tze2M/Q0c/NzMnJxcfR1djq/Wdp7ux7cXRqaVxdaGps/3V3ZWFzfW9oYWBmW11haPrc1NLU2NbS2dXOysfMzcrN0M7T2d9+cfpeU1hZWl1WUVBOS0xOTlBfalpQTk5QVE9ZZ1lWZ2JZWF9y+vt1+OX/cufd2NrZ4ebd2NDLz9LP0t5zX1FPWF5rb1lca2ZcXW5xaGZgXmFcYHnwbW54XVRUUl/47NzOzM7Ly9DOyMXDxMbIxMLHxMbP0tTh6v1sfOPn8vtkVlFNS01SU1NaUUxOSkdNTUxQUE5MTUxOUU9OUVBSVlxkftnd2dvo4tvn4uPn6eXf7/hoY2x+bG9pbnF37+TW2t/o7W5wb3X+7urj235iXGFlcn3o3tTSz8zPzs7Kzc7Pzc3JysjK0dzs+VpcYXXx6vHg5/1kX2dXU1JVU1RRVVpdU112XltUU1lfXWdwa1hcXlJXWmN36u3t3uR25epmaWRmbWJVWV9YVF5YTU5NUVxpZHnkeWB9dGf/c3nk4e3k53dse2t+9fvg1s/OycbJy8jMzM3Tz8vM0czL09jb493e4dfT0dbV1d3f6XBvX1VZXFxZZWhoaV5WU05LTlFWWWNYVVRPTVFPTVRUXWdya/d1bWJjXVZcXGJrdm7z+3BfZltYZmR66fB48nttZHtlZHFv8uHzd/xwbGbuefbq69bLztHQ0NbZ1d/d29jOytPc29nf4tzo5+bo39fq+eLhcWxxbHv48uHU39/Y2Onq9vb8d3Xt3nNicHJmcGtgXV5h9OtqXWJdUE9NSUhJSlFWT09WVVFSUFJZXmLw8Gpga2ZfX1tWV1xfffp4eOzz7+35cfru5djX2tvY3t7e4ujc2tbQ0NTSz87Lys3T0tnV09bc2+rr5Ol0d+7z4OHi493h4u73YGx3bfxyZ3j4YGx4a1xpZG3w7ene62FiY2JQUU9RV1lVWVZMT1ZSTVZVZ3Zxbvh0Z3JrYFVcXF9daGT4dVpfbmdkdW72+/f17GhdX2llXF9hZXX3fd/i5tvX5ujj3dnW1NTP2t3f19bX0tDXz87Myc3P0c7P0dff6tzf39/o7OHc5enf5u3b4OLtcWpwa1xaYFJOUE5RU01KS0xLTVRMT1dZXFlPTlZaVldcUGJsbW9mXGdtZGZpZl19b+7m8HXzbmxvfndifW7j29/j2uPd3Nz2dPf/2t3o6dzi3N7j9ffw5tTX2dXR2dre3+jj8ejY4ePa293W19na2d/VztbY2eTn6PlwZ2tn8e1pY2ZbXWJbWFtWUFxWUFVXUVhYV1xfXFpqbGpqbGFoZ2JfW1ZXX1lZVVNSWFhZU1BVW15dZGNvam1ydWpjcfXs59/c2Nzb1dLW1c/NysfJztDZ19HW3tnV18/R1dbQ0s3N19zZ2eDb3tza3Ork6Xh+6/J48G5qcWNeevZpZV9UUlFNT1FOT1lWT1BSUVhdWV9rYGNvYVxmY15sbGZ7bltgcGVha2xndHR38Xtlb31gWVpXVl1cXWZeWmNtZm/86OTe5+Ph6e3j297d29jd1dPMycvKxsbJys3N0M7T0NXd3tzc4eLh3Ofj7uHm8Ofh6/368PlpcGzo63h7bGJcWlpYVmBea15TU1RVUlVSUFBTTlJMS09OUFNUUU9PVFdfXWNmY2RhZ2ZhYmlv7mtnbWv27ev3/HT77evz9+/p5O/p7Oni2NDOzs3Nzs3PzM3OzsnJy8zO0NDQ1c7R2tnS197oc2x1cGJyYVhbdnV5cGhmbGdheGxgZHJiXlxaXGljX2dfWGB4ePl9fXx9Zl9YU05YbmheWlxZXFRVVlNPXGBeV1JWVFJPTk1OS1dkZ11kZGVrbvfo4+XSzs7W1tXZ29bX1tLXz8vQ19LSzszMzc3O1c/P1t3Y1Njb2+3w7Pjd1tza19nc3+PzdnBu+/9pZGJlXFdTTExMTldWU1hYWFFOTkxPV2r4dGtsaGRcXWNfZ/nm6Ph5fW1sXl5cWFVZW1ZRT1JUVlBXWVhcd+/vff3r4uDo2Nje4dja19fTzMjKzcbJzNDO0tLV0s/O6Gz7Xlpl+/3q5+Te4XL15nz84djY3dbY0tV1eOny7Nze3t/h7tnnWVVTT1RmbGZZXFVfUUtSVk9TW1VaU1ZUbldTWWJbWVhVVVNXVWZPTU9QTVdcXlteZF5uYG55b19u7+v039bSztXTzs3T0MvIycHAxsbO1M7T1s3Nzc3O0tPR19zk6vTo6Pr25Ht0bFhdaWdq6e7v5ut79G1cXWVbXH1jXFtcVmNgX3n+YmjydXtyZlpeVVNYVExQXFNfZWdgaFxWXFZNUlRNUU9QUFlUVmVXVWFpZffv8XzufO/e7vTj3d/Q0tPZ1NvZ0uDazsvPy83P1tjd1tns4NTP1s/P0tna4dnY3NvU0dLMz87V2+vf4PT86vd29mNbVVNZXVZQT1ZSUV5YVE9PTlJRT09UVFpkXl1aW1llbV5nbVpkY1ZTTkxKTUxJSk5OXGZeW1pbWnV0aHTw8dXS2NrZ2uDP0NLRztLIxsvKys7UytHT1t7p2d3o+nNdW/L++O7o7Nff8+/mZ3bj593s4ODY2eDi3mt13fT9+mZh/mdXX1lLVVhYaVtdYGRoWGdbT15eYV1TW2Brd2n8YlhfXVxUSUtMS0xMT0hISEtQT1JdYGlobHtbXWL85Ozh2NTQzcnJzcnIxMTIyMnKycrM0d7f5tvZ19fZ3uHi6u1scnZ8bnV7Z2p36N3f4tvX3ebh62NcXVleWE9SXVRabWFeXFxbZ1xYU1RMUV5XUFlWW29dZ/1wWGtlWlRTTVNOR0RFRURUXVpXVk9ZWltZZFpZePHq5Onr2dnSzsnNy8PAwsjNz8zOztDN1c3Ly87bef3xfO/4+2v7+OzueWLy4dzU0tfi1dPN0Nrr6f976O1uaPHw3NjwYGlfbvpvXFpkZW1tVk5XVGL/bVZYYl1eWU1JRkJIS01ISk1KS0xBPz8/RUpISFNZWllkXmFr8dfKz9bMycrKxcnKyMK/vL6/vr7AwcPL0dbR083e5ePzX2rtfnn74+LX5OPk5X7t53Rocujd09rb2dvn3uPyZWdra3RibHhrYnj5cWtqZm5yaW9qY19fWVlZWVpka2pwZl9fXE9LSElKSUdFSUVAQ0dHTE9ZaH747Ovw8/F4+uHi3tLIx8C+vr+/wsTGy8zKztPN09/c1Nza5+7h3eDY1d7g6t9vad7t8c/VzsXGysTFzNDU0tvW5N7abFZmXVlcVV1pb2XyfFlOTkRCQUFISUpPYF5bWWRbW1ZSWFVPTVNPSkhNTFFQTV1bWGH7dWx9cWFoZnbl6ejTzM/NxsbIxMfFxcfKycjO0tbZ19Db0s7T2dXb+WRiV09OTVdYWmfk3uHe2OHd3+DU0NHX0M/Z3dzf1dnaz9Hb6N7taGJZTU1KR0pKSk1STU1XU0xPT1NYWFBNUE9PVVZUVlBQVFJNTk5LSkpGREhMT1BWY+rn49bS09TW2tbS0czIx8TAv7/AxMfExcvKy9DS0dv4eWdp9vZnevlv7+nyePDv7OPseuvl+3vs8eDh7ufc2+Td6erz/mReU1NSVVZWX11aYGlaWFFRTlVQTk5PUFZZVFZQUE1ZT0xSVE1PT0lJSUhIVE5OWmBbeOx7/ntiZORsaO/r79DQ1svFyMO8wsC9wMnDydTSzdfV0tzPz9ne3vt672dZbG5ccn1nduLq2c/T0sjN0crQ39PV6+HibWv5WVZfUUpOTEtVUkhLTUVJTEdKT01PXFdPW15VaGtQWGZaVlpPTVJKSFJYUVtdW1xhVVJcV1BdaWLs6u/g09na19naz8/Z0M7O087T2dvd69nX5d/d3unc5fn3dl9rfnV57O/t0M/VzMvUzc3X2NXb6NjX3djc7tzc7d/X4PbtaVVaUkpQV1dVTkZFSkVDS0Y/RUZHS01ISE9RT1dQT19mdu7n7ffzfHjrc2F+4OHh7evn5+Pc09zm5Nvc3unp5tfY19HY29TP09bb2fXs/vZyW09ZXlhYWl9WYl5kZWBc/uHY1NTQ0szPz9HW0sfGxsXCxMbEycvUenvi+v356O7+bFpbXFBRUlFRT05MTlJMUE9JUE9RUFdYUU9WUFJNSVhfY2Pv6efb1uHV0tLP0dPWzs/W1NPf19vZ0tTW2M/X5er3bXZdXWlvbnvc2t/Z4evpfPDs9Gxt9X157Htpb/b19+337NjY5N3c3NrX087OzszJzM7Mz9XUzc7W3+Pn4vV3fGRYWWZoaWdoY21pWFVXWVtfX15gY3Xk7vP7dGpydWNaXWFcYmZqaGBeZGxqbv337+j6+3Z2/nV8fHzl4t7W2N/08f33eWhu7vt78fHd3t3b2NLRzMjKy9DS1trW3eLg6d/b3tXU093wdndvdGNpbXLue+ro3+fv5N3p3+Hi5nNr/uHj8GBeZ29hX2VlXmh2ZGNlYGp8X1xq//Le5ejo6P786/twe1dLUU5MTExNVlRSXGRQT1ZUUlNTV2dkW198Y37j7e3e2tfQ0uPe2P7w4N/e3tvS1Nne0M3b19TW0tTa29vf5+Dn4tPX3ODj2t7mbmNoV1NcWWVeXHb6bHDr2tvn8XHqe21yYltnfurq7XL46nRrcGtcXlpVS0tJTkxHUmRbXV9ca2hnTExRWV5aTE1SU1FOT01XWWbn4Hd7c/5uZmNo697Wz83NysvNz9jq49vb2t/q5ent8n57/Hb959PQ2d3i3+XubmZfZfnqbnD6/Or6cF5jY2xvZFlUb+10V1JWZ2NjeN/a0tHY3GxaW11baPjt4Nrf6vleVVJPSkxNSEhJS1BNQ0RLSktVWl1oXl1iWktJS0tPW1Zd6Onk2O1q8n5mc+P049jc087X3dPb387M0MnGysfG097d7O7c6n7Y1dnT1fxvdF9ZZlpUaXp7+vhbUFBLTVlRXPV1Y1pUUE5MTFNbXGzm2tff9uj3cHT4dWBkbu3b+HH9bPt79Hrs3+Ph4mBbVktIR0VFTFBXdX1cbP9cXmFUUVdUVXRrWHVpW2NgXG7p69zN2ejb5fPub37b19XNyM/QycrOzNne1tbcz8zTzdHZ4OVy7N7l/d3uY19bUlRQTVxaX23xbPvv7HdyWU9RS0xQVlFcXl1fZ1hfc2Rn9fD67XpsZ2FSXl1RYe/q2tLQ0NXY/f5pW2dtcGr0+Pjnc2x5c3ff2dPV39vgb2VfcHJr8ejc2+Hb4Xzq7nNwdvrm2uHu19bm3Nzq5/N52tbc3s7X5dnd4uPq8N3X2tHI1t3afF9aTU5gZF/84Gtv7WpbYVVp4PRpdWZRUFVMS09MXvDn5tTda2hiV1VYUmDv+/De3/fi2+DX2dvNyc3Mzs/V1tbn7fPx5dja0M3NzczT3e3r7eT+59ri2O308HBWYGNcYllbY2xcZnVyVWNo+uPe2dfS3eP/c2f39+Df1c/KyMzN1tnj2dvc4uPp7G5eWlRPT1lc/HLk29ff7fxoWE1UWFpXXWXwfPf4bGZle/Tsb/jd1t7t4eJ1effq09fNw7/EyMnP2trb2M7PzMXEys/b/G7rfHvjc3rb2d3c7VZQV1NjfW7gzuViXFJGRUtHTFVScNXq6+br7d/qft3de+DU4Nrb7Grt7uDOzdPHy9nQ131naFJPUU5JXF1ab2Bf/HlbaPp3bdbu9N3yXlxZU2/l4NbM2NPK097gfWTs2+fczdTOzdba2uTv29jd09Db0dTicHZqYfPg6OX4XWRjWE9TT1NdXVdpe2zr4u1fZ1tVWFdRVVFPU1dMS1ZUWGh7aOnf6+PZ7m97W1VdXlh58+3Rydff2fVjbXdcaXRm+GtMS0xKTFhaWO3k7NjU8XFubmf/eHfZ293T2OTf+W903et+39/g4HtpaWP8+dvp+uxpbf96dG1xd2Nzc3T/8dvn6OF3ZFdSWlZYW1ZcUVxfUVZZWlxfYFxYX1VcUklGQT8/P0BGT1ZQZl1XVldeYWR09vD9aOXw5uXl4tXPztLR0dLO2tzq6ff7aWp2cGBodm1qW2j7737p8nd2eHd77vj9eXBpbGNeZXZ2aFpPUk9OTVlhZn7m4OX7ZXH09Hfr9Onf29/b2+Pe4evw5nd+5exeVE9NTk5NTVVPUlxgXFhVUFxeU09NSUdHR0JCRUVKTk9VX1783tzp7t/s3t3d39jW0srKzs/O0MnKztTW3efq4vj75fZ1YVtSVlVk+/peXmllZV5dU2RjXWv/Xmpte+twYml0YGn1fVlm8Glu+u158t/R3eHu/e3mdP3mefbr4Ozoenj262Zra1haWVtTXlVYZ2NVa3BgaO/yYm5ZU1dZTVNOSUlPT1FiX2Lq2unY2Nzf2Nra09fQys3Yzs7X1M7Y1dDb29fd7/ZsZmpmW2h+av7zY11wYGB59u/o39/b6Xh06Oz15ePq4uf13t3j6P1fZmRbXHBsaPdxeuPvXm1tZGhxa+HX59rR0tfP1N3V3/fk3vb29l9ZZlxeeujl19Pq3d9mVl9UTk5PUFtcVF1fVlzz83rY19nM0Nbe3fTm39Xaz8zQzNrX09f149jb6OXf5trd193n6ezd4vPzd3Lu5ejw7+v26PpvfXXz9OLa3PRw+uhwa/Ht8Ozb3tzo8O7vd+/n8enm5vJ0ZF5hbW/e2dLOy8rKy9vm621p+PLv8+3s8vV1fPnw4NXd8vNuX1VYTE5QT1pmX1x24t3P1NXZzuPa5d3v19ze2NfW1M/p2tvm797m6OPe2tPteOjOZd7W6tLZ+2d1UlJaZGx0bPHh9Gz373l+5eDq5uDe6/Pi3O3x3tfV1tLW2+Hs8elsX2drfP5uW23ubuHW2dHLyMvT19re7evY5l9s5vDs7vLs5Ono3nJdX1hadWpbVV9eZ/1aUVZbX2dncnFpa9vT6nLv7+TW1M/T3N3b5G1xbm3g1tje2+Hc0+H483T44fdfXFNLVF5YVVlZYW5vdPB0YXx6a/3q++bc3tzY3Ovg4+La6vLmdF1eZVdYamdra1tYXWNg+Ojy3uN79ez3/nz259zd19Lc4+fz83xaVFRbXVZXWlxYUVdaW2x+6vd7bVVaXlpjWl725ujh2+pnbGpp63FbUl5nYFxdaez1/OlkXGRs7nZrWk9XWl9bU1VbaXzl3uHo6OXf3fVte+nZ19LS0dXT0dDT2+rh2uLyVk5LUk9LS0lKUVRSWE9IS1FQVU1IR01OTlRTUlRUVm9+a/jj6tfa8Xvn3+rc3+DSz8/N0d7p5fzi4WJaZHpv5dvh3uBy7uNvcXlcXl9QTEhNTFJaT2JlYnbee1ZVTElNRj5BP0NJVlFWW1RQX2Nd6+nu5Nvn7N3Z3NLNysLEyMbByMvKzsvN1/D05PDf2etsXVNMVVBJTEhDRUZFRUlLSE9PUF5eTVJSTE9aTk1MSElKUlP+63Ds7G373fv57WdeevNs9N7q3c/NxMDFw7/EyMPEyc7X6ujd3dzU3Onhd2vj819lUk1PSkdGRD4/R0RIT0tFREdFS0xMT0pLUl5179ne6drd4NDU2dXV19LS0tHOzM7HxMTAw8zU1+bn2t/selxhYnR69N50Z21cXldRVElGR0dLRkdNSUtXXWl6ZllhX1RaVFRRSkpJUF1Wbe1q9Ovp083Jy8vKx8THxsbEx8S9vL6/yM3Lzc/R09zo7fpo/Whub1VNTVJMUFRNSEZGSUlLTlZgXejV1tnm/PHs/3f15HJy/P7b08/Mz9DQz87Qzt7/Z2J1c/ZhY/n/7tbX0NHe4eXpffxvZ15hbO/f3NXd9HFzef7y9G1lWFhlX1lPUVFWYHHo7Gto9Htu7uXk6tzUzsXExsbM0M7NzszL09TW3tbPztLRztDRz8/R2O/wbVxdXV9TTlZVaOjf19/h6t/a49zvaHJYXGNhYVZodG3v5tXU5N7l+2pkXlBMTU1XaPje6ft7+eLp4OZk+3Jz7u3ffuvf5NTQzMjMzdDS3NzS3enh5N7X19PX4nlra2pra1dWVlRicfH+++7s2dLQy83N0trjde1zYW7u6dvPy8jJztLQ1eH2ZlhYVE5TY29q/fB85NnT1dLO0tTrff1cWGFlaHD/7eve9F5ocG5oZ15VT01NUUxMUU9VWm9wbd/ufu1fZV9cYXPa3NvR0MfGzsvLzNHa2Phy/Hbd2dXV4Nze5Oxs6m5UX1dVV1JYTV70duTm29Lg3Njb4ufbcV5zZ2r8dnhfZXfz3+ze3uzb5F9ZV1NJSVFPWl56637u3+Dn5NvybfDz6+DW097p5ebc4ubmbWZsZmxsY1JSX1xZWmBhUFhgbXdiZVNNT1RYWF9nXGD569zT2Nzj3tne5+p3YlRcde/n5Nve4NvV197vbVRPVFxrXmFkV2P2693p6ePy6vH+7G1lWk5XYWJdXWxfY3vr4m1eXFBQVVlSSk5KSFBUZWJaaFxnfn3t8uj0bv7y3tzd193j2M7Lztjgcmn36eJ9+/Bn+eTp5/rxcWJmZV9YWVJKSk5PTlBfW1107eDi4H5hVVVTTE9QT05Ucfh24uT78/H/XWNqX1tZW11YYfhkX2ns6uLY3e7ycXR38upfXl9pcWru+WNub2xfYftiWFdSTEtLTU1NUVVXXnNfT09RS01VVFRZaXjp1svIzc/N0t3U0trW1dHc29jd19fb3+7d1tbj5d5xcO77XVZYU1Blb3D7a3t0W2T0cHtmXlBPU0tNU11aWG13eGtfW0tIS0pKSk9OTVz56+fb3nJra3bw3Nba4eHX293b0+dw8+je19XV2tjY4d99bFNMT01aYWdrWl1ZVGJ04/lfXFNTXnF1evzm39LM1dzq7vNideHmeHbq5dLN1dLf5eL15dTO1eDk8+rc2tPb5vv16dXN0tjY1uDd4HxuWFBPUV1fZ2BYWFdcX11XSkZIRUZMTVFOTk9a7N/zbltbVldyaO3m7tzVyszQy9LQzs/LycPGytDRz87U2tnd/e/k4d3e5X76691sXWFYU1BcWlZvbGl4be3t2dPjZ1VhYV/u5vN6dO3w5ePt+vns631t8G9daH7o3NTR2dPS0c7LxsjO2Nvc2M7Q3Ovp3d3Y2drp93lybVpTT0pIRUZKTFhPT01LXnnj/GRdVmX959XV19fb0M3KztPW2dbO0tPS2tro5NvY2OTd5Pjb19LW3tr3dO/c1O3o6v3f28/T29Td6NzW3mxdWFFVYHVuZGlrWGPo63BbaVpWW19uXF9bVl114ur26Xv029HT4Nzc3t7Z0tXW19HPzMfEys3N0N/x9O7k8vPw5Nve4unk5O7r3up9YFNTV19hYl9YX2dn7v79fmJ0dvb8c+r46fxs4W1lbV5nYHjpbvNnYWxo3Np64+bk3tjL0srK0M7UzNF16+Ln7vTQ3+Lb5djw5d9ZV1ZMSEVPS0ZJQ0ZFTWxTTVZTUFF5d1RnbW79eNHa+OTk3uTOyNHOzdHc3svO53j55u7aztTQ0dTb3MvP6ml3+nzo1tfb2Nvsa9vW63FeWUxKV1tXVk9MSFBcUElGSklLU1NLSkxOTlFcZWleWFJOW37p5+h1cHrd1dbZ3+Dg2drUzcjK19PSzsze62lg+HTw6uPlXF5oZ3Vsa1VISklNWVxrVE9UTVxoXlZIU1pPWmNsUU1WT1lncnhPUFtTYe/c6190eHXazMvZ3tPUz8jCwcnIy9LPyMfZ5dzl6dzOz97qaF1WW21TSkQ+Pj5JTEZHQj8+Q09JRklISUxf9G5mWlVSW+vpc3RfV17+0dbb2/hnbNfQ3NXgdXvmztDQ09je3M7M1tjlbnfg1M7N0NZ3XHjh631sU0lNUVdaVlJKREdLR0pJQD9ASU1PVk9PS1FgY2tlXlld8OLZzcvO3tvQzc3Kyc3PzMnFxsXGzdDU19XV3nlq/P733d7j92lsX1laWFdOTU5RWFdeXFZYS0pLSk9MTU9NV1phZWJjYl1dYFtbVFhPU2By8/RqXl/39ufc1MnN1M3KxMbIydDOzczMzs7Q0tHPzM7R2/VfV1pWUVRUUFFOTVdcXVhIQ0VFQkVJS0pLT1BZXFhZTlJqX25sb3tj7tnSzdXX7eXS1czLyMbOzMjEwsXH1OLV09DO1tDT1MvIycvQ411bXFhXUVNQVF1kal1zZkpJSUlGQEdISUxQXFtrZFFSVFpaVWFbV2b12Nzc1vfv4ebZ3c/HysjFwMPHxc3Q0dvb8d/a4dbTzMvOzeFnX1xcT1FUUFdrbmJfbWJZUk1OSEZKSEpaYVxYa11UXVxlYmRqXWZ52tLZyMva3OHU39fNz8nFvry/vr/BxsrJ0c/O2tTMxcTLy8zX3vBjV09PS0lLU2FcaX5kWk5KRERJQ0VJTl1aZGdkY11gVl12XGFw7trj1tff3+7tXVzt+O3W0MrIwr/CwsXK1O3b1d7V0czLxL3Eyc7Q5mTz9WRnbf1dZOl+bmhuV0dLTEhER0pFSVBZV05UUEhMWF9faez39czDx8rKydTZzs3Lx8C/wr24uby9vcrX0tvb3N/le+TOztfk42tMS1JMTFZOTFJda2BdZVlMS05LS1NWUU5bbFVbX09MSVBXUFtbV110293c2f9nW114d9rQzsnHvb2+u77CxszLz8zJ19LOy8fKyc7a7WNlY19rVk5QVltQWFhMSENBQUNJSElPTlNOV2BTSkpMS1j8dmfu2NLQy8nN2d/ncGffz9PNxcPEwL2+wcjQ4PPY0d3c1c/QzcTG0uZ5aFZqfVxaVV1ZUFhcUE1LRz4+RkZDRUVHSUxXS0NAQT47QktLUFx77t/N1+b2bGJZbNrd2M7HwcG8vMHAw8zS19PS3d3b2NrUydbg5WlbVWFsY2tbX2RZdmdQT0lFQkFKSElNS09OT05HRUBCQD5ITk5UWHjg28/m8HpVXVde3N7Vz8vBwLq7v77Gy8vQy87Y4fTe7ePW4+toW11WXF5dXlJXXFNZUElGPj49PUZKTFBYZGBgXVZQS0pHR05eXlVl5Nzb2t7ucF5dW1v693rYz8zKx8XIzc/Y3OXm2fHu4Ovf19DP4Ovq6Pn5435saF1fV1daTEtIQj49REhJUU9VYFRTTUZFQD9BTFhZY/vd0s3MzdDS3ert49TW0s3Lx8XFxcXJy9LX1t7d3uftefDg6eN9a2ZdbvT45Oj4ZFxyXVdWUVRKSU5NVlpgaF/tclNSTk1GP0NDSVFSXFdlfmVtaF9USlBaXf3e1dTMw8TFwL/Ay8vJzczO0tno2tTWz9DS5e3c3d3T2/1kXF5XUVVOR0ZHSUtf9Wtqa3twYVlWT0tISUpPWlpcZuvk+vzuXFdST1Nade7v4tPLzs7Eys/Mzc7My8/Y1tPOycnCwsjHyMrIxsfP1t1+bGtsYkxHSUZISlNWVlZQT1BSSkNAQT4/QUtPTFJj/uXi6nRbe2NYYvvi5OHRy8vJx8nNzc7W1svO2efr4+Xa1dPV0s/OzsjHzNLS0uDq4ur1a15fXWt9e+rm7ntgbGlNSkpHRkNIS05cUk5VavpiU1dfW11peHvp5dvTzsnGxr+/xMTJxcjKyc7OzMnGzczHzMrIxcXKzdHZ7WZnVk9PSEtNTU5PbnVfbFtfXk5RSUBFREZITVdNT1RYdWFYXFheXF5vft/q/eTaz87NxsrIxcfEx8fJ0dDRzMbLxsnOyM3MxsbK2N7vcfBua19QWVdbb3nh+WJpWmBjU09FREVCTFBUW1JXXGHo721fWFtXYXHo5/XvbPHNzc7NzszMwsHGwsnZ3tfOzcvJzMrGw8LBwMvU3nLu/ndrUlFMSU5SYFpPUEtNUVBPRj8+PD5BQkRCREVIT1txa11iXWtz7Nrq5et279/Pys7Lyc3Kx8bIzdro39vWztDV08/Mz8jI0tje4/tx3ehnX1tZVV/+eWx86vdk7vlWTEhGRkVJSENDRUlIVmdSTVBVUktRWVRYWlxUYeDZ3NHMy83Jw8bHxcbMy8bHycrMzM7Pyc3X1d30bXp7XFhUT0pGR0dHTFBPUE9US0hHR0hGQ0RBRkpGS05XWlNWX1taWlxYWm1cXWVnZWbq0tLP0dbe6t7f4NbT3enh2uLb1NXZ3NjR0s/O3f/q5Hd5e3ZVTlZefend/VRaWU9QTE5FPj9ARUhOWUxOXVpkbfX7Xmhy/d/a0N905u3f0crH0drY3tLIxMzd1N3l49/d7Hr+cXbu3OVbWFJPW2ZfVk9MS1Fm3t54ZFdMTVxnVlBNSElOYG5gXVFQU2Ltbm5dTE9V7trv52ZbY+zO1NDM3uLe0MfLytL5ZG3b3ebX9mJt6tDS1NtmWlh9615sVkpKU/rj3+JcTkxd92J8e1pKTV5r999sT01b8O3Z2XhXXPHXzsvS9F1919rXzc7o5dbQysHDzeDb0NLOycvpZu7t4NHP5FBJUFZaUE1LRkpNUm3xcE5FSU1YX1tNSEpITGji23FQV2nu29TfaXHr6dPMzNpxY2rx2s7K1/P85c3Hx8zU3fz65NnV4vFub93Uz9Lj6mhs49bVeml2XWzf4N/9WlBSX2zzaltaSUpba3pqXUxFU2NeYllaUVB23dbn6+pj9tPLyczM2OXOxcHCxsvc4djPzNLQ3nXv1tLY3OJeWmh85/lqZVdV7dfa7u1XTlVj5ODb4mpeYPzd5d5nT09QXWBdVktNWGnp++huWWtw493m5mNdYm7W087O7Obb0srJxszU2+XY1dnga2l4+t3e2Olv8OrZ1dzqX1RUT1NYbG1aW1dl6efa6G9qVl5fenBXWVtgfebi5nv68+Db0c3o8/xv7tvPztvg6+bY19Ha6ONtZnf27WxoX2vo3djd5eNzc+Hn815RU01QX3Dk8fl6ZuDX2trtcFtTWV9nYFhXV17w6OXf2uD43NHT0NnwaF707ePa6OVma9zf2uDmclhyZ2J5XVhWUF5zbvT0bFhm/HDs3G9VU1Vd9tzl3mNk5+jc19nuXFtcWWppb19t5ufY2dHZ+eXj1c/a0v1c+fzYy8vM4enu3c/d0+BfXE9YXmZ0TlVbV/tjXmVQVlVjd15jTkdLSFNmd3xbU1Ng2tPR23RnV2Lp6tz6Xl9e+uTf3+zq/ejV1tTgbWRn7NzT2utzYGHk0M/W4mxZYHfn5PBeWVlf7+b5bmZbWWzn7m1WTEtMVF5iXVtUUWXg1+D+cl1XWF5jWVJLTlbi0dfY4ODo1snEydp5X3Df3Nnc5eFufNnOztnqdmVt9+HeaVZOTVlfZmNYX2Fr4OPraE9MSFlmcnZXVFNRbePe3fJzWFRWUVRPSkhETF9t+nL2bl1mX2tyWVBRWeLc5On27HLn0MzGytnhZ/ZuZnRnaFhe/erj3Onu+vPj8ub0WlBPWVxjb2xpXmvZ0M3O199mYFhTXFtWUlNcYWbm7PB5bXVdX2JfWlZjcOnZ29/t7Nrb1dHa52tubXfi2tryZmVjb+fs+mNkZmV4dWZTTU5MUF9u6Ofw3N7Ryc/f+G1pVmZ6bGBWXGT+3t/o2uj5XmPuZVZOT1ZY59nh2vdsY2nb4nX+Z2dbY9puYGRZVE9kb1p29mxfc8/V3eHueV7q0/7f1N/e0sTGzc3U6mJe63Nu5/pcWtzbfu/k+mds3t/q9XhsaNTL2tjP2vv61Nnf4+fvW2rr/XxnXE1FUVNOUVNfVF/h7vhqXFhSe/B6+Ore8OLJy83KzdXu8et9cmljX1Vq7GVjaWVbXXxua/d0aGnp2u3u5ebq39jZ59za7+nZ2tjW1/BmXlhhU05TUFz45eT07GZRWl92aV9wbXTi0s3Z09Ln4ODX5XLralxubury59/+39nU3fzmZV346NTb3tru3+3a0NzP2ObX187X39twaWVgXVBaUklVYvPZ4Nnna2hfb2Bt+Ftr59zNz87S4uXy7vdob19cZVldV1piWFRUV2xncGRbZ19q5tvV2N3Z3drZ297o2drcz87Z6P1+Y1hfZ2xjW1tUY+zh5P77dXXq7ePn/Nzc0MjIxcrO1ODb1OLrYlpaWmVfdmlZUEVJT09YVFdQTFRXcu735f3q1NrQz8/O1c/MzMrP2P1493L1+mVWSk9WWWFfX1VMVlxs4uvhd3vu3s/MyszU19nY2dfS6fT9/dvV0utZUE9XWEtPVFJSSU5m6nJTUlhleHXl3Od1XGje0NHme2ddbPvp2/n+b3bc0NXsb1xeZn3f2uHvenjj1NDT1uL0cObd6ONpWVFRYnJ96/ZrXV1pcv12XWF05tjZ3+p6aGR5efDn4O1r6tff2+dnWVBWUFBdV09OTlhsc2JpW1VeY2vs7Hht8NfUzcvJzNTZ0dXTzdx7a/l7/OrwX1JTWVZVWltOSVBQVF5pbVdXWmvr39fc3dfUyMTEx8/X5O7i6uDxXVtbXX50Y1pOUVBPTUxPS01SVnHo193r7XDj3drO2N/l6N7Y0tTo82RkcPp2amBaWFJVV1haXVlcZl1ub3Lr7efVz87Y3dja2tje1dPb3WFh7vNxamNrWlNSTVZaXmFZYmpnXmP89u7uc29qcW5qbnN77G90XmP8+X5oa/91ZGxaXVtaaV1eamp6bXfwe+Li7vfw6+n0+une4ebs4tnPz93o5+39fvTZ09bU19rX3d3p+fJwd/tt+X5pYltecF9kXFBZUlBSUk9QS0lHS1ReaWJraGJv5dvY19bX0dHUz9LSztva19na5u/uYFdKSElFS0lDSlpua27k1uDe1tLO087O0szIx8rJw8jO29nd/mdRS0dCQj8+QERLTEpRUVFYTV5hV3FqdfNy2tHU0dfMyM7HwcPL5epeUlFPSUhPV2vx6d3l7uXc1tbY3nNZWVxkZF74/Grl2s7Lz9xdTE5RVFNPVU9VaPPZ3vR7X/3a2M7Q2N9zb2b+5OnucHro3c7P1+9ZU1BTU05PUlNeZ/3b0s/X083O09bW3/5973BgfOx1cu7X1+d4ak5IS05KS1BUVk1RaHvz/Ohz7Njf2Nvm4vTg2+TX1+zo6trV29n5XFNRYVhPWlNNTVRjd97T1tvVzdLPztPW7uXc7NXQ29/z5+Hl819UU01HR0ZMTElNT1lj7tbZ59vb18vJxsjPy8zRz8vFyMzLysvM19ngaVdLRkA/QkJDSVdbZ3BdW11obGry8GNZUlReU2z179fUz8/d3d39aGhhYFxsbl5ldvro8W5lW1dnefPm8ev+a2x0793a1c3Fv8bIydXQ1NfR3N3Z7OnY0s7Q2tx0a/9z72dYW01MWFNZX1heXF/j5m1fUUxKSU1LTVleZV9h8/fm7PPo3N3Vzc3LzdTX3dXLyczQ1MvMztToelZJR0BDSEhOS01YW2nv5drc1M3KxcPEx8vNzc7MyczTzs3R1PptWElFQj49PT9CQklNSU5RWm788Oz87enn29ra1+Xf6Ovg3drX2+5oV19lUk9MT1xq2tjj3/3p6PDMy83EyMzM0szP4Nze6Otp6Nvs0+NjfWfv6VhdU05XU2RsWVxRSlZZbt/z8vt67nPz2uXf2ufk5dnMztXuX2BTTVJOUFlYXGVfb15ZWVpmanrh5tzd7efk1M7Qzc3S0dfNyc7Z+VlWVldZXVpYUlZSTllWUE9MTlJWX2pfWVhVXl5lZmB3cnXv3tHO0+X/ZGFeZG5ma/x769rRycfIxsfFxsjL2PH0ZVxiXFZXTExOT1FSZWRXU1lWVlJMVFBPa2f05t/Y2djOzc3Ny8rO3NvZ4u9rbl1UXV9cXFxfZVBWWlNdXVVNR0xPTllf9ntm/N3Y1s/MzNjb1Nvk3dvbe3nm++Xf3+NeYXBXUFlcTUA+RkpMTlpoVFj37ODZ0c3P2czIysbJytHg19zf1tjY+l3t9u3uX2hdT1hWTk9QSkZHWmJQUFpqV1Nld15m7nhfXXHicWzq6Hxi9dLe6e32Z2Bn7e7u2c/Y2NfV1dnP1N/Z1NHQ3N3O2N3b2d5xYnxhYnP3/V1TWFNLT0lIRk1pYVpgWF1YXuHX19fb2dDSzc/Z2N3cz+jm4HXxVExNUldLQ0A+QEZHSk1NVldYfevl7+Ld3c/KyMvMzc3S38nAv8DO7HhZaF1UWltkX1pkbGdcWW5iXOfk7O73Z2tfZe3g2ebc1N7n7l9SW05VU1NnYvrX193d1M3U2Nfh8GNiblxgbF9YUUlLRUdUU05NQUVGQklOUF1t29Paz8rNy8vAvLy5uL3Bx8rLzsTAytHazMnV4vhOR0ZFQjw7QkA/QT9HS01WU01QTVNZZ9/i+Wpy2s/Wz9HKxMDBxs7j63JhX2fs3NjgYlpYWmd2enN1b1xZbG1yevvr3dTO0tPR0dd1aGlk9flfWlpfe+rZ19fZ6+be5tzd4N/qffBvXlxeWkxKUF1rXVBLRT5ES09TV2f59tPPzsnHv8HEv7u8vsHEyc/OzM/O3O91XWR6W1RQSEE/QUBARkpPT01QZm198unyfe/i5PXx6WxuZ+bY4trR1dfR0dna3tva3OnZ0NDXz9Pa3Nbb5OLm721iX15jaVtUVVpWWllv5+Xbb19kVF5fVFhTW3p34upu8fJz6/Dh2uPf5/nk6uXa2c/dbf/s3tXvYlRKSEdGSUVGRUFHTVZfYPn0b+HZ1MnLycLGxMPFwMLBwsrKx8zQfFhQQkE9PD08PEE/PkJDSk9QVWpv8NnQycvGytTOzMnDycrIysTG0c/d9fRkW1hPWl9dWVNYXl9qbfXpeFtdVldXSkhEQkZDSlBb7vZVVVZgdV949mjn08zBxMHAx8zLxsHGyM/d3/hk+GBfW0tJRklaT0VDQD9ERlJQUF9WWvvxzszR0tvd1NXKyM3Cx83MzcTL2tv3fODb5vlWTklDREJHTklKR0dJSEtQSUxUUltXZt/u7PR23NDOysrNxsbKztHP1uvtXE1UWmzzYfRvYOHd2Nf83f5dfO7f13To4HPp3M7FzMnS5/rwbe5aVV5kcXR82fXz4uje1dLFy9fO6fN6WV9dTk5IRU1LUEtBQj0/R0NJR0FJR0hZYX35auTYyr+9vLu/vL7CwsXExtfVzMnHydDPemltbGhUU2BSTUlITk5JSkdKSUpOV11sZ2pgbuzl2Nvq5N3S0NLNzsvQ3O7r5dne6+vu731kXVteXFxfaWlxXlZQU1diW11n++Xl7G9qcXBlbmNpcXby6ODT1c3OzsvN0dHX0tPX2uxv/WRkV1VXUk5aUlBPR0tIQ0tJVnB239/p2NbRyMC9vsC9vb6/yMTM4NPR4fFecFxZWFlYT09PTEFCREBDR0tMSUtNSktNX2BXXWh2a2d7a1p73trYzsK+xcrJx8XEvcPMzsrFxcrIzNrq49roZ2dVSkdETExITU5QVE5QU1rk2/b5bujubObc4tjYzc7a0s3d9Grf0tnXz9foXmFuW2zg8FtKVmhWU1NWTEZIUEhDSlBOTFNw9eDUzcjJx7/Dwb29v8jMzc7W19Pe4ezcbl5WVUw/PD0/P0NMSURFTFZcfdHMztLSzM3NyMnNzMzP3Pbe2+Z+Y2R9aXF7WVJbY2RleuVsYFBTZmrp1edwZVdXVVJUTk1GRE5PYXRhV1ZhbvHo1tTOz9DLzcvIzMzLzszP0M3c4HlcX1ldcGdVTkxQUk5aW1NIP0NGR1djZVxQXW127uvo6XH/6OTbzs7R1svExMjHxcXKztHc29zjbVhSUk1JR0VEPz0/P0RLUE5KTFJbX2zo331wdt7QycDHzc7OzNHd3OV0Y1tjZ2b7YFllZ+vleufuZ1lPV2xz731pdGj03ezd4vTyZVhietra59ja2c/Py8rNz8/T087O2337ZllZVE1IQUA/Ozs8Pj08P0BCTFdgWlpse3fx18jJyL/BxMPBv8bOy87b4t3O1uva2+rj3NXgaGdsX1de9H5XWF9RUFVlWlRVV1FMS1dbWllkXmb+2NTe6dzg7dvT1dTOydLb2c/W7HF7cFtae3ddWV5eVVNkYlpbXnlsW3NqYF5kdmpp4dnka1197/nk3uXi3NTS09XV6P1x9PBtfODo7uRmWlVVWU9LSEhNSkxfXl503+Dcz8XEzc7LycvLxMPO183Ky87Kz/VXWF5VTU5WTkdMUk5OTVZUSklRTkxPVVVQT1hZW2J89m5fa3dhb+zk7t/OzcvIw8PJxcHF0NjS1+v63t/n4t7caFNbXU5MUlhOSE5ZXFpf7nby2MvM193e4+zq2c3N1c7Y4ebo3eD2fGxiY/Hd1ehyXFhWWF1aXFFGQEFHSVRdZldMUFdjc/Hc/15ca+DZ1tDNz87KxcXDxMnV9u/b1Nzc2vtcWVlhb/F+fGRZXV9sZWT05+3g0crJy9v1XVxoan1uYV1fZHnl19bc4N/i4tnf4P5gddvY09Tf71tWXFpMSUE/ODg7PUZNVF5eZOfb0NDVzs/LxMK9ur29wcjDwL6+xsnZb3BSUl9bW1JKWFNRVU1STkdOVlxoX2RlWWt69t3h2nRTXHNx9f99/Vv53N3W0cnG1tLOzcrV2t16Ymh993ZlaVZFRElJSUlPT1NNTE9SWWFw3O7l09LNzMzMzdHPzMzO7HroXFJPVF5UUlppeHPg2u9jbe9oVVp09mJu7tjT2M7M197azNn5693tae3k5PB35NrW2NnZ/lZcZW5nYnF0YllYVlZQTE5MSkhDTEhHTFBdX1vr6X3+29bgamVwXWBod+tu6MrIy83Gxtjc2Nzb6tvP09rP0szN1szR+e3/eF5LSEZBQkFESEtOV1FOTFBYbePY087U29XT09nXzdbg19jb1NTY2fb7YlxbSU5SQz4/RkxNVV1WVVtp/+3r29rcfmX3/vnf2dDO0dLh8eDc297i39ni4dna2eXsfHz9ZXjuX1FNU1lSXndsdG9gfvF42d7saldmaFps5dXO093b3eHe2t9uX1ZUX11w/VxoZlz9bfLX2XxmTklKRE5VUVZKSVZOT2r26mpkcPp649HQ2+LZ1M7PzsfM4N7dz8rJxMbS4PlkX1Zae2FRS0dJTVRqbvb1bmx27unj8GNYV13u2eHa0vb+bXrW2NHK13dv79nZ3NPO4WlaXFxVY2RTSEFFSElMUldOREhLVGl0ZV5QTVtn2svKw8XP0M7Q0crN0NxuXV95/uPY1ONoX2937eTxeVty3e3V1dXOc1rt4NrKzNneXXH2a93Sz+FpVE9NTV50aWJbWFti7dHU3nFPTk5LYF1JRT89REhT5Op2eV9W/m3g0d7d++rl2tPIx8nLzM/OztDM1/1eX1/v3tHJ2WlpYHTg1czS43h6cX3q39Dcel1QTU1QVE9TSkpNS1Jo7uX6Xm9xcdrS1NR98eDdzsnCwcrZ5GxdeepwZFFITEtKUGt87HlaX05Z6ezwaltpYm/bz9PYdVlWT2rY2t7tYfbg3c/IxsjL6W9gZ9zf393x9uXt7tbQ4+9VT01UcG9nYFBNVlryzsrL0e/+5drFyM/U3f1pZ1/g3H71V0pMSlJNS0tFQj9DSFNhWVZJRE5d++Tl1d/t/uLdz8XIzt3obvHd2drQ1dDRz8zHxMfP3O1wbt/g6W5aT0xZ+uLe92lXSUVNYXBiX11bdP3m6t/Zztfg6uDS3OXh6mp+7PF56+vqY0tER1ZeXmViV1JUUVjq5uFsVVNRaG1ZYnZ5cvTo8dLP091hXmPi3uLU1OhtetrTxsLH12tVUm/+6upkWV5l7eHXztxvcP1229Ti3OdWXuvt7tbW2+xPS1BYZm5oZl1VX3Zx7t71YVZRT1p5aF1eWmza5fXo7GFPSUdNVmBsX29pWWLy79rKytPqa/7k2dLUztPYzcnOysjO5m5gX/L0fGhqZl5o9+fdztjuXlVKSlVt+HzpdGJhaezQ5XBhV05PZ254a293383DwMDL5GBZVVjr6ntgXlBMT1Rc9XlWTkpHQU1ZXlJWXV9zed7Q0+Zv/eH32c7Q5/B9fOrtz8vYfmRXUlJk5ungzcvMzMzEwMbP3fv/aGfj7GR6dW3o5tjP7VNJQENHR1VjXWJxY3no0sjN3fddWFZMUVhOTVRPXFxk52RHQ0JAR05p+11bbGP1183Bvs7e6fZ4ed7W19fJx8rJyMXH2/J7dH1v+3z8aHjn083Fv8PaW1BLQj9FR0hFSU9bY/PY1m9ZY2hcVn3s7n3x3M7Lw76/zPpZWFVPZmFWTktMVVNZ8e5sW05NVlBcbGxq8tvMzM/HyNT+XVlWUFhgWVtgW3jc1cO/ydp0XWJcaePc3trXz8rLwsLM33BrXlFNTlJVUVl82d3XzNnzbllRVFlefex0aW7l39HFzOZsVU9KR0lLTElNW/H03c3PclJPUk1LTFNdUFrv4NHIv77N+mpYUFBKU2hba9fMxb26u8fJyMrX8WlYW1VZ8dfVy8nM3WVTUkhDREZRVEtb7uvTzMjM1nvtaV9dZ+NgXWbc1dDNz+L+XVdTTUxMV1hdbN7d2s3L0tr9W01ESUtLUmFh6e7o2tDU7V1QW1VMUV5o9OzZysK/vb3AyeV8bFFYd/Pf+Wh62c3FydnabFtRSk9aaXn+6t3NysbI1uV2X01DQEhFSk5ITW7m2NDRy9PtXkhHV0lZcF1b49LW0dXV5v9WTEhHSEtPTlRx3N/V1c/Rzurz8uDX7NTW087LzsvIyczI21lUVF5eZWL159nX4t/Y6OpvTU5HRUtfbG5x3+D61tLb2HFIR0VCR1Fcau7b0c/IxcbFxddqZVJYWk9SXXfz+fLma19bTT9BQkxUUlNWanjp39XS0dTrUl99cuzr6tzT1srLz83N2mhQW3xmcWRb48/Ty8XCx8vN3nFlXVZSWFZu3ez84Nr27el9ZllNR0BBRElVWWre2OPZ0tn1XFxaW1VZXVZSUl1xa3zedlRNTU1fYmd6Wmhv/d3b1cnT4Wxedubic+bk4tzPx8C+v8jYfV9dZPZdfPZzb3vn3tTV4FxSTkpKREBFSUVOW+rb1tDc2+12Y2xqbWx+eXPt29fa2erd+WVXU1hWVF5bX3VgY2nr+X1iWFlUXF9oZl5y7ufq3cnKz+JZU05HSE9ne+PY0dPKv8PFx9vf4WtoXVtaYm7t4NLDyc3K1H1nWVBeXk1PTlZgZObm7uF+XGxpVltZUllXZOd37PJs9F5a69psXl1QV2Ft6+jb5X3i8lpVWk5UY05RX/rV0tne9N7S29/Q2dbU/2R73czLy8XJy9De6NXa7ezk9F9XXWZzbGV3XlVX/m5eWl9s6+n16nBkWVdLSUteYF1pbmR+ee3P0szV0d18e3RiWWv3eGjo3dDO1W5wUkZHSVNPT1FJSU9SZtzP19bY7+ja1djPzdPO0NjPw8DO43VQV2ts+uLkbWVda/PTzN/nck5QdPTg2dnn+Nrd69zQ2fhtT0BGR0VNTEhJVVhYY9HS+vFrbeTe7NLb9WFgYlx429f8e2VeWVRMU1xZVFteWWNz5e/w6dvVzM3HwMXLzNLWzcjEzN7n5O3pfu3Z6VpcW1VcYO/rfFtveGxoZ+nyW1tqZHDs5Of6V1le+tnb0d5eVlNJT2J18fFhX31r5eDV327+/mVf8O5kVkpKWmJy6NTP4W5gY17s2NviXVZk7OTSzMrMzc/V29LL0NLd3uPd69rN1Nvl3uXy68/b8Whfa2tm6M7Z3f5iWFJRZmhcXFVZWVhfb2z4fXFbWmJveW1hUFBUXGze293ia1lccN7W4O5jY2tv6tLO1dff7nl66OPp5Ovb1NXSz8/W19/78eXd4/HweHNg7tPLy8/N2l5aWVtXUFVMS09UXnLufd7efHdqb3Np7XVjY3p1euHa1N/8XVpm6/J9c1tYYWBp7vTa5mxeWV1oWFdvZm7t5uDlbuX8XFlXVVJacP79cGbu4tPT1M7d6t7m631n+F9R/OD13ujh3PP87X58b15ZXlxh6m9xfena3unse3Tf6fDt6ujoenpqZXZeV1heV1JRVlti+9/p5+3q3fpvbGdgUVFVT1pdamx8/vzbdVlZUU9MS1BSXWXk3NfW28nNzMjMz9nl4e1vb37683zw09TvZE9LSUVNVU5RXVxp/n3d19nZ0dLO29ra49rS08vM1c7Z5PBoS0pHSExISVBSVGBp5NvnbGpeWU9MUk9QZ2Vu7fjb4d3q29LQ71daUk5TWl17ft7c1N3o9v9+b+Tc39/gcPP3+n3x3t/p7ej76ftrbWv+2+Di6+73efH/+m51fOj5aWzq6vHYz9XqY2FfSUtOV2F2XV5nW1xRVE9SWlxXU1BPTk9aXWrfz9DV19Xr9vXk1s3M1u3f0tTY5uTt8l9cc/pkXHxueeHUzdP0bmRlY1tcYnj85H13/mzk2dHMztpvWklJT0tISU5bX2jm5XV1al5969rYaVtiYGdn8uTg6nx4WlVVXllcbWliVVBe6d3e4Nzj2dXl29rz5+De0MrHyc7fcFteXF5p/uD4ZGZbXHP57+TibF5aU1NSUFZeX2189+bufXZtb+vq8m1mcGlgedva09nf42ldYWVp+d7V0t3c3dzf6+/6alxcUUxKT1ZYWmXi0MvIytTfZldeaVtn6e10bfLZ087Jxsrde2/7aV5dY1pXa/J1XVtSTVBmdvJrWV5YVVVY8dTW1tLe/fbe1t/Px8bIztXQzdDd7vZ0YlZZXFdUUkxJYOzx8GhaVVFUT1dZX3Lh3ujfzs3Qx8PCwsfN2OPhff3d5t90YFdaXVpPSk9WWHrmfvZy5Onr1tTV3PRjZW197NrPy8zNz87LyMrxb2FTUEtHRkZLTFR029jQzd3i3dXa7uXc4u3r6d7X1dPR19bX2vJXVlBLRURLV1VSVFdVT1zq5d3S09Xd+eva09DW0NXe2t/kdd7SztHQ0N/mfnZtYG1cW2JSTE5QUlhp3tzbzs7Ozt3s8eze3+jr8ejX6mz66Nzg3uppaObiZ11WXmt6+mBcWFhXUk5PWnxrWWFkannZycfIztnw6uLo6ebY1NHO1c3KzM/Z3+Dj7fFfWF1fZG7r3NHN03t972RYV11XV1RTUFFkb/ve3dnU3Pju3NvoZHDreuzpblheZGFwZm7f3edfV09RU1plXmJcV1VOU2/g0s7OycvWzs7Nys3b4O9zaF5fT1Necmtl+/f2bmBfau3TycrP2OnufODUzdHf+W9mXWJaVVlaYG1laf31WEtJTU9ZaHBpfHVSWG7v5NzR2fZ2ZV5w7eDm8/r6797rZXltanr5cFhRWFdQWnLm3M7L0dneZ15pc9/b2+pgWmJdbOvf29zU4OXRz97ueHloYm5cUE1MRUJESkxWWllbVU1MUV1+797taW1v793Wz8vNx87f43r8Z1NWVlNWWFJPTEtOW2j46eB4X2FaYPDTzM/Pz9rm6djNzeX9ZF1dUE5KSExMT1hcYnlgX25n4NbTztXX4WJWWFFaXl9fW25nWFdZXf53d/n64eTt3fB24uba3efobF9kW23q9t3hamtqV1ZNW+b25exlV1JWV1dnZ2z7ePv+ZWVod+nt5Njd+WZZVU5XXlljZltQT2JkX2fsamvs9HRg79fXycnNy87T193ncmdwYllmeGFbVlRXa9zf9dbe821UT09dXVts9Xt9dnnq49rU3trO097ucG1t+/1l6uxkZVlOTVZt8GVcVkhHRURLTk9OVnl3d9zc4M/Iv8HBvcHJytjf3ubq5tfga/32WF5nZWdlZWdUTlFNVl795NjR1dbU1trQ0M7Q19jsaWNeX2trY2xvYl1YU0xMVF9fYfV1XFxYT1FVUVdkXFJVXFtt1czLycXDx8vQ1Njd3uHj6uro+Ht7+uXi3dbYc1ZZWmL8evPe3dfS0tLS087Pz9LOztz++v5z7XLz1t96ZVJLS0xTU1JaW1hVUlNWVVhcaGp55ePg49vMyMrDwMLG0OHvfG5eWllQWmJfYWJ02tvbz9LT2fB4amL76tvQ09nc4u3e1NHa1NPU1N/t8/R6en52berxa1ZLUFtZaO1uemxaWl1UVl5aUE5UVVtffN3NysXDwsLJzt3vaXBxbGpoXllRT1liZGlkV2BiXFxbWWd36NjQx8LDycrIyM7MytDZ4/rzcGNw8V74Ulx1SlpeXmTv+Pfk3v5jWU5NU1NZXlhhWGDu5dHGw8PIzMzV3m9UVlJOUlhhZF1n//fc29zgbPd4aPlkY/N2/vn79ejk3vfrz9TPztHQ6W1nX/rv9f9kV1JMTVNOYvxnbWNodF5aUkxTVFNd+t3Z39jOysTGxsbJ0uZvXldVV1VRUlNUWWB4eO/r+Pb2el5ZY2RkeeHc2dTRz9rd297Uz9bW3elyYVpUU1NZUlFRV1ZSW//093Vu73liVU9OUE9UU1NXWG/069/RyMLBvb/G1PDw5Ovu+1xoYFhXWF12evv7Y+9uX1hQW2Rf7t/ZztPTzdPRy8/N2NrU7l1QVFxbW1tSUU5JS1FNUmv0fl9qaldNSEpRT1VVUmVhXnf/48/KyMrMyNHyXldYZXl3Zmt+Znnj5eDOzdfh4OhtWFReZnx+//Pf6O/n4/zlycTJyMjV6mxx/uPb5P3/cFVQUlRRXmVZUFZSSERAPz5HSkxPWF5fbPjf08XBwsTH1tzr8nl9521eXm9fZF9fXP3e4uft/F9eT01c5trR1NfX29nV1NDHzM/Pzd36alJPUVlRUVFTUVJVWWry83xpZVxPT0xLSk1LTU9UX1ZTXmJ91s/Ny83V3ur47N3d497o9Xxv9urz9WVcXVtaT0xHR0lMV2Pm7eHd2NjSycPAxMXLzc/b4ejv7n1tal5jXVBMS1NaVlNQUldLQD9ARk5PZGRc/vXl1MrFxcbCwcjS4N7wY2VyYV1bYVtSUFtmam1kYF9kU1BUUlVk8+Xr++Ds9uHU1NjX2dbS1uT18Ovp2dbea25+XVlcY1lWY2RcVE9IQD4/RU5YVlBicVxn2crKxMLFyMzM0d7u4NfV2/Fu6PR5bWxdV19aU0tOTEhJUGXi3+Dd3M/RzMnKzMjGys7Rztp+Z19bYVxaT05LS05UUEtYWmBdW1ZSUU9TX351cHv679nOzdHJxcjHyMrR2dfT2tTU397p9eri8GVXdu9q/flfW1RXYGne4vjq697c3dTV1czN0c7Q1s/c4HhndVtPT1BOVE9MTUxPSkpMRkBDSk1OU2Fga/vXy8jDwMK/v8TBxMvNztXT4O18XGNjWlhUVVlXW1tqeXBneu/k4vDe2NnQzM3NzsvJzMzKyMrNztXf3XtaWk5MUFBXU1BXWF1fWFBPTUlGSk5JUFFJUmX8+vzZy9HNxsbExMLCycXI1NXc8N/j7nBUWVFITU5NT09OTlj1YVfy9+LRzMTEwLu+vru+wcLM0t7d501HR0JDSEdGQ0VKR05dWFZYU1ROUlFOWl1k79rV09XNzM/O0tHNzdXW19nwYF5aU1xoZmpoa2NjcnRgY15eYWj5bGpv9u3c2NXPzszHwsC+vr/CxcrU4W1WU1ZUWVFKR0ZEQD9ESUdGRUdHTE1KTl996M/Fwb68vsLBwMLJyszU3N1uVk9RUEtIRkRFS09UXn1rbPf4c2vs+/vq2tHQy8vOzszOzczJxsfK129mVEdGRkhNVlZYXl9dV1ZXUU9MTUtHTExISlZhav7638/MysS/vr6+v8HFxs3gb3Xva11NRkVEQEBASUtLT05PWVlSVmDp1MvEwr65uru7vb3Bw8XO3H5PRT8+Pz4/Pzs+QUBKVFtgX2JcXWZnamps6drVy83Uz9zk4dvTzsrK0dLbblxVWmZr9+xlb/J8dHV5fez9a2peVlJLR0tSWV1lY+LX1MzGv7y9v8PEytXnZlxeW1BKRT48OTY3ODo7PDs+QkJAP0pY59LMwLy9ury/vr6+v73AxMrrXFlORkVAPD8+PkRESlZlce/4697b3OLQzczHxcPDycrQz8vLycvY+G1URUA9PkNIS0tUU1FYVlNRU1dfZmZjXU9IR0dKUE5QWl50/OrfzsfDwcC/vb3BxcnL1tz5YlZNRUA/QklKTEtNTE5GSFBs49fJxb68vLy+vr29vr/EzM/rWktGRT8+PTw6Ozs7Ozw+QUZJTV/27uXez83MyMvMy87T1Nvb0s3P4WheVk5MS1BSVFpTWGBmY1pceNrZ2dnb1+RwXVxhX/rk5NfU0M7HxcPCx8bFwcLIz97f8VxQSkRAPjs6OTo9QENER0hIS1N74dTNycPDwsbIycvHxMTFydDW3G9cT0tMSkdGRkBBREZLU19d/d3XzMTFycjDw8TGx8bHysrKzsvQ3+tqWE5MSkpMVE9NVVxUUElGSEtWXW1pZVxYVFNWW2ttft7l6+Lcz8vIysbAv8C/wMbT6epeUUtJRj9AQ0VHTlJTX15WY/7x3M3IxcG+vb69vb6+v77CydDcbF1SSkNFQz0+PTs3Njk7PUNJVnbfzca+v7/AwMDCw8PL0c/X5fX5XVhYWFhZWV5faf91cHb+dPTc2+TWzc7S2N75ZV5bZPLy49zc4+DPzNDY1s/QzcnKzt3icFhZUEpHQz4/QD89QERCQUNMVF1239va0srKycjIxMDAwMHDxcvM1eldU1ZNSUZHRT8/QUFGSE1k69XIwcLCv76/wsK/vcDBxMXIzs/Z4WpVUlFQUVZTSk1STk1JSEhHSU5PWlhYaGtlX2Jlbuzr7eXv6d/f9vfzfObW1MzL0drY0uf36Pb26vpuZGv9+HhnXnH6euze1NPcz8vHxMLAvr26uru+w8bM32hcT0lDQDw7OTc4NzY4Oz1CSVZ76NvRy8jLy8rKyszN0dXZ3unwWk9OT1NQXVxXWl1zbFpaaPPt4tTPzMzJy9Tw6OPt7t/V2t3Z0szNz8nHyMzLyMrP1dDU815cW1hNTUpGQD0/PTs6PUJERU5ebnXt1s3Oz8rFxr+7vcLMyszjbFZYWElEQkJDPkJISUhKWWFw28zKzcvGw8fIx8PBxsnGw8bJy9TrcGdvXVtcV1FKTU5MSkdLUExLTllXT1ZjXVpXYu1vaGFfXVlld2tnZ3f/YWb33d3o297d4fvo5fN+cmpZXWleU01PVlVPVVdmXV/19OPd0MTAvru6u76+vMDIzdbhcU5JRUA9PT48OTk6PEBAR01OUWzZ0tLSzszNzs7LzNDN0vRgV1ZZVVBRTUhFTFVQUl1qfnvq1M7Q0MzO1tvSzcnO3OR0W1r85O7059/h59zQ0NbY2uL3dmpwb1pXUk5HSExDPj49PT9AR1BTT05RVl/x2MnFxsTEy87Kytvt8v92ZFhbWE9KSUxLTlBYZFpccHJ+49PMz9DQ0M/T0crLzszKz9nR1NrY3N/kZ1hbWlNLTU9PTk5VXVRKR0lGREtOWGBjaWJeXmju5Xr09Ol0cd/c7P56bGBj8PPj4+jp/XJ26eVnWFpZVlrw1tPh5+rv79fOyMLDvru9vr++xdXc5u9vZ214XUlBPT4/RENISURDRklKVmdfXGVvffPb1NLU2uP5ZmRhWlhMTExLTFBgXVFPV2Z449DHwsrS2OLj3dzRz9TZ2tjb3+F6am31493UzsvGyc7N1M3HyMrO0NPg7+/ub1REPj05ODo8P0NCRUdKVmbi087HxMLBwMDH1fZaVVBUYWJfWU1HRUZMUlpaXF5aZ+TOys/Oy8fExb68u77DxMvR09LS0+v8ZlxcXmxnWlNLTFZdeefY3OZnWVxeWFdcWVZVWFj88mpiVlFXWGf36nRbW1dVWm7e0tnX0dPV08zM1/VcVldUUVhoYV9aWF9tfefT0NPQycW/vby+w8vNz8/OzM3Z3vhgWV5iY1xPSktHREhKRkRISU9Yad/Nzc3Mzs3Nz9LT1/ZfXE9OUVBMTk5LTVh639fW1Njh29TQz9LP1Nnb49XLzt3b4e3z7OPRytHZ3uTm2dDOzNHe2d3o2tfqaFxMSEhHRUhFQkA+P0ROXG7v6+PR0s/Hyd3h7GhkXF538GBaXF9cXG335flbYn555d3ifuzn4drV1MjEy87PzMrJy8vLz9vZ393R1ORmamxyeP3gztDc5+VvXWBZTUhEQkhEQklNS0lNV2b79uXU2uHs8Hrl1tTY2eX24e3o3ftlXlhZWFthd3FhaHRtauTV0NHQzcnEv7y6vMPIy87U2dfQ2P9mamFcY21rXVNOUk9PT0tFQEBDSExSXG9tZXF6dvPa1elzYV5cUlpiVklGS1JYXGPw3ufm1M/Qz8rL0tjn3d/x7O5mWFlfcuXe2dHQ2t/W0c7Kw8PGxcbDxcjKzuFxaGtfV1JMTUk9Oz4/PkBERUVLVOzf3s/Lz9fY1Nzu/fjuY09OU05MS0xLS0tTZmJlbGtebPDp3M/LxsfMzcrHycbExsvOz8vQ4OLh/V1ebXN0bXDp+m9s5d7o6ftpU0tLTUlEQkQ/PD5BR09YYG5oZXT3aHh4a19dZOfidF9mX01MUVlXWVlhZVdWaGxgaW5vaWru0MrLzMfGzc7KyMrKycjM1d7Y4PD+cWFbZfvq+GZdXU1HSFFXT1ViYldPUFlXW2t5Y2Bm9P1fWFlcUUlMVlJSUltfWGN79O7r399tcPTc2+jk7GpcWWJxbubQy87MyMPHzMnIy9LQysfL09re919abWpfXVpWS0dISElIR0pGQUZNXGVt5Nzg39rR19zc4mxbXWNZTEhIQz09Q0pMT1dbWllc7d3Wy8jFyMrGxsjKy8rL19vc4d/xemxpeXvo3d3c2dze18/Ly9DV1etlZGdgW1dRSUQ/PkNCQ0pRW1553dzl7urj9Hvs5+/8al9XU09NUFBQV1hQUFNWVV5z7eLp4tza1s3GwL6+wMHAwsC/xMjKycvU3O5uXk5KTk9WW1xbVVJNUFRbbnxnYF1cYVtbXF1eWltbVVFUUUlGSU1OTk5PT0xOWGt67eHm6HFfeOnd2NLN0NLY4N/h5+Dg39XMxsjN0NTQz9TNy8rKy8/T09LU2dja2ehwbWRdV1NQTk1JR0dFRkxdZm7p4eXi4OfseWxkZl9dV01IRD8/QENHS1BVW1dYYfHd0s7MycTCxMPDxcfKzs/Q0s7LztfZ2tfX1tLW5PT86tvY0s/Z3u/38HBsZ2BfWlJSUE1OUU5KTFRgcfPxcV1ZVlhdYml2c1tWVlVTUU5PTElJSk5WVlleXmf72tXPysbCwb+9vL6+v8LGyszN0NTV1tvsfnt5ff/r19/k3NjQztff5N/c7W5oYm/2cWZZVltfYWBdW1lWUk5OUldUTUpKSk1RW2JeVFBUXFtZaHr37Obd2NDO0dfd5NvPycXDwcLDxsfGwb2+wMbKycjIzdXg6H1iX2v2+WVUU1JPTU9TWlpZXmp65Nrg9GddVE1KSkpLTUxMSEZGRENCQ0VITFBYYGdpcnbl28/Iwb+/vr6+v8DAwMLDw8PHzMzMzM7V3N7g2NHPy8vKzc7IyMnN1eJwW1pYUk9JRUA8PDw+QkRHSktIQ0dKUFFTVFZZWmNgZF1RTklJTllod//j3+DSzcjGx8fMzMfBvr28vcDEx8jHx8rO0NPX2dba83BnX15cXmNkYFdNS0dBP0JJSEpMTU1NT09QT05OTE1NTExNUVRZYGt47ez46uLe5N3Qz8/P0dPRz9DRzsvLyszQ1tbQztDOztHc6Onrc2BWUlZWWVpcV1dQTE1MT1dbXFlVT01RWVpUUlNRVVJXZGBgaWtramVw/nZ3ee92/t7c3/BuaHXx5NfR09HO1NDS1dDQz9HV1tnR0dng621ocmppXlRLS0xOUVhfYl9cXmhhXW/y5vJqa2tgWlxlYVtlZmdvcHj18fDp4t7a2uPf3+Dc2dnY2eT1+P1mVlJPTlJTT1JSTlJZZW5qavPzcfLh6v1s/fV58fDh4/ZnZ19dZffn5N/l2t/d0c/Qz87R2+bg4OLi3eHsbm/q3eN4bHJwVFFRTUpFRUZFS1BbZ1pTW2VdXGzr93hxeHBeYF1bYlxbW1hhZ/rr7u7d19fNycjLycjHy83Ky8zO1NTd49vZz9fg4e5sWFxoXlZZVlRMR0dGRUBCQkBESEpOTElLSkpMVVxdXlxdVVBVXWFpbGtoaO/h18/R0MzIysnExsfHycvP0s/S1trq/mZ56NfOz9bY2NjZ1tTi82diWk9NSUVBPz49PT9ARUNAQkRCQ0ZJTk5NUFlaXmpvfvLo3N3XzMjBv76+wMLAwMLEyMvLzM/NzM7U09LX2tXOzc/Y3ep5Y2ZmX11TUU5JSUpLTEdJSURDRElLSUhJS0dER0tMSUZJSUdNWWhtZvTo7ufSx8XFw8DAw8TBwMTJycnLzMzNzNHZ2eHw/u3i6unt/f5nbej0ZltdXl5y7unicF5kYVpWX11TTktNT0xPXFRKTltUVvbj29bg3NnZ2tjT1dbY1tDS1M/O1Nna2uDWzc/Oz9nd2uHs6Ol0aGRpa2JoZ19UUlFRVlpfXl9cU1VSUFZgcnJr+Ovh2NPN0NXU0tHSzcrL0Njg3/pkbHNlWlx7bl9u9+h4aW9rb23f1dzseHv9ZWNvb2pbYHZgX/75dV1WWFNQWnBxZl5cbXBeafDl397Yz87Jwr6+wcPDxsbDwsXL0dbX4PDj3uV4e+fxc/ns8l5RT0tHR0pLSkhERkdCQkdHSEhNWlldeuXh9XXu8Xbt3NnY5P3p5e3k3d3b2MzKzMnHyMnKzM3S0M3Ky87OzczO19nc8f176vFmcHl1aV1bVEtLTlBNTE5PTklISkpHR0pPS0xTWl1ZV1hWT1p92NPW0M7Q08zIxsnGwcLGxL6+w8fFwsjOzMvJzc/Q2efp3t3n8e72a1tdXl9TTk1MRkNER0hEREVHQ0RFRkNCREhKSU5VVFZaaHlq/N3R0c7HxszMysnGx8jGxsnMy8nO0tDOy83Ozs/X2dTe7+jsd2ZfX1pbWVxlYV1eY3VtXF1dWFJSUEdFSkhJS0tLS0xMU11YX3X36vH54dzf2tDN2NrS1tbT0tDPz9HMy8zLzMvKzM/Q2OPw/l1OVVVSUE9OTU1MTVpdVVZRUFFTVFdVUVVkWVRmbXb+6+Pa2ujc0Nnf3d7e4+Ho5e1pbvhlc+nz7evu5t/p7t7g9nJrbXJqamBcW1hXWFln9nt77+rq4HpncGpbWl1YXF5aWVhTVVtXUlr17+fZ1c3Mzc/MzM3LzM7OzdPZ5OPi2+Tj1trr6efl/G9nXVpOS0xMR0dGREZDQUVISUpOUFVaW19XVVRaXVJOUU1OWVdZZnD73dPTy8PDw8K/v8LCxMXHzc7P2dvW19zm697e4evg5vbrfWZTS0lIR0ZBQ0I/QkVJTE9NT1NYXG1tYF5mcWRXXllQTEpPUVdZZvfe3NjOzs/LxsfIxcLAxcfGx8nP09LV0M7Pz9DW0tPY3dzZfWNjWVFLSUdDQUBAQUFERERFR0ZHR0I/REdBRkhNTUxRXWpjYmvu3NrTycjLysbGy8zExMjIx8fNz83P1dbX1tvf2tzZ4Oj5a2VcX2FeYF1YW1tf9Onx7H5nXmRubHBhWlROSENDRUVFRUhIR01TVlpeYW1839XPzc/MztDNzMnHycrPzs7PysjKzs/P1NrX2d/sfW5fX1lTVldVVlddXV5rXFNOUFRNTE1OTE1LRkdHR0xVVFhr9t/Z0c7O0dPOztfc2Nfe4OLj7u316tzf6Oj5aW576O9uX2RjWVhfeGxuaGBiefPf08/T1tjV0dTS32lnemhaX2lobm5fUVthbeLV1dfS0tjaztHZ3t7a4+vu8uXm/mpeW158+3VwZmNlZ3L5XVlTUV9cUVpcWVtYXmNaXGlfZV5eZWFkZFpSTk5YX2Rree/n4NLMx8PCwsTDw8DAw8TEyc/U1tPa5O/ue3l8/nJnXFtXTkxLUU1ISkxIQ0JFSEtPWmRy+3ry63r67XVvZ3rtaGR1bWNeaW1z7OfXzc3MysjFxsLAxMXEwcPIycjM1N7c3d7d2tLR1trb3N/w72dZV05SUEpMTEdBQURDRkJHTE5IQkZFREZNS0pNTlddV1pgdX7g19fPzcjHw8K+v7+/vr7CxsrJyMvMztPoeOPj5ebg4+97c3VpXl9lXVZTVl5wZWVsZF9scG92du90XlpZWldPUk9MSEdLUFhbb+zn6tnV0dHOzc7KxsTExsnJ09PX19ng297Z1tvd2t/o6N3d6ePg39/0c3hsa2l0ZmJdX2hjVlZlXFNPTk5PTlVVUk9PUU9RXmhy+efY1NPYz8zOzs3O0NLNysrLzM3Y92BmbX5ve21eW05SU1teWlpbVVld/ePg5fZxbnfp3OHW1c7N0tTT1tnf7HdvcWv87Ofu7fHn497d2dje09XY0dnf5X1nXmVz/HtnX1xgZW1yaVxXTU1MS05UW1dPS0xMVFxja3VcU09ZYWhlbfxrc2/+5tzc6u/7+u3m4dvSzM/T0s/LysbAwsTFzdLb09jk7Pvu919UTk1LSEpHR0I9PTw6PD5BREdPUE9PTVZeaGtn9/Z85+vb0tTY3unp8+Lf1M7a4+zg3drUzsvIy8nJyMDAwcTL0Nvd2NTKy8/W6m1ZWV5hWU9LSUE9Pj4+PDw9Pj9AQUZFQUA9PDw/QURHSlRYT1BaZWtr6NrV0s/Ix8zMycXCwLy6u7y+vb7DxcPJ0NPP1c7N0tDecV9hZWBmYU9MR0JBQEBERUQ/QURJTUtMS0tIRktNT1xod2JYVlhdZubW1d3Z0dbNy8zKzcrLys3MxcHFyMzMztbOy87X2c7O0tLT1dzj+WpXTU9TT0pKSEdDQ0hGRENGSEhJSU5MRUtMS0lObfNnXmV2cnbb1+ZtcXbt39TJx8rLx8bJzMjFw83Y0dPd3Nzd/WNncO/979ja92RiWktITE5NR0lSTlJTVldOTlhuaV/l2OF3cX3r8t3T1Nff083P087O2u7069/Y1szJzNbb2vFqbujhbmJzbFxgZWpcXHl27uzg0tXvcGdbTkdFR0ZCQ0dFQkJEQj5ARElKS1749vzn2tXVzsjHx8jFwcDCwcHFy9DW19rXz87a6fJsV01OUE1KTU9NTVVaVlNWWl1fZezb5mVfWUxGQkBDQkJHVFdYbHNjY/ri2NfXycDJzMTBxcS/vr6/wL68vb28v8nQ29/pfnv38nBhYVdPTEtRUk1LVmtZXGNaU1JdaVpOUFpTS0tLQjw4ODk4OTs+QkxPWVxcZebV2tfKxMbIwsLEwb+5ubm5ube5ube6wMbO2vJdXmhcT1BQTk1KT1ZWVVJRT09WZVhRVF3xYFZTWVlYV1BOSUZGRUZJRklKU3l5aGd33dPSy8jHxL6/vr/Avry6ubi4ubq7vMDL1+D8WFBPTU1KTVZUT1FaY2F74ettaufnX05JSkhGRURDQkBDRUJBRkhISU5XVVRe59vf59/e3dfMysXBw7+/wMDAw8S/vb/FzM3IzN78ZlRPTk9OUVBOUFNNTlNQVWB1bltQWV5cU1BMSk5danjn7O3o5une5/fy39fa3+HXz8/RztPW1svHxcLCxcXMzcrR2s7Kz9PZ2tbW9mVaUE5OTEtOVlpXWlBOTUxJTkxKUEpFR0pBPkRHR1BYYXPq3tTQ08zMz8/S1dji2c7LycrLycnGyMK/xcLDyM/W3OPa4P1uZWBna/tzWlZPRkNAQkdLTk1STkxOUk5OU1RTT1JaY1ZWefdnfO3az8jBvr7BwsPFyszT0s7MxsHDxsPDx8fJyc7X2t3jempseGlhX1tgYG91ZlpPTUlBPj9AP0JGR0RCRUBDSUhCPj5ARExXX3bo3tjOysXDxMXDx8vLzMvOy8nIx8bDv77DwL7Fy+Lr7v5++up77fV1fnr6a1hOSktJQkVIRUVGSk1KSU9RSlVjbVVIS0pJSVRj6NrWzsvNzNDRztLS0M3My8bGwsHAwMC/xsG8vcbP0O9oW15q8unr4+Dd5m9mZ1dMRUJAQUI/Pj8+PT8/PT9JT0hAQEE/QERITE1d7t/V0dDT2N7c4eXcz8vKycTDwL/AxL+6u8PPztfmaV9eW1xfbu7p5nNz+29YUU1MTEdITU1OV1hOSlVq8VFES0NBPUJNUU9ad+La2tvQz9HU0NDT1c/Mz8zFwL/Bw7y8vcfl6WhXUFJXXVdVWWNpcnNo/HxhVlddWFBPS0ZDSElKQUFNSkc/Ozs7OztBSkpOXnzg0c7Q09bU29rf2NLb187MycXGxcfDwcPAy93jdFpQVVhVWVdfal5ga/NwWlBPTEhHSE1PT1tcUklKWlpYT0hCP0BDR0xRXWx+3tTLycfDwsrV08zLysjExsbGwsTFvsDCydnd8GltYGZeVE1PWWdoZWdbTUhLSklHQ0NDQUNDR0hIS0pEPz09PTw+QEA/RE5WbvfX0dHJx8nMycbBw8rHxMTCwsDHxcnIw9HP0trhePX3XVtcYnVlXFxnYFtVV05ISEtNTUxOVFdNUFVQTktNTEhCRUxMTlBXWVtr2tPKwsC+v8C+v768u7y9v8LBw8LDwcbKztDY69zZ3+H8d/J3eH3/dV5SS0pHSEtIRkA+Pj4+QUNCRkNGRkVFREhKSklLVVdn697e1snJyMbExb+9v8DEycjDyMnIzs7MyMPCxMfHydDX1NfY1Njd3edwb2teWE5MS0xLTVBMTU1QTk5MSkxQTUhLSUdMT1NcX/zez8nBvb/Av7++vb69vbzBw8TJycbEyMvN0NTV1MzJz9jY2tnb2NPW4GZbWE5OU1BNR0VDQUZHTFFPTUpIRENBQ0Y/PUFHSlVw8Ofa0szGwL+9u72/wMDExsjIzdfUy8zQzszM1dzk7d7Y1M7N1d3Z2d/c63ZlUE1PTE9YXl5UTkhNU1thX1xUTk1MR0hOUVZWaOXYyMG9vL7Bwb++vr6+wsXJzt7c0dfX3/Xv4trT0tjd4/l5+Ojp6/ZpYVtSTlFOS0ZAPT5CREdEREZFRkhMUFhYT1JUVltl/d7b2tzWy8fAvry8vsLHzNDV1dnl7Ojl3tXPzdHQ29nT1dDS1drqaV1bXllVU05TU09PTlFQTEc/QERHTE1RUE1OUFFXWV5jbezZzsjEwMHDxsnHwL29vr/Dzdbl7eDo7Oj03tTOycnIzNpwXFtr/PnybFVLSEZGR0NCRURCQ0pHRUM/PDk4OkFGSlRaTklKUVdfZfvZ1MvFv76+vsbT4fTl1c/O1Nre5/Dp3NbSzczLx8bIzdTjclJJTFNbXG92ZVRMTEtKSEhJRkRMT09MR0VAOzo8PkRNT1lbWl/v0srIxMO+vLi3uby/yNhwZHv13dfU0M7U08/KzM/S2t/f0dDdcF1OQTw8P0NIS05PTUJAQT8+PDw+Pj5DRkRCPzw4NztAR01VbNzS2M7Hx8fIyMfKy8nO1+R1W1JUa+nPysS9vL3AwsnP3O5zbGNu7mRZU05IQUNMVGRfXW9hWVROTEdFQ0RFS1lcTktKRURFTVr+2tfLw8PBwMLEys7V1M7MyMnQ19/n/X3p2MvHx8TFzMzZ7WNPSEI+P0JJS0ZHREM+PUNKTU1UWlRMS0tGQEJDQkhRYf1pXl5ZWlRg797TzsnHycvO093o6vPt5c/Ix8vO0cvM2NDJxcPEyM3bfGdWS0RAQUBCTFdTT05PVlFQXWVbV1tbWlRVW1NNTFFda97NycjLz87R2NfNzNDMy8rIzMzM0M/NysvNw8DBxMvMy9Le4tTb3d77c2lXTkY+PDo8Oz1DRUhCQ0ZHSEhKTklMT09WVVhbWFhabejdzMfDw8fKz9vudXlpYPPj2NDMycnNy8fCwcG+vr7BxcrT3et89H337ezv+PFwV09NSUlGRkpPU09NSEVHSkxPWFldb/fs3+L59OHXz8jBvb3BxsjN0c/T1tjY2M3MzcjFxMbEw8PBwcLDzNba819YTklGSEdJTU5SWFVPS0dEREVDRUZBREhHSU1RV19x7dnX0tDQ0dPT1Nfb19PS1uDU1t3Vz87LycrHx8XDwcHEx8fJy8zMzc/d5+j/Z1xjX1lQV11nbV1aXFpUUk9UUlVOTkxNVVdYYH7j1NLJyMnIy8vM0NDV3t7d0M7U2tnT19XNyMPCwr/Aw8LFxs3R2OLl7ezvaFhPTktJSkpJSktQWU1KSkpJSEhHSUtMUldWVFZidPHh4trV2c/N1djb4/J093Nt89zV09bY09DMx8XFw8PDwcTJzNLbemVtbGNudPbtcmReWFdbU1NeaGZmW1VUUk5OV1hVWl1m9+3g3d7c2tfZ3dzX09DS1dPY3Oj17OHf3NXY19DNztDSz9Pd2tnb6fv5b1lOS0lHQ0VLS0xOT0xDQEBEREZJSktKTVBNTUpJS0xPX+3l6uPa525qZWv8+tzY293Z1t3h5+Xl5dzNy87PztDieW569nZ95+X9eH1zZVdRUE1NVmBfVlJVU0tISk9ST05UTk1TVlJNTFRZWmPc1t/d3Nnd9+ze397f3eHp3d3Y2NnU0tPa09HW2OLl7nVdXl5dXFJUUlFRUU5OTk5JRkNFSUVGSEZDQkRKR0xNT09LS0tOUFRbXVhXV2ZycvT5dmtlZ3n/4trR0dbQy8nJzMrO3OT38fz16eXl6er79tzZ3vlrbvtwU01XZF5VTE9ZX11WTUtMTUpJTFh1Zltd6NXe6t/e2tbf4evm3+f5Y2N4cevez8jJztLMy87Q1+7h4Nnl7uDr9GljYFtWXF5hbVpRTUxIRktKSUtKTEpJTExLTUtMS09nfflxaGlyalhaaW5mXmludH744+Tb19nZ0cnGyMrKy8vU1tDOzc3MztPU1NLZ6+z8amBv8Ovs9G5kbF1fW1phXVhWXWVodWVjfHB+4trV2Njh7uHh9HJv9u/wb3Xf29XOzs/PzczJxcbKytLX1N3f7PDie3NpYmBYW11bW1dXXGJrWl1fVVROTVFNS09RUVFUXFxaXl9gXmt28ed66/FrbXJz93Rv7Onj5N3X187MzMrMy8jIx8XCxMjKzM7O0dbU3Ozu7+no4tzb4+DX19zg7XFsXllZYnhoam5hZXP25d/Z2t3d4eLi/Ht0amZZV11o593Y0tfV1tTU09PX1NnVztfW0NXd9Pvs/W9ubmZpe3Fu/PFqXVxcWldbUlFOSktJR0hHSk5PT1BZW27y8PVuZ2FXXV9cXF5ob2z02dXNyMTEw729vLq7u7u8vL29v8PFyNHc7Hl67eTf3t7Y2dvY3OvwcWtrXFpVVVdPSkdGRkRHSkxPTldbVFVUUU5RVVpl9N7d2dfV0tDOysnLz87NysjGw8nOz9DU2NXV0s/T0tPe6PZtZFtTTkpPUVBRTkpHRUNBQEVITUtNUE9TWFxVUE1OVVxWXF5ZW2n29+3c0MrEwr++vry5ubq8vLy9vb/Bx8/c3un2/PD26Oju3dvf4996al1cVk9NSEZDPjs7PDs7Pj9EQ0VLSUhMS0tMTFdne+PX19fb18/Q1NnV1NTRzs3OzMrP0dfY1NDOzcrNzc7T1d3j5G5fWFBOTk1NSkM/Pj4+PkBFTE5QUlFTUk9UUk9PUVFPTk5QVFJQVV5kbuDOyMnHw76/wb7BxcbJzNHi5u5rVFZbUk5WYGhgYWt1bmlwa15ZWldPSkhKQjw6Oz08PkdNVlJQT09TWV5jbXB58OTd2dnf7PDq3trW1dTT3Ont6ezq8vn46drU2NnP0+Fv+ujodmx+6f1rYFVUVVROSEhLTk5LTllbaW5uefTj4O79bmlqXlhXVVFRVlZPU1leZffY09fQzs7MztHg6flaUU1MR0JEREhLS1BYWl143tnV0M3Q1+H3ZFVNSURCQEdLRkVKUVleZmdtcd3Nx8XKzM/X2Njd8vXue2vy3uTy4eh+7urm2dHQztLO0dLV3t7o5ujm29vl4+D8c2xub2BiYVVPU09UU1loY2t94tne8OztfXJqaGBXWlhZTEtOSk9TXWlleeDY2NTR1dvc4+fscF5eWVJPUlNXWlhXV2Do2NDKzM/OztHS2ux8ZmVbUE5QUVZdXFtbV17h09TRzcjGyMfIzdXb3ODt6Oz77uvm5+jj39bQy8XAv7+/wMTJyMvR1tff5+9tcGBdYGNma2VdZWtoaWNgW1dfXmJoamldWlJTWFNLS05PUFFPT1RRVFhYWWz/7dfRzsrNz83T3N3U2+74b11TUk1NUVdn5tfVzMTCwb/AwsjO0drf9G5dUU1OU1NWWVxkX3jb1s3KyMbDw8fExsfKztHY3+Dm+vrw8P/o4drTzMzKysnJxsTHztbf6v1rcmBXUElKT1FQTExMSUtOSktMSklKTU5QV1lYYFxaYF1fXl51afj8ae/t6+n1eXzr3dLMztHQ19PS1NDV2uDo+nFfWE9LTExOUFhgZu/i0svOzszNzM3N1vJ1X1hRUVRXWGDw6N/a1svHx8K+v8PExcXDx8vW7H1qZlxpbGdtYHLl4+Xb09PQ0NPZ7PJwW1ZOSEI/Pj08PD5CRUdKTUtISk5ZYGN6bl5dbXRpc3R+b15ebHT54Oro3uHX1NjPzc7NzcvLx8rNzNDU0tbf6PRwXllTTUtPTUhHTVNc/OLd2tHPz8jGxcPJzNPc6XReYFxZV1VYXmdue+fZ0svHwsHAv8HAxMvS3nBcTUhLSUhFRERFQ0NKTmF6c+zs8PFuZ15PS0hERENEQ0ZIR0hJSUtPUVdaZW5q8+Ht9ffm3d3c3u/7cGX929fZ2t7j6OHi3tLM0dHT0dfi4+Db19ne4O77cGr49GtgXV1mbnBkaHz43tnX1dnYz9DSz9npfntgWWt1XWV9bvLq6+ro5+/t49nc3enx+15XUklGR0NBQkI/Pjw8QEdJTmXn3tbP19rZ4/91eG1VSUpHSk1JS0tKS05fcOLj69jb1M7f2tfi5Ork5HRvXl5dXWB5dP3v4NjU1drW1M/IyszJz9TW2NPX3ujs4uf5bWlaUk5NTVFOTVVf7tnY1tnLx9DMyNDc7GZdVk1JR0NCQEJHSklMTVBmdl5m9fPi3eb3a1tWVlNMTUxHRUZFSk1NT1JUcNnTz87Ozc3Q1tztemxxa15VU01ITlZVWWNybmv34OXs5uHa1djc3uXw7t7m7/H0/OPRzcnKysnLxsHAwMDHzczN1+t2Z19dXWlqZfz7/Ontc2deWlhfZXRvXldWXv1hVk5LS0pKSUdEQD4/REdGSlJj6tvRzcvJzdDJytbb7mpoWlJPS0xMSk9fZnfw5dfNysfDwsPHxsPHztz2ZFZMSUhJR0hLVl5lcnbo187Mx8PBxMnHxsrO2NnT1Nvg2+Pu7Pf53dfW29fP0dLLwLu6vsTCwcXO2G9dZV1ORD49PkBDQ0A9P0dPV1RVWV9meGpbWltfXFdST1JVU1VOTVFXXFtn+NnRzsvMy8jIx8fJz9nj4/liWlJSV1NXY3J3bfLe1tHV083KyMrO0+Lp+2tpY2pqXW5wcvDf1tXPzMfCv8LBwcjM09vnfXBfVVlfYmRq8OLX0M3JxsbIxsjKzNHY3vZpT0pLSUA+PTs8PDo5PD9BRUlHUF9ofOPX29/i6O5u/mRbX1BLTk5PUVRfZWnx29fMysnEwsPGwsTKzdTX4O11VVNXT05MS1BdYl9849HQzcXEw8HAwsXIyMvU2OZwbGFebGNfZHRsaPPk09HOzMzPy8jIyc7U3Ox3aVxXVE9MSUpMTExPU1thYG72a15xfHNdVVdNTk9KRkRKS0lNUVVXV1tdY11gcf1289PT5ODf5vPj4X5+dm5hXGj35efo3dbMz8vJzMzNzdTd4ejq731wa2v++n3u6unc39nMzc3JyMzOy83OztDW2+DudmpfW1pbXmna1NPU0dLVzcfL0NPmbGFcUkpEQj48PDo6Pj8/QkNAQURMVV/g19jSz8/Q0dXb4fRnYFJOS0lJSEhPVFdcX3D06Njb4N3g5Orw3NTd5OT1e2VmbVlXVFBXa19l7uDazsnIwLy9wMDBx8rN0fF7blxcZG1eWFlfWmXz7OXW1dPOzcvJx8bHys7d9XhqX1ZPR0VERU1RUFJUTk5OUFZVUUxEQ0JAQENEQ0ZLS09ZW1hYWFFPV15dYn3079/W1dvQztTY5+337fZfW1hUVWd79+vp7evn3ut7bVtYXGRu6+Lh29fV2NTPz87O0tPR09LPycrKycnMzMvQ2ulgU1JWWFlcXl9r9e7y7Nzh29bV1t3tfvRnXlteXE5LR0RDQ0M/PkBAQkVITFdw8uHd29rXz9nn/F9XTktLR0lIR0pOV2Z6enxrcfzu2tXY3dvZ2dPPz87O2t3c4OtuYF1WUEtLV3N14tnb0s3KycjExsvNzs7Uz87T2OX+d/18bGFdW1tx4+TTy8vJx8fJxcXHztrfblhPS0tLS0hGRERFS05SVFVLR0pMUU9NUFZZXH5sXnF1aWl3/FpNTFVo5OdtYF1y3NDN2+5vdO/4fFtPVWZwcF9RTVt8+H1xdW717Ovl+H7o4NPLycTDxMTFyMjKzM/a39zb087R2N7f6vx6cPfr8OHp4OLl3t3f3Nrn39ba19fX3+La5eLX3+bo63dnWk1JRUE/Pj07Oz0+QEFGS1zg3d3a29ra59vS73FuXWlpW1tbaG5gX258cfDr3dXU1dnZ2N/m2NDY2dru8v9hV1RaXFBPVFJUYnXq2tvZ0s/KyMW/vb+/v8C9vcHK0dvje/3sdmt+8+rf3dzr3dvd2dPLx8nMz9jZ6GdrcGBeWFRXUE1MSUVGREBETVNWYWVWY3Fn8OV5Xl1XT1BPTUpKTEtNXPX6ee3l4une2t7Y2dbOz9v2e2NXV1dcZfXq+/Tw6Oju/Obe393c2NPOzs/S2Nzj49XO0NDV1tXV2t3g921u6ePi2dPR0czMy8jJztDO0dnc3dnW3/F3/PtmYGhlWk9MS05YUklGQ0FCQ0VISkxMT1phcezp6+55denb3Ol3b2ZsdF1faGlfV1dUWF9u+Xdxc3Dw5unp4OV8/O3c19jY5vNuWl1bXF1YWmDu3tnX2NHNysjDv8DBw8TGytHe8nZcWFVRVFlYXGdfZW997ODUy8nJycnDwsnMztDX2tzldVxPSUhIQ0JCQ0RFRUVGS0hGR0xXXGBYVltUVlteXFpZW2Nlb25eZ3V3ePvj6Obj4Njf7HduZFtjY11UVWRnbmtdWlZZX15r7PJxZX3d09bS0M7O0tHNycfJzNHS1+Hrev76amh86+PZ1tfU29jb6uLmfXhnZm5uY2djXV5m8+fu7PB2ZFpiXFxaUlBOTEhIRUhISUxOWFtkbHZ763l77H56aFxZWFFNTE1TTEpPVltt7vHp8/3f4N/V2N/m/O3m6nb6a1NUVFlhX1ldWF9ofvT47era18zKzc3LyMvOzMzP2uXj+Hps/Or87+34+Hl18Pju2tXb1szHx8jKzNDb2973b1xVTURAPj07Ozw9Pj5ESUtUXmFsceba19jZ29rY7fV5dP5jXFhbX15fam15eeTX2eTz83dkWFRXV1hXW19hZGNt8vt5enTp29rVz9jc5fPj3+ni3drRztLSzs7N1tXP3N/i6u3p4ubk7Pf59Ofl4NjT0M/O09DNzc/Tz9LX4X5ram5kaVxXWFtZWFBISktKTEtISklHR0dIS01MU1dceN7U1tXX3dnU09TU09jX2t/v8O94ZGBwb3Xl3dvY2dnc3OLo+PFnUVdUUFhVVlhZW2Dp1tTY18/OzMfFwb6+wcfN1dbV2/Rtc2RkYl1eXWj4+fHf19LNzc3LzdbRz9jW193Y1tnl+XBuW1JRT05IRkVERUZITE9SVF1kbO/q493a2OX6c3x4d2BWTklFSk1RXFxm/Obn3drX0tPNy8rHyc/a4OxtZGJcW1paXGh6/eLa0dPU19vb29vpd/t6cO/s3tnf4+LZ3NrY1NDb3dnT09be4On66drd3eN97+/o5vB6eu/17PD89nt2d2lXSkZGRkZISk5LTEpNVVVeU1FgX273+nBubm3639nq7vTv4d7Y3/vjdlt383heV1hOTk9VWF5fX2/t5vX2497c1t7b2Nvj2dLnfXhbXG7j6fDd18/Nx8HCxs/RztLY5/BfUEhCRUxLSlBe7d7c19DQzMjHw8TIyMjP4/ppW11aVk5JRT48PUBBQ0tMS09UWltdV09VUl5+7vttcHl+buvc6/huY2xofn1uZ1xaVmnu8ejj6uPa3djU3eb6ZWBeWldPSUZJS0tSW2Rv8+vy593V0MzHx8bBwMLEx9Hj73VnXWhsZ2Bta3bj2NTU29za3u9ybWtYT05OTlVhXl5r7uPa1dTd5vDvbVtZUkxHRkhDP0BAREA/RkxRXHLt29nUzMvMztPmfXlfUldeXFpiZGBxfPjw5N3e4uLb3Ov0Z11uZWBy8H165eHj3d3t7N7temv4+mRmdOvq5N/c19DV2NLT0tHQz87P0tvd2drpevb6cG336ujZ09DQy8jJyMjM1d/ta15TRz88Ojg5Oz0/QklMVG/s3trT1dva1tXc5+f7dXlhYWdeT05PVFddcfjf1dPX2tTX3Nvj/G9pW1ReYFdWVltfc+bV0M/X597T2e50+/X8fu3c2dfRzMnIyMrJy9bh6t/lb11UWVxUTlBe/nl87vPp19bPyMPByM3Mzs/R0tbk6m1q/2taXFZQUFJWVU9OTElMS0Q/Pj8/REpSW3fj2tHOxsPDw8XJzdHa6PNwXltRSkhISUxQXG9rb/rq5drQ0NHT2tzh4/VlXVRUUlNQTllWWPLVzcrGxMPFxsXLzs/V2uLme/3n6OjqfHP06OXc4Obme3v46N7f6P10dvbf3dzi5d3d2t3pdHl0YGJhWltVTkxPU1RTU1lbXmJp+ezd3tzZ7GxeWVZTUU5OT1Fdb/Hy9eTYzsnGxcvO0+j3clxSS0hIS05RWV1hWl165Nra1tXY1NTQ0tHX5efr+XJtb/7n7Ovo3c/T0MzO0NHW3uTi6XRjX1xgam58fv3t3NHPzs7T1drg6GhcUEpHRkVER0dEQUFHTVRXWnng4+DV0s/Mzc7Q0dXb3ODd5/v3bWpuZGtfVldWUE9RTU1MUFNXYWNp/PHp29LOysjN0t3i6GtaVVRPTExPVVdaZ3P+3dDJx8bDxMrKzNba4XtpblFKSEdMUFNWV2P13tnSyMjFx8nJ1M3X3drt/GVYUFxaTUhESU1OT0xHRUVHSUtMSUpOV1pTWFxgeNrR1dPOycjM1OXb1M/bampu73pVVWdvW1JUWF1ZU1hbYGBaWlxdVVReamtu7+jp8eHXzsrMz9Tb3uTZ0trf5f93bnVqXWBhW2B86ebs4N/q6/5rdGpeY2tpaW9ta2dscmzx3d7f4uLp8nh3ZVtYUE1LSUpLTU1NUE9PWGhv8efo5+7g1tne4Oh5aWNYXF1YUk1SXGx97+vr3dzf2tLS1tPX39jZ3O56ZVhZWl1dV15cUlZXWF9eX2d2+uXYzszOy8zPz9DT3dzd3dzx7epwXVZZWlNVXV5ea2rz39jR0tTU29jb5OPhd1lbWFRPS0pJSEpJR0hPU1ZibfPr9fXq5eHY1M7P0M7R2drc4e9maWRfY19dXFxfWlFQVFJPT1hnfPb88ujg1c/Pzs7Ky87NzNLc3uDh4t7o+3NqZ2dsanj9+H3y3uPw/vbu7d3b3+Hi7fLveWZeXF1ja/3v3dre5enj6Obc2djc2+N2bmltZl5aVVRQUU5QUUxKSEhOUFRZYffp4t7U0NHR0s3MyszT2ePtfP36+XZlX2NkYl9bWVVTVVpfbuzs7nhnZGh6+f1tcvr78vz66+7r4tnRzszMzMzPzs/Pzs7R2Nve3+v6dWZfWldZVFRbWFVVWFxs+ejc39za2Nvh6fVwX15rcHN7cWJZUlNWV1tbVFJQUlRTVVheX2R85N/Y0tTZ4ebi39/f6Oru7fVseXpzZF5r+vp7+m5kXF526uDa2dja2dfb4/N6Z1laYGdmbm5nXlxhY2X/6+nk3tnX1tTT0dTUzsrJysrQ3vD9bmdrZ19aVlxnbHZ2cGxleezy7ur2al5jbG50eXZ0a2ReV09KR0ZERUlLTVJdX2Pw3NPMx8bIy8zO0NPa4/htYF9obmxuXlBRVVdXW19fY2d0fPbs7fPw6OXf3uLf5Pf56+Tk5uXj3uPk4+zq7Xlva2l47+be3Ov98ezn4N3g6nptZWFmY11dZGvv3NfV09ne29bZ3eDf5vb7+3dsZ15UUk9OTk1PUE5JR0pLTVRdam1taXrt4N3g5eji2tjU0NHZ4dvX2Nrd4PZzamVcWldPUVZaZGtz/Pt+bXr0+fns2tnb293l7e1+dm9tenvu4eDe8Pjm3NbTzc3P1dra3+D0ZVpSUVJVXWFjXV5mbvx4evT4eWpqZWpraHjr397e29zg8HdsYlxVUU5NTEtNUFZfZGp69ejd0s7O1t7h6vDs4+Pm7Pf9enZyaFxYVlNTV1tkbW3w397i3uDk6+rk7Pv39f548+3v7ufk5+jp6evt7e3s8P57d2xo/e559+fq6ebl5/htamhkefjw4OXl3tnd4OL6bmZiZV9oc2tlam9qaW5ta2RgW1dTTk9OTlBSVFNWXmlucO3s5t3g3t/k3+Li39nZ2dfY1dHQ0dTd8W9rd25gYFxbW1xmZGNuaWv88Ojh3Nvc393d9GtlYGRjX2FlZGZmZGhrb3R19efd2dbV19nd4+n1+fb56en07vn66uvv7ev27/j79ffu8vD99+/+cF1WV1JRTk1LSk1QUE9VXVlcbX377uDe3Nja293a293a2NLT0tPX2NbZ6/N5Y2NkX11ZXWNfW15hZGJfX2hw9enp5uTg4+zu7/T//e3u7ezn4+Hh39/g4uzx83x2aWJoZmVmXVtmdPjn2dTR0M3MztLY52RUUE1MTk9PUFVdY234+u7h4OPf3uj4bl1YVVVYW15idPzu6uzs5N7e3d3m5O3+fP94//f68et2bGBcX19kY21xcv3s6vp2dl9fY2lt9+Pc2tra3ODY2NvW0s/T2+Pp+PL7aWxuaXl47uTi3NbZ4ufudGpfW1hWWVZUWWFicf50bGdkbXf46uDb1dra193f3+fv8HtrXlxiXlxjYF1pe/zz6d/c3NnZ6XNiWFBNTUtLTlJUWnDt6uDd4+Pc3+jn6fB9/Xl4cHz48eXe3tfR09XV0NDS1Nnn+HFhXmFjZmhvc3lrbXFoZ2xjaXr5fXr6/mRfbGRganP139XOzc3Nz9XT2N/e4/RyX1ZRU1lbXmZqbnl9fHdvePpuaWliWVRPTU1OUFRYXWJt7On69/n97+nh3NbQ0tfW1t7v93hlX19gXFxeXmj77+fg3t3f4t3i4N/m6Ony/H13bGRfZ3Jvfunr7/J7YltaVVZUWlxn6ubk3dze4N3a2tXQ0M/OzczMzdHZ4+jve2VgW1paV15hZGRbWVROS0xMSUpKS01QVVJQV1ph/NnQzcvLzc/P1eHvcmJjaWtu9+/l39rX2NjZ4e377vR8+nx4c3BxZV1bVVVUUVRZWVhXWllaXFxgav7p5dzU1Nra2Nzn4dnU0s3MzcnHycrLztTd6PR4bWplZGxrbHZtYVpWWFpXWl1ZXF1dXF5ZVVNOUFZbd35+9XVvdG5nanf36ePd3eDa2+jt5/p4b2NjYnDt5trU0tPb4PplWU9LSElJS1NXWFhbXFxgbvHf1M/Pzc3R2N7qe/nv5eDf293a09PQ0NLc5e12cHRuY15w9e/n7HppY2NeYHPv6uLb1tje6WxaUE1SWGJqZXR2cGpreHf6+fj0+ex+aW9wam9sYl5bWVhZYG36597g5efs9PRzaWVeXVxfaG1iWFNLTE1NU1to9+Xd1Nff4N3Z29va3d3e4t7Xzs7NztHW29nb29rc3uHk8mZeWVRSVFlXW2RsfPHr8HhkX11ibnn16uPn8e33++3r4eHe2+Hf2tTT0M3Q1+hsXlJLR0hOU1VbYF5cXWJiYmZiYF1cXFdTUUtGQ0VKTlVbauve2dTOzc3Mzc3N0NHY3NfQzsnGyczV3u15a2VkbvT/+/VwaF9VVVlZV1RXYGVibn1ubWpnd/Dj2tfT09ve29rc3ODj4+1xcPnr4+DX1Njf8W9fVlFQVFteXmhpZ29wcGtlYl5cYGZlamJaV1RPTE5OT1BUXV5id/ns2dXU0dHR0M/NysnJyc7R2fpmX1paX2r78u7q7e3i4Ojq7HFiX15mZF9eW19fXmFoamzv5erl3drd4dvg8X50Z2dv9t/a19TV1Nfd4ut69eDk6+vv/XZpdn1uYllUU09PU1RSUlFUV1RSUE1NT09XaX3z6+LY2Nrc2tnW0szGxcjKzdLZ72xhWllbXGFkYmRnZm336Ob0eXxvb25mYmFeXF9eX15eYW745trUzc7Rz87U2ej273j16erm6vb+/2hjaGZtd/fq5Obe4u/n7GpdV1RTUVNYWFdcXF5fXF5lYF1kcfzt6OHm59/j6urr6N7Uz8/Pzs/Q093s+W9aUlhcWl1fY2BfaGxkXl1dX2tqaGtmZ11aXV5fYF5p++Xb09DSz9LT0Njb3N3f3+jm4Ojo6PT7bGNjW1thanHs6e3j4eP9YmBcWVdaWFZaXV9fX2NdXWhmbe7a1dXX1dfc3O1wevjx6+Dd3d3b19vf4+/4bmZscHpybmNeZWtqY15bW19mYl5kYVxaXm1rZF5cXGBw9ujh5ubk29vm7ujf5/Lk3dnX3OXn63xlX2FfXmr659/h393h/3J+ffxtZWFZWFNSVFVVUldaWV927PHo2tvX09ne4t7b19bS09TPztHU1Nff6/V99PPseGhnXFpTT01LTU9WVFJUU1dYWmV393x0dfXl39ze3N/e2uPx+fr17uzt7Obh2+Dl4+z4bGRgXl9ia2doevP9YVtbXmVtY1tgX1xgZ2VfWVdZV1xoe+ng493Szc/Z29bX1tHOz8/R09DT2dzh6vN2/+7o7P5scf1uX1tYVlNVWlZRVlNUVltdYG1ta27p397Y19zZ29/ycG12b33/a2317fTz6+r5//x1b3pzbG9qZnn28WdeYWZhYmBbXl5aXFxfWVBQUk9TXmh97vHm2tvc5uPV1NbOy8vLy83P1Nbd6u32cXjs7n5xdft4bW5oZWljXmNsZ2dudGlfYWJfXWJu/Ovn5Nva3+bt+Hl9+vDy//nw5ODk7ezq9XhufvtybWpob3RvbmFYU09NTUxNV1pbXl9gXltaWlppevfi3t/b293d4ubd3d3d3NfQ0tPT1tfa3+H0fvf4d3hxde7w/G5nZWJaXGdt+OTn6uz4dWhiZ15kee/n5OHh3eDm5eTa3N/e3+Dk4ep8bXv4ffxwZGFlY2JjbHf39v1yaWBWTlFTVFlfXFRSUk1MTUtMUl9p/OPe3Nvd3d3W09TW19TT0tLX29zY2dvb4O3y6u717eXm7nNkXFdUU1Fcb/jn6u/493ZoYl5fZXrl6ujl5+Xq6ODc19XW2NLP0NDV297Z2uHufF5TT1RQUlVXV1JTUVFVVlVXZvb093tuX11aVVNRT1JbZXjy7uLo+ejg2dbb3t7h3t3f39rc2tri4e188PH35tza3e1tYldUV1xicvLt8m9xdG1xY1pcaXzt3tjZ3+Xm8vbq5ePe29va09HX3NvW1NLT2+t9d21rdv5rXlpXUE1RU1FVWWZsZF5bV1RUUU5NSkxQU1pic35ydvr46dnZ1tDSzsvLy87P0Nje4/hmcm9haH3p9WpsZlhZW1hg/vDq7+vr//Xn+GxoY2V49urh4Nrf6ePn7Ofu8+Ha1tHU1dbf4t7k5Ot3cHFrav31eF5WV1JUV1heYnX79vr3cmJiXlxZV1VOTk9PU15hXF5cYWps9uff1dHPzczMztPa29/r5/v58HT683x3ZlleX1dZaPjn5uXe3uDd6PD6Yl1jZG16/u7wffX6e/Z8b3vo29TRzs3R09jd3Nzh5Obs6+nq92ddWlNRUVJUVFlgX2NpY19fWFRVV1RPTlNZXWt99Ojq7ujt6OHe18/U0c7S1Njb3OPr9/1wdXFjY1xeY11cWFdXWWN57/no4OPe3drc4fdhZGx+7eXh7fft7vpve3Bx6dzU0s3N1Njb2NjX3Hx7fXRrY19YU1JSUU9TWFxgZGdsbndtYGBfXl1WT1BWW1tcZ3P+/X777Obh1tTU0M7P0NbZ19na3vF2+er0amFqbWduaF5gXFphYnJ9e/Ls+evb2uV7a2xv9eh+bf5zbXJsamtob/j63NHR09bV1dfX1Njr8O3r7GtpaV5cWFFTV1FPVFZfYmNrYl9gXllVU05PU1ZWTVdnYmn+5uPe2dPP0s3Nzs7S1dLP1d/f3uDn7vlkanlwfHBoY15YVVlaaW9qb27z3+Lv/fn89vfr7Hz26+3n3+nv5vL56d3b3eDa29/X2N3e3+LofWxrWlVZT09ZVFJVVVxdZnpwYWxnXWVeWFdTVlVOT1JQVFxk/uPn4dvc1dPQ0NXb2tvc1Nje2NnY2+Hi7Hd5fGx+8nBtbGdrbPfybWlxd/nj3eTl497zcfN8bWZpdWx0bmxpbPbp3NjX19jS0dTU1tfb2+f28XhoXVhZV1RSVVVVWFhdV1BRT09OT1FQUVRXT1BVVVpec+7p2dja1c/Nz87O0tfZ19rc297j4+Hp+3R8aV9nbnJvbmVfZGRgY2xqa/Xk3dfW0tPX2+Xu+f16fPZ8/f5zbHHq5+nj297l3eXk3+Ph8OvqfWZrbltaWFhfWlxeX2pjWFhbVVFVVVpcWGBbWllQT1FXWWZxfObr3tXT0dHU19vj4uXq4N7f2NrY1+Dr7PJ3cGht+nNwc21rYFxcXWJ29evc2dvZ297ldmlsdndwb25ua27v4NjZ3NfT1dPX2NfZ29nT193qenVoXFVUWFVTVlxaV1NPTk5NTk9OUVBNT1lTT1FUWV9t7u7f2tnRzMvLztHV2+Ld3ePd3dnW1NTa6/F8aGduZHn9aWphW15bVlpncuvi3dPZ19be4uh8eu/2+Ot79vNt9+bf2+Hl3t3c297f2Nza1t3h7HBuZVtYWlhXWVZaXF5bVFFXV1ZYWVVYWlZVUlJUUE9SV11sc27u29bQzc3W3d/h4NzW1tPPz8/R1NXja2ZzaWdtbXBmYmhgXVtZY3T349zd1tXe4OLt8vxsaWl3e2RoevHp49rf4uTb2dzW1tbU09LX1dje8GtmZG1lWFZTVFZUUk5OTE1QUFBNUFFNTk1WWFJTU1heenFx5t/SzszLz9DT2tvW1NTQ1NbU2dfb9GlaWFpZWVlaWVtZXGBcaX7v3tjTzszOz9Pa2d7p73d1fGlodXPu3+Tj5PHv5+Xi5+fi6fDu7untc3BtYmt8bWZkZm14aWhiXVxbXlxYWVhQTk9OVFdSTk1RVVVYXW7559nY1tXY4N7b3tvT0tLU1dPW2eH7amVeXV1dZWhlZGBnb33s29na09DP1dbW3+zp9WReXVJUWFpq8OHe49zb3tvU1tnY19LW3Nrg7+nvdHz4evhrX19fYFlRUlRRVVZRUE1MTUpLT09SWlVQU1VZXGN839LNzs/O0NjW2NnW0tHT2Nnc4+rxbF9hXllUVVlcXl1ZW2Jq/uTd1tbSz9PSz9LW3+r7aVpXVVZfZ+7c3drd5d3c3dvc4t7l7+zw9fhrbXxwefH9cm1ndn1yeGVeZV9cW1xVUU9MTlBUV09OS0hMUFJZaPTe2tfU1NXW2trY1tPT19jf3tjk+e79efppZV9fY1xaX2Vo/Off2dvV1Nra3N7Z23dlX1xaU1NZX2745+LZ29nV19PR09HT3uDn7efteP7z7uju9/1vaF5dXlxYXV1WVVBSUUxMTU5PUlFOTEpMTE1WXm7s4tvY2NTS09HP08/O0NLX09ri4O58ffhuY11gbF9gaWFhanHy6N/c3NrX2NrU2ODnbG10ZmNibHj7+uTe39nc3dbY29ni7PZm/fVqb/hu9up68Xl78Wdo8vxu/2tnbVtcVk5RT0xQTktNTElLSklNTVFbWW3t7NnW187Mzc3Q19TZ29nc3t3h5+Hr7O5y8/9t6+zw5+746+Ph4uTj3ebm5fx8Z15mYF5mamt1bHLp4drW0c/OztDT2t3l6fJxbnh2//768vn1emxuaF9fYFxcV1ZWUE1NT05OS0pMS05OTVJVVldWWGpv+9vV1c7NzMzU1dfb1tff29zl5O3/9W96fGVl9vT76fHj3Obe39/Y3drX2uLn6Onsc2Z4d3lqW2h3dvjo3NPU3N7l7fxnc/l4ZG/p7PB79enq4O3u3eTze/ru+G9jXVZPT0xLSklHRElMSktMTU9OTU5WXWV73dLNzM3P0NLa29nY1Nfb1dTb3unu5Ofxferk8PPg2Nvb3Oje4Pj/ffh5ZGj8+2xmZ2JgX15caers38/Mzc/R2Nnc7Ojk4ur27eTl9HV2eHp+9Px5dmRjbmtqZVtRT09LS0tJR0VJS0xQT1JQUlZaXmru6t/W09DQ0dbc3t3f4N7c6Ofn6uV2evX/8XTw7ejg3tfTz9DW0tzr4OXr6Ozz5t/0531dZmFbWWJ28uXk2tvb2urxcGv16ufk3uDY4nDteHf9/nrn3e/n5H7m5PRxXlNMT01JSUhHR0lHR0pKTElJTVhfZ/zt3tPR0dDQ3t7Z29ne2NrV2e3h5+zd83nv3+fm2ejfztHX1tvw/3dsYFtoYm55c+D+dPhbW13uaPnZ69XO1dDe4Ol5efne9OXX3uX3+Ghhalxle/N4+f5z7PV7elpeVFRLS0xDSUpGSkhKTE1MSlpXXv5869rQ1dbS3dzY2eHg4OHd5/D8ZvVrYvvx3uLf4Orc1c/PzdDZ0tnf63VvbPNteeft4H1ebHJsafbw69jb1dfe3eL3cHrq5+nc2efs6XttZ2lhbOf2d3De4nDk7Xp1Z1ZPVEpFRkZIR0VFREZEREZKT1JabtvW2tXb1trh39HQ3tnO0dba2u9t9PZu5NXc5trY3dvO0tvO0t7e0Hxb+VtTcGxj8O1beftRceNl59Pc087c1db03dp45dfr5N7c325u91xb8V9f6PxjaObsbGzpbljzXUtPT0JAUEpBS0xFSkpFUFxOat1t3M7v39X36Nje1NDq2c/k3+b3+WNt6nrkzeLv193f2MvO3tbJ1+rN4Fp68VRY5HFZaGZQV2xp5N1v3c7z3c5w99VyeNbo187639RrcetubWF+1O150G1f1uhmauPoW1lfTEZMRUFGSUZCSEs+RU9KVGVv9+fV4n3g4Wfj2N7Wz8vV183kfdJ2V+Df5dzV0+35ztxnzMz818fhaN/fWFjuZFro4lNV/WVQ+NP4dsvPaNXMbmbP3lveyuLezeRf4exXXOxeYd/vbPPnc2n7eVl032BYalRETVFBQVZPPktbQUBeWkRi2Glozd9X7c9dWsvQbM7C3t7I5V/d21X9zeHtzNHpzcrm2sfW3cvL39rWZWHj+lJ82lZQdltNefBYfszvbNHiW2vcXWvQ3fnMyOff0vlf5fhZ6tZuZtjoXujbXmLfY1fg50pYcUdCWlA/TFg+PVJFPVJuSFPS8l/U11VwzHJfx8p+y8D4d8nhUN3RW/jD2m3HyP3LwvDewtb+y8xj689hVNrqTuvQTkzUb0vfzVx7wtpSz9JKX81mU8jPXczIWnfIdkzW407g0FBZ0F9J0uxEdthJV9VOSN9RPVxdPExvPTtnRjpidj9dylNVyO1K1s1O9sLna8HPTtbHUFzJYE7IzlTPv3ncvdVwv8dpyMBm3sJhV8t0StXaRVzWTVLNak7MzVjeylNY0V9L2tVY3Md7acjaXdDYTvbKX1fL+kzV2Uhl1U5Q1GBJ2+dGU29CRWVKPE1KOUhZP0PsX0nh203zzV5by9dkyMdg1cZsY8r4TNXVV9/Kcd/B0HrJynHOxPzfwttmzNpO3NJRXNdXS9zoS3vPX2TL7FDa4E1r2F9wyNBr1Mn+68npX9HTXuPMX2TQbU50cEtY4VtR3PRPbG1FTG1GQFVMPklVQEFYUEp08lFq2Wpp19xtzsxy58zxX9fiU+fRWmPL5F3LxnXcxOL2x87yzcTi4MnmXNXWVmXbWlDkdE712Vpt0HpS4uhRatVgaMjWas/LbujM/W/N1F7ezF5c1G9LX2pJWONZU9/1UWjxTE5ySj9RUD5IVj4/U01GY+xNW9RuWtDPaNbJevrQ51rr7E9l0G5Z0M9d18hy6cXRc8vD4tvC0G7PzWXwy3BT4dxSXeRbVdzmT+zOVFXQfE3fzlv2yuZgzc1U7ct8+cbYW9LMWWjVWEvteEtk1VdW0HZIbeRMSmlMPUxcPz1PRzxOaURM3G1N39Fj3sLgY8zOUvDQU07T4VfZzWb0xNFb1cXn38LPbcnDfuTE5GLNzlFp0lpQ2fhIbc5TVdJ7VdvZUGjRfF/QzmPjxnxZ1d9X1Mbt78nRX+bOVU/Ud0Zp10tO1WpFZtxNRfVVO053PTxfRjlMZkJI2HRL4MxZYsLWWs3IZ2vOckfpz1FcyORPzMdf5cHXaMXEadi+2mDGyWLbwPhQz9dNac5ZRt/ZSFvL/FHX0U1eyPVO0MlYYsfqTN7OUffE5F3HxV11xmtO3udGVdFWSdzcS1rSWkRjXD5FZEM5TFE6P2ROQW7dTFrO6FfOyWTnw+dU1dxJWNBuU8/LZuHB2/vExHrcw9jtx8rv3cXV/MvQXHjVW1DqZUpq3ldgzdtb3dFTWs//VNXOaOrL6VTl4Fhp0eZszM1w4M/+VfNgSFnzVE/ibUx+31JR8U1BUlI8Pkw+Ok5YRlbjXFHe3VnqyuNf08tk+NFdSfvuS2TPfV3MyvTOwNjswsnmx77W3cbU5MTF/OLL+1XndEZTe1JW1Ndi29NYWtX1U9/SXHLK2GDY21Nm0fxjzM132Mr5ctHtS2HbVVXbdU5o61Bp3lVHWlE9Pkk9O0lIQVV1TFPkYVHo2W3ny/Ngz9FTXdpXTd3kU/TI6PDGyejNwtnawcrmzMj79MfTftDYVmXfU0RZVkZd2WNmytFa6dBsY9ToWeXTa/XM+Vnd2lr4z+92zdNh5c5+X9l7TfzjTlDvXEpr9k1Te04/TEo4PlBDQFxcSmPYYVvR2Vzq0GRqzexS7t1TXNt9VeXbatvG4OzFzN/Fvs7MvtB3z8vl3cnkY9DjTWX4S0Z1ek5r2G1w099Z2sxgWd51UtnbT2fPa03Y1FrhyuN6zddb285cX9HhVPrmSlDcWEVuZkNLXEA7S0Q6SFY9RvRSS9reWuzM/1vV31zj4FNlzu1W49Jj+MfXeMjI+c++z9a+xN/LyGLtxeVU0tVf9dhZUPVcTX7gWGfM2mzNyPnmyP5Tz9JZ88t+W8vUUefJYWrF30/X2FJt1WVU2fxMbXFJTt9PQ2xgQVBcPz5aTDpIZENG63VW1c5q5ct4W9X4UXT0TVrXX0vk4V7uy35nzddsycHTzrvHeMfGbejK7V7O0Wrdz1xa219LdPBMd877fMvPXurUWl/U9FfY2F3uzPhY1ddn49JqZtXlVe3VX3PdY1ntYUxmZkdKYE9AUFA9RlU/PFNRQVTfYFrU317ZzWrxy+xX3dxb799ba83gaM7OXu7L4HfHx+rLweXvxtBZ+9NeatLrXdrgU2/fZFDx/V/S0+7VynFmzuVpz81t6cbcYNDSWG/Q/FLm8U5ed1RQ73BMZ/BOVu9bTG9aSVxmSUZeT0NTTkBMZ0pL2O5R8NVaZc7fXtjVVWDdW01tZlB722X/1uli2NLz1cfY1sHI2sPE7tzI33XO0Wzoy/xgz+hRcd9aYNj7Xe3pWHbP5GPNyf7cyeJwy9tb2s5kXthtTXjvTFjmTkveck5k6lhX/lFLV1ZBSFlHQFBOP0tlTUrlYEZ21VpoydlqysVl9MlgTdrfVePMZHjS62XT1WLfzezmxsvo0czs38nfXNfVW/3O6nHV707ozlte0fVS591f2svn4cPJ4czMfXvO31vc11FT51FGZ1lETmRKTe1hSuzZT2HWYkxyXUZZZklJY01DXnNLUepUS+7qVebJ5vbKz2rl5k5b21tS19pOds5rY8viT9rG7uHBzdvEyeHKx//xyttn1c5kbtddVNt1SWzuS1LlX1XVzWvYvtX8yM5c28b3ds77U3zqTFX3SkVmXUdf6kxl2F1Z2XdIXGtJSmRJPlZXPUxmR0t0Tknb/E7gx93iwMv4ztZX+c1fXs/5Ud/XV3bOaVPb3VnfyOvgwtXcxM1e2cph+cnjV9jbT+rOW1XU9k3m1ln3yODmv8Xdzcdz78jdXNXfTlrmS0f8Tj1QWD9L+01M3u5V4NFUXtZbTedqQ1RwQ0p7TUt3YUhh4VRk1W11xs9g0c1OZ9JTTtn8RnHSUmjOdFLd3lfaxu7XvcrRvsDczMXg2MXdbc7dTG7TUVLaVEXp7Epfz2NnyNblw8xo08pj3sV5YMr4S97hRlP3QkTtUkLv+Ep7105W11RH515BXmo+RmRAP29PP3DsR27PW1/G0m3Dw27VxF5XzvRQ3eNOd91RXdtXTeR3Ud3RaNnB3ePEznvL0PHIynrOzljwyl9Zy/RN1NZN68xm7MPZ3sDRbs7ZVt/TXfXVVU74VkNbVD9NV0BP305N0ndO1udQ29ZObdRMTuhKRX1XQW/zRGzdR1/OWWjD23DG6FHTeUTx5Uhu0UxgzFhU0mhSzdpdxsdzycDozsB65MD5ZcTdWc/nS9nYSunXSWbRTVfIY1bD023CxmLQyU/4xWTww2hTz1lD61c+bmo/bN1HZdBMVNBQSthcQfxoPVX8PUfrREXcUUXOcUXN2UzKvmjMvF54xVNPzGhQzm5Jz+1F2uJD/NBL5sFc9L7kcL/VVsXSSMzIVdLEVXu/bl6/2VLM6E7MzU/Mv17QvmzfwFRXyGNWxm1J1mg9aWI7WV46UOhCTs1QTMxWRc1kQNrsP2nbP1jVRlTUTE7RUkfRX0jO207JxVPXzEle1klVzE1IzVxJyOtKzs9O2MNg0L7007vX5MDcVcfhTsfRTNLPTNnLTeXITFvLTkzGdE7B0lfFyFTYyE3iw1Z3xVxPz1pF3F1A62I/Y+pHXONOV/dGSXZLSm1QRGtdQ1vnTVreVVnXalfW3mjMy+zJzFna0k1011Vg2lZa2FlZ2VpT3OdY3NJr2sro687tcdn6a9nc89fc78/P3dPS6d3a5eHe5urP1NvP0unf9Vtp5llo51tm4WJRZVVKW1dPWFRRXnFaW/hdWmNTWF9aWWJbUmlhY/JtYPT1X2zvXnTm/enS1/bd9lNpYFVmbFti7PV77m7u2N7l2tbh3NPZ2dbi3tfb393g3t/u9fHn4eXq4uDo3t757Ofr4Nrb3tbQ5vTl5+3f53Lo5Hf5+19bZWpiY1pTVFVNSUpLTlBOUlhUVVROUVNRVWZpYG/o3+vr29/Z1Nja1dDc7en2Zmd6YV93cmlzbF1gaW/67/vw6er9eHdoceve2tTS0tPY3NPVztba3t3W3tTS1tXSz9HQ1uDe5mtveWhtZ2BcZ3NfWV5WVF5fZF9aWFdPTU1LUllaXGR+/WdeXF1dW2r0cWx67P3t/HDr3+Xy5d74a2BZXWNdXmRlZ252+/P+6ePZ2tff3tfndfX8b/fe2tjPzdTT2+zx6enn5/B76+p13unp29PT1dHj3OR66era2vngd/rsYOt5X/16eHFtYU9QSkRAQUdJTU5PbF1VX1NPUVVgbOtu8ODf1+nX0dnM39rZ8+BlaHlnbnh6bF9qaG9nZW3u43x56WVfa1lTVltp7dzY0NDNydvV0NPL1s/Y2s/k2tDc2dTP0dfc7uj1X2Jt5HD68k9u9lxUZW1dcPldaGZXT0pLSUZNT1JfXWtgW1plWVt9+vrt2txx4+D98tzm7+HfZGNhVFhUYWVdaWNhaG7ybPXm09rj3uPsd2t5XWN1a3zd1trXz9rf29bW1dLX2dna6eTy6OPf6trT5erlfW7o2+fd1udv6OFwd+fk7+XubV9bU0pFQ0NEQUhJTE1OTklMUE9Qau313s/W3tPR19PO0NDP1N7pfmVhZmZgbGVnYmVjW2psbuPxZfppWVhiV1BZZFvq3OLZ0dLPyczJwcnHxcnMy87X2eLd19ri5el6cGFodmp99HNnaGtVWGljXfvn/Wr6YE9ZVUpNTU1PVFddVUtRVE1PWWD94NvZ1tXS1eLf2t3h5nx2cmhdWFVUW2FSYWRra/Xr997O1/Dg+G31b2ddWHzc/Hbk4d/j5P7e0NPPz87K0tHV2ut34e/v5PP97uf1eN7X5eve6Nz2YfN2/tzv9t7sa11aT0hIQ0JGRUtKSEZGSEBFSERTbO7VzszMxcbNzcrOzdTq5Nzj62lWW1pYVVlWTVZdXG108+T2d1xkYF9dS01gX2x28t/Z2N3QzczLxsnFwMnHxM7f1Nb06HhpbW38a2Rt+HtkaO5lWGdXVmpwfenf5un5bWpnTUlSTExXVEhOUkZHS01OUF9y6NTKzNHPzNbaz9hleO5sX2FkUFFQTldUYPVgXvzd5NnO2Onb3fdtXFlaVmhgYOzi6ezk2djNzMnJy8jMzMrO1tfe4GRiemhv8mr54uX97+b7+Xxnbmxe8eDj3dHg+N9aSElLRkFMTEdPR0ZIQEhBRVRTevDPycvCxMPIzNHc3dvs7O5z/F5eXU9TWE5XW11cet7p2tbs4PVXWVJST1tVV+tr69rb1tvIzc+9zL+90LvMyr5nvUvl40XZR9tKbFz2ZephbWRP4knjTdVp4s/ry/bfZlFcTE1OS1NMU1JTTU5KSFBMVF9559zN0tXG39LYWtBZ9N9Nz0LjWE36R+RL6VrkdtPfydTQyerOU9lIXVdMY0xmXGPqaure2c3UyczKysTJyMbPzdznbGJ7Wlz6VN7xZ8tU2HdgzkPKVOrafcppzPrZUmpHWkBSTkRNP/I7VURBTUBWSFLtVdTS1cfJxcrJ0NLb3ePpfmdpYl5PVU5eT1drV+xs3dJu381N3fBB0ENI2zvWSlDBP8L+37phttXBwsy40sDIxM3N/NNddFlTXUnrUttbbFxoaF9pX+ll3erp7dfW+PlkXmFIW2E8dFBB2DxQaTzOPFbdPL9H0cpLuFq//ubITtZX51hw7uZM5Ev5Xk7RS8ljyN/N1ePLZc5PcWZI5T9TUkTdTV/pWdDh68TvysP3u9fPvdzEy2zH61DDQ9jcR7pH289EvkdvzD28T+nHP75G2uA/xDxjVDrXNFdSOdY030VL3j3SSd7lcsvqx9HGz8zJ88to2+Ne3fDxblVdXktwVlnmV9r5WttqXNVE4m89yTtsZjrIQH3OQ7phzbxUs+3EulezXb68TbNIyds8vTnSXUXBOslNUtc/0Erw9mzVXNftz27U/fndSt9DXVFC4z1cUEDaPPdbP8g9z2xKvEm96Ou/UclW3ntf2GfTZNpa4FVX603VVdnaV8pTzd5Ox0TdVz/JOPdQPso5y1thxla+9svNzsfgxc/A1sLQ2MxazFXk7GDGTs/mT8hA02lEwj/Hb0m+P8FaXclAzkdbTj9UPVBASklRSU5fTmtN111303y/4sjHd8Vq98lLztpQv0vc2ULXSFV5SlzdWFjVUO3xT95eTN9PT9tC5HhFxFHnxlO91ua6Y73CXbPwwr5ju2P8z2Ny3F9mzk7w50L5UUPaRlHKQ9PZSrxR8L1Ax+FIvTvz3jXFOFDlMsg6WuE3xEFq00O8UsrJULxByOVFuz7E5Uu7Rc/nSc5MV9FO2txKwkztzj/DQ2nUO8FBX+A8xj7s6EW9QMbST7VGvcVzs1+9v3e+597EXsrKT71O4887wD9P2Tm/QV7IPMBBeso7vD7U0Dy7N9tMO9Mw3T5K4jvKQt3kT71Nv9Hst0q6a+DCQrpKzdhPwj7QWFbYPM5HWtVAxD/g/T/JPstXWsxNxk3i91jZStBm09pfv1vGyXu398DAaLt9z8xlyv3dct5sWfE+6EtD4DrhUEbFRtrOSsRsa8Nw3sZy9dRFcWc4/UM+6jpUdzruYE7JV+TFW9nMTMvcTr9ZbcRHz+lIy01byE701k/K2knFYFHGRXDLRs7PQsZaP8A9T8o4zNxAu0huuETAw1i02uG1a9C7Vb/ESLv6Tb49bsw0yU08vzvnzjm9Wka7P9XLPLhaULw5z2E2yTZSZTjPP2hvSshMx9zdvVi77mS7RcLdTLhF6cs8w0hEwzrcaUG9P9rYQcNB5fxDy0bQbVvCRM1XVMc9yGJnwUPE1l3Abs3C/cPL8Mff2s/t1/LiXGjxQmxGS2A65EhV3UHEalu/XczKX7/c/8hg+3dNU0xNQVRLPXU/W19Aykzf0lO8U/vHTM71V8prZ9H7YNlgWt9Va9l0fdPQYdDaVtJgTNZqRthqSNpaS9xOStxRTdRcYMth2MbtycTOzMXMz8XM2cLTW77nTc5OSHZAROFDSc9KVcVP2MJIxNNEv3JLx0NSzTpZZjvrP0LUPmXcRcZ8b7lsz7tUzMxMwXBTw1Z2z0Xw3zvzXT/SR1rEP9fIQsRfUMY+7NBAz2RUx0fa2krKTHHOScty6sdawdLUxHy+7d3CXcTybcVO691F4UZFeDpiVEfWSdba9cb8wtDzwV7K7FPGSl97P35EP2c5UFE/2kb800zH+t7HWcvy489Wynve3FjIWGTSTer5Vc39XMniaM77b9pTZOhNVftSY3RMelxMb1JiV1XPbWrJ2NrG1sy+7M2+/cnBbMXLW9TdU2F4SktgRkx7Rk/ObFfG0VvL11TR7EzR9EfgaEJWVT1SUT1ndkfiyl7SwnzVxnJ7xF5hxl9Yyl5Yz1VP1lpH22FL2mlOz+lUzuRO5txJatFL7dNP3s9KZs9MTctQWb9T+L1i37tn8btV27xKz8VB0dxC0VdC2ElA1kVL0j/g0ku/1OC8asjFTsjvXMtL7vpEakRHSj5cQk/xR9ZeXMNQ1NNOwmxexVjrz1bezV/xyV16xlftylPozl5tyHNNzVdH3EtO3k9o6FD8U0bjSEfPTm7MZM/Z78fnzcpvwM3pvtrQyX7R7/7dWtpVTtZGZmBE20ptzU/K41PGV1rOUnnPXGHdSUvuPkd3QVjoVmfQ3WDL01LNz17d1277799oattabtdZb2X0ZkjXXknI7FLN8E3t9Uxg0V5cxedYyt1I3t1D68hN6cJXZL55Ur7xTbzvTb7qS8LdScvqSct8StdnSPVqSPLpVs/deMzj4OBl0vplyW5V4E5MUEZLR1NYSWh8S/jYUmXRdGbN4lXP21DNzE7TwFrpv2tzv2JOxXhKxN5BzOg82ng83+FC081E4dtFa3VJc95X7thd095eymzpxV/NynDF1/bC4WzH6WLNYVbPVE/kTU7gWVXaZlTddlXd91jV/v/TUOluROlMS+tKYuRMfdBSdc9R581S5NBP7M9c5c1i5st7585s8dFWbv1U01ZW1Ulv90fwZUvf3V3L0FjM3U3Y9FDW5k/k4Vfd31bj3lvU1mPQ7PXKW9HNXMzgZtV4ZdhoUeJbWNhY/dVQ6tZWcdprb87ua9D+UftsR1TvSkzdVEntZU1u71xh3vVc4dx63d3U2/rN2W3PzuvfzXl02F1Z+VpHXGRDV3RJY9ZlcdDwXv/pXFfc+FPs3GtX7NpTbdB6c9DP7s/E2+DL0F/ZyU1nyVpT2vRNbfJKXepKT+FRSt9rTtvUX+vO8W3kbl1faGVYaN5oT9rqQt7RSGXRYlXM1FrU01zazVRpy2JXz+Vb4udSW2lWUFVYT09Z/2d6x/VlvtdQ0c5VXc1dTs3sStzmRW/PSXXFVfy/3PnF3lfN2EfZykj0xU1exk9XyUtPylBLylZHzWRVymVgyXdX1ftM5e5L53dF2vw/9vM/d99H485Q0sBb+L5dV8JtTsXTU8jLTdLIRV/MSknbUUD+XkTa20fOy0vSzUb7y0poy0twyUpezEpT2FNox+3bus3jvdxgxV9Lz1tOynBLz+xD6OBCaN1AW9lCVMdUTcXcTcfLT87bTM/dStPVSd/RR2/XQV7SQmW+V3LBbWnQV13aTk/MXlDHfE7G+EXM5kPZ6kF75Uju21fOzFnKwkrkw0piwk1YyVlM02NBd3Y+ZsxO379g2b5WecROTcdmTcT0TcdhSsv1Rs3fRs7tSc3tSsvWS8/KSfHNSmLRTl/YSVPPTknRTkDcVkrK21fBy1DF0EzP3ErOz1LJzErYzEnt0Up320Jl2EFV109W12pY02VO0GtNzdhM2ctP7s5JattEZ89W7MHb5r/RaMjsStjpR9jQR2faSF3ZRmnWQmTPR1PKUVHGaF6/YlrBYEvE1kzM1UvPzkfczj5bzEFOx1VSxfVQx/xGzn0/3tJIe81JaMdNWsJWTML0Rs3gRdPPSs/ITNbESmbAVFHFWE3GXEnIWz3a9z501Eh4xlXmv1tgwl9LyNxKztJE3NBD4chJ+cNdWcbqTs3eSsvVSM7LQ3vHTFPKT0zNXErMbUHX5z33zUNuxFHtwVRuwmFPxtJLzMtH1ctI6slGXsZOS8lYQ9F2RdLdRNvNQ3jFSV3BUVTBaVzDb0rO5kHfy0jzxFr6wXNsxG9Oyd5E2c5BWc9ETdFITMlWSMbjSMvOTNDKUNPFTOjDSVnEWFXI/FTH6UvN4UDc1z5nzURdy0xWy1BMx3hFytVC2cxE68dGcsRJX8BPScVvScXcSsPaRMrOPtrIQnjDSm7ATVfBR0bFTT/KZkHK30LN0ULOxUbYv0xmw0xPxU1MwGNJwttHx8xIy8NH0sJD4cJBWcVGS8hPSsZfSMXtQM3WPuTOPu3KQXbGQV6+U1W76lS+30nD2kLI0j/TzEHtzUJcyEhWxE1Kw1dAzGxDx+FGx9FIycpH5slLXslMVMRVTsNaRcX2R8nTS83ORN/SPV/NP0zGTlDCUk69bla82k7FzknUzkXcykfqxU1rvl5cw2VPy19F2Vw/6HE8ceJAb81G779RZcBYUsN4V8X4TsjjR9TWSdnHUvnHWlvOUUvPX0fN20nTzEvkzUdnzEVNz0pPyFlIy2pGyt9LyMtOytdHzPJByF5ExVhZwk3xv0nIwke/1EXCSUvBPufKOsRoRrpIdb09xtk9u0VPvzjg4Tq/TEy9P8rEQrz0Sb1IW79E4sVE/dlC7M9J3s1KftBLVttQVNJrV8zZXdXOVnHKbVDb7ktq1VlV13xLZN1QV87UVW/MZ0js00pG0N1EZ8P/Scm9Ylm9wktbwnU/9L9kRdPEU0fNxVNOyMtJRs7QSUbY4j9F2OJASsvMTVXDxlFQyclVUsfDWkjly2FN3sXySmnNcUVW0uJJUM/OWlDYzWZN7stzSE/a60pP2NBTS/DQaE7hxtpWZdDaUU7t1mdTctbmWHbNzPZo0szxUWzedlRb3t1eWfDbe2Lnztb/ed7Z/V505mdRVmtsV1nl2O9s6NniYF/y6/dv/eR0WVvy7WtdcOZpVV3y5mtj39Po9N7X3ff63914Zmd3dltZaH5qWVlka1po+vZ8Z210alpbam50YXbr9ezg1dDX2NPW5ezo8PD5/e717v5+7efl5uPk53tq+P5sW1tgWlVTXGlmanXs8vfj4+vs6N3d4uvp8mxu83xtcvt1am56fv1+fG1l++54d/Po63d7d3Rra2hiYV9ja2JrbHvw6ex9ffxwZV5gYnJ1bnX8+PHh393f49/k6unm7v3w+HF+7/xze+3g3tza2d7d3d/qfHVgWlpbXV9qaXJwfPT9e3tyaXJ9d/1sanJpam588vpwcPx9++no8PPv5OXo4uLk7Ofl+HB68XJibW5mXFxgYFhebWRaXWVhW1tbZGNjaWpuevXt49zU0dDS1tne4eDd723u5u9+7urk39/c3uDl5uv2/21fWFdYUllfamNda352cXXs7e3h3uTu6/J4dm7+8/js7/J6+OvucmtuamZzcHz6+fT7cnDu9XhtbW9qaXRxcWtydG5lZWRdX2tdXGdwamNmc/f+8+Xb3NzZ1t3t6u5xZm3/9PTp6O7n3Nbc39fV1dzY19/4bm5gWllmZltcY2ZpcXVobXB9bW91bGFhYGhveuzo6e7v6+jmd/vv+/Pt6Onh4ebq9O50ev15cGxsdf5oXWdmYVZUV1JPU1VYVl5pZV9lbWJp7+3h187Nz8/S1dre7nJteOXg5eHb19na3tzb4+jn7fDu/mhdWVVWXV9aW1pebm5m+9/h6ufm4vL+fnJueu/o6enr9P3t/GhqcHJsam76/nb9/m1xcnNubXx6dXz6e29+efRvYF1ZV1dWWFxgX2lnYGRoZmpx5tre2tLa5erl8GxkfPHv39nY1dHPz9PVz9bZ2Nfa5uvubFlXXFlVU1VZWFhiX2R3//70endtZGRoan706eTr9Onk+3F87uvt39vj7OHg7vv0/GpeamhgYGx0ZV5leGddZlpRT05RUU9VYWFgaHZ1aWzu6ujYzc3Q09TV3u7q8/ro393f29PQ2dzU2ubn3+B6aX37X1tgXltZXlpWXGNbXGrx6uPd2drs+/j3+nzy5OL+evL6bmhqaGd98Pl8+/p0bG97fGdu/2peYnz8cHj37fbx6/dsaGZVTlNYV1dkZVxbaHNlZ3b68eTb29/j6Pr8fe7e19bY0tLPzMzO1tjV09vf4uf/aGhuamZtYVVVWV9YWFhbWl129n3//2Rnbn7p7PLt9Pnt4eRoeHlu7t7f2uf153VpeHDu/2diW15eYmVcZG16b2dwY1tXUlNVXFtgYGJiXnX09fP85tjb2tfQ1vZx6uLr3NHe3tfP1trX0Njj3tbi9XptZldWXXFtX2Jpa1pdaW1jZ3n9+uzd63rz3Oft397oePXla15seGJaZfn2e3TveGFgYHl5eu7teXvqXmbxfuVqb9/ke3X4aFlTW2NaVFlqZk5YbWJlXG7m79vf32hX+Xrs0MzY1dDN0dXOyNLWzczQ2dXobH1dbGpXXmFXVVNaV1VVbGFTTl99Ylxwe1hw2d508tnQ3mp+enNw49z519zhzU9c0uFWXNjf4ONWT2tkWlZeZfJqW/BtVFNrZVxOaeltaFdYd3vt/mRv6eDr7Nrb//bp1tLy4NDb3czNztLX1eLp2dpvXPl8+ltd721ebHX3X15qbmlhbvd4b2x+eGD96Hhr5t11+XP+/Fpk93Zh4HZiaXDpeFlu53tt6dvvaG58fV1kaXh2/Hd0dmZu7lxX+WljX1ZeYVhUbGtb5+b+cn36+Hbg6dvQz8zMzsnFyMrJytLW1dXf8uTe82Z7811WXmBZV19qXlpgXnNiWltUW1hVXF7/8PDx6O3v+m3v+Pnq39fp5uTu5nd3Z2JqavtuaWp3ZmdfXF1UVVpTVV5hXFlZW2NkX2ZbYmRqe3NyanLwb3B67f1x6N3a0dDRz87Lx8nMzc/P2trd7e35d/Ztfe5yb15q8OfheW5r8+luaGJvZE1UXl9cX3duWFtudF1hb+/n4Nvb+Pzy5vVqbH31aGx64fPn4t3han5lXl1ibWJlYGhdWFxaU1NVXF1XWF5dZ2pdWltjXlNi+e//2crLzsvEysrJx8fH0c/Z2vT+2PX78ffoXU5r9mty7vNnZPpuX15ZYVJLTFZUVV1rYGXa5Gtv2+jaz8fM0Nji2t/p9OTsXlxRVGPefnX59eHqUFl2W1Vad15UWU5VVmT/XnlmWXtuZXNj/Fp0alJZWlv2zs7QycfMz+TOytHW6drd+nNtd3hkXt/0YGVY4HZn59/x5OvoZlltZl9kb2JgWFRiX1JZWWxTVmts2dDg0PDf2u55VfBbV9f1zurP51zW3NPe2tziaNrnbmpf+15bWE1PYEpbY1hvWHBeU2pXXE5MVFp64NzUysvPysrT0M7N09XZz9PTbV91aOtfWVBRZFhwaGV4Z/1jY2pWTmBhVX5ZZ2piX193d2lrcGrj0MvM0sfP2tbu8tvw6d3n3uDtdvh8cu1q8nZgZFVkYFZcWl9bWF5aW1xncGhg+GFfeW1tbF9dXWBv4tjY0NLLy8/Qzc7M0dLYzsvl8Wx47OXw7Wxw/23y9Ov16fB7amdpVlBQUE9SXVZVX1tkXV1cWFZm6eXd2tfX5ebb5uLz9tra4ubs3d31fObXdPZ7cH1ea11jVE5PUk9STVJZWFNbZl9aVmReWlpcV1xh/ePm3NHS1c3Lx8vMyM7PzMzW1OPg3OLu5+ducXx0/mxc+2FuZGx9blpdV1ZmYmdna2JwdftqXGny9vDq29HW3dzle+31+3Nu+Ofr+W787HV6dnFbXWhvXlVeW1dYW1pbXFdVXFxt/Wxwa2Zoam1gWlhYX3T15dvd0s/Z1MzIzs3MzdLX2Nfn7+nj3/X46nZpaG10/vdx/Or8d3FtXVtdX15eaGFdZGRdW1dfXlxjfP7u5+Tm5N/j8PDm6fDu39/j5dra4ufk8nJqZWJbWVpZUlZZVlJMS1FOT1leWVlYW15UVVhXWlx68ObYzczLycTBwcTExMfIycnR1NnY3uHr/XlxZl5dXWJjX2VxZmRkXlpbXmZoX2loa2NjZ3Jna/P//HTq4ubt3trffvb0Zl9s93Bqeenp8/vn7GpdX1tSVFRVV1pYX11fWFpjZWpvdXBqZmRfXlpcWlxgY2rw5eTXzszOzMnLztLOztPZ0tLY5dra7Xf06nlnbftxZ3Tu8Xd6+3NtaXJtcF5ZY2JdXGJmZWBpa2trcXb47enf3+bvfXb+cHfy6vDu3tvf5+jn+l5dX1tSTlNWUlBZWlNPVV1ZVlxdWVVWV1hYVlpdY19u6drSz8nFxcTCxsnKx83Mzc/P3tXo+OtfanNdbVxXcGZiWmh7YF1kcntpcXp1Z19rbWFgdv90cH7w6O3q3ubp5OrzbmVpZWNkaXn7cPHq7O34/21iXmFgW1hYW11eXWpraGVeamldXmFeVFJWVVJNU1dVWmbs1tPNysnKy8fJzM3MzM7Oy83R293Z4/v1+XptanX2+Wt5+nRmX2pyZ2JjX15aWF9jW11pa25rdO3r9ejf4eX1+vtub3j99/327Ov97+Hv+Xx+cV5dZmZbVFReWVdhbmpcXF5hWlNWV1RRUFRXVVFRXGlq7tTOzs3KyMrKycjKzs3NzM7R0drj8Pb0/nR8/W9rc3NoX15lYlxhbG1hW2dvY15xcmdjXW94ePjm4+Tr7+fsdm1paWhodfX6+PLw7/Dy8f12dnFwbm1tamBaW2Jpd3r/+WlfYmdgWFRVU09OUE9MTFJbZnXh2NXRzszLyszLy87PzMvKztDP1Nva3eDj6erq9fh7amhiWlxhXF9cV1paX2RfYGdoYmBcYXpz8ubn4ens5u34/fvz+/365uXs6e71+Ht7bWFseHBnX15ZVFNaW15lbGpmX1lbW1dXTk5QTlFQUVtfbezo3tjW1M3NysjIx83RzsjKzc7N0N3a2uDj6uHm8PptZWJeX1pbX15fW19lamlwcmpkZmNgYGVq/uzx9vD3/HVzcm5uZmZsd/ns4+XtcHvzdGpodOzz/X53a15fZm9oZntuamRiZ1tZVVFPT1FOTE1QWV9t/ern3dnQzczLy8zOzcvJycjKycrMz9PX1tXX1dfj+XRsX1tbXFpUUlVVV1VZW2JdWWdrY1tjePx1fvTz8vft3ern7ff4fOjm5uHg5vl19m5nYWVy/WxhXl1WUVNYXVZbXmVbWVtgWlNSU1VQU1lfXmZ27e3u5tnT1c/Nzc7P0MzKy8zLzM3S09Pc3dvW2N7g6PxtamRcV1hcX1xdY25nYmR6cV9mc3lvcvrsc3N49HxxbHr7aGdtfXp87t7e3ubh8mllZ25wen38emxnamZlYFxdX2FtbFxbV1hST09TUU1OWl9dXm33cPbn2NXb2dPS1dPOy8nJycbIyMrMz9fZ0tPc3OTtemZfW1VWVVdWVlhcXFhgXWFcX2xuZG1tbGttdX33bm977/d8+uvv+unf3dve6+xuY2FwZl9lZWZeYWJfWllcX15lcG5cV1hYVlVWWl1YXGt6bHn57/Lz6tza3tzW0tfWz83OzszKys7Oz9Xd3Nnb4+Pf531oZWReWl5jY1pdY2ZfXmh3bl1l7u5nbH39amdtel9aXmhqXWR6+Pnz49rb3urqaVxkc2xiZXH+Z2htc2BaYnVmY21wXFRYWl1TUFdYV1hfcmhnavLseHbr3O713tfY2NTOy8vKx8TK0M/N1Nra1tjc3t/he2psamRgX2heWFVcY1xbaHJeYP7va2Nn+/tpbXtuYWJw/m1odPD2/uvV0t/v7H5iXl9hXFhab21iYWtoX2Ju7XBgXWBZVVZcVkxNWFtcXWF4d3Pz3ujr6+He397W1Nva1c3MzczJz9LR0NHX29bU3ePg3+9wanxvbWdhYVtVWmNhXFtja3Zz/fZ4a3v3cGZtc2VqbW50cWtyefro3t3i7H38cmRaXmRgXmp4aWprcXpvce/zbl9iYF1ZVlJPT09XWVhXYm57/ezl5/P25uHj5t3f3tvPzc3Nzs7P0dLV2NnX0dfa3N3o9Hj+8/xsZW5mYGFmYV1aX2NnZmNna25qbnB+cmRocnB0bGpoaHj66ufi6+bn531ta2VhXWRze3Bzd3737ff+bmtjZmNeWVVWUlRTWVhVWFxgbPTh5Ord3N7f3d7k8eTb2dbPzc7O0M3Oz9LX2djd4dnd7Xd9+HZlcPZ0X2hqaV5cYmFfXmRne2dnamtoam9qbm5tdmpjZmRtZW/z7Pfv6Op7ZnZ8Z1pkcGllZWf8/Hh79+5ubPp3W1lbXE9NUlxZVmBlbm175t3m6t/Z4e7q4+538N7X19POzNTSzczO1tXS197b2drs+O71a3b36e92dvDzYF1iZ1lUYf5wYGJ2al5j/fdnX2FgW1ZZY2VhZfPl7ezh3n1uefRwZXf2dmFu9fNubv75cXJ07mtWUlRTTk1RWlNQVmFjZ27p3OXn2tjd7vXpcWry1tTSzsnHysvKys/V29TV3ePZ4HFnbXtmZXf3bGVqcGNeX2VcWl9u/WpkZf95bW7s73drampcWl1ramtz6+He6OPm93Fod3FpdftnZG57cXFpc/V4dnf+ZFVPVFJOUlxlXllhcmx37+nx6e3m5Px0amlpcunZ2tTMysrLzMvM09va19va397pfW95fHj64+X+dXZ1ZmZgXlteZ3NoXl9nbmplaf5wXlldWlRXXmZgbPPk5evq6vhubHn96+bn5vz28P1sZXby/nJvbV5VUU9QTk1WXl9dYHN8ZWvz8/jt5ev1/vP+d+3i3M/NzcfGyMrMy8/a1dLZ5ePk6Xtobm5rb3L682todW5hYGJkY2NpaV1dYGJmZWn393JpamleWF5sa2nv4O/+9e54aWZsdfju5eXr+P99bGNgcXhqYmxnXFhWVlVYWmZ0cm9993xhb/H0+nLz7Xpv9/t49ODY1dDNycnMzs7P19vU093g4uXwfezl6e7w5+ft+3l6aV9iaWpgXWpdU1VcXlleYGVnaGlrYVtXWmht/O7p6v52+vxxeOvn593Z2OHy9PRxaG35a11jY1tVVFVSUVVaYGh1eHt4bGdocHVt/ez5bPvn6urf2dDPzcrLy8/S1dLW19jY3Or68fZ2/e/2/vrx7Ph4fW9jX2R7b2FeYl9YZWdlYmD56+3u9XRtYVxgZGRufHtsX2BjXl1nb/fu6+Pl5+14dHNqaG1xYVpbYF9eYF5fZnN7dXru9nhwa2l4+Xxza3Blafjv8Ozd1M/Ozs3P1NjZ1dHQ09ne5eTo5eXn5ePd4fDq7XhqbmdcW15pXFVXV1FVVlhcXmZ1e/56ZWNfXV1pdfr38O96c/Hx9+zq39re39zh7Hd1d2toX1taWFRYWVlYWl5dZWVldXBqcXR7/ujrfW9w+/jx6d3Z2tbPzc7R1Njc297Y1dfc2+Dm7O3z7Ojr5+bn7OjvdmJlZWRfXV5hWllhX2BqeXN3bHBxbHBdXFlbXWBmaWZkY2JfYnT8+u3f29nf4urs/Hn9emRdXV5gW15hbGlpaG1tb3JwbWVv+vVob3VpX15kam796N/c2dDPz9fa29rc2tnY19jT1dfa2djX3d7c2N3k8/P+Zl9eYFhSVlpSUFdhZWVjZGBeYl5cV1xgX19hanJtbXD8733t5ODo49zX2uTr6/xkY2JgW1tbV1JWV1tcWV1jaGdpZnJ4ef7o8ntu/Pdobujc293b2NvW0tLa3Nnd6Ofi3uDl3uHd4+be3uns39PW5O7w6HloZWReXV9mX2Zv+/P89n1qX1xXV1VYW1taV1ZeaVtZZ/T8envg3uPc2d3j5+fsbm1ucmt5am9qX2hwaF5hbXRhX3D1bmhq/W5fXGJcV2R07e/x5d7l3NvY2dnY19nh397a3N7a0NPX1tTV29nS1uDl7OptYV5cWldWVlpcXWJwa2lfZVpST1VUVFhbW1ZdZm9pfOPa29zb1tnd3dza5Ovv92xfXmluZ11haWBbWVtZW19kX2Rrc3FyfX1rY2NkaGZ67eDf3+Pa1t3e19TT1dfW3+jr6Pjv6uPi6ebh397b29nc4uLg7XhhYGViX2ZtcnRy9/J9a2dZV1VVVlJTVFBPV1tbXGvx6Off4d7d3+Lf297h6+36cGt9dnV6+vl1eWxlX2ppZWdtcG5qbm9lW1haWFhaZm9wd+/n3t/d2dbU0tDOz9rf3t3p5Nra3dzZ2dvY09XY2dfe6XhlXVtaXFpdX19udGpeZGNbU1NXVVBPVVhQUFliYF7539jb2dXR1t7a2dvj6uztbWVpbGZfZ352aWliWllfYmZdaf37bXn8dV5XXmFkX2v35u3x3Nbf3tnT09jW0Nfo6OfrdXjq4OXt5d7d397Uz9nY1NbnbGJqYFhdbXN78+3pdG5vZlpXVldSTU5PTUxOUllZXvve5ezl19bq5NbX4OPg3u5y+/T89e/m4+1+dW9lZl5qaWFrdGpeXl9bUk9VWlZaYXx7cfTf3d3Y0c7O0NLP1dzh3N3g49zX3N3b1djZ087Q19ve9mdbWVxWVlpoaW1qbWZeXF1aVlJUWlRQUFRPUFRfbHP53dna3NrW2dvb2Nrf7PTzempvfnt8dXdwaV1gWFhXWV1lZ25xZGVZW1pcV19eYm177u7v6dvY1NPQ0NHY19re4ubj5+zv5+Dh5+Hd2dvX1NDS197se2RlXmJnbn777fZuaWVgX1hXVVVPTEpJS0tOVFpdYWz69ffy5eng4N3Z29rf6evj5Obi3uDh7ubscW5jXVpbXGhsaFxaWlpUWFxaW1xjZmhhcf315N3Wz83O0dHT19fb2Nzb3N7a2d3Z1NTT1dTS09rndmxnXVlaX19dXGNgXFxfXFxaV1leV05NTU9PU1tlbvjr5+Xi3+Dh5uXi3Nzf6uj1/enn6eno6n5sa2VgWlZUVltdaGdgYGNtcGVpd25lanNxbXXu7Ozp3NXT19vV2N/i4uXq7ubm6Ofe3t7b2dLS09HW2t7u7e11Zm/+cmdndHZscW1oY1xZV1BKSUlJS0xRXF9ibX3+fvzx7fTo3drY29rW2uHd2tvc3d/m8vTt/WVaWFZUUFRYWFZWWV5cWF9qXFdbYWljZH7j39vSzs/R09HU1tbU0tje3Nba2NPW2d3a19vl6+fvcmVnaF5UV1xbWVtoa15eb3BuaF9bVE9NT1NXWWV4fX3r4un3/PDu6+ri4uPh3d3f5+fl7fv/8PN7enhrXVpdXFhXWmFjZWJsc21iZG5kXV9wcGt46OLg4Nza297k4t3a4d/e4OPd2dfY2dXU0tTW2dba3eLo8vX3bmpobnVsbHFrZGNkXVxWT05KSUhMT1FSV2BlaGdtb2596ubi29bSztDU1NTW3dvc3uPi3eTve2NbWFRUUVdYVVRXXFtdWltYWFlaX2Vw/ezd2tnV1dTa19rW0tTX2dTQ0tHS1dfb2t3b3efk4eHvfH1zZWZlZmdmZ2NiZWliYWFdV1hXUlJTV1hbYGRmdHJ0cv9+//L69e/h2tja2t3j5OHl6urv+PPx/nltZl5dXVtdXl5dW1xgYl9bXl5bXF5udX334Nzf5N7a3uPf3NjZ29jT0dfT1Nba29fX29vZ2Nve3ejz+PB7cntzcW5nXl1aVVJQUE5NTU1OTk9UWFlXXmBoZ2N56/Dq39re3dTT0tTS1tTW3dzV2uDp5/FoY21pWFhYW1NSVFNPT1BPUVFPVVxVWm3m5end1Nja1tPS1tTRztPT0M7Nz9fW093d3Nzo5d7e7vXz9/p0a21+bGhkaF1ZWmBZT1BVU01PUlZVWVlbX2NhbnttZfzf7PTs3OHo3NTa3tnW2t3d39/k6nR68n5rfHlmYGdfV1RWV1FTVFVUVFZaXFpfbfb8fOnX297a1tjY1tTW19TUz83Q2M/P1NjT0trk3dzv9+Ll/Ht1/WpqY1pYXVhSVFFMTE5MTE1SU1FVW1lZX2hvZ3Tn3+Hh4tnV1tzU0dfX1tLY2trd7vB2bWxuaV5gYmBaWlVQT1hTT1BUUE1QWFdba3X99uTe2NTS1tHOz9XT0NfW0M7T1M/P09TV2Nna3uzq6/t1/nJpaW5iXFtdXV1qYVtXV1RPT1BPUlZTVV5jXF1mamZ56+bz8ejl3tnZ29bV1dvS0Nrj3+Zyd/tza2hnYV9pYlxaXFdVWFpWVFRQTk9aWVtr+HB75tvZ3NfT0NPV1dDS2tvS0NLRzc3U1tPW3t7i7vr4a2VrbF9eZF5aXm5gXWJkWVRYV05OVFVQVl5bXV9eW2Z9/vTf2eDl2dne2dPQ09XW1tja4vDt8WtncWhgXl5cW15kXV1fWVZbXVZRUFFPU1ldZfXr+una2drX0dLY08/R0s/V2dTP0NHOzdTa1trh4+b+c3ZsYF9pYFldbGNhcXRmZl9YUFFRTU1PTkxSVldVWFlcY3Tz7+Ld3NrV1tfQztLSz87U1tbj/vHrdXX7b2JfYF5cYmFWVlpUT1ZZTklNVE5NWV5ebfPu5dfa2dfS0tTPzM/Sz87PzszLzM3N09nZ3evp+mtsbF1ZYGRcWGBoX19pZ19bWFVTVVFOUFNPT1piWFdjaWR039zf3Nfa29bV19fU19jU09rg5vVrePd3Z2tsYV5nbmRfXVpYW1RSV1dOTlJVUlVeZ2386+Td2djX0dHU1M/O1NPP1NnSzc7QztLb4d/l9Oz4bm1sZWJsfWZdbXplX2xoWVZaVlFPTktNT05QXGBZXGp6bvHe3eDd2Nrb2dnY1NPU09DY5OPle2347m9o/P5paG5jXl1YUlVXUE1SVUxLT1BNUFxkYHvh4dvSztDOzM3Oy8vP0s3O087LzNHU2OP19XNkZ2tjZ3p7aWhsYVxlbmBeZWBYWFpVUU5OTlJYV1hncGZt59zl5NzY3dvY3eDg4+LY1dnc2t7vfvptZGt5cG/892lfYV5YWl1YWFtYU1RXT05UWFZWYGx07t/a19DOz87MzNDOztfd2dfa1dDT2dzh93JzZWNte/nw5u1va3Z4anr7Zl1hXVVQUE1KTE5NUFlWV2V7dP/j3eXm2tje3t/r9ung4dvU2N3Z3PR96e11/ert+/h0XlpYVlVXWlRSVlROTlBPTVJYVVps/vng1tPQzMzLyMfLzczP2dnQ0trZ0tjg6fliXmJfXW1+b3P1dWBgbWRcZmxeWV5bU1JUUk9SV1Zcamtq+eXg4NfV29vW2+7x+W9u/fDt4d3h5OX7aXX5dGz86/N0dXZoYmRcWmBgW1pcWVFWXVdUXWBdZn318ePa2djOy83MzdHX2t3o593c4drS3vbw821odvn88uvs5uHufvrvc2NncF9UVFVOTE9PTlJWVVpmZGF26+zl19Xa29rnfPXr/nfr397b2N3q5Oh6fuXwbf/qdGJva1lWXVpSWFxUUVVWUVNaV1Nda15d/uXr4NLOzMjFysrIzNLT09nd2tjf5eZ9Yl9iXVxmb2Ni/+338PdvePH9am7/Y1pcXlhYXl5bW2JkZnB8cPve3N3a2eHt6O1oZnZrZXzo8PPm7Hh1+ftu/vV4fe31cHV+al1ncl9bZWhdXmFcW15eV1dfXFto/frp2M/PzcrMzc3O197b3N/f3un09XRiYm1nY2n6/PTf3ubm4uny7vZqYmhkWllZUk9TVFBSWl9ZW2tz/uXf49/e3+bl6PV1+Ozy6d/f4uXl5Ozp6nt2+fd+/nhoZmNlX1tdXFpcXVtcW1lZWVtaWV1gZHbo3dfQzcrJyMjMzc7V2Nrb3ubn+W5lY11YW1taYnr6+fXs6vLs7f92dHFqbG1iXV5eV1dgZWJjaW989urn5eTk5ufr83JsbW9tePLv8PN7ffb6d2txd/75fvf4/XZ4/XR0c3R7cGlpZ2FeW1dWV1hXW2NndOnf2dLNzM3OztDW2dnb3ODj6fD3cmdpaGBhdvPt5uPg3t7f5e/3/HJpbmxhWVlZVVNTVlZYWFxqcG557+fn6+3v8vr79/zu6ube3t7g3uHn7PP3efrvenb+eGxrZ2RhYmZgXmNfWVlaV1ZWVlRSW2lu+d/c2dLMysrKyczO0NbZ19rk6+38amRkXFVZXl9oc354+PHt6+rpeHB8bWx6dGNfZmFdXWZlYm53fvDq7fTo5/dy+fZlZGlpZW7w+fjt8fv7+Xhy/Xx4/u3s+evo9nr27Xdv/n5zbWdeXFtVUlJSUFhlbnD65N/d1tDQ09LR19rZ3N3b3ufo5fB7c3VsY277+O3o4+Lq6+fo7PxraHBkXV5bV1JTV1VXXmJlbHnx6e7q6PT9ffrz+nR2/3t97+Hd5ubh5u7z8Pd6dHJ7e35+b3BrYWNkY2BfYFxaW11aVldVV11o/une29rUz8/PzMzQ0tTV3N7c4uz19XtpaWNdXVxfY3l4c/vw7fvw6fRza3B0cGtpaF5cXl9ma3D87ero4OHi5Ojt+f10bGliXVpeY2dueX53c/b0/n3/enP96+jq5uHn9f1++vt7d3BrZV1cXlpVVVhcXWV88PHq4t3a19bX2tva3ODq7Onu+/Tw8/v3+m9ueP7u5uDk5t3f5+nv/HBzcGNgYFtUVllaXmVnaHL6/fjq6v17+v9zdH50a2tjZXT6/P3r5+zo3+f87u9teOvq+Pfs9nNwdGpqbmFcXVxXVVtcV1hlZ2fw6fDk2dbZ1dDU1tPU29nX5O7o7Hhsfn1nZm5gXGdnX2zv9Xfv5fd58PJsd/V0aGlpX191fnH55ufk3eHs4t7pe3d6Y19oY1pdX11bX2Rkb/f0fPzvdm95cm/w3uDo4Nzi5+fsfvPsc2JlZGBfYmJcXmtubXR9+Orh5enn4N/n4uLp4uTu/ffz8/Du6vd6fH51cHvu4t/f3dzb3u3u+m1ramBZWVxeX2FpaG7+fH3/fvX8/ntvbX72dXV1cnX8/Xb+6uHl5+Dp7/1vZ2Vx/v3z8Ozv6uV9amhnX1pZWFleYF9ga3b88Ovt69/b3N/d2trZ29zc3d7r9fF7evbxeGtybmVhXVthbW5t++fh4+Li6u/s8X15cmlp+uv+/ebi6vXu7Ozpfmxsa2NeZWdgXmFmYF5hZ2t2/XN78/VsaG5ud+vk49/b3N3Y2+bn63ZhYWhhYGZpXl9pZmd1eW966+92/OfyffPv8Ofh7vTo5e3o3d7z9+5+cGtvefLo7Obe2t7k3uj/eXdqYWNgXWFtamJ0e2Zkbnp6+n1tbHh6aW34cW/983lu7ujs6ufu+uz3ZWNua2R36+vt5+Tx7+x9bmxiV1VdX1xdbWxpendu+eXq8uTe5ufc3eTi4Obp4+z58ejwd+7qemlpX1dZXl1ed/V77N3e5NzZ5O3r9HB78f128Ojz9+frdXzt/W92d2VfZ15bYGNZWmBeXGd5d3z4+H15fW1t+e7379/e3drX3OHb3vP79GhdZmZdXGZpXV5iX2F0emxv/n5ucezv/Onj7fHi4ePf4Ono4uX4enRpZ3B1e+zo6erl3uLi3+f+cXlrZm5oYmV2bV9rdmtpenptevxyanZzaWv9dmNt/X147unv7Ofvc3R4aml1fnrx6+7u5+n3+PN7ZGRsZl5fZGNnamVnbWxufu7u9u/m5+bf3+Hi5uzz7evx9vD5/fHydGxrZF9gbWtpfPX29Obf5Obn6vny6vP69fv/+O7y/vrvfWx3eGxmZ2hqbGppYl9fW11kY2Jod/38//j5++7w8err8O/j4eHe3eHr5ut4dXdlXWBoX11gZmBfa2xobm1ma/Hr7OLc6nXu5PH46Ov78Ozt7eftcHrr7fbt7n577+3w59/ucvLrd3P5d2lmaGhtfHBjde5+cPv9aWhwfHN+821ibnFkaX5waHjr8/zs6nvx3+x+7+52bvPseH7q/Gn98m5nbGNcXmtiXGltXmn5d2198/js3drd2dfn/eTj+Hz6dml383568v5kcup7aHv0bG/t6/3u4Pdy6Od7fefucP/p7X7r5/vw5ftre/1nafT7ZWd9ZlliZFteZWJlfe//e+nk7+ne7Xrv8m5z6+x18N/w997hdW9uYWBnaFxbbm9eZnpmYGz+ffTc2eLh2uXv4+pra3xzbPzvfn3l4O7q5Ov29/tvduzuev/xfP7v+G9v+Hdr+O96+uTk9fDr+XN2d2l663dkaHFnYGtwY2B2c2l5+HX84N7s7uXrdXV0ZGv5/XB95uTq6On+aWtlXmBiX2Zua19ld3Bu9+fi29XY393b4Ont/WlnbWVibHRwdevo++7h7XB0+XV09flz/ObtfPDy+ezt7/Pq3uPt5un5+/f9bm51cXd3b2RobV5eZmVlZ2dhZG9++/fq6/Tu7vl7eXx5/e3t7d7d5Orm5vt2bV9dXV9fX2JfX2BlbG3w4+He393f4uDl7/r8cGpnZGd3/v7t7Onl7vV7cPv4+/11+e/z9O309u317+/+9Ont+Pv3+HpvcnBz+fh9fHd6em5tbmptdWlnaWdobv72/vPr9nr+em93fXp2/+7q7Ofp6+vv/2pnZmFgZmhiYmdnZWlw/eXe3+Le3eHh4+jt9vxsY2VmZWpwc3R++Px0d3x09er39+ro7evk4ejp5vX+7+zw8O77enz9eGh5/XZ++3drbW9pZ3Bya2lwZmFoZWVscHt7/O/49ubr9/Hu9f3t6Orq4uv48PdqZmppY2ZrZF5hYl5gcHt67eft8efi5+fe5vLu8nRrcnJrbXBvbnh9bnj07vr26+/16+fs6ejy+PTw/P3t7/fy93Rzc29pcvb3/vTzc3R9c29udW9pcHJmYWZiYWpycXN99vv05uny7O769e/v7/N+cWxzc2tsc29x/nZtaWdoYWl9/vnu7fTv6ufk5Oft8+7+aWttZ2Zpamtrb3Nxcv34+e7q6+fh4uPl6O7z7O/57ujx+fH3eHV6fHl5/HVucWxscHl2b3h2cG5va2JgX11gbnZ09u3r5+Ph4+Pm6+vo5e30+m9qanJwaGxsZmhrbGdoamZpbnFy//t4evvw6+Tg4+Xp7ff9e3FsaGtvd3l7fP748+/p5+vq6PD17ejt7uvw9PDw8/T4e3lzbW11fnlwb3Z6fvr4/v717/n3fmtmYV9eZGxudnt5fu7l5OTg5urp7fL7fW9nZGdnamxsbW18+f59fG5pdnlwefH0e/bu8Ozh4erq7fV6b21jZGdoaGdxd3F2e3736uru5OXt6ePk6Onm6e3t7fLp4/D7fnxtamxpYmFpZ2j+fnv06O18+fR0Y2JfW2Rycvzw7O7m3d7m4Nzm6uTr8/l8bGBiZF5eamljcH1va2tsZGZuZWB5+m529fDs49/f5eXp7u3ueHX1/25ueHx6/PN2b/p6bP/xe3zy8n796fJ97efv7uPse3d8eG95fmxqeXNtfe/u6+Hg6ezq+2toaF5dY2dt//n77uLh7Ong5vDr6/f/dmdfXl9dXm38cHfv/XL893Bve3ZobvD/b/Pu+u/j5ebm6fN8/H1rbn1tZm15bGt3/nJ47ft97fB79u76+enl6evh4ejj5fX++XxpaHVuY2p2ZmZ7/nnv4+nt4+l1bHVmX217cX7r7vns4uXr4N3s7ub1bHByZF1gY15ibmZld35sb/R2aW11aWd1e2127vTw3drd4d/j7vT1dXD0+2pre2thaHBqa/Xuev36Z2N5eXH+7Oru6uTo7OPl+vbr+nl8fWtmcnZmbPf99ODe5OHl7f5wbmhofP9ubHlzdvrp6Obe4PL682lkb25mZ21uampoZGh5d2tw9vttb3puaXB2cnvt5+LZ2uTm5ev+c3N0b3VuYmFgX2BmcHf76uX9anBubXn79+vl5erq5uTm5OPv+e7r93Bta2ZpbGdn++zy8Ono6+7vem1vd3RwdWpndPH08N/b3uDh7nR+/G9tcXFnaWleWl9nYGJucWx4fmtkb3Vpbfn4fOXZ3eHc3ebn6P1wfvFvaHBoX2d3amn973lw+21faXxravLr9vvv/Xrm3efo3eHx6up0aXj9aWb9fG3s5Pb96ODs7uj+aXz2aGZyb2Rz9Pbs3tvx/ujvdvbwb2p9/WZhY1xZY2pfZ/z9bWxuZ2Ryfmlw7PL25t7n6dzf8PDs/m3+fmdpfnpla3ZtbX57aGn8dWhteGtr8fB3efL5+eXc3t/a3u/y8HlzfHxuc+7zdHz7ePnk5vDz7XxobXVpbfh1ZnPz8e3m5ff65en+8/J4eHtuY2RtZFxfbGhr/3RnZm9ybHD4fXrs8Xz47ejl5uv1+vD2b3B6cXF+d3R4d3RranByc/p0aG9+fXl9fHd+7+3z5t3g6Ofr+n319nZ58/V++f1sbH7y/PTo7Pjz9nF09fRzdfn49vLt8O/m6PL08Pt0fX1mYWdlZGZlX2Fva19jamdjbHJw+uvz+vf2/fjh4u7l3uj37Oj38On4bHrqfGhvaF9lc29jaG9maHR1aXDzfHfu5efl3t7u6uDm6+rk6Ofh7vzx8Xp1+fxz/vltZ2twam94bWp78P938+vw7Ofze/Dp+Xr1e252+3NrffxsaGpoYWZuZ2Ft+nVue2xjaXt4cvXr7vLs+Hju6vh49u717unzeH75fHZ5dGxvfm9pe/53fvj59ejn9vru73rz6/j86ufv9PT7df3tfnnr73j97/h78+t9cvDr+O/r9/rs5/B7+Pptc31rZmplYWRqa215c2NgZ2dmampqc3t+cnT4dGh4+Pzv5uju7+zv7eDpffXo7fbw7fxvbG1lYmlnYWVpa3D++3j57Ovu5efs6OPm6OXk5+zt7fX49Pj+9fPx8PV6bXh5aWd1eHByeX5+8PH27+/z/vz1/nd7fvt5dXBwenNsbXd4bW55c3NtampraWhqbGpmZWhucHV1dP348u/y6Obp6Ofn4+Xp7fH8fXFlZ2dpb3D9+P3v6uvt7/Hs6eru7uvq9XZ8e3T/+3v97uzv7urw9/Dw+Xp7evvw93n76+z69erv/vx9bWx5eW9ycGhpbWReYmZmanr8b3X6b2NlbGhqcHFpcPL9dfv8cHzu7+/n4ejs5OTt597n/Pn2cmllX1tdZmZs/PX/8u59e+zl5uTf4ebi5PlzfHtuePf5fu7l7fTu7vfu7nlte3xsaHRzcXv19PLs6/91c25w/O7y+PP0eW1mY2JucG3+7/t3c2tgYmdoZ2hpaGpuamRsdW5wfP98fvD2++7m5ubf4efj5PB1bW1paW9ub/jw/f78cXP37Onq6uXq9HttbXp3cvvu7fDu6Ons5uPu6Obx7ur6bnD68/j27O3q4+97fHBoa3F7bWp3bV5bXFtfaGhrc/53aGZnY2pwbnJ+fXN2enBv/O76ee7v+fn3eHX66uzo5Ojp4+l9bXBpYGNtbmp8+nBte3788Ors7OPj7vL8ef3s7fTt6Ov59+3x9evr8PDv+Ht1b2NnfP549ezt5+Pr8+/u/XT893j++XJoaWtqbnRubnn+a2BhYl9ibGxscHZoZWxqanr3/n3z7/l4eXN0+fLy6+Xi4uPk6fTy9nNrbG1qbm1maXZxbXr4e/vzeWtsb3N77uzt7OXp8+/m4+jl4uPk3+Hv8/V5/O7u9e3n6+7n5uzy83Zsb3JvaWdiX2NpaWhra2hrbGZfZmtnaHH7en37d3T99fbw7O7u6un2cG5xbnF8/vLr7Pp69vV4e/5yaW1uaGRpa29+9X12+PP3/f14c/7w7+rg3+Xo5+vv6On1/fDq6+vs/W9wcnJ79/Tw6+378+fk6ezw9fX093p6+315/fx1a25sY2JjZGlwb2pufH1paW5ta3F4cH3z7vH293Rt//P//Ozs8O/w9vXt7X159fl+fHVqaGpxbmxwbGpta2Jga3B3+e3n6ODj7Onn6erp6u3v7ebp7evt7+3v9+/n6O/w7O/z6u369u76cHFvbW99+29vbmdiYmJdXWdxb/vq8nv7e2xy8vJ1c/n19Ozr9X56d3N58vx99n5tbHF0dnl2c3ry+XV6d25vef55b29rZ2dpanPu7fPo3Nzh4uPp6eHo+PP1fW1zfm1rffV4fO3w+fHw+/7t6/ju5ejr5+r39+zq7/Ds+HZ0bF9dZGRhZnp8e/N9a2RkY2Zwb2RkcXNqb/t+cHh8fvPl6fvx6/f56er/evDw+ezp9vvu+2xydmteXl5XWGNrbPXl5+fe3+3t4uf67uf3fH5zaWt4e3jv6PLt4OLu7efr7+vr9/bm7/vw83Fw+PV6fPlwZmVkXmBxcm/35ej37u50aW1lX2NmX15qa2Jq/f5udf16//Xyfnz0933y8nt98O737uTn8O3ueXh3aF5gZGBibfn369/e4OLn8PPw/m5ufG5jYWZgZHJ7+uzn6urk4+jp4OLp6OPj5eHj6erm7ffx7v12fXNoZGdnYmZrbHD3+WxnZV9bW1tYWFtdW19panTy7O3t6ebt7efr7+fl7u/r6+3o5err5u17fvlyaWReWlhbXl5lffDu4+Dp7+7vfHr+dW54d2hsfnp68efm5+Th5ufg4OXj4urr5eXt7enwd/z3c3vw/nV3dmxna2xnav78fvX6bWRhX1hVWVhWWl5cYXBxbf7u9H7w7n786uzt5eLo6OHh7erh5fLv7nz+9nZnaW1hXGNnY23u6erl5O7z9XVlanZrZGxwa2/58fXn3uPn3+Hn5Nzf5d7c4OPd4/Ho5311+PP/+u33dX5+a2NpaGNpeXRtc3JjXV5YVFdbV1deY2FrfHt29O739Orq7Orn6ujf293g4efv6+bx/vb4eHZ3a2VkYFxcZWx28O739+7t93ZtamRobWxw/Pj58+vm5d3b4OPe3d3b3ePh3d/k5+rw/Xt4dP/28PH5+np3eXJpZmhsbG9vbnV3bGJeXVpaWVhbXV9mbW9udf94cnl8fvTv7u3l4d3e5eju8fL5+Pfx8/n9eHF0c2pmaWhnePz/9evt8/59cGtrZ2JmbXZ69O3u6uLf4+Pe3uDe3d/d2dzl5Ob19O73ffvz+Pbp7Pj37fttcW5oZGNjYGdtYl1hY1taXlxYW11dYW5uaHT8bGp99fr06enm3dve4d7f7erl7vLu7f797vxxdHtmYGtpYGp5cHjt63lz/m9kZWtmaP3+ePDl6vHo3ujn29vd2dfc3dje7u7p+2x2/3N+7fb66uf1fPb+aGVqYl1jaGJjbWVdX2NcWWFkW2BraGdxdGRkbGpkcvt2fOrl6+fd3uXj3+bo4Oj47uv+e+nk7/PveWdoaGBnenRz9+v1/f54aGdrYmRweG166+768unq7uTi5d3a3N7c3+vr5O368fJzcfj49+nk6u3r9m9pZl5cYWNfYGZhXV1dWVpiYlteaGRkbGxlZmtnaHf1+/Lj5Orj3N7f3d7g3dvj7/Hzfnzv7/f4+2xlaGhgZHNvaHb5eHB5b2VrcGxpeHtwe+30+e/r5+ri393b2dre3t7m6Ojv/v/+cG1vdnfz8Pn49HtraWZiYmhqaGZraF9fX2FgZWtnZGhrbGprYWRmYGFmbm548+rq5+Th3+Pk4uLo8PP3fX716+zs6+38c291c3f+//X29/1+eHBzeG9ram1raHf8fnvz7uzs7enk3+Pj4N7i5eHf5ezx93Frb292+PD07e/6c25jX2RmYV9nZl9fYmFhZGJhX19eXWJlYl5jbGZodft6+enq6+Te4N/e3+De4Ojx9Pxyd/Ds9vft83R0e/56/3v++X5wcX5ua3R9bmx5emxuffl8++nm5uPf4t3a3uHc3+/t4+h99+z4b3R2bm58fHx6cWlla2dhZnBpYmpwZGJrbmlpdW1kYGBfY2JeXmVrZGh7+nrx5+Lq49/g5OXl6ujs+n77eHH+6e3w6ul+cXz4fnv08/f89fz08nx0fXhpaXr+bnfx8Pvv6ert6+rm4+Th4N7q7+fj6vDr5/duePx7cnZ1dm5qZWhmYV9maWNocHZsdH5+bGtsZl1aW1tcW11ka2hncfL4/Ovh5+rj4uTn4+Pg5uvy8PN9/u3p6+vl5vv/+Ppucvv2//77/PP2+n3+bGhteHBudPj2e/Tt7fPs5d/i4N/d4u3x5+Lt6ePm8/16em5oZ2diXVxeYV1eX2VnbHH+eW/68Xttbm1qX15fYV5eY2ppY2358v3t5+Ps7+rn7Ozq5ufx8Ozte3ry5unu6Ob2//5+/Xzy6ufp6+ji6vn5+XBnbnt5bnb8/nB0ffz7//z06evs6ubs9u3h6e7t5+jw+vfzenBwcGdfX2RfW15tfXV77Of7fvf+aGFkZ2BbW2JgWlteZmNpe/j+9Orm6vTv5OPo5eHf5Onn4ur37ebn8fTs6fxwdPt+df3l6vXq4uxwcf19ZmZzfm5sefd9dfTl5/Lw5eDw+Ofj7uzi4Orp4+Dn8/Lx93Jpa2ZdWlxcWFVcaGlrfenp7PF+e3draWhqX11hYltZX2hoan348/Pr7u/t7u3o7PXy6OXy+Ozl8fHt7Pz2++3zeHfy6e704Nni6+bjeGp29XNiav12ZmRt/HFu9eTu/fHk+Wh45+n/6d7j7+fe4+/o4+XxdXFxbF9dYF5bXGNub/3p4ul9cmttZmBdY2BZVltaVFZka2Jk/+v+cvfn7O/j293q7N7d9Pjg3Oz26OT3/urm/XD67vd49ujn6+37fW1pbG1sa2xsaGNjZW757u3p3+Lt+uzr+fHc3OXo29rp9uXe7Pzw7HFjZXJiV1lgYFlaaXNoce7waGBsdWRgcXplXV1eXVpeaWlpdP3/eXv7+e/m4OXk4OXv8+nl7Ojg6nv96Ox7d/DxeHno3+br4N7udPfp/Gt09XpoanJkWl9zdWlx7+xybH3x/fji3ODn39rf6+rn6Obn7u/t8n51cW1kZGtta2Zu+HhqanBrYl5mZFtaYFpPUVxdWFtwdGNme/lwb+rd5eze1trl5t7f7+ze4PP15up9fvD1fn79+Pfy9P57b256/fn9+nVubmllaHB0am349Pry5e376tzd4dzW29/c297p7OPndWz89WheZmxhXGz5bGBse2tdZHBva2xwbmtmZGReW2FnZmJmbWxpbHFudvXt7err7Onm63x+5+j69ejtfXrz8XRv8uTp9/Dg5P9+6Oj28+Tn/HTy8mtkbXRxa2ltaGJgZmpmbfHj5ePc2tra297g4ODl5eXp8vDt/W949v9yePX7a2dtamNgaW5iXF5iWVJVW1taXmlmY2lsbWxteu7p5uDd3Nzc3Nze3dze4uPq7vb1/m95/3Nw/n5zbGpoZmdz+vr6/fD2cGp3enRw/v5wbXh2amp29/Dh3dvb29rc3d3c3eHp6e3yeHBtY2BlcGxse/ZzbW90bW10c21rb21uZGFhY2hscXVuaWtkYGBrcHj78O3u6+3x8fD37ujk5efl6/V+fX70+X387e/69evwe/fp6PDp4Ob4eXlwbG14cGtmZ2ReWlxgXmJx7unk3tzg4d7c3Nvc3+Hk6ff79/53ffr58vX3eXdvb3D/cGZobGZdXFpYVllcXl5laWhkX19mamv06efn393i59/a3d3a2dvc3+Tw/Pl+/Xpzb3ZuaGZsa21xe3t+7+7w/v5ub3Z7b3F8dGhjaGNjanl+7eLc2trc4+He3N/d3ePv83VnZmtmX2Vpa214dW9td3p2e29tdn1sZWJhXmBjYmFqeWtoZ2hkZ21xb/vv6+72/P7q5ujo4eDi5OPq8Onp8fn09/j7+3N69O3r6+jq5+Hh7Pj7/HVzcG1ta2NbWVhWWV1hZXDu6ebk4uHf3d3c2tjb4ebvfHl8dWxvffn29/f8/HdyeXZrZm5rYVxdW1hVVldZWlxdYGJlbXJ4e/Lo6Ozp5+Xi3tvd3Nvb3d3i6ejo8fz39P5zdm5qam9xeXR79u3s+vbu73Z+7/F8/PxwYl9kYGJhaHD59Ozl3+Xi3d3g39vd5OzteG9qZ15gaWZobn1ucP/5c3n89Pr9fnJvbGhjYl1bXGBcWV5qZV5pb21od319efbr5eTo5d/f6ebh4evp5ur16uPo8fj3en18/n3t6unn4OTw8O/5b3NzbGRjXl1eXFlcYl9kcvL37eDa3dzY19rd29ve6eru9XNra3ZqZXB6cWp1dm1pcXBraGlkYmFgYV1bWVlXWlpdYWhpcXt5+PHy9Obk4uHa3ODe29zg3+Dh6+/s6/n1+Px0bWxsbmxz+ezy6uLg7Ofi5/D5+3NqZmtnY19kY2NkbHb+9end3Nzc2t/n6ejw9v55bmprZWVlamdscnd2/vft7/Xx9fZ8e3ByaGVkX1lXWltZWF1gYl9namlmbv339+7i4ePm3dzf5N7e4+bf3OHp6+Xr7vb5+3189fDu7Ork5uv07e74b2hiX1xbXl5cW2FlaGVw9u3r3tbU19jX2t/l4OPud333eGptd3Nra3lzbGhyeXJoanJuaGZoZ2JdXlxZV1lcXl5fZmtpZWx4d29+6uXo4Nrb3+Db2t/m4d/j7ebj6/387fFybXz7dHHv6O726OTq8O3n7HlqbGpiXV9iYV9jZ2lrcfnw6+Xd2drd4N/i7/zy8Hpxdn10bHr2+X788fR9fO7t9nl++3FmbHVpXl5jXldXXFxXV11iXlxeY2Nianv07urh3d3e3t3e39/c3t7e3uDn6uno73388PB9/unk6vLq6PN0e/V1ZmJoZ15aXV5bWmBqZmZ27O3r3tfW29zZ3Ofx6eju9PLs8ft88e34fP72/HZ6eXJtbHBuamNnZl1cXF1bV1hcXVhaZmtlXmhybGt65N/f3tnX3t/d3ePp4d/j5+no8/r08vxvdXt0b3L17e308Oz0+3728nRtbXFqYmBiZ2FfZWtycHzt6enj29zg5+nq+fbw+P17+3xzcHvu9/j06+j38+/t+nh+endtb3FrZ2BdXl1cWlpYWlxaWlpdXl1ibPnv6eHe3OHj4d/c4ODc2dzj3+Dg6Ozq7u76/ffz7+7t9PfwenB0fntqaXF6aV9hYWFcW15gY2V08Ofj4tvc3Nzh5enj6O/t6eX1ff/693R2/PP2dXh6e29oamppY2FlZ2heXl9gYl1eXV5fXV9hZ2dkaXPy7+7m3dne4d7d3ufl4ODq8Orq6/P28/r3e3Bxd/h8+/Xt7P7+/O3wfvTt6PR1dHFvY19jaWplbXzx7vTp5uXr9/Hw7/z/8+/u/ndvb3lwd/3r6vrz6+f3df/7d2hnbW5uZWlsaWNcXVxbV1dZW15eXWBhaGlw+erg4uLe29rc29rY2uDh393j6+Xk6f1+8e/2efjz8/p2dW9wbWludHxzaWdnaF5dYGRmY2h18+7v4dzb3+Ti4ODp6eTh4/Dz9ft4a3b9/nd3+v39eG5sZ2hkYWJmaWRkam1pX2BhYl5ZXGBoYF5na25qdO3k4uLc3Nzc29nb3N/m5+rp7PL08e37ffvx7npyfu30dP/y9HRy9fP5dnN4cW5oaWlpZ2Job3n49fDq5Obr7evn7vDp5uXy+vj6eWpz9/H8fPHr7Pr/+ntvZ2ptamtscW1rb21pYmJfWVhbXlxaXWRqZmZ27ez47uDb29vV1Nfc3dzg5+zp6ezq7Ovr5+fy/37v7Xtzdf11aWx1fWtkamxiXGFrZ2FhbHRzdfrt7OXn6ejk3+Li4eHf5Ojs7PByeP35d2xyfnxpZ290bmJha2trZ2ttamhoa2djX15eXF1fYGJqc2xreOni7+3f2tve2tbZ3uPi5O3//u3x+X3z7Ozt9/5++Pt5d/vx+nV99vB9bm5vZ15gaGxnZnD8/W9ufvb5fvnr5uPj4uXl5Oft9fP6cGx2fnp1/vf/bGpx/ntpa3h4cGttdXBsaWlkZF5aWlpcW1xfaGhjaG757fDt5t7e5d/Y1dre3Nne6u3n6vL67ujp7fDv8/h7fP779H5xcnr8dGpobWpbW2VtZWFtfXxucPbs7vXv5uPk5uXg3+Po5+vs+m9scXpzcXN0eWxiZGxsYmp+9Xlsc/t9a2VoaGRdXF9jYF1gYWBhYmNlcn17+Org4ubh3dnd397c3urt6ODm8u/r6u/58e3v+vbs5ejx7+/1/XZwbW1sYF1gaWRhaGx6bWl58fJ3dPPo7fDk3t7h4+Dk5+7+d3v9eXN4/31sZmltbmtud/l8bXB4eWlhZWllXVpdX15aXGFkYmBjanZ0e/Dp5OLf3Nza3N3e3d3k5+bf4+/y6+ny/fvx6u/27ejp+3p8fnJpam9wZmNmZmhlY2huc2xtc/32fvzz6ufr5+De4evr6ef1fPn1+3BwdXx1aWlrb29rdX72/XN8/X1xbWtnY11cXV5fXl5hZmZeX2duamz+6uDg4t3a29/f3uDm7unk5Ofq6erp7vT37er19+zn5/H+/fh5aWdqbWhiZGtva2pwfHpqaXF0dGxufvTx8evl4+ft6+jp7fDy8/pybXD//nBveft6cH7v7vx4/f59cWxsZmJdXF9fXVxeYWdnYmVpbWxpb/Tn6Orh29re393c4Ojn4+Po7ejm6Ozt6evt93758u/7eXz+e2lkaGtnYGVueW9u+vd8bW1xc3BpbX7v8fjs5eHn7uzr6/H8+PX7b21ye3dtcHn4+nn97uj0evj0+2tna2ljXl9kZmRgY2RiYWFjZmtoZmz/7vX16+Le4+Tf3N7l5eDe5Onj3+Dm5uLk6fL39O/u9ffu7fluZ2VpZmJhaHVzbnT9e2tmam1mXmVwfHdx+evq7/Dq6urr7+/u7vV+/PXz9vr38Ph3e/PxfnF78/1qY2prZ2NlamtpZGRlZGNjaGprbGxyev36++7l4OHg3tvc4eTg3N/n6eLk6+vm6O9+fvj5fnd69fp1bW1ta2xpbnZ6/29ze/52b3R5d2lpb3NuaXXz7fR99+/0enr28/b++fPw7/j++v32+fv39fh4/Pf5cmdtcHRqbHh5cWZmZWJgYWNlZGRkZ2dpbG797ujm5eDh4ufk3Nrd4N7d3ODp4uHn7vDr8/f/evh9dG9tbW5samx2d21rbm1vbWdvenVqZmpvbmt37unu9Ozp8Pn88Ors9vTr7vR8eP39/3h6enBya294dnJqbXNzbm58+XdnZmtsaGVnbWxnYGdqa2tw9+zn6eji5Obs6+Xe3+fn4uTq8Ovn6O378+/3fXr9/3xzdv19fHn++PZ+cHb8fXJrb3BtYl9kZmdkav77fXN29vr++u/l5+/v7OzzfHv38PPz9/T1fm5vdXJ2cXV8e3d0efx+bWZsbGZeYWRiXVtdYWZnbH3t6Orr5ePi5eLd3Nzf4N/f4uzp4uXr8u3r9Hdw/v9xbXB0b29obXF1em99/nlxbGxoZmNgZWtzcXP87/R6evDu8fLq5uXn7u3t9P169/f5/H79c2tlZ2xrbG51fPT7ePrz8f56e351Z2NkYl9eXmRpZmd1+fj5+u3r6ejr5ePk5+bk5ebr6ePk4+nr6Oz1fP72/Hx6+fT1envx8vl++/15a2ZlX2BeXWJoaGlscXh6dnR+8Ozt6uHh5+zr6Obv9Ovs7+/1+/11a2ttbW5qcHl3d3B8+Pv1e3h4bmVeXl1dXF5jZ2llbnx+9/vr5+Ti59/e3uPl4eLg4uLm6unw8/H4fnB2/n14dHd8fHhw/vT1/PryfW9naGdjZGJpbnFwcH58/v367ezt8Ovm6er09vP3+f348vV8dXp4b2ttbm5wcXb7+/f88uzq6/fw93RqZGhmY2BeYmJiX2RsbGprfu3r7O7p6Onq7+Xi5OXk4OTk6uzr8vZ++fn/+Hl97/f07vTv6vj78HhxZGBjX19cXmBiZGFrc3Bze/Xr5+vo4ubo7Ovo6ez27uvx93z6+HpybnFwdm9veXv8eXn4fn52fm1ubmVmX2NhXWRkYGJlbW5wdfPr7ujn5uDl5uXg397j6Oft6/b1fv5+bG54cnxwdfv5fv3t8+/w9/D9eHBub2xmYGRmZ2pqc3RxeHj78+zs8Ovr6fD47PP3/fju+f53//15d218fn55fO3y7fDv6vP1+/58dXJqaWxoY19fXF1dXWZlZmtsffTv8e3p6erq4+Dj4t/e4uPm7enu7vZ39n75/vbu8Oz08u3y9Xr9eW1pZWZiXl1dYF1gY2pwcXx59uzq6e3l4+Tl6ePk7vT16+30+/7wdnBudf5ud3j99H34/vh+/n5udm1sbGpvamxiZWZjZWRvenp3d/nu7/Hs5Ofn7Ovk6eXn6Obt7Pr1/HN1cv95evb57uzr8PHr7PH8+fZ9fW9wbmViXmRgYGlndXB3fHzy9fPx9O7t8Pbw7vT2fu/0/fx5/Pd9fHruc/Pm8ON67O/16v56bXVubmtka2tmYFxgYF1fZW9pbW1+/Pj0+eTo4ufs5uLf4uXe4+bp7uv0+3X99Pbu8uzu7O7x6O/7cG5mdnFraWNiXVtdXWFjZ294ef/27+3s8uzi5+bn6ufo6/Ls5ur1e/z+eXhw+fp9fXr4+Hp4e/x3bmhna2VpZ2luaWVfY2ZubGv38/n+/Ozt8vTr5+vs7unm6Ozr6e3y+nz6eXV0cvf78/jy7O/s8+zr8fh5eXp2c3V4bmllYWZlZmhufHl9d3n5fn51ffr++3z38vLy+e3s9Pz79fp8fvLq7fHw6uPp8/Xt9Hl0bHBubmppamJhXF1iXl9ia3Nta2t1/np5/Ovr7uvq4uHj4uDf5urs6Oz58PTv6uzt8Ozr7PL47vlya2ZrZ2VmZ2dhX19kZGRrb3Z4dnp69/Tw9u7p7Oru6OPm5efi4ubr9/H+dnl4+Pt4dHf/eHFxdXlubGpscW5raWpqaGZob3B0dHf7fHl1efT4+fHq6O7u7uro7O3s6u3z+n76eXp7e/T6+Pb18fPy9u3r9fh79vd3dHP+cm9tbHFpa2ppbWhra29wbG9rdHV3/P3w7O3u6uPl6u7t7PT38+jm6ujq6/D69fzz93t6c3ZpZmNgY15eXl9kYGFiZ2psbm9+dXv99u3s6+rl4uPf49/e4uDk4+Pq7e7s8PT5e/R9e3pwenJvamlpYmRhZ2hnaGlua2hoZ29qbnV59vbw8O7p6+rs5uHm5Ofj5ejs8fB9d3Nz/nZxcnN1cXVwe3dxdmpwb2prZ2xtbGpud2xsb3R7c3t+/fx99vz27/X19PX59/f48vz6+/bw8/Hz7u3v9fvz8fXu7urq7O/w83x8c3R3b3BsbGdlY19iYF9gYGhrbGtvfHt8evvt7+zq5uLk5OTi4+Xk5eTm6Orv6u709PT1fXptb3BnY2BfXl1eW1xbXF1fZ2Zra256ev767urr6Ojk3+Di4t/h4uPo5ebm6fPz+X54dn58eHP//ndxbHBwamVjampoZmRnZWVjZ2xsbnX38PDu8Ofo6Onr5eXp6+vn5+nu7e/2+Hd0c3B0cnh7eXl7/XdxcXV4dXJranRwa2hsbmlqaGtrb3t6/PP5+fny+fL7+u718vj09ez++/Ty8/r48+709PTq7ezn4uXm4Orr7O12bHJvbGZmaGRgXl5gX2FlaXB1d3L+fvr7++3y7Ovq4ePk5ubl5Ojp5+Tp6+3v+O7r4d3ndO9sa31eYl9eYl5ZXl9oXFtfY2NwbGz3cfJ76e5y5OLk6OTs7u/w4PT06ODu7vXt7fp4eOp49O9x/ut7a350aWVhbfxnYW9qYGpifux3eOPj5+Po39/t7OXo3+nj39/r4+nw5v125vB3fGp4a25t7flw4f16dnP1aG1sbVx5Z1ZuV2haY/hzfm12bO33d+9p/up9fHbre/92fX1+fur3+Ojteejncerl3Orm29zt5trsfv7w+/9tb11iYVpmVGBpbFljd2FkcP1Z8+Jm9uHo4gpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCkBAIC0wLDAgKzEsMTcgQEAKKzk3NSAxIDAKKzk3NSAxIDYwMDAwMAorOTc1IDEgMTIwMDAwMAorOTc1IDEgMTgwMDAwMAorOTc1IDEgMjQwMDAwMAorOTc1IDEgMzAwMDAwMAorOTc1IDEgMzYwMDAwMAorOTc1IDEgNDIwMDAwMAorOTc1IDEgNDgwMDAwMAorOTc1IDEgNTQwMDAwMAorOTc1IDEgNjAwMDAwMAorOTc1IDEgNjYwMDAwMAorOTc1IDEgNzIwMDAwMAorOTc1IDEgNzgwMDAwMAorOTc1IDEgODQwMDAwMAorOTc1IDEgOTAwMDAwMAorNTIwIDEgOTYwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZmNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KQEAgLTAsMCArMSwxMjIgQEAKKzI2MzYyIDEgMAorMTIwMjMgMCA4MzMzMworMTA2NDcgMCAxNjY2NjYKKzEwMjY5IDAgMjUwMDAwCisxMTA3NiAwIDMzMzMzMworMTExMDQgMCA0MTY2NjYKKzU5MDkgMCA1MDAwMDAKKzQyOTEgMCA1ODMzMzMKKzUxNDkgMCA2NjY2NjYKKzUzNTMgMCA3NTAwMDAKKzUxODUgMCA4MzMzMzMKKzI3MzYgMCA5MTY2NjYKKzIxNTc1IDEgMTAwMDAwMAorMjE5NiAwIDEwODMzMzMKKzQzNDAgMCAxMTY2NjY2CiszMTA5IDAgMTI1MDAwMAorNDQxMCAwIDEzMzMzMzMKKzE3MzEgMCAxNDE2NjY2Cis0NTU3IDAgMTUwMDAwMAorMzM3NiAwIDE1ODMzMzMKKzEzNTIgMCAxNjY2NjY2CisyODQ0IDAgMTc1MDAwMAorMTc4NyAwIDE4MzMzMzMKKzEwODggMCAxOTE2NjY2CiszNjg0MyAxIDIwMDAwMDAKKzI1MjAgMCAyMDgzMzMzCiszNzQ5IDAgMjE2NjY2NgorMzc4NCAwIDIyNTAwMDAKKzM0MDIgMCAyMzMzMzMzCiszNzk1IDAgMjQxNjY2NgorMjM0NSAwIDI1MDAwMDAKKzMxNDIgMCAyNTgzMzMzCisyOTQ4IDAgMjY2NjY2NgorMjAxOCAwIDI3NTAwMDAKKzUxMzMgMCAyODMzMzMzCisyMjc2IDAgMjkxNjY2NgorMjM0NjggMSAzMDAwMDAwCisxNTIyIDAgMzA4MzMzMworMjI5OSAwIDMxNjY2NjYKKzMyNzMgMCAzMjUwMDAwCisyNjMwIDAgMzMzMzMzMworMjkxNSAwIDM0MTY2NjYKKzMwMzIgMCAzNTAwMDAwCisxODkwIDAgMzU4MzMzMworMzcxOCAwIDM2NjY2NjYKKzE5OTAgMCAzNzUwMDAwCiszMTM5IDAgMzgzMzMzMworMTgwNiAwIDM5MTY2NjYKKzIzMjA4IDEgNDAwMDAwMAorMTQxOSAwIDQwODMzMzMKKzIyNjMgMCA0MTY2NjY2CiszMTMxIDAgNDI1MDAwMAorMjY0NSAwIDQzMzMzMzMKKzE4ODAgMCA0NDE2NjY2CisyMjM5IDAgNDUwMDAwMAorMzYzNyAwIDQ1ODMzMzMKKzE5NDEgMCA0NjY2NjY2CisxNTc3IDAgNDc1MDAwMAorMzc3NyAwIDQ4MzMzMzMKKzE4MTYgMCA0OTE2NjY2CisxOTYwMSAxIDUwMDAwMDAKKzExMDQgMCA1MDgzMzMzCisyODA4IDAgNTE2NjY2NgorMjQxMSAwIDUyNTAwMDAKKzIxNTkgMCA1MzMzMzMzCisyNDExIDAgNTQxNjY2NgorMjQwOCAwIDU1MDAwMDAKKzIzODggMCA1NTgzMzMzCisyNDE4IDAgNTY2NjY2NgorMTQ4MSAwIDU3NTAwMDAKKzE5MjYgMCA1ODMzMzMzCis5MDIyIDEgNTkxNjY2NgorMjkyIDAgNjAwMDAwMAorNzAxIDAgNjA4MzMzMworNzQ3IDAgNjE2NjY2NgorMjA1OSAwIDYyNTAwMDAKKzE2OTMgMCA2MzMzMzMzCisyMDc4IDAgNjQxNjY2NgorMjk3NSAwIDY1MDAwMDAKKzEzMTcgMCA2NTgzMzMzCisxNzQyIDAgNjY2NjY2NgorMTAxOSAwIDY3NTAwMDAKKzEwNTMgMCA2ODMzMzMzCisxNDE4MyAxIDY5MTY2NjYKKzE0NjcgMCA3MDAwMDAwCis5OTQgMCA3MDgzMzMzCisxNzA5IDAgNzE2NjY2NgorODM4IDAgNzI1MDAwMAorMTMyOCAwIDczMzMzMzMKKzIyOTIgMCA3NDE2NjY2CisxODI5IDAgNzUwMDAwMAorMTcyOCAwIDc1ODMzMzMKKzI0MzYgMCA3NjY2NjY2CisxODUyIDAgNzc1MDAwMAorMjE5MCAwIDc4MzMzMzMKKzE1MTY3IDEgNzkxNjY2NgorMTE4OCAwIDgwMDAwMDAKKzIwNzAgMCA4MDgzMzMzCiszMzE2IDAgODE2NjY2NgorMjYzNiAwIDgyNTAwMDAKKzk1MCAwIDgzMzMzMzMKKzEyNjAgMCA4NDE2NjY2Cis5MDYgMCA4NTAwMDAwCisxMjk0IDAgODU4MzMzMworMTI5OCAwIDg2NjY2NjYKKzE4OTcgMCA4NzUwMDAwCisxMzQ4IDAgODgzMzMzMworMTMxOTQgMSA4OTE2NjY2CisxMDQyIDAgOTAwMDAwMAorMTI1OCAwIDkwODMzMzMKKzE0NTcgMCA5MTY2NjY2Cis5OTAgMCA5MjUwMDAwCis5MDAgMCA5MzMzMzMzCis5NjMgMCA5NDE2NjY2CiszNDQ4IDAgOTUwMDAwMAorNzc0IDAgOTU4MzMzMworMTA3NSAwIDk2NjY2NjYKKzc1MCAwIDk3NTAwMDAKKzEwNTQgMCA5ODMzMzMzCisxMzEzOSAxIDk5MTY2NjYKKzMxMDQgMCAxMDAwMDAwMAorMzM2NiAwIDEwMDgzMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYxIEBACisxNjk1IDMyIDAKKzE5MzggMSAzMzMzMworNDcxIDAgODMzMzMKKzE1MyAwIDY2NjY2Cis5OSAwIDUwMDAwCis2NTcgMCAxNTAwMDAKKzI2MCAwIDExNjY2NgorMTE1IDAgMTAwMDAwCis5OSAwIDEzMzMzMworNjIyIDAgMjE2NjY2CisyMTEgMCAxODMzMzMKKzc5IDAgMTY2NjY2Cis5NSAwIDIwMDAwMAorNTk3IDAgMjgzMzMzCisyODggMCAyNTAwMDAKKzE0NSAwIDIzMzMzMworMTQ3IDAgMjY2NjY2Cis2NzYgMCAzNTAwMDAKKzI4NCAwIDMxNjY2NgorMTQ0IDAgMzAwMDAwCisxMzEgMCAzMzMzMzMKKzY1OCAwIDQxNjY2NgorMjcwIDAgMzgzMzMzCisxMDEgMCAzNjY2NjYKKzE1MSAwIDQwMDAwMAorNTI5IDAgNDgzMzMzCisyNTcgMCA0NTAwMDAKKzk4IDAgNDMzMzMzCisxNjAgMCA0NjY2NjYKKzY2NCAwIDU2NjY2NgorMTg2IDAgNTMzMzMzCisxNDcgMCA1MDAwMDAKKzY3IDAgNTE2NjY2Cis3OCAwIDU1MDAwMAorNTc1IDAgNjMzMzMzCisyMzAgMCA2MDAwMDAKKzEzNCAwIDU4MzMzMworMTE0IDAgNjE2NjY2Cis2MjkgMCA3MDAwMDAKKzIyNCAwIDY2NjY2NgorMTM4IDAgNjUwMDAwCisxMjkgMCA2ODMzMzMKKzY0NSAwIDc1MDAwMAorMjY0IDAgNzMzMzMzCisxNDUgMCA3MTY2NjYKKzcwNSAwIDgxNjY2NgorMzY1IDAgNzgzMzMzCisxNTYgMCA3NjY2NjYKKzE2MCAwIDgwMDAwMAorNzI1IDAgODgzMzMzCiszMzAgMCA4NTAwMDAKKzEzOCAwIDgzMzMzMworMTYyIDAgODY2NjY2Cis2MzggMCA5NTAwMDAKKzMzNyAwIDkxNjY2NgorMTcwIDAgOTAwMDAwCisxMzMgMCA5MzMzMzMKKzQzMiAwIDEwMTY2NjYKKzI4NyAwIDk4MzMzMworMTMwIDAgOTY2NjY2CisxMzYgMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTQ5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMiBAQAorMTA3NSAzMiAwCisxMDc1IDMyIDAKKzY4NjEzIDEgNjY2ODcKKzE5MDI1IDAgMTk5Njg3CisyNDA1IDAgMTMzNjg3Cis3NzcgMCA5OTY4NworNjgxIDAgMTY2Njg3CisyMDI1NCAwIDMzMzY4NworMjkyNyAwIDI2NjY4NworNzY2IDAgMjMzNjg3Cis2NTggMCAyOTk2ODcKKzIwNzg2IDAgNDY2Njg3Cis0MjE0IDAgMzk5Njg3Cis2MDkgMCAzNjY2ODcKKzY2MSAwIDQzMzY4NworMjA4MzggMCA1OTk2ODcKKzQyMDkgMCA1MzM2ODcKKzUwNiAwIDQ5OTY4NworNTg2IDAgNTY2Njg3CisyMDQxNSAwIDczMzY4NworNDIwNyAwIDY2NjY4NworNDI3IDAgNjMzNjg3Cis1MTQgMCA2OTk2ODcKKzI0NDU3IDAgODk5Njg3CisxOTA0IDAgODMzNjg3Cis5MjEgMCA3NjY2ODcKKzk5MiAwIDc5OTY4NworNTQzIDAgODY2Njg3CisyNDM0MiAwIDEwNjY2ODcKKzE4MjIgMCA5OTk2ODcKKzg0MCAwIDkzMzY4NworODkyIDAgOTY2Njg3Cis3MTUgMCAxMDMzNjg3CisyMjg5MyAwIDEyMzM2ODcKKzE2MTggMCAxMTY2Njg3Cis4ODEgMCAxMDk5Njg3Cis4OTAgMCAxMTMzNjg3Cis3OTQgMCAxMTk5Njg3CisyNDI5MiAwIDEzOTk2ODcKKzE2NzMgMCAxMzMzNjg3Cis3NTUgMCAxMjY2Njg3Cis4MTAgMCAxMjk5Njg3Cis1ODggMCAxMzY2Njg3CisxOTgyOCAwIDE1MzM2ODcKKzE1MzggMCAxNDY2Njg3Cis4OTQgMCAxNDMzNjg3Cis5MzMgMCAxNDk5Njg3CisxOTg1MyAwIDE2NjY2ODcKKzIwMTEgMCAxNTk5Njg3Cis5ODEgMCAxNTY2Njg3Cis5MDAgMCAxNjMzNjg3CisyMjg2OSAwIDE4MzM2ODcKKzE1NjIgMCAxNzY2Njg3Cis4NDIgMCAxNjk5Njg3Cis3NjUgMCAxNzMzNjg3Cis2NjUgMCAxNzk5Njg3CisyMjM0NiAwIDE5NjY2ODcKKzIyNDUgMCAxODk5Njg3Cis1MTYgMCAxODY2Njg3Cis2MDQgMCAxOTMzNjg3CisyNDMzMyAwIDIwOTk2ODcKKzE3NjUgMCAyMDMzNjg3CiszMTggMCAxOTk5Njg3CiszMjAgMCAyMDY2Njg3CisxODU3NyAwIDIxOTk2ODcKKzExMjMgMCAyMTY2Njg3CiszMzcgMCAyMTMzNjg3CisxNzUwOSAwIDIyOTk2ODcKKzg2OSAwIDIyNjY2ODcKKzkwMSAwIDIyMzM2ODcKKzIzMzY2IDAgMjQzMzY4NworMTIxNyAwIDIzNjY2ODcKKzM4MCAwIDIzMzM2ODcKKzM0NyAwIDIzOTk2ODcKKzE5NTQyIDAgMjUzMzY4NworMTg4NyAwIDI0OTk2ODcKKzQ2NyAwIDI0NjY2ODcKKzE4OTM5IDAgMjY2NjY4NworMjg2MyAwIDI1OTk2ODcKKzMxNyAwIDI1NjY2ODcKKzI3MiAwIDI2MzM2ODcKKzE5MzUzIDAgMjc5OTY4NworMjA5MiAwIDI3MzM2ODcKKzIwMyAwIDI2OTk2ODcKKzMxMCAwIDI3NjY2ODcKKzE4ODAwIDAgMjkzMzY4NworMjAzOCAwIDI4NjY2ODcKKzI0MiAwIDI4MzM2ODcKKzE5OSAwIDI4OTk2ODcKKzE3NDUyIDAgMzA5OTY4NworMTA2MCAwIDMwMzM2ODcKKzMwMSAwIDI5NjY2ODcKKzQ1MiAwIDI5OTk2ODcKKzI1NiAwIDMwNjY2ODcKKzIxMzUyIDAgMzE5OTY4NworNDA5IDAgMzE2NjY4NworMTczIDAgMzEzMzY4NworMTkxNDIgMCAzMjk5Njg3Cis2NDIgMCAzMjY2Njg3Cis0NjggMCAzMjMzNjg3CisxOTA2NiAwIDM0MzM2ODcKKzYzNSAwIDMzNjY2ODcKKzE5NyAwIDMzMzM2ODcKKzE5MCAwIDMzOTk2ODcKKzE4ODEzIDAgMzU2NjY4NworOTY5IDAgMzQ5OTY4NworMTY1IDAgMzQ2NjY4NworMjAzIDAgMzUzMzY4NworMTczNjIgMCAzNzMzNjg3CisyNDYgMCAzNjY2Njg3CisyMzYgMCAzNTk5Njg3CisxNzQgMCAzNjMzNjg3CisxNjQgMCAzNjk5Njg3CisxNzA4MSAwIDM4OTk2ODcKKzM1MyAwIDM4MzM2ODcKKzIyMiAwIDM3NjY2ODcKKzE4MSAwIDM3OTk2ODcKKzE0OCAwIDM4NjY2ODcKKzEwODM1IDAgMzk5OTY4NworMTg1IDAgMzk2NjY4NworMTM5IDAgMzkzMzY4NworNzUxMCAwIDQxMzM2ODcKKzE0OSAwIDQwNjY2ODcKKzEyOSAwIDQwMzM2ODcKKzEzMiAwIDQwOTk2ODcKKzEwNjMgMCA0MTY2Njg3Cis4MDUgMCA0MjY2Njg3CisxNTcgMCA0MjMzNjg3CiszOTQgMCA0MTk5Njg3Cis5MDg0MCAwIDQzOTk2ODcKKzYxNTkgMCA0MzMzNjg3CisxNzUyIDAgNDI5OTY4NworOTg1IDAgNDM2NjY4NworMzEzMzggMCA0NTMzNjg3CiszMzkwIDAgNDQ2NjY4NworNzcyIDAgNDQzMzY4NworNzgxIDAgNDQ5OTY4NworMzEwODQgMCA0NjY2Njg3CiszNDk4IDAgNDU5OTY4NworODE4IDAgNDU2NjY4NworODgxIDAgNDYzMzY4NworMzA0MTYgMCA0Nzk5Njg3CiszMjY1IDAgNDczMzY4NworODE1IDAgNDY5OTY4NworNzkwIDAgNDc2NjY4NworMzEwNTMgMCA0OTMzNjg3CiszMTA2IDAgNDg2NjY4NworNzA4IDAgNDgzMzY4NworNzEzIDAgNDg5OTY4NworMzAyMzAgMCA1MDY2Njg3CiszMjE0IDAgNDk5OTY4NworNjM5IDAgNDk2NjY4NworNzY4IDAgNTAzMzY4NworMjk2NTcgMCA1MTk5Njg3CiszMDEzIDAgNTEzMzY4NworNjIyIDAgNTA5OTY4NworNzIwIDAgNTE2NjY4NworMjkzNDQgMCA1MzMzNjg3CiszMTk2IDAgNTI2NjY4NworNzEzIDAgNTIzMzY4NworNzc1IDAgNTI5OTY4NworMzA0MjAgMCA1NDY2Njg3CiszMzc0IDAgNTM5OTY4NworODAzIDAgNTM2NjY4NworNzE3IDAgNTQzMzY4NworMjk5NjAgMCA1NTk5Njg3CiszMjgzIDAgNTUzMzY4NworNzkzIDAgNTQ5OTY4NworNzkwIDAgNTU2NjY4NworMzEwMTEgMCA1NzMzNjg3CiszMzk3IDAgNTY2NjY4NworODA5IDAgNTYzMzY4NworODMxIDAgNTY5OTY4NworMzExOTQgMCA1ODY2Njg3CiszNDAxIDAgNTc5OTY4NworODA3IDAgNTc2NjY4NworODI3IDAgNTgzMzY4NworMzAzMjYgMCA1OTk5Njg3CiszMTg2IDAgNTkzMzY4NworODE4IDAgNTg5OTY4NworODYzIDAgNTk2NjY4NworMzE1NTkgMCA2MTMzNjg3CiszMzY0IDAgNjA2NjY4NworODQwIDAgNjAzMzY4NworOTE5IDAgNjA5OTY4NworMzIwMTMgMCA2MjY2Njg3CiszNDk1IDAgNjE5OTY4NworODcxIDAgNjE2NjY4NworODAzIDAgNjIzMzY4NworMzAyOTQgMCA2Mzk5Njg3CiszMTUzIDAgNjMzMzY4NworNzE2IDAgNjI5OTY4NworODEyIDAgNjM2NjY4NworMjk5NTIgMCA2NTMzNjg3CiszMjk5IDAgNjQ2NjY4NworODAxIDAgNjQzMzY4NworNzQ5IDAgNjQ5OTY4NworMzA1OTggMCA2NjY2Njg3CiszNTM2IDAgNjU5OTY4NworODg3IDAgNjU2NjY4NworODUwIDAgNjYzMzY4NworMTcyNDYgMCA2Njk5Njg3CiszMTExMCAwIDY4MzM2ODcKKzMxOTggMCA2NzY2Njg3Cis4MDkgMCA2NzMzNjg3Cis4MzYgMCA2Nzk5Njg3CisyOTc4NCAwIDY5NjY2ODcKKzMxNTUgMCA2ODk5Njg3Cis4NTkgMCA2ODY2Njg3Cis5NTggMCA2OTMzNjg3CiszMDY2NiAwIDcwOTk2ODcKKzMzNzEgMCA3MDMzNjg3Cis4ODYgMCA2OTk5Njg3Cis4NjEgMCA3MDY2Njg3CiszMDQxNiAwIDcyMzM2ODcKKzMzNTAgMCA3MTY2Njg3Cis5MTcgMCA3MTMzNjg3Cis5ODcgMCA3MTk5Njg3CisyOTUwOSAwIDczNjY2ODcKKzM1NzQgMCA3Mjk5Njg3Cis5NzIgMCA3MjY2Njg3Cis4ODUgMCA3MzMzNjg3CiszMDg3MiAwIDc0OTk2ODcKKzMzOTkgMCA3NDMzNjg3Cis4OTggMCA3Mzk5Njg3CisxMDI3IDAgNzQ2NjY4NworMzExNTUgMCA3NjMzNjg3CiszNDU0IDAgNzU2NjY4NworOTY1IDAgNzUzMzY4NworODQxIDAgNzU5OTY4NworMjg0ODcgMCA3NzY2Njg3CiszNjE2IDAgNzY5OTY4NworOTIxIDAgNzY2NjY4NworOTkxIDAgNzczMzY4NworMjMyMDggMCA3ODk5Njg3CiszNTUxIDAgNzgzMzY4NworOTE4IDAgNzc5OTY4NworODk0IDAgNzg2NjY4NworMTY5ODIgMCA4MDMzNjg3CiszNDU4IDAgNzk2NjY4NworODQ0IDAgNzkzMzY4NworOTQzIDAgNzk5OTY4NworMzAzOTYgMCA4MTk5Njg3Cis0OTYzIDAgODEzMzY4NworMTQxNiAwIDgwNjY2ODcKKzE2MzkgMCA4MDk5Njg3Cis1MjQgMCA4MTY2Njg3CisxMzY4IDAgODI5OTY4NworNTY1IDAgODI2NjY4NworMzkyIDAgODIzMzY4NworNDEzMTcgMSA4Mzk5Njg3CisxODUgMCA4MzY2Njg3Cis0NzcgMCA4MzMzNjg3Cis1MzQyIDAgODUzMzY4NworMTI3NSAwIDg0NjY2ODcKKzEyMSAwIDg0MzM2ODcKKzk4MiAwIDg0OTk2ODcKKzY0NjUgMCA4Njk5Njg3CisyNjA2IDAgODYzMzY4NworMTE2MyAwIDg1NjY2ODcKKzk0MyAwIDg1OTk2ODcKKzExODYgMCA4NjY2Njg3CisxMTU5MyAwIDg4MzM2ODcKKzMxMjIgMCA4NzY2Njg3CisxMjc4IDAgODczMzY4NworMTU5MyAwIDg3OTk2ODcKKzkwOTkgMCA4OTk5Njg3Cis5NzggMCA4OTMzNjg3Cis3NDggMCA4ODY2Njg3Cis4MzUgMCA4ODk5Njg3CiszNjQgMCA4OTY2Njg3Cis0Nzk5IDAgOTA5OTY4NworMzY1IDAgOTA2NjY4NworMjE1IDAgOTAzMzY4NworNDM2NyAwIDkxOTk2ODcKKzMwMiAwIDkxNjY2ODcKKzQ4MCAwIDkxMzM2ODcKKzYxODAgMCA5MzMzNjg3Cis3NzEgMCA5MjY2Njg3CisyNDYgMCA5MjMzNjg3CisyODEgMCA5Mjk5Njg3Cis0NjM2IDAgOTM5OTY4NworMjExIDAgOTM2NjY4NworNDAzNyAwIDk0OTk2ODcKKzM4MiAwIDk0NjY2ODcKKzQ4NiAwIDk0MzM2ODcKKzM5NzUgMCA5NTk5Njg3CiszMTIgMCA5NTY2Njg3Cis0NzQgMCA5NTMzNjg3Cis2ODgwIDAgOTczMzY4NworMTExNiAwIDk2NjY2ODcKKzIwNiAwIDk2MzM2ODcKKzY5OCAwIDk2OTk2ODcKKzYyNTQgMCA5ODk5Njg3CisyNTgxIDAgOTgzMzY4NworMTMwMyAwIDk3NjY2ODcKKzk4NSAwIDk3OTk2ODcKKzk2NyAwIDk4NjY2ODcKKzY0ODYgMCAxMDAzMzY4NworMzU1NSAwIDk5NjY2ODcKKzE0MzAgMCA5OTMzNjg3CisxNjA1IDAgOTk5OTY4NwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYmZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTQgQEAKKzU3NiAxIDAKKzU3NiAxIDI0MDAwCis1NzYgMSA0ODAwMAorNTc2IDEgNzIwMDAKKzU3NiAxIDk2MDAwCis1NzYgMSAxMjAwMDAKKzU3NiAxIDE0NDAwMAorNTc2IDEgMTY4MDAwCis1NzYgMSAxOTIwMDAKKzU3NiAxIDIxNjAwMAorNTc2IDEgMjQwMDAwCis1NzYgMSAyNjQwMDAKKzU3NiAxIDI4ODAwMAorNTc2IDEgMzEyMDAwCis1NzYgMSAzMzYwMDAKKzU3NiAxIDM2MDAwMAorNTc2IDEgMzg0MDAwCis1NzYgMSA0MDgwMDAKKzU3NiAxIDQzMjAwMAorNTc2IDEgNDU2MDAwCis1NzYgMSA0ODAwMDAKKzU3NiAxIDUwNDAwMAorNTc2IDEgNTI4MDAwCis1NzYgMSA1NTIwMDAKKzU3NiAxIDU3NjAwMAorNTc2IDEgNjAwMDAwCis1NzYgMSA2MjQwMDAKKzU3NiAxIDY0ODAwMAorNTc2IDEgNjcyMDAwCis1NzYgMSA2OTYwMDAKKzU3NiAxIDcyMDAwMAorNTc2IDEgNzQ0MDAwCis1NzYgMSA3NjgwMDAKKzU3NiAxIDc5MjAwMAorNTc2IDEgODE2MDAwCis1NzYgMSA4NDAwMDAKKzU3NiAxIDg2NDAwMAorNTc2IDEgODg4MDAwCis1NzYgMSA5MTIwMDAKKzU3NiAxIDkzNjAwMAorNTc2IDEgOTYwMDAwCis1NzYgMSA5ODQwMDAKKzU3NiAxIDEwMDgwMDAKKzU3NiAxIDEwMzIwMDAKKzU3NiAxIDEwNTYwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNhNDQxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVjNzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDM4NSBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzExNTIgMSA0ODAwMAorMTE1MiAxIDk2MDAwCisxMTUyIDEgMTQ0MDAwCisxMTUyIDEgMTkyMDAwCisxNzI4IDEgMjQwMDAwCisxNzI4IDEgMzEyMDAwCisxNzI4IDEgMzg0MDAwCisxNzI4IDEgNDU2MDAwCisxNzI4IDEgNTI4MDAwCisyMzA0IDEgNjAwMDAwCisyMzA0IDEgNjk2MDAwCisyMzA0IDEgNzkyMDAwCisyMzA0IDEgODg4MDAwCisyMzA0IDEgOTg0MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDA2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpAQCAtMCwwICsxLDI0OSBAQAorNjQ1OCAxIDQwMDAwCis0MDQwIDAgODAwMDAKKzMyNTUgMCAxMjAwMDAKKzMwMjYgMCAxNjAwMDAKKzMyOTMgMCAyMDAwMDAKKzMwODkgMCAyNDAwMDAKKzMzMDUgMCAyODAwMDAKKzE3OTQgMCAzMjAwMDAKKzE4NDggMCAzNjAwMDAKKzEyODggMCA0MDAwMDAKKzE1MTEgMCA0NDAwMDAKKzE1MjcgMCA0ODAwMDAKKzYxNDYgMSA1MjAwMDAKKzEyNDMgMCA1NjAwMDAKKzEwOTkgMCA2MDAwMDAKKzEzNTQgMCA2NDAwMDAKKzEzNjYgMCA2ODAwMDAKKzEwNDIgMCA3MjAwMDAKKzE2MDAgMCA3NjAwMDAKKzg3NSAwIDgwMDAwMAorMTcyOCAwIDg0MDAwMAorMTI1NCAwIDg4MDAwMAorOTk0IDAgOTIwMDAwCisxNTkxIDAgOTYwMDAwCis2MjY1IDEgMTAwMDAwMAorMTAxOCAwIDEwNDAwMDAKKzgyNSAwIDEwODAwMDAKKzg2OSAwIDExMjAwMDAKKzkyMSAwIDExNjAwMDAKKzk3NSAwIDEyMDAwMDAKKzkyNCAwIDEyNDAwMDAKKzgzNCAwIDEyODAwMDAKKzEwNjYgMCAxMzIwMDAwCis3OTMgMCAxMzYwMDAwCis4ODkgMCAxNDAwMDAwCisyMDUwIDAgMTQ0MDAwMAorNjI3NiAxIDE0ODAwMDAKKzg4MSAwIDE1MjAwMDAKKzI2MCAwIDE1NjAwMDAKKzczMCAwIDE2MDAwMDAKKzQzMSAwIDE2NDAwMDAKKzM1MSAwIDE2ODAwMDAKKzMyMSAwIDE3MjAwMDAKKzM4MDIgMCAxNzYwMDAwCisxNDYgMCAxODAwMDAwCis2NDYyIDAgMTg0MDAwMAorMzI0NiAwIDE4ODAwMDAKKzUzMyAwIDE5MjAwMDAKKzYyMzEgMSAxOTYwMDAwCisxMzc4IDAgMjAwMDAwMAorNzE5IDAgMjA0MDAwMAorODE4IDAgMjA4MDAwMAorODU2IDAgMjEyMDAwMAorOTM3IDAgMjE2MDAwMAorNjExIDAgMjIwMDAwMAorMzAzMSAwIDIyNDAwMDAKKzEwNDEgMCAyMjgwMDAwCis2MDQgMCAyMzIwMDAwCis3MTQgMCAyMzYwMDAwCisxMjgzIDAgMjQwMDAwMAorNzU2NSAxIDI0NDAwMDAKKzYwMiAwIDI0ODAwMDAKKzUzMCAwIDI1MjAwMDAKKzI1NzkgMCAyNTYwMDAwCisxMTUgMCAyNjAwMDAwCisxMDU4IDAgMjY0MDAwMAorNjg5IDAgMjY4MDAwMAorMTExOSAwIDI3MjAwMDAKKzY5OCAwIDI3NjAwMDAKKzEwMDYgMCAyODAwMDAwCis1NDUgMCAyODQwMDAwCisxNjE3IDAgMjg4MDAwMAorOTEyMyAxIDI5MjAwMDAKKzUyNyAwIDI5NjAwMDAKKzE1NzYgMCAzMDAwMDAwCis0NjUgMCAzMDQwMDAwCis3NDEgMCAzMDgwMDAwCis1MjEgMCAzMTIwMDAwCisxMzIyIDAgMzE2MDAwMAorNzc1IDAgMzIwMDAwMAorODYzIDAgMzI0MDAwMAorOTEwIDAgMzI4MDAwMAorOTE1IDAgMzMyMDAwMAorOTI2IDAgMzM2MDAwMAorNzU1NiAxIDM0MDAwMDAKKzc0MSAwIDM0NDAwMDAKKzUyNyAwIDM0ODAwMDAKKzI1MTYgMCAzNTIwMDAwCis0NTkgMCAzNTYwMDAwCis0MDQgMCAzNjAwMDAwCis1MDkgMCAzNjQwMDAwCisxMjI3IDAgMzY4MDAwMAorMTU2MSAwIDM3MjAwMDAKKzQ5MCAwIDM3NjAwMDAKKzcxMiAwIDM4MDAwMDAKKzgwMyAwIDM4NDAwMDAKKzc1MjQgMSAzODgwMDAwCis3MzAgMCAzOTIwMDAwCis0NjEgMCAzOTYwMDAwCisyNTI2IDAgNDAwMDAwMAorNDUzIDAgNDA0MDAwMAorNjMyIDAgNDA4MDAwMAorNzgzIDAgNDEyMDAwMAorODQzIDAgNDE2MDAwMAorOTE4IDAgNDIwMDAwMAorOTYxIDAgNDI0MDAwMAorOTQ4IDAgNDI4MDAwMAorOTU5IDAgNDMyMDAwMAorNzU5OCAxIDQzNjAwMDAKKzY3OCAwIDQ0MDAwMDAKKzU2OSAwIDQ0NDAwMDAKKzg5MyAwIDQ0ODAwMDAKKzYyNCAwIDQ1MjAwMDAKKzc1NSAwIDQ1NjAwMDAKKzIyMzQgMCA0NjAwMDAwCis1NTYgMCA0NjQwMDAwCis5NDQgMCA0NjgwMDAwCis3MzkgMCA0NzIwMDAwCis4NjIgMCA0NzYwMDAwCis5MzggMCA0ODAwMDAwCis3NTc0IDEgNDg0MDAwMAorNjk5IDAgNDg4MDAwMAorNzAxIDAgNDkyMDAwMAorNTMwIDAgNDk2MDAwMAorNjg5IDAgNTAwMDAwMAorNzc4IDAgNTA0MDAwMAorODU2IDAgNTA4MDAwMAorOTMwIDAgNTEyMDAwMAorOTc1IDAgNTE2MDAwMAorMTAyMSAwIDUyMDAwMDAKKzEwNzQgMCA1MjQwMDAwCis5NzggMCA1MjgwMDAwCis4MDIxIDEgNTMyMDAwMAorNzA0IDAgNTM2MDAwMAorNjEwIDAgNTQwMDAwMAorNjk3IDAgNTQ0MDAwMAorNzExIDAgNTQ4MDAwMAorODIwIDAgNTUyMDAwMAorODQzIDAgNTU2MDAwMAorMjUxIDAgNTYwMDAwMAorMzM2NyAwIDU2NDAwMDAKKzUwNyAwIDU2ODAwMDAKKzMxNjggMSA1NzIwMDAwCis3NzkgMCA1NzYwMDAwCiszMTYgMCA1ODAwMDAwCis2MzUgMCA1ODQwMDAwCisyMDQgMCA1ODgwMDAwCis5NzggMCA1OTIwMDAwCisxMjcgMCA1OTYwMDAwCis1ODkgMCA2MDAwMDAwCis2MDQgMCA2MDQwMDAwCis2NjYgMCA2MDgwMDAwCis1ODIgMCA2MTIwMDAwCis3MjkgMCA2MTYwMDAwCis0MTUyIDEgNjIwMDAwMAorODU4IDAgNjI0MDAwMAorNzM5IDAgNjI4MDAwMAorODg1IDAgNjMyMDAwMAorNzQ5IDAgNjM2MDAwMAorOTUwIDAgNjQwMDAwMAorNTkzIDAgNjQ0MDAwMAorNzcxIDAgNjQ4MDAwMAorNjc4IDAgNjUyMDAwMAorNTI5IDAgNjU2MDAwMAorODM1IDAgNjYwMDAwMAorMzkxIDAgNjY0MDAwMAorNDY5MiAxIDY2ODAwMDAKKzQ3MyAwIDY3MjAwMDAKKzcyNCAwIDY3NjAwMDAKKzM4MSAwIDY4MDAwMDAKKzkwOSAwIDY4NDAwMDAKKzM5NCAwIDY4ODAwMDAKKzY1OSAwIDY5MjAwMDAKKzM2NyAwIDY5NjAwMDAKKzY1OCAwIDcwMDAwMDAKKzUyMyAwIDcwNDAwMDAKKzU1NCAwIDcwODAwMDAKKzU1MyAwIDcxMjAwMDAKKzYwODAgMSA3MTYwMDAwCis0OTYgMCA3MjAwMDAwCis3NjMgMCA3MjQwMDAwCis5MzkgMCA3MjgwMDAwCis3MTUgMCA3MzIwMDAwCis2NzIgMCA3MzYwMDAwCis2MTQgMCA3NDAwMDAwCis4MTEgMCA3NDQwMDAwCis5MTYgMCA3NDgwMDAwCisxMTUzIDAgNzUyMDAwMAorOTQwIDAgNzU2MDAwMAorMzIyIDAgNzYwMDAwMAorNjYxMyAxIDc2NDAwMDAKKzg1MSAwIDc2ODAwMDAKKzEwMDcgMCA3NzIwMDAwCis1MjAgMCA3NzYwMDAwCis0NTYgMCA3ODAwMDAwCis2MzkgMCA3ODQwMDAwCis3NTggMCA3ODgwMDAwCis4NzkgMCA3OTIwMDAwCisxMTUyIDAgNzk2MDAwMAorMTA2MSAwIDgwMDAwMDAKKzk0NiAwIDgwNDAwMDAKKzg1OSAwIDgwODAwMDAKKzM2MTAgMSA4MTIwMDAwCis4NzEgMCA4MTYwMDAwCis3NDYgMCA4MjAwMDAwCiszNjcgMCA4MjQwMDAwCiszOTcgMCA4MjgwMDAwCis5MzAgMCA4MzIwMDAwCiszMzcgMCA4MzYwMDAwCis0MTggMCA4NDAwMDAwCis3NDAgMCA4NDQwMDAwCis2MzcgMCA4NDgwMDAwCis2NjYgMCA4NTIwMDAwCis2MjcgMCA4NTYwMDAwCis0MzM4IDEgODYwMDAwMAorNzQ1IDAgODY0MDAwMAorNzgzIDAgODY4MDAwMAorNDY1IDAgODcyMDAwMAorNDYwIDAgODc2MDAwMAorNDU1IDAgODgwMDAwMAorNTA2IDAgODg0MDAwMAorNDkyIDAgODg4MDAwMAorNDg1IDAgODkyMDAwMAorNTE3IDAgODk2MDAwMAorNTM0IDAgOTAwMDAwMAorMzk1IDAgOTA0MDAwMAorNTYyNiAxIDkwODAwMDAKKzExNjkgMCA5MTIwMDAwCis1NjQgMCA5MTYwMDAwCisyNjEgMCA5MjAwMDAwCiszMjcgMCA5MjQwMDAwCiszMDMgMCA5MjgwMDAwCisxMTQ1IDAgOTMyMDAwMAorMjU3IDAgOTM2MDAwMAorNDk4IDAgOTQwMDAwMAorNDY1IDAgOTQ0MDAwMAorNDE0IDAgOTQ4MDAwMAorNTUzIDAgOTUyMDAwMAorNTYxNyAxIDk1NjAwMDAKKzEwNTIgMCA5NjAwMDAwCis1OTIgMCA5NjQwMDAwCiszMjMgMCA5NjgwMDAwCis0OTcgMCA5NzIwMDAwCis0NjcgMCA5NzYwMDAwCis3MDUgMCA5ODAwMDAwCisxMDg2IDAgOTg0MDAwMAorMTI1MyAwIDk4ODAwMDAKKzEyNTIgMCA5OTIwMDAwCis3NzYgMCA5OTYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY5MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3Y2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxNjY4MCAxIDE2NjY2CisxNzAxNyAwIDMzMzMzCisxMDUzNCAwIDUwMDAwCisxMDI4OSAwIDY2NjY2CiszNjk4IDAgODMzMzMKKzI3NzYgMCAxMDAwMDAKKzE5MzYgMCAxMTY2NjYKKzE0OTMgMCAxMzMzMzMKKzEyMTcgMCAxNTAwMDAKKzk5MyAwIDE2NjY2NgorODA1IDAgMTgzMzMzCis4NTcgMCAyMDAwMDAKKzUwODIgMSAyMTY2NjYKKzgxMiAwIDIzMzMzMworNzE4IDAgMjUwMDAwCis3NDYgMCAyNjY2NjYKKzc2MiAwIDI4MzMzMworODY1IDAgMzAwMDAwCis3ODIgMCAzMTY2NjYKKzgzMyAwIDMzMzMzMworNzUwIDAgMzUwMDAwCis4MTkgMCAzNjY2NjYKKzgyNiAwIDM4MzMzMworODQ2IDAgNDAwMDAwCis0NTIyIDEgNDE2NjY2Cis2NzggMCA0MzMzMzMKKzcxOCAwIDQ1MDAwMAorODAzIDAgNDY2NjY2Cis3NjkgMCA0ODMzMzMKKzc2MiAwIDUwMDAwMAorNTg3IDAgNTE2NjY2Cis2MzUgMCA1MzMzMzMKKzY1OCAwIDU1MDAwMAorNzE0IDAgNTY2NjY2Cis2NzcgMCA1ODMzMzMKKzY5OSAwIDYwMDAwMAorNDYxNiAxIDYxNjY2NgorODAwIDAgNjMzMzMzCis4MzEgMCA2NTAwMDAKKzkyOCAwIDY2NjY2NgorODY5IDAgNjgzMzMzCis5MzEgMCA3MDAwMDAKKzkzMCAwIDcxNjY2NgorOTc0IDAgNzMzMzMzCis5NzggMCA3NTAwMDAKKzkzMiAwIDc2NjY2NgorOTE4IDAgNzgzMzMzCis5NzggMCA4MDAwMDAKKzQ2NTUgMSA4MTY2NjYKKzg5NyAwIDgzMzMzMworODk2IDAgODUwMDAwCis4ODMgMCA4NjY2NjYKKzk0OSAwIDg4MzMzMworOTY1IDAgOTAwMDAwCis5NTEgMCA5MTY2NjYKKzkwMSAwIDkzMzMzMworOTY1IDAgOTUwMDAwCis5NTUgMCA5NjY2NjYKKzk0OCAwIDk4MzMzMworOTY4IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY3YzJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJhOWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDEgQEAKKzQ3IDMyIDAKKzIxMTE1IDEgMAorMTY0NTYgMCAzMzMzMworMTE4ODAgMCA2NjY2NgorMTIxNTUgMCAxMDAwMDAKKzExNDAyIDAgMTMzMzMzCis1MzQ1IDAgMTY2NjY2CisyOTg2IDAgMjAwMDAwCisxOTI0IDAgMjMzMzMzCisyMjc1IDAgMjY2NjY2CisyNzkzIDAgMzAwMDAwCisyNzU2IDAgMzMzMzMzCisyOTMzIDAgMzY2NjY2CisyMTEwMCAxIDQwMDAwMAorMTMwMiAwIDQzMzMzMworMjIwNiAwIDQ2NjY2NgorMTU5OSAwIDUwMDAwMAorMjU1OCAwIDUzMzMzMworMjc4NCAwIDU2NjY2NgorMjQ1OCAwIDYwMDAwMAorMjQ4MCAwIDYzMzMzMworMTQ0NiAwIDY2NjY2NgorMzEwOSAwIDcwMDAwMAorOTQ0IDAgNzMzMzMzCiszMTM0IDAgNzY2NjY2CisyMTM0MiAxIDgwMDAwMAorNjUyIDAgODMzMzMzCisxNzA4IDAgODY2NjY2CisyMjAyIDAgOTAwMDAwCisxNjk1IDAgOTMzMzMzCisxNjYxIDAgOTY2NjY2CisxNjUyIDAgMTAwMDAwMAorMTY3OSAwIDEwMzMzMzMKKzE2OTAgMCAxMDY2NjY2CisxODI0IDAgMTEwMDAwMAorMTgwMyAwIDExMzMzMzMKKzE1OTggMCAxMTY2NjY2CisyMTU0MCAxIDEyMDAwMDAKKzIwNSAwIDEyMzMzMzMKKzExMjQgMCAxMjY2NjY2CisxMDY5IDAgMTMwMDAwMAorODM4IDAgMTMzMzMzMworNzY1IDAgMTM2NjY2NgorNDI2NSAwIDE0MDAwMDAKKzk0IDAgMTQzMzMzMworMjA0NjMgMCAxNDY2NjY2CisxMDI4IDAgMTUwMDAwMAorMTQ3NSAwIDE1MzMzMzMKKzM2MzAgMCAxNTY2NjY2CisyODM3MyAxIDE2MDAwMDAKKzcyNSAwIDE2MzMzMzMKKzExMTkgMCAxNjY2NjY2CisxNDI3IDAgMTcwMDAwMAorMTY3OSAwIDE3MzMzMzMKKzE4NjYgMCAxNzY2NjY2CisxMTk3IDAgMTgwMDAwMAorMTU3MiAwIDE4MzMzMzMKKzE2NTEgMCAxODY2NjY2CisxNjc4IDAgMTkwMDAwMAorMTY4OCAwIDE5MzMzMzMKKzE2NTkgMCAxOTY2NjY2CisxOTkwMCAxIDIwMDAwMDAKKzU4NCAwIDIwMzMzMzMKKzE0NzUgMCAyMDY2NjY2CisxNjc4IDAgMjEwMDAwMAorMTAxMCAwIDIxMzMzMzMKKzE0MzUgMCAyMTY2NjY2CisxNjEyIDAgMjIwMDAwMAorMTYwMiAwIDIyMzMzMzMKKzE3MDkgMCAyMjY2NjY2CisxNzM3IDAgMjMwMDAwMAorMTgzNSAwIDIzMzMzMzMKKzkyNiAwIDIzNjY2NjYKKzIwMDkwIDEgMjQwMDAwMAorNjMxIDAgMjQzMzMzMworMTU3NiAwIDI0NjY2NjYKKzk0MSAwIDI1MDAwMDAKKzIzNDkgMCAyNTMzMzMzCisxMTEyIDAgMjU2NjY2NgorMTU2NiAwIDI2MDAwMDAKKzE3NzMgMCAyNjMzMzMzCis5NzkgMCAyNjY2NjY2CisyMjQ2IDAgMjcwMDAwMAorOTA0IDAgMjczMzMzMworMTM0MiAwIDI3NjY2NjYKKzIwMTQ3IDEgMjgwMDAwMAorNjMwIDAgMjgzMzMzMworOTgyIDAgMjg2NjY2NgorMjA4OSAwIDI5MDAwMDAKKzEwMjEgMCAyOTMzMzMzCisxNTA2IDAgMjk2NjY2NgorMTY0MiAwIDMwMDAwMDAKKzk2OCAwIDMwMzMzMzMKKzEyNjIgMCAzMDY2NjY2CisyMjcwIDAgMzEwMDAwMAorODY0IDAgMzEzMzMzMworMTI1MiAwIDMxNjY2NjYKKzIwMTQ1IDEgMzIwMDAwMAorNTk1IDAgMzIzMzMzMworOTE4IDAgMzI2NjY2NgorMTE2NyAwIDMzMDAwMDAKKzEzNDcgMCAzMzMzMzMzCisxNTk3IDAgMzM2NjY2NgorMTYzNiAwIDM0MDAwMDAKKzk0NCAwIDM0MzMzMzMKKzEyOTUgMCAzNDY2NjY2CisxMzk3IDAgMzUwMDAwMAorMTQxMyAwIDM1MzMzMzMKKzE0MzIgMCAzNTY2NjY2CisyMDE4MCAxIDM2MDAwMDAKKzUyNSAwIDM2MzMzMzMKKzEwNjggMCAzNjY2NjY2CisxMjMwIDAgMzcwMDAwMAorMTQyOCAwIDM3MzMzMzMKKzkxNiAwIDM3NjY2NjYKKzE5NDggMCAzODAwMDAwCis5NjYgMCAzODMzMzMzCisxMzQyIDAgMzg2NjY2NgorMTMzOCAwIDM5MDAwMDAKKzEzNzkgMCAzOTMzMzMzCisxMjk2IDAgMzk2NjY2NgorMTczNzggMSA0MDAwMDAwCis1ODMgMCA0MDMzMzMzCis5MzYgMCA0MDY2NjY2CisxNzQ1IDAgNDEwMDAwMAorOTg3IDAgNDEzMzMzMworMTM5MyAwIDQxNjY2NjYKKzE0OTUgMCA0MjAwMDAwCis4NjkgMCA0MjMzMzMzCisxOTM4IDAgNDI2NjY2NgorODI4IDAgNDMwMDAwMAorMTg1MSAwIDQzMzMzMzMKKzgzNCAwIDQzNjY2NjYKKzE3MjgwIDEgNDQwMDAwMAorNTgwIDAgNDQzMzMzMworODY5IDAgNDQ2NjY2NgorMTYwNSAwIDQ1MDAwMDAKKzg0MyAwIDQ1MzMzMzMKKzYxNDcgMSA0NTY2NjY2CisyMjAgMCA0NjAwMDAwCisxMTA2IDAgNDYzMzMzMworMzk1IDAgNDY2NjY2NgorMzA0IDAgNDcwMDAwMAorMTk0NiAwIDQ3MzMzMzMKKzE1NCAwIDQ3NjY2NjYKKzQ4MiAwIDQ4MDAwMDAKKzk0OSAwIDQ4MzMzMzMKKzEwODggMCA0ODY2NjY2Cis5NzQgMCA0OTAwMDAwCis4NzYgMCA0OTMzMzMzCis5MTY0IDEgNDk2NjY2NgorMTAxOSAwIDUwMDAwMDAKKzk4MyAwIDUwMzMzMzMKKzEzNzUgMCA1MDY2NjY2CisxMDQxIDAgNTEwMDAwMAorNzg5IDAgNTEzMzMzMworMTAzNyAwIDUxNjY2NjYKKzgxMiAwIDUyMDAwMDAKKzczMiAwIDUyMzMzMzMKKzk3MiAwIDUyNjY2NjYKKzcwOCAwIDUzMDAwMDAKKzYyMyAwIDUzMzMzMzMKKzEwNjY3IDEgNTM2NjY2NgorNDYzIDAgNTQwMDAwMAorOTExIDAgNTQzMzMzMworODYxIDAgNTQ2NjY2NgorNTA3IDAgNTUwMDAwMAorMTAxNSAwIDU1MzMzMzMKKzUwMSAwIDU1NjY2NjYKKzkzNCAwIDU2MDAwMDAKKzgxMiAwIDU2MzMzMzMKKzg1NSAwIDU2NjY2NjYKKzgwNCAwIDU3MDAwMDAKKzc4MyAwIDU3MzMzMzMKKzEwNjEwIDEgNTc2NjY2NgorOTUwIDAgNTgwMDAwMAorMTI5MiAwIDU4MzMzMzMKKzEwMDIgMCA1ODY2NjY2Cis3MjggMCA1OTAwMDAwCis5NjAgMCA1OTMzMzMzCisxMjMwIDAgNTk2NjY2NgorMTMxNSAwIDYwMDAwMDAKKzEyNDggMCA2MDMzMzMzCis5OTUgMCA2MDY2NjY2CisxNDAxIDAgNjEwMDAwMAorOTA1IDAgNjEzMzMzMworOTMyNiAxIDYxNjY2NjYKKzcyNiAwIDYyMDAwMDAKKzY2NyAwIDYyMzMzMzMKKzgzMyAwIDYyNjY2NjYKKzEwMDcgMCA2MzAwMDAwCisxMTcyIDAgNjMzMzMzMworMTkxMCAwIDYzNjY2NjYKKzE5NTQgMCA2NDAwMDAwCisxNDk4IDAgNjQzMzMzMworMTE4OCAwIDY0NjY2NjYKKzc4NCAwIDY1MDAwMDAKKzEwMDUgMCA2NTMzMzMzCisxMDAzMCAxIDY1NjY2NjYKKzQ1MiAwIDY2MDAwMDAKKzc2MyAwIDY2MzMzMzMKKzYzOSAwIDY2NjY2NjYKKzY3MSAwIDY3MDAwMDAKKzg2NyAwIDY3MzMzMzMKKzk2MyAwIDY3NjY2NjYKKzk4MiAwIDY4MDAwMDAKKzk5NSAwIDY4MzMzMzMKKzk4MiAwIDY4NjY2NjYKKzc0NyAwIDY5MDAwMDAKKzU3NCAwIDY5MzMzMzMKKzEyMzUzIDEgNjk2NjY2NgorNDc0IDAgNzAwMDAwMAorOTY5IDAgNzAzMzMzMworNjMzIDAgNzA2NjY2NgorNzIzIDAgNzEwMDAwMAorMTIyMSAwIDcxMzMzMzMKKzY3NCAwIDcxNjY2NjYKKzc3NiAwIDcyMDAwMDAKKzU3MiAwIDcyMzMzMzMKKzkxMiAwIDcyNjY2NjYKKzU2NCAwIDczMDAwMDAKKzU5NCAwIDczMzMzMzMKKzE2NjYxIDEgNzM2NjY2NgorNTE4IDAgNzQwMDAwMAorNjU2IDAgNzQzMzMzMworNjI1IDAgNzQ2NjY2NgorNTgzIDAgNzUwMDAwMAorNTg0IDAgNzUzMzMzMworMTAyNyAwIDc1NjY2NjYKKzgxMiAwIDc2MDAwMDAKKzcyOSAwIDc2MzMzMzMKKzc2NiAwIDc2NjY2NjYKKzkwMSAwIDc3MDAwMDAKKzk2MCAwIDc3MzMzMzMKKzEyMzM2IDEgNzc2NjY2NgorOTQ0IDAgNzgwMDAwMAorMTM5OCAwIDc4MzMzMzMKKzE2MjUgMCA3ODY2NjY2CisyMTAzIDAgNzkwMDAwMAorMTYzMCAwIDc5MzMzMzMKKzEyMjggMCA3OTY2NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VhZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5OSBAQAorMTkgMzIgMAorOCAzMiAwCis4IDMyIDAKKzUyOSAxIDAKKzMyOSAxIDEzNTAwCiszNDkgMSAzMzUwMAorMzM2IDEgNTM1MDAKKzM4MyAxIDczNTAwCiszNTkgMSA5MzUwMAorMzQ0IDEgMTEzNTAwCiszNDMgMSAxMzM1MDAKKzMzMiAxIDE1MzUwMAorMzIwIDEgMTczNTAwCiszMTkgMSAxOTM1MDAKKzMyMyAxIDIxMzUwMAorMzIwIDEgMjMzNTAwCiszMjggMSAyNTM1MDAKKzM0MCAxIDI3MzUwMAorMzE4IDEgMjkzNTAwCiszMTkgMSAzMTM1MDAKKzMzNSAxIDMzMzUwMAorNTExIDEgMzUzNTAwCiszOTUgMSAzNzM1MDAKKzMyNyAxIDM5MzUwMAorNDc5IDEgNDEzNTAwCiszMzIgMSA0MzM1MDAKKzMyMCAxIDQ1MzUwMAorMzIxIDEgNDczNTAwCiszMTAgMSA0OTM1MDAKKzMxMCAxIDUxMzUwMAorMzEwIDEgNTMzNTAwCiszMjYgMSA1NTM1MDAKKzMzMCAxIDU3MzUwMAorMzE4IDEgNTkzNTAwCiszMDkgMSA2MTM1MDAKKzMwNCAxIDYzMzUwMAorMjk4IDEgNjUzNTAwCisyOTQgMSA2NzM1MDAKKzMwMCAxIDY5MzUwMAorMzE0IDEgNzEzNTAwCiszMDQgMSA3MzM1MDAKKzMwNyAxIDc1MzUwMAorMzIxIDEgNzczNTAwCiszMzMgMSA3OTM1MDAKKzMzNSAxIDgxMzUwMAorMzA2IDEgODMzNTAwCiszMTUgMSA4NTM1MDAKKzMyMCAxIDg3MzUwMAorMzE1IDEgODkzNTAwCiszMDggMSA5MTM1MDAKKzMyMCAxIDkzMzUwMAorMzExIDEgOTUzNTAwCiszMTEgMSA5NzM1MDAKKzMxMyAxIDk5MzUwMAorMzE0IDEgMTAxMzUwMAorMzA4IDEgMTAzMzUwMAorMzA3IDEgMTA1MzUwMAorMzE3IDEgMTA3MzUwMAorMzI4IDEgMTA5MzUwMAorMzE3IDEgMTExMzUwMAorMzEyIDEgMTEzMzUwMAorMzA4IDEgMTE1MzUwMAorMzE1IDEgMTE3MzUwMAorMzIwIDEgMTE5MzUwMAorMzIyIDEgMTIxMzUwMAorMzIzIDEgMTIzMzUwMAorMzIyIDEgMTI1MzUwMAorMzIyIDEgMTI3MzUwMAorMzAxIDEgMTI5MzUwMAorMzAzIDEgMTMxMzUwMAorMzA4IDEgMTMzMzUwMAorMjk5IDEgMTM1MzUwMAorMjk3IDEgMTM3MzUwMAorMjkzIDEgMTM5MzUwMAorMjk1IDEgMTQxMzUwMAorMjk3IDEgMTQzMzUwMAorMzAwIDEgMTQ1MzUwMAorMjk0IDEgMTQ3MzUwMAorMjk5IDEgMTQ5MzUwMAorMjk2IDEgMTUxMzUwMAorMzAzIDEgMTUzMzUwMAorMzEzIDEgMTU1MzUwMAorMzA2IDEgMTU3MzUwMAorMzAzIDEgMTU5MzUwMAorMzExIDEgMTYxMzUwMAorMzA3IDEgMTYzMzUwMAorMzEwIDEgMTY1MzUwMAorMzM5IDEgMTY3MzUwMAorMzI1IDEgMTY5MzUwMAorMzIwIDEgMTcxMzUwMAorMzE1IDEgMTczMzUwMAorMzE2IDEgMTc1MzUwMAorMzM4IDEgMTc3MzUwMAorMzI1IDEgMTc5MzUwMAorMzI1IDEgMTgxMzUwMAorMzI4IDEgMTgzMzUwMAorMzA0IDEgMTg1MzUwMAorMjk3IDEgMTg3MzUwMAorMzIyIDEgMTg5MzUwMAorMzExIDEgMTkxMzUwMAorMzA3IDEgMTkzMzUwMAorMzAwIDEgMTk1MzUwMAorMzAxIDEgMTk3MzUwMAorMzA5IDEgMTk5MzUwMAorMzAwIDEgMjAxMzUwMAorMzA2IDEgMjAzMzUwMAorMzA1IDEgMjA1MzUwMAorMjk4IDEgMjA3MzUwMAorMjkxIDEgMjA5MzUwMAorMzAxIDEgMjExMzUwMAorMzAwIDEgMjEzMzUwMAorNDM5IDEgMjE1MzUwMAorMjkyIDEgMjE3MzUwMAorMzA4IDEgMjE5MzUwMAorMzA1IDEgMjIxMzUwMAorMjk4IDEgMjIzMzUwMAorMjk3IDEgMjI1MzUwMAorMjkzIDEgMjI3MzUwMAorNDA4IDEgMjI5MzUwMAorMjk4IDEgMjMxMzUwMAorNDUyIDEgMjMzMzUwMAorMjk3IDEgMjM1MzUwMAorMzAzIDEgMjM3MzUwMAorMzAwIDEgMjM5MzUwMAorMzEwIDEgMjQxMzUwMAorMjk5IDEgMjQzMzUwMAorMzA2IDEgMjQ1MzUwMAorMzE2IDEgMjQ3MzUwMAorMzA4IDEgMjQ5MzUwMAorMzEzIDEgMjUxMzUwMAorMzA5IDEgMjUzMzUwMAorMzEwIDEgMjU1MzUwMAorMzE1IDEgMjU3MzUwMAorMzA5IDEgMjU5MzUwMAorMzE3IDEgMjYxMzUwMAorMzExIDEgMjYzMzUwMAorMzI4IDEgMjY1MzUwMAorMzMzIDEgMjY3MzUwMAorMzI2IDEgMjY5MzUwMAorMzIzIDEgMjcxMzUwMAorMzE2IDEgMjczMzUwMAorMzI1IDEgMjc1MzUwMAorMzE2IDEgMjc3MzUwMAorMzE5IDEgMjc5MzUwMAorMzI2IDEgMjgxMzUwMAorMzIwIDEgMjgzMzUwMAorMzI4IDEgMjg1MzUwMAorMzEyIDEgMjg3MzUwMAorMzE0IDEgMjg5MzUwMAorMzA5IDEgMjkxMzUwMAorMzA2IDEgMjkzMzUwMAorMjk1IDEgMjk1MzUwMAorMzA0IDEgMjk3MzUwMAorMzI2IDEgMjk5MzUwMAorMjkxIDEgMzAxMzUwMAorMjk5IDEgMzAzMzUwMAorMjkzIDEgMzA1MzUwMAorMjg4IDEgMzA3MzUwMAorMjk0IDEgMzA5MzUwMAorMjkyIDEgMzExMzUwMAorMjkyIDEgMzEzMzUwMAorMjg4IDEgMzE1MzUwMAorMzA4IDEgMzE3MzUwMAorMzA0IDEgMzE5MzUwMAorMjkyIDEgMzIxMzUwMAorMzgyIDEgMzIzMzUwMAorMzgxIDEgMzI1MzUwMAorMjk5IDEgMzI3MzUwMAorMzE2IDEgMzI5MzUwMAorMzA4IDEgMzMxMzUwMAorMzAxIDEgMzMzMzUwMAorMjk3IDEgMzM1MzUwMAorMjk5IDEgMzM3MzUwMAorMjk0IDEgMzM5MzUwMAorMjk1IDEgMzQxMzUwMAorMzE3IDEgMzQzMzUwMAorMjk3IDEgMzQ1MzUwMAorMzA5IDEgMzQ3MzUwMAorMzEzIDEgMzQ5MzUwMAorMzIwIDEgMzUxMzUwMAorMzI5IDEgMzUzMzUwMAorMzMwIDEgMzU1MzUwMAorMzI0IDEgMzU3MzUwMAorMzI0IDEgMzU5MzUwMAorMzA5IDEgMzYxMzUwMAorMzA0IDEgMzYzMzUwMAorMzEzIDEgMzY1MzUwMAorMzEyIDEgMzY3MzUwMAorMjk5IDEgMzY5MzUwMAorMjk1IDEgMzcxMzUwMAorMzAxIDEgMzczMzUwMAorMjk1IDEgMzc1MzUwMAorMjk3IDEgMzc3MzUwMAorMzAyIDEgMzc5MzUwMAorMjk4IDEgMzgxMzUwMAorMjk5IDEgMzgzMzUwMAorMjk2IDEgMzg1MzUwMAorMjkyIDEgMzg3MzUwMAorMzA3IDEgMzg5MzUwMAorMzAzIDEgMzkxMzUwMAorMzEzIDEgMzkzMzUwMAorMzE4IDEgMzk1MzUwMAorMzEzIDEgMzk3MzUwMAorMzUzIDEgMzk5MzUwMAorMzcxIDEgNDAxMzUwMAorMjkyIDEgNDAzMzUwMAorMzAwIDEgNDA1MzUwMAorMzgxIDEgNDA3MzUwMAorMjk0IDEgNDA5MzUwMAorMzAxIDEgNDExMzUwMAorMzA1IDEgNDEzMzUwMAorMjk5IDEgNDE1MzUwMAorMzA1IDEgNDE3MzUwMAorMzIyIDEgNDE5MzUwMAorMzE1IDEgNDIxMzUwMAorMzI2IDEgNDIzMzUwMAorMzM4IDEgNDI1MzUwMAorMzIwIDEgNDI3MzUwMAorMzE5IDEgNDI5MzUwMAorMzI3IDEgNDMxMzUwMAorMzMwIDEgNDMzMzUwMAorMzEwIDEgNDM1MzUwMAorMzAzIDEgNDM3MzUwMAorMjk5IDEgNDM5MzUwMAorMjkzIDEgNDQxMzUwMAorMjkzIDEgNDQzMzUwMAorMjk0IDEgNDQ1MzUwMAorMjk1IDEgNDQ3MzUwMAorMjk1IDEgNDQ5MzUwMAorMzIzIDEgNDUxMzUwMAorMzA5IDEgNDUzMzUwMAorMzA5IDEgNDU1MzUwMAorMzAxIDEgNDU3MzUwMAorNDczIDEgNDU5MzUwMAorMjkxIDEgNDYxMzUwMAorMjk3IDEgNDYzMzUwMAorMjk0IDEgNDY1MzUwMAorMjkzIDEgNDY3MzUwMAorMzA0IDEgNDY5MzUwMAorMjkyIDEgNDcxMzUwMAorMzAyIDEgNDczMzUwMAorMjk2IDEgNDc1MzUwMAorMjk4IDEgNDc3MzUwMAorMzAxIDEgNDc5MzUwMAorMzA3IDEgNDgxMzUwMAorMjg1IDEgNDgzMzUwMAorMjk0IDEgNDg1MzUwMAorMzA0IDEgNDg3MzUwMAorMjk0IDEgNDg5MzUwMAorMjk1IDEgNDkxMzUwMAorMzI1IDEgNDkzMzUwMAorMzE5IDEgNDk1MzUwMAorMzIzIDEgNDk3MzUwMAorMzEzIDEgNDk5MzUwMAorMzAzIDEgNTAxMzUwMAorMjk2IDEgNTAzMzUwMAorMjk1IDEgNTA1MzUwMAorMjkwIDEgNTA3MzUwMAorMjk3IDEgNTA5MzUwMAorMjk2IDEgNTExMzUwMAorMjk2IDEgNTEzMzUwMAorMjkyIDEgNTE1MzUwMAorMjk1IDEgNTE3MzUwMAorMjg3IDEgNTE5MzUwMAorMjk0IDEgNTIxMzUwMAorMjkwIDEgNTIzMzUwMAorMjk3IDEgNTI1MzUwMAorMjk3IDEgNTI3MzUwMAorMjk3IDEgNTI5MzUwMAorMjkyIDEgNTMxMzUwMAorMjk3IDEgNTMzMzUwMAorMjkwIDEgNTM1MzUwMAorMjkzIDEgNTM3MzUwMAorMjkzIDEgNTM5MzUwMAorMjkxIDEgNTQxMzUwMAorMjkyIDEgNTQzMzUwMAorMjkwIDEgNTQ1MzUwMAorMjkxIDEgNTQ3MzUwMAorMjk2IDEgNTQ5MzUwMAorMjk1IDEgNTUxMzUwMAorMzI3IDEgNTUzMzUwMAorMjkzIDEgNTU1MzUwMAorMjkxIDEgNTU3MzUwMAorMjkxIDEgNTU5MzUwMAorMzExIDEgNTYxMzUwMAorMjkxIDEgNTYzMzUwMAorMjk0IDEgNTY1MzUwMAorMjk2IDEgNTY3MzUwMAorMjk1IDEgNTY5MzUwMAorMjg5IDEgNTcxMzUwMAorMjk1IDEgNTczMzUwMAorMjk1IDEgNTc1MzUwMAorMjk3IDEgNTc3MzUwMAorMjkyIDEgNTc5MzUwMAorMjk3IDEgNTgxMzUwMAorMjkyIDEgNTgzMzUwMAorMjk1IDEgNTg1MzUwMAorMjk2IDEgNTg3MzUwMAorMjk1IDEgNTg5MzUwMAorMzAzIDEgNTkxMzUwMAorMzA0IDEgNTkzMzUwMAorMzAxIDEgNTk1MzUwMAorMzA3IDEgNTk3MzUwMAorMzA0IDEgNTk5MzUwMAorMzEwIDEgNjAxMzUwMAorMzEwIDEgNjAzMzUwMAorMzA1IDEgNjA1MzUwMAorMzAxIDEgNjA3MzUwMAorMzAyIDEgNjA5MzUwMAorMzA1IDEgNjExMzUwMAorMjk4IDEgNjEzMzUwMAorMzAwIDEgNjE1MzUwMAorMzAwIDEgNjE3MzUwMAorMjkyIDEgNjE5MzUwMAorMjk3IDEgNjIxMzUwMAorMzAxIDEgNjIzMzUwMAorMjk3IDEgNjI1MzUwMAorMjk3IDEgNjI3MzUwMAorMjk4IDEgNjI5MzUwMAorMjk3IDEgNjMxMzUwMAorMzAwIDEgNjMzMzUwMAorMjkzIDEgNjM1MzUwMAorMjkzIDEgNjM3MzUwMAorMjk3IDEgNjM5MzUwMAorMjk0IDEgNjQxMzUwMAorMzA3IDEgNjQzMzUwMAorMzAyIDEgNjQ1MzUwMAorMzA3IDEgNjQ3MzUwMAorMzIwIDEgNjQ5MzUwMAorMzMwIDEgNjUxMzUwMAorMzMzIDEgNjUzMzUwMAorMzM3IDEgNjU1MzUwMAorMzMxIDEgNjU3MzUwMAorMzIzIDEgNjU5MzUwMAorMzEyIDEgNjYxMzUwMAorMzI2IDEgNjYzMzUwMAorMzI4IDEgNjY1MzUwMAorMzMyIDEgNjY3MzUwMAorMzMzIDEgNjY5MzUwMAorMzQwIDEgNjcxMzUwMAorMzM2IDEgNjczMzUwMAorMzI0IDEgNjc1MzUwMAorMzEyIDEgNjc3MzUwMAorMzAxIDEgNjc5MzUwMAorMjg5IDEgNjgxMzUwMAorMzAyIDEgNjgzMzUwMAorMjk2IDEgNjg1MzUwMAorMjk5IDEgNjg3MzUwMAorMjg5IDEgNjg5MzUwMAorMjk1IDEgNjkxMzUwMAorMjk5IDEgNjkzMzUwMAorMzc0IDEgNjk1MzUwMAorMzkxIDEgNjk3MzUwMAorMzY1IDEgNjk5MzUwMAorMzQwIDEgNzAxMzUwMAorMzMwIDEgNzAzMzUwMAorMzM3IDEgNzA1MzUwMAorMzI4IDEgNzA3MzUwMAorMzI5IDEgNzA5MzUwMAorMzE5IDEgNzExMzUwMAorMzEyIDEgNzEzMzUwMAorMzA4IDEgNzE1MzUwMAorMzA0IDEgNzE3MzUwMAorMzEyIDEgNzE5MzUwMAorMzExIDEgNzIxMzUwMAorMzE2IDEgNzIzMzUwMAorMjk5IDEgNzI1MzUwMAorMzMwIDEgNzI3MzUwMAorMzMwIDEgNzI5MzUwMAorMzMwIDEgNzMxMzUwMAorMzQyIDEgNzMzMzUwMAorNDM5IDEgNzM1MzUwMAorMzIyIDEgNzM3MzUwMAorMjk4IDEgNzM5MzUwMAorMjkzIDEgNzQxMzUwMAorMzEwIDEgNzQzMzUwMAorMzAzIDEgNzQ1MzUwMAorMzE3IDEgNzQ3MzUwMAorNDUzIDEgNzQ5MzUwMAorMzc3IDEgNzUxMzUwMAorMzc0IDEgNzUzMzUwMAorMjkyIDEgNzU1MzUwMAorMjk1IDEgNzU3MzUwMAorMjc0IDEgNzU5MzUwMAorMjkyIDEgNzYxMzUwMAorMjkxIDEgNzYzMzUwMAorMzY3IDEgNzY1MzUwMAorMjk1IDEgNzY3MzUwMAorMjk4IDEgNzY5MzUwMAorMjk3IDEgNzcxMzUwMAorMzAxIDEgNzczMzUwMAorMjkyIDEgNzc1MzUwMAorMzQ0IDEgNzc3MzUwMAorMjk2IDEgNzc5MzUwMAorMjk3IDEgNzgxMzUwMAorMzA2IDEgNzgzMzUwMAorMzA4IDEgNzg1MzUwMAorMzA1IDEgNzg3MzUwMAorMzEzIDEgNzg5MzUwMAorMzA2IDEgNzkxMzUwMAorMzIyIDEgNzkzMzUwMAorMzEzIDEgNzk1MzUwMAorMzA1IDEgNzk3MzUwMAorMzA0IDEgNzk5MzUwMAorMzEzIDEgODAxMzUwMAorMzI0IDEgODAzMzUwMAorMzEyIDEgODA1MzUwMAorMzE4IDEgODA3MzUwMAorMzExIDEgODA5MzUwMAorMzAyIDEgODExMzUwMAorMzA1IDEgODEzMzUwMAorMzEyIDEgODE1MzUwMAorMzEzIDEgODE3MzUwMAorMzEyIDEgODE5MzUwMAorMzM1IDEgODIxMzUwMAorMzMzIDEgODIzMzUwMAorMzQ2IDEgODI1MzUwMAorMzM5IDEgODI3MzUwMAorMzM3IDEgODI5MzUwMAorMzQxIDEgODMxMzUwMAorMzM1IDEgODMzMzUwMAorMzI1IDEgODM1MzUwMAorMzI0IDEgODM3MzUwMAorMzE3IDEgODM5MzUwMAorMzE1IDEgODQxMzUwMAorMzAzIDEgODQzMzUwMAorMzE3IDEgODQ1MzUwMAorNDUyIDEgODQ3MzUwMAorMzI0IDEgODQ5MzUwMAorMzIxIDEgODUxMzUwMAorMzM1IDEgODUzMzUwMAorMzI3IDEgODU1MzUwMAorMzE1IDEgODU3MzUwMAorMzIxIDEgODU5MzUwMAorMzE5IDEgODYxMzUwMAorMzA4IDEgODYzMzUwMAorMzE0IDEgODY1MzUwMAorMzIyIDEgODY3MzUwMAorMzI4IDEgODY5MzUwMAorMzIwIDEgODcxMzUwMAorMzI0IDEgODczMzUwMAorMzMxIDEgODc1MzUwMAorMzMwIDEgODc3MzUwMAorMzI4IDEgODc5MzUwMAorMzE4IDEgODgxMzUwMAorMzE0IDEgODgzMzUwMAorMzE4IDEgODg1MzUwMAorMzE4IDEgODg3MzUwMAorMzI1IDEgODg5MzUwMAorMzM4IDEgODkxMzUwMAorMzQxIDEgODkzMzUwMAorMzMzIDEgODk1MzUwMAorMzMwIDEgODk3MzUwMAorMzM4IDEgODk5MzUwMAorMzMzIDEgOTAxMzUwMAorMzMwIDEgOTAzMzUwMAorMzQ0IDEgOTA1MzUwMAorNDc5IDEgOTA3MzUwMAorNDczIDEgOTA5MzUwMAorMzMzIDEgOTExMzUwMAorMzM3IDEgOTEzMzUwMAorNDk1IDEgOTE1MzUwMAorMzUzIDEgOTE3MzUwMAorMzUyIDEgOTE5MzUwMAorMzQ0IDEgOTIxMzUwMAorMzM2IDEgOTIzMzUwMAorMzI0IDEgOTI1MzUwMAorMzIxIDEgOTI3MzUwMAorMzUwIDEgOTI5MzUwMAorMzQ3IDEgOTMxMzUwMAorMzQzIDEgOTMzMzUwMAorMzQ1IDEgOTM1MzUwMAorMzM3IDEgOTM3MzUwMAorMzM1IDEgOTM5MzUwMAorMzMzIDEgOTQxMzUwMAorMzM2IDEgOTQzMzUwMAorMzM0IDEgOTQ1MzUwMAorMzMzIDEgOTQ3MzUwMAorMzMxIDEgOTQ5MzUwMAorMzI5IDEgOTUxMzUwMAorMzE5IDEgOTUzMzUwMAorMzIxIDEgOTU1MzUwMAorMzE2IDEgOTU3MzUwMAorMzIyIDEgOTU5MzUwMAorNDQ4IDEgOTYxMzUwMAorMzEyIDEgOTYzMzUwMAorMzA2IDEgOTY1MzUwMAorMzAxIDEgOTY3MzUwMAorMzAzIDEgOTY5MzUwMAorMjk2IDEgOTcxMzUwMAorMzAwIDEgOTczMzUwMAorMjk1IDEgOTc1MzUwMAorMzAwIDEgOTc3MzUwMAorMjk3IDEgOTc5MzUwMAorMzAwIDEgOTgxMzUwMAorMjk3IDEgOTgzMzUwMAorNTEyIDEgOTg1MzUwMAorMjkyIDEgOTg3MzUwMAorNDY4IDEgOTg5MzUwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZiODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJmNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0OWViMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUyNGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KQEAgLTAsMCArMSwxMCBAQAorMTYzODQgMSAwCisxNjM4NCAxIDEwMjQwMDAKKzE2Mzg0IDEgMjA0ODAwMAorMTYzODQgMSAzMDcyMDAwCisxNjM4NCAxIDQwOTYwMDAKKzE2Mzg0IDEgNTEyMDAwMAorMTYzODQgMSA2MTQ0MDAwCisxNjM4NCAxIDcxNjgwMDAKKzE2Mzg0IDEgODE5MjAwMAorMTA5MjQgMSA5MjE2MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGIyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE2ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDUyMCBAQAorMzAgMzIgMAorNDE0MCAzMiAwCiszMyAzMiAwCis1MiAxIDAKKzU4IDEgMjY2NgorNjEgMSA1MzMzCis1NiAxIDgwMDAKKzU5IDEgMTA2NjYKKzYzIDEgMTMzMzMKKzY2IDEgMTYwMDAKKzcxIDEgMTg2NjYKKzc2IDEgMjEzMzMKKzM3NCAxIDI0MDAwCiszNjYgMSAzNjAwMAorMzc4IDEgNTczMzMKKzM5MyAxIDc4NjY2CiszOTMgMSAxMDAwMDAKKzM4NiAxIDEyMTMzMworMzc1IDEgMTQyNjY2CiszODggMSAxNjQwMDAKKzM3OCAxIDE4NTMzMworMzc5IDEgMjA2NjY2CiszNzQgMSAyMjgwMDAKKzM1NiAxIDI0OTMzMworMzU4IDEgMjcwNjY2CiszMzIgMSAyOTIwMDAKKzMzNSAxIDMxMzMzMworMzYzIDEgMzM0NjY2CiszNDEgMSAzNTYwMDAKKzM2MCAxIDM3NzMzMworMzQxIDEgMzk4NjY2CiszMzUgMSA0MjAwMDAKKzM1NyAxIDQ0MTMzMworMzU1IDEgNDYyNjY2CiszNjMgMSA0ODQwMDAKKzM4MiAxIDUwNTMzMworMzcxIDEgNTI2NjY2CiszNTcgMSA1NDgwMDAKKzM1MyAxIDU2OTMzMworMzUwIDEgNTkwNjY2CiszMjcgMSA2MTIwMDAKKzMxNSAxIDYzMzMzMworMzA3IDEgNjU0NjY2CiszMDMgMSA2NzYwMDAKKzI5NSAxIDY5NzMzMworMzEyIDEgNzE4NjY2CiszMTYgMSA3NDAwMDAKKzMxNSAxIDc2MTMzMworMzE4IDEgNzgyNjY2CiszMzAgMSA4MDQwMDAKKzMxOCAxIDgyNTMzMworMzE1IDEgODQ2NjY2CiszMjIgMSA4NjgwMDAKKzMxNSAxIDg4OTMzMworMzEwIDEgOTEwNjY2CiszMTUgMSA5MzIwMDAKKzMxNCAxIDk1MzMzMworMzAyIDEgOTc0NjY2CiszMTMgMSA5OTYwMDAKKzMyMiAxIDEwMTczMzMKKzMyMyAxIDEwMzg2NjYKKzMxOSAxIDEwNjAwMDAKKzMyNSAxIDEwODEzMzMKKzMyOCAxIDExMDI2NjYKKzMzMCAxIDExMjQwMDAKKzMzMyAxIDExNDUzMzMKKzMzMCAxIDExNjY2NjYKKzM0NCAxIDExODgwMDAKKzMzMSAxIDEyMDkzMzMKKzM0MiAxIDEyMzA2NjYKKzMzOSAxIDEyNTIwMDAKKzMxNCAxIDEyNzMzMzMKKzI4NSAxIDEyOTQ2NjYKKzI5NSAxIDEzMTYwMDAKKzMwMiAxIDEzMzczMzMKKzMwNSAxIDEzNTg2NjYKKzMwOSAxIDEzODAwMDAKKzMyNyAxIDE0MDEzMzMKKzMwNCAxIDE0MjI2NjYKKzMzNiAxIDE0NDQwMDAKKzM1MCAxIDE0NjUzMzMKKzM0NiAxIDE0ODY2NjYKKzM1MiAxIDE1MDgwMDAKKzM0MSAxIDE1MjkzMzMKKzM0MyAxIDE1NTA2NjYKKzM1MSAxIDE1NzIwMDAKKzMxOSAxIDE1OTMzMzMKKzMyOCAxIDE2MTQ2NjYKKzMyOCAxIDE2MzYwMDAKKzMyNCAxIDE2NTczMzMKKzMzOCAxIDE2Nzg2NjYKKzMxNyAxIDE3MDAwMDAKKzMyOCAxIDE3MjEzMzMKKzMzNSAxIDE3NDI2NjYKKzM0MSAxIDE3NjQwMDAKKzMzNSAxIDE3ODUzMzMKKzM0OCAxIDE4MDY2NjYKKzM2MiAxIDE4MjgwMDAKKzM2MSAxIDE4NDkzMzMKKzM0NCAxIDE4NzA2NjYKKzM0MCAxIDE4OTIwMDAKKzMzMyAxIDE5MTMzMzMKKzMyOSAxIDE5MzQ2NjYKKzMyOCAxIDE5NTYwMDAKKzMyMyAxIDE5NzczMzMKKzMxMCAxIDE5OTg2NjYKKzMxOCAxIDIwMjAwMDAKKzMxMiAxIDIwNDEzMzMKKzI5NSAxIDIwNjI2NjYKKzMyOSAxIDIwODQwMDAKKzMxOCAxIDIxMDUzMzMKKzMxMSAxIDIxMjY2NjYKKzMxNyAxIDIxNDgwMDAKKzYyIDEgMjE2OTMzMworNzUgMSAyMTgxMzMzCis3MyAxIDIxODQwMDAKKzMzMiAxIDIxODY2NjYKKzMyNyAxIDIxOTg2NjYKKzMzMiAxIDIyMjAwMDAKKzMyNSAxIDIyNDEzMzMKKzMyOSAxIDIyNjI2NjYKKzMzMCAxIDIyODQwMDAKKzYxIDEgMjMwNTMzMworNjEgMSAyMzE3MzMzCis3MCAxIDIzMjAwMDAKKzcwIDEgMjMyMjY2NgorMzE5IDEgMjMyNTMzMworMzAzIDEgMjMzNzMzMworMjkyIDEgMjM1ODY2NgorMzEzIDEgMjM4MDAwMAorMzE4IDEgMjQwMTMzMworMzQ2IDEgMjQyMjY2NgorMzI4IDEgMjQ0NDAwMAorMzE2IDEgMjQ2NTMzMworMzQxIDEgMjQ4NjY2NgorMzI4IDEgMjUwODAwMAorMzM4IDEgMjUyOTMzMworMzQxIDEgMjU1MDY2NgorMzM3IDEgMjU3MjAwMAorMzQ3IDEgMjU5MzMzMworMzg0IDEgMjYxNDY2NgorMzU4IDEgMjYzNjAwMAorMzYzIDEgMjY1NzMzMworMzYzIDEgMjY3ODY2NgorMzU4IDEgMjcwMDAwMAorMzM5IDEgMjcyMTMzMworMzY5IDEgMjc0MjY2NgorMzQzIDEgMjc2NDAwMAorMzQ4IDEgMjc4NTMzMworMzYzIDEgMjgwNjY2NgorMzUwIDEgMjgyODAwMAorMzU4IDEgMjg0OTMzMworMzUyIDEgMjg3MDY2NgorMzM4IDEgMjg5MjAwMAorMzM1IDEgMjkxMzMzMworMzQyIDEgMjkzNDY2NgorMzM4IDEgMjk1NjAwMAorMzQwIDEgMjk3NzMzMworMjkyIDEgMjk5ODY2NgorMjc5IDEgMzAyMDAwMAorMjk5IDEgMzA0MTMzMworMzAzIDEgMzA2MjY2NgorMjk4IDEgMzA4NDAwMAorMjk3IDEgMzEwNTMzMworMjgwIDEgMzEyNjY2NgorMjk3IDEgMzE0ODAwMAorMjkwIDEgMzE2OTMzMworMzA2IDEgMzE5MDY2NgorMzAxIDEgMzIxMjAwMAorMzA2IDEgMzIzMzMzMworMjg5IDEgMzI1NDY2NgorMzExIDEgMzI3NjAwMAorMzE3IDEgMzI5NzMzMworMzQ0IDEgMzMxODY2NgorMzA4IDEgMzM0MDAwMAorMzA0IDEgMzM2MTMzMworMzA0IDEgMzM4MjY2NgorMzEyIDEgMzQwNDAwMAorMzA1IDEgMzQyNTMzMworMjk5IDEgMzQ0NjY2NgorMzAxIDEgMzQ2ODAwMAorMzE4IDEgMzQ4OTMzMworMzEzIDEgMzUxMDY2NgorMzMwIDEgMzUzMjAwMAorMzI1IDEgMzU1MzMzMworMzI1IDEgMzU3NDY2NgorMzIxIDEgMzU5NjAwMAorMzQ5IDEgMzYxNzMzMworMjg4IDEgMzYzODY2NgorMzAwIDEgMzY2MDAwMAorMzEyIDEgMzY4MTMzMworMzAyIDEgMzcwMjY2NgorMjc4IDEgMzcyNDAwMAorMjg0IDEgMzc0NTMzMworMjg2IDEgMzc2NjY2NgorMjc0IDEgMzc4ODAwMAorMjk1IDEgMzgwOTMzMworMjgxIDEgMzgzMDY2NgorMjg4IDEgMzg1MjAwMAorMjc4IDEgMzg3MzMzMworMzA2IDEgMzg5NDY2NgorNjIgMSAzOTE2MDAwCis1OSAxIDM5MjgwMDAKKzYxIDEgMzkzMDY2NgorNTUgMSAzOTMzMzMzCis3MCAxIDM5MzYwMDAKKzcyIDEgMzkzODY2NgorMzI0IDEgMzk0MTMzMworMzA5IDEgMzk1MzMzMworMzAxIDEgMzk3NDY2NgorMzAxIDEgMzk5NjAwMAorMjkxIDEgNDAxNzMzMworMjg5IDEgNDAzODY2NgorMzA2IDEgNDA2MDAwMAorMzA1IDEgNDA4MTMzMworMjg2IDEgNDEwMjY2NgorMjk0IDEgNDEyNDAwMAorMjkwIDEgNDE0NTMzMworMjk3IDEgNDE2NjY2NgorMzA4IDEgNDE4ODAwMAorMjk2IDEgNDIwOTMzMworMjkyIDEgNDIzMDY2NgorMjg3IDEgNDI1MjAwMAorMjkxIDEgNDI3MzMzMworMjk4IDEgNDI5NDY2NgorMjk1IDEgNDMxNjAwMAorMjk0IDEgNDMzNzMzMworMjk1IDEgNDM1ODY2NgorMjc1IDEgNDM4MDAwMAorMjgwIDEgNDQwMTMzMworMjg4IDEgNDQyMjY2NgorMjg1IDEgNDQ0NDAwMAorMjc0IDEgNDQ2NTMzMworMjk4IDEgNDQ4NjY2NgorMzAxIDEgNDUwODAwMAorMzAwIDEgNDUyOTMzMworMzA1IDEgNDU1MDY2NgorMjk3IDEgNDU3MjAwMAorNTkgMSA0NTkzMzMzCis1NiAxIDQ2MDUzMzMKKzU3IDEgNDYwODAwMAorNTUgMSA0NjEwNjY2Cis1OCAxIDQ2MTMzMzMKKzU3IDEgNDYxNjAwMAorNTggMSA0NjE4NjY2Cis2OCAxIDQ2MjEzMzMKKzY3IDEgNDYyNDAwMAorNzEgMSA0NjI2NjY2CisyODkgMSA0NjI5MzMzCisyODIgMSA0NjQxMzMzCisyNzMgMSA0NjYyNjY2CisyNzkgMSA0Njg0MDAwCisyODYgMSA0NzA1MzMzCisyODIgMSA0NzI2NjY2CisyODQgMSA0NzQ4MDAwCisyNzggMSA0NzY5MzMzCisyODEgMSA0NzkwNjY2CisyODAgMSA0ODEyMDAwCisyNjMgMSA0ODMzMzMzCisyNjAgMSA0ODU0NjY2CisyNzEgMSA0ODc2MDAwCisyNzMgMSA0ODk3MzMzCisyODIgMSA0OTE4NjY2CisyNzkgMSA0OTQwMDAwCisyOTcgMSA0OTYxMzMzCisyOTEgMSA0OTgyNjY2CiszMDkgMSA1MDA0MDAwCisyODMgMSA1MDI1MzMzCisyOTIgMSA1MDQ2NjY2CiszMDQgMSA1MDY4MDAwCisyOTYgMSA1MDg5MzMzCisyOTMgMSA1MTEwNjY2CisyODIgMSA1MTMyMDAwCisyNzMgMSA1MTUzMzMzCisyODQgMSA1MTc0NjY2CisyODEgMSA1MTk2MDAwCisyNjUgMSA1MjE3MzMzCisyNzIgMSA1MjM4NjY2CisyNzcgMSA1MjYwMDAwCisyODAgMSA1MjgxMzMzCisyNzYgMSA1MzAyNjY2CisyNzMgMSA1MzI0MDAwCisyNzggMSA1MzQ1MzMzCisyODAgMSA1MzY2NjY2CisyODAgMSA1Mzg4MDAwCisyNjggMSA1NDA5MzMzCisyODIgMSA1NDMwNjY2CisyNzcgMSA1NDUyMDAwCisyNzQgMSA1NDczMzMzCisyNzUgMSA1NDk0NjY2CisyNzAgMSA1NTE2MDAwCisyODIgMSA1NTM3MzMzCisyNzkgMSA1NTU4NjY2CisyNjAgMSA1NTgwMDAwCisyNzIgMSA1NjAxMzMzCisyNzUgMSA1NjIyNjY2CisyNzMgMSA1NjQ0MDAwCisyNzYgMSA1NjY1MzMzCisyODggMSA1Njg2NjY2CisyOTQgMSA1NzA4MDAwCisyNzEgMSA1NzI5MzMzCisyNzcgMSA1NzUwNjY2CisyODggMSA1NzcyMDAwCisyNzYgMSA1NzkzMzMzCisyODIgMSA1ODE0NjY2CisyNzYgMSA1ODM2MDAwCisyNzUgMSA1ODU3MzMzCisyNjggMSA1ODc4NjY2CisyNzAgMSA1OTAwMDAwCisyNjYgMSA1OTIxMzMzCisyNjggMSA1OTQyNjY2CisyODIgMSA1OTY0MDAwCisyNzkgMSA1OTg1MzMzCisyNzkgMSA2MDA2NjY2CisyODcgMSA2MDI4MDAwCisyODYgMSA2MDQ5MzMzCisyODAgMSA2MDcwNjY2CisyOTAgMSA2MDkyMDAwCisyNjYgMSA2MTEzMzMzCisyOTIgMSA2MTM0NjY2CisyNjQgMSA2MTU2MDAwCisyNzEgMSA2MTc3MzMzCisyNzcgMSA2MTk4NjY2CisyOTIgMSA2MjIwMDAwCisyOTggMSA2MjQxMzMzCisyODQgMSA2MjYyNjY2CisyODcgMSA2Mjg0MDAwCisyNzUgMSA2MzA1MzMzCisyOTEgMSA2MzI2NjY2CisyODcgMSA2MzQ4MDAwCisyODMgMSA2MzY5MzMzCisyODQgMSA2MzkwNjY2CisyNzEgMSA2NDEyMDAwCisyODIgMSA2NDMzMzMzCisyNzcgMSA2NDU0NjY2CisyODIgMSA2NDc2MDAwCisyODUgMSA2NDk3MzMzCisyODAgMSA2NTE4NjY2CisyNzEgMSA2NTQwMDAwCisyODkgMSA2NTYxMzMzCisyODcgMSA2NTgyNjY2CisyOTQgMSA2NjA0MDAwCisyNzcgMSA2NjI1MzMzCisyODEgMSA2NjQ2NjY2CisyNzQgMSA2NjY4MDAwCisyNzEgMSA2Njg5MzMzCisyNzkgMSA2NzEwNjY2CisyODggMSA2NzMyMDAwCisyODAgMSA2NzUzMzMzCisyODQgMSA2Nzc0NjY2CisyNzggMSA2Nzk2MDAwCisyNzYgMSA2ODE3MzMzCisyNzUgMSA2ODM4NjY2CisyNjMgMSA2ODYwMDAwCisyNjYgMSA2ODgxMzMzCisyNDcgMSA2OTAyNjY2CisyNjkgMSA2OTI0MDAwCisyNjMgMSA2OTQ1MzMzCisyODMgMSA2OTY2NjY2CisyODAgMSA2OTg4MDAwCisyODEgMSA3MDA5MzMzCisyOTkgMSA3MDMwNjY2CisyODUgMSA3MDUyMDAwCisyODggMSA3MDczMzMzCisyOTkgMSA3MDk0NjY2CisyODggMSA3MTE2MDAwCisyNzkgMSA3MTM3MzMzCisyNzYgMSA3MTU4NjY2CisyNzcgMSA3MTgwMDAwCisyODIgMSA3MjAxMzMzCisyODUgMSA3MjIyNjY2CisyOTUgMSA3MjQ0MDAwCisyOTQgMSA3MjY1MzMzCiszMDQgMSA3Mjg2NjY2CisyODIgMSA3MzA4MDAwCisyOTkgMSA3MzI5MzMzCisyODMgMSA3MzUwNjY2CisyODIgMSA3MzcyMDAwCisyODcgMSA3MzkzMzMzCiszMDYgMSA3NDE0NjY2CiszMDQgMSA3NDM2MDAwCisyODkgMSA3NDU3MzMzCisyOTkgMSA3NDc4NjY2CisyODEgMSA3NTAwMDAwCisyODEgMSA3NTIxMzMzCis2NiAxIDc1NDI2NjYKKzYzIDEgNzU1NDY2NgorMjg5IDEgNzU1NzMzMworMjcwIDEgNzU2OTMzMworMjU3IDEgNzU5MDY2NgorMjQ2IDEgNzYxMjAwMAorMjY0IDEgNzYzMzMzMworMjgwIDEgNzY1NDY2NgorMjczIDEgNzY3NjAwMAorMjg1IDEgNzY5NzMzMworMjY3IDEgNzcxODY2NgorMjc1IDEgNzc0MDAwMAorMjc4IDEgNzc2MTMzMworMjkzIDEgNzc4MjY2NgorMjgxIDEgNzgwNDAwMAorMjk3IDEgNzgyNTMzMworMjk0IDEgNzg0NjY2NgorMjg2IDEgNzg2ODAwMAorMjkwIDEgNzg4OTMzMworMjkwIDEgNzkxMDY2NgorMjg5IDEgNzkzMjAwMAorMjg2IDEgNzk1MzMzMworMjgyIDEgNzk3NDY2NgorMzA2IDEgNzk5NjAwMAorMjg3IDEgODAxNzMzMworMzEyIDEgODAzODY2NgorMzEyIDEgODA2MDAwMAorMzA3IDEgODA4MTMzMworMjkzIDEgODEwMjY2NgorMjg5IDEgODEyNDAwMAorMjg1IDEgODE0NTMzMworMjkwIDEgODE2NjY2NgorMjg1IDEgODE4ODAwMAorMzExIDEgODIwOTMzMworMzA3IDEgODIzMDY2NgorMzE0IDEgODI1MjAwMAorMzE4IDEgODI3MzMzMworMzE5IDEgODI5NDY2NgorMzE1IDEgODMxNjAwMAorMzAwIDEgODMzNzMzMworMjk1IDEgODM1ODY2NgorMjkxIDEgODM4MDAwMAorMjgyIDEgODQwMTMzMworMjk1IDEgODQyMjY2NgorMjk2IDEgODQ0NDAwMAorMjg4IDEgODQ2NTMzMworMzA0IDEgODQ4NjY2NgorMjk5IDEgODUwODAwMAorMjk4IDEgODUyOTMzMworMzA1IDEgODU1MDY2NgorMjk1IDEgODU3MjAwMAorMjk2IDEgODU5MzMzMworMjk1IDEgODYxNDY2NgorMjg3IDEgODYzNjAwMAorMjkyIDEgODY1NzMzMworMzA4IDEgODY3ODY2NgorMjg3IDEgODcwMDAwMAorMzA3IDEgODcyMTMzMworMjk1IDEgODc0MjY2NgorMjkyIDEgODc2NDAwMAorMjkyIDEgODc4NTMzMworMjc5IDEgODgwNjY2NgorMjg5IDEgODgyODAwMAorMzAzIDEgODg0OTMzMworMzA3IDEgODg3MDY2NgorMzEwIDEgODg5MjAwMAorMzAwIDEgODkxMzMzMworMjk5IDEgODkzNDY2NgorMjk5IDEgODk1NjAwMAorMjg4IDEgODk3NzMzMworMjkwIDEgODk5ODY2NgorMjkxIDEgOTAyMDAwMAorMzA0IDEgOTA0MTMzMworMjk5IDEgOTA2MjY2NgorMzA0IDEgOTA4NDAwMAorMjkwIDEgOTEwNTMzMworMzA5IDEgOTEyNjY2NgorMzAxIDEgOTE0ODAwMAorMjk2IDEgOTE2OTMzMworMjg4IDEgOTE5MDY2NgorMzA1IDEgOTIxMjAwMAorMzE3IDEgOTIzMzMzMworMjkyIDEgOTI1NDY2NgorMzAwIDEgOTI3NjAwMAorMzAxIDEgOTI5NzMzMworMjk1IDEgOTMxODY2NgorMjgyIDEgOTM0MDAwMAorMjk2IDEgOTM2MTMzMworMjk1IDEgOTM4MjY2NgorMjg3IDEgOTQwNDAwMAorMjkyIDEgOTQyNTMzMworMzAxIDEgOTQ0NjY2NgorMzExIDEgOTQ2ODAwMAorMzAxIDEgOTQ4OTMzMworMzA3IDEgOTUxMDY2NgorMzAwIDEgOTUzMjAwMAorMzA5IDEgOTU1MzMzMworMjk4IDEgOTU3NDY2NgorMzA0IDEgOTU5NjAwMAorNjAgMSA5NjE3MzMzCis1OSAxIDk2MjkzMzMKKzY0IDEgOTYzMjAwMAorNjQgMSA5NjM0NjY2Cis3NyAxIDk2MzczMzMKKzcyIDEgOTY0MDAwMAorMzA2IDEgOTY0MjY2NgorMjk3IDEgOTY1NDY2NgorMjk0IDEgOTY3NjAwMAorMjk1IDEgOTY5NzMzMworMzA4IDEgOTcxODY2NgorMzAzIDEgOTc0MDAwMAorMzA4IDEgOTc2MTMzMworMjg5IDEgOTc4MjY2NgorMzAwIDEgOTgwNDAwMAorMzA0IDEgOTgyNTMzMworMzA4IDEgOTg0NjY2NgorNjQgMSA5ODY4MDAwCis2MyAxIDk4ODAwMDAKKzY0IDEgOTg4MjY2NgorNjQgMSA5ODg1MzMzCis2MCAxIDk4ODgwMDAKKzc0IDEgOTg5MDY2NgorNjkgMSA5ODkzMzMzCis2OCAxIDk4OTYwMDAKKzYxIDEgOTg5ODY2NgorNzEgMSA5OTAxMzMzCis3NiAxIDk5MDQwMDAKKzczIDEgOTkwNjY2NgorNzAgMSA5OTA5MzMzCis3MiAxIDk5MTIwMDAKKzYwIDEgOTkxNDY2NgorNjkgMSA5OTE3MzMzCis4MiAxIDk5MjAwMDAKKzI3OCAxIDk5MjI2NjYKKzMwIDEgOTkzNDY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTAyNzEgMSAwCisxMDYgMCAxNzAwMAorMTM0IDAgMzMwMDAKKzE0OSAwIDUwMDAwCisxNTIgMCA2NzAwMAorMTU5IDAgODMwMDAKKzExNCAwIDEwMDAwMAorNzIzIDAgMTE3MDAwCisxNzUgMCAxMzMwMDAKKzE4NiAwIDE1MDAwMAorMjAxIDAgMTY3MDAwCisyNzAgMCAxODMwMDAKKzM4MyAwIDIwMDAwMAorMjU1IDAgMjE3MDAwCisyODYgMCAyMzMwMDAKKzI3MyAwIDI1MDAwMAorMTIyNCAwIDI2NzAwMAorMjIwIDAgMjgzMDAwCisyMzEgMCAzMDAwMDAKKzE5MiAwIDMxNzAwMAorMTgyIDAgMzMzMDAwCisyODkgMCAzNTAwMDAKKzIwNCAwIDM2NzAwMAorMjM3IDAgMzgzMDAwCisxODcgMCA0MDAwMDAKKzg5OCAwIDQxNzAwMAorMjMxIDAgNDMzMDAwCisyNjYgMCA0NTAwMDAKKzI3OCAwIDQ2NzAwMAorMjA1IDAgNDgzMDAwCisyNTUgMCA1MDAwMDAKKzE2OSAwIDUxNzAwMAorMjMzIDAgNTMzMDAwCisxMDExIDAgNTUwMDAwCisyMDIgMCA1NjcwMDAKKzI1MSAwIDU4MzAwMAorMjIzIDAgNjAwMDAwCisyODMgMCA2MTcwMDAKKzM2MiAwIDYzMzAwMAorMjE3IDAgNjUwMDAwCisyNDUgMCA2NjcwMDAKKzk2MCAwIDY4MzAwMAorMjMzIDAgNzAwMDAwCisyODYgMCA3MTcwMDAKKzI3MiAwIDczMzAwMAorMjU0IDAgNzUwMDAwCiszMzEgMCA3NjcwMDAKKzIxOCAwIDc4MzAwMAorMjYxIDAgODAwMDAwCis5ODEgMCA4MTcwMDAKKzIyNiAwIDgzMzAwMAorMjI2IDAgODUwMDAwCisyNzkgMCA4NjcwMDAKKzIyNSAwIDg4MzAwMAorMjk1IDAgOTAwMDAwCisxNzUgMCA5MTcwMDAKKzI0OSAwIDkzMzAwMAorOTk2IDAgOTUwMDAwCisxNjkgMCA5NjcwMDAKKzIyNCAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMGM3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzg2OTgwIDEgMAorNjc0MSAwIDMzMDAwCis5NDMzIDAgNjcwMDAKKzkzNjMgMCAxMDAwMDAKKzg2NzEgMCAxMzMwMDAKKzkwMDMgMCAxNjcwMDAKKzc3NTEgMCAyMDAwMDAKKzEzMjA3IDAgMjMzMDAwCis4NTQyIDAgMjY3MDAwCis5MzQ0IDAgMzAwMDAwCis4MDY5IDAgMzMzMDAwCis4NTg4IDAgMzY3MDAwCisxMjA4NyAwIDQwMDAwMAorNzMxNSAwIDQzMzAwMAorOTY1NCAwIDQ2NzAwMAorMTMxMDAgMCA1MDAwMDAKKzc4MzIgMCA1MzMwMDAKKzEwMDYwIDAgNTY3MDAwCis4NTQwIDAgNjAwMDAwCis4NjY3IDAgNjMzMDAwCis4NTMyIDAgNjY3MDAwCis2MDE4IDAgNzAwMDAwCis4NTIwIDAgNzMzMDAwCisxNTM1MCAwIDc2NzAwMAorNjExMCAwIDgwMDAwMAorNzg3NiAwIDgzMzAwMAorNjEzMyAwIDg2NzAwMAorOTQ3NiAwIDkwMDAwMAorMTEwMDIgMCA5MzMwMDAKKzc0ODQgMCA5NjcwMDAKKzg3NjAgMCAxMDAwMDAwCisxNjUxNSAwIDEwMzMwMDAKKzc0ODIgMCAxMDY3MDAwCis2OTgzIDAgMTEwMDAwMAorNzU2MSAwIDExMzMwMDAKKzgyNjMgMCAxMTY3MDAwCisxMDY4MiAwIDEyMDAwMDAKKzgxMDggMCAxMjMzMDAwCis3OTI0IDAgMTI2NzAwMAorODY5MyAwIDEzMDAwMDAKKzE0MTkwIDAgMTMzMzAwMAorNzM5MyAwIDEzNjcwMDAKKzY4NjQgMCAxNDAwMDAwCis5NDMxIDAgMTQzMzAwMAorNzY3NCAwIDE0NjcwMDAKKzg0NTggMCAxNTAwMDAwCis1ODk5IDAgMTUzMzAwMAorODI1OSAwIDE1NjcwMDAKKzc5NjMgMCAxNjAwMDAwCisxNDc3OSAwIDE2MzMwMDAKKzY4NzcgMCAxNjY3MDAwCis3MjY4IDAgMTcwMDAwMAorODUyNiAwIDE3MzMwMDAKKzg0NjcgMCAxNzY3MDAwCisxMTIwMCAwIDE4MDAwMDAKKzcyNjEgMCAxODMzMDAwCis4MjgwIDAgMTg2NzAwMAorNjcxOCAwIDE5MDAwMDAKKzE3NzQyIDAgMTkzMzAwMAorNTIwNiAwIDE5NjcwMDAKKzU3MDAgMCAyMDAwMDAwCis1ODcyIDAgMjAzMzAwMAorNzkxNSAwIDIwNjcwMDAKKzg0OTMgMCAyMTAwMDAwCis2NTQ1IDAgMjEzMzAwMAorOTA3MiAwIDIxNjcwMDAKKzEzMjAwIDAgMjIwMDAwMAorOTYzMiAwIDIyMzMwMDAKKzEwMDE2IDAgMjI2NzAwMAorNzgyNCAwIDIzMDAwMDAKKzEwNjI4IDAgMjMzMzAwMAorMTA0MDEgMCAyMzY3MDAwCisxMDg5MiAwIDI0MDAwMDAKKzkwMjMgMCAyNDMzMDAwCisxMDczNCAwIDI0NjcwMDAKKzE1MDQ1IDAgMjUwMDAwMAorNzk0MCAwIDI1MzMwMDAKKzk2NTcgMCAyNTY3MDAwCis4NzQzIDAgMjYwMDAwMAorODA3NCAwIDI2MzMwMDAKKzk0NDUgMCAyNjY3MDAwCis2NDk0IDAgMjcwMDAwMAorODYwMSAwIDI3MzMwMDAKKzEzNDc4IDAgMjc2NzAwMAorNjk0MiAwIDI4MDAwMDAKKzgwMDIgMCAyODMzMDAwCis3OTQwIDAgMjg2NzAwMAorODMyMCAwIDI5MDAwMDAKKzEyMjE1IDAgMjkzMzAwMAorNjY2OCAwIDI5NjcwMDAKKzExMzg0IDAgMzAwMDAwMAorODM3OCAwIDMwMzMwMDAKKzEyOTA4IDAgMzA2NzAwMAorODQyMCAwIDMxMDAwMDAKKzc1MDIgMCAzMTMzMDAwCis4NDgyIDAgMzE2NzAwMAorMTA5NjggMCAzMjAwMDAwCisxMjMzOCAwIDMyMzMwMDAKKzg2NTcgMCAzMjY3MDAwCisxMDQ2OCAwIDMzMDAwMDAKKzEzODc4IDAgMzMzMzAwMAorOTM3NCAwIDMzNjcwMDAKKzk4NTcgMCAzNDAwMDAwCisxMDM4MSAwIDM0MzMwMDAKKzk5ODQgMCAzNDY3MDAwCis5OTU2IDAgMzUwMDAwMAorODkwNSAwIDM1MzMwMDAKKzg2NzIgMCAzNTY3MDAwCis4MTIyIDAgMzYwMDAwMAorOTY3NyAwIDM2MzMwMDAKKzk4MTIgMCAzNjY3MDAwCis5NjIyIDAgMzcwMDAwMAorOTAyMyAwIDM3MzMwMDAKKzcxNDcgMCAzNzY3MDAwCis5MTQ2IDAgMzgwMDAwMAorNzQ4OCAwIDM4MzMwMDAKKzEwODEyIDAgMzg2NzAwMAorODM0MCAwIDM5MDAwMDAKKzEzMjgwIDAgMzkzMzAwMAorNTE2NyAwIDM5NjcwMDAKKzY5OTEgMCA0MDAwMDAwCis2NTQzIDAgNDAzMzAwMAorNTk1MiAwIDQwNjcwMDAKKzUxNjQgMCA0MTAwMDAwCis0MDExIDAgNDEzMzAwMAorMzc5NCAwIDQxNjcwMDAKKzEyOTU5IDAgNDIwMDAwMAorNzEwMjAgMSA0MjMzMDAwCis1MzUxIDAgNDI2NzAwMAorNjI4MyAwIDQzMDAwMDAKKzUwODAgMCA0MzMzMDAwCis2NzA3IDAgNDM2NzAwMAorNTg1NyAwIDQ0MDAwMDAKKzUyMjEgMCA0NDMzMDAwCisxMDk3MiAwIDQ0NjcwMDAKKzcwMjMgMCA0NTAwMDAwCis2OTA3IDAgNDUzMzAwMAorNzg1MSAwIDQ1NjcwMDAKKzQ4NDMgMCA0NjAwMDAwCis2MDg1IDAgNDYzMzAwMAorNDg2OCAwIDQ2NjcwMDAKKzUwOTMgMCA0NzAwMDAwCisxMjgwNyAwIDQ3MzMwMDAKKzYzMzAgMCA0NzY3MDAwCis0MjA5IDAgNDgwMDAwMAorNDU5NiAwIDQ4MzMwMDAKKzYzMTYgMCA0ODY3MDAwCis0OTU0IDAgNDkwMDAwMAorNTUzMyAwIDQ5MzMwMDAKKzc3NDkgMCA0OTY3MDAwCisxMjQ4NiAwIDUwMDAwMDAKKzU0NjggMCA1MDMzMDAwCis0MzUzIDAgNTA2NzAwMAorNTc4NiAwIDUxMDAwMDAKKzU1NTEgMCA1MTMzMDAwCis2NzExIDAgNTE2NzAwMAorNTY4OCAwIDUyMDAwMDAKKzYyNTggMCA1MjMzMDAwCisxMjk3NSAwIDUyNjcwMDAKKzQ4NzMgMCA1MzAwMDAwCis0NTUyIDAgNTMzMzAwMAorNDg0NCAwIDUzNjcwMDAKKzQ3NzQgMCA1NDAwMDAwCis1MDI1IDAgNTQzMzAwMAorNTIwNCAwIDU0NjcwMDAKKzQ4MTQgMCA1NTAwMDAwCisxNDgzNSAwIDU1MzMwMDAKKzUzNDMgMCA1NTY3MDAwCis0ODA4IDAgNTYwMDAwMAorNTA3MSAwIDU2MzMwMDAKKzYzMjQgMCA1NjY3MDAwCis1MjQzIDAgNTcwMDAwMAorNDk5NSAwIDU3MzMwMDAKKzUxMzQgMCA1NzY3MDAwCisxMTA1NCAwIDU4MDAwMDAKKzQ4MDcgMCA1ODMzMDAwCis1MTE4IDAgNTg2NzAwMAorNjQyNCAwIDU5MDAwMDAKKzQ5ODQgMCA1OTMzMDAwCis3MTg3IDAgNTk2NzAwMAorNTUwNSAwIDYwMDAwMDAKKzY5NDEgMCA2MDMzMDAwCisxMTUxNyAwIDYwNjcwMDAKKzU2NDYgMCA2MTAwMDAwCis2ODMyIDAgNjEzMzAwMAorNTI5NCAwIDYxNjcwMDAKKzYyMDAgMCA2MjAwMDAwCis2MzI4IDAgNjIzMzAwMAorNDM0OCAwIDYyNjcwMDAKKzQ2MDcgMCA2MzAwMDAwCisxMjk1OCAwIDYzMzMwMDAKKzQzMDggMCA2MzY3MDAwCis2MDg0IDAgNjQwMDAwMAorNDQ5NCAwIDY0MzMwMDAKKzUzMzggMCA2NDY3MDAwCis1NzQyIDAgNjUwMDAwMAorNTQ3MiAwIDY1MzMwMDAKKzg0NTkgMCA2NTY3MDAwCisxMzA3NSAwIDY2MDAwMDAKKzg5ODYgMCA2NjMzMDAwCis5NTgzIDAgNjY2NzAwMAorODc5MiAwIDY3MDAwMDAKKzkwMDQgMCA2NzMzMDAwCis5NjMyIDAgNjc2NzAwMAorOTM5MyAwIDY4MDAwMDAKKzkyNTkgMCA2ODMzMDAwCisxMTkyNyAwIDY4NjcwMDAKKzEwMzIzIDAgNjkwMDAwMAorMTUyNDggMCA2OTMzMDAwCisxMTI0NCAwIDY5NjcwMDAKKzE1NTU4IDAgNzAwMDAwMAorNjE5NyAwIDcwMzMwMDAKKzgwNDQgMCA3MDY3MDAwCisxMTQzMiAwIDcxMDAwMDAKKzg3MzcgMCA3MTMzMDAwCisxMzg4NSAwIDcxNjcwMDAKKzExMTU4IDAgNzIwMDAwMAorMTUxNTIgMCA3MjMzMDAwCis3MDI1IDAgNzI2NzAwMAorODAyNSAwIDczMDAwMDAKKzEzMzYyIDAgNzMzMzAwMAorODA5MCAwIDczNjcwMDAKKzEzNjM3IDAgNzQwMDAwMAorNjE0OCAwIDc0MzMwMDAKKzkyNzAgMCA3NDY3MDAwCis4NjMzIDAgNzUwMDAwMAorMTA2NzMgMCA3NTMzMDAwCisxNDIwOCAwIDc1NjcwMDAKKzgwODQgMCA3NjAwMDAwCisxMzc4MyAwIDc2MzMwMDAKKzEwNjYwIDAgNzY2NzAwMAorNzQ2NiAwIDc3MDAwMDAKKzE0NDMzIDAgNzczMzAwMAorMTA5MzQgMCA3NzY3MDAwCis3MjM5IDAgNzgwMDAwMAorMTI1NDggMCA3ODMzMDAwCis2NTY0IDAgNzg2NzAwMAorMTA3NjEgMCA3OTAwMDAwCisxMDk5MiAwIDc5MzMwMDAKKzEyOTI0IDAgNzk2NzAwMAorMTIzNDggMCA4MDAwMDAwCis2NzcwIDAgODAzMzAwMAorMTQyODggMCA4MDY3MDAwCisyOTM0NSAxIDgxMDAwMDAKKzE4MjIgMCA4MTMzMDAwCisxMDg3IDAgODE2NzAwMAorMTEwOSAwIDgyMDAwMDAKKzIwMDcgMCA4MjMzMDAwCisxNzk4IDAgODI2NzAwMAorMTYzNSAwIDgzMDAwMDAKKzE5NjA3IDAgODMzMzAwMAorOTE5IDAgODM2NzAwMAorMjM1NyAwIDg0MDAwMDAKKzM1NzggMCA4NDMzMDAwCis0NDk3IDAgODQ2NzAwMAorNDMxNCAwIDg1MDAwMDAKKzM4NTEgMCA4NTMzMDAwCiszODIyIDAgODU2NzAwMAorNDI1MiAwIDg2MDAwMDAKKzQ3NzUgMCA4NjMzMDAwCisxMjIwMyAwIDg2NjcwMDAKKzUwNzggMCA4NzAwMDAwCis1ODc2IDAgODczMzAwMAorNjEyNCAwIDg3NjcwMDAKKzQ0OTAgMCA4ODAwMDAwCiszNTM4IDAgODgzMzAwMAorMzQ1MCAwIDg4NjcwMDAKKzM2MTEgMCA4OTAwMDAwCisyODQ3IDAgODkzMzAwMAorMjYwNSAwIDg5NjcwMDAKKzEyMjQzIDAgOTAwMDAwMAorMTk0NiAwIDkwMzMwMDAKKzE4NDcgMCA5MDY3MDAwCisyMDM1IDAgOTEwMDAwMAorMjU3MiAwIDkxMzMwMDAKKzIzMjYgMCA5MTY3MDAwCisyNjQ1IDAgOTIwMDAwMAorMjkzOCAwIDkyMzMwMDAKKzI0OTUgMCA5MjY3MDAwCisyNjA5IDAgOTMwMDAwMAorOTc0NCAwIDkzMzMwMDAKKzE3OTYgMCA5MzY3MDAwCisxOTg1IDAgOTQwMDAwMAorMTc1OSAwIDk0MzMwMDAKKzIyNTkgMCA5NDY3MDAwCisyMjMzIDAgOTUwMDAwMAorMjA0NCAwIDk1MzMwMDAKKzI1MDIgMCA5NTY3MDAwCisyMzA3IDAgOTYwMDAwMAorMjczOSAwIDk2MzMwMDAKKzExNzA3IDAgOTY2NzAwMAorNTE2OCAwIDk3MDAwMDAKKzQ0ODMgMCA5NzMzMDAwCiszMDQ0IDAgOTc2NzAwMAorNDI0MSAwIDk4MDAwMDAKKzQzOTIgMCA5ODMzMDAwCis0OTM0IDAgOTg2NzAwMAorNTkzNCAwIDk5MDAwMDAKKzU2NDcgMCA5OTMzMDAwCis1MzI2IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorNjkzOSAxIDAKKzY4MTggMCAxNzAwMAorMzEwIDAgMzMwMDAKKzI3MyAwIDUwMDAwCisyNjcgMCA2NzAwMAorMjM5IDAgODMwMDAKKzIzMiAwIDEwMDAwMAorMjIyIDAgMTE3MDAwCisxODYgMCAxMzMwMDAKKzE5NCAwIDE1MDAwMAorMTg5IDAgMTY3MDAwCisxOCAwIDE4MzAwMAorMjAxNCAwIDIwMDAwMAorMjk3IDAgMjE3MDAwCisyODcgMCAyMzMwMDAKKzIzNyAwIDI1MDAwMAorMjYzIDAgMjY3MDAwCisyMzggMCAyODMwMDAKKzI1NyAwIDMwMDAwMAorMjI5IDAgMzE3MDAwCisxODcgMCAzMzMwMDAKKzE5MSAwIDM1MDAwMAorMTggMCAzNjcwMDAKKzIyMDMgMCAzODMwMDAKKzI2NSAwIDQwMDAwMAorMjI0IDAgNDE3MDAwCisyNTQgMCA0MzMwMDAKKzI1MiAwIDQ1MDAwMAorMjczIDAgNDY3MDAwCisyMDggMCA0ODMwMDAKKzE1NCAwIDUwMDAwMAorMTgyIDAgNTE3MDAwCisxMzggMCA1MzMwMDAKKzE4IDAgNTUwMDAwCisyNTAyIDAgNTY3MDAwCisyODYgMCA1ODMwMDAKKzMwNCAwIDYwMDAwMAorMzQxIDAgNjE3MDAwCisyNTkgMCA2MzMwMDAKKzI3NSAwIDY1MDAwMAorMjIyIDAgNjY3MDAwCisyNTQgMCA2ODMwMDAKKzI1MyAwIDcwMDAwMAorMjI1IDAgNzE3MDAwCisxOCAwIDczMzAwMAorMjUwMSAwIDc1MDAwMAorMjgyIDAgNzY3MDAwCisyOTggMCA3ODMwMDAKKzI1MiAwIDgwMDAwMAorMjQyIDAgODE3MDAwCisyNTAgMCA4MzMwMDAKKzI2MCAwIDg1MDAwMAorMjE4IDAgODY3MDAwCisyMTMgMCA4ODMwMDAKKzE0NCAwIDkwMDAwMAorMTggMCA5MTcwMDAKKzIzMyAwIDkzMzAwMAorMjU0IDAgOTUwMDAwCisyMjkgMCA5NjcwMDAKKzIzOSAwIDk4MzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOTY3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDAgQEAKKzU0OTE4IDEgMAorNDYyODAgMCAzMzAwMAorMjAwNiAwIDY3MDAwCisyODQxIDAgMTAwMDAwCiszMDQ0IDAgMTMzMDAwCiszNDI5IDAgMTY3MDAwCiszMTk2IDAgMjAwMDAwCisyOTI2IDAgMjMzMDAwCisyODIxIDAgMjY3MDAwCisxMTUwIDAgMzAwMDAwCiszNiAwIDMzMzAwMAorMzgwODQgMCAzNjcwMDAKKzM2ODkgMCA0MDAwMDAKKzM0NzMgMCA0MzMwMDAKKzMwMTEgMCA0NjcwMDAKKzMwOTAgMCA1MDAwMDAKKzI1MTYgMCA1MzMwMDAKKzI3NzEgMCA1NjcwMDAKKzMyNTAgMCA2MDAwMDAKKzExNTkgMCA2MzMwMDAKKzM0IDAgNjY3MDAwCiszOTY5MCAwIDcwMDAwMAorMzYxNSAwIDczMzAwMAorMjQ5NCAwIDc2NzAwMAorMjg5MyAwIDgwMDAwMAorMzMyOSAwIDgzMzAwMAorMjkzOSAwIDg2NzAwMAorMjM1MiAwIDkwMDAwMAorMjczMiAwIDkzMzAwMAorMTc0NiAwIDk2NzAwMAorMzMgMCAxMDAwMDAwCis0MTUwMSAwIDEwMzMwMDAKKzI5OTcgMCAxMDY3MDAwCisyNjY2IDAgMTEwMDAwMAorMzU4MiAwIDExMzMwMDAKKzI2MTYgMCAxMTY3MDAwCisyOTIzIDAgMTIwMDAwMAorMjY5NiAwIDEyMzMwMDAKKzE2MjggMCAxMjY3MDAwCisxODg3IDAgMTMwMDAwMAorMzMgMCAxMzMzMDAwCis0Mjg3NiAwIDEzNjcwMDAKKzI1ODggMCAxNDAwMDAwCiszMzE2IDAgMTQzMzAwMAorMjI4NyAwIDE0NjcwMDAKKzMzNzUgMCAxNTAwMDAwCisyMTA4IDAgMTUzMzAwMAorMjk2MSAwIDE1NjcwMDAKKzE3MzAgMCAxNjAwMDAwCisxODAwIDAgMTYzMzAwMAorMzQgMCAxNjY3MDAwCis0Mzc5NyAwIDE3MDAwMDAKKzI0ODQgMCAxNzMzMDAwCisyNTU2IDAgMTc2NzAwMAorMjY3MSAwIDE4MDAwMDAKKzIzMzggMCAxODMzMDAwCiszMTMzIDAgMTg2NzAwMAorMjAwMiAwIDE5MDAwMDAKKzE3OTQgMCAxOTMzMDAwCisxMjc5IDAgMTk2NzAwMAorMzIgMCAyMDAwMDAwCis0MjY0MiAwIDIwMzMwMDAKKzI2ODYgMCAyMDY3MDAwCisyMjAyIDAgMjEwMDAwMAorMjE0NSAwIDIxMzMwMDAKKzI1NjYgMCAyMTY3MDAwCisyMTkwIDAgMjIwMDAwMAorMTU4MCAwIDIyMzMwMDAKKzE3MTEgMCAyMjY3MDAwCis2NDggMCAyMzAwMDAwCiszMiAwIDIzMzMwMDAKKzQwNDA5IDAgMjM2NzAwMAorMjYyOCAwIDI0MDAwMDAKKzE5NzMgMCAyNDMzMDAwCisyMzYwIDAgMjQ2NzAwMAorMzA0MyAwIDI1MDAwMDAKKzE3MzAgMCAyNTMzMDAwCisxNDU2IDAgMjU2NzAwMAorMjMxMiAwIDI2MDAwMDAKKzM2OSAwIDI2MzMwMDAKKzMyIDAgMjY2NzAwMAorNDEzOTEgMCAyNzAwMDAwCisyOTY3IDAgMjczMzAwMAorMjQ1NCAwIDI3NjcwMDAKKzE4MjUgMCAyODAwMDAwCisxODUzIDAgMjgzMzAwMAorMTc0NiAwIDI4NjcwMDAKKzIzNDcgMCAyOTAwMDAwCisxMzYyIDAgMjkzMzAwMAorNDQxIDAgMjk2NzAwMAorMzQgMCAzMDAwMDAwCis0MjUwMyAwIDMwMzMwMDAKKzE4NzcgMCAzMDY3MDAwCisxNjkwIDAgMzEwMDAwMAorMTM2NyAwIDMxMzMwMDAKKzE1MjAgMCAzMTY3MDAwCisxMjQwIDAgMzIwMDAwMAorMTA5NCAwIDMyMzMwMDAKKzczOSAwIDMyNjcwMDAKKzM5MiAwIDMzMDAwMDAKKzMzIDAgMzMzMzAwMAorMzUxMDQgMCAzMzY3MDAwCisxNDYzIDAgMzQwMDAwMAorMjAyOSAwIDM0MzMwMDAKKzE2MjYgMCAzNDY3MDAwCisxOTU2IDAgMzUwMDAwMAorNzk5IDAgMzUzMzAwMAorNTU2IDAgMzU2NzAwMAorNTg0IDAgMzYwMDAwMAorMTkxIDAgMzYzMzAwMAorMzYgMCAzNjY3MDAwCiszNzY1MiAwIDM3MDAwMDAKKzg2MiAwIDM3MzMwMDAKKzUyNCAwIDM3NjcwMDAKKzY0MSAwIDM4MDAwMDAKKzU4NCAwIDM4MzMwMDAKKzM2MCAwIDM4NjcwMDAKKzM2NSAwIDM5MDAwMDAKKzM2MSAwIDM5MzMwMDAKKzE1NCAwIDM5NjcwMDAKKzM2IDAgNDAwMDAwMAorMTI1NzQwIDAgNDAzMzAwMAorMzMyIDAgNDA2NzAwMAorMzgxIDAgNDEwMDAwMAorNDIwIDAgNDEzMzAwMAorNDY0IDAgNDE2NzAwMAorMjg4IDAgNDIwMDAwMAorMjY2MCAwIDQyMzMwMDAKKzEyNzU2NCAxIDQyNjcwMDAKKzMwNjk2IDAgNDMwMDAwMAorMzQyMyAwIDQzMzMwMDAKKzMzMTAgMCA0MzY3MDAwCiszNTEzIDAgNDQwMDAwMAorMzczNSAwIDQ0MzMwMDAKKzMzNTggMCA0NDY3MDAwCiszMTA4IDAgNDUwMDAwMAorMjgwMCAwIDQ1MzMwMDAKKzE3NTEgMCA0NTY3MDAwCis0MSAwIDQ2MDAwMDAKKzM5ODYyIDAgNDYzMzAwMAorMzczOSAwIDQ2NjcwMDAKKzM3NTUgMCA0NzAwMDAwCiszNDA4IDAgNDczMzAwMAorMzc4MyAwIDQ3NjcwMDAKKzM0MjMgMCA0ODAwMDAwCisyODAxIDAgNDgzMzAwMAorMjU0OSAwIDQ4NjcwMDAKKzE0NjEgMCA0OTAwMDAwCis0MCAwIDQ5MzMwMDAKKzQxNjY3IDAgNDk2NzAwMAorMzYyMyAwIDUwMDAwMDAKKzMzNTYgMCA1MDMzMDAwCiszNDI0IDAgNTA2NzAwMAorMzU0OCAwIDUxMDAwMDAKKzMxMTkgMCA1MTMzMDAwCisyOTA1IDAgNTE2NzAwMAorMjc3MiAwIDUyMDAwMDAKKzE2MjMgMCA1MjMzMDAwCis0MyAwIDUyNjcwMDAKKzQ2NzgzIDAgNTMwMDAwMAorMzQ2MiAwIDUzMzMwMDAKKzM0NzAgMCA1MzY3MDAwCiszNjc3IDAgNTQwMDAwMAorMzY4NCAwIDU0MzMwMDAKKzMyNjYgMCA1NDY3MDAwCiszMTI3IDAgNTUwMDAwMAorMjgwOSAwIDU1MzMwMDAKKzE3NTAgMCA1NTY3MDAwCis0MCAwIDU2MDAwMDAKKzQ2MjE1IDAgNTYzMzAwMAorMzU5OSAwIDU2NjcwMDAKKzM1NTggMCA1NzAwMDAwCiszNTQ0IDAgNTczMzAwMAorMzYzMiAwIDU3NjcwMDAKKzM1NDggMCA1ODAwMDAwCisyOTY4IDAgNTgzMzAwMAorMjcxNSAwIDU4NjcwMDAKKzE3MjkgMCA1OTAwMDAwCis0MSAwIDU5MzMwMDAKKzQ1OTU4IDAgNTk2NzAwMAorMzc3NiAwIDYwMDAwMDAKKzM1MjUgMCA2MDMzMDAwCiszNjQ0IDAgNjA2NzAwMAorMzc4NiAwIDYxMDAwMDAKKzMyMjIgMCA2MTMzMDAwCisyOTIzIDAgNjE2NzAwMAorMjc1MiAwIDYyMDAwMDAKKzE1OTIgMCA2MjMzMDAwCis0MSAwIDYyNjcwMDAKKzQ2MDMxIDAgNjMwMDAwMAorMzUyMCAwIDYzMzMwMDAKKzMzODAgMCA2MzY3MDAwCiszMzcxIDAgNjQwMDAwMAorMzQyNyAwIDY0MzMwMDAKKzMxMzUgMCA2NDY3MDAwCisyOTg4IDAgNjUwMDAwMAorMjczMCAwIDY1MzMwMDAKKzE2NzEgMCA2NTY3MDAwCis0MSAwIDY2MDAwMDAKKzQ1ODQ2IDAgNjYzMzAwMAorMzUzNSAwIDY2NjcwMDAKKzM1MDcgMCA2NzAwMDAwCiszNDI5IDAgNjczMzAwMAorMzQ5MSAwIDY3NjcwMDAKKzMzMjUgMCA2ODAwMDAwCisyOTc5IDAgNjgzMzAwMAorMjgwMCAwIDY4NjcwMDAKKzE2MTAgMCA2OTAwMDAwCis0MCAwIDY5MzMwMDAKKzQ1OTU4IDAgNjk2NzAwMAorMzc2MiAwIDcwMDAwMDAKKzMyNTQgMCA3MDMzMDAwCiszNDA4IDAgNzA2NzAwMAorMzg2MCAwIDcxMDAwMDAKKzMxOTggMCA3MTMzMDAwCisyOTY2IDAgNzE2NzAwMAorMjg4MiAwIDcyMDAwMDAKKzE3NjMgMCA3MjMzMDAwCis0MiAwIDcyNjcwMDAKKzQ2MTMwIDAgNzMwMDAwMAorMzU5MyAwIDczMzMwMDAKKzM1MjMgMCA3MzY3MDAwCiszOTM5IDAgNzQwMDAwMAorMzk4MCAwIDc0MzMwMDAKKzM0NzAgMCA3NDY3MDAwCiszMTkxIDAgNzUwMDAwMAorMjk2OSAwIDc1MzMwMDAKKzE3NDAgMCA3NTY3MDAwCis0MSAwIDc2MDAwMDAKKzQ2MzAwIDAgNzYzMzAwMAorMzczOSAwIDc2NjcwMDAKKzM3ODEgMCA3NzAwMDAwCiszOTY0IDAgNzczMzAwMAorNDAyMyAwIDc3NjcwMDAKKzM0ODAgMCA3ODAwMDAwCiszMDY1IDAgNzgzMzAwMAorMjkzNCAwIDc4NjcwMDAKKzE4MDUgMCA3OTAwMDAwCis0MiAwIDc5MzMwMDAKKzM4MTY2IDAgNzk2NzAwMAorNDA2MiAwIDgwMDAwMDAKKzM4NDQgMCA4MDMzMDAwCis0NTQ3IDAgODA2NzAwMAorOTM0IDAgODEwMDAwMAorMzY1IDAgODEzMzAwMAorMTgxIDAgODE2NzAwMAorNDYzIDAgODIwMDAwMAorNDE5IDAgODIzMzAwMAorMzggMCA4MjY3MDAwCis5NzAyIDAgODMwMDAwMAorMzQ0IDAgODMzMzAwMAorMjc2IDAgODM2NzAwMAorMTM1MCAwIDg0MDAwMDAKKzE3MDMgMCA4NDMzMDAwCisxODQzIDAgODQ2NzAwMAorMTIyOCAwIDg1MDAwMDAKKzM1NTgwIDEgODUzMzAwMAorMjc0NTggMCA4NTY3MDAwCisyMTQ0IDAgODYwMDAwMAorMjQ4MiAwIDg2MzMwMDAKKzIwMDQgMCA4NjY3MDAwCisyODIyIDAgODcwMDAwMAorMjU3MCAwIDg3MzMwMDAKKzE3MjYgMCA4NzY3MDAwCisxMjQ4IDAgODgwMDAwMAorODQ0IDAgODgzMzAwMAorMzUgMCA4ODY3MDAwCisxNDIwNyAwIDg5MDAwMDAKKzEwMzcgMCA4OTMzMDAwCis3NDkgMCA4OTY3MDAwCis4MjkgMCA5MDAwMDAwCis5MTUgMCA5MDMzMDAwCis2ODUgMCA5MDY3MDAwCis3NjcgMCA5MTAwMDAwCis3OTggMCA5MTMzMDAwCiszNDIgMCA5MTY3MDAwCiszMSAwIDkyMDAwMDAKKzEyNTkwIDAgOTIzMzAwMAorOTIzIDAgOTI2NzAwMAorODE5IDAgOTMwMDAwMAorNzc2IDAgOTMzMzAwMAorODYzIDAgOTM2NzAwMAorNzI5IDAgOTQwMDAwMAorNDcxIDAgOTQzMzAwMAorNjM4IDAgOTQ2NzAwMAorMjc2IDAgOTUwMDAwMAorMzggMCA5NTMzMDAwCisxNzI3MiAwIDk1NjcwMDAKKzg1NiAwIDk2MDAwMDAKKzExNTggMCA5NjMzMDAwCisyMTcyIDAgOTY2NzAwMAorMjc1MSAwIDk3MDAwMDAKKzIxNDIgMCA5NzMzMDAwCisxMjY3IDAgOTc2NzAwMAorMTk2NSAwIDk4MDAwMDAKKzE1MTAgMCA5ODMzMDAwCiszNCAwIDk4NjcwMDAKKzI2OTIgMCA5OTAwMDAwCisyNzc4IDAgOTkzMzAwMAorMjU4NSAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUyMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFmMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCkBAIC0wLDAgKzEsODMzIEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzMyIDEgNDAwMDAKKzMyIDEgNjAwMDAKKzMyIDEgODAwMDAKKzMyIDEgMTAwMDAwCiszMiAxIDEyMDAwMAorMzIgMSAxNDAwMDAKKzMyIDEgMTYwMDAwCiszMiAxIDE4MDAwMAorMzIgMSAyMDAwMDAKKzMyIDEgMjIwMDAwCiszMiAxIDI0MDAwMAorMzIgMSAyNjAwMDAKKzMyIDEgMjgwMDAwCiszMiAxIDMwMDAwMAorMzIgMSAzMjAwMDAKKzMyIDEgMzQwMDAwCiszMiAxIDM2MDAwMAorMzIgMSAzODAwMDAKKzMyIDEgNDAwMDAwCiszMiAxIDQyMDAwMAorMzIgMSA0NDAwMDAKKzMyIDEgNDYwMDAwCiszMiAxIDQ4MDAwMAorMzIgMSA1MDAwMDAKKzMyIDEgNTIwMDAwCiszMiAxIDU0MDAwMAorMzIgMSA1NjAwMDAKKzMyIDEgNTgwMDAwCiszMiAxIDYwMDAwMAorMzIgMSA2MjAwMDAKKzMyIDEgNjQwMDAwCiszMiAxIDY2MDAwMAorMzIgMSA2ODAwMDAKKzMyIDEgNzAwMDAwCiszMiAxIDcyMDAwMAorMzIgMSA3NDAwMDAKKzMyIDEgNzYwMDAwCiszMiAxIDc4MDAwMAorMzIgMSA4MDAwMDAKKzMyIDEgODIwMDAwCiszMiAxIDg0MDAwMAorMzIgMSA4NjAwMDAKKzMyIDEgODgwMDAwCiszMiAxIDkwMDAwMAorMzIgMSA5MjAwMDAKKzMyIDEgOTQwMDAwCiszMiAxIDk2MDAwMAorMzIgMSA5ODAwMDAKKzMyIDEgMTAwMDAwMAorMzIgMSAxMDIwMDAwCiszMiAxIDEwNDAwMDAKKzMyIDEgMTA2MDAwMAorMzIgMSAxMDgwMDAwCiszMiAxIDExMDAwMDAKKzMyIDEgMTEyMDAwMAorMzIgMSAxMTQwMDAwCiszMiAxIDExNjAwMDAKKzMyIDEgMTE4MDAwMAorMzIgMSAxMjAwMDAwCiszMiAxIDEyMjAwMDAKKzMyIDEgMTI0MDAwMAorMzIgMSAxMjYwMDAwCiszMiAxIDEyODAwMDAKKzMyIDEgMTMwMDAwMAorMzIgMSAxMzIwMDAwCiszMiAxIDEzNDAwMDAKKzMyIDEgMTM2MDAwMAorMzIgMSAxMzgwMDAwCiszMiAxIDE0MDAwMDAKKzMyIDEgMTQyMDAwMAorMzIgMSAxNDQwMDAwCiszMiAxIDE0NjAwMDAKKzMyIDEgMTQ4MDAwMAorMzIgMSAxNTAwMDAwCiszMiAxIDE1MjAwMDAKKzMyIDEgMTU0MDAwMAorMzIgMSAxNTYwMDAwCiszMiAxIDE1ODAwMDAKKzMyIDEgMTYwMDAwMAorMzIgMSAxNjIwMDAwCiszMiAxIDE2NDAwMDAKKzMyIDEgMTY2MDAwMAorMzIgMSAxNjgwMDAwCiszMiAxIDE3MDAwMDAKKzMyIDEgMTcyMDAwMAorMzIgMSAxNzQwMDAwCiszMiAxIDE3NjAwMDAKKzMyIDEgMTc4MDAwMAorMzIgMSAxODAwMDAwCiszMiAxIDE4MjAwMDAKKzMyIDEgMTg0MDAwMAorMzIgMSAxODYwMDAwCiszMiAxIDE4ODAwMDAKKzMyIDEgMTkwMDAwMAorMzIgMSAxOTIwMDAwCiszMiAxIDE5NDAwMDAKKzMyIDEgMTk2MDAwMAorMzIgMSAxOTgwMDAwCiszMiAxIDIwMDAwMDAKKzMyIDEgMjAyMDAwMAorMzIgMSAyMDQwMDAwCiszMiAxIDIwNjAwMDAKKzMyIDEgMjA4MDAwMAorMzIgMSAyMTAwMDAwCiszMiAxIDIxMjAwMDAKKzMyIDEgMjE0MDAwMAorMzIgMSAyMTYwMDAwCiszMiAxIDIxODAwMDAKKzMyIDEgMjIwMDAwMAorMzIgMSAyMjIwMDAwCiszMiAxIDIyNDAwMDAKKzMyIDEgMjI2MDAwMAorMzIgMSAyMjgwMDAwCiszMiAxIDIzMDAwMDAKKzMyIDEgMjMyMDAwMAorMzIgMSAyMzQwMDAwCiszMiAxIDIzNjAwMDAKKzMyIDEgMjM4MDAwMAorMzIgMSAyNDAwMDAwCiszMiAxIDI0MjAwMDAKKzMyIDEgMjQ0MDAwMAorMzIgMSAyNDYwMDAwCiszMiAxIDI0ODAwMDAKKzMyIDEgMjUwMDAwMAorMzIgMSAyNTIwMDAwCiszMiAxIDI1NDAwMDAKKzMyIDEgMjU2MDAwMAorMzIgMSAyNTgwMDAwCiszMiAxIDI2MDAwMDAKKzMyIDEgMjYyMDAwMAorMzIgMSAyNjQwMDAwCiszMiAxIDI2NjAwMDAKKzMyIDEgMjY4MDAwMAorMzIgMSAyNzAwMDAwCiszMiAxIDI3MjAwMDAKKzMyIDEgMjc0MDAwMAorMzIgMSAyNzYwMDAwCiszMiAxIDI3ODAwMDAKKzMyIDEgMjgwMDAwMAorMzIgMSAyODIwMDAwCiszMiAxIDI4NDAwMDAKKzMyIDEgMjg2MDAwMAorMzIgMSAyODgwMDAwCiszMiAxIDI5MDAwMDAKKzMyIDEgMjkyMDAwMAorMzIgMSAyOTQwMDAwCiszMiAxIDI5NjAwMDAKKzMyIDEgMjk4MDAwMAorMzIgMSAzMDAwMDAwCiszMiAxIDMwMjAwMDAKKzMyIDEgMzA0MDAwMAorMzIgMSAzMDYwMDAwCiszMiAxIDMwODAwMDAKKzMyIDEgMzEwMDAwMAorMzIgMSAzMTIwMDAwCiszMiAxIDMxNDAwMDAKKzMyIDEgMzE2MDAwMAorMzIgMSAzMTgwMDAwCiszMiAxIDMyMDAwMDAKKzMyIDEgMzIyMDAwMAorMzIgMSAzMjQwMDAwCiszMiAxIDMyNjAwMDAKKzMyIDEgMzI4MDAwMAorMzIgMSAzMzAwMDAwCiszMiAxIDMzMjAwMDAKKzMyIDEgMzM0MDAwMAorMzIgMSAzMzYwMDAwCiszMiAxIDMzODAwMDAKKzMyIDEgMzQwMDAwMAorMzIgMSAzNDIwMDAwCiszMiAxIDM0NDAwMDAKKzMyIDEgMzQ2MDAwMAorMzIgMSAzNDgwMDAwCiszMiAxIDM1MDAwMDAKKzMyIDEgMzUyMDAwMAorMzIgMSAzNTQwMDAwCiszMiAxIDM1NjAwMDAKKzMyIDEgMzU4MDAwMAorMzIgMSAzNjAwMDAwCiszMiAxIDM2MjAwMDAKKzMyIDEgMzY0MDAwMAorMzIgMSAzNjYwMDAwCiszMiAxIDM2ODAwMDAKKzMyIDEgMzcwMDAwMAorMzIgMSAzNzIwMDAwCiszMiAxIDM3NDAwMDAKKzMyIDEgMzc2MDAwMAorMzIgMSAzNzgwMDAwCiszMiAxIDM4MDAwMDAKKzMyIDEgMzgyMDAwMAorMzIgMSAzODQwMDAwCiszMiAxIDM4NjAwMDAKKzMyIDEgMzg4MDAwMAorMzIgMSAzOTAwMDAwCiszMiAxIDM5MjAwMDAKKzMyIDEgMzk0MDAwMAorMzIgMSAzOTYwMDAwCiszMiAxIDM5ODAwMDAKKzMyIDEgNDAwMDAwMAorMzIgMSA0MDIwMDAwCiszMiAxIDQwNDAwMDAKKzMyIDEgNDA2MDAwMAorMzIgMSA0MDgwMDAwCiszMiAxIDQxMDAwMDAKKzMyIDEgNDEyMDAwMAorMzIgMSA0MTQwMDAwCiszMiAxIDQxNjAwMDAKKzMyIDEgNDE4MDAwMAorMzIgMSA0MjAwMDAwCiszMiAxIDQyMjAwMDAKKzMyIDEgNDI0MDAwMAorMzIgMSA0MjYwMDAwCiszMiAxIDQyODAwMDAKKzMyIDEgNDMwMDAwMAorMzIgMSA0MzIwMDAwCiszMiAxIDQzNDAwMDAKKzMyIDEgNDM2MDAwMAorMzIgMSA0MzgwMDAwCiszMiAxIDQ0MDAwMDAKKzMyIDEgNDQyMDAwMAorMzIgMSA0NDQwMDAwCiszMiAxIDQ0NjAwMDAKKzMyIDEgNDQ4MDAwMAorMzIgMSA0NTAwMDAwCiszMiAxIDQ1MjAwMDAKKzMyIDEgNDU0MDAwMAorMzIgMSA0NTYwMDAwCiszMiAxIDQ1ODAwMDAKKzMyIDEgNDYwMDAwMAorMzIgMSA0NjIwMDAwCiszMiAxIDQ2NDAwMDAKKzMyIDEgNDY2MDAwMAorMzIgMSA0NjgwMDAwCiszMiAxIDQ3MDAwMDAKKzMyIDEgNDcyMDAwMAorMzIgMSA0NzQwMDAwCiszMiAxIDQ3NjAwMDAKKzMyIDEgNDc4MDAwMAorMzIgMSA0ODAwMDAwCiszMiAxIDQ4MjAwMDAKKzMyIDEgNDg0MDAwMAorMzIgMSA0ODYwMDAwCiszMiAxIDQ4ODAwMDAKKzMyIDEgNDkwMDAwMAorMzIgMSA0OTIwMDAwCiszMiAxIDQ5NDAwMDAKKzMyIDEgNDk2MDAwMAorMzIgMSA0OTgwMDAwCiszMiAxIDUwMDAwMDAKKzMyIDEgNTAyMDAwMAorMzIgMSA1MDQwMDAwCiszMiAxIDUwNjAwMDAKKzMyIDEgNTA4MDAwMAorMzIgMSA1MTAwMDAwCiszMiAxIDUxMjAwMDAKKzMyIDEgNTE0MDAwMAorMzIgMSA1MTYwMDAwCiszMiAxIDUxODAwMDAKKzMyIDEgNTIwMDAwMAorMzIgMSA1MjIwMDAwCiszMiAxIDUyNDAwMDAKKzMyIDEgNTI2MDAwMAorMzIgMSA1MjgwMDAwCiszMiAxIDUzMDAwMDAKKzMyIDEgNTMyMDAwMAorMzIgMSA1MzQwMDAwCiszMiAxIDUzNjAwMDAKKzMyIDEgNTM4MDAwMAorMzIgMSA1NDAwMDAwCiszMiAxIDU0MjAwMDAKKzMyIDEgNTQ0MDAwMAorMzIgMSA1NDYwMDAwCiszMiAxIDU0ODAwMDAKKzMyIDEgNTUwMDAwMAorMzIgMSA1NTIwMDAwCiszMiAxIDU1NDAwMDAKKzMyIDEgNTU2MDAwMAorMzIgMSA1NTgwMDAwCiszMiAxIDU2MDAwMDAKKzMyIDEgNTYyMDAwMAorMzIgMSA1NjQwMDAwCiszMiAxIDU2NjAwMDAKKzMyIDEgNTY4MDAwMAorMzIgMSA1NzAwMDAwCiszMiAxIDU3MjAwMDAKKzMyIDEgNTc0MDAwMAorMzIgMSA1NzYwMDAwCiszMiAxIDU3ODAwMDAKKzMyIDEgNTgwMDAwMAorMzIgMSA1ODIwMDAwCiszMiAxIDU4NDAwMDAKKzMyIDEgNTg2MDAwMAorMzIgMSA1ODgwMDAwCiszMiAxIDU5MDAwMDAKKzMyIDEgNTkyMDAwMAorMzIgMSA1OTQwMDAwCiszMiAxIDU5NjAwMDAKKzMyIDEgNTk4MDAwMAorMzIgMSA2MDAwMDAwCiszMiAxIDYwMjAwMDAKKzMyIDEgNjA0MDAwMAorMzIgMSA2MDYwMDAwCiszMiAxIDYwODAwMDAKKzMyIDEgNjEwMDAwMAorMzIgMSA2MTIwMDAwCiszMiAxIDYxNDAwMDAKKzMyIDEgNjE2MDAwMAorMzIgMSA2MTgwMDAwCiszMiAxIDYyMDAwMDAKKzMyIDEgNjIyMDAwMAorMzIgMSA2MjQwMDAwCiszMiAxIDYyNjAwMDAKKzMyIDEgNjI4MDAwMAorMzIgMSA2MzAwMDAwCiszMiAxIDYzMjAwMDAKKzMyIDEgNjM0MDAwMAorMzIgMSA2MzYwMDAwCiszMiAxIDYzODAwMDAKKzMyIDEgNjQwMDAwMAorMzIgMSA2NDIwMDAwCiszMiAxIDY0NDAwMDAKKzMyIDEgNjQ2MDAwMAorMzIgMSA2NDgwMDAwCiszMiAxIDY1MDAwMDAKKzMyIDEgNjUyMDAwMAorMzIgMSA2NTQwMDAwCiszMiAxIDY1NjAwMDAKKzMyIDEgNjU4MDAwMAorMzIgMSA2NjAwMDAwCiszMiAxIDY2MjAwMDAKKzMyIDEgNjY0MDAwMAorMzIgMSA2NjYwMDAwCiszMiAxIDY2ODAwMDAKKzMyIDEgNjcwMDAwMAorMzIgMSA2NzIwMDAwCiszMiAxIDY3NDAwMDAKKzMyIDEgNjc2MDAwMAorMzIgMSA2NzgwMDAwCiszMiAxIDY4MDAwMDAKKzMyIDEgNjgyMDAwMAorMzIgMSA2ODQwMDAwCiszMiAxIDY4NjAwMDAKKzMyIDEgNjg4MDAwMAorMzIgMSA2OTAwMDAwCiszMiAxIDY5MjAwMDAKKzMyIDEgNjk0MDAwMAorMzIgMSA2OTYwMDAwCiszMiAxIDY5ODAwMDAKKzMyIDEgNzAwMDAwMAorMzIgMSA3MDIwMDAwCiszMiAxIDcwNDAwMDAKKzMyIDEgNzA2MDAwMAorMzIgMSA3MDgwMDAwCiszMiAxIDcxMDAwMDAKKzMyIDEgNzEyMDAwMAorMzIgMSA3MTQwMDAwCiszMiAxIDcxNjAwMDAKKzMyIDEgNzE4MDAwMAorMzIgMSA3MjAwMDAwCiszMiAxIDcyMjAwMDAKKzMyIDEgNzI0MDAwMAorMzIgMSA3MjYwMDAwCiszMiAxIDcyODAwMDAKKzMyIDEgNzMwMDAwMAorMzIgMSA3MzIwMDAwCiszMiAxIDczNDAwMDAKKzMyIDEgNzM2MDAwMAorMzIgMSA3MzgwMDAwCiszMiAxIDc0MDAwMDAKKzMyIDEgNzQyMDAwMAorMzIgMSA3NDQwMDAwCiszMiAxIDc0NjAwMDAKKzMyIDEgNzQ4MDAwMAorMzIgMSA3NTAwMDAwCiszMiAxIDc1MjAwMDAKKzMyIDEgNzU0MDAwMAorMzIgMSA3NTYwMDAwCiszMiAxIDc1ODAwMDAKKzMyIDEgNzYwMDAwMAorMzIgMSA3NjIwMDAwCiszMiAxIDc2NDAwMDAKKzMyIDEgNzY2MDAwMAorMzIgMSA3NjgwMDAwCiszMiAxIDc3MDAwMDAKKzMyIDEgNzcyMDAwMAorMzIgMSA3NzQwMDAwCiszMiAxIDc3NjAwMDAKKzMyIDEgNzc4MDAwMAorMzIgMSA3ODAwMDAwCiszMiAxIDc4MjAwMDAKKzMyIDEgNzg0MDAwMAorMzIgMSA3ODYwMDAwCiszMiAxIDc4ODAwMDAKKzMyIDEgNzkwMDAwMAorMzIgMSA3OTIwMDAwCiszMiAxIDc5NDAwMDAKKzMyIDEgNzk2MDAwMAorMzIgMSA3OTgwMDAwCiszMiAxIDgwMDAwMDAKKzMyIDEgODAyMDAwMAorMzIgMSA4MDQwMDAwCiszMiAxIDgwNjAwMDAKKzMyIDEgODA4MDAwMAorMzIgMSA4MTAwMDAwCiszMiAxIDgxMjAwMDAKKzMyIDEgODE0MDAwMAorMzIgMSA4MTYwMDAwCiszMiAxIDgxODAwMDAKKzMyIDEgODIwMDAwMAorMzIgMSA4MjIwMDAwCiszMiAxIDgyNDAwMDAKKzMyIDEgODI2MDAwMAorMzIgMSA4MjgwMDAwCiszMiAxIDgzMDAwMDAKKzMyIDEgODMyMDAwMAorMzIgMSA4MzQwMDAwCiszMiAxIDgzNjAwMDAKKzMyIDEgODM4MDAwMAorMzIgMSA4NDAwMDAwCiszMiAxIDg0MjAwMDAKKzMyIDEgODQ0MDAwMAorMzIgMSA4NDYwMDAwCiszMiAxIDg0ODAwMDAKKzMyIDEgODUwMDAwMAorMzIgMSA4NTIwMDAwCiszMiAxIDg1NDAwMDAKKzMyIDEgODU2MDAwMAorMzIgMSA4NTgwMDAwCiszMiAxIDg2MDAwMDAKKzMyIDEgODYyMDAwMAorMzIgMSA4NjQwMDAwCiszMiAxIDg2NjAwMDAKKzMyIDEgODY4MDAwMAorMzIgMSA4NzAwMDAwCiszMiAxIDg3MjAwMDAKKzMyIDEgODc0MDAwMAorMzIgMSA4NzYwMDAwCiszMiAxIDg3ODAwMDAKKzMyIDEgODgwMDAwMAorMzIgMSA4ODIwMDAwCiszMiAxIDg4NDAwMDAKKzMyIDEgODg2MDAwMAorMzIgMSA4ODgwMDAwCiszMiAxIDg5MDAwMDAKKzMyIDEgODkyMDAwMAorMzIgMSA4OTQwMDAwCiszMiAxIDg5NjAwMDAKKzMyIDEgODk4MDAwMAorMzIgMSA5MDAwMDAwCiszMiAxIDkwMjAwMDAKKzMyIDEgOTA0MDAwMAorMzIgMSA5MDYwMDAwCiszMiAxIDkwODAwMDAKKzMyIDEgOTEwMDAwMAorMzIgMSA5MTIwMDAwCiszMiAxIDkxNDAwMDAKKzMyIDEgOTE2MDAwMAorMzIgMSA5MTgwMDAwCiszMiAxIDkyMDAwMDAKKzMyIDEgOTIyMDAwMAorMzIgMSA5MjQwMDAwCiszMiAxIDkyNjAwMDAKKzMyIDEgOTI4MDAwMAorMzIgMSA5MzAwMDAwCiszMiAxIDkzMjAwMDAKKzMyIDEgOTM0MDAwMAorMzIgMSA5MzYwMDAwCiszMiAxIDkzODAwMDAKKzMyIDEgOTQwMDAwMAorMzIgMSA5NDIwMDAwCiszMiAxIDk0NDAwMDAKKzMyIDEgOTQ2MDAwMAorMzIgMSA5NDgwMDAwCiszMiAxIDk1MDAwMDAKKzMyIDEgOTUyMDAwMAorMzIgMSA5NTQwMDAwCiszMiAxIDk1NjAwMDAKKzMyIDEgOTU4MDAwMAorMzIgMSA5NjAwMDAwCiszMiAxIDk2MjAwMDAKKzMyIDEgOTY0MDAwMAorMzIgMSA5NjYwMDAwCiszMiAxIDk2ODAwMDAKKzMyIDEgOTcwMDAwMAorMzIgMSA5NzIwMDAwCiszMiAxIDk3NDAwMDAKKzMyIDEgOTc2MDAwMAorMzIgMSA5NzgwMDAwCiszMiAxIDk4MDAwMDAKKzMyIDEgOTgyMDAwMAorMzIgMSA5ODQwMDAwCiszMiAxIDk4NjAwMDAKKzMyIDEgOTg4MDAwMAorMzIgMSA5OTAwMDAwCiszMiAxIDk5MjAwMDAKKzMyIDEgOTk0MDAwMAorMzIgMSA5OTYwMDAwCiszMiAxIDk5ODAwMDAKKzMyIDEgMTAwMDAwMDAKKzMyIDEgMTAwMjAwMDAKKzMyIDEgMTAwNDAwMDAKKzMyIDEgMTAwNjAwMDAKKzMyIDEgMTAwODAwMDAKKzMyIDEgMTAxMDAwMDAKKzMyIDEgMTAxMjAwMDAKKzMyIDEgMTAxNDAwMDAKKzMyIDEgMTAxNjAwMDAKKzMyIDEgMTAxODAwMDAKKzMyIDEgMTAyMDAwMDAKKzMyIDEgMTAyMjAwMDAKKzMyIDEgMTAyNDAwMDAKKzMyIDEgMTAyNjAwMDAKKzMyIDEgMTAyODAwMDAKKzMyIDEgMTAzMDAwMDAKKzMyIDEgMTAzMjAwMDAKKzMyIDEgMTAzNDAwMDAKKzMyIDEgMTAzNjAwMDAKKzMyIDEgMTAzODAwMDAKKzMyIDEgMTA0MDAwMDAKKzMyIDEgMTA0MjAwMDAKKzMyIDEgMTA0NDAwMDAKKzMyIDEgMTA0NjAwMDAKKzMyIDEgMTA0ODAwMDAKKzMyIDEgMTA1MDAwMDAKKzMyIDEgMTA1MjAwMDAKKzMyIDEgMTA1NDAwMDAKKzMyIDEgMTA1NjAwMDAKKzMyIDEgMTA1ODAwMDAKKzMyIDEgMTA2MDAwMDAKKzMyIDEgMTA2MjAwMDAKKzMyIDEgMTA2NDAwMDAKKzMyIDEgMTA2NjAwMDAKKzMyIDEgMTA2ODAwMDAKKzMyIDEgMTA3MDAwMDAKKzMyIDEgMTA3MjAwMDAKKzMyIDEgMTA3NDAwMDAKKzMyIDEgMTA3NjAwMDAKKzMyIDEgMTA3ODAwMDAKKzMyIDEgMTA4MDAwMDAKKzMyIDEgMTA4MjAwMDAKKzMyIDEgMTA4NDAwMDAKKzMyIDEgMTA4NjAwMDAKKzMyIDEgMTA4ODAwMDAKKzMyIDEgMTA5MDAwMDAKKzMyIDEgMTA5MjAwMDAKKzMyIDEgMTA5NDAwMDAKKzMyIDEgMTA5NjAwMDAKKzMyIDEgMTA5ODAwMDAKKzMyIDEgMTEwMDAwMDAKKzMyIDEgMTEwMjAwMDAKKzMyIDEgMTEwNDAwMDAKKzMyIDEgMTEwNjAwMDAKKzMyIDEgMTEwODAwMDAKKzMyIDEgMTExMDAwMDAKKzMyIDEgMTExMjAwMDAKKzMyIDEgMTExNDAwMDAKKzMyIDEgMTExNjAwMDAKKzMyIDEgMTExODAwMDAKKzMyIDEgMTEyMDAwMDAKKzMyIDEgMTEyMjAwMDAKKzMyIDEgMTEyNDAwMDAKKzMyIDEgMTEyNjAwMDAKKzMyIDEgMTEyODAwMDAKKzMyIDEgMTEzMDAwMDAKKzMyIDEgMTEzMjAwMDAKKzMyIDEgMTEzNDAwMDAKKzMyIDEgMTEzNjAwMDAKKzMyIDEgMTEzODAwMDAKKzMyIDEgMTE0MDAwMDAKKzMyIDEgMTE0MjAwMDAKKzMyIDEgMTE0NDAwMDAKKzMyIDEgMTE0NjAwMDAKKzMyIDEgMTE0ODAwMDAKKzMyIDEgMTE1MDAwMDAKKzMyIDEgMTE1MjAwMDAKKzMyIDEgMTE1NDAwMDAKKzMyIDEgMTE1NjAwMDAKKzMyIDEgMTE1ODAwMDAKKzMyIDEgMTE2MDAwMDAKKzMyIDEgMTE2MjAwMDAKKzMyIDEgMTE2NDAwMDAKKzMyIDEgMTE2NjAwMDAKKzMyIDEgMTE2ODAwMDAKKzMyIDEgMTE3MDAwMDAKKzMyIDEgMTE3MjAwMDAKKzMyIDEgMTE3NDAwMDAKKzMyIDEgMTE3NjAwMDAKKzMyIDEgMTE3ODAwMDAKKzMyIDEgMTE4MDAwMDAKKzMyIDEgMTE4MjAwMDAKKzMyIDEgMTE4NDAwMDAKKzMyIDEgMTE4NjAwMDAKKzMyIDEgMTE4ODAwMDAKKzMyIDEgMTE5MDAwMDAKKzMyIDEgMTE5MjAwMDAKKzMyIDEgMTE5NDAwMDAKKzMyIDEgMTE5NjAwMDAKKzMyIDEgMTE5ODAwMDAKKzMyIDEgMTIwMDAwMDAKKzMyIDEgMTIwMjAwMDAKKzMyIDEgMTIwNDAwMDAKKzMyIDEgMTIwNjAwMDAKKzMyIDEgMTIwODAwMDAKKzMyIDEgMTIxMDAwMDAKKzMyIDEgMTIxMjAwMDAKKzMyIDEgMTIxNDAwMDAKKzMyIDEgMTIxNjAwMDAKKzMyIDEgMTIxODAwMDAKKzMyIDEgMTIyMDAwMDAKKzMyIDEgMTIyMjAwMDAKKzMyIDEgMTIyNDAwMDAKKzMyIDEgMTIyNjAwMDAKKzMyIDEgMTIyODAwMDAKKzMyIDEgMTIzMDAwMDAKKzMyIDEgMTIzMjAwMDAKKzMyIDEgMTIzNDAwMDAKKzMyIDEgMTIzNjAwMDAKKzMyIDEgMTIzODAwMDAKKzMyIDEgMTI0MDAwMDAKKzMyIDEgMTI0MjAwMDAKKzMyIDEgMTI0NDAwMDAKKzMyIDEgMTI0NjAwMDAKKzMyIDEgMTI0ODAwMDAKKzMyIDEgMTI1MDAwMDAKKzMyIDEgMTI1MjAwMDAKKzMyIDEgMTI1NDAwMDAKKzMyIDEgMTI1NjAwMDAKKzMyIDEgMTI1ODAwMDAKKzMyIDEgMTI2MDAwMDAKKzMyIDEgMTI2MjAwMDAKKzMyIDEgMTI2NDAwMDAKKzMyIDEgMTI2NjAwMDAKKzMyIDEgMTI2ODAwMDAKKzMyIDEgMTI3MDAwMDAKKzMyIDEgMTI3MjAwMDAKKzMyIDEgMTI3NDAwMDAKKzMyIDEgMTI3NjAwMDAKKzMyIDEgMTI3ODAwMDAKKzMyIDEgMTI4MDAwMDAKKzMyIDEgMTI4MjAwMDAKKzMyIDEgMTI4NDAwMDAKKzMyIDEgMTI4NjAwMDAKKzMyIDEgMTI4ODAwMDAKKzMyIDEgMTI5MDAwMDAKKzMyIDEgMTI5MjAwMDAKKzMyIDEgMTI5NDAwMDAKKzMyIDEgMTI5NjAwMDAKKzMyIDEgMTI5ODAwMDAKKzMyIDEgMTMwMDAwMDAKKzMyIDEgMTMwMjAwMDAKKzMyIDEgMTMwNDAwMDAKKzMyIDEgMTMwNjAwMDAKKzMyIDEgMTMwODAwMDAKKzMyIDEgMTMxMDAwMDAKKzMyIDEgMTMxMjAwMDAKKzMyIDEgMTMxNDAwMDAKKzMyIDEgMTMxNjAwMDAKKzMyIDEgMTMxODAwMDAKKzMyIDEgMTMyMDAwMDAKKzMyIDEgMTMyMjAwMDAKKzMyIDEgMTMyNDAwMDAKKzMyIDEgMTMyNjAwMDAKKzMyIDEgMTMyODAwMDAKKzMyIDEgMTMzMDAwMDAKKzMyIDEgMTMzMjAwMDAKKzMyIDEgMTMzNDAwMDAKKzMyIDEgMTMzNjAwMDAKKzMyIDEgMTMzODAwMDAKKzMyIDEgMTM0MDAwMDAKKzMyIDEgMTM0MjAwMDAKKzMyIDEgMTM0NDAwMDAKKzMyIDEgMTM0NjAwMDAKKzMyIDEgMTM0ODAwMDAKKzMyIDEgMTM1MDAwMDAKKzMyIDEgMTM1MjAwMDAKKzMyIDEgMTM1NDAwMDAKKzMyIDEgMTM1NjAwMDAKKzMyIDEgMTM1ODAwMDAKKzMyIDEgMTM2MDAwMDAKKzMyIDEgMTM2MjAwMDAKKzMyIDEgMTM2NDAwMDAKKzMyIDEgMTM2NjAwMDAKKzMyIDEgMTM2ODAwMDAKKzMyIDEgMTM3MDAwMDAKKzMyIDEgMTM3MjAwMDAKKzMyIDEgMTM3NDAwMDAKKzMyIDEgMTM3NjAwMDAKKzMyIDEgMTM3ODAwMDAKKzMyIDEgMTM4MDAwMDAKKzMyIDEgMTM4MjAwMDAKKzMyIDEgMTM4NDAwMDAKKzMyIDEgMTM4NjAwMDAKKzMyIDEgMTM4ODAwMDAKKzMyIDEgMTM5MDAwMDAKKzMyIDEgMTM5MjAwMDAKKzMyIDEgMTM5NDAwMDAKKzMyIDEgMTM5NjAwMDAKKzMyIDEgMTM5ODAwMDAKKzMyIDEgMTQwMDAwMDAKKzMyIDEgMTQwMjAwMDAKKzMyIDEgMTQwNDAwMDAKKzMyIDEgMTQwNjAwMDAKKzMyIDEgMTQwODAwMDAKKzMyIDEgMTQxMDAwMDAKKzMyIDEgMTQxMjAwMDAKKzMyIDEgMTQxNDAwMDAKKzMyIDEgMTQxNjAwMDAKKzMyIDEgMTQxODAwMDAKKzMyIDEgMTQyMDAwMDAKKzMyIDEgMTQyMjAwMDAKKzMyIDEgMTQyNDAwMDAKKzMyIDEgMTQyNjAwMDAKKzMyIDEgMTQyODAwMDAKKzMyIDEgMTQzMDAwMDAKKzMyIDEgMTQzMjAwMDAKKzMyIDEgMTQzNDAwMDAKKzMyIDEgMTQzNjAwMDAKKzMyIDEgMTQzODAwMDAKKzMyIDEgMTQ0MDAwMDAKKzMyIDEgMTQ0MjAwMDAKKzMyIDEgMTQ0NDAwMDAKKzMyIDEgMTQ0NjAwMDAKKzMyIDEgMTQ0ODAwMDAKKzMyIDEgMTQ1MDAwMDAKKzMyIDEgMTQ1MjAwMDAKKzMyIDEgMTQ1NDAwMDAKKzMyIDEgMTQ1NjAwMDAKKzMyIDEgMTQ1ODAwMDAKKzMyIDEgMTQ2MDAwMDAKKzMyIDEgMTQ2MjAwMDAKKzMyIDEgMTQ2NDAwMDAKKzMyIDEgMTQ2NjAwMDAKKzMyIDEgMTQ2ODAwMDAKKzMyIDEgMTQ3MDAwMDAKKzMyIDEgMTQ3MjAwMDAKKzMyIDEgMTQ3NDAwMDAKKzMyIDEgMTQ3NjAwMDAKKzMyIDEgMTQ3ODAwMDAKKzMyIDEgMTQ4MDAwMDAKKzMyIDEgMTQ4MjAwMDAKKzMyIDEgMTQ4NDAwMDAKKzMyIDEgMTQ4NjAwMDAKKzMyIDEgMTQ4ODAwMDAKKzMyIDEgMTQ5MDAwMDAKKzMyIDEgMTQ5MjAwMDAKKzMyIDEgMTQ5NDAwMDAKKzMyIDEgMTQ5NjAwMDAKKzMyIDEgMTQ5ODAwMDAKKzMyIDEgMTUwMDAwMDAKKzMyIDEgMTUwMjAwMDAKKzMyIDEgMTUwNDAwMDAKKzMyIDEgMTUwNjAwMDAKKzMyIDEgMTUwODAwMDAKKzMyIDEgMTUxMDAwMDAKKzMyIDEgMTUxMjAwMDAKKzMyIDEgMTUxNDAwMDAKKzMyIDEgMTUxNjAwMDAKKzMyIDEgMTUxODAwMDAKKzMyIDEgMTUyMDAwMDAKKzMyIDEgMTUyMjAwMDAKKzMyIDEgMTUyNDAwMDAKKzMyIDEgMTUyNjAwMDAKKzMyIDEgMTUyODAwMDAKKzMyIDEgMTUzMDAwMDAKKzMyIDEgMTUzMjAwMDAKKzMyIDEgMTUzNDAwMDAKKzMyIDEgMTUzNjAwMDAKKzMyIDEgMTUzODAwMDAKKzMyIDEgMTU0MDAwMDAKKzMyIDEgMTU0MjAwMDAKKzMyIDEgMTU0NDAwMDAKKzMyIDEgMTU0NjAwMDAKKzMyIDEgMTU0ODAwMDAKKzMyIDEgMTU1MDAwMDAKKzMyIDEgMTU1MjAwMDAKKzMyIDEgMTU1NDAwMDAKKzMyIDEgMTU1NjAwMDAKKzMyIDEgMTU1ODAwMDAKKzMyIDEgMTU2MDAwMDAKKzMyIDEgMTU2MjAwMDAKKzMyIDEgMTU2NDAwMDAKKzMyIDEgMTU2NjAwMDAKKzMyIDEgMTU2ODAwMDAKKzMyIDEgMTU3MDAwMDAKKzMyIDEgMTU3MjAwMDAKKzMyIDEgMTU3NDAwMDAKKzMyIDEgMTU3NjAwMDAKKzMyIDEgMTU3ODAwMDAKKzMyIDEgMTU4MDAwMDAKKzMyIDEgMTU4MjAwMDAKKzMyIDEgMTU4NDAwMDAKKzMyIDEgMTU4NjAwMDAKKzMyIDEgMTU4ODAwMDAKKzMyIDEgMTU5MDAwMDAKKzMyIDEgMTU5MjAwMDAKKzMyIDEgMTU5NDAwMDAKKzMyIDEgMTU5NjAwMDAKKzMyIDEgMTU5ODAwMDAKKzMyIDEgMTYwMDAwMDAKKzMyIDEgMTYwMjAwMDAKKzMyIDEgMTYwNDAwMDAKKzMyIDEgMTYwNjAwMDAKKzMyIDEgMTYwODAwMDAKKzMyIDEgMTYxMDAwMDAKKzMyIDEgMTYxMjAwMDAKKzMyIDEgMTYxNDAwMDAKKzMyIDEgMTYxNjAwMDAKKzMyIDEgMTYxODAwMDAKKzMyIDEgMTYyMDAwMDAKKzMyIDEgMTYyMjAwMDAKKzMyIDEgMTYyNDAwMDAKKzMyIDEgMTYyNjAwMDAKKzMyIDEgMTYyODAwMDAKKzMyIDEgMTYzMDAwMDAKKzMyIDEgMTYzMjAwMDAKKzMyIDEgMTYzNDAwMDAKKzMyIDEgMTYzNjAwMDAKKzMyIDEgMTYzODAwMDAKKzMyIDEgMTY0MDAwMDAKKzMyIDEgMTY0MjAwMDAKKzMyIDEgMTY0NDAwMDAKKzMyIDEgMTY0NjAwMDAKKzMyIDEgMTY0ODAwMDAKKzMyIDEgMTY1MDAwMDAKKzMyIDEgMTY1MjAwMDAKKzMyIDEgMTY1NDAwMDAKKzMyIDEgMTY1NjAwMDAKKzMyIDEgMTY1ODAwMDAKKzMyIDEgMTY2MDAwMDAKKzMyIDEgMTY2MjAwMDAKKzMyIDEgMTY2NDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NmVhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDgwNyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCis2NCAxIDQwMDAwCis2NCAxIDgwMDAwCis2NCAxIDEyMDAwMAorOTYgMSAxNjAwMDAKKzk2IDEgMjIwMDAwCis5NiAxIDI4MDAwMAorOTYgMSAzNDAwMDAKKzEyOCAxIDQwMDAwMAorMTI4IDEgNDgwMDAwCisxMjggMSA1NjAwMDAKKzEyOCAxIDY0MDAwMAorMTI4IDEgNzIwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTM1YjAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjg3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCkBAIC0wLDAgKzEsOTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9CisKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaywgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBzaXplLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzIiLCBtcGVnMn0sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sIHsiYXYxIiwgYXYxfSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcCA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisKKyAgICAgICAgQzJTZWN1cmVNb2RlVHVuaW5nIHNlY3VyZU1vZGVUdW5pbmd7fTsKKyAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoeyAmc2VjdXJlTW9kZVR1bmluZyB9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEKSB7CisgICAgICAgICAgICBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCk7CisgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NvbmZpZyAmJgorICAgICAgICAgICAgICAgICAgICAhd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfR0UoCisgICAgICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworCisgICAgICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0c0hpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBtVGltZXN0YW1wVXNsaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqaXQgPT0gbVRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c0hpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzSGl0ID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodHNIaXQsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGltZVN0YW1wIG5vdCByZWNvZ25pemVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBJTkZPICAgXSBSZWNlaXZlZCBub24temVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IC8gVGltZVN0YW1wIG5vdCByZWNvZ25pemVkIFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBtQ3NkOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICAodm9pZCltQ3NkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBoMjYzLAorICAgICAgICBhdmMsCisgICAgICAgIG1wZWcyLAorICAgICAgICBtcGVnNCwKKyAgICAgICAgaGV2YywKKyAgICAgICAgdnA4LAorICAgICAgICB2cDksCisgICAgICAgIGF2MSwKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpbmZvLCBzaXplX3Qgc3RyZWFtSW5kZXggPSAxKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyIG1VUkxbU1RSRUFNX0NPVU5UXVs1MTJdOworICAgICAgICBjb25zdCBjaGFyIGluZm9bU1RSRUFNX0NPVU5UXVs1MTJdOworICAgIH07CisgICAgQVNTRVJUX1RSVUUoc3RyZWFtSW5kZXggPCBTVFJFQU1fQ09VTlQpOworCisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2YywKKyAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCIsCisgICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQifSwKKyAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmhldmMsCisgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKKyAgICAgICAgICAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIn0sCisgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnMiwKKyAgICAgICAgIHsiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYiLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYifSwKKyAgICAgICAgIHsiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aDI2MywKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIn0sCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzQsCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diJ9LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDgsCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCisgICAgICAgICAgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgifSwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDksCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSIsCisgICAgICAgICAgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkifSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdjEsCisgICAgICAgICB7ImJiYl9hdjFfNjQwXzM2MC5hdjEiLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuYXYxIn0sCisgICAgICAgICB7ImJiYl9hdjFfNjQwXzM2MC5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2MV8xNzZfMTQ0LmluZm8ifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gKDEgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKSk7CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlIC0gMSkpKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBhdXRvIGFsaWduZWRTaXplID0gQUxJR04oc2l6ZSwgUEFHRV9TSVpFKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWRTaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWFsaWduZWRTaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWFsaWduZWRTaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2ssIHNpemUpKTsKKyAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+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+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXAgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBib29sIHNldHVwQ29uZmlnUGFyYW0oaW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCk7CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZW5jb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGlmICghbVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgod29yay0+d29ya2xldHMuZnJvbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9IHdvcmstPndvcmtsZXRzLmZyb250KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB0aGlzIGxvY2sgaXMgcmVkdW5kYW50IGFzIG5vIG1UaW1lc3RhbXBVc2xpc3QgaXMgb25seSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcXVldWluZyBhbnkgd29yayB0byBjb21wb25lbnQuIE9uY2UgQWRhcHRpdmVUZXN0IGlzIGFkZGVkIHNpbWlsYXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9uZSBpbiB2aWRlbyBkZWNvZGVycywgdGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IG1UaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c0hpdCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRzSGl0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRpbWVTdGFtcCBub3QgcmVjb2duaXplZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgdWludDMyX3QgbUZhaWxlZFdvcmtSZWNlaXZlZDsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtR3JhcGhpY1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIG5XaWR0aCwgbkhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZpbnB1dFNpemV9OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIG1Db21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIFVSTCkgeworICAgIHN0cmNhdChVUkwsICJiYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIpOworfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBncmFwaGljUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIGJvb2wmIGRpc2FibGVUZXN0LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lSUQsIHVpbnQzMl90IG5GcmFtZXMsIHVpbnQzMl90IG5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5IZWlnaHQsIGJvb2wgZmx1c2hlZCA9IGZhbHNlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgIGVyciA9IGdyYXBoaWNQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmV0Y2hHcmFwaGljQmxvY2sgZmFpbGVkIDogJWRcbiIsIGVycik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gR3JhcGhpYyBWaWV3CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCogcFUgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QqIHBWID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIG1lbWNweShwWSwgZGF0YSwgbldpZHRoICogbkhlaWdodCk7CisgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG5XaWR0aCAqIG5IZWlnaHQsIChuV2lkdGggKiBuSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgbWVtY3B5KHBWLCBkYXRhICsgKG5XaWR0aCAqIG5IZWlnaHQgKiA1ID4+IDIpLCBuV2lkdGggKiBuSGVpZ2h0ID4+IDIpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBFTkNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jRW5jb2RlVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+IHsKK307CisKK1RFU1RfUChDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgYm9vbCBzaWduYWxFT1MgPSBHZXRQYXJhbSgpOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIHVpbnQzMl90IGlucHV0RnJhbWVzID0gRU5DX05VTV9GUkFNRVM7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICAvLyBBZGQgaW5wdXQgdGltZXN0YW1wIHRvIHRpbWVzdGFtcFVzbGlzdAorICAgIHdoaWxlIChpbnB1dEZyYW1lcykgeworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgIHRpbWVzdGFtcCArPSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQ7CisgICAgICAgIGlucHV0RnJhbWVzLS07CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgbURpc2FibGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgIDAsIEVOQ19OVU1fRlJBTUVTLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBzaWduYWxFT1MpKTsKKyAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KKyAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNlZWRlZAorICAgIC8vIEluIHRoaXMgY2FzZXMsIHdlIHNraXAgZW5jb2RpbmcgdGhlIGlucHV0IHN0cmVhbQorICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIEVPUyBpcyBub3Qgc2VudCwgc2VuZGluZyBlbXB0eSBpbnB1dCB3aXRoIEVPUyBmbGFnCisgICAgaW5wdXRGcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgaW5wdXRGcmFtZXMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IGlucHV0RnJhbWVzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlZCIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgaW5wdXRGcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFtQ3NkICYmIChtQ29tcE5hbWUgIT0gdnA4ICYmIG1Db21wTmFtZSAhPSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgcmVjZWl2ZWQiOworICAgIH0KKworICAgIGlmIChtQ3NkICYmIChtQ29tcE5hbWUgPT0gdnA4IHx8IG1Db21wTmFtZSA9PSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgZXhwZWN0ZWQiOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgRVhQRUNUX0VRKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCisvLyBFbmNvZGVUZXN0IHdpdGggRU9TIC8gTm8gRU9TCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChFbmNvZGVUZXN0d2l0aEVPUywgQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXModHJ1ZSwgZmFsc2UpKTsKKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIm1Xb3JrUXVldWUgRW1wdHkgaXMgbm90IGV4cGVjdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdGVzdCIpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSBtV29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSA8IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciBmbHVzaCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTA7CisgICAgdWludDMyX3QgbnVtRnJhbWVzID0gRU5DX05VTV9GUkFNRVM7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0KSk7CisgICAgLy8gbURpc2FibGVUZXN0IHdpbGwgYmUgc2V0IGlmIGJ1ZmZlciB3YXMgbm90IGZldGNoZWQgcHJvcGVybHkuCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gcmVzb2x1dGlvbiBpcyBub3QgcHJvcGVyIGJ1dCBjb25maWcgc3VjZWVkZWQKKyAgICAvLyBJbiB0aGlzIGNhc2VzLCB3ZSBza2lwIGVuY29kaW5nIHRoZSBpbnB1dCBzdHJlYW0KKyAgICBpZiAobURpc2FibGVUZXN0KSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgbURpc2FibGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc0ZsdXNoZWQsIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgLy8gbURpc2FibGVUZXN0IHdpbGwgYmUgc2V0IGlmIGJ1ZmZlciB3YXMgbm90IGZldGNoZWQgcHJvcGVybHkuCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gcmVzb2x1dGlvbiBpcyBub3QgcHJvcGVyIGJ1dCBjb25maWcgc3VjZWVkZWQKKyAgICAvLyBJbiB0aGlzIGNhc2VzLCB3ZSBza2lwIGVuY29kaW5nIHRoZSBpbnB1dCBzdHJlYW0KKyAgICBpZiAobURpc2FibGVUZXN0KSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgSW52YWxpZEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZmVlZGluZyBsYXJnZXIvc21hbGxlciBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sIG1EaXNhYmxlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBsYXJnZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgbldpZHRoKjIsIG5IZWlnaHQqMiwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAvLyBGZWVkIHNtYWxsZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgbldpZHRoLzIsIG5IZWlnaHQvMiwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gMykgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBDb21wb25lbnQgZGlkbid0IHJlY2VpdmUgYWxsIGJ1ZmZlcnMgYmFjayBcbiI7CisgICAgICAgIEFMT0dXKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogMyIsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgfQorCisgICAgaWYgKG1GYWlsZWRXb3JrUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBFeHBlY3RlZCBmYWlsZWQgZnJhbWUgY291bnQgbWlzbWF0Y2ggXG4iOworICAgICAgICBBTE9HVygiZmFpbGVkRnJhbWVzUmVjZWl2ZWQgOiAlZCIsIG1GYWlsZWRXb3JrUmVjZWl2ZWQpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIFJlc29sdXRpb25UZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVuY29kaW5nIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HRCgiVHJ5aW5nIGVuY29kZSBmb3Igd2lkdGggJWQgaGVpZ2h0ICVkIiwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBtRW9zID0gZmFsc2U7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgbURpc2FibGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgIDAsIE1BWF9JTlBVVF9CVUZGRVJTLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCB0cnVlKSk7CisKKyAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KKyAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNlZWRlZAorICAgIC8vIEluIHRoaXMgY2FzZXMsIHdlIHNraXAgZW5jb2RpbmcgdGhlIGlucHV0IHN0cmVhbQorICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRTaXplcywgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgc3RkOjptYWtlX3BhaXIoNTIsIDE4KSwKKyAgICBzdGQ6Om1ha2VfcGFpcigzNjUsIDM2NSksCisgICAgc3RkOjptYWtlX3BhaXIoNDg0LCAzNjIpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDI0NCwgNDg4KSkpOworCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9tZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3Y2EzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9tZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSAorCisjZGVmaW5lIEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVCA0MDAwMAorI2RlZmluZSBFTkNfTlVNX0ZSQU1FUyAzMgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSCAzNTIKKyNkZWZpbmUgRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUIDI4OAorI2RlZmluZSBNQVhfSVRFUkFUSU9OUyAxMjgKKworI2RlZmluZSBBTElHTihfc3osIF9hbGlnbikgKChfc3ogKyAoX2FsaWduIC0gMSkpICYgfihfYWxpZ24gLSAxKSkKKworLyoKKyAqIENvbW1vbiB2aWRlbyB1dGlscworICovCisKKworI2VuZGlmICAvLyBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzOGE0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfY2xpZW50IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNsaWVudC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICBdLAorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkNTRmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMTQyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJDbGllbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzIuMC9CMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OnV0aWxzOjpCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgVjJfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBTZWFyY2hlcyBmb3IgYSBuYW1lIGluIEdldFNlcnZpY2VOYW1lcygpIGFuZCByZXR1cm5zIHRoZSBpbmRleCBmb3VuZC4gSWYgdGhlCisvLyBuYW1lIGlzIG5vdCBmb3VuZCwgdGhlIHJldHVybmVkIGluZGV4IHdpbGwgYmUgZXF1YWwgdG8KKy8vIEdldFNlcnZpY2VOYW1lcygpLnNpemUoKS4KK3NpemVfdCBnZXRTZXJ2aWNlSW5kZXgoY2hhciBjb25zdCogbmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgbmFtZXMgPSBDb2RlYzJDbGllbnQ6OkdldFNlcnZpY2VOYW1lcygpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IG5hbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChuYW1lID09IG5hbWVzW2ldKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gVGhpcyBjbGFzcyBjYWNoZXMgYSBDb2RlYzJDbGllbnQgb2JqZWN0IGFuZCBpdHMgY29tcG9uZW50IHRyYWl0cy4gVGhlIGNsaWVudAorLy8gd2lsbCBiZSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCwgYW5kIGl0IGNhbiBiZSByZWZyZXNoZWQgaWYgdGhlCisvLyBzZXJ2aWNlIGRpZXMgKGJ5IGNhbGxpbmcgaW52YWxpZGF0ZSgpKS4gVGhlIGZpcnN0IHRpbWUgbGlzdENvbXBvbmVudHMoKSBpcworLy8gY2FsbGVkIGZyb20gdGhlIGNsaWVudCwgdGhlIHJlc3VsdCB3aWxsIGJlIGNhY2hlZC4KK2NsYXNzIENvZGVjMkNsaWVudDo6Q2FjaGUgeworICAgIC8vIENhY2hlZCBjbGllbnQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ2xpZW50TXV0ZXg7CisKKyAgICAvLyBDYWNoZWQgY29tcG9uZW50IHRyYWl0cworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IG1UcmFpdHM7CisgICAgc3RkOjpvbmNlX2ZsYWcgbVRyYWl0c0luaXRpYWxpemF0aW9uRmxhZzsKKworICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgc2VydmljZS4gVGhpcyBpcyBiYXNlZCBvbiBHZXRTZXJ2aWNlTmFtZXMoKS4KKyAgICBzaXplX3QgbUluZGV4OworICAgIC8vIENhbGxlZCBieSBzKCkgZXhhY3RseSBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNhY2hlLiBUaGUgaW5kZXggbXVzdCBiZSBhCisgICAgLy8gdmFsaWQgaW5kZXggaW50byB0aGUgdmVjdG9yIHJldHVybmVkIGJ5IEdldFNlcnZpY2VOYW1lcygpLiBDYWxsaW5nCisgICAgLy8gaW5pdChpbmRleCkgd2lsbCBhc3NvY2lhdGUgdGhlIGNhY2hlIHRvIHRoZSBzZXJ2aWNlIHdpdGggbmFtZQorICAgIC8vIEdldFNlcnZpY2VOYW1lcygpW2luZGV4XS4KKyAgICB2b2lkIGluaXQoc2l6ZV90IGluZGV4KSB7CisgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgIH0KKworcHVibGljOgorICAgIENhY2hlKCkgPSBkZWZhdWx0OworCisgICAgLy8gSW5pdGlhbGl6ZXMgbUNsaWVudCBpZiBuZWVkZWQsIHRoZW4gcmV0dXJucyBtQ2xpZW50LgorICAgIC8vIElmIHRoZSBzZXJ2aWNlIGlzIHVuYXZhaWxhYmxlIGJ1dCBsaXN0ZWQgaW4gdGhlIG1hbmlmZXN0LCB0aGlzIGZ1bmN0aW9uCisgICAgLy8gd2lsbCBibG9jayBpbmRlZmluaXRlbHkuCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gZ2V0Q2xpZW50KCkgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUNsaWVudE11dGV4fTsKKyAgICAgICAgaWYgKCFtQ2xpZW50KSB7CisgICAgICAgICAgICBtQ2xpZW50ID0gQ29kZWMyQ2xpZW50OjpfQ3JlYXRlRnJvbUluZGV4KG1JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DbGllbnQ7CisgICAgfQorCisgICAgLy8gQ2F1c2VzIGEgc3Vic2VxdWVudCBjYWxsIHRvIGdldENsaWVudCgpIHRvIGNyZWF0ZSBhIG5ldyBjbGllbnQuIFRoaXMKKyAgICAvLyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2aWNlIGRpZXMuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGJ5IEZvckFsbFNlcnZpY2VzKCkuCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUNsaWVudE11dGV4fTsKKyAgICAgICAgbUNsaWVudCA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gUmV0dXJucyBhIGxpc3Qgb2YgdHJhaXRzIGZvciBjb21wb25lbnRzIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZS4gVGhpcworICAgIC8vIGxpc3QgaXMgY2FjaGVkLgorICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBnZXRUcmFpdHMoKSB7CisgICAgICAgIHN0ZDo6Y2FsbF9vbmNlKG1UcmFpdHNJbml0aWFsaXphdGlvbkZsYWcsIFt0aGlzXSgpIHsKKyAgICAgICAgICAgIGJvb2wgc3VjY2Vzc3tmYWxzZX07CisgICAgICAgICAgICAvLyBTcGluIHVudGlsIF9saXN0Q29tcG9uZW50cygpIGlzIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICAgICAgICAgIG1UcmFpdHMgPSBjbGllbnQtPl9saXN0Q29tcG9uZW50cygmc3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8ga1NlcnZpY2VSZXRyeVBlcmlvZCA9IDVzOworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGNvbXBvbmVudCB0cmFpdHMgZnJvbSBzZXJ2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiA8PCBHZXRTZXJ2aWNlTmFtZXMoKVttSW5kZXhdIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cnlpbmcuLi4iOworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihrU2VydmljZVJldHJ5UGVyaW9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBtVHJhaXRzOworICAgIH0KKworICAgIC8vIExpc3QoKSByZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBjYWNoZXMuCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPENhY2hlPiYgTGlzdCgpIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPENhY2hlPiBzQ2FjaGVze1tdKCkgeworICAgICAgICAgICAgc2l6ZV90IG51bVNlcnZpY2VzID0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FjaGU+IGNhY2hlcyhudW1TZXJ2aWNlcyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlcnZpY2VzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjYWNoZXNbaV0uaW5pdChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZXM7CisgICAgICAgIH0oKX07CisgICAgICAgIHJldHVybiBzQ2FjaGVzOworICAgIH0KK307CisKKy8vIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudAorCitjb25zdCBDMlN0cmluZyYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtTmFtZTsKK30KKworQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpDb2RlYzJDb25maWd1cmFibGVDbGllbnQoCisgICAgICAgIGNvbnN0IHNwPElDb25maWd1cmFibGU+JiBiYXNlKQorICAgICAgOiBtQmFzZXtiYXNlfSwKKyAgICAgICAgbU5hbWV7W2Jhc2VdKCkgLT4gQzJTdHJpbmcgeworICAgICAgICAgICAgICAgIEMyU3RyaW5nIG91dE5hbWU7CisgICAgICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmb3V0TmFtZV0oY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lID0gbmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zU3RhdHVzLmlzT2soKSA/IG91dE5hbWUgOiAiIjsKKyAgICAgICAgICAgIH0oKX0geworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKAorICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBzdGFja1BhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgIH0KKyAgICBzaXplX3QgbnVtU3RhY2tJbmRpY2VzID0gbnVtSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICB9CisgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgaWYgKGhlYXBQYXJhbXMpIHsKKyAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5xdWVyeSgKKyAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnkgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSBlcnJvciB3aGlsZSBwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhcmFtUG9pbnRlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbVBvaW50ZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1TdGFja0luZGljZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpICYmICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gc3RhY2tQYXJhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gdW5leHBlY3RlZCBlcnJvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0gcGFyYW1Qb2ludGVyLT5pbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBwYXJhbSBza2lwcGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gdXBkYXRlIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtUG9pbnRlci0+aW5kZXgoKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBleHRyYSBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBQYXJhbXMgaGlkbFBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmhpZGxQYXJhbXMsIHBhcmFtcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tIGJhZCBpbnB1dC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbmZpZygKKyAgICAgICAgICAgIGhpZGxQYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJnBhcmFtcywgZmFpbHVyZXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1zJiBvKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGZhaWx1cmVzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgZmFpbHVyZXMtPnJlc2l6ZShpICsgZi5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgU2V0dGluZ1Jlc3VsdCYgc2YgOiBmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKmZhaWx1cmVzKVtpKytdLCBzZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIFNldHRpbmdSZXN1bHQgcmV0dXJuZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZVBhcmFtc0Zyb21CbG9iKHBhcmFtcywgbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIHRvIHBhcnNlIHJldHVybmVkIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogQ2FjaGUgYW5kIHF1ZXJ5IHByb3Blcmx5IQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWluKCksCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCksCisgICAgICAgICAgICBbJnN0YXR1cywgcGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4mIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBwYXJhbXMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnJlc2l6ZShpICsgcC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgUGFyYW1EZXNjcmlwdG9yJiBzcCA6IHApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJigqcGFyYW1zKVtpKytdLCBzcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgcmV0dXJuZWQgUGFyYW1EZXNjcmlwdG9yLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCB7CisgICAgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gaW5GaWVsZHMoZmllbGRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmluRmllbGRzW2ldLCBmaWVsZHNbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBiYWQgaW5wdXQiOworICAgICAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBpbkZpZWxkcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5GaWVsZHMsICZmaWVsZHNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdD4mIHIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHIuc2l6ZSgpICE9IGZpZWxkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBhbmQgb3V0cHV0IGxpc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZmaWVsZHNbaV0sIGluRmllbGRzW2ldLCByW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZXR1cm5lZCB2YWx1ZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpIaWRsTGlzdGVuZXIKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyIDogcHVibGljIElDb21wb25lbnRMaXN0ZW5lciB7CisgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25Xb3JrRG9uZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0l0ZW1zLCB3b3JrQnVuZGxlKSkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25Xb3JrRG9uZSAtLSByZWNlaXZlZCBjb3JydXB0ZWQgV29ya0J1bmRsZS4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZWxlYXNlIGlucHV0IGJ1ZmZlcnMgcG90ZW50aWFsbHkgaGVsZCBieSB0aGUgY29tcG9uZW50IGZyb20gcXVldWUKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPQorICAgICAgICAgICAgICAgIGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+aGFuZGxlT25Xb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmUoY29tcG9uZW50LCB3b3JrSXRlbXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25Xb3JrRG9uZSAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiYgc2V0dGluZ1Jlc3VsdHMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyU2V0dGluZ1Jlc3VsdHMoCisgICAgICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXR0aW5nUmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gYzJTZXR0aW5nUmVzdWx0OworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmMyU2V0dGluZ1Jlc3VsdCwgc2V0dGluZ1Jlc3VsdHNbaV0pKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25UcmlwcGVkIC0tIHJlY2VpdmVkIGNvcnJ1cHRlZCBTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyU2V0dGluZ1Jlc3VsdHNbaV0gPSBzdGQ6Om1vdmUoYzJTZXR0aW5nUmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vblRyaXBwZWQoY29tcG9uZW50LCBjMlNldHRpbmdSZXN1bHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkVycm9yKFN0YXR1cyBzLCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSIKKyAgICAgICAgICAgICAgICAgICA8PCAiIHN0YXR1cyA9ICIgPDwgcworICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yQ29kZSA9ICIgPDwgZXJyb3JDb2RlCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcihjb21wb25lbnQsIHMgPT0gU3RhdHVzOjpPSyA/CisgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA6IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkVycm9yIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpOworICAgICAgICBpZiAoIWxpc3RlbmVyKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkZyYW1lc1JlbmRlcmVkIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBSZW5kZXJlZEZyYW1lJiByZW5kZXJlZEZyYW1lIDogcmVuZGVyZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuYnVmZmVyUXVldWVJZCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS5zbG90SWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUudGltZXN0YW1wTnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPElucHV0QnVmZmVyPiYgaW5wdXRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0QnVmZmVyIDogaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCBkZWF0aCBub3RpZmljYXRpb24gb2YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnB1dCBidWZmZXI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJhbWVJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgbGlzdGVuZXItPm9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4LCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworfTsKKworLy8gQ29kZWMyQ2xpZW50CitDb2RlYzJDbGllbnQ6OkNvZGVjMkNsaWVudChjb25zdCBzcDxJQ29tcG9uZW50U3RvcmU+JiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlcnZpY2VJbmRleCkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1TZXJ2aWNlSW5kZXh7c2VydmljZUluZGV4fSB7CisgICAgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gdHJhbnNSZXN1bHQgPSBiYXNlLT5nZXRQb29sQ2xpZW50TWFuYWdlcigpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImdldFBvb2xDbGllbnRNYW5hZ2VyIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ib3N0UG9vbE1hbmFnZXIgPSBzdGF0aWNfY2FzdDxzcDxJQ2xpZW50TWFuYWdlcj4+KHRyYW5zUmVzdWx0KTsKKyAgICB9Cit9CisKK3NwPENvZGVjMkNsaWVudDo6QmFzZT4gY29uc3QmIENvZGVjMkNsaWVudDo6Z2V0QmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKK3N0ZDo6c3RyaW5nIGNvbnN0JiBDb2RlYzJDbGllbnQ6OmdldFNlcnZpY2VOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBHZXRTZXJ2aWNlTmFtZXMoKVttU2VydmljZUluZGV4XTsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpIHsKKworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBzcDxDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcj4gaGlkbExpc3RlbmVyID0gbmV3IENvbXBvbmVudDo6SGlkbExpc3RlbmVye307CisgICAgaGlkbExpc3RlbmVyLT5iYXNlID0gbGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBoaWRsTGlzdGVuZXIsCisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbXBvbmVudCwgaGlkbExpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29tcG9uZW50ID0gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4oYyk7CisgICAgICAgICAgICAgICAgaGlkbExpc3RlbmVyLT5jb21wb25lbnQgPSAqY29tcG9uZW50OworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgaWYgKCEqY29tcG9uZW50KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIG51bGwgY29tcG9uZW50LiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgc3RhdHVzID0gKCpjb21wb25lbnQpLT5zZXREZWF0aExpc3RlbmVyKCpjb21wb25lbnQsIGxpc3RlbmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIGZhaWxlZCB0byBzZXQgdXAgZGVhdGggbGlzdGVuZXI6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKworICAgICgqY29tcG9uZW50KS0+bUJ1ZmZlclBvb2xTZW5kZXIuc2V0UmVjZWl2ZXIobUhvc3RQb29sTWFuYWdlcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IEMyU3RyaW5nJiBuYW1lLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBbJnN0YXR1cywgaW50ZXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRJbnRlcmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnRlcmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlSW50ZXJmYWNlKCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4qIGNvbnN0IGlucHV0U3VyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgWyZzdGF0dXMsIGlucHV0U3VyZmFjZV0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmlucHV0U3VyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlPihpKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUlucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJjcmVhdGVJbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBjb25zdCYgQ29kZWMyQ2xpZW50OjpsaXN0Q29tcG9uZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FjaGU6Okxpc3QoKVttU2VydmljZUluZGV4XS5nZXRUcmFpdHMoKTsKK30KKworc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gQ29kZWMyQ2xpZW50OjpfbGlzdENvbXBvbmVudHMoCisgICAgICAgIGJvb2wqIHN1Y2Nlc3MpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHM7CisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHNlcnZpY2VOYW1lID0gZ2V0U2VydmljZU5hbWUoKTsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+bGlzdENvbXBvbmVudHMoCisgICAgICAgICAgICBbJnRyYWl0cywgJnNlcnZpY2VOYW1lXShTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4mIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIl9saXN0Q29tcG9uZW50cyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhaXRzLnJlc2l6ZSh0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZ0cmFpdHNbaV0sIHRbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJfbGlzdENvbXBvbmVudHMgLS0gY29ycnVwdGVkIG91dHB1dC4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyYWl0c1tpXS5vd25lciA9IHNlcnZpY2VOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIl9saXN0Q29tcG9uZW50cyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqc3VjY2VzcyA9IHRydWU7CisgICAgfQorICAgIHJldHVybiB0cmFpdHM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y29weUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgc3JjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQ/CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICBMT0coRVJST1IpIDw8ICJjb3B5QnVmZmVyIG5vdCBpbXBsZW1lbnRlZCI7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPgorICAgICAgICBDb2RlYzJDbGllbnQ6OmdldFBhcmFtUmVmbGVjdG9yKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGV4cG9zZWQgYXMgQzJQYXJhbVJlZmxlY3RvciBvbiB0aGUgY2xpZW50IHNpZGU7IGluc3RlYWQsIGl0CisgICAgLy8gc2hvdWxkIHJlZmxlY3QgdGhlIEhBTCBBUEkuCisgICAgc3RydWN0IFNpbXBsZVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoMSk7CisgICAgICAgICAgICBpbmRpY2VzWzBdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oY29yZUluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIFsmZGVzY3JpcHRvcl0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4mIHNkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgdmVjdG9yIG9mIHNpemUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2Quc2l6ZSgpIDw8ICIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgYmUgMS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZGVzY3JpcHRvciwgc2RbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJ1cHRlZCBkYXRhLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIFNpbXBsZVBhcmFtUmVmbGVjdG9yKHNwPEJhc2U+IGJhc2UpCisgICAgICAgICAgICA6IG1CYXNlKGJhc2UpIHsgfQorCisgICAgICAgIHNwPEJhc2U+IG1CYXNlOworICAgIH07CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVQYXJhbVJlZmxlY3Rvcj4obUJhc2UpOworfTsKKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBDb2RlYzJDbGllbnQ6OkdldFNlcnZpY2VOYW1lcygpIHsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNTZXJ2aWNlTmFtZXN7W10oKSB7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlOworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzI6OklTZXJ2aWNlTWFuYWdlcjsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IElTZXJ2aWNlTWFuYWdlcjo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgQ0hFQ0soc2VydmljZU1hbmFnZXIpIDw8ICJIYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaXMgbm90IHJ1bm5pbmcuIjsKKworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHRocmVlIGNhdGVnb3JpZXMgb2Ygc2VydmljZXMgYmFzZWQgb24gbmFtZXMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGVmYXVsdE5hbWVzOyAvLyBQcmVmaXhlZCB3aXRoICJkZWZhdWx0IgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlbmRvck5hbWVzOyAgLy8gUHJlZml4ZWQgd2l0aCAidmVuZG9yIgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG90aGVyTmFtZXM7ICAgLy8gT3RoZXJzCisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQ7CisgICAgICAgICAgICB0cmFuc1Jlc3VsdCA9IHNlcnZpY2VNYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBbJmRlZmF1bHROYW1lcywgJnZlbmRvck5hbWVzLCAmb3RoZXJOYW1lc10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGNvbnN0JiBpbnN0YW5jZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGhpZGxfc3RyaW5nIGNvbnN0JiBpbnN0YW5jZU5hbWUgOiBpbnN0YW5jZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogbmFtZSA9IGluc3RhbmNlTmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKG5hbWUsICJkZWZhdWx0IiwgNykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TmFtZXMuZW1wbGFjZV9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChuYW1lLCAidmVuZG9yIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOYW1lcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTb3J0IHNlcnZpY2UgbmFtZXMgaW4gZWFjaCBjYXRlZ29yeS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQoZGVmYXVsdE5hbWVzLmJlZ2luKCksIGRlZmF1bHROYW1lcy5lbmQoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KHZlbmRvck5hbWVzLmJlZ2luKCksIHZlbmRvck5hbWVzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQob3RoZXJOYW1lcy5iZWdpbigpLCBvdGhlck5hbWVzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSB0aHJlZSBsaXN0cyBpbiB0aGlzIG9yZGVyOiBkZWZhdWx0LCB2ZW5kb3IsCisgICAgICAgICAgICAgICAgLy8gb3RoZXIuCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBuYW1lcyA9IGRlZmF1bHROYW1lczsKKyAgICAgICAgICAgICAgICBuYW1lcy5yZXNlcnZlKG5hbWVzLnNpemUoKSArIHZlbmRvck5hbWVzLnNpemUoKSArIG90aGVyTmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBuYW1lcy5pbnNlcnQobmFtZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHZlbmRvck5hbWVzLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih2ZW5kb3JOYW1lcy5lbmQoKSkpOworICAgICAgICAgICAgICAgIG5hbWVzLmluc2VydChuYW1lcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iob3RoZXJOYW1lcy5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iob3RoZXJOYW1lcy5lbmQoKSkpOworCisgICAgICAgICAgICAgICAgLy8gU3VtbWFyaXplIHRvIGxvZ2NhdC4KKyAgICAgICAgICAgICAgICBpZiAobmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk5vIENvZGVjMiBzZXJ2aWNlcyBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QuIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHJpbmdPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ091dHB1dCA8PCAiQXZhaWxhYmxlIENvZGVjMiBzZXJ2aWNlczoiOworICAgICAgICAgICAgICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lIDogbmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ091dHB1dCA8PCAiIFwiIiA8PCBuYW1lIDw8ICJcIiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8IHN0cmluZ091dHB1dC5zdHIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmV0cmlldmUgdGhlIGxpc3Qgb2Ygc2VydmljZSBpbnN0YW5jZXMgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBJQ29tcG9uZW50U3RvcmU6OmRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4gUmV0cnlpbmcuLi4iOworICAgICAgICB9CisgICAgfSgpfTsKKyAgICByZXR1cm4gc1NlcnZpY2VOYW1lczsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSkgeworICAgIHNpemVfdCBpbmRleCA9IGdldFNlcnZpY2VJbmRleChuYW1lKTsKKyAgICByZXR1cm4gaW5kZXggPT0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpID8KKyAgICAgICAgICAgIG51bGxwdHIgOiBfQ3JlYXRlRnJvbUluZGV4KGluZGV4KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4+IENvZGVjMkNsaWVudDo6CisgICAgICAgIENyZWF0ZUZyb21BbGxTZXJ2aWNlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Pj4gY2xpZW50cygKKyAgICAgICAgICAgIEdldFNlcnZpY2VOYW1lcygpLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKTsgaSA+IDA7ICkgeworICAgICAgICAtLWk7CisgICAgICAgIGNsaWVudHNbaV0gPSBfQ3JlYXRlRnJvbUluZGV4KGkpOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpfQ3JlYXRlRnJvbUluZGV4KHNpemVfdCBpbmRleCkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lID0gR2V0U2VydmljZU5hbWVzKClbaW5kZXhdOworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgYSBDb2RlYzIgY2xpZW50IHRvIHNlcnZpY2UgXCIiIDw8IG5hbWUgPDwgIlwiIjsKKyAgICBzcDxCYXNlPiBiYXNlU3RvcmUgPSBCYXNlOjpnZXRTZXJ2aWNlKG5hbWUpOworICAgIENIRUNLKGJhc2VTdG9yZSkgPDwgIkNvZGVjMiBzZXJ2aWNlIFwiIiA8PCBuYW1lIDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW5hY2Nlc3NpYmxlIGZvciB1bmtub3duIHJlYXNvbnMuIjsKKyAgICBMT0coSU5GTykgPDwgIkNsaWVudCB0byBDb2RlYzIgc2VydmljZSBcIiIgPDwgbmFtZSA8PCAiXCIgY3JlYXRlZCI7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50PihiYXNlU3RvcmUsIGluZGV4KTsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpGb3JBbGxTZXJ2aWNlcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPgorICAgICAgICAgICAgcHJlZGljYXRlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfTk9fSU5JVDsgIC8vIG5vIElDb21wb25lbnRTdG9yZXMgcHJlc2VudAorCisgICAgLy8gQ2FjaGUgdGhlIG1hcHBpbmcga2V5IC0+IGluZGV4IG9mIENvZGVjMkNsaWVudCBpbiBDYWNoZTo6TGlzdCgpLgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IGtleTJJbmRleE11dGV4OworICAgIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2l6ZV90PiBrZXkySW5kZXg7CisKKyAgICAvLyBCeSBkZWZhdWx0IHRyeSBhbGwgc3RvcmVzLiBIb3dldmVyLCB0cnkgdGhlIGxhc3Qga25vd24gY2xpZW50IGZpcnN0LiBJZgorICAgIC8vIHRoZSBsYXN0IGtub3duIGNsaWVudCBmYWlscywgcmV0cnkgb25jZS4gV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBsYXN0CisgICAgLy8ga25vd24gY2xpZW50IGluIGZyb250IG9mIHRoZSBsaXN0IG9mIGFsbCBjbGllbnRzLgorICAgIHN0ZDo6ZGVxdWU8c2l6ZV90PiBpbmRpY2VzOworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gQ2FjaGU6Okxpc3QoKS5zaXplKCk7IGluZGV4ID4gMDsgKSB7CisgICAgICAgIGluZGljZXMucHVzaF9mcm9udCgtLWluZGV4KTsKKyAgICB9CisKKyAgICBib29sIHdhc01hcHBlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre2tleTJJbmRleE11dGV4fTsKKyAgICAgICAgYXV0byBpdCA9IGtleTJJbmRleC5maW5kKGtleSk7CisgICAgICAgIGlmIChpdCAhPSBrZXkySW5kZXguZW5kKCkpIHsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9mcm9udChpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIHdhc01hcHBlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgQ2FjaGUmIGNhY2hlID0gQ2FjaGU6Okxpc3QoKVtpbmRleF07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudHtjYWNoZS5nZXRDbGllbnQoKX07CisgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHByZWRpY2F0ZShjbGllbnQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3trZXkySW5kZXhNdXRleH07CisgICAgICAgICAgICAgICAga2V5MkluZGV4W2tleV0gPSBpbmRleDsgLy8gdXBkYXRlIGxhc3Qga25vd24gY2xpZW50IGluZGV4CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh3YXNNYXBwZWQpIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ291bGQgbm90IGZpbmQgXCIiIDw8IGtleSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiB0aGUgbGFzdCBpbnN0YW5jZS4gUmV0cnlpbmcuLi4iOworICAgICAgICAgICAgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgICAgICAgICBjYWNoZS5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsgIC8vIHJldHVybiB0aGUgbGFzdCBzdGF0dXMgZnJvbSBhIHZhbGlkIGNsaWVudAorfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+CisgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFNlcnZpY2VzKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgJmxpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSUNvbXBvbmVudFN0b3JlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6OmNyZWF0ZUNvbXBvbmVudChcIiIgPDwgY29tcG9uZW50TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIikgcmV0dXJuZWQgc3RhdHVzID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkNvdWxkIG5vdCBjcmVhdGUgY29tcG9uZW50IFwiIiA8PCBjb21wb25lbnROYW1lIDw8ICJcIi4gIgorICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTZXJ2aWNlcygKKyAgICAgICAgICAgIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBbb3duZXIsICZpbnRlcmZhY2UsIGludGVyZmFjZU5hbWVdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlSW50ZXJmYWNlKGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlSW50ZXJmYWNlKFwiIiA8PCBpbnRlcmZhY2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBpbnRlcmZhY2UgXCIiIDw8IGludGVyZmFjZU5hbWUgPDwgIlwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgIlN0YXR1cyA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKworc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gY29uc3QmIENvZGVjMkNsaWVudDo6TGlzdENvbXBvbmVudHMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IHNMaXN0e1tdKCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBsaXN0OworICAgICAgICBmb3IgKENhY2hlJiBjYWNoZSA6IENhY2hlOjpMaXN0KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiB0cmFpdHMgPSBjYWNoZS5nZXRUcmFpdHMoKTsKKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGxpc3QuZW5kKCksIHRyYWl0cy5iZWdpbigpLCB0cmFpdHMuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0oKX07CisgICAgcmV0dXJuIHNMaXN0OworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IENvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBjaGFyIGNvbnN0KiBzZXJ2aWNlTmFtZSkgeworICAgIGludDMyX3QgaW5wdXRTdXJmYWNlU2V0dGluZyA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzJpbnB1dHN1cmZhY2UiLCBpbnQzMl90KDApKTsKKyAgICBpZiAoaW5wdXRTdXJmYWNlU2V0dGluZyA8PSAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3QgaW5kZXggPSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCk7CisgICAgaWYgKHNlcnZpY2VOYW1lKSB7CisgICAgICAgIGluZGV4ID0gZ2V0U2VydmljZUluZGV4KHNlcnZpY2VOYW1lKTsKKyAgICAgICAgaWYgKGluZGV4ID09IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKSkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiQ3JlYXRlSW5wdXRTdXJmYWNlIC0tIGludmFsaWQgc2VydmljZSBuYW1lOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZU5hbWUgPDwgIlwiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlOworICAgIGlmIChpbmRleCAhPSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCkpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gQ2FjaGU6Okxpc3QoKVtpbmRleF0uZ2V0Q2xpZW50KCk7CisgICAgICAgIGlmIChjbGllbnQtPmNyZWF0ZUlucHV0U3VyZmFjZSgmaW5wdXRTdXJmYWNlKSA9PSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0U3VyZmFjZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0coSU5GTykgPDwgIkNyZWF0ZUlucHV0U3VyZmFjZSAtLSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgImZyb20gYWxsIHNlcnZpY2VzLi4uIjsKKyAgICBmb3IgKENhY2hlJiBjYWNoZSA6IENhY2hlOjpMaXN0KCkpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gY2FjaGUuZ2V0Q2xpZW50KCk7CisgICAgICAgIGlmIChjbGllbnQtPmNyZWF0ZUlucHV0U3VyZmFjZSgmaW5wdXRTdXJmYWNlKSA9PSBDMl9PSykgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDcmVhdGVJbnB1dFN1cmZhY2UgLS0gaW5wdXQgc3VyZmFjZSBvYnRhaW5lZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZSBcIiIgPDwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpIDw8ICJcIiI7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdXJmYWNlOworICAgICAgICB9CisgICAgfQorICAgIExPRyhXQVJOSU5HKSA8PCAiQ3JlYXRlSW5wdXRTdXJmYWNlIC0tIGZhaWxlZCB0byBjcmVhdGUgYW4gaW5wdXQgc3VyZmFjZSAiCisgICAgICAgICAgICAgICAgICAgICJmcm9tIGFsbCBzZXJ2aWNlcyI7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6TGlzdGVuZXIKKworQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcjo6fkxpc3RlbmVyKCkgeworfQorCisvLyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZQorQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2U6OkludGVyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0geworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudAorQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkNvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gdHJhbnNSZXN1bHQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQxLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbXBvbmVudEludGVyZmFjZT4+KHRyYW5zUmVzdWx0MSktPgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0Mi5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0MikgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXJ7bnVsbHB0cn0geworfQorCitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90KiBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaWQpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGJsb2NrUG9vbElkLCBjb25maWd1cmFibGVdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcElkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmFibGUtPnJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjcmVhdGVCbG9ja1Bvb2wgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpibG9ja1Bvb2xJZCA9IHN0YXRpY19jYXN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90PihwSWQpOworICAgICAgICAgICAgICAgICpjb25maWd1cmFibGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbmZpZ3VyYWJsZT4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBtQmFzZS0+ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihsb2NhbElkKSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVzdHJveUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK3ZvaWQgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmhhbmRsZU9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWUuaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKHdvcmtJdGVtcyk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpxdWV1ZSgKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsICppdGVtcywgJm1CdWZmZXJQb29sU2VuZGVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZSAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVldWUod29ya0J1bmRsZSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWUgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmZsdXNoKAorICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpbW9kZTsgLy8gRmx1c2ggbW9kZSBpc24ndCBzdXBwb3J0ZWQgaW4gSElETCB5ZXQuCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5mbHVzaCgKKyAgICAgICAgICAgIFsmc3RhdHVzLCBmbHVzaGVkV29ya10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBXb3JrQnVuZGxlJiB3YikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImZsdXNoIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoZmx1c2hlZFdvcmssIHdiKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmx1c2ggLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gSW5kaWNlcyBvZiBmbHVzaGVkIHdvcmsgaXRlbXMuCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGZsdXNoZWRJbmRpY2VzOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiAqZmx1c2hlZFdvcmspIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpbnB1dCBpcyBjb21wbGV0ZQorICAgICAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWUuaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKCpmbHVzaGVkV29yayk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+ZHJhaW4oCisgICAgICAgICAgICBtb2RlID09IEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRyYWluIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImRyYWluIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdGFydCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInN0YXJ0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInN0YXJ0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdG9wKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnN0b3AoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdG9wIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInN0b3AgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlc2V0KCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVzZXQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicmVzZXQgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cmVsZWFzZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlbGVhc2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicmVsZWFzZSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKSB7CisgICAgdWludDY0X3QgYnFJZCA9IDA7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbnVsbElnYnA7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+IG51bGxIZ2JwOworCisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+IGlnYnAgPSBzdXJmYWNlID8KKyAgICAgICAgICAgIHN1cmZhY2UtPmdldEhhbEludGVyZmFjZTxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4oKSA6IG51bGxIZ2JwOworICAgIGlmIChzdXJmYWNlICYmICFpZ2JwKSB7CisgICAgICAgIGlnYnAgPSBuZXcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMihzdXJmYWNlKTsKKyAgICB9CisKKyAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmNvbmZpZ3VyZShudWxsSWdicCwgZ2VuZXJhdGlvbiwgMCk7CisgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmYnFJZCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSAiCisgICAgICAgICAgICAgICAgICAgImNhbm5vdCBvYnRhaW4gYnVmZmVycXVldWUgaWQuIjsKKyAgICAgICAgYnFJZCA9IDA7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5jb25maWd1cmUobnVsbElnYnAsIGdlbmVyYXRpb24sIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5jb25maWd1cmUoc3VyZmFjZSwgZ2VuZXJhdGlvbiwgYnFJZCk7CisgICAgfQorICAgIEFMT0dEKCJnZW5lcmF0aW9uIHJlbW90ZSBjaGFuZ2UgJXUiLCBnZW5lcmF0aW9uKTsKKworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLAorICAgICAgICAgICAgYnFJZCA9PSAwID8gbnVsbEhnYnAgOiBpZ2JwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlVG9PdXRwdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpIHsKKyAgICByZXR1cm4gbU91dHB1dEJ1ZmZlclF1ZXVlLm91dHB1dEJ1ZmZlcihibG9jaywgaW5wdXQsIG91dHB1dCk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojpjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiogY29ubmVjdGlvbikgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5tQmFzZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImNvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHByb2R1Y2VyLCBzb3VyY2UsCisgICAgICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZGlzY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldERlYXRoTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisKKyAgICBzdHJ1Y3QgSGlkbERlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TGlzdGVuZXI+IGJhc2U7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25EZWF0aChjb21wb25lbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkRlYXRoIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxIaWRsRGVhdGhSZWNpcGllbnQ+IGRlYXRoUmVjaXBpZW50ID0gbmV3IEhpZGxEZWF0aFJlY2lwaWVudCgpOworICAgIGRlYXRoUmVjaXBpZW50LT5iYXNlID0gbGlzdGVuZXI7CisgICAgZGVhdGhSZWNpcGllbnQtPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgIGNvbXBvbmVudC0+bURlYXRoUmVjaXBpZW50ID0gZGVhdGhSZWNpcGllbnQ7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gY29tcG9uZW50LT5tQmFzZS0+bGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zUmVzdWx0KSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXREZWF0aExpc3RlbmVyIC0tIGxpbmtUb0RlYXRoKCkgY2FsbCBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZQorQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZShjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXJ7bmV3CisgICAgICAgICAgICBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIyKFtiYXNlXSgpIC0+IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpKX0geworfQorCitzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworfQorCitzcDxJSW5wdXRTdXJmYWNlPiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6Z2V0SGFsSW50ZXJmYWNlKCkgY29uc3QgeworICAgIHJldHVybiBtQmFzZTsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uCitDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0geworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBtQmFzZS0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTdmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApAQCAtMCwwICsxLDQzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9DTElFTlRfSAorI2RlZmluZSBDT0RFQzJfSElETF9DTElFTlRfSAorCisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ2xpZW50QmxvY2tIZWxwZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pbmltYWwgaW50ZXJmYWNlcyBmb3IgdGhlIGZyYW1ld29yayB0byBhY2Nlc3MgQ29kZWMyLjAuCisgKgorICogQ29kZWMyQ2xpZW50IGlzIHRoZSBtYWluIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbm5lciBjbGFzc2VzOgorICogLSBMaXN0ZW5lcgorICogLSBDb25maWd1cmFibGUKKyAqIC0gSW50ZXJmYWNlCisgKiAtIENvbXBvbmVudAorICoKKyAqIENsYXNzZXMgaW4gQ29kZWMyQ2xpZW50LCBpbnRlcmZhY2VzIGluIENvZGVjMi4wLCBhbmQgIEhJREwgaW50ZXJmYWNlcyBhcmUKKyAqIHJlbGF0ZWQgYXMgZm9sbG93czoKKyAqIC0gQ29kZWMyQ2xpZW50IDw9PT4gQzJDb21wb25lbnRTdG9yZSA8PT0+IElDb21wb25lbnRTdG9yZQorICogLSBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIDw9PT4gQzJDb21wb25lbnQ6Okxpc3RlbmVyIDw9PT4gSUNvbXBvbmVudExpc3RlbmVyCisgKiAtIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIDw9PT4gW05vIGVxdWl2YWxlbnRdIDw9PT4gSUNvbmZpZ3VyYWJsZQorICogLSBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSA8PT0+IEMyQ29tcG9uZW50SW50ZXJmYWNlIDw9PT4gSUNvbXBvbmVudEludGVyZmFjZQorICogLSBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA8PT0+IEMyQ29tcG9uZW50IDw9PT4gSUNvbXBvbmVudAorICoKKyAqIFRoZSBlbnRyeSBwb2ludCBpcyBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCksIHdoaWNoIGNyZWF0ZXMgYQorICogQ29kZWMyQ2xpZW50IG9iamVjdC4gRnJvbSBDb2RlYzJDbGllbnQsIEludGVyZmFjZSBhbmQgQ29tcG9uZW50IG9iamVjdHMgY2FuCisgKiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgY3JlYXRlQ29tcG9uZW50KCkgYW5kIGNyZWF0ZUludGVyZmFjZSgpLgorICoKKyAqIGNyZWF0ZUNvbXBvbmVudCgpIHRha2VzIGEgTGlzdGVuZXIgb2JqZWN0LCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZQorICogdXNlci4KKyAqCisgKiBBdCB0aGUgcHJlc2VudCwgY3JlYXRlQmxvY2tQb29sKCkgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgeWllbGRzIGEKKyAqIENvbmZpZ3VyYWJsZSBvYmplY3QuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgSW50ZXJmYWNlLCBDb21wb25lbnQgYW5kCisgKiBDb2RlYzJDbGllbnQgYXJlIGFsbCBzdWJjbGFzc2VzIG9mIENvbmZpZ3VyYWJsZS4KKyAqLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHJlbGV2YW50IEhJREwgaW50ZXJmYWNlcworCituYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMCB7CitzdHJ1Y3QgSUNvbmZpZ3VyYWJsZTsKK3N0cnVjdCBJQ29tcG9uZW50Oworc3RydWN0IElDb21wb25lbnRJbnRlcmZhY2U7CitzdHJ1Y3QgSUNvbXBvbmVudFN0b3JlOworc3RydWN0IElJbnB1dFNpbms7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wCisKK25hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzAgeworc3RydWN0IElDbGllbnRNYW5hZ2VyOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMAorCituYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30gIC8vIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzAKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wIHsKK3N0cnVjdCBJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoaXMgY2xhc3MgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlLCBidXQgZm9yd2FyZAorLy8gZGVjbGFyYXRpb24gb2YgYW4gaW5uZXIgY2xhc3MgaXMgbm90IHBvc3NpYmxlLgorc3RydWN0IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudCB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbmZpZ3VyYWJsZSBCYXNlOworCisgICAgY29uc3QgQzJTdHJpbmcmIGdldE5hbWUoKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdDsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworICAgIEMyU3RyaW5nIG1OYW1lOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50IDogcHVibGljIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudCB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlIEJhc2U7CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXI7CisKKyAgICB0eXBlZGVmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudCBDb25maWd1cmFibGU7CisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50OworCisgICAgc3RydWN0IEludGVyZmFjZTsKKworICAgIHN0cnVjdCBJbnB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgQ29kZWMyQ2xpZW50IFN0b3JlOworCisgICAgc3A8QmFzZT4gY29uc3QmIGdldEJhc2UoKSBjb25zdDsKKworICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgY29uc3QmIG5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGNvbnN0JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgY29uc3QmIG5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpOworCisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gY29uc3QmIGxpc3RDb21wb25lbnRzKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb25zdCYgc3JjLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb25zdCYgZHN0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBJQ29tcG9uZW50U3RvcmUgc2VydmljZSBuYW1lcyB0aGF0IGFyZSBhdmFpbGFibGUgb24KKyAgICAvLyB0aGUgZGV2aWNlLiBUaGlzIGxpc3QgaXMgc3BlY2lmaWVkIGF0IHRoZSBidWlsZCB0aW1lIGluIG1hbmlmZXN0IGZpbGVzLgorICAgIC8vIE5vdGU6IEEgc29mdHdhcmUgc2VydmljZSB3aWxsIGhhdmUgIl9zb2Z0d2FyZSIgYXMgYSBzdWZmaXguCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgR2V0U2VydmljZU5hbWVzKCk7CisKKyAgICAvLyBDcmVhdGUgYSBzZXJ2aWNlIHdpdGggYSBnaXZlbiBzZXJ2aWNlIG5hbWUuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENyZWF0ZUZyb21TZXJ2aWNlKGNoYXIgY29uc3QqIG5hbWUpOworCisgICAgLy8gR2V0IGNsaWVudHMgdG8gYWxsIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Pj4gQ3JlYXRlRnJvbUFsbFNlcnZpY2VzKCk7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBjb25zdCYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlcnZpY2VOYW1lID0gbnVsbHB0cik7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNsaWVudChzcDxCYXNlPiBjb25zdCYgYmFzZSwgc2l6ZV90IHNlcnZpY2VJbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBzdG9yZSB3aGVyZSB0aGUgcHJlZGljYXRlIHJldHVybnMgT0ssIGFuZCByZXR1cm5zIHRoZSBsYXN0CisgICAgLy8gcHJlZGljYXRlIHJlc3VsdC4gVXNlcyBrZXkgdG8gcmVtZW1iZXIgdGhlIGxhc3Qgc3RvcmUgZm91bmQsIGFuZCBpZiBjYWNoZWQsCisgICAgLy8gaXQgdHJpZXMgdGhhdCBzdG9yZSBiZWZvcmUgdHJ5aW5nIGFsbCBzdG9yZXMgKG9uZSByZXRyeSkuCisgICAgc3RhdGljIGMyX3N0YXR1c190IEZvckFsbFNlcnZpY2VzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY29uc3QmKT4KKyAgICAgICAgICAgICAgICBwcmVkaWNhdGUpOworCisgICAgc2l6ZV90IG1TZXJ2aWNlSW5kZXg7CisgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzTGlzdDsKKworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcj4KKyAgICAgICAgICAgIG1Ib3N0UG9vbE1hbmFnZXI7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gX0NyZWF0ZUZyb21JbmRleChzaXplX3QgaW5kZXgpOworCisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gX2xpc3RDb21wb25lbnRzKGJvb2wqIHN1Y2Nlc3MpIGNvbnN0OworCisgICAgY2xhc3MgQ2FjaGU7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRJbnRlcmZhY2UgQmFzZTsKKworICAgIEludGVyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBwcm9kdWNlcyBzb21lIG91dHB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGdvZXMgaW50byBhIHRyaXBwZWQgc3RhdGUuCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdHMKKyAgICAgICAgICAgICkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGVuY291bnRlcnMgYW4gZXJyb3IuCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHByb2Nlc3MgdGhhdCBob3N0cyB0aGUgY29tcG9uZW50IHNodXRzIGRvd24KKyAgICAvLyB1bmV4cGVjdGVkbHkuCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB1c2UgYnkgdGhlIGNvZGVjLgorICAgIC8vIElucHV0IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgb25Xb3JrRG9uZSgpIG9yIGZsdXNoKCkgd2lsbCBub3QKKyAgICAvLyB0cmlnZ2VyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgYmVjb21lcyBhd2FyZSBvZiBhIGZyYW1lIGJlaW5nCisgICAgLy8gcmVuZGVyZWQuCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpID0gMDsKKworICAgIHZpcnR1YWwgfkxpc3RlbmVyKCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudCBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKTsKKworICAgIGMyX3N0YXR1c190IGRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXVlKAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpOworCisgICAgYzJfc3RhdHVzX3QgZmx1c2goCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIGMyX3N0YXR1c190IHN0b3AoKTsKKworICAgIGMyX3N0YXR1c190IHJlc2V0KCk7CisKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKKyAgICB0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OgorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgc3VyZmFjZSB0byBiZSB1c2VkIHdpdGggYSBibG9ja3Bvb2wgcHJldmlvdXNseSBjcmVhdGVkIGJ5CisgICAgLy8gY3JlYXRlQmxvY2tQb29sKCkuCisgICAgYzJfc3RhdHVzX3Qgc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKworICAgIC8vIEV4dHJhY3QgYSBzbG90IG51bWJlciBmcm9tIG9mIHRoZSBibG9jaywgdGhlbiBjYWxsCisgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBvdXRwdXQgc3VyZmFjZSBoYXMgbm90IGJlZW4gc2V0LCBOT19JTklUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLAorICAgIC8vIGF0dGFjaEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLCBmb2xsb3dlZCBieSBxdWV1ZUJ1ZmZlcigpLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBhIGJxSWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgaWQgb2YgdGhlIG91dHB1dCBzdXJmYWNlLAorICAgIC8vIERFQURfT0JKRUNUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgY2FsbCB0byBxdWV1ZUJ1ZmZlcigpIGlzIHN1Y2Nlc3NmdWwgYnV0IHRoZSBibG9jayBjYW5ub3QgYmUKKyAgICAvLyBhc3NvY2lhdGVkIHRvIHRoZSBvdXRwdXQgc3VyZmFjZSBmb3IgYXV0b21hdGljIGNhbmNlbGxhdGlvbiB1cG9uCisgICAgLy8gZGVzdHJ1Y3Rpb24sIFVOS05PV05fRVJST1Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHF1ZXVlQnVmZmVyKCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKKworICAgIC8vIENvbm5lY3QgdG8gYSBnaXZlbiBJbnB1dFN1cmZhY2UuCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiogY29ubmVjdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMT4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgQ29tcG9uZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworICAgIH5Db21wb25lbnQoKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6T3V0cHV0QnVmZmVyUXVldWUKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZTsKKworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisKKyAgICBzdHJ1Y3QgSGlkbExpc3RlbmVyOworICAgIHZvaWQgaGFuZGxlT25Xb3JrRG9uZShjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlIEJhc2U7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICAgICAgICAgIENvbm5lY3Rpb25CYXNlOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgdW5kZXJseWluZyBJSW5wdXRTdXJmYWNlLgorICAgIHNwPEJhc2U+IGdldEhhbEludGVyZmFjZSgpIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnQ7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfQ0xJRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIsCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorICAgIHNvY19zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgc3JjczogWworICAgICAgICAidmVuZG9yLmNwcCIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIHZlbmRvciBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CitpZmVxICgkKFRBUkdFVF9BUkNIKSwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICAgIGVsc2UKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKKyAgICBlbmRpZgorZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBhbmRyb2lkLWhhcmR3YXJlLW1lZGlhLWMyLWhhbC0xLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1pbmlqYWlsLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisvLyBPbXhTdG9yZSBpcyBhZGRlZCBmb3IgdmlzaWJpbGl0eSBieSBkdW1wc3RhdGUuCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorCisvLyBUaGlzIGlzIGNyZWF0ZWQgYnkgbW9kdWxlICJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Ii4gVGhpcyBjYW4gYmUgbW9kaWZpZWQuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0Jhc2VTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiOworCisvLyBBZGRpdGlvbmFsIGRldmljZS1zcGVjaWZpYyBzZWNjb21wIHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCBpbiB0aGlzIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0V4dFNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5leHQucG9saWN5IjsKKworY2xhc3MgRHVtbXlDMlN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIER1bW15QzJTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkR1bW15QzJTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBzdGFja1BhcmFtcyAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiAvKiBoZWFwUGFyYW1JbmRpY2VzICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCAvKiBoZWFwUGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBwYXJhbXMgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IC8qIGZhaWx1cmVzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IC8qIHBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgLyogZmllbGRzICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxEdW1teUMyU3RvcmU+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODRjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDYyIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVycy5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKKyAgICAgICAgIlBpcGVsaW5lV2F0Y2hlci5jcHAiLAorICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcCIsCisgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyMjFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Zkc2FuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMk9NWE5vZGU6OlF1ZXVlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgUXVldWVUaHJlYWQoKSA6IFRocmVhZChmYWxzZSkge30KKyAgICB+UXVldWVUaHJlYWQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgdm9pZCBxdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXAsCisgICAgICAgICAgICBpbnQgZmVuY2VGZCwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYmd29yaywKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAmJmZkMCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAmJmZkMSkgeworICAgICAgICBNdXRleGVkPEpvYnM+OjpMb2NrZWQgam9icyhtSm9icyk7CisgICAgICAgIGF1dG8gaXQgPSBqb2JzLT5xdWV1ZXMudHJ5X2VtcGxhY2UoY29tcCwgY29tcCwgc3lzdGVtVGltZSgpKS5maXJzdDsKKyAgICAgICAgaXQtPnNlY29uZC53b3JrTGlzdC5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBmZW5jZUZkLCBzdGQ6Om1vdmUoZmQwKSwgc3RkOjptb3ZlKGZkMSkpOworICAgICAgICBqb2JzLT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgY29uc3RleHByIG5zZWNzX3Qga0ludGVydmFsTnMgPSBuc2Vjc190KDEwKSAqIDEwMDAgKiAxMDAwOyAgLy8gMTBtcworICAgICAgICBjb25zdGV4cHIgbnNlY3NfdCBrV2FpdE5zID0ga0ludGVydmFsTnMgKiAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgTXV0ZXhlZDxKb2JzPjo6TG9ja2VkIGpvYnMobUpvYnMpOworICAgICAgICAgICAgbnNlY3NfdCBub3dOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGJvb2wgcXVldWVkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBqb2JzLT5xdWV1ZXMuYmVnaW4oKTsgaXQgIT0gam9icy0+cXVldWVzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICBRdWV1ZSAmcXVldWUgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS53b3JrTGlzdC5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBub3dOcyAtIHF1ZXVlLmxhc3RRdWV1ZWRUaW1lc3RhbXBOcyA8IGtJbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBxdWV1ZS5jb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgICAgICBpdCA9IGpvYnMtPnF1ZXVlcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmVuY2VGZHM7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkPiB1bmlxdWVGZHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFxdWV1ZS53b3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUocXVldWUud29ya0xpc3QuZnJvbnQoKS53b3JrKSk7CisgICAgICAgICAgICAgICAgICAgIGZlbmNlRmRzLnB1c2hfYmFjayhxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZlbmNlRmQpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVGZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZkMCkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVGZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZkMSkpOworICAgICAgICAgICAgICAgICAgICBxdWV1ZS53b3JrTGlzdC5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBqb2JzLnVubG9jaygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGZlbmNlRmQgOiBmZW5jZUZkcykgeworICAgICAgICAgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2UobmV3IEZlbmNlKGZlbmNlRmQpKTsKKyAgICAgICAgICAgICAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb21wLT5xdWV1ZSgmaXRlbXMpOworICAgICAgICAgICAgICAgIGZvciAoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICZ1ZmQgOiB1bmlxdWVGZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpdWZkLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgam9icy5sb2NrKCk7CisKKyAgICAgICAgICAgICAgICBpdCA9IGpvYnMtPnF1ZXVlcy51cHBlcl9ib3VuZChjb21wKTsKKyAgICAgICAgICAgICAgICBxdWV1ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1ZXVlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGpvYnMud2FpdEZvckNvbmRpdGlvblJlbGF0aXZlKGpvYnMtPmNvbmQsIGtXYWl0TnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgV29ya0ZlbmNlIHsKKyAgICAgICAgV29ya0ZlbmNlKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYmdywgaW50IGZkKSA6IHdvcmsoc3RkOjptb3ZlKHcpKSwgZmVuY2VGZChmZCkge30KKworICAgICAgICBXb3JrRmVuY2UoCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJiZ3LAorICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgJiZ1bmlxdWVGZDAsCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICYmdW5pcXVlRmQxKQorICAgICAgICAgICAgOiB3b3JrKHN0ZDo6bW92ZSh3KSksCisgICAgICAgICAgICAgIGZlbmNlRmQoZmQpLAorICAgICAgICAgICAgICBmZDAoc3RkOjptb3ZlKHVuaXF1ZUZkMCkpLAorICAgICAgICAgICAgICBmZDEoc3RkOjptb3ZlKHVuaXF1ZUZkMSkpIHt9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgaW50IGZlbmNlRmQ7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDA7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDE7CisgICAgfTsKKyAgICBzdHJ1Y3QgUXVldWUgeworICAgICAgICBRdWV1ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wLCBuc2Vjc190IHRpbWVzdGFtcCkKKyAgICAgICAgICAgIDogY29tcG9uZW50KGNvbXApLCBsYXN0UXVldWVkVGltZXN0YW1wTnModGltZXN0YW1wKSB7fQorICAgICAgICBRdWV1ZShjb25zdCBRdWV1ZSAmKSA9IGRlbGV0ZTsKKyAgICAgICAgUXVldWUgJm9wZXJhdG9yID0oY29uc3QgUXVldWUgJikgPSBkZWxldGU7CisKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6Omxpc3Q8V29ya0ZlbmNlPiB3b3JrTGlzdDsKKyAgICAgICAgbnNlY3NfdCBsYXN0UXVldWVkVGltZXN0YW1wTnM7CisgICAgfTsKKyAgICBzdHJ1Y3QgSm9icyB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgICBRdWV1ZSwKKyAgICAgICAgICAgICAgICAgc3RkOjpvd25lcl9sZXNzPHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+Pj4gcXVldWVzOworICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICB9OworICAgIE11dGV4ZWQ8Sm9icz4gbUpvYnM7Cit9OworCitDMk9NWE5vZGU6OkMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKQorICAgIDogbUNvbXAoY29tcCksIG1GcmFtZUluZGV4KDApLCBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Vc2FnZSgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSwKKyAgICAgIG1RdWV1ZVRocmVhZChuZXcgUXVldWVUaHJlYWQpIHsKKyAgICBhbmRyb2lkX2Zkc2FuX3NldF9lcnJvcl9sZXZlbChBTkRST0lEX0ZEU0FOX0VSUk9SX0xFVkVMX1dBUk5fQUxXQVlTKTsKKyAgICBtUXVldWVUaHJlYWQtPnJ1bigiQzJPTVhOb2RlIiwgUFJJT1JJVFlfQVVESU8pOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgYW5kcm9pZF9mZHNhbl9zZXRfZXJyb3JfbGV2ZWwoQU5EUk9JRF9GRFNBTl9FUlJPUl9MRVZFTF9XQVJOX09OQ0UpOworICAgIHJldHVybiBtUXVldWVUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChwYXJhbXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzd2l0Y2ggKCh1aW50MzJfdClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sOgorICAgICAgICAgICAgLy8gaGFuZGxlIG1heC9maXhlZCBmcmFtZSBkdXJhdGlvbiBjb250cm9sCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoT01YX1BBUkFNX1UzMlRZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyBudW1iZXIgaXMgYW4gaW50MzJfdCBjb250YWluZWQgaW4gT01YX1UzMi4KKyAgICAgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzOgorICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKE9NWF9VMzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Vc2FnZSA9ICooKE9NWF9VMzIgKilwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgsIElPTVg6OlBvcnRNb2RlIG1vZGUpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpbW9kZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCllbmFibGU7CisgICAgKHZvaWQpbWF4RnJhbWVXaWR0aDsKKyAgICAodm9pZCltYXhGcmFtZUhlaWdodDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXR1bm5lbGVkOworICAgICh2b2lkKWF1ZGlvSHdTeW5jOworICAgICpzaWRlYmFuZEhhbmRsZSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEdyYXBoaWNCdWZmZXJVc2FnZShPTVhfVTMyIHBvcnRJbmRleCwgT01YX1UzMiogdXNhZ2UpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKnVzYWdlID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElPTVhCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DLAorICAgICAgICAgICAgJm1BbGxvY2F0b3IpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTb3VyY2UgPSBidWZmZXJTb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmFsbG9jYXRlU2VjdXJlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUsIGJ1ZmZlcl9pZCAqYnVmZmVyLAorICAgICAgICB2b2lkICoqYnVmZmVyRGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXNpemU7CisgICAgKHZvaWQpbmF0aXZlSGFuZGxlOworICAgICpidWZmZXIgPSAwOworICAgICpidWZmZXJEYXRhID0gbnVsbHB0cjsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6dXNlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW9teEJ1ZjsKKyAgICAqYnVmZmVyID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZnJlZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClidWZmZXI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZpbGxCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBpbnQgZmVuY2VGZCkgeworICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKHZvaWQpZmVuY2VGZDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZW1wdHlCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLAorICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IG1Db21wLmxvY2soKTsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgdWludDMyX3QgYzJGbGFncyA9IChmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDAsIGZkMTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyB1bmlxdWVfZmQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBmZHMsIHdlJ2xsIGdldCB3YXJuaW5nIGlmIHRoZXNlCisgICAgICAgICAgICAvLyBmZHMgZ2V0IGNsb3NlZCBieSBzb21lYm9keSBlbHNlLiBPbndlcnNoaXAgd2lsbCBiZSByZWxlYXNlZCBiZWZvcmUKKyAgICAgICAgICAgIC8vIHdlIHJldHVybiwgc28gdGhhdCB0aGUgZmRzIGdldCBjbG9zZWQgYXMgdXN1YWxseSB3aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGdvZXMgb3V0IG9mIHNjb3BlICh3aGVuIGJvdGggaXRlbXMgYW5kIGJsb2NrIGFyZSBnb25lKS4KKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmF0aXZlSGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpOworICAgICAgICAgICAgZmQwLnJlc2V0KG5hdGl2ZUhhbmRsZS0+bnVtRmRzID4gMCA/IG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA6IC0xKTsKKyAgICAgICAgICAgIGZkMS5yZXNldChuYXRpdmVIYW5kbGUtPm51bUZkcyA+IDEgPyBuYXRpdmVIYW5kbGUtPmRhdGFbMV0gOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICh2b2lkKWZkMC5yZWxlYXNlKCk7CisgICAgICAgICAgICAodm9pZClmZDEucmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgfSBlbHNlIGlmICghKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpYzJGbGFnczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCB0aW1lc3RhbXAgYmFzZWQgb24gZ2FwVXMKKyAgICB7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVzdGFtcDsgLy8gc2F2ZSBpbnB1dCB0aW1lc3RhbXAKKyAgICAgICAgaWYgKG1GaXJzdElucHV0RnJhbWUpIHsKKyAgICAgICAgICAgIC8vIGdyYWIgdGltZXN0YW1wcyBvbiBmaXJzdCBmcmFtZQorICAgICAgICAgICAgbVByZXZJbnB1dFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtRmlyc3RJbnB1dEZyYW1lID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzID4gMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYzJfbWluKCh0aW1lc3RhbXAgLSBtUHJldklucHV0VGltZXN0YW1wKS5wZWVrKCksIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzIDwgMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtUHJldkNvZGVjVGltZXN0YW1wIC0gbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgICAgICB9CisgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgQUxPR1YoImFkanVzdGluZyAlbGxkIHRvICVsbGQgKGdhcD0lbGxkKSIsCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUFkanVzdFRpbWVzdGFtcEdhcFVzKTsKKyAgICB9CisKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBtQnVmZmVySWRzSW5Vc2UubG9jaygpLT5lbXBsYWNlKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCBidWZmZXIpOworICAgIG1RdWV1ZVRocmVhZC0+cXVldWUoY29tcCwgZmVuY2VGZCwgc3RkOjptb3ZlKHdvcmspLCBzdGQ6Om1vdmUoZmQwKSwgc3RkOjptb3ZlKGZkMSkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJOYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgICh2b2lkKXBhcmFtZXRlck5hbWU7CisgICAgKmluZGV4ID0gT01YX0luZGV4TWF4OworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UmIG1zZykgeworICAgIGlmIChtc2cudHlwZSAhPSBvbXhfbWVzc2FnZTo6RVZFTlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBpZiAobXNnLnUuZXZlbnRfZGF0YS5ldmVudCAhPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKW1zZy51LmV2ZW50X2RhdGEuZGF0YTE7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtc2cudS5ldmVudF9kYXRhLmRhdGEzOworCisgICAgLy8gVE9ETzogc2V0IGRhdGFzcGFjZSBvbiBjb21wb25lbnQgdG8gc2VlIGlmIGl0IGltcGFjdHMgY29sb3IgYXNwZWN0cworICAgIEFMT0dEKCJkYXRhc3BhY2UgY2hhbmdlZCB0byAlI3ggcGl4ZWwgZm9ybWF0OiAlI3giLCBkYXRhU3BhY2UsIHBpeGVsRm9ybWF0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElPTVhCdWZmZXJTb3VyY2U+IEMyT01YTm9kZTo6Z2V0U291cmNlKCkgeworICAgIHJldHVybiBtQnVmZmVyU291cmNlOworfQorCit2b2lkIEMyT01YTm9kZTo6c2V0RnJhbWVTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIEMyT01YTm9kZTo6b25JbnB1dEJ1ZmZlckRvbmUoYzJfY250cjY0X3QgaW5kZXgpIHsKKyAgICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBzb3VyY2Ugbm90IHNldCAoaW5kZXg9JWxsdSkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJJZCA9IDA7CisgICAgeworICAgICAgICBkZWNsdHlwZShtQnVmZmVySWRzSW5Vc2UpOjpMb2NrZWQgYnVmZmVySWRzKG1CdWZmZXJJZHNJblVzZSk7CisgICAgICAgIGF1dG8gaXQgPSBidWZmZXJJZHMtPmZpbmQoaW5kZXgucGVla3UoKSk7CisgICAgICAgIGlmIChpdCA9PSBidWZmZXJJZHMtPmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiVW50cmFja2VkIGlucHV0IGluZGV4ICVsbHUgKG1heWJlIGFscmVhZHkgcmVtb3ZlZCkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcklkID0gaXQtPnNlY29uZDsKKyAgICAgICAgKHZvaWQpYnVmZmVySWRzLT5lcmFzZShpdCk7CisgICAgfQorICAgICh2b2lkKW1CdWZmZXJTb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxN2M5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHVuZGVybHlpbmcgSU9NWEJ1ZmZlclNvdXJjZSBvYmplY3QuCisgICAgICovCisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gZ2V0U291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIGZyYW1lIHNpemUuCisgICAgICovCisgICAgdm9pZCBzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhbiB1cCB3b3JrIGl0ZW0gcmVmZXJlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGlucHV0IHdvcmsgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IGluZGV4KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisKKyAgICBNdXRleGVkPHN0ZDo6bWFwPHVpbnQ2NF90LCBidWZmZXJfaWQ+PiBtQnVmZmVySWRzSW5Vc2U7CisKKyAgICBjbGFzcyBRdWV1ZVRocmVhZDsKKyAgICBzcDxRdWV1ZVRocmVhZD4gbVF1ZXVlVGhyZWFkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9PTVhfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjYzYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTAsMCArMSwxODgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorI2luY2x1ZGUgIkNDb2RlYy5oIgorI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiT214MklHcmFwaGljQnVmZmVyU291cmNlLmgiCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIEJHcmFwaGljQnVmZmVyU291cmNlID0gOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0NvZGVjV2F0Y2hkb2cgOiBwdWJsaWMgQUhhbmRsZXIgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50NjRfdCBrV2F0Y2hJbnRlcnZhbFVzID0gMzMwMDAwMDsgIC8vIDMuMyBzZWNzCisKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGluc3RhbmNlKG5ldyBDQ29kZWNXYXRjaGRvZyk7CisgICAgICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmbGFnOworICAgICAgICAvLyBDYWxsIEluaXQoKSBvbmx5IG9uY2UuCisgICAgICAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWcsIEluaXQsIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIH5DQ29kZWNXYXRjaGRvZygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd2F0Y2goc3A8Q0NvZGVjPiBjb2RlYykgeworICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgLy8gSWYgYSB3YXRjaCBtZXNzYWdlIGlzIGluIGZsaWdodCwgcGlnZ3ktYmFjayB0aGlzIGluc3RhbmNlIGFzIHdlbGwuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHBvc3QgYSBuZXcgd2F0Y2ggbWVzc2FnZS4KKyAgICAgICAgICAgIHNob3VsZFBvc3QgPSBjb2RlY3MtPmVtcHR5KCk7CisgICAgICAgICAgICBjb2RlY3MtPmVtcGxhY2UoY29kZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICBBTE9HVigicG9zdGluZyB3YXRjaCBtZXNzYWdlIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdChrV2F0Y2hJbnRlcnZhbFVzKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgICAgIEFMT0dWKCJ3YXRjaCBmb3IgJXp1IGNvZGVjcyIsIGNvZGVjcy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb2RlY3MtPmJlZ2luKCk7IGl0ICE9IGNvZGVjcy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyA9IGl0LT5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RlYy0+aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2RlY3MtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygiQ0NvZGVjV2F0Y2hkb2c6IHVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjV2F0Y2hkb2coKSA6IG1Mb29wZXIobmV3IEFMb29wZXIpIHt9CisKKyAgICBzdGF0aWMgdm9pZCBJbml0KGNvbnN0IHNwPENDb2RlY1dhdGNoZG9nPiAmdGhpeikgeworICAgICAgICBBTE9HVigiSW5pdCIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zZXROYW1lKCJDQ29kZWNXYXRjaGRvZyIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpeik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnN0YXJ0KCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+IG1Db2RlY3NUb1dhdGNoOworfTsKKworY2xhc3MgQzJJbnB1dFN1cmZhY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMySW5wdXRTdXJmYWNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gJnN1cmZhY2UpIDoKKyAgICAgICAgbVN1cmZhY2Uoc3VyZmFjZSkgeworICAgIH0KKworICAgIH5DMklucHV0U3VyZmFjZVdyYXBwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKGNvbXAtPmNvbm5lY3RUb0lucHV0U3VyZmFjZShtU3VyZmFjZSwgJm1Db25uZWN0aW9uKSk7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBJbnB1dFN1cmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggc3RhcnRlZCBzdGF0ZQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcgZW9zKHRydWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdXJmYWNlLT5jb25maWcoeyZlb3N9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcgX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gbUNvbm5lY3Rpb247Cit9OworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKy8vICAgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKSB7fQorICAgIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlKQorICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpIHsKKyAgICAgICAgbURhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisgICAgICAgIG1Db25maWcubVVzYWdlID0gdXNhZ2U7CisgICAgfQorICAgIH5HcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZSA9IG5ldyBDMk9NWE5vZGUoY29tcCk7CisgICAgICAgIG1Ob2RlLT5zZXRGcmFtZVNpemUobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICAvLyBVc2FnZSBpcyBxdWVyaWVkIGR1cmluZyBjb25maWd1cmUoKSwgc28gc2V0dGluZyBpdCBiZWZvcmVoYW5kLgorICAgICAgICBPTVhfVTMyIHVzYWdlID0gbUNvbmZpZy5tVXNhZ2UgJiAweEZGRkZGRkZGOworICAgICAgICAodm9pZCltTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgJnVzYWdlLCBzaXplb2YodXNhZ2UpKTsKKworICAgICAgICAvLyBOT1RFOiB3ZSBkbyBub3QgdXNlL3Bhc3MgdGhyb3VnaCBjb2xvciBhc3BlY3RzIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB3ZQorICAgICAgICAvLyBjb21tdW5pY2F0ZSB0aGF0IGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgICAgIG1Tb3VyY2UtPmNvbmZpZ3VyZShtTm9kZSwgbURhdGFTcGFjZSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtTm9kZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJHQlNXcmFwcGVyOjpkaXNjb25uZWN0OiBub2RlIGlzIG5vdCBjb25maWd1cmVkIHdpdGggT01YQnVmZmVyU291cmNlLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNvdXJjZS0+b25PbXhJZGxlKCk7CisgICAgICAgIHNvdXJjZS0+b25PbXhMb2FkZWQoKTsKKyAgICAgICAgbU5vZGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBHZXRTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJnN0YXR1cykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJpbmRlciBzdGF0dXMgZmFpbGVkLCBidXQgdGhlcmUgaXMgbm8gc2VydmllIG9yIHRyYW5zYWN0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZS0+b25PbXhFeGVjdXRpbmcoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBHZXRTdGF0dXMobVNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RhdHVzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICAvLyBoYW5kbGUgZWFjaCBjb25maWd1cmF0aW9uIGdyYW51YWxseSwgaW4gY2FzZSB3ZSBuZWVkIHRvIGhhbmRsZSBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGVsc2V3aGVyZQorCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IGZyYW1lIGRlbGF5IHJlcGVhdGluZworICAgICAgICBpZiAoY29uZmlnLm1NaW5GcHMgPiAwICYmIGNvbmZpZy5tTWluRnBzICE9IG1Db25maWcubU1pbkZwcykgeworICAgICAgICAgICAgaW50NjRfdCB1cyA9IDFlNiAvIGNvbmZpZy5tTWluRnBzICsgMC41OworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtaW5GcHM9IiA8PCBjb25maWcubU1pbkZwcyA8PCAiID0+IHJlcGVhdERlbGF5VXM9IiA8PCB1czsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NaW5GcHMgPSBjb25maWcubU1pbkZwczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB0cyBnYXAKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwIHx8IGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDApIHsKKyAgICAgICAgICAgIGlmIChtTm9kZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUgcHRyR2FwUGFyYW0gPSB7fTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fVTMyVFlQRSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZ2FwID0gKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBjMl9taW4oSU5UMzJfTUFYICsgMC4sIDFlNiAvIGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGMyX21heCgwLiAtIElOVDMyX01BWCwgLTFlNiAvIGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyAtIDAuNSk7CisgICAgICAgICAgICAgICAgLy8gZmxvYXQgLT4gdWludDMyX3QgaXMgdW5kZWZpbmVkIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBjb252ZXJ0IHRvIGludDMyX3QgdG8gZW5zdXJlIHRoZSBleHBlY3RlZCBiZWhhdmlvci4KKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uVTMyID0gaW50MzJfdChnYXApOworICAgICAgICAgICAgICAgICh2b2lkKW1Ob2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwdHJHYXBQYXJhbSwgc2l6ZW9mKHB0ckdhcFBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZnBzCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IG1heCBmcHMgdG8gMCB1bmxlc3MgdXNpbmcgZml4ZWQgZnBzCisgICAgICAgIGlmICgoY29uZmlnLm1NYXhGcHMgPiAwIHx8IChjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwICYmIGNvbmZpZy5tTWF4RnBzID09IC0xKSkKKyAgICAgICAgICAgICAgICAmJiBjb25maWcubU1heEZwcyAhPSBtQ29uZmlnLm1NYXhGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRNYXhGcHMoY29uZmlnLm1NYXhGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1heEZwcz0iIDw8IGNvbmZpZy5tTWF4RnBzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1heEZwcyA9IGNvbmZpZy5tTWF4RnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tVGltZU9mZnNldFVzICE9IG1Db25maWcubVRpbWVPZmZzZXRVcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVPZmZzZXRVcyhjb25maWcubVRpbWVPZmZzZXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZU9mZnNldCAiIDw8IGNvbmZpZy5tVGltZU9mZnNldFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tVGltZU9mZnNldFVzID0gY29uZmlnLm1UaW1lT2Zmc2V0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1DYXB0dXJlRnBzICE9IG1Db25maWcubUNhcHR1cmVGcHMgfHwgY29uZmlnLm1Db2RlZEZwcyAhPSBtQ29uZmlnLm1Db2RlZEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZUxhcHNlQ29uZmlnKGNvbmZpZy5tQ29kZWRGcHMsIGNvbmZpZy5tQ2FwdHVyZUZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZUxhcHNlICIgPDwgY29uZmlnLm1DYXB0dXJlRnBzIDw8ICJmcHMgYXMgIiA8PCBjb25maWcubUNvZGVkRnBzIDw8ICJmcHMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubUNhcHR1cmVGcHMgPSBjb25maWcubUNhcHR1cmVGcHM7CisgICAgICAgICAgICBtQ29uZmlnLm1Db2RlZEZwcyA9IGNvbmZpZy5tQ29kZWRGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdGFydEF0VXMgIT0gbUNvbmZpZy5tU3RhcnRBdFVzCisgICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmICFjb25maWcubVN0b3BwZWQpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RhcnRUaW1lVXMoY29uZmlnLm1TdGFydEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0YXJ0IGF0ICIgPDwgY29uZmlnLm1TdGFydEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdGFydEF0VXMgPSBjb25maWcubVN0YXJ0QXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdXNwZW5kLXJlc3VtZQorICAgICAgICBpZiAoY29uZmlnLm1TdXNwZW5kZWQgIT0gbUNvbmZpZy5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3VzcGVuZChjb25maWcubVN1c3BlbmRlZCwgY29uZmlnLm1TdXNwZW5kQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgIiA8PCAoY29uZmlnLm1TdXNwZW5kZWQgPyAic3VzcGVuZCIgOiAicmVzdW1lIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IGNvbmZpZy5tU3VzcGVuZEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kZWQgPSBjb25maWcubVN1c3BlbmRlZDsKKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRBdFVzID0gY29uZmlnLm1TdXNwZW5kQXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiBjb25maWcubVN0b3BwZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdG9wVGltZVVzKGNvbmZpZy5tU3RvcEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0b3AgYXQgIiA8PCBjb25maWcubVN0b3BBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiBkZWxheVVzIjsKKyAgICAgICAgICAgICAgICByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+Z2V0U3RvcFRpbWVPZmZzZXRVcygmY29uZmlnLm1JbnB1dERlbGF5VXMpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiPSIgPDwgY29uZmlnLm1JbnB1dERlbGF5VXMgPDwgInVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbmZpZy5tSW5wdXREZWxheVVzID0gY29uZmlnLm1JbnB1dERlbGF5VXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wQXRVcyA9IGNvbmZpZy5tU3RvcEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29sb3IgYXNwZWN0cyAoYW5kcm9pZC5fY29sb3ItYXNwZWN0cykKKworICAgICAgICAvLyBjb25zdW1lciB1c2FnZSBpcyBxdWVyaWVkIGVhcmxpZXIuCisKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnJXMiLCBzdGF0dXMuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjMl9jbnRyNjRfdCBpbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZS0+b25JbnB1dEJ1ZmZlckRvbmUoaW5kZXgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxDMk9NWE5vZGU+IG1Ob2RlOworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIENvbmZpZyBtQ29uZmlnOworfTsKKworY2xhc3MgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlciA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworCitwdWJsaWM6CisgICAgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcihzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQpCisgICAgICAgIDogbUNsaWVudChjbGllbnQpIHsgfQorCisgICAgdmlydHVhbCB+Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Y29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PigpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCisKK3N0cnVjdCBDQ29kZWM6OkNsaWVudExpc3RlbmVyIDogcHVibGljIENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgZXhwbGljaXQgQ2xpZW50TGlzdGVuZXIoY29uc3Qgd3A8Q0NvZGVjPiAmY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5vbldvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKWVycm9yQ29kZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgeyAvLyBMb2cgdGhlIGRlYXRoIG9mIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBjb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgZGllZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgXCIlc1wiIGRpZWQuIiwgY29tcC0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRvIE1lZGlhQ29kZWMuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCh1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICAgICAodm9pZClidWZmZXJRdWV1ZUlkOworICAgICAgICAodm9pZClzbG90SWQ7CisgICAgICAgICh2b2lkKXRpbWVzdGFtcE5zOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmIChjb2RlYykgeworICAgICAgICAgICAgY29kZWMtPm9uSW5wdXRCdWZmZXJEb25lKGZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHdwPENDb2RlYz4gbUNvZGVjOworfTsKKworLy8gQ0NvZGVjQ2FsbGJhY2tJbXBsCisKK2NsYXNzIENDb2RlY0NhbGxiYWNrSW1wbCA6IHB1YmxpYyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ0NvZGVjQ2FsbGJhY2tJbXBsKENDb2RlYyAqY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorICAgIH5DQ29kZWNDYWxsYmFja0ltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRGcmFtZXNSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcykgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25PdXRwdXRGcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgICAgICAgICB7UmVuZGVyZWRGcmFtZUluZm8obWVkaWFUaW1lVXMsIHJlbmRlclRpbWVOcyl9KTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlYyAqbUNvZGVjOworfTsKKworLy8gQ0NvZGVjCisKK0NDb2RlYzo6Q0NvZGVjKCkKKyAgICA6IG1DaGFubmVsKG5ldyBDQ29kZWNCdWZmZXJDaGFubmVsKHN0ZDo6bWFrZV9zaGFyZWQ8Q0NvZGVjQ2FsbGJhY2tJbXBsPih0aGlzKSkpIHsKK30KKworQ0NvZGVjOjp+Q0NvZGVjKCkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IENDb2RlYzo6Z2V0QnVmZmVyQ2hhbm5lbCgpIHsKKyAgICByZXR1cm4gbUNoYW5uZWw7Cit9CisKK3N0YXR1c190IENDb2RlYzo6dHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYikgeworICAgIHN0YXR1c190IGVyciA9IGpvYigpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGF1dG8gc2V0QWxsb2NhdGluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSRUxFQVNFRCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxSZWZCYXNlPiBjb2RlY0luZm87CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmY29kZWNJbmZvKSk7CisgICAgLy8gRm9yIENvZGVjIDIuMCBjb21wb25lbnRzLCBjb21wb25lbnROYW1lID09IGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkuCisKKyAgICBzcDxBTWVzc2FnZT4gYWxsb2NNc2cobmV3IEFNZXNzYWdlKGtXaGF0QWxsb2NhdGUsIHRoaXMpKTsKKyAgICBhbGxvY01zZy0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBjb2RlY0luZm8pOworICAgIGFsbG9jTXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjphbGxvY2F0ZShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmNvZGVjSW5mbykgeworICAgIGlmIChjb2RlY0luZm8gPT0gbnVsbHB0cikgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJhbGxvY2F0ZSglcykiLCBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICBtQ2xpZW50TGlzdGVuZXIucmVzZXQobmV3IENsaWVudExpc3RlbmVyKHRoaXMpKTsKKworICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50OworCisgICAgLy8gc2V0IHVwIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgdG8gYWNjZXNzIHZlbmRvciBzdG9yZSBwYXJhbWV0ZXJzCisgICAgY2xpZW50ID0gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgiZGVmYXVsdCIpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8vIEVuZm9yY2UgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICBpbnQzMl90IGkzMjsKKyAgICAgICAgZmxvYXQgZmx0OworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInNhbXBsZSByYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjaGFubmVsIGNvdW50IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1pbWUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgid2lkdGggaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaGVpZ2h0IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbWFnZS92aWRlbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gQklUUkFURV9NT0RFX1ZCUjsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0JJVFJBVEVfTU9ERSwgJm1vZGUpICYmIG1vZGUgPT0gQklUUkFURV9NT0RFX0NRKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX1FVQUxJVFksICZpMzIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgicXVhbGl0eSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMgaW4gQ1EuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEZsb2F0KEtFWV9CSVRfUkFURSwgJmZsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmZsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkkgZnJhbWUgaW50ZXJ2YWwgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHZpZGVvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9GUkFNRV9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEZsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZnJhbWUgcmF0ZSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgY29uZmlndXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKQorICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy5yZXNldChuZXcgSW5wdXRTdXJmYWNlV3JhcHBlcjo6Q29uZmlne30pOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLCAmdmFsdWUpICYmIHZhbHVlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzKSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1heEZwcyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPD0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZERvdWJsZSgidGltZS1sYXBzZS1mcHMiLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tQ2FwdHVyZUZwcyA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmY29uZmlnLT5tSVNDb25maWctPm1Db2RlZEZwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzID0gLTE7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwgJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1Vc2FnZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgZGVzaXJlZCBjb2xvciBmb3JtYXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IC0xOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfRk9STUFULCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQWxzbyBoYW5kbGUgZGVmYXVsdCBjb2xvciBmb3JtYXQgKGVuY29kZXJzIHJlcXVpcmUgY29sb3IgZm9ybWF0LCBzbyB0aGlzIGlzIG9ubHkKKyAgICAgICAgICAgICAgICAgKiBuZWVkZWQgZm9yIGRlY29kZXJzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gKHN1cmZhY2UgPT0gbnVsbHB0cikgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gY29uZmlnVXBkYXRlOworICAgICAgICAvLyBOT1RFOiBXZSB1c2VkIHRvIGlnbm9yZSAidmlkZW8tYml0cmF0ZSIgYXQgY29uZmlndXJlOyByZXBsaWNhdGUKKyAgICAgICAgLy8gICAgICAgdGhlIGJlaGF2aW9yIGhlcmUuCisgICAgICAgIHNwPEFNZXNzYWdlPiBzZGtQYXJhbXMgPSBtc2c7CisgICAgICAgIGludDMyX3QgdmlkZW9CaXRyYXRlOworICAgICAgICBpZiAoc2RrUGFyYW1zLT5maW5kSW50MzIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCAmdmlkZW9CaXRyYXRlKSkgeworICAgICAgICAgICAgc2RrUGFyYW1zID0gbXNnLT5kdXAoKTsKKyAgICAgICAgICAgIHNka1BhcmFtcy0+cmVtb3ZlRW50cnlBdChzZGtQYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICAgICAgY29tcCwgc2RrUGFyYW1zLCBDb25maWc6OklTX0NPTkZJRywgQzJfRE9OVF9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29udmVydCBjb25maWd1cmF0aW9uIHRvIGMyIHBhcmFtcyIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBtYXhCZnJhbWVzID0gMDsKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pCisgICAgICAgICAgICAgICAgJiYgc2RrUGFyYW1zLT5maW5kSW50MzIoS0VZX01BWF9CX0ZSQU1FUywgJm1heEJmcmFtZXMpCisgICAgICAgICAgICAgICAgJiYgbWF4QmZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBnb3AgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDIgLyogZmxleENvdW50ICovLCAwdSAvKiBzdHJlYW0gKi8pOworICAgICAgICAgICAgZ29wLT5tLnZhbHVlc1swXSA9IHsgUF9GUkFNRSwgVUlOVDMyX01BWCB9OworICAgICAgICAgICAgZ29wLT5tLnZhbHVlc1sxXSA9IHsKKyAgICAgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSB8IEJfRlJBTUUpLAorICAgICAgICAgICAgICAgIHVpbnQzMl90KG1heEJmcmFtZXMpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoZ29wKSk7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb25maWd1cmUgYzIgcGFyYW1zIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IHVzYWdlKDB1LCAwdSk7CisgICAgICAgIEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0IG1heElucHV0U2l6ZSgwdSwgMHUpOworICAgICAgICBDMlByZXBlbmRIZWFkZXJNb2RlU2V0dGluZyBwcmVwZW5kKFBSRVBFTkRfSEVBREVSX1RPX05PTkUpOworCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyB7CisgICAgICAgIH07CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcC0+cXVlcnkoCisgICAgICAgICAgICAgICAgeyAmdXNhZ2UsICZtYXhJbnB1dFNpemUsICZwcmVwZW5kIH0sCisgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgYzJlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNvbXBvbmVudCBpbnRlcmZhY2U6ICVkIiwgYzJlcnIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gaW5kaWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wb25lbnQgcmV0dXJucyB3cm9uZyBudW1iZXIgb2YgcGFyYW1zOiBleHBlY3RlZCAlenUgYWN0dWFsICV6dSIsCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMuc2l6ZSgpLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZSkgeworICAgICAgICAgICAgaWYgKHVzYWdlLnZhbHVlICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlIGFuZHJvaWRVc2FnZShDMk1lbW9yeVVzYWdlKHVzYWdlLnZhbHVlKSk7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1Vc2FnZSA9IGFuZHJvaWRVc2FnZS5hc0dyYWxsb2NVc2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTk9URTogd2UgZG9uJ3QgYmxpbmRseSB1c2UgY2xpZW50IHNwZWNpZmllZCBpbnB1dCBzaXplIGlmIHNwZWNpZmllZCBhcyBjbGllbnRzCisgICAgICAgIC8vIGF0IHRpbWVzIHNwZWNpZnkgdG9vIHNtYWxsIHNpemUuIEluc3RlYWQsIG1pbWljIHRoZSBiZWhhdmlvciBmcm9tIE9NWCwgd2hlcmUgdGhlCisgICAgICAgIC8vIGNsaWVudCBzcGVjaWZpZWQgc2l6ZSBpcyBvbmx5IHVzZWQgdG8gYXNrIGZvciBiaWdnZXIgYnVmZmVycyB0aGFuIGNvbXBvbmVudCBzdWdnZXN0ZWQKKyAgICAgICAgLy8gc2l6ZS4KKyAgICAgICAgaW50MzJfdCBjbGllbnRJbnB1dFNpemUgPSAwOworICAgICAgICBib29sIGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSA9CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjbGllbnRJbnB1dFNpemUpICYmIGNsaWVudElucHV0U2l6ZSA+IDA7CisgICAgICAgIC8vIFRFTVA6IGVuZm9yY2UgbWluaW11bSBidWZmZXIgc2l6ZSBvZiAxTUIgZm9yIHZpZGVvIGRlY29kZXJzCisgICAgICAgIC8vIGFuZCAxNksgLyA0SyBmb3IgYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMKKyAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGVuY29kZXIgPyAxNjM4NCA6IDQwOTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gMTA0ODU3NnU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBDU0QgZml0cyBpbnRvIHRoaXMgc2l6ZSAoaWYgZGVmaW5lZCkKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIG1heElucHV0U2l6ZS52YWx1ZSA+IDApIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgbXNnLT5maW5kQnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSV6dSIsIGl4KS5jX3N0cigpLCAmY3NkKTsgKytpeCkgeworICAgICAgICAgICAgICAgIGlmIChjc2QgJiYgY3NkLT5zaXplKCkgPiBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZG8gdGhpcyBiYXNlZCBvbiBjb21wb25lbnQgcmVxdWlyaW5nIGxpbmVhciBhbGxvY2F0b3IgZm9yIGlucHV0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSB8fCAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuIHRoYXQgd2UncmUgb3ZlcnJpZGluZyBjbGllbnQncyBtYXggaW5wdXQgc2l6ZSBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgaWYgKCh1aW50MzJfdCljbGllbnRJbnB1dFNpemUgPCBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgbWF4IGlucHV0IHNpemUgJWQsIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IGNvbXBvbmVudCByZWNvbW1lbmRlZCAoJXUpOyBvdmVycmlkaW5nIHdpdGggY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29tbWVuZGF0aW9uLiIsIGNsaWVudElucHV0U2l6ZSwgbWF4SW5wdXRTaXplLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlRoaXMgYmVoYXZpb3IgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwIGRldmVsb3BlcnMgZG91YmxlIGNoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5wdXQgc2l6ZSBpcyBpbiByZWFzb25hYmxlIHJhbmdlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNsaWVudElucHV0U2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBQYXNzIG1heCBpbnB1dCBzaXplIG9uIGlucHV0IGZvcm1hdCB0byB0aGUgYnVmZmVyIGNoYW5uZWwgKGlmIHN1cHBsaWVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY29tcG9uZW50IG9yIGJ5IGEgZGVmYXVsdCkKKyAgICAgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX0lOUFVUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoYzJfbWluKG1heElucHV0U2l6ZS52YWx1ZSwgdWludDMyX3QoSU5UMzJfTUFYKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY2xpZW50UHJlcGVuZDsKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKQorICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUywgJmNsaWVudFByZXBlbmQpCisgICAgICAgICAgICAgICAgJiYgY2xpZW50UHJlcGVuZAorICAgICAgICAgICAgICAgICYmICghcHJlcGVuZCB8fCBwcmVwZW5kLnZhbHVlICE9IFBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUyIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSBIRFIgc3RhdGljIGluZm8gdG8gb3V0cHV0IGZvcm1hdCBmb3IgYm90aCBlbmNvZGVycyBhbmQgZGVjb2RlcnMKKyAgICAgICAgICAgIC8vIGlmIGNvbXBvbmVudCBzdXBwb3J0cyB0aGlzIGluZm8sIHdlIHdpbGwgdXBkYXRlIGZyb20gY29tcG9uZW50LCBidXQgb25seSB0aGUgcmF3IHBvcnQsCisgICAgICAgICAgICAvLyBzbyBkb24ndCBwcm9wYWdhdGUgaWYgY29tcG9uZW50IGFscmVhZHkgZmlsbGVkIGl0IGluLgorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRySW5mbzsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pCisgICAgICAgICAgICAgICAgICAgICYmICFjb25maWctPm1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaGRySW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBkZXNpcmVkIGNvbG9yIGZvcm1hdCBmcm9tIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9wYWdhdGUgZW5jb2RlciBkZWxheSBhbmQgcGFkZGluZyB0byBvdXRwdXQgZm9ybWF0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGludCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItZGVsYXkiLCAmZGVsYXkpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1kZWxheSIsIGRlbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgcGFkZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICBpbnQzMl90IG1hc2s7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfTUFTSywgJm1hc2spKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBpbnB1dDogJXMgYW5kIG91dHB1dDogJXMiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihkb0NvbmZpZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKworICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRDb25maWd1cmVkKGNvbmZpZy0+bUlucHV0Rm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcmVhZCBpdCBmcm9tIGludGYoKSBwcm9wZXJseS4KKyAgICAgICAgaWYgKHN0YXRlLT5jb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0oKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3NwPFBlcnNpc3RlbnRTdXJmYWNlPiBDQ29kZWM6OkNyZWF0ZU9teElucHV0U3VyZmFjZSgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzIE9teFN0YXR1czsKKyAgICBhbmRyb2lkOjpzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworICAgIE9teFN0YXR1cyBzOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicDsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2JzOworCisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG9teC0+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+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MDBtcywgImFsbG9jYXRlIik7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKKyAgICAgICAgICAgIGFsbG9jYXRlKChNZWRpYUNvZGVjSW5mbyAqKW9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Y29tbWl0X3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTAwbXMsICJjb25maWd1cmUiKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBjb25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OnN0YXJ0KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MDBtcywgInN0YXJ0Iik7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdG9wKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MDBtcywgInN0b3AiKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmZsdXNoX3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTAwbXMsICJmbHVzaCIpOworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwMG1zLCAiY3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwMG1zLCAic2V0SW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInN1cmZhY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gc3VyZmFjZShzdGF0aWNfY2FzdDxQZXJzaXN0ZW50U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIHNldElucHV0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRXb3JrRG9uZTogeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkUG9zdCA9IGZhbHNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAocXVldWUtPmZyb250KCkpOworICAgICAgICAgICAgICAgIHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBzaG91bGRQb3N0ID0gIXF1ZXVlLT5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZFBvc3QpIHsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V29ya0RvbmUsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgICAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDb25maWc6OldhdGNoZXI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGEgPQorICAgICAgICAgICAgICAgIGNvbmZpZy0+d2F0Y2g8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oKTsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBDMkZyYW1lRGF0YTo6RkxBR19ESVNDQVJEX0ZSQU1FKSA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGJ1ZmZlciBpbmZvIHRvIGNvbmZpZworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlczsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1Zi0+aW5mbygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFsbCBpbmZvIGludG8gb3V0cHV0LXN0cmVhbSAjMCBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHlBc1N0cmVhbSgqaW5mbywgdHJ1ZSAvKiBvdXRwdXQgKi8sIHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgOiBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJnb3Qgb3V0cHV0IGJ1ZmZlciB3aXRoIGNyb3AgJXUsJXUrJXUsJXUgYW5kIHNpemUgJXUsJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3RkR2Z4SW5mb3MgPSB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBzdGRHZnhJbmZvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVmLT5oYXNJbmZvKGl4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKGl4LndpdGhTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihpbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGFubmVsLT5vbldvcmtEb25lKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yayksIGNoYW5nZWQgPyBjb25maWctPm1PdXRwdXRGb3JtYXQgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBpbml0RGF0YS5oYXNDaGFuZ2VkKCkgPyBpbml0RGF0YS51cGRhdGUoKS5nZXQoKSA6IG51bGxwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAvLyB3YXRjaCBtZXNzYWdlIGFscmVhZHkgcG9zdGVkOyBuby1vcC4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnJlY29nbml6ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0RGVhZGxpbmUoVGltZVBvaW50OjptYXgoKSwgMG1zLCAibm9uZSIpOworfQorCit2b2lkIENDb2RlYzo6c2V0RGVhZGxpbmUoCisgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaW50MzJfdCBtdWx0ID0gc3RkOjptYXgoMSwgcHJvcGVydHlfZ2V0X2ludDMyKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfdGltZW91dF9tdWx0IiwgMSkpOworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICBkZWFkbGluZS0+c2V0KG5vdyArICh0aW1lb3V0ICogbXVsdCksIG5hbWUpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgcGVuZGluZ0RlYWRsaW5lID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgbmFtZSA9IGRlYWRsaW5lLT5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSAhPSBUaW1lUG9pbnQ6Om1heCgpKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY29uc3RleHByIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGtXb3JrRHVyYXRpb25UaHJlc2hvbGQgPSAzczsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG1DaGFubmVsLT5lbGFwc2VkKCk7CisgICAgICAgIGlmIChlbGFwc2VkID49IGtXb3JrRHVyYXRpb25UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIG5hbWUgPSAicXVldWUiOworICAgICAgICB9CisgICAgICAgIGlmIChlbGFwc2VkID4gMHMpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICAvLyBXZSdyZSBub3Qgc3R1Y2suCisgICAgICAgIGlmIChwZW5kaW5nRGVhZGxpbmUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3Qgc3R1Y2sgeWV0IGJ1dCBzdGlsbCBoYXMgZGVhZGxpbmUgY29taW5nIHVwLAorICAgICAgICAgICAgLy8gcG9zdCB3YXRjaCBtZXNzYWdlIHRvIGNoZWNrIGJhY2sgbGF0ZXIuCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygicHJldmlvdXMgY2FsbCB0byAlcyBleGNlZWRlZCB0aW1lb3V0IiwgbmFtZS5jX3N0cigpKTsKKyAgICBpbml0aWF0ZVJlbGVhc2UoZmFsc2UpOworICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6Q29kZWNCYXNlICpDcmVhdGVDb2RlYygpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkNDb2RlYzsKK30KKworLy8gQ3JlYXRlIENvZGVjIDIuMCBpbnB1dCBzdXJmYWNlCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBDb2RlYzIncyBpbnB1dCBzdXJmYWNlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5X2dldF9pbnQzMigiZGVidWcuc3RhZ2VmcmlnaHQuYzJpbnB1dHN1cmZhY2UiLCAwKSA9PSAtMSkgeworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwOworICAgICAgICAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2JzID0gbmV3IE9teEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdicy0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlOiBlcnJvciAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBnYnMtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJTb3VyY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZShnYnMpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IFBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPj4oCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEhhbEludGVyZmFjZSgpKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGIzYzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDX0NPREVDX0hfCisjZGVmaW5lIENfQ09ERUNfSF8KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw7CitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyOworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBDQ29kZWMgOiBwdWJsaWMgQ29kZWNCYXNlIHsKK3B1YmxpYzoKKyAgICBDQ29kZWMoKTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBnZXRCdWZmZXJDaGFubmVsKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCk7CisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk7CisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DQ29kZWMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IFRpbWVQb2ludDsKKworICAgIHN0YXR1c190IHRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpOworCisgICAgdm9pZCBpbml0aWF0ZVN0b3AoKTsKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayA9IHRydWUpOworCisgICAgdm9pZCBhbGxvY2F0ZShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmNvZGVjSW5mbyk7CisgICAgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCByZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5wdXQgc3VyZmFjZSBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJsZSB3aXRoIENDb2RlYy4KKyAgICAgKiBUaGlzIGNvdWxkIGJlIGJhY2tlZCBieSB0aGUgQzIgSEFMIG9yIHRoZSBPTVggSEFMLgorICAgICAqLworICAgIHN0YXRpYyBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8vIENyZWF0ZXMgYW4gaW5wdXQgc3VyZmFjZSB0byB0aGUgT01YIEhBTAorICAgIHN0YXRpYyBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ3JlYXRlT214SW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLy8gaGFuZGxlIGEgY3JlYXRlIGlucHV0IHN1cmZhY2UgY2FsbAorICAgIHZvaWQgY3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgdm9pZCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgdm9pZCBzZXREZWFkbGluZSgKKyAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWxsb2NhdGUsCisgICAgICAgIGtXaGF0Q29uZmlndXJlLAorICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICBrV2hhdEZsdXNoLAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAga1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0SW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMsCisKKyAgICAgICAga1doYXRXb3JrRG9uZSwKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFJFTEVBU0VELAorICAgICAgICBBTExPQ0FURUQsCisgICAgICAgIEZMVVNIRUQsCisgICAgICAgIFJVTk5JTkcsCisKKyAgICAgICAgQUxMT0NBVElORywgIC8vIFJFTEVBU0VEIC0+IEFMTE9DQVRFRAorICAgICAgICBTVEFSVElORywgICAgLy8gQUxMT0NBVEVEIC0+IFJVTk5JTkcKKyAgICAgICAgU1RPUFBJTkcsICAgIC8vIFJVTk5JTkcgLT4gQUxMT0NBVEVECisgICAgICAgIEZMVVNISU5HLCAgICAvLyBSVU5OSU5HIC0+IEZMVVNIRUQKKyAgICAgICAgUkVTVU1JTkcsICAgIC8vIEZMVVNIRUQgLT4gUlVOTklORworICAgICAgICBSRUxFQVNJTkcsICAgLy8ge0FOWSBFWENFUFQgUkVMRUFTRUR9IC0+IFJFTEVBU0VECisgICAgfTsKKworICAgIHN0cnVjdCBTdGF0ZSB7CisgICAgICAgIGlubGluZSBTdGF0ZSgpIDogbVN0YXRlKFJFTEVBU0VEKSB7fQorICAgICAgICBpbmxpbmUgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1TdGF0ZTsgfQorICAgICAgICBpbmxpbmUgdm9pZCBzZXQoaW50IG5ld1N0YXRlKSB7IG1TdGF0ZSA9IG5ld1N0YXRlOyB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHByaXZhdGU6CisgICAgICAgIGludCBtU3RhdGU7CisgICAgfTsKKworICAgIHN0cnVjdCBOYW1lZFRpbWVQb2ludCB7CisgICAgICAgIE5hbWVkVGltZVBvaW50KCkgOiBtVGltZVBvaW50KFRpbWVQb2ludDo6bWF4KCkpLCBtTmFtZSgiIikge30KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXQoCisgICAgICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZ0aW1lUG9pbnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICAgICAgbVRpbWVQb2ludCA9IHRpbWVQb2ludDsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBUaW1lUG9pbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVRpbWVQb2ludDsgfQorICAgICAgICBpbmxpbmUgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZVBvaW50IG1UaW1lUG9pbnQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOworICAgIH07CisKKyAgICBNdXRleGVkPFN0YXRlPiBtU3RhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw+IG1DaGFubmVsOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUNsaWVudExpc3RlbmVyOworICAgIHN0cnVjdCBDbGllbnRMaXN0ZW5lcjsKKworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+IG1EZWFkbGluZTsKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZyBDb25maWc7CisgICAgTXV0ZXhlZDxDb25maWc+IG1Db25maWc7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+PiBtV29ya0RvbmVRdWV1ZTsKKworICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ29kZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwODI5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMCwwICsxLDE3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQnVmZmVyQ2hhbm5lbCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKKyNpbmNsdWRlICJTa2lwQ3V0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOworCit1c2luZyBDYXNTdGF0dXMgPSBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpTdGF0dXM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBzaXplX3Qga1Ntb290aG5lc3NGYWN0b3IgPSA0OworY29uc3RleHByIHNpemVfdCBrUmVuZGVyaW5nRGVwdGggPSAzOworCisvLyBUaGlzIGlzIGZvciBrZWVwaW5nIElHQlAncyBidWZmZXIgZHJvcHBpbmcgbG9naWMgaW4gbGVnYWN5IG1vZGUgb3RoZXIKKy8vIHRoYW4gbWFraW5nIGl0IG5vbi1ibG9ja2luZy4gRG8gbm90IGNoYW5nZSB0aGlzIHZhbHVlLgorY29uc3Qgc3RhdGljIHNpemVfdCBrRGVxdWV1ZVRpbWVvdXROcyA9IDA7CisKK30gIC8vIG5hbWVzcGFjZQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjpRdWV1ZUd1YXJkKAorICAgICAgICBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmMgJnN5bmMpIDogbVN5bmMoc3luYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TeW5jLm1HdWFyZExvY2spOworICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyBndWFyYW50ZWVkIHRoYXQgbVN5bmMgaXMgbm90IHVuZGVyIHN0YXRlIHRyYW5zaXRpb24sCisgICAgLy8gYXMgd2UgYXJlIGhvbGRpbmcgaXRzIG11dGV4LgorCisgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytjb3VudC0+dmFsdWU7CisgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6On5RdWV1ZUd1YXJkKCkgeworICAgIGlmIChtUnVubmluZykgeworICAgICAgICAvLyBXZSBhcmUgbm90IGhvbGRpbmcgbUd1YXJkTG9jayBhdCB0aGlzIHBvaW50IHNvIHRoYXQgUXVldWVTeW5jOjpzdG9wKCkgY2FuCisgICAgICAgIC8vIGtlZXAgaG9sZGluZyB0aGUgbG9jayB1bnRpbCBtQ291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgICAgICAtLWNvdW50LT52YWx1ZTsKKyAgICAgICAgY291bnQtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgLy8gSWYgc3RvcHBlZCwgaXQgZ29lcyB0byBydW5uaW5nIHN0YXRlOyBvdGhlcndpc2Ugbm8tb3AuCisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBjb3VudC0+dmFsdWUgPSAwOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICAvLyBuby1vcAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEhvbGRpbmcgbUd1YXJkTG9jayBoZXJlIGJsb2NrcyBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIFF1ZXVlR3VhcmQgb2JqZWN0cywgc28KKyAgICAvLyBtQ291bnQgY2FuIG9ubHkgZGVjcmVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhyZWFkcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrCisgICAgLy8gYXJlIGFsbG93ZWQgdG8gZmluaXNoIGV4ZWN1dGlvbiBidXQgYWRkaXRpb25hbCB0aHJlYWRzIHRyeWluZyB0byBhY3F1aXJlCisgICAgLy8gdGhlIGxvY2sgYXQgdGhpcyBwb2ludCB3aWxsIGJsb2NrLCBhbmQgdGhlbiBnZXQgUXVldWVHdWFyZCBhdCBTVE9QUEVECisgICAgLy8gc3RhdGUuCisgICAgd2hpbGUgKGNvdW50LT52YWx1ZSAhPSAwKSB7CisgICAgICAgIGNvdW50LndhaXRGb3JDb25kaXRpb24oY291bnQtPmNvbmQpOworICAgIH0KKyAgICBjb3VudC0+dmFsdWUgPSAtMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6UmVvcmRlclN0YXNoKCkgeworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpjbGVhcigpIHsKKyAgICBtUGVuZGluZy5jbGVhcigpOworICAgIG1TdGFzaC5jbGVhcigpOworICAgIG1EZXB0aCA9IDA7CisgICAgbUtleSA9IEMyQ29uZmlnOjpPUkRJTkFMOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Zmx1c2goKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OnNldERlcHRoKHVpbnQzMl90IGRlcHRoKSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1EZXB0aCA9IGRlcHRoOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6c2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtS2V5ID0ga2V5OworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6cG9wKEVudHJ5ICplbnRyeSkgeworICAgIGlmIChtUGVuZGluZy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW50cnktPmJ1ZmZlciAgICAgPSBtUGVuZGluZy5mcm9udCgpLmJ1ZmZlcjsKKyAgICBlbnRyeS0+dGltZXN0YW1wICA9IG1QZW5kaW5nLmZyb250KCkudGltZXN0YW1wOworICAgIGVudHJ5LT5mbGFncyAgICAgID0gbVBlbmRpbmcuZnJvbnQoKS5mbGFnczsKKyAgICBlbnRyeS0+b3JkaW5hbCAgICA9IG1QZW5kaW5nLmZyb250KCkub3JkaW5hbDsKKyAgICBtUGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmVtcGxhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpIHsKKyAgICBib29sIGVvcyA9IGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgIGlmICghYnVmZmVyICYmIGVvcykgeworICAgICAgICAvLyBUUklDS1k6IHdlIG1heSBiZSB2aW9sYXRpbmcgb3JkZXJpbmcgb2YgdGhlIHN0YXNoIGhlcmUuIEJlY2F1c2Ugd2UKKyAgICAgICAgLy8gZG9uJ3QgZXhwZWN0IGFueSBtb3JlIGVtcGxhY2UoKSBjYWxscyBhZnRlciB0aGlzLCB0aGUgb3JkZXJpbmcgc2hvdWxkCisgICAgICAgIC8vIG5vdCBtYXR0ZXIuCisgICAgICAgIG1TdGFzaC5lbXBsYWNlX2JhY2soYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyA9IGZsYWdzICYgfk1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgYXV0byBpdCA9IG1TdGFzaC5iZWdpbigpOworICAgICAgICBmb3IgKDsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAobGVzcyhvcmRpbmFsLCBpdC0+b3JkaW5hbCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU3Rhc2guZW1wbGFjZShpdCwgYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVN0YXNoLmJhY2soKS5mbGFncyA9IG1TdGFzaC5iYWNrKCkuZmxhZ3MgfCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBJbnB1dAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dDo6SW5wdXQoKSA6IGV4dHJhQnVmZmVycygiZXh0cmEiKSB7fQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1GcmFtZUluZGV4KDB1KSwKKyAgICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCgwdSksCisgICAgICBtTWV0YU1vZGUoTU9ERV9OT05FKSwKKyAgICAgIG1JbnB1dE1ldEVvcyhmYWxzZSkgeworICAgIG1PdXRwdXRTdXJmYWNlLmxvY2soKS0+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/IGlucHV0RGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXlWYWx1ZSA9IHBpcGVsaW5lRGVsYXkgPyBwaXBlbGluZURlbGF5LnZhbHVlIDogMDsKKyAgICB1aW50MzJfdCBvdXRwdXREZWxheVZhbHVlID0gb3V0cHV0RGVsYXkgPyBvdXRwdXREZWxheS52YWx1ZSA6IDA7CisKKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5VmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKworICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW5wdXQgZm9ybWF0CisgICAgYm9vbCBzZWN1cmUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiLnNlY3VyZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIGludCBwb29sTWFzayA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJkZWJ1Zy5zdGFnZWZyaWdodC5jMi1wb29sbWFzayIsCisgICAgICAgICAgICAxIDw8IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OIHwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSk7CisKKyAgICBpZiAoaW5wdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBib29sIGdyYXBoaWMgPSAoaVN0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisKKyAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IGFsbG9jYXRvciBJRC4KKyAgICAgICAgICAgIHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dCBmcm9tIGNvbXBvbmVudC4gSWYgYW4gYWxsb2NhdG9yIElEIGlzIG9idGFpbmVkCisgICAgICAgICAgICAvLyBmcm9tIGNvbXBvbmVudCwgY3JlYXRlIHRoZSBpbnB1dCBibG9jayBwb29sIHdpdGggZ2l2ZW4gSUQuIE90aGVyd2lzZSwgdXNlIGRlZmF1bHQgSURzLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBpbnB1dCBhbGxvY2F0b3JzIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0ICppbnB1dEFsbG9jYXRvcnMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEFsbG9jYXRvcnMgJiYgaW5wdXRBbGxvY2F0b3JzLT5mbGV4Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihpbnB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgaW5wdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgQzJDb21wb25lbnQgd3JhcHBlciB0byBhc3NvY2lhdGUgdGhpcyBwb29sIHdpdGggb3Vyc2VsdmVzCisgICAgICAgICAgICBpZiAoKHBvb2xNYXNrID4+IHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDcmVhdGVDb2RlYzJCbG9ja1Bvb2wocG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsIG51bGxwdHIsICZwb29sKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDcmVhdGVkIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBhbGxvY2F0b3JJRCAldSA9PiBwb29sSUQgJWxsdSAtICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykocG9vbCA/IHBvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaW5wdXRQb29sSWQgPQorICAgICAgICAgICAgICAgICAgICBncmFwaGljID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgICAgIGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChpbnB1dFBvb2xJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFVzaW5nIGJhc2ljIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBwb29sSUQgJWxsdSA9PiBnb3QgJWxsdSAtICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXRQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvb2xzLT5pbnB1dFBvb2wgPSBwb29sOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmb3JjZUFycmF5TW9kZSA9IGZhbHNlOworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIGlucHV0LT5pbnB1dERlbGF5ID0gaW5wdXREZWxheVZhbHVlOworICAgICAgICBpbnB1dC0+cGlwZWxpbmVEZWxheSA9IHBpcGVsaW5lRGVsYXlWYWx1ZTsKKyAgICAgICAgaW5wdXQtPm51bVNsb3RzID0gbnVtSW5wdXRTbG90czsKKyAgICAgICAgaW5wdXQtPmV4dHJhQnVmZmVycy5mbHVzaCgpOworICAgICAgICBpbnB1dC0+bnVtRXh0cmFTbG90cyA9IDB1OworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1ldGFNb2RlID09IE1PREVfQU5XKSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIGJ1ZmZlcnMgZG8gbm90IGdldCByZWxlYXNlZCBwcmVtYXR1cmVseS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyB3aXRob3V0IGdvaW5nIGludG8gYXJyYXkgbW9kZQorICAgICAgICAgICAgICAgIGZvcmNlQXJyYXlNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IEdyYXBoaWNJbnB1dEJ1ZmZlcnMobnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgKHZvaWQpaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtRGVhbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24oY2FwYWNpdHksIE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChudW1JbnB1dFNsb3RzICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyIpOworICAgICAgICAgICAgICAgICAgICBtRGVjcnlwdERlc3RpbmF0aW9uID0gbURlYWxlci0+YWxsb2NhdGUoKHNpemVfdCljYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbUhlYXBTZXFOdW0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gbUNyeXB0by0+c2V0SGVhcChtRGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLnJlc2V0KG5ldyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsIG1EZWFsZXIsIG1DcnlwdG8sIG1IZWFwU2VxTnVtLCAoc2l6ZV90KWNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgICAgICBmb3JjZUFycmF5TW9kZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLnJlc2V0KG5ldyBMaW5lYXJJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnB1dC0+YnVmZmVycy0+c2V0Rm9ybWF0KGlucHV0Rm9ybWF0KTsKKworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy0+c2V0UG9vbChwb29sKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9yY2VBcnJheU1vZGUpIHsKKyAgICAgICAgICAgIGlucHV0LT5idWZmZXJzID0gaW5wdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG51bUlucHV0U2xvdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dFN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb247CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG51bU91dHB1dFNsb3RzICsgcmVvcmRlckRlcHRoLnZhbHVlICsga1JlbmRlcmluZ0RlcHRoOworICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSA9IG91dHB1dC0+c3VyZmFjZSA/CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiA9IG91dHB1dC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZF87CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjsKKworICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IgaWYKKyAgICAgICAgICAgIC8vIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBhbGxvY2F0b3JzIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCAqb3V0cHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRBbGxvY2F0b3JzICYmIG91dHB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB1c2UgYnVmZmVycXVldWUgaWYgb3V0cHV0dGluZyB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgLy8gaWYgdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgc3VyZmFjZSBhbGxvY2F0b3IgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0ICpzdXJmYWNlQWxsb2NhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZUFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBzdXJmYWNlIG91dHB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHN1cmZhY2VBbGxvY2F0b3ItPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciAhPSBDMl9PSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChwb29sTWFzayA+PiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBvb2xNYXNrID4+IHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCkgJiAxKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLCAmcG9vbHMtPm91dHB1dFBvb2xJZCwgJnBvb2xzLT5vdXRwdXRQb29sSW50Zik7CisgICAgICAgICAgICAgICAgQUxPR0koIlslc10gQ3JlYXRlZCBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbHMtPm91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGJhc2ljIHBvb2wgaW5zdGVhZAorICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRQb29sSWQgPQorICAgICAgICAgICAgICAgICAgICBncmFwaGljID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25maWd1cmUgb3V0cHV0IGJsb2NrIHBvb2wgSUQgYXMgcGFyYW1ldGVyIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dCB0bworICAgICAgICAgICAgLy8gY29tcG9uZW50LgorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbElkc1R1bmluZyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoeyBwb29scy0+b3V0cHV0UG9vbElkIH0pOworCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoeyBwb29sSWRzVHVuaW5nLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbmZpZ3VyZWQgb3V0cHV0IGJsb2NrIHBvb2wgaWRzICVsbHUgPT4gJXMiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29sSWRzVHVuaW5nLT5tLnZhbHVlc1swXSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICBvdXRwdXRQb29sSWRfID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgb3V0cHV0LT5vdXRwdXREZWxheSA9IG91dHB1dERlbGF5VmFsdWU7CisgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBudW1PdXRwdXRTbG90czsKKyAgICAgICAgaWYgKGdyYXBoaWMpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KG5ldyBHcmFwaGljT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMucmVzZXQobmV3IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKG51bU91dHB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KG5ldyBMaW5lYXJPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0LT5kdXAoKSk7CisKKworICAgICAgICAvLyBUcnkgdG8gc2V0IG91dHB1dCBzdXJmYWNlIHRvIGNyZWF0ZWQgYmxvY2sgcG9vbCBpZiBnaXZlbi4KKyAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZF8sCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIKKyAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5maW5kKCJjMi5xdGkuIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IGlmIHdlJ3JlIHVzaW5nIGVhcmx5IENTRCB3b3JrYXJvdW5kIHdlIGNvbnZlcnQgdG8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFycmF5IG1vZGUsIHRvIGFwcGVhc2UgYXBwcyBhc3N1bWluZyB0aGUgb3V0cHV0CisgICAgICAgICAgICAvLyAgICAgICAgICAgICBidWZmZXJzIHRvIGJlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMgPSBvdXRwdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG51bU91dHB1dFNsb3RzKTsKKworICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gMDs7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWxheSB8fCBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgd3JpdGUgYWNjZXNzIHRvIHRoZSBidWZmZXJzLCBhbmQgd2UncmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBtb2RlLgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLm91dHB1dERlbGF5KG91dHB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnNtb290aG5lc3NGYWN0b3Ioa1Ntb290aG5lc3NGYWN0b3IpOworICAgICAgICB3YXRjaGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIG1JbnB1dE1ldEVvcyA9IGZhbHNlOworICAgIG1TeW5jLnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+IHRvQmVRdWV1ZWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgYXQgYWxsIiwgbU5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5LCBvbmx5ICV6dSBidWZmZXJzIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICAgICAgQUxPR1YoIlslc10gaW5wdXQgYnVmZmVyICV6dSBhdmFpbGFibGUiLCBtTmFtZSwgaW5kZXgpOworICAgICAgICAgICAgYm9vbCBwb3N0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghY29uZmlncy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGNvbmZpZ3MtPmZyb250KCk7CisgICAgICAgICAgICAgICAgY29uZmlncy0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjb25maWctPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5iYXNlKCksIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGJ1ZmZlciBjYXBhY2l0eSB0b28gc21hbGwgZm9yIHRoZSBjb25maWcgKCV6dSA8ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBidWZmZXItPmNhcGFjaXR5KCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIgJiYgaSA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYW55IGlucHV0LiBRdWV1ZSBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IHRoZSBDU0QuCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgIHBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3N0KSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b0JlUXVldWVkLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciA6IHRvQmVRdWV1ZWQpIHsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBpbml0aWFsIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnN0b3AoKSB7CisgICAgbVN5bmMuc3RvcCgpOworICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJSZWFkVmlldyB2aWV3ID0KKyAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBmYWlsZWQgdG8gbWFwIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGE6ICVkIiwgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWdzLT5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSAoc2l6ZT0ldSkiLCBtTmFtZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgaW5wdXQtPmJ1ZmZlcnMtPmZsdXNoKCk7CisgICAgICAgIGlucHV0LT5leHRyYUJ1ZmZlcnMuZmx1c2goKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIG91dHB1dC0+YnVmZmVycy0+Zmx1c2goZmx1c2hlZFdvcmspOworICAgIH0KKyAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+Zmx1c2goKTsKKyAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+Zmx1c2goKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoaGFuZGxlV29yayhzdGQ6Om1vdmUod29yayksIG91dHB1dEZvcm1hdCwgaW5pdERhdGEpKSB7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gaW5wdXQtPmJ1ZmZlcnMtPmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihidWZmZXIpOworICAgICAgICBpZiAoIW5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICAgICAgKHZvaWQpaW5wdXQtPmV4dHJhQnVmZmVycy5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3SW5wdXRTbG90QXZhaWxhYmxlKSB7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfQorfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OmhhbmRsZVdvcmsoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSkgeworICAgIGlmICgod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IC0gbUZpcnN0VmFsaWRGcmFtZUluZGV4LmxvYWQoKSkucGVlaygpIDwgMCkgeworICAgICAgICAvLyBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uCisgICAgICAgIEFMT0dEKCJbJXNdIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlucHV0U3VyZmFjZSA9PSBudWxscHRyICYmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSkgeworICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZSh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCA9PSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0QoIlslc10gZmx1c2hlZCB3b3JrOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiWyVzXSB3b3JrIGZhaWxlZCB0byBjb21wbGV0ZTogJWQiLCBtTmFtZSwgd29yay0+cmVzdWx0KTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKHdvcmstPnJlc3VsdCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgd29ya2xldAorICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiB3b3JrbGV0czogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29yay0+d29ya2xldHMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+ICZ3b3JrbGV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIC8vIE5PVEU6IE1lZGlhQ29kZWMgdXNhZ2Ugc3VwcG9zZWRseSBoYXZlIG9ubHkgb25lIG91dHB1dCBzdHJlYW0uCisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA+IDF1KSB7CisgICAgICAgIEFMT0dJKCJbJXNdIG9uV29ya0RvbmU6IGluY29ycmVjdCBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnM6ICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA9PSAxdSkgeworICAgICAgICBidWZmZXIgPSB3b3JrbGV0LT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG51bGxwdHIgZm91bmQgaW4gYnVmZmVyczsgaWdub3JlZC4iLCBtTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBuZXdJbnB1dERlbGF5LCBuZXdQaXBlbGluZURlbGF5OworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gbU91dHB1dC5sb2NrKCktPm51bVNsb3RzOworICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRTbG90cyArIHJlb3JkZXJEZXB0aC52YWx1ZSArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBkZXB0aCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyS2V5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIga2V5IHRvICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIga2V5IiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlbGluZURlbGF5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRpbmcgcGlwZWxpbmUgZGVsYXkgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBpcGVsaW5lRGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGlwZWxpbmVEZWxheSA9IHBpcGVsaW5lRGVsYXkudmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCltUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+cGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmZvcklucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0IGlucHV0RGVsYXk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dERlbGF5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRpbmcgaW5wdXQgZGVsYXkgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXREZWxheSA9IGlucHV0RGVsYXkudmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCltUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+aW5wdXREZWxheShpbnB1dERlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPmZvck91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0aW5nIG91dHB1dCBkZWxheSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm91dHB1dERlbGF5KG91dHB1dERlbGF5LnZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5vdXRwdXREZWxheSA9IG91dHB1dERlbGF5LnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU91dHB1dFNsb3RzID0gb3V0cHV0RGVsYXkudmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5udW1TbG90cyA8IG51bU91dHB1dFNsb3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBudW1PdXRwdXRTbG90czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dEJ1ZmZlcnNBcnJheSAqKW91dHB1dC0+YnVmZmVycy5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGdyb3dpbmcgb3V0cHV0IGJ1ZmZlciBhcnJheSB0byAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LT5ncm93KG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXB0aCA9IG1SZW9yZGVyU3Rhc2gubG9jaygpLT5kZXB0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKyBkZXB0aCArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVucmVjb2duaXplZCBjb25maWcgdXBkYXRlICglMDhYKSIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3SW5wdXREZWxheSB8fCBuZXdQaXBlbGluZURlbGF5KSB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgc2l6ZV90IG5ld051bVNsb3RzID0KKyAgICAgICAgICAgIG5ld0lucHV0RGVsYXkudmFsdWVfb3IoaW5wdXQtPmlucHV0RGVsYXkpICsKKyAgICAgICAgICAgIG5ld1BpcGVsaW5lRGVsYXkudmFsdWVfb3IoaW5wdXQtPnBpcGVsaW5lRGVsYXkpICsKKyAgICAgICAgICAgIGtTbW9vdGhuZXNzRmFjdG9yOworICAgICAgICBpZiAoaW5wdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dC0+bnVtU2xvdHMgPj0gbmV3TnVtU2xvdHMpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+bnVtRXh0cmFTbG90cyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gbmV3TnVtU2xvdHMgLSBpbnB1dC0+bnVtU2xvdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIG51bWJlciBvZiBleHRyYSBzbG90cyB0byAlenUgKGlucHV0IGFycmF5IG1vZGUpIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCBpbnB1dC0+bnVtRXh0cmFTbG90cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBuZXdOdW1TbG90czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnVwZGF0ZVNraXBDdXRCdWZmZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgLy8gV09SS0FST1VORDogYWRqdXN0IG91dHB1dCB0aW1lc3RhbXAgYmFzZWQgb24gY2xpZW50IGlucHV0IHRpbWVzdGFtcCBhbmQgY29kZWMKKyAgICAvLyBpbnB1dCB0aW1lc3RhbXAuIENvZGVjIG91dHB1dCB0aW1lc3RhbXAgKGluIHRoZSB0aW1lc3RhbXAgZmllbGQpIHNoYWxsIGNvcnJlc3BvbmQgdG8KKyAgICAvLyB0aGUgY29kZWMgaW5wdXQgdGltZXN0YW1wLCBidXQgY2xpZW50IG91dHB1dCB0aW1lc3RhbXAgc2hvdWxkIChyZXBvcnRlZCBpbiB0aW1lVXMpCisgICAgLy8gc2hhbGwgY29ycmVzcG9uZCB0byB0aGUgY2xpZW50IGlucHV0IHRpbWVzYW1wIChpbiBjdXN0b21PcmRpbmFsKS4gQnkgdXNpbmcgdGhlCisgICAgLy8gZGVsdGEgYmV0d2VlbiB0aGUgdHdvLCB0aGlzIGFsbG93cyBmb3Igc29tZSB0aW1lc3RhbXAgZGV2aWF0aW9uIC0gZS5nLiBpZiBvbmUgaW5wdXQKKyAgICAvLyBwcm9kdWNlcyBtdWx0aXBsZSBvdXRwdXQuCisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wID0KKyAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICsgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsCisgICAgICAgICAgICAgICAgLSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdoZW4gdXNpbmcgaW5wdXQgc3VyZmFjZSB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGlucHV0IHRpbWVzdGFtcC4KKyAgICAgICAgdGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBpbnB1dCAlbGxkLCBjb2RlYyAlbGxkID0+IG91dHB1dCAlbGxkID0+ICVsbGQiLAorICAgICAgICAgIG1OYW1lLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgdGltZXN0YW1wLnBlZWtsbCgpKTsKKworICAgIGlmIChpbml0RGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycy0+cmVnaXN0ZXJDc2QoaW5pdERhdGEsICZpbmRleCwgJm91dEJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZXN0YW1wLnBlZWsoKSk7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpOworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogY3NkIGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSk7CisKKyAgICAgICAgICAgIG91dHB1dC51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiB1bmFibGUgdG8gcmVnaXN0ZXIgY3NkIiwgbU5hbWUpOworICAgICAgICAgICAgb3V0cHV0LnVubG9jaygpOworICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYnVmZmVyICYmICFmbGFncykgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKKyAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWZmZXItPmluZm8oKSkgeworICAgICAgICAgICAgLy8gVE9ETzogcHJvcGVybHkgdHJhbnNsYXRlIHRoZXNlIHRvIG1ldGFkYXRhCisgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgIGlmICgoKEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbyAqKWluZm8uZ2V0KCkpLT52YWx1ZSAmIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmVtcGxhY2UoYnVmZmVyLCB0aW1lc3RhbXAucGVlaygpLCBmbGFncywgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwpOworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vIEZsdXNoIHJlb3JkZXIgc3Rhc2gKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKDApOworICAgICAgICB9CisgICAgfQorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2VuZE91dHB1dEJ1ZmZlcnMoKSB7CisgICAgUmVvcmRlclN0YXNoOjpFbnRyeSBlbnRyeTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgaWYgKCFyZW9yZGVyLT5oYXNQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghcmVvcmRlci0+cG9wKCZlbnRyeSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBvdXRwdXQtPmJ1ZmZlcnMtPnJlZ2lzdGVyQnVmZmVyKGVudHJ5LmJ1ZmZlciwgJmluZGV4LCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYm9vbCBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0LT5idWZmZXJzLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycyA9IG91dHB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUob3V0cHV0LT5udW1TbG90cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPSAoT3V0cHV0QnVmZmVyc0FycmF5ICopb3V0cHV0LT5idWZmZXJzLmdldCgpOworICAgICAgICAgICAgICAgIGFycmF5LT5yZWFsbG9jKGVudHJ5LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHVuYWJsZSB0byByZWdpc3RlciBvdXRwdXQgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmVvcmRlci0+ZGVmZXIoZW50cnkpOworCisgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CisgICAgICAgICAgICByZW9yZGVyLnVubG9jaygpOworCisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQudW5sb2NrKCk7CisgICAgICAgIHJlb3JkZXIudW5sb2NrKCk7CisKKyAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBlbnRyeS50aW1lc3RhbXApOworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgZW50cnkuZmxhZ3MpOworICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogb3V0IGJ1ZmZlciBpbmRleCA9ICV6dSBbJXBdID0+ICVwICsgJXp1ICglbGxkKSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCksIG91dEJ1ZmZlci0+ZGF0YSgpLCBvdXRCdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZuZXdTdXJmYWNlKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljX3VpbnQzMl90IHN1cmZhY2VHZW5lcmF0aW9uezB9OworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAoZ2V0cGlkKCkgPDwgMTApIHwKKyAgICAgICAgICAgICgoc3VyZmFjZUdlbmVyYXRpb24uZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpICsgMSkKKyAgICAgICAgICAgICAgICAmICgoMSA8PCAxMCkgLSAxKSk7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBpZiAobmV3U3VyZmFjZSkgeworICAgICAgICBuZXdTdXJmYWNlLT5zZXRTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOworICAgICAgICBuZXdTdXJmYWNlLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZVRpbWVvdXROcyk7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQobU91dHB1dFN1cmZhY2UubG9jaygpLT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgIHByb2R1Y2VyID0gbmV3U3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICBwcm9kdWNlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiWyVzXSBzZXR0aW5nIG91dHB1dCBzdXJmYWNlIHRvIG51bGwiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisgICAgICAgIG91dHB1dFBvb2xJZCA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIG91dHB1dFBvb2xJbnRmID0gcG9vbHMtPm91dHB1dFBvb2xJbnRmOworICAgIH0KKworICAgIGlmIChvdXRwdXRQb29sSW50ZikgeworICAgICAgICBpZiAobUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbikgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIHNldFN1cmZhY2U6IGNvbXBvbmVudCBzZXRPdXRwdXRTdXJmYWNlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgIG91dHB1dC0+c3VyZmFjZSA9IG5ld1N1cmZhY2U7CisgICAgICAgIG91dHB1dC0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBDQ29kZWNCdWZmZXJDaGFubmVsOjplbGFwc2VkKCkgeworICAgIC8vIFdoZW4gY2xpZW50IHB1c2hlZCBFT1MsIHdlIHdhbnQgYWxsIHRoZSB3b3JrIHRvIGJlIGRvbmUgcXVpY2tseS4KKyAgICAvLyBPdGhlcndpc2UsIGNvbXBvbmVudCBtYXkgaGF2ZSBzdGFsbGVkIHdvcmsgZHVlIHRvIGlucHV0IHN0YXJ2YXRpb24gdXAgdG8KKyAgICAvLyB0aGUgc3VtIG9mIHRoZSBkZWxheSBpbiB0aGUgcGlwZWxpbmUuCisgICAgc2l6ZV90IG4gPSAwOworICAgIGlmICghbUlucHV0TWV0RW9zKSB7CisgICAgICAgIHNpemVfdCBvdXRwdXREZWxheSA9IG1PdXRwdXQubG9jaygpLT5vdXRwdXREZWxheTsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBuID0gaW5wdXQtPmlucHV0RGVsYXkgKyBpbnB1dC0+cGlwZWxpbmVEZWxheSArIG91dHB1dERlbGF5OworICAgIH0KKyAgICByZXR1cm4gbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmVsYXBzZWQoUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCksIG4pOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpIHsKKyAgICBtTWV0YU1vZGUgPSBtb2RlOworfQorCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wKSB7CisgICAgLy8gQzJfT0sgaXMgYWx3YXlzIHRyYW5zbGF0ZWQgdG8gT0suCisgICAgaWYgKGMycyA9PSBDMl9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gT3BlcmF0aW9uLWRlcGVuZGVudCB0cmFuc2xhdGlvbgorICAgIC8vIFRPRE86IEFkZCBhcyBuZWNlc3NhcnkKKyAgICBzd2l0Y2ggKGMyb3ApIHsKKyAgICBjYXNlIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQ6CisgICAgICAgIHN3aXRjaCAoYzJzKSB7CisgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQmFja3VwIG9wZXJhdGlvbi1hZ25vc3RpYyB0cmFuc2xhdGlvbgorICAgIHN3aXRjaCAoYzJzKSB7CisgICAgY2FzZSBDMl9CQURfSU5ERVg6CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgY2FzZSBDMl9CQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSBDMl9CTE9DS0lORzoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgQzJfRFVQTElDQVRFOgorICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgY2FzZSBDMl9OT19JTklUOgorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBjYXNlIEMyX05PVF9GT1VORDoKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGNhc2UgQzJfVElNRURfT1VUOgorICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgIGNhc2UgQzJfQkFEX1NUQVRFOgorICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6CisgICAgY2FzZSBDMl9DQU5OT1RfRE86CisgICAgY2FzZSBDMl9DT1JSVVBURUQ6CisgICAgY2FzZSBDMl9PTUlUVEVEOgorICAgIGNhc2UgQzJfUkVGVVNFRDoKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1zdGF0aWNfY2FzdDxzdGF0dXNfdD4oYzJzKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM0NTVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworI2luY2x1ZGUgIkNDb2RlY0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5RGVhbGVyOworCitjbGFzcyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q0NvZGVjQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSA9IDA7Cit9OworCisvKioKKyAqIEJ1ZmZlckNoYW5uZWxCYXNlIGltcGxlbWVudGF0aW9uIGZvciBDQ29kZWMuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWwKKyAgICA6IHB1YmxpYyBCdWZmZXJDaGFubmVsQmFzZSwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0J1ZmZlckNoYW5uZWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spOworICAgIHZpcnR1YWwgfkNDb2RlY0J1ZmZlckNoYW5uZWwoKTsKKworICAgIC8vIEJ1ZmZlckNoYW5uZWxCYXNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjYXJkQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBiZWxvdyBhcmUgaW50ZXJmYWNlIGZvciBDQ29kZWMgdG8gdXNlLgorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb21wb25lbnQgb2JqZWN0IGZvciBidWZmZXIgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisgICAgLyoqCisgICAgICogU2V0IG91dHB1dCBncmFwaGljIHN1cmZhY2UgZm9yIHJlbmRlcmluZy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNldCBHcmFwaGljQnVmZmVyU291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgZXh0cmFjdHMgaW5wdXQKKyAgICAgKiBidWZmZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2lnbmFsIEVPUyB0byBpbnB1dCBzdXJmYWNlLgorICAgICAqLworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIFNldCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBiZWZvcmUgdGhpcyBjYWxsIGhhcyBjb21wbGV0ZWQuCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBpbml0aWFsIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IGNsaWVudC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworCisgICAgLyoqCisgICAgICogU3RvcCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYWZ0ZXIgdGhpcyBjYWxsLCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGlucHV0IGNsaWVudCBhYm91dCB3b3JrIGRvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya0l0ZW1zICAgZmluaXNoZWQgd29yayBpdGVtLgorICAgICAqIEBwYXJhbSBvdXRwdXRGb3JtYXQgbmV3IG91dHB1dCBmb3JtYXQgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICogQHBhcmFtIGluaXREYXRhICAgIG5ldyBpbml0IGRhdGEgKENTRCkgaWYgaXQgaGFzIGNoYW5nZWQsIG90aGVyd2lzZSBudWxscHRyCisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGlucHV0IGJ1ZmZlciBhdmFpbGFibGUgZm9yIHRoZSBjbGllbnQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAqIGJ5IHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZUluZGV4IFRoZSBpbmRleCBvZiBpbnB1dCB3b3JrCisgICAgICogQHBhcmFtIGFycmF5SW5kZXggVGhlIGluZGV4IG9mIGJ1ZmZlciBpbiB0aGUgaW5wdXQgd29yayBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCisgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCgpOworCisgICAgZW51bSBNZXRhTW9kZSB7CisgICAgICAgIE1PREVfTk9ORSwKKyAgICAgICAgTU9ERV9BTlcsCisgICAgfTsKKworICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgUXVldWVHdWFyZDsKKworICAgIC8qKgorICAgICAqIFNwZWNpYWwgbXV0ZXgtbGlrZSBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisgICAgICoKKyAgICAgKiAtIEF0IFNUT1BQRUQgc3RhdGUgKGluaXRpYWwsIG9yIGFmdGVyIHN0b3AoKSkKKyAgICAgKiAgIC0gUXVldWVHdWFyZCBvYmplY3QgZ2V0cyBjcmVhdGVkIGF0IFNUT1BQRUQgc3RhdGUsIGFuZCB0aGUgY2xpZW50IGlzCisgICAgICogICAgIHN1cHBvc2VkIHRvIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICAgKiAtIEF0IFJVTk5JTkcgc3RhdGUgKGFmdGVyIHN0YXJ0KCkpCisgICAgICogICAtIEVhY2ggUXVldWVHdWFyZCBvYmplY3QKKyAgICAgKi8KKyAgICBjbGFzcyBRdWV1ZVN5bmMgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF0IGNvbnN0cnVjdGlvbiB0aGUgc3luYyBvYmplY3QgaXMgaW4gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBRdWV1ZVN5bmMoKSB7fQorICAgICAgICB+UXVldWVTeW5jKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2l0aW9uIHRvIFJVTk5JTkcgc3RhdGUgd2hlbiBzdG9wcGVkLiBOby1vcCBpZiBhbHJlYWR5IGluIFJVTk5JTkcKKyAgICAgICAgICogc3RhdGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHN0YXJ0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF0IFJVTk5JTkcgc3RhdGUsIHdhaXQgdW50aWwgYWxsIFF1ZXVlR3VhcmQgb2JqZWN0IGNyZWF0ZWQgZHVyaW5nCisgICAgICAgICAqIFJVTk5JTkcgc3RhdGUgYXJlIGRlc3Ryb3llZCwgYW5kIHRoZW4gdHJhbnNpdGlvbiB0byBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKiBOby1vcCBpZiBhbHJlYWR5IGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHN0b3AoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE11dGV4IG1HdWFyZExvY2s7CisKKyAgICAgICAgc3RydWN0IENvdW50ZXIgeworICAgICAgICAgICAgaW5saW5lIENvdW50ZXIoKSA6IHZhbHVlKC0xKSB7fQorICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIENvbmRpdGlvbiBjb25kOworICAgICAgICB9OworICAgICAgICBNdXRleGVkPENvdW50ZXI+IG1Db3VudDsKKworICAgICAgICBmcmllbmQgY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDsKKyAgICB9OworCisgICAgY2xhc3MgUXVldWVHdWFyZCB7CisgICAgcHVibGljOgorICAgICAgICBRdWV1ZUd1YXJkKFF1ZXVlU3luYyAmc3luYyk7CisgICAgICAgIH5RdWV1ZUd1YXJkKCk7CisgICAgICAgIGlubGluZSBib29sIGlzUnVubmluZygpIHsgcmV0dXJuIG1SdW5uaW5nOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBRdWV1ZVN5bmMgJm1TeW5jOworICAgICAgICBib29sIG1SdW5uaW5nOworICAgIH07CisKKyAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7CisgICAgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcik7CisgICAgYm9vbCBoYW5kbGVXb3JrKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisgICAgdm9pZCBzZW5kT3V0cHV0QnVmZmVycygpOworCisgICAgUXVldWVTeW5jIG1TeW5jOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgY29tcG9uZW50IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY29tcG9uZW50IG5hbWUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+IG1DQ29kZWNDYWxsYmFjazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1JbnB1dEFsbG9jYXRvcjsKKyAgICBRdWV1ZVN5bmMgbVF1ZXVlU3luYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1QYXJhbXNUb0JlU2V0OworCisgICAgc3RydWN0IElucHV0IHsKKyAgICAgICAgSW5wdXQoKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiBidWZmZXJzOworICAgICAgICBzaXplX3QgbnVtU2xvdHM7CisgICAgICAgIEZsZXhCdWZmZXJzSW1wbCBleHRyYUJ1ZmZlcnM7CisgICAgICAgIHNpemVfdCBudW1FeHRyYVNsb3RzOworICAgICAgICB1aW50MzJfdCBpbnB1dERlbGF5OworICAgICAgICB1aW50MzJfdCBwaXBlbGluZURlbGF5OworICAgIH07CisgICAgTXV0ZXhlZDxJbnB1dD4gbUlucHV0OworICAgIHN0cnVjdCBPdXRwdXQgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gYnVmZmVyczsKKyAgICAgICAgc2l6ZV90IG51bVNsb3RzOworICAgICAgICB1aW50MzJfdCBvdXRwdXREZWxheTsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0PiBtT3V0cHV0OworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj4gbUZsdXNoZWRDb25maWdzOworCisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZpcnN0VmFsaWRGcmFtZUluZGV4OworCisgICAgc3A8TWVtb3J5RGVhbGVyPiBtYWtlTWVtb3J5RGVhbGVyKHNpemVfdCBoZWFwU2l6ZSk7CisKKyAgICBzdHJ1Y3QgT3V0cHV0U3VyZmFjZSB7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIGludCBtYXhEZXF1ZXVlQnVmZmVyczsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29scyB7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gaW5wdXRQb29sOworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIH07CisgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPiBtQmxvY2tQb29sczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworCisgICAgTWV0YU1vZGUgbU1ldGFNb2RlOworCisgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+IG1QaXBlbGluZVdhdGNoZXI7CisKKyAgICBjbGFzcyBSZW9yZGVyU3Rhc2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgpIDogYnVmZmVyKG51bGxwdHIpLCB0aW1lc3RhbXAoMCksIGZsYWdzKDApLCBvcmRpbmFsKHswLCAwLCAwfSkge30KKyAgICAgICAgICAgIGlubGluZSBFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYiwKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8pCisgICAgICAgICAgICAgICAgOiBidWZmZXIoYiksIHRpbWVzdGFtcCh0KSwgZmxhZ3MoZiksIG9yZGluYWwobykge30KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgICAgICB9OworCisgICAgICAgIFJlb3JkZXJTdGFzaCgpOworCisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgdm9pZCBmbHVzaCgpOworICAgICAgICB2b2lkIHNldERlcHRoKHVpbnQzMl90IGRlcHRoKTsKKyAgICAgICAgdm9pZCBzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KTsKKyAgICAgICAgYm9vbCBwb3AoRW50cnkgKmVudHJ5KTsKKyAgICAgICAgdm9pZCBlbXBsYWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpOworICAgICAgICB2b2lkIGRlZmVyKGNvbnN0IEVudHJ5ICZlbnRyeSk7CisgICAgICAgIGJvb2wgaGFzUGVuZGluZygpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBkZXB0aCgpIGNvbnN0IHsgcmV0dXJuIG1EZXB0aDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUGVuZGluZzsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtU3Rhc2g7CisgICAgICAgIHVpbnQzMl90IG1EZXB0aDsKKyAgICAgICAgQzJDb25maWc6Om9yZGluYWxfa2V5X3QgbUtleTsKKworICAgICAgICBib29sIGxlc3MoY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKTsKKyAgICB9OworICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPiBtUmVvcmRlclN0YXNoOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtSW5wdXRNZXRFb3M7CisgICAgc3RkOjpvbmNlX2ZsYWcgbVJlbmRlcldhcm5pbmdGbGFnOworCisgICAgaW5saW5lIGJvb2wgaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHsKKyAgICAgICAgcmV0dXJuIG1DcnlwdG8gIT0gbnVsbHB0ciB8fCBtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cjsKKyAgICB9Cit9OworCisvLyBDb252ZXJzaW9uIG9mIGEgYzJfc3RhdHVzX3QgdmFsdWUgdG8gYSBzdGF0dXNfdCB2YWx1ZSBtYXkgZGVwZW5kIG9uIHRoZQorLy8gb3BlcmF0aW9uIHRoYXQgcmV0dXJucyB0aGUgYzJfc3RhdHVzX3QgdmFsdWUuCitlbnVtIGMyX29wZXJhdGlvbl90IHsKKyAgICBDMl9PUEVSQVRJT05fTk9ORSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Nvbm5lY3RUb09teElucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2NyZWF0ZUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rlc3Ryb3lCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2RyYWluLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZmx1c2gsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9xdWV1ZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3JlbGVhc2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZXNldCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3NldE91dHB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0b3AsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NvcHlCdWZmZXIsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUNvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnRlcmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9jb25maWcsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkUGFyYW1zLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRWYWx1ZXMsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZV9jb25uZWN0VG9Db21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0lucHV0U3VyZmFjZUNvbm5lY3Rpb25fZGlzY29ubmVjdCwKK307CisKK3N0YXR1c190IHRvU3RhdHVzVChjMl9zdGF0dXNfdCBjMnMsIGMyX29wZXJhdGlvbl90IGMyb3AgPSBDMl9PUEVSQVRJT05fTk9ORSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjNzAyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApAQCAtMCwwICsxLDEwNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQnVmZmVycyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0J1ZmZlcnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0LAorICAgICAgICBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJmxvY2FsQnVmZmVyUG9vbCkgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwgIWZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBBTE9HRCgiZm9ybWF0IGxhY2tzIHdpZHRoIG9yIGhlaWdodCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImZldGNoIGdyYXBoaWMgYmxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYmxvY2ssCisgICAgICAgICAgICBbbG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCdWZmZXJQb29sLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgfSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDQ29kZWNCdWZmZXJzCisKK3ZvaWQgQ0NvZGVjQnVmZmVyczo6c2V0Rm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQ0hFQ0soZm9ybWF0ICE9IG51bGxwdHIpOworICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Cit9CisKK3NwPEFNZXNzYWdlPiBDQ29kZWNCdWZmZXJzOjpkdXBGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Gb3JtYXQgIT0gbnVsbHB0ciA/IG1Gb3JtYXQtPmR1cCgpIDogbnVsbHB0cjsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJzOjpoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhQ2FuZGlkYXRlID0gYnVmZmVyLT5nZXRJbWFnZURhdGEoKTsKKyAgICBpZiAoaW1hZ2VEYXRhQ2FuZGlkYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgaWYgKCFtRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkKKyAgICAgICAgICAgIHx8IGltYWdlRGF0YUNhbmRpZGF0ZS0+c2l6ZSgpICE9IGltYWdlRGF0YS0+c2l6ZSgpCisgICAgICAgICAgICB8fCBtZW1jbXAoaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCksIGltYWdlRGF0YS0+ZGF0YSgpLCBpbWFnZURhdGEtPnNpemUoKSkgIT0gMCkgeworICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBpbWFnZS1kYXRhIiwgbU5hbWUpOworICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gZHVwRm9ybWF0KCk7CisgICAgICAgIG5ld0Zvcm1hdC0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhQ2FuZGlkYXRlKTsKKyAgICAgICAgTWVkaWFJbWFnZTIgKmltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCk7CisgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAwICYmIGltZy0+bVR5cGUgIT0gaW1nLT5NRURJQV9JTUFHRV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHN0cmlkZSA9ICVkIiwgbU5hbWUsIHN0cmlkZSk7CisgICAgICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMSAmJiBzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2c3RyaWRlID0gKGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgLSBpbWctPm1QbGFuZVswXS5tT2Zmc2V0KSAvIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHZzdHJpZGUgPSAlZCIsIG1OYW1lLCB2c3RyaWRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRGb3JtYXQobmV3Rm9ybWF0KTsKKyAgICAgICAgYnVmZmVyLT5zZXRGb3JtYXQobmV3Rm9ybWF0KTsKKyAgICB9Cit9CisKKy8vIElucHV0QnVmZmVycworCitzcDxDb2RlYzJCdWZmZXI+IElucHV0QnVmZmVyczo6Y2xvbmVBbmRSZWxlYXNlQnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNvcHkgPSBjcmVhdGVOZXdCdWZmZXIoKTsKKyAgICBpZiAoY29weSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyYnVmZmVyOworICAgIGlmICghcmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMmJ1ZmZlciwgdHJ1ZSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmICghY29weS0+Y2FuQ29weShjMmJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmICghY29weS0+Y29weShjMmJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb3B5OworfQorCisvLyBPdXRwdXRCdWZmZXJzCisKK3ZvaWQgT3V0cHV0QnVmZmVyczo6aW5pdFNraXBDdXRCdWZmZXIoCisgICAgICAgIGludDMyX3QgZGVsYXksIGludDMyX3QgcGFkZGluZywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIENIRUNLKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpOworICAgIG1EZWxheSA9IGRlbGF5OworICAgIG1QYWRkaW5nID0gcGFkZGluZzsKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJzOjp1cGRhdGVTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICBpZiAobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgZGVsYXkgPSBtRGVsYXk7CisgICAgaW50MzJfdCBwYWRkaW5nID0gbVBhZGRpbmc7CisgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgZGVsYXkgPSAoKGludDY0X3QpZGVsYXkgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICBwYWRkaW5nID0gKChpbnQ2NF90KXBhZGRpbmcgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgIH0KKyAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnM6OnN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVNraXBDdXRCdWZmZXItPnN1Ym1pdChidWZmZXIpOworICAgIH0KK30KKwordm9pZCBPdXRwdXRCdWZmZXJzOjp0cmFuc2ZlclNraXBDdXRCdWZmZXIoY29uc3Qgc3A8U2tpcEN1dEJ1ZmZlcj4gJnNjYikgeworICAgIG1Ta2lwQ3V0QnVmZmVyID0gc2NiOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnM6OnNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgcHJldlNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBpZiAocHJldlNpemUgIT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIFJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJXp1IGJ5dGVzIiwgbU5hbWUsIHByZXZTaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKHNraXAsIGN1dCwgY2hhbm5lbENvdW50KTsKK30KKworLy8gTG9jYWxCdWZmZXJQb29sCisKK3N0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4obmV3IExvY2FsQnVmZmVyUG9vbChwb29sQ2FwYWNpdHkpKTsKK30KKworc3A8QUJ1ZmZlcj4gTG9jYWxCdWZmZXJQb29sOjpuZXdCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgbVBvb2wuYmVnaW4oKSwgbVBvb2wuZW5kKCksCisgICAgICAgICAgICBbY2FwYWNpdHldKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZ2ZWMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmVjLmNhcGFjaXR5KCkgPj0gY2FwYWNpdHk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoaXQgIT0gbVBvb2wuZW5kKCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUoKml0KSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgbVBvb2wuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKyAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgIHdoaWxlICghbVBvb2wuZW1wdHkoKSkgeworICAgICAgICAgICAgbVVzZWRTaXplIC09IG1Qb29sLmJhY2soKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgbVBvb2wucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICBBTE9HRCgibVVzZWRTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSwgbVBvb2xDYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1Vc2VkU2l6ZSwgY2FwYWNpdHksIG1Qb29sQ2FwYWNpdHkpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKGNhcGFjaXR5KTsKKyAgICBtVXNlZFNpemUgKz0gdmVjLmNhcGFjaXR5KCk7CisgICAgcmV0dXJuIG5ldyBWZWN0b3JCdWZmZXIoc3RkOjptb3ZlKHZlYyksIHNoYXJlZF9mcm9tX3RoaXMoKSk7Cit9CisKK0xvY2FsQnVmZmVyUG9vbDo6VmVjdG9yQnVmZmVyOjpWZWN0b3JCdWZmZXIoCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmcG9vbCkKKyAgICA6IEFCdWZmZXIodmVjLmRhdGEoKSwgdmVjLmNhcGFjaXR5KCkpLAorICAgICAgbVZlYyhzdGQ6Om1vdmUodmVjKSksCisgICAgICBtUG9vbChwb29sKSB7Cit9CisKK0xvY2FsQnVmZmVyUG9vbDo6VmVjdG9yQnVmZmVyOjp+VmVjdG9yQnVmZmVyKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IHBvb2wgPSBtUG9vbC5sb2NrKCk7CisgICAgaWYgKHBvb2wpIHsKKyAgICAgICAgLy8gSWYgcG9vbCBpcyBhbGl2ZSwgcmV0dXJuIHRoZSB2ZWN0b3IgYmFjayB0byB0aGUgcG9vbCBzbyB0aGF0CisgICAgICAgIC8vIGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgICAgcG9vbC0+cmV0dXJuVmVjdG9yKHN0ZDo6bW92ZShtVmVjKSk7CisgICAgfQorfQorCit2b2lkIExvY2FsQnVmZmVyUG9vbDo6cmV0dXJuVmVjdG9yKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBtUG9vbC5wdXNoX2Zyb250KHN0ZDo6bW92ZSh2ZWMpKTsKK30KKworLy8gRmxleEJ1ZmZlcnNJbXBsCisKK3NpemVfdCBGbGV4QnVmZmVyc0ltcGw6OmFzc2lnblNsb3QoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYnVmZmVyLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpIH0pOworICAgIHJldHVybiBtQnVmZmVycy5zaXplKCkgLSAxOworfQorCitib29sIEZsZXhCdWZmZXJzSW1wbDo6cmVsZWFzZVNsb3QoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgfQorICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZsZXhCdWZmZXJzSW1wbDo6ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIWNvbXBCdWZmZXIgfHwgY29tcEJ1ZmZlciAhPSBjMmJ1ZmZlcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5yZXNldCgpOworICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dSIsIG1OYW1lLCBpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIiwgbU5hbWUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBGbGV4QnVmZmVyc0ltcGw6OmZsdXNoKCkgeworICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSk7CisgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKK30KKworc2l6ZV90IEZsZXhCdWZmZXJzSW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeS5jbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICB9KTsKK30KKworc2l6ZV90IEZsZXhCdWZmZXJzSW1wbDo6bnVtQ29tcG9uZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFlbnRyeS5jb21wQnVmZmVyLmV4cGlyZWQoKTsKKyAgICAgICAgICAgIH0pOworfQorCisvLyBCdWZmZXJzQXJyYXlJbXBsCisKK3ZvaWQgQnVmZmVyc0FycmF5SW1wbDo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgbUltcGxOYW1lID0gaW1wbC5tSW1wbE5hbWUgKyAiW05dIjsKKyAgICBtTmFtZSA9IG1JbXBsTmFtZS5jX3N0cigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1wbC5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IGltcGwubUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICBib29sIG93bmVkQnlDbGllbnQgPSAoY2xpZW50QnVmZmVyICE9IG51bGxwdHIpOworICAgICAgICBpZiAoIW93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IGFsbG9jYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgY2xpZW50QnVmZmVyLCBpbXBsLm1CdWZmZXJzW2ldLmNvbXBCdWZmZXIsIG93bmVkQnlDbGllbnQgfSk7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIGNvbnZlcnRlZCAlenUgYnVmZmVycyB0byBhcnJheSBtb2RlIG9mICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCksIG1pblNpemUpOworICAgIGZvciAoc2l6ZV90IGkgPSBpbXBsLm1CdWZmZXJzLnNpemUoKTsgaSA8IG1pblNpemU7ICsraSkgeworICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvY2F0ZSgpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICB9Cit9CisKK3N0YXR1c190IEJ1ZmZlcnNBcnJheUltcGw6OmdyYWJCdWZmZXIoCisgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gKmJ1ZmZlciwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJik+IG1hdGNoKSB7CisgICAgLy8gYWxsQnVmZmVyc0RvbnRNYXRjaCByZW1haW5zIHRydWUgaWYgYWxsIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSBidXQKKyAgICAvLyBtYXRjaCgpIHJldHVybnMgZmFsc2UgZm9yIGV2ZXJ5IGJ1ZmZlci4KKyAgICBib29sIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICBpZiAobWF0Y2gobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICpidWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5zZXRSYW5nZSgwLCAoKmJ1ZmZlciktPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbGxCdWZmZXJzRG9udE1hdGNoID8gTk9fTUVNT1JZIDogV09VTERfQkxPQ0s7Cit9CisKK2Jvb2wgQnVmZmVyc0FycmF5SW1wbDo6cmV0dXJuQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENsaWVudCByZXR1cm5lZCBhIGJ1ZmZlciBpdCBkb2VzIG5vdCBvd24gYWNjb3JkaW5nIHRvIG91ciByZWNvcmQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoIlslc10gJXM6IG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCAoaW5kZXg9JXp1KSIsIG1OYW1lLCBfX2Z1bmNfXywgaW5kZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICB9CisgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQnVmZmVyc0FycmF5SW1wbDo6ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIWNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBjb21wQnVmZmVyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29kZWMgcmVsZWFzZWQgYSBidWZmZXIgb3duZWQgYnkgY2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGluZGV4ICV6dSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dShhcnJheSBtb2RlKSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGFuIHVua25vd24gYnVmZmVyIChhcnJheSBtb2RlKSIsIG1OYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyc0FycmF5SW1wbDo6Z2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgIGFycmF5LT5wdXNoKGVudHJ5LmNsaWVudEJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlcnNBcnJheUltcGw6OmZsdXNoKCkgeworICAgIGZvciAoRW50cnkgJmVudHJ5IDogbUJ1ZmZlcnMpIHsKKyAgICAgICAgZW50cnkub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBCdWZmZXJzQXJyYXlJbXBsOjpyZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYykgeworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgIG1CdWZmZXJzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2MoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlcnNBcnJheUltcGw6Omdyb3coCisgICAgICAgIHNpemVfdCBuZXdTaXplLCBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2MpIHsKKyAgICBDSEVDS19MVChtQnVmZmVycy5zaXplKCksIG5ld1NpemUpOworICAgIHdoaWxlIChtQnVmZmVycy5zaXplKCkgPCBuZXdTaXplKSB7CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgIH0KK30KKworc2l6ZV90IEJ1ZmZlcnNBcnJheUltcGw6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtQnVmZmVycy5iZWdpbigpLCBtQnVmZmVycy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IEVudHJ5ICZlbnRyeSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5vd25lZEJ5Q2xpZW50OworICAgICAgICAgICAgfSk7Cit9CisKK3NpemVfdCBCdWZmZXJzQXJyYXlJbXBsOjphcnJheVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKTsKK30KKworLy8gSW5wdXRCdWZmZXJzQXJyYXkKKwordm9pZCBJbnB1dEJ1ZmZlcnNBcnJheTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+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+ZGF0YSgpLnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSOiB7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrID0gYzJidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA8IGtNYXhMaW5lYXJCdWZmZXJTaXplIC8gMikgeworICAgICAgICAgICAgICAgIHNpemUgPSBibG9jay5zaXplKCkgKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwgc2l6ZV0geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgQUxPR0QoIlslc10gcmVhbGxvY2F0aW5nIHdpdGggbGluZWFyIGJ1ZmZlciBvZiBzaXplICV1IiwgbU5hbWUsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQzogeworICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMuCisgICAgICAgICAgICBtQWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBsYnAgPSBMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZShrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG1JbXBsLmFycmF5U2l6ZSgpKV0geworICAgICAgICAgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsYnBdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBBTE9HRCgiWyVzXSByZWFsbG9jYXRpbmcgd2l0aCBncmFwaGljIGJ1ZmZlcjogZm9ybWF0ID0gJXMiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIG1Gb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpJTlZBTElEOiAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1M6ICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1M6ICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgdHlwZTogJWQiLCAoaW50KWMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUltcGwucmVhbGxvYyhtQWxsb2MpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6Z3JvdyhzaXplX3QgbmV3U2l6ZSkgeworICAgIG1JbXBsLmdyb3cobmV3U2l6ZSwgbUFsbG9jKTsKK30KKworLy8gRmxleE91dHB1dEJ1ZmZlcnMKKworc3RhdHVzX3QgRmxleE91dHB1dEJ1ZmZlcnM6OnJlZ2lzdGVyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgIGhhbmRsZUltYWdlRGF0YShuZXdCdWZmZXIpOworICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgQUxPR1YoIlslc10gcmVnaXN0ZXJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBGbGV4T3V0cHV0QnVmZmVyczo6cmVnaXN0ZXJDc2QoCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IExvY2FsTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgbUZvcm1hdCwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSkpOworICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAqY2xpZW50QnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBGbGV4T3V0cHV0QnVmZmVyczo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgdHJ1ZSk7Cit9CisKK3ZvaWQgRmxleE91dHB1dEJ1ZmZlcnM6OmZsdXNoKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KK30KKworc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IEZsZXhPdXRwdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgYXJyYXktPnRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihtU2tpcEN1dEJ1ZmZlcik7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jID0gZ2V0QWxsb2MoKTsKKyAgICBhcnJheS0+aW5pdGlhbGl6ZShtSW1wbCwgc2l6ZSwgYWxsb2MpOworICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworfQorCitzaXplX3QgRmxleE91dHB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworLy8gTGluZWFyT3V0cHV0QnVmZmVycworCit2b2lkIExpbmVhck91dHB1dEJ1ZmZlcnM6OmZsdXNoKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgIH0KKyAgICBGbGV4T3V0cHV0QnVmZmVyczo6Zmx1c2goZmx1c2hlZFdvcmspOworfQorCitzcDxDb2RlYzJCdWZmZXI+IExpbmVhck91dHB1dEJ1ZmZlcnM6OndyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICBBTE9HVigiWyVzXSBub24tbGluZWFyIGJ1ZmZlciAlZCIsIG1OYW1lLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAvLyBXZSBleHBlY3QgbGluZWFyIG91dHB1dCBidWZmZXJzIGZyb20gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYW5kIG9ubHkgb25lIGxpbmVhciBibG9jayBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgIHJldHVybiBjbGllbnRCdWZmZXI7Cit9CisKK3N0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBMaW5lYXJPdXRwdXRCdWZmZXJzOjpnZXRBbGxvYygpIHsKKyAgICByZXR1cm4gW2Zvcm1hdCA9IG1Gb3JtYXRdeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IG91dHB1dCBzaXplCisgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihrTGluZWFyQnVmZmVyU2l6ZSkpOworICAgIH07Cit9CisKKy8vIEdyYXBoaWNPdXRwdXRCdWZmZXJzCisKK3NwPENvZGVjMkJ1ZmZlcj4gR3JhcGhpY091dHB1dEJ1ZmZlcnM6OndyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworfQorCitzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gR3JhcGhpY091dHB1dEJ1ZmZlcnM6OmdldEFsbG9jKCkgeworICAgIHJldHVybiBbZm9ybWF0ID0gbUZvcm1hdF17CisgICAgICAgIHJldHVybiBuZXcgRHVtbXlDb250YWluZXJCdWZmZXIoZm9ybWF0KTsKKyAgICB9OworfQorCisvLyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycworCitSYXdHcmFwaGljT3V0cHV0QnVmZmVyczo6UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cywgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1PdXRwdXRTbG90cykpIHsgfQorCitzcDxDb2RlYzJCdWZmZXI+IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzOjp3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyYnVmZmVyID0gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiBjMmJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CisKK3N0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBSYXdHcmFwaGljT3V0cHV0QnVmZmVyczo6Z2V0QWxsb2MoKSB7CisgICAgcmV0dXJuIFtmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXXsKKyAgICAgICAgcmV0dXJuIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNmI4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJTX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUlNfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKy8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCitjb25zdGV4cHIgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gNDA5NiAqIDIzMDQgKiA0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlcnMgeworcHVibGljOgorICAgIENDb2RlY0J1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJCdWZmZXJzIikKKyAgICAgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgICAgICBtQ2hhbm5lbE5hbWUoc3RkOjpzdHJpbmcoY29tcG9uZW50TmFtZSkgKyAiOiIgKyBuYW1lKSwKKyAgICAgICAgICBtTmFtZShtQ2hhbm5lbE5hbWUuY19zdHIoKSkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGZvcm1hdCBmb3IgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIGN1cnJlbnQgZm9ybWF0LgorICAgICAqLworICAgIHNwPEFNZXNzYWdlPiBkdXBGb3JtYXQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVycyBhcmUgb3BlcmF0aW5nIHVuZGVyIGFycmF5IG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIHRoZSB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjQnVmZmVyJ3MgaWYgaW4gYXJyYXkgbW9kZTsgb3RoZXJ3aXNlLAorICAgICAqIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICopIGNvbnN0IHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGNsaWVudCBvd25zLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFeGFtaW5lIGltYWdlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIGZvcm1hdCBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IG5hbWUgb2YgY29tcG9uZW50IGZvciBkZWJ1Z2dpbmcKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE5hbWU7IC8vLzwgbmFtZSBvZiBjaGFubmVsIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNoYW5uZWwgbmFtZQorICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlY0J1ZmZlcnMpOworfTsKKworY2xhc3MgSW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W10iKQorICAgICAgICA6IENDb2RlY0J1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+SW5wdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGEgYmxvY2sgcG9vbCB0byBvYnRhaW4gaW5wdXQgbWVtb3J5IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeyBtUG9vbCA9IHBvb2w7IH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBNZWRpYUNvZGVjQnVmZmVyIGZvciBpbnB1dCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgaW5kZXguCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBubyBuZXcgYnVmZmVyIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIHByb2Nlc3MuIFJldHVybgorICAgICAqIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZSBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2YgaW5wdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlcXVlc3ROZXdCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCksIGFuZCBjcmVhdGUgYSBkZWVwCisgICAgICogY29weSBjbG9uZSBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiAgdGhlIGRlZXAgY29weSBjbG9uZSBvZiB0aGUgYnVmZmVyOyBudWxscHRyIGlmIGNsb25pbmcgaXMgbm90CisgICAgICogICAgICAgICAgcG9zc2libGUuCisgICAgICovCisgICAgc3A8Q29kZWMyQnVmZmVyPiBjbG9uZUFuZFJlbGVhc2VCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgPSAwOworCisgICAgLy8gUG9vbCB0byBvYnRhaW4gYmxvY2tzIGZvciBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRCdWZmZXJzKTsKK307CisKK2NsYXNzIE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVycyB7CitwdWJsaWM6CisgICAgT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dCIpCisgICAgICAgIDogQ0NvZGVjQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5PdXRwdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgb3V0cHV0IEMyQnVmZmVyIGZyb20gdGhlIGNvbXBvbmVudCBhbmQgb2J0YWluIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBpbmRleCBhbmQgTWVkaWFDb2RlY0J1ZmZlciBvYmplY3QuIFJldHVybnMgZmFsc2UgaWYgcmVnaXN0cmF0aW9uCisgICAgICogZmFpbHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBjb2RlYyBzcGVjaWZpYyBkYXRhIGFzIGEgYnVmZmVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICAgICAqIE1lZGlhQ29kZWMgYmVoYXZpb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKiAvKiBjc2QgKi8sCisgICAgICAgICAgICBzaXplX3QgKiAvKiBpbmRleCAqLywKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICogLyogY2xpZW50QnVmZmVyICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIG91dHB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVnaXN0ZXJCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRTa2lwQ3V0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgaW50MzJfdCBwYWRkaW5nLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuIE5vLW9wIGlmIGl0J3MgbmV2ZXIgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgLyoqCisgICAgICogU3VibWl0IGJ1ZmZlciB0byBTa2lwQ3V0QnVmZmVyIG9iamVjdCwgaWYgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBTa2lwQ3V0QnVmZmVyIG9iamVjdCB0byB0aGUgb3RoZXIgQnVmZmVycyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCB0cmFuc2ZlclNraXBDdXRCdWZmZXIoY29uc3Qgc3A8U2tpcEN1dEJ1ZmZlcj4gJnNjYik7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTa2lwQ3V0QnVmZmVyPiBtU2tpcEN1dEJ1ZmZlcjsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1EZWxheTsKKyAgICBpbnQzMl90IG1QYWRkaW5nOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0QnVmZmVycyk7Cit9OworCisvKioKKyAqIFNpbXBsZSBsb2NhbCBidWZmZXIgcG9vbCBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgKi8KK2NsYXNzIExvY2FsQnVmZmVyUG9vbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPExvY2FsQnVmZmVyUG9vbD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xDYXBhY2l0eSAgbWF4IHRvdGFsIHNpemUgb2YgYnVmZmVycyBtYW5hZ2VkIGJ5IHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGEgbmV3bHkgY3JlYXRlZCBwb29sIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gQ3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEFCdWZmZXIgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgfGNhcGFjaXR5fC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGNhcGFjaXR5ICByZXF1ZXN0ZWQgY2FwYWNpdHkKKyAgICAgKiBccmV0dXJuICBudWxscHRyIGlmIHRoZSBwb29sIGNhcGFjaXR5IGlzIHJlYWNoZWQKKyAgICAgKiAgICAgICAgICBhbiBBQnVmZmVyIG9iamVjdCBvdGhlcndpc2UuCisgICAgICovCisgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQUJ1ZmZlciBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgICAgICovCisgICAgY2xhc3MgVmVjdG9yQnVmZmVyIDogcHVibGljIDo6YW5kcm9pZDo6QUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgVmVjdG9yQnVmZmVyIGJ5IHRha2luZyB0aGUgb3duZXJzaGlwIG9mIHN1cHBsaWVkIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZlYyAgIGJhY2tpbmcgdmVjdG9yIG9mIHRoZSBidWZmZXIuIHRoaXMgb2JqZWN0IHRha2VzCisgICAgICAgICAqICAgICAgICAgICAgICBvd25lcnNoaXAgYXQgY29uc3RydWN0aW9uLgorICAgICAgICAgKiBccGFyYW0gcG9vbCAgYSBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0IHRvIHJldHVybiB0aGUgdmVjdG9yIGF0CisgICAgICAgICAqICAgICAgICAgICAgICBkZXN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFZlY3RvckJ1ZmZlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpOworCisgICAgICAgIH5WZWN0b3JCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1WZWM7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TG9jYWxCdWZmZXJQb29sPiBtUG9vbDsKKyAgICB9OworCisgICAgTXV0ZXggbU11dGV4OworICAgIHNpemVfdCBtUG9vbENhcGFjaXR5OworICAgIHNpemVfdCBtVXNlZFNpemU7CisgICAgc3RkOjpsaXN0PHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtUG9vbDsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBjb25zdHJ1Y3Rpbmcgbm9uLW1hbmFnZWQgTG9jYWxCdWZmZXJQb29sLgorICAgICAqLworICAgIGV4cGxpY2l0IExvY2FsQnVmZmVyUG9vbChzaXplX3QgcG9vbENhcGFjaXR5KQorICAgICAgICA6IG1Qb29sQ2FwYWNpdHkocG9vbENhcGFjaXR5KSwgbVVzZWRTaXplKDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGJhY2sgdGhlIG93bmVyc2hpcCBvZiB2ZWMgZnJvbSB0aGUgZGVzdHJ1Y3RlZCBWZWN0b3JCdWZmZXIgYW5kIHB1dAorICAgICAqIGl0IGluIGZyb250IG9mIHRoZSBwb29sLgorICAgICAqLworICAgIHZvaWQgcmV0dXJuVmVjdG9yKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvY2FsQnVmZmVyUG9vbCk7Cit9OworCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisvKioKKyAqIEZsZXhpYmxlIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgRmxleEJ1ZmZlcnNJbXBsIHsKK3B1YmxpYzoKKyAgICBGbGV4QnVmZmVyc0ltcGwoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBtSW1wbE5hbWUoc3RkOjpzdHJpbmcobmFtZSkgKyAiLkltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gZW1wdHkgc2xvdCBmb3IgYSBidWZmZXIgYW5kIHJldHVybiB0aGUgaW5kZXguIElmIHRoZXJlJ3Mgbm8KKyAgICAgKiBlbXB0eSBzbG90LCBqdXN0IGFkZCBvbmUgYXQgdGhlIGVuZCBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlcltpbl0gIGEgbmV3IGJ1ZmZlciB0byBhc3NpZ24gYSBzbG90LgorICAgICAqIFxyZXR1cm4gICAgICAgICAgICBpbmRleCBvZiB0aGUgYXNzaWduZWQgc2xvdC4KKyAgICAgKi8KKyAgICBzaXplX3QgYXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2xvdCBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXNseSBhc3NpZ25lZCBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlCisgICAgICogdW50aWwgdGhlIHJldHVybmVkIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBhc3NpZ25lZCBhIHNsb3QuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkIGZyb20gYSBzbG90CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZWxlYXNlU2xvdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSk7CisKKyAgICAvKioKKyAgICAgKiBFeHBpcmUgdGhlIEMyQnVmZmVyIG9iamVjdCBpbiB0aGUgc2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luXSAgQzJCdWZmZXIgb2JqZWN0IHdoaWNoIHRoZSBjb21wb25lbnQgcmVsZWFzZWQuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBmb3VuZCBpbiBvbmUgb2YgdGhlIHNsb3RzIGFuZAorICAgICAqICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgYWJhbmRvbmVkIGFsbCBrbm93biBidWZmZXJzLCBzbyByZWNsYWltIHRoZSBvd25lcnNoaXAuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjbGllbnQgYnV0IG5vdCByZWxlYXNlZAorICAgICAqIHlldC4KKyAgICAgKi8KKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjb21wb25lbnQgYnV0IG5vdAorICAgICAqIHJldHVybmVkIGJhY2sgeWV0LgorICAgICAqLworICAgIHNpemVfdCBudW1Db21wb25lbnRCdWZmZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJ1ZmZlcnNBcnJheUltcGw7CisKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKKy8qKgorICogU3RhdGljIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGZpeGVkLXNpemUgYXJyYXkuCisgKi8KK2NsYXNzIEJ1ZmZlcnNBcnJheUltcGwgeworcHVibGljOgorICAgIEJ1ZmZlcnNBcnJheUltcGwoKQorICAgICAgICA6IG1JbXBsTmFtZSgiQnVmZmVyc0FycmF5SW1wbCIpLAorICAgICAgICAgIG1OYW1lKG1JbXBsTmFtZS5jX3N0cigpKSB7IH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYnVmZmVyIGFycmF5IGZyb20gdGhlIG9yaWdpbmFsIHxpbXBsfC4gVGhlIGJ1ZmZlcnMga25vd24gYnkKKyAgICAgKiB0aGUgY2xpZW50IGlzIHByZXNlcnZlZCwgYW5kIHRoZSBlbXB0eSBzbG90cyBhcmUgcG9wdWxhdGVkIHNvIHRoYXQgdGhlCisgICAgICogYXJyYXkgc2l6ZSBpcyBhdCBsZWFzdCB8bWluU2l6ZXwuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW1wbFtpbl0gICAgICBGbGV4QnVmZmVyc0ltcGwgb2JqZWN0IHVzZWQgc28gZmFyLgorICAgICAqIFxwYXJhbSBtaW5TaXplW2luXSAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyIGFycmF5LgorICAgICAqIFxwYXJhbSBhbGxvY2F0ZVtpbl0gIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgY2xpZW50IGJ1ZmZlciBmb3IgYW4gZW1wdHkgc2xvdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSk7CisKKyAgICAvKioKKyAgICAgKiBHcmFiIGEgYnVmZmVyIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkgd2hpY2ggbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXhbb3V0XSAgICBpbmRleCBvZiB0aGUgc2xvdC4KKyAgICAgKiBccGFyYW0gYnVmZmVyW291dF0gICB0aGUgbWF0Y2hpbmcgYnVmZmVyLgorICAgICAqIFxwYXJhbSBtYXRjaFtpbl0gICAgIGEgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHRoZSBidWZmZXIgbWF0Y2hlcyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSBvciBub3QuCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwKKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLICBpZiBzbG90cyBhcmUgYmVpbmcgdXNlZCwKKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSAgICBpZiBubyBzbG90IG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBldmVuIHRob3VnaCBpdCdzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICovCisgICAgc3RhdHVzX3QgZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2ggPQorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJikgeyByZXR1cm4gdHJ1ZTsgfSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZSB1bnRpbCB0aGUgcmV0dXJuZWQKKyAgICAgKiBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgZ3JhYmJlZC4KKyAgICAgKiBccGFyYW0gICBjMmJ1ZmZlcltpbixvdXRdICBwb2ludGVyIHRvIEMyQnVmZmVyIHRvIGJlIHBvcHVsYXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bGwuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHJldHVybkJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSk7CisKKyAgICAvKioKKyAgICAgKiBFeHBpcmUgdGhlIEMyQnVmZmVyIG9iamVjdCBpbiB0aGUgc2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luXSAgQzJCdWZmZXIgb2JqZWN0IHdoaWNoIHRoZSBjb21wb25lbnQgcmVsZWFzZWQuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBmb3VuZCBpbiBvbmUgb2YgdGhlIHNsb3RzIGFuZAorICAgICAqICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHxhcnJheXwgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYXJyYXlbb3V0XSAgYW4gYXJyYXkgdG8gYmUgZmlsbGVkIHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqLworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFsbG9jYXRlIHRoZSBhcnJheSB3aXRoIHRoZSBnaXZlbiBhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jW2luXSB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgY2xpZW50IGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCByZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBHcm93IHRoZSBhcnJheSB0byB0aGUgbmV3IHNpemUuIEl0IGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IgdG8gc3VwcGx5CisgICAgICogc21hbGxlciBzaXplIGFzIHRoZSBuZXcgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuZXdTaXplW2luXSBuZXcgc2l6ZSBvZiB0aGUgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jW2luXSAgIHRoZSBhbGxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgY2xpZW50IGJ1ZmZlcnMgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IGVtcHR5IHNsb3RzLgorICAgICAqLworICAgIHZvaWQgZ3JvdyhzaXplX3QgbmV3U2l6ZSwgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY2xpZW50IGJ1dCBub3QgcmVsZWFzZWQKKyAgICAgKiB5ZXQuCisgICAgICovCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCisgICAgICovCisgICAgc2l6ZV90IGFycmF5U2l6ZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgICAgICBib29sIG93bmVkQnlDbGllbnQ7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCitjbGFzcyBJbnB1dEJ1ZmZlcnNBcnJheSA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVyc0FycmF5KGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbTl0iKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+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+IGdldEFsbG9jKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUlNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmZGMxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gYzIgZXF1aXZhbGVudHMgZm9yICVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX01BUFBFUlM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZvdW5kICV6dSBlcXMgZm9yICVzIiwgaXQtPnNlY29uZC5zaXplKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFNESyA8PT4gQ29kZWMgMi4wIHBhcmFtZXRlciBtYXBwaW5nLiBNdWx0aXBsZSBDb2RlYyAyLjAgcGFyYW1ldGVycyBtYXkgbWFwIHRvIGEKKyAgICAgKiBzaW5nbGUgU0RLIGtleSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNoYWxsIGJlIG9yZGVyZWQgZnJvbSBsZWFzdCBhdXRob3JpdGF0aXZlIHRvIG1vc3QKKyAgICAgKiBhdXRob3JpdGF0aXZlLiBXaGVuIGNvbnN0cnVjdGluZyBTREsgZm9ybWF0cywgdGhlIGxhc3QgbWFwcGVkIENvZGVjIDIuMCBwYXJhbWV0ZXIgdGhhdAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IHdpbGwgZGV0ZXJtaW5lIHRoZSBleHBvc2VkIHZhbHVlLiAoVE9ETzogcGVyaGFwcyByZXN0cmljdCB0aGlzCisgICAgICogYnkgZG9tYWluLikKKyAgICAgKi8KKyAgICB2b2lkIGFkZChjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGNtLm1lZGlhS2V5KCkpOworICAgICAgICBBTE9HVigiJWMlYyVjJWMgJWMlYyVjICUwNHggJTlzICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfSU5QVVQpID8gJ0knIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfT1VUUFVUKSA/ICdPJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPREVEKSA/ICdDJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JBVykgPyAnUicgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT05GSUcpID8gJ2MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUEFSQU0pID8gJ3AnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkVBRCkgPyAncicgOiAnICcpLAorICAgICAgICAgICAgICBjbS5kb21haW4oKSwKKyAgICAgICAgICAgICAgaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkgPyAiYWRkaW5nIiA6ICJleHRlbmRpbmciLAorICAgICAgICAgICAgICBjbS5tZWRpYUtleSgpLmNfc3RyKCksIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IGVxcyA9IHsgY20gfTsKKyAgICAgICAgICAgIG1Db25maWdNYXBwZXJzLmVtcGxhY2UoY20ubWVkaWFLZXkoKSwgZXFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQucHVzaF9iYWNrKGNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGhzIGZvciBhIHNwZWNpZmljIGRvbWFpbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbnkgbWF4aW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgZG9tYWlucworICAgICAqICAgICAgICAgICAgaW4gdGhlIG1hc2suCisgICAgICogXHBhcmFtIGFsbCBtaW5pbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYWxsIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAgICAqICAgICAgICAgICAgbWFzay4gVGhpcyBpcyByZXN0cmljdGVkIHRvIHRoZSBiaXRzIG9mIHRoZSBtYXhpbXVtIG1hc2suCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAorICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImZpbHRlcmluZyAlcyAleCAleCAleCAleCIsIGNtLnBhdGgoKS5jX3N0cigpLCBjbS5kb21haW4oKSwgYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtLmRvbWFpbigpICYgYW55KSwgKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSk7CisgICAgICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGFueSkgJiYgKChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkgPT0gKGFueSAmIGFsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soY20ucGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNESyA8PT4gQ29kZWMgMi4wIG1hcHBpbmdzLgorICAgICAqCisgICAgICogVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJldHRlciBtZXRob2RzIGFzIHRoaXMgZXhwb3NlcyB0aGUgaW5uZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gZ2V0S2V5cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWdNYXBwZXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IG1Db25maWdNYXBwZXJzOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBTdGFuZGFyZFBhcmFtczo6Tk9fTUFQUEVSUzsKKworCitDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCisgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorCit2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgeworICAgIHR5cGVkZWYgRG9tYWluIEQ7CisgICAgbVN0YW5kYXJkUGFyYW1zID0gc3RkOjptYWtlX3NoYXJlZDxTdGFuZGFyZFBhcmFtcz4oKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBhZGQgPQorICAgICAgICBbcGFyYW1zID0gbVN0YW5kYXJkUGFyYW1zXShjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgICAgICBwYXJhbXMtPmFkZChjbSk7CisgICAgfTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBkZXByZWNhdGVkID0gYWRkOworCisgICAgLy8gYWxsb3cgaW50MzIgb3IgZmxvYXQgU0RLIHZhbHVlcyBhbmQgcmVwcmVzZW50IHRoZW0gYXMgZmxvYXQKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBtYWtlRmxvYXQgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KWkzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZwVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbmVnYXRlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUsICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUICYgRDo6UkVBRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSwgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpQQVJBTSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4oKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWSBhbmQgbmV3IG1vZGVzCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgImNvZGVkLmJpdHJhdGUtbW9kZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRlJBTUVfUkFURSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgImNvZGVkLm1heC1mcmFtZS1zaXplIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisKKyAgICAvLyBSb3RhdGlvbgorICAgIC8vIE5vdGU6IFNESyByb3RhdGlvbiBpcyBjbG9jay13aXNlLCB3aGlsZSBDMiByb3RhdGlvbiBpcyBjb3VudGVyLWNsb2NrLXdpc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKworICAgIC8vIGFuZHJvaWQgJ3ZpZGVvLXNjYWxpbmcnCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fdmlkZW8tc2NhbGluZyIsIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkRFQ09ERVIgJiBEOjpSQVcpKTsKKworICAgIC8vIENvbG9yIEFzcGVjdHMKKyAgICAvLworICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IGZvciBkZWNvZGVycworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKworICAgIC8vIHJlYWQgYmFjayBmaW5hbCBmb3IgZGVjb2RlciBvdXRwdXQgKGFsc28sIGNvbmZpZ3VyZSBmaW5hbCBhc3BlY3RzIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGJlCisgICAgLy8gb3ZlcndyaXR0ZW4gYmFzZWQgb24gY29kZWQvZGVmYXVsdCB2YWx1ZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIGNvbG9yIGFzcGVjdHMsIGJ1dCBpcyB1c2VkCisgICAgLy8gYXMgZmluYWwgdmFsdWVzIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGFzcGVjdHMgYXQgYWxsKQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBjb25maWd1cmUgc291cmNlIGFzcGVjdHMgZm9yIGVuY29kZXJzIGFuZCByZWFkIHRoZW0gYmFjayBvbiB0aGUgY29kZWQoISkgcG9ydC4KKyAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSBtdXhpbmcgdGhlIGRlc2lyZWQgYXNwZWN0cyBpbnRvIHRoZSBjb250YWluZXIuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworCisgICAgLy8gcmVhZCBiYWNrIGNvZGVkIGFzcGVjdHMgZm9yIGVuY29kZXJzIChvbiB0aGUgcmF3IHBvcnQpLCBidXQgYWxzbyBjb25maWd1cmUKKyAgICAvLyBkZXNpcmVkIGFzcGVjdHMgaGVyZS4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIERhdGFzcGFjZQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgLy8gSERSCisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5tYXgtbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWluLWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtY2xsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWNsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BSRVBFTkRfSEVBREVSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90IHZhbHVlOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSAqKSZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX05PTkU6ICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DOiAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX09OX0NIQU5HRTogICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcuYWRkLWNzZC10by1zeW5jLWZyYW1lcyIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICAvLyBjb252ZXJ0IHRvIHRpbWVzdGFtcCBiYXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCwgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICAgICAgZmxvYXQgZnBWYWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoMTAwMDAwMCkgKiBpMzJWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodi5nZXQoJmZwVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoYzJfbWluKDEwMDAwMDAgKiBmcFZhbHVlICsgMC41LCAoZG91YmxlKUlOVDY0X01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDY0X3QgaTY0OworICAgICAgICAgICAgaWYgKHYuZ2V0KCZpNjQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGk2NCkgLyAxMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gcHJvcGVyIGNvZGluZy5nb3AgKGFkZCBzdXBwb3J0IGZvciBjYWxjdWxhdGluZyBnb3ApCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoImktZnJhbWUtcGVyaW9kIiwgImNvZGluZy5nb3AiLCAiaW50cmEtcGVyaW9kIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9ELCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNILCAicGVyaW9kIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLnJlcXVlc3Qtc3luYyIsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNICYgRDo6RU5DT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSkgLT4gQzJWYWx1ZSB7IHJldHVybiB1aW50MzJfdCgxKTsgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfT1BFUkFUSU5HX1JBVEUsICAgQzJfUEFSQU1LRVlfT1BFUkFUSU5HX1JBVEUsICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSB8IEQ6OkNPTkZJRykgLy8gd3JpdGUtb25seQorICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICAvLyBDMiBwcmlvcml0aWVzIGFyZSBpbnZlcnRlZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgIEMyX1BBUkFNS0VZX1BSSU9SSVRZLCAgICAgICAgICAgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICAiY3RybC5vcGVyYXRpbmctcmF0ZSIsICAgICAidmFsdWUiKQorICAgICAgICAgICAgICAgLndpdGhNYXBwZXIobWFrZUZsb2F0KSk7CisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX1BSSU9SSVRZLCAgICAgICAgICJjdHJsLnByaW9yaXR5IiwgICAgICAgICAgICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1dJRFRILCAgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hFSUdIVCwgICAgICAgIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtbGVmdCIsICAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImxlZnQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC10b3AiLCAgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAidG9wIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3Atd2lkdGgiLCAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtaGVpZ2h0IiwgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9XSURUSCwgICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9IRUlHSFQsICAgIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUsICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoImNzZC0wIiwgICAgICAgICAgIEMyX1BBUkFNS0VZX0lOSVRfREFUQSwgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UEFSQU0gJiBEOjpJTlBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSERSMTBfUExVU19JTkZPLCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICIiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIC8vIFBpeGVsIEZvcm1hdCAodXNlIGxvY2FsIGtleSBmb3IgYWN0dWFsIHBpeGVsIGZvcm1hdCBhcyB3ZSBkb24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgLy8gU0RLIGxheW91dHMgZm9yIGZsZXhpYmxlIGZvcm1hdCBhbmQgd2UgbmVlZCB0aGUgYWN0dWFsIFNESyBjb2xvciBmb3JtYXQgaW4gdGhlIG1lZGlhIGZvcm1hdCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFN1cmZhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5ULCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBmb3JtYXRzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUsICAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOyAvLyByZWFkIGJhY2sgdG8gYm90aCBwb3J0IGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURSwgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BDTV9FTkNPRElORywgIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORywgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB0bzsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHZhbHVlOworICAgICAgICAgICAgaW50MzJfdCB0bzsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUodmFsdWUpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lTX0FEVFMsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihtQ29kaW5nTWVkaWFUeXBlKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BST0ZJTEUsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJwcm9maWxlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMiA9IFBST0ZJTEVfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwUHJvZmlsZShzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoYzIsICZzZGspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xFVkVMLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMLCAibGV2ZWwiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMiA9IExFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcExldmVsKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBMRVZFTF9VTlVTRUQ7CisgICAgICAgIH0sIFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMjsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgbWFwcGVyLT5tYXBMZXZlbChjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgtMC4yNSAqIGMyX21pbih2YWx1ZSwgMTI3KSk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gMC0xICglKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9DVVQsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0JPT1NULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdChjMl9taW4odmFsdWUsIDEyNykgLyAxMjcuKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBjb21wcmVzc2lvbiB0eXBlIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0hFQVZZLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAxID8gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA6IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQ7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBlZmZlY3QgdHlwZSAodGhlc2UgbWFwIHRvIFNESyB2YWx1ZXMpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfRUZGRUNUX1RZUEUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QpOworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX1NCUl9NT0RFLCBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfT0ZGOworICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX1NJTkdMRV9SQVRFOworICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0RVQUxfUkFURTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTyArIDE7IC8vIGludmFsaWQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUVVBTElUWSwgQzJfUEFSQU1LRVlfUVVBTElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb21wbGV4aXR5IiwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfQ09MVU1OUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJjb2x1bW5zIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9HUklEX1JPV1MsIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VULCAicm93cyIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfVElMRV9XSURUSCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX0hFSUdIVCwgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJ0aWxlLmhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MQVRFTkNZLCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENILCBDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsICJ2YWx1ZSIpKTsKKworICAgIC8qIHN0aWxsIHRvIGRvCisgICAgY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKKworICAgICAgIG5vdCB5ZXQgdXNlZCBieSBNZWRpYUNvZGVjLCBidXQgZGVmaW5lZCBhcyBNZWRpYUZvcm1hdAorICAgIEtFWV9BVURJT19TRVNTSU9OX0lEIC8vIHdlIHVzZSAiYXVkaW8taHctc3luYyIKKyAgICBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEgKKyAgICAqLworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW4oQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUik7CisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kKEMyQ29tcG9uZW50OjpLSU5EX09USEVSKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyAmZG9tYWluLCAma2luZCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiUXVlcnkgZG9tYWluICYga2luZCBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUga2luZCBmcm9tIGNvbXBvbmVudCBuYW1lCisgICAgICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVEVNUDogZGV0ZXJtaW5lIGRvbWFpbiBmcm9tIG1lZGlhIHR5cGUgKHBvcnQgKHByZWZlcnJlZCkgb3Igc3RyZWFtICMwKQorICAgICAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKKyAgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbURvbWFpbiA9IChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyA/IERvbWFpbjo6SVNfVklERU8gOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgPyBEb21haW46OklTX0lNQUdFIDoKKyAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPID8gRG9tYWluOjpJU19BVURJTyA6IERvbWFpbjo6T1RIRVJfRE9NQUlOKQorICAgICAgICAgICAgfCAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSID8gRG9tYWluOjpJU19ERUNPREVSIDoKKyAgICAgICAgICAgICAgIGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA/IERvbWFpbjo6SVNfRU5DT0RFUiA6IERvbWFpbjo6T1RIRVJfS0lORCk7CisKKyAgICBtSW5wdXREb21haW4gPSBEb21haW4oKChtRG9tYWluICYgSVNfREVDT0RFUikgPyBJU19DT0RFRCA6IElTX1JBVykgfCBJU19JTlBVVCk7CisgICAgbU91dHB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19FTkNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX09VVFBVVCk7CisKKyAgICBBTE9HVigiZG9tYWluIGlzICUjeCAoJXUgJXUpIiwgbURvbWFpbiwgZG9tYWluLnZhbHVlLCBraW5kLnZhbHVlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBwYXJhbUluZGljZXM7CisgICAgc3dpdGNoIChraW5kLnZhbHVlKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gUXVlcnlNZWRpYVR5cGUodHJ1ZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZShmYWxzZSAvKiBpbnB1dCAqLywgY29tcG9uZW50KS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtQ29kaW5nTWVkaWFUeXBlID0gIiI7CisgICAgfQorCisgICAgYzJlcnIgPSBjb21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtUGFyYW1EZXNjcyk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgbVBhcmFtRGVzY3Muc2l6ZSgpLCBhc1N0cmluZyhjMmVycikpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogbVBhcmFtRGVzY3MpIHsKKyAgICAgICAgbVN1cHBvcnRlZEluZGljZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpKTsKKyAgICB9CisKKyAgICBtUmVmbGVjdG9yID0gY2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIGlmIChtUmVmbGVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGFyYW0gcmVmbGVjdG9yIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIGVudW1lcmF0ZSBhbGwgZmllbGRzCisgICAgbVBhcmFtVXBkYXRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPigpOworICAgIG1QYXJhbVVwZGF0ZXItPmNsZWFyKCk7CisgICAgbVBhcmFtVXBkYXRlci0+c3VwcG9ydFdob2xlUGFyYW0oCisgICAgICAgICAgICBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpDT1JFX0lOREVYKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbVBhcmFtRGVzY3MpOworCisgICAgLy8gVEVNUDogYWRkIHNvbWUgc3RhbmRhcmQgZmllbGRzIGV2ZW4gaWYgbm90IHJlZmxlY3RlZAorICAgIGlmIChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpIHsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9JTklUX0RBVEEpOworICAgIH0KKyAgICBpZiAoZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UgfHwgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pIHsKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgIT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUNyb3BSZWN0SW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9DUk9QX1JFQ1QpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dCgwdSwgMXUsIDF1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUElYRUxfQVNQRUNUX1JBVElPKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQoMHUsIDApLCBDMl9QQVJBTUtFWV9ST1RBVElPTik7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfREFUQV9TUEFDRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpOworCisgICAgLy8gc3Vic2NyaWJlIHRvIGFsbCBzdXBwb3J0ZWQgc3RhbmRhcmQgKGV4cG9zZWQpIHBhcmFtcworICAgIC8vIFRPRE86IGxpbWl0IHRoaXMgdG8gcGFyYW1zIHRoYXQgYXJlIGFjdHVhbGx5IGluIHRoZSBkb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZm9ybWF0S2V5cyA9IG1TdGFuZGFyZFBhcmFtcy0+Z2V0UGF0aHNGb3JEb21haW4oRG9tYWluKDEgPDwgMzApKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGb3JLZXlzKGZvcm1hdEtleXMsICZpbmRpY2VzKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisKKyAgICAvLyBhbHNvIHN1YnNjcmliZSB0byBzb21lIG5vbi1TREsgc3RhbmRhcmQgcGFyYW1ldGVycworICAgIC8vIGZvciBudW1iZXIgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlcnMKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBmb3Igb3V0cHV0IGJ1ZmZlciBhcnJheSBhbGxvY2F0aW9uCisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAvLyBpbml0IGRhdGEgKENTRCkKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSk7CisgICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgd2hlbiBjb21wb25lbnRzIG5vIGxvbmdlciBjcmFzaCBvbiB0aGlzIGNvbmZpZworICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpICE9IG1TdWJzY3JpYmVkSW5kaWNlc1NpemUgJiYgZmFsc2UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluZGljZXM7CisgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBtU3Vic2NyaWJlZEluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGl4KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBzdWJzY3JpYmVUdW5pbmcgPQorICAgICAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOjpBbGxvY1VuaXF1ZShpbmRpY2VzKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHJlc3VsdHM7CisgICAgICAgIGMyX3N0YXR1c190IGMyRXJyID0gY29tcG9uZW50LT5jb25maWcoeyBzdWJzY3JpYmVUdW5pbmcuZ2V0KCkgfSwgYmxvY2tpbmcsICZyZXN1bHRzKTsKKyAgICAgICAgaWYgKGMyRXJyICE9IEMyX09LICYmIGMyRXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBzdWJzY3JpYmUgdG8gcGFyYW1ldGVycyA9PiAlcyIsIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTdWJzY3JpYmVkIHRvICV6dSBwYXJhbXMiLCBtU3Vic2NyaWJlZEluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSA9IG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeUNvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIC8vIHF1ZXJ5IGFsbCBzdWJzY3JpYmVkIHBhcmFtZXRlcnMKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcyhtU3Vic2NyaWJlZEluZGljZXMuYmVnaW4oKSwgbVN1YnNjcmliZWRJbmRpY2VzLmVuZCgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9NQVlfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0koInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHZhbHVlcyAoJXMpIiwgcXVlcmllZC5zaXplKCksIGFzU3RyaW5nKGMyRXJyKSk7CisgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgfQorCisgICAgdXBkYXRlQ29uZmlndXJhdGlvbihxdWVyaWVkLCBBTEwpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbikgeworICAgIEFMT0dWKCJ1cGRhdGluZyBjb25maWd1cmF0aW9uIHdpdGggJXp1IHBhcmFtcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCkpOworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChwICYmICpwKSB7CisgICAgICAgICAgICBhdXRvIGluc2VydGlvbiA9IG1DdXJyZW50Q29uZmlnLmVtcGxhY2UocC0+aW5kZXgoKSwgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoaW5zZXJ0aW9uLnNlY29uZCB8fCAqaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgIT0gKnApIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocC0+aW5kZXgoKSkgfHwgbUxvY2FsUGFyYW1zLmNvdW50KHAtPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJhY2sgY2hhbmdlcyBpbiBzdXBwb3J0ZWQgKHJlZmxlY3RlZCBvciBsb2NhbCkgaW5kaWNlcworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYW4gdW5saXN0ZWQgY29uZmlnIHdhcyAlczogJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb24uc2Vjb25kID8gImFkZGVkIiA6ICJ1cGRhdGVkIiwgcC0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zZXJ0aW9uLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigidXBkYXRlZCBjb25maWd1cmF0aW9uIGhhcyAlenUgcGFyYW1zICglcykiLCBtQ3VycmVudENvbmZpZy5zaXplKCksCisgICAgICAgICAgICBjaGFuZ2VkID8gIkNIQU5HRUQiIDogIm5vIGNoYW5nZSIpOworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiB1cGRhdGVGb3JtYXRzKGRvbWFpbik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDQ29kZWNDb25maWc6OnVwZGF0ZUZvcm1hdHMoRG9tYWluIGRvbWFpbikgeworICAgIC8vIGdldCBhZGRyZXNzZXMgb2YgcGFyYW1zIGluIHRoZSBjdXJyZW50IGNvbmZpZworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBtQ3VycmVudENvbmZpZykgeworICAgICAgICBwYXJhbVBvaW50ZXJzLnB1c2hfYmFjayhpdC5zZWNvbmQuZ2V0KCkpOworICAgIH0KKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCByZWZsZWN0ZWQgPSBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbXMocGFyYW1Qb2ludGVycyk7CisgICAgQUxPR0QoImMyIGNvbmZpZyBpcyAlcyIsIHJlZmxlY3RlZC5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRvbWFpbiAmIG1JbnB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbUlucHV0Rm9ybWF0OworICAgICAgICBtSW5wdXRGb3JtYXQgPSBtSW5wdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOworICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIG91dHB1dCBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtT3V0cHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbU91dHB1dERvbWFpbikpOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVl9JRihjaGFuZ2VkLCAiZm9ybWF0KHMpIGNoYW5nZWQiKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0NvbmZpZzo6Z2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIHBvcnREb21haW4pIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBwb3J0RG9tYWluKSA9PSAwIC8vIGlucHV0LW91dHB1dC1jb2RlZC1yYXcKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBtRG9tYWluKSAhPSBtRG9tYWluIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIElTX1JFQUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSByZWZsZWN0ZWQuZmluZChjbS5wYXRoKCkpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlZmxlY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBjbS5tYXBUb01lc3NhZ2UoYzJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoYnVmVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHN0clZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIENvZGVjIDIuMCByZWN0IHRvIE1lZGlhRm9ybWF0IHJlY3QgYW5kIGFkZCBjcm9wIHJlY3QgaWYgbm90IHByZXNlbnQKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJmxlZnQpICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXdpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZ0b3ApICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgbGVmdCA+PSAwICYmIHdpZHRoID49MCAmJiB3aWR0aCA8PSBJTlQzMl9NQVggLSBsZWZ0CisgICAgICAgICAgICAgICAgJiYgdG9wID49IDAgJiYgaGVpZ2h0ID49MCAmJiBoZWlnaHQgPD0gSU5UMzJfTUFYIC0gdG9wKSB7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtbGVmdCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC10b3AiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3Atd2lkdGgiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtaGVpZ2h0IikpOworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGggLSAxLCB0b3AgKyBoZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCB0ZW1wb3JhbCBsYXllcmluZyB0byBzY2hlbWEKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nICpsYXllcmluZyA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpGcm9tKEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcgJiYgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPCBsYXllcmluZy0+bS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB3ZWJydGMgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC4yNWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMl0gPT0gLjZmKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJydGMudnA4LiV1LWxheWVyIiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUrJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmxheWVyQ291bnQgLSBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChwcmltYXJpZXMsIG1hdHJpeCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItcHJpbWFyaWVzIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1tYXRyaXgiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkYXRhc3BhY2UgZm9yIHJhdyBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IHNwZWNpZmllZCBieSBjb21wb25lbnQsIG9yIGlmCisgICAgICAgIC8vIHVzaW5nIHN1cmZhY2Ugd2l0aCB1bnNwZWNpZmllZCBhc3BlY3RzIChhcyB0aG9zZSBtdXN0IGJlIGRlZmF1bHRlZCB3aGljaCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRoZSBkYXRhc3BhY2UpCisgICAgICAgIGlmICgocG9ydERvbWFpbiAmIElTX1JBVykgJiYgKG1Eb21haW4gJiAoSVNfSU1BR0UgfCBJU19WSURFTykpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2U7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0cyA9IHsKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkCisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIG9yaWdBc3BlY3RzID0gYXNwZWN0czsKKyAgICAgICAgICAgIGlmIChtVXNpbmdTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGltYWdlIHNpemUgKGRlZmF1bHQgdG8gSEQpCisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IDEyODA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSA3MjA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0RGVmYXVsdENvZGVjQ29sb3JBc3BlY3RzSWZOZWVkZWQoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUmFuZ2UgIT0gb3JpZ0FzcGVjdHMubVJhbmdlCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVByaW1hcmllcyAhPSBvcmlnQXNwZWN0cy5tUHJpbWFyaWVzCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVRyYW5zZmVyICE9IG9yaWdBc3BlY3RzLm1UcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgIT0gb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcykgeworICAgICAgICAgICAgICAgIGRhdGFzcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbworCisgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsICZoZHIubWFzdGVyaW5nLnJlZC54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCAmaGRyLm1hc3RlcmluZy5yZWQueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsICZoZHIubWFzdGVyaW5nLmdyZWVuLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCAmaGRyLm1hc3RlcmluZy5ibHVlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCAmaGRyLm1hc3RlcmluZy5ibHVlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgJmhkci5tYXhDbGwpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsICZoZHIubWF4RmFsbCkpIHsKKyAgICAgICAgICAgIGlmIChoZHIubWFzdGVyaW5nLnJlZC54ID49IDAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPj0gMCAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPD0gNi41NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPj0gMCAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPj0gMCAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPD0gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIG1ldGE7CisgICAgICAgICAgICAgICAgbWV0YS5tSUQgPSBtZXRhLmtUeXBlMTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi54ID0gaGRyLm1hc3RlcmluZy5yZWQueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueSA9IGhkci5tYXN0ZXJpbmcucmVkLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnggPSBoZHIubWFzdGVyaW5nLmdyZWVuLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnkgPSBoZHIubWFzdGVyaW5nLmdyZWVuLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnggPSBoZHIubWFzdGVyaW5nLmJsdWUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueSA9IGhkci5tYXN0ZXJpbmcuYmx1ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy54ID0gaGRyLm1hc3RlcmluZy53aGl0ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy55ID0gaGRyLm1hc3RlcmluZy53aGl0ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJjb252ZXJ0ZWQgdG8gU0RLIHZhbHVlcyBhcyAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOworfQorCisvLy8gY29udmVydHMgYW4gQU1lc3NhZ2UgdmFsdWUgdG8gYSBQYXJhbVVwZGF0ZXIgdmFsdWUKK3N0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZmcm9tLCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICp0bykgeworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKworICAgIGlmIChmcm9tLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50NjRWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGJ1ZlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoc3RyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KEMyVmFsdWUoZmxvYXRWYWx1ZSkpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgLy8gY29udmVydCBkb3VibGUgdG8gZmxvYXQKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKChmbG9hdClkb3VibGVWYWx1ZSkpOworICAgIH0KKyAgICAvLyBpZ25vcmUgYWxsIG90aGVyIEFNZXNzYWdlIHR5cGVzCit9CisKKy8vLyByZWxheGVzIENvZGVjIDIuMCBzcGVjaWZpYyB2YWx1ZSB0eXBlcyB0byBTREsgdHlwZXMgKG1haW5seSByZW1vdmVzIHNpZ25lZG5lc3MgYW5kIGNvdW50ZXJuZXNzCisvLy8gZnJvbSAzMi82NC1iaXQgdmFsdWVzLikKK3N0YXRpYyB2b2lkIHJlbGF4VmFsdWVzKFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJml0ZW0pIHsKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAodm9pZClpdGVtLmZpbmQoJmMyVmFsdWUpOworICAgIGlmIChjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkgfHwgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgQ0NvZGVjQ29uZmlnOjpnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zXywgRG9tYWluIGNvbmZpZ0RvbWFpbikgY29uc3QgeworICAgIC8vIGNyZWF0ZSBhIG1vZGlmaWFibGUgY29weSBvZiBwYXJhbXMKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gcGFyYW1zXy0+ZHVwKCk7CisgICAgQUxPR1YoImZpbHRlcmluZyB3aXRoIGNvbmZpZyBkb21haW4gJXgiLCBjb25maWdEb21haW4pOworCisgICAgLy8gY29udmVydCBzb21lIG1hY3JvIHBhcmFtZXRlcnMgdG8gQ29kZWMgMi4wIHNwZWNpZmljIGV4cHJlc3Npb25zCisKKyAgICB7IC8vIG1ha2UgaS1mcmFtZS1pbnRlcnZhbCBmcmFtZSBiYXNlZAorICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImktZnJhbWUtcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVJhdGUgPD0gMCB8fCBpRnJhbWVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xIC8qIG5vIHN5bmMgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KWMyX21pbihpRnJhbWVJbnRlcnZhbCAqIGZyYW1lUmF0ZSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClJTlQzMl9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRG9tYWluID09IChJU19WSURFTyB8IElTX0VOQ09ERVIpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY2FwdHVyZS1yYXRlIGludG8gaW5wdXQtdGltZS1zdHJldGNoCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSwgY2FwdHVyZVJhdGU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPmZpbmRBc0Zsb2F0KCJ0aW1lLWxhcHNlLWZwcyIsICZjYXB0dXJlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcHR1cmVSYXRlID4gMCAmJiBmcmFtZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgICAvLyByZWZsZWN0IHRlbXBvcmFsIGxheWVyaW5nIGludG8gYSBiaW5hcnkgYmxvYgorICAgICAgICBBU3RyaW5nIHNjaGVtYTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZzY2hlbWEpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIGludCB0YWdzOworICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbGF5ZXJpbmc7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIDF1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjZmIH0sIDB1LCAydSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC40ZiwgLjZmIH0sIDB1LCAzdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuMjVmLCAuNGYsIC42ZiB9LCAwdSwgNHUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIG51bUxheWVycyArIG51bUJMYXllcnMsIG51bUJMYXllcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCBzY2hlbWEuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobGF5ZXJpbmcuZ2V0KCksIGxheWVyaW5nLT5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIE1lZGlhRm9ybWF0IHJlY3QgdG8gQ29kZWMgMi4wIHJlY3QKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3QgZW5kOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1yaWdodCIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXJpZ2h0Iik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC13aWR0aCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1ib3R0b20iLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1ib3R0b20iKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLWhlaWdodCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJnByaW1hcmllcywgJm1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1wcmltYXJpZXMiLCBwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJNZXRhOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJNZXRhKQorICAgICAgICAgICAgICAgICYmIGhkck1ldGEtPnNpemUoKSA9PSBzaXplb2YoSERSU3RhdGljSW5mbykpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gKm1ldGEgPSAoSERSU3RhdGljSW5mbyopaGRyTWV0YS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKG1ldGEtPm1JRCA9PSBtZXRhLT5rVHlwZTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCBtZXRhLT5zVHlwZTEubVIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsIG1ldGEtPnNUeXBlMS5tUi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCBtZXRhLT5zVHlwZTEubUcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgbWV0YS0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgbWV0YS0+c1R5cGUxLm1CLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgbWV0YS0+c1R5cGUxLm1CLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsIG1ldGEtPnNUeXBlMS5tVy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCBtZXRhLT5zVHlwZTEubVcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCBtZXRhLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeVN0cmljdCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfc3RyaWN0X3R5cGUiLCBmYWxzZSk7CisgICAgLy8gdGhpcyBpcyB0byBhbGxvdyB2ZW5kb3JzIHRvIHVzZSB0aGUgd3Jvbmcgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5TGF4ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19sYXhfdHlwZSIsIGZhbHNlKTsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBmaWx0ZXJlZDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGFyYW1zLT5jb3VudEVudHJpZXMoKTsgKytpeCkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBBU3RyaW5nIG5hbWUgPSBwYXJhbXMtPmdldEVudHJ5TmFtZUF0KGl4LCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtc2dJdGVtID0gcGFyYW1zLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSBpdGVtOworICAgICAgICBjb252ZXJ0KG1zZ0l0ZW0sICZpdGVtKTsgLy8gY29udmVydCBpdGVtIHRvIHBhcmFtIHVwZGF0ZXIgaXRlbQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZlbmRvci4iKSkgeworICAgICAgICAgICAgLy8gdmVuZG9yIHBhcmFtcyBwYXNzIHRocm91Z2ggYXMgaXMKKyAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UobmFtZS5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHN0YW5kYXJkIHBhcmFtZXRlcnMgbWF5IGdldCBtb2RpZmllZCwgZmlsdGVyZWQgb3IgZHVwbGljYXRlZAorICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtU3RhbmRhcmRQYXJhbXMtPmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkobmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgLy8gbm90ZTogd2UgaWdub3JlIHBvcnQgZG9tYWluIGZvciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgY29uZmlnRG9tYWluKQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNtLmRvbWFpbigpICYgbURvbWFpbikgPT0gbURvbWFpbikgeworICAgICAgICAgICAgICAgIC8vIG1hcCBhcml0aG1ldGljIHZhbHVlcywgcGFzcyB0aHJvdWdoIHN0cmluZyBvciBidWZmZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IG1hcCBzZXR0aW5ncyB3aXRoIG1hcHBlcnMgYXMgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIDw9PiB1bnNpZ25lZCBtYXBwZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZSBwcmVjaXNlIGFib3V0IHNpZ25lZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeVN0cmljdCB8fCBjbS5tYXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGNtLm1hcEZyb21NZXNzYWdlKHBhcmFtcy0+Z2V0RW50cnlBdChpeCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGFsbG93IHRvIHJlbGF4IHR5cGUgc3RyaWN0bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlMYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhWYWx1ZXMoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShjbS5wYXRoKCksIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmaWx0ZXJlZCAlcyB0byAlcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKKyAgICAgICAgICAgIGZpbHRlcmVkLmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgIHJldHVybiBmaWx0ZXJlZDsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBjb25maWdEb21haW4sCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3QgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBwYXJhbXMgPSBnZXRSZWZsZWN0ZWRGb3JtYXQoc2RrUGFyYW1zLCBjb25maWdEb21haW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UocGFyYW1zLCAmaW5kaWNlcyk7CisgICAgaWYgKGluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgibm8gcmVjb2duaXplZCBwYXJhbXMgaW46ICVzIiwgcGFyYW1zLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25maWdVcGRhdGUtPmNsZWFyKCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN1cHBvcnRlZEluZGljZXM7CisgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IGluZGljZXMpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGl4KSkgeworICAgICAgICAgICAgc3VwcG9ydGVkSW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpeCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdVcGRhdGUtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCppdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgfSwgc3VwcG9ydGVkSW5kaWNlcywgYmxvY2tpbmcsIGNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLT5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKworICAgIGlmIChjb25maWdVcGRhdGUtPnNpemUoKSkgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShwYXJhbXMsIGNvbmZpZ1VwZGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzZXRQYXJhbWV0ZXJzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKGNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtVmVjdG9yOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBjb21wb25lbnQgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbVZlY3Rvci5wdXNoX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2socGFyYW0tPmluZGV4KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBtTG9jYWxQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDMlBhcmFtOjpDb3B5KCpwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdG9yKGNvcHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVkIGxvY2FsIHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW3BhcmFtLT5pbmRleCgpXSA9IHN0ZDo6bW92ZShjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBzZXQgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgc3Vic2NyaWJlZCBwYXJhbSBpbmRpY2VzCisgICAgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29tcG9uZW50LCBpbmRpY2VzLCBibG9ja2luZyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5jb25maWcocGFyYW1WZWN0b3IsIGJsb2NraW5nLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImNvbmZpZyBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBub24tZmF0YWwuCisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICBzd2l0Y2ggKGZhaWx1cmUtPmZhaWx1cmUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgICAgICAgICAgQUxPR0QoIkJhZCBwYXJhbWV0ZXIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsdXJlID0gJWQiLCBpbnQoZmFpbHVyZS0+ZmFpbHVyZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmUtcXVlcnkgcGFyYW1ldGVyIHZhbHVlcyBpbiBjYXNlIGNvbmZpZyBjb3VsZCBub3QgdXBkYXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY3VycmVudAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgYmxvY2tpbmcsICZjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKyAgICAodm9pZCl1cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZ1VwZGF0ZSwgQUxMKTsKKworICAgIC8vIFRPRE86IGVycm9yIHZhbHVlCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgQzJQYXJhbSAqQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWZlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfQ09ORklHX0hfCisjZGVmaW5lIENfQ09ERUNfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBTdGFuZGFyZFBhcmFtczsKKworLyoqCisgKiBTdHJ1Y3QgbWFuYWdpbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIENDb2RlYy4KKyAqLworc3RydWN0IENDb2RlY0NvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBEb21haW4gY29uc2lzdHMgb2YgYSBiaXRtYXNrIGRpdmlkZWQgaW50byBmaWVsZHMsIGFuZCBzcGVjaWZpZXJzIHdvcmsgYnkgZXhjbHVkaW5nIG90aGVyCisgICAgICogdmFsdWVzIGluIHRob3NlIGRvbWFpbnMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgZG9tYWlucyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIElTXyBjb25zdGFudHMsIGUuZy4KKyAgICAgKiBJU19ERUNPREVSIHwgSVNfQVVESU8uCisgICAgICoKKyAgICAgKiBDb25maWcgc3BlY2lmaWVycyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIG1hc2sgY29uc3RhbnRzLCBhbmQKKyAgICAgKiBhbmQtaW5nIHRoZXNlIGdyb3VwczogZS5nLiAoREVDT0RFUiB8IEVOQ09ERVIpICYgQVVESU8uCisgICAgICoKKyAgICAgKiBUaGUgbmFtaW5nIG9mIHRoZXNlIGNvbnN0YW50cyB3YXMgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBtYXNrIG5hbWVzIGFzIHRoZXNlIGFyZSB1c2VkIG1vcmUKKyAgICAgKiBjb21tb25seSBhcyBtYXNrcy4KKyAgICAgKi8KKyAgICBlbnVtIERvbWFpbiA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiAoZG9tYWluICYga2luZCkKKyAgICAgICAgR1VBUkRfQklUICAgPSAoMSA8PCAxKSwgICAvLy88IHRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IGFjY2lkZW50YWwgJiYgb3IgfHwgdXNhZ2UKKyAgICAgICAgSVNfQVVESU8gICAgPSAoMSA8PCAyKSwgICAvLy88IGZvciBhdWRpbyBjb2RlY3MKKyAgICAgICAgSVNfVklERU8gICAgPSAoMSA8PCAzKSwgICAvLy88IGZvciB2aWRlbyBjb2RlY3MKKyAgICAgICAgSVNfSU1BR0UgICAgPSAoMSA8PCA0KSwgICAvLy88IGZvciBpbWFnZSBjb2RlY3MKKyAgICAgICAgT1RIRVJfRE9NQUlOID0gKDEgPDwgNSksICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgSVNfRU5DT0RFUiAgPSAoMSA8PCA2KSwgICAvLy88IGZvciBlbmNvZGVycworICAgICAgICBJU19ERUNPREVSICA9ICgxIDw8IDcpLCAgIC8vLzwgZm9yIGRlY29kZXJzCisgICAgICAgIE9USEVSX0tJTkQgID0gKDEgPDwgOCksICAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIC8vIGNvbmZpZyBkb21haW4KKyAgICAgICAgSVNfUEFSQU0gICAgPSAoMSA8PCA5KSwgICAvLy88IGZvciBzZXRQYXJhbWV0ZXIKKyAgICAgICAgSVNfQ09ORklHICAgPSAoMSA8PCAxMCksICAvLy88IGZvciBjb25maWd1cmUKKyAgICAgICAgSVNfUkVBRCAgICAgPSAoMSA8PCAxMSksICAvLy88IGZvciBnZXRGb3JtYXQKKworICAgICAgICAvLyBwb3J0IGRvbWFpbgorICAgICAgICBJU19JTlBVVCAgICA9ICgxIDw8IDEyKSwgIC8vLzwgZm9yIGlucHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfT1VUUFVUICAgPSAoMSA8PCAxMyksICAvLy88IGZvciBvdXRwdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19SQVcgICAgICA9ICgxIDw8IDE0KSwgIC8vLzwgZm9yIHJhdyBwb3J0IChpbnB1dC1lbmNvZGVyLCBvdXRwdXQtZGVjb2RlcikKKyAgICAgICAgSVNfQ09ERUQgICAgPSAoMSA8PCAxNSksICAvLy88IGZvciBjb2RlZCBwb3J0IChpbnB1dC1kZWNvZGVyLCBvdXRwdXQtZW5jb2RlcikKKworICAgICAgICBBTEwgICAgID0gfjBVLAorICAgICAgICBOT05FICAgID0gMCwKKworICAgICAgICBBVURJTyAgID0gfihJU19JTUFHRSB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgVklERU8gICA9IH4oSVNfQVVESU8gfCBJU19JTUFHRSB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIElNQUdFICAgPSB+KElTX0FVRElPIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorCisgICAgICAgIERFQ09ERVIgPSB+KElTX0VOQ09ERVIgfCBPVEhFUl9LSU5EKSwKKyAgICAgICAgRU5DT0RFUiA9IH4oSVNfREVDT0RFUiB8IE9USEVSX0tJTkQpLAorCisgICAgICAgIFBBUkFNICAgPSB+KElTX0NPTkZJRyB8IElTX1JFQUQpLAorICAgICAgICBDT05GSUcgID0gfihJU19QQVJBTSAgfCBJU19SRUFEKSwKKyAgICAgICAgUkVBRCAgICA9IH4oSVNfQ09ORklHIHwgSVNfUEFSQU0pLAorCisgICAgICAgIElOUFVUICAgPSB+KElTX09VVFBVVCB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgT1VUUFVUICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBSQVcgICAgID0gfihJU19JTlBVVCAgfCBJU19PVVRQVVQgfCBJU19DT0RFRCksCisgICAgICAgIENPREVEICAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX09VVFBVVCksCisgICAgfTsKKworICAgIC8vIHRoaW5ncyByZXF1aXJlZCB0byBtYW5hZ2UgZm9ybWF0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1QYXJhbURlc2NzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4gbVBhcmFtVXBkYXRlcjsKKworICAgIERvbWFpbiBtRG9tYWluOyAvLyBjb21wb25lbnQgZG9tYWluCisgICAgRG9tYWluIG1JbnB1dERvbWFpbjsgLy8gaW5wdXQgcG9ydCBkb21haW4KKyAgICBEb21haW4gbU91dHB1dERvbWFpbjsgLy8gb3V0cHV0IHBvcnQgZG9tYWluCisgICAgc3RkOjpzdHJpbmcgbUNvZGluZ01lZGlhVHlwZTsgIC8vIG1lZGlhIHR5cGUgb2YgdGhlIGNvZGVkIHN0cmVhbQorCisgICAgLy8gc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhbmRhcmRQYXJhbXM+IG1TdGFuZGFyZFBhcmFtczsKKworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3VwcG9ydGVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdWJzY3JpYmVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHRvIHN1YnNjcmliZSB0bworICAgIHNpemVfdCBtU3Vic2NyaWJlZEluZGljZXNTaXplOyAvLy88IGNvdW50IG9mIGN1cnJlbnRseSBzdWJzY3JpYmVkIGluZGljZXMKKworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICBib29sIG1Vc2luZ1N1cmZhY2U7IC8vLzwgdXNpbmcgaW5wdXQgb3Igb3V0cHV0IHN1cmZhY2UKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWc+IG1JU0NvbmZpZzsKKworICAgIC8vLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBVcGRhdGVkIGFmdGVyIGNvbmZpZ3VyZSgpIGFuZCBiYXNlZCBvbiBjb25maWdVcGRhdGUgaW4KKyAgICAvLy8gb25Xb3JrRG9uZQorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1DdXJyZW50Q29uZmlnOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYpPiBMb2NhbFBhcmFtVmFsaWRhdG9yOworCisgICAgLy8vIFBhcmFtZXRlciBpbmRpY2VzIHRyYWNrZWQgaW4gY3VycmVudCBjb25maWcgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgIC8vLyB0aGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiByZW1haW4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAvLy8gYXMgc3VjaCwgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGRlcGVuZGVuY2llcy4gVE9ETzogdXNlIEMySW50ZXJmYWNlSGVscGVyIGZvciB0aGlzLgorICAgIC8vLyBGb3Igbm93IHN1cHBvcnQgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBMb2NhbFBhcmFtVmFsaWRhdG9yPiBtTG9jYWxQYXJhbXM7CisKKyAgICBDQ29kZWNDb25maWcoKTsKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKKyAgICAvLy8gcmVmbGVjdGVkIHBhcmFtIGhlbHBlciwgZG9tYWluLCBzdGFuZGFyZCBwYXJhbXMsIGFuZCBzdWJzY3JpYmVzIHRvIHN0YW5kYXJkCisgICAgLy8vIGluZGljZXMuCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZQorICAgICAqIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpbiBjYXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRTsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSB8fCBtTG9jYWxQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoImlnbm9yaW5nIGxvY2FsIHBhcmFtICVzICglI3gpIGFzIGl0IGlzIGFscmVhZHkgJXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICh1aW50MzJfdClpbmRleCwgbVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpID8gInN1cHBvcnRlZCIgOiAibG9jYWwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCBvciBhbHJlYWR5IGFkZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIHR5cGVkIHZhbGlkYXRvciBpbnRvIHVudHlwZWQgdmFsaWRhdG9yCisgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yOworICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgdmFsaWRhdG9yID0gW3ZhbGlkYXRvcl9dKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCl7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiB0eXBlZChzdGF0aWNfY2FzdDxUKj4ocC5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHR5cGVkCisgICAgICAgICAgICAgICAgaWYgKFQ6OkZyb20odHlwZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRvcl8odHlwZWQpOworICAgICAgICAgICAgICAgICAgICBwLnJlc2V0KHR5cGVkLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbUxvY2FsUGFyYW1zLmVtcGxhY2UoaW5kZXgsIHZhbGlkYXRvcik7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08VD4obmFtZSwgYXR0cmliKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGVmYXVsdF8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBpZiAoYWRkTG9jYWxQYXJhbTxUPihuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pKSB7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHZhbGlkYXRvcl8oZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImRlZmF1bHQgdmFsdWUgZm9yICVzIGlzIGludmFsaWQgPT4gJXMiLCBuYW1lLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbVDo6UEFSQU1fVFlQRV0gPSBzdGQ6Om1vdmUoZGVmYXVsdF8pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgVCAqZGVmYXVsdF8sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NhbFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxUPihkZWZhdWx0XyksIG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXyk7CisgICAgfQorCisgICAgLy8vIEFwcGxpZXMgY29uZmlndXJhdGlvbiB1cGRhdGVzLCBhbmQgdXBkYXRlcyBmb3JtYXQgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdHMgd2VyZSB1cGRhdGVkCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pOworCisgICAgLy8vIFVwZGF0ZXMgZm9ybWF0cyBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBmb3JtYXRzIGhhdmUgY2hhbmdlZC4KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKTsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgU0RLIGNvbmZpZ3VyYXRpb25zIGluIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkb21haW4uCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBkb21haW4sCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSB0byB0aGUgY29tcG9uZW50LgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyk7CisKKyAgICAvLy8gUXVlcmllcyBzdWJzY3JpYmVkIGluZGljZXMgKHdoaWNoIGNvbnRhaW5zIGFsbCBTREstZXhwb3NlZCB2YWx1ZXMpIGFuZCB1cGRhdGVzCisgICAgLy8vIGlucHV0L291dHB1dCBmb3JtYXRzLgorICAgIHN0YXR1c190IHF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvLy8gUXVlcmllcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAvLy8gcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAgY29uc3QgQzJQYXJhbSAqZ2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhbmQgaWYgdGhleSBjaGFuZ2UuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgV2F0Y2hlciB7CisgICAgICAgIH5XYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAgICAgICBib29sIGhhc0NoYW5nZWQoKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgJiYgbVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZSAhPSAqbVZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbVZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgaXQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IHVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdhdGNoZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IENDb2RlY0NvbmZpZyAqcGFyZW50KQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCksIG1JbmRleChpbmRleCkgeworICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RydWN0IENDb2RlY0NvbmZpZzsKKworICAgICAgICBjb25zdCBDQ29kZWNDb25maWcgKm1QYXJlbnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiBtVmFsdWU7CisgICAgICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdGNoZXIgb2JqZWN0IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFdhdGNoZXI8VD4gd2F0Y2goQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFKSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleC50eXBlKCkgIT0gVDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHZvaWQgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLy8gQWRkcyBpbmRpY2VzIHRvIHRoZSBzdWJzY3JpYmVkIGluZGljZXMsIGFuZCB1cGRhdGVkIHN1YnNjcmlwdGlvbiB0byBjb21wb25lbnQKKyAgICAvLy8gXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgIHN0YXR1c190IHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgc3A8QU1lc3NhZ2U+IGdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gZG9tYWluKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhbiBBTWVzc2FnZSB0byBhIGxpc3Qgb2YgcGF0aC1iYXNlZCBDb2RlYworICAgICAqIDIuMCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICovCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmY29uZmlnLCBEb21haW4gZG9tYWluKSBjb25zdDsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyhDQ29kZWNDb25maWc6OkRvbWFpbikKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsODE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+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+c3RyaWRlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gd3JhcCBWaWRlb05hdGl2ZU1ldGFkYXRhIGludG8gQzJHcmFwaGljQWxsb2NhdGlvbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIG1ldGEtPnBCdWZmZXIgPSAwOworICAgIC8vIFRPRE86IHdyYXAgdGhpcyBpbiBDMkZlbmNlIHNvIHRoYXQgdGhlIGNvbXBvbmVudCBjYW4gd2FpdCB3aGVuIGl0CisgICAgLy8gICAgICAgYWN0dWFsbHkgc3RhcnRzIHByb2Nlc3NpbmcuCisgICAgaWYgKG1ldGEtPm5GZW5jZUZkID49IDApIHsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlKG5ldyBGZW5jZShtZXRhLT5uRmVuY2VGZCkpOworICAgICAgICBmZW5jZS0+d2FpdEZvcmV2ZXIoTE9HX1RBRyk7CisgICAgfQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKKyNlbHNlCisgICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQsIGZhbHNlIC8qIGNvcHkgKi8pOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGFCdWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSB2aWV3LgorICAgICAgICBob2xkZXIgPSBzdGQ6Om1vdmUodmlldyk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIC8vIE5PVEU6IHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgWVVWNDIwIGZvcm1hdHMgZm9yIGJ5dGUtYnVmZmVyIG1vZGUuCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlcihhbGxvYyhhbGlnbih3aWR0aCwgMTYpICogYWxpZ24oaGVpZ2h0LCAxNikgKiAzIC8gMikpOworICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgZmFsc2UpOworfQorCitDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+ICYmdmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBhQnVmZmVyKSwKKyAgICAgIG1WaWV3KHN0ZDo6bW92ZSh2aWV3KSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlciksCisgICAgICBtV3JhcHBlZCh3cmFwcGVkKSB7CisgICAgc2V0SW1hZ2VEYXRhKGltYWdlRGF0YSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgbVZpZXcucmVzZXQoKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChtV3JhcHBlZCB8fCBtQnVmZmVyUmVmKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogJXN3cmFwcGVkIDsgYnVmZmVyIHJlZiAlcyIsCisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPyAiIiA6ICJub3QgIiwgbUJ1ZmZlclJlZiA/ICJleGlzdHMiIDogImRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGJ1ZmZlciBwcmVjb25kaXRpb24gdW5zYXRpc2ZpZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IHRvbyBtYW55IGJsb2NrcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIC8vIEZJWE1FOiBmb3JtYXQoKSBpcyBub3QgY29uc3QsIGJ1dCB3ZSBjYW5ub3QgY2hhbmdlIGl0LCBzbyBkbyBhIGNvbnN0IGNhc3QgaGVyZQorICAgIGNvbnN0X2Nhc3Q8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIgKj4odGhpcyktPmZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQsIHRydWUgLyogY29weSAqLyk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQsIHRydWUgLyogY29weSAqLyk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihiYXNlKCksIGNhcGFjaXR5KCkpOworICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBzZXQgYmFjayBidWZmZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2V0UmFuZ2UoMCwgYUJ1ZmZlci0+c2l6ZSgpKTsgIC8vIGFsaWduIHNpemUgaW5mbworICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRjYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbUltYWdlRGF0YTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgKi8KK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgd2l0aCBsb2NhbCBsaW5lYXIgYnVmZmVyIGZvcgorICAgICAqIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqLworICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYyk7CisgICAgdmlydHVhbCB+R3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvYzsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QuCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICogSWYgfGJ1ZmZlcnwgaXMgbm90IGluIGdvb2QgY29sb3IgZm9ybWF0cywgaXQgYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGdyYXBoaWMgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggcmVhZGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd2hpY2ggYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBhbGxvYyAgIGEgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYmFja2luZyBBQnVmZmVyIGlmIG5lZWRlZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIG5vIHdyYXBwaW5nIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgdmlydHVhbCB+Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgICAgIGJvb2wgd3JhcHBlZCk7CisgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKKyAgICBjb25zdCBib29sIG1XcmFwcGVkOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrIGZvciBjb21wb25lbnQKKyAqIGFuZCBJTWVtb3J5IGZvciBjbGllbnQuIFVuZGVybHlpbmcgQzJMaW5lYXJCbG9jayB3b24ndCBiZSBtYXBwZWQgZm9yIHNlY3VyZQorICogdXNlY2FzZXMuLgorICovCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBFbmNyeXB0ZWRMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jaworICAgICAqIG9iamVjdCBhbmQgd3JpdGFibGUgSU1lbW9yeSByZWdpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgICAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIG1lbW9yeSAgICAgIElNZW1vcnkgb2JqZWN0IHRvIHN0b3JlIGVuY3J5cHRlZCBjb250ZW50LgorICAgICAqIFxwYXJhbSAgIGhlYXBTZXFOdW0gIEhlYXAgc2VxdWVuY2UgbnVtYmVyIGZyb20gSUNyeXB0bzsgLTEgaWYgTi9BCisgICAgICovCisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtID0gLTEpOworICAgIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICB2aXJ0dWFsIH5FbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRmlsbCB0aGUgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZSBiYXNlZCBvbgorICAgICAqIGludGVybmFsIElNZW1vcnkgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHNvdXJjZSAgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAgICAgKi8KKyAgICB2b2lkIGZpbGxTb3VyY2VCdWZmZXIoSUNyeXB0bzo6U291cmNlQnVmZmVyICpzb3VyY2UpOworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpOworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiB8ZGVjcnlwdGVkfCBpbnRvIEMyTGluZWFyQmxvY2sgaW5zaWRlLiBUaGlzIHNoYWxsCisgICAgICogb25seSBiZSBjYWxsZWQgaW4gbm9uLXNlY3VyZSB1c2VjYXNlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGRlY3J5cHRlZCAgIGRlY3J5cHRlZCBjb250ZW50IHRvIGNvcHkgZnJvbS4KKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnQoY29uc3Qgc3A8SU1lbW9yeT4gJmRlY3J5cHRlZCwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIGludGVybmFsIElNZW1vcnkgb2JqZWN0IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuCisgICAgICogVGhpcyBzaGFsbCBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgbGVuZ3RoICAgICAgbGVuZ3RoIG9mIHRoZSBjb250ZW50CisgICAgICogXHJldHVybiAgdHJ1ZSAgICAgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBuYXRpdmUgaGFuZGxlIG9mIHNlY3VyZSBidWZmZXIgdW5kZXJzdG9vZCBieSBJQ3J5cHRvLgorICAgICAqCisgICAgICogXHJldHVybiBzZWN1cmUgYnVmZmVyIGhhbmRsZQorICAgICAqLworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIGludDMyX3QgbUhlYXBTZXFOdW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzVlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJJbmZvQnVpbGRlciIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgIkNvZGVjMkluZm9CdWlsZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgVHJhaXRzID0gQzJDb21wb25lbnQ6OlRyYWl0czsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitib29sIGhhc1ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgc2l6ZV90IHByZWZpeExlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIHJldHVybiBzLmNvbXBhcmUoMCwgcHJlZml4TGVuLCBwcmVmaXgpID09IDA7Cit9CisKK2Jvb2wgaGFzU3VmZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgICBzaXplX3Qgc3VmZml4TGVuID0gc3RybGVuKHN1ZmZpeCk7CisgICAgcmV0dXJuIHN1ZmZpeExlbiA+IHMuc2l6ZSgpID8gZmFsc2UgOgorICAgICAgICAgICAgcy5jb21wYXJlKHMuc2l6ZSgpIC0gc3VmZml4TGVuLCBzdWZmaXhMZW4sIHN1ZmZpeCkgPT0gMDsKK30KKwordm9pZCBhZGRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIgKmNhcHMsCisgICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUpOworICAgIC8vIGlmIHdlIGRvbid0IGtub3cgdGhlIG1lZGlhIHR5cGUsIHBhc3MgdGhyb3VnaCBhbGwgdmFsdWVzIHVubWFwcGVkCisKKyAgICAvLyBUT0RPOiB3ZSBjYW5ub3QgZmluZCBsZXZlbHMgdGhhdCBhcmUgbG9jYWwgJ21heGltYScgd2l0aG91dCBrbm93aW5nIHRoZSBjb2RpbmcKKyAgICAvLyBlLmcuIEguMjYzIGxldmVsIDQ1IGFuZCBsZXZlbCAzMCBjb3VsZCBiZSB0d28gdmFsdWVzIGZvciBoaWdoZXN0IGxldmVsIGFzCisgICAgLy8gdGhleSBkb24ndCBpbmNsdWRlIG9uZSBhbm90aGVyLiBGb3Igbm93IHdlIHVzZSB0aGUgbGFzdCBzdXBwb3J0ZWQgdmFsdWUuCisgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbyBwbChlbmNvZGVyIC8qIG91dHB1dCAqLywgMHUpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcHJvZmlsZVF1ZXJ5ID0geworICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZCgmcGwsICZwbC5wcm9maWxlKSkKKyAgICB9OworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMocHJvZmlsZVF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICBBTE9HVigicXVlcnkgc3VwcG9ydGVkIHByb2ZpbGVzIC0+ICVzIHwgJXMiLCBhc1N0cmluZyhlcnIpLCBhc1N0cmluZyhwcm9maWxlUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBwcm9maWxlUXVlcnlbMF0uc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBvbmx5IGhhbmRsZSBlbnVtZXJhdGVkIHZhbHVlcworICAgIGlmIChwcm9maWxlUXVlcnlbMF0udmFsdWVzLnR5cGUgIT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSCisgICAgYm9vbCBzdXBwb3J0c0hkciA9IGZhbHNlOworICAgIGJvb2wgc3VwcG9ydHNIZHIxMFBsdXMgPSBmYWxzZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtRGVzY3M7CisgICAgYzJfc3RhdHVzX3QgZXJyMSA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbURlc2NzKTsKKyAgICBpZiAoZXJyMSA9PSBDMl9PSykgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCh1aW50MzJfdClkZXNjLT5pbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOgorICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyMTBQbHVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBWUDksIHRoZSBzdGF0aWMgaW5mbyBpcyBhbHdheXMgcHJvcGFnYXRlZCBieSBmcmFtZXdvcmsuCisgICAgc3VwcG9ydHNIZHIgfD0gKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpOworCisgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgcHJvZmlsZSA6IHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CisgICAgICAgIHBsLnByb2ZpbGUgPSAoQzJDb25maWc6OnByb2ZpbGVfdClwcm9maWxlLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBlcnIgPSBpbnRmLT5jb25maWcoeyZwbH0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFMT0dWKCJzZXQgcHJvZmlsZSB0byAldSAtPiAlcyIsIHBsLnByb2ZpbGUsIGFzU3RyaW5nKGVycikpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGxldmVsUXVlcnkgPSB7CisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLmxldmVsKSkKKyAgICAgICAgfTsKKyAgICAgICAgZXJyID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMobGV2ZWxRdWVyeSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgbGV2ZWxzIC0+ICVzIHwgJXMiLCBhc1N0cmluZyhlcnIpLCBhc1N0cmluZyhsZXZlbFF1ZXJ5WzBdLnN0YXR1cykpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LIHx8IGxldmVsUXVlcnlbMF0uc3RhdHVzICE9IEMyX09LCisgICAgICAgICAgICAgICAgfHwgbGV2ZWxRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlIGxldmVsID0gbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzLmJhY2soKTsKKyAgICAgICAgcGwubGV2ZWwgPSAoQzJDb25maWc6OmxldmVsX3QpbGV2ZWwucmVmPHVpbnQzMl90PigpOworICAgICAgICBBTE9HVigic3VwcG9ydGluZyBsZXZlbDogJXUiLCBwbC5sZXZlbCk7CisgICAgICAgIGludDMyX3Qgc2RrUHJvZmlsZSwgc2RrTGV2ZWw7CisgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQorICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwTGV2ZWwocGwubGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIC8vIGFsc28gbGlzdCBIRFIgcHJvZmlsZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIEhEUgorICAgICAgICAgICAgaWYgKHN1cHBvcnRzSGRyKSB7CisgICAgICAgICAgICAgICAgYXV0byBoZHJNYXBwZXIgPSBDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzSGRyMTBQbHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXQubWVkaWFUeXBlLCB0cnVlIC8qaXNIZHIxMFBsdXMqLyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZHJNYXBwZXIgJiYgaGRyTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgSC4yNjMgYWxzbyBhZHZlcnRpc2UgdGhlIHNlY29uZCBoaWdoZXN0IGxldmVsIGlmIHRoZQorICAgICAgICAvLyBjb2RlYyBzdXBwb3J0cyBsZXZlbCA0NSwgYXMgbGV2ZWwgNDUgb25seSBjb3ZlcnMgbGV2ZWwgMTAKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIHNvbWUgZm9ybSBvZiBhIHNldHRpbmcgc28gaXQgZG9lcyBub3QKKyAgICAgICAgLy8gaGF2ZSB0byBiZSBoZXJlCisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSDI2MykgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbmV4dExldmVsID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdCl2LnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSAmJiBsZXZlbCA+IG5leHRMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV4dExldmVsICE9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgJiYgbmV4dExldmVsICE9IHBsLmxldmVsCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlcgorICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwTGV2ZWwobmV4dExldmVsLCAmc2RrTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIgKmNhcHMsCisgICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUpIHsKKyAgICAodm9pZClpbnRmOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnRmKCkgYXMgd2VsbCwgYnV0IGhvdyBkbyB3ZSBtYXAgdGhlbSB0bworICAgIC8vIE1lZGlhQ29kZWMgY29sb3IgZm9ybWF0cz8KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgaWYgKG1lZGlhVHlwZS5maW5kKCJ2aWRlbyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICB8fCBtZWRpYVR5cGUuZmluZCgiaW1hZ2UiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyB2ZW5kb3IgdmlkZW8gY29kZWNzIHByZWZlciBvcGFxdWUgZm9ybWF0CisgICAgICAgIGlmICh0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcik7CisgICAgICAgIC8vIGZyYW1ld29yayB2aWRlbyBlbmNvZGVycyBtdXN0IHN1cHBvcnQgc3VyZmFjZSBmb3JtYXQsIHRob3VnaCBpdCBpcyB1bmNsZWFyCisgICAgICAgIC8vIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gbWFwIGl0IGlmIGl0IGlzIG9wYXF1ZQorICAgICAgICBpZiAoZW5jb2RlciAmJiB0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFN3aXRjaCB7CisgICAgZW51bSBGbGFncyA6IHVpbnQ4X3QgeworICAgICAgICAvLyBmbGFncworICAgICAgICBJU19FTkFCTEVEID0gKDEgPDwgMCksCisgICAgICAgIEJZX0RFRkFVTFQgPSAoMSA8PCAxKSwKKyAgICB9OworCisgICAgY29uc3RleHByIFN3aXRjaCh1aW50OF90IGZsYWdzKSA6IG1GbGFncyhmbGFncykge30KKworICAgIHVpbnQ4X3QgbUZsYWdzOworCitwdWJsaWM6CisgICAgLy8gaGF2ZSB0byBjcmVhdGUgY2xhc3MgZHVlIHRvIHRoaXMgYm9vbCBjb252ZXJzaW9uIG9wZXJhdG9yLi4uCisgICAgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmxhZ3MgJiBJU19FTkFCTEVEOworICAgIH0KKworICAgIGNvbnN0ZXhwciBTd2l0Y2ggb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU3dpdGNoKG1GbGFncyBeIElTX0VOQUJMRUQpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgU3dpdGNoIERJU0FCTEVEKCkgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBFTkFCTEVEKCkgeyByZXR1cm4gSVNfRU5BQkxFRDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBESVNBQkxFRF9CWV9ERUZBVUxUKCkgeyByZXR1cm4gQllfREVGQVVMVDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBFTkFCTEVEX0JZX0RFRkFVTFQoKSB7IHJldHVybiBJU19FTkFCTEVEIHwgQllfREVGQVVMVDsgfTsKKworICAgIGNvbnN0IGNoYXIgKnRvU3RyaW5nKGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIGNvbnN0IHsKKyAgICAgICAgc3dpdGNoIChtRmxhZ3MpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIElTX0VOQUJMRUQ6ICAgICAgICAgICAgICAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgQllfREVGQVVMVDogICAgICAgICAgICAgICAgcmV0dXJuICIoMCkiOworICAgICAgICBjYXNlIElTX0VOQUJMRUQgfCBCWV9ERUZBVUxUOiAgIHJldHVybiAiKDEpIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZjsKKyAgICAgICAgfQorICAgIH0KKworfTsKKworY29uc3QgY2hhciAqYXNTdHJpbmcoY29uc3QgU3dpdGNoICZzLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgcmV0dXJuIHMudG9TdHJpbmcoZGVmKTsKK30KKworU3dpdGNoIGlzU2V0dGluZ0VuYWJsZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nIHNldHRpbmcsIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJnNldHRpbmdzLAorICAgICAgICBTd2l0Y2ggZGVmID0gU3dpdGNoOjpESVNBQkxFRF9CWV9ERUZBVUxUKCkpIHsKKyAgICBjb25zdCBhdXRvIGVuYWJsZW1lbnQgPSBzZXR0aW5ncy5maW5kKHNldHRpbmcpOworICAgIGlmIChlbmFibGVtZW50ID09IHNldHRpbmdzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorICAgIHJldHVybiBlbmFibGVtZW50LT5zZWNvbmQgPT0gIjEiID8gU3dpdGNoOjpFTkFCTEVEKCkgOiBTd2l0Y2g6OkRJU0FCTEVEKCk7Cit9CisKK1N3aXRjaCBpc1ZhcmlhbnRFbmFibGVkKAorICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYW50LCBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZzZXR0aW5ncykgeworICAgIHJldHVybiBpc1NldHRpbmdFbmFibGVkKCJ2YXJpYW50LSIgKyB2YXJpYW50LCBzZXR0aW5ncyk7Cit9CisKK1N3aXRjaCBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCgKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwLCBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZzZXR0aW5ncykgeworICAgIGlmICghZXhwLmVtcHR5KCkgJiYgZXhwLmF0KDApID09ICchJykgeworICAgICAgICByZXR1cm4gIWlzVmFyaWFudEVuYWJsZWQoZXhwLnN1YnN0cigxLCBleHAuc2l6ZSgpIC0gMSksIHNldHRpbmdzKTsKKyAgICB9CisgICAgcmV0dXJuIGlzVmFyaWFudEVuYWJsZWQoZXhwLCBzZXR0aW5ncyk7Cit9CisKK1N3aXRjaCBpc0RvbWFpbkVuYWJsZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGRvbWFpbiwgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmc2V0dGluZ3MpIHsKKyAgICByZXR1cm4gaXNTZXR0aW5nRW5hYmxlZCgiZG9tYWluLSIgKyBkb21haW4sIHNldHRpbmdzKTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdGF0dXNfdCBDb2RlYzJJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CisgICAgLy8gVE9ETzogUmVtb3ZlIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb25zIG9uY2UgYWxsIGNvZGVjcyBhcmUgd29ya2luZworICAgIC8vIHByb3Blcmx5LiAoQXNzdW1lICJmdWxsIiBiZWhhdmlvciBldmVudHVhbGx5LikKKyAgICAvLworICAgIC8vIGRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyBzdXBwb3J0cyA1IHZhbHVlcy4KKyAgICAvLyAgIDAgLSBObyBDb2RlYyAyLjAgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlLgorICAgIC8vICAgMSAtIEF1ZGlvIGRlY29kZXJzIGFuZCBlbmNvZGVycyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUKKyAgICAvLyAgICAgICBhbmQgcmFua2VkIGZpcnN0LgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSB3aXRoCisgICAgLy8gICAgICAgdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMiAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi52ZGEuIiBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsCisgICAgLy8gICAgICAgcmFua3MuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBzdWZmaXggIi5hdmMuZGVjb2RlciIgb3IgIi5hdmMuZW5jb2RlciIKKyAgICAvLyAgICAgICBhcmUgYXZhaWxhYmxlIGJ1dCByYW5rZWQgbGFzdC4KKyAgICAvLyAgIDMgLSBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSBhbmQgcmFua2VkCisgICAgLy8gICAgICAgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLyAgIDQgLSBBbGwgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgKGJvb3QgdGltZSkgaXMgMS4KKyAgICAvLworICAgIC8vIE5vdGU6IEN1cnJlbnRseSwgT01YIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgxMDAsIHdoaWxlIGFsbAorICAgIC8vIENvZGVjMi4wIHNvZnR3YXJlIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgyMDAuCisgICAgaW50IG9wdGlvbiA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIDQpOworCisgICAgLy8gT2J0YWluIENvZGVjMkNsaWVudAorICAgIHN0ZDo6dmVjdG9yPFRyYWl0cz4gdHJhaXRzID0gQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gcGFyc2UgQVBFWCBYTUwgZmlyc3QsIGZvbGxvd2VkIGJ5IHZlbmRvciBYTUwKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoCisgICAgICAgICAgICBwYXJzZXIuZ2V0RGVmYXVsdFhtbE5hbWVzKCksCisgICAgICAgICAgICB7ICIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0YyIgfSk7CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhlc2UgYzItc3BlY2lmaWMgZmlsZXMgb25jZSBwcm9kdWN0IG1vdmVkIHRvIGRlZmF1bHQgZmlsZSBuYW1lcworICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICAgICAgeyAibWVkaWFfY29kZWNzX2MyLnhtbCIsICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2VfYzIueG1sIiB9KTsKKworICAgIC8vIHBhcnNlIGRlZmF1bHQgWE1MIGZpbGVzCisgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKKworICAgIGlmIChwYXJzZXIuZ2V0UGFyc2luZ1N0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJYTUwgcGFyc2VyIG5vIGdvb2QiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgc2V0dGluZ3MgPSBwYXJzZXIuZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpOworICAgIGZvciAoY29uc3QgYXV0byAmdiA6IHNldHRpbmdzKSB7CisgICAgICAgIGlmICghaGFzUHJlZml4KHYuZmlyc3QsICJtZWRpYS10eXBlLSIpCisgICAgICAgICAgICAgICAgJiYgIWhhc1ByZWZpeCh2LmZpcnN0LCAiZG9tYWluLSIpCisgICAgICAgICAgICAgICAgJiYgIWhhc1ByZWZpeCh2LmZpcnN0LCAidmFyaWFudC0iKSkgeworICAgICAgICAgICAgd3JpdGVyLT5hZGRHbG9iYWxTZXR0aW5nKHYuZmlyc3QuY19zdHIoKSwgdi5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IFRyYWl0cyYgdHJhaXQgOiB0cmFpdHMpIHsKKyAgICAgICAgQzJDb21wb25lbnQ6OnJhbmtfdCByYW5rID0gdHJhaXQucmFuazsKKworICAgICAgICAvLyBJbnRlcmZhY2UgbXVzdCBiZSBhY2Nlc3NpYmxlIGZvciB1cyB0byBsaXN0IHRoZSBjb21wb25lbnQsIGFuZCB0aGVyZSBhbHNvCisgICAgICAgIC8vIG11c3QgYmUgYW4gWE1MIGVudHJ5IGZvciB0aGUgY29kZWMuIENvZGVjIGFsaWFzZXMgbGlzdGVkIGluIHRoZSB0cmFpdHMKKyAgICAgICAgLy8gYWxsb3cgYWRkaXRpb25hbCBYTUwgZW50cmllcyB0byBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggYWxpYXMuIFRoZXNlIHdpbGwKKyAgICAgICAgLy8gYmUgbGlzdGVkIGFzIHNlcGFyYXRlIGNvZGVjcy4gSWYgbm8gWE1MIGVudHJ5IGlzIHNwZWNpZmllZCBmb3IgYW4gYWxpYXMsCisgICAgICAgIC8vIHRob3NlIHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBhZGRpdGlvbmFsIGFsaWFzIHNwZWNpZmllZCBpbiB0aGUgWE1MIGVudHJ5CisgICAgICAgIC8vIGZvciB0aGUgaW50ZXJmYWNlIG5hbWUuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lQW5kQWxpYXNlcyA9IHRyYWl0LmFsaWFzZXM7CisgICAgICAgIG5hbWVBbmRBbGlhc2VzLmluc2VydChuYW1lQW5kQWxpYXNlcy5iZWdpbigpLCB0cmFpdC5uYW1lKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZU9yQWxpYXMgOiBuYW1lQW5kQWxpYXNlcykgeworICAgICAgICAgICAgYm9vbCBpc0FsaWFzID0gdHJhaXQubmFtZSAhPSBuYW1lT3JBbGlhczsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiA9CisgICAgICAgICAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUobmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICBpZiAoIWludGYpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY291bGQgbm90IGNyZWF0ZSBpbnRlcmZhY2UgZm9yICVzJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc0FsaWFzID8gImFsaWFzICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcnNlci5nZXRDb2RlY01hcCgpLmNvdW50KG5hbWVPckFsaWFzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQWxpYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBiYXNlQ29kZWNJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+ZmluZE1lZGlhQ29kZWNJbmZvKHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmFzZUNvZGVjSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFsaWFzICclcycgbm90IGZvdW5kIGluIHhtbCBidXQgY2Fub25pY2FsIGNvZGVjIGluZm8gJyVzJyBtaXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhbGlhcyAnJXMnIG5vdCBmb3VuZCBpbiB4bWw7IHVzZSBhbiBYTUwgPEFsaWFzPiB0YWcgZm9yIHRoaXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsaWFzIGludG8gZXhpc3RpbmcgY29kZWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDb2RlY0luZm8tPmFkZEFsaWFzKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBvbmVudCAnJXMnIG5vdCBmb3VuZCBpbiB4bWwiLCB0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhbm9uTmFtZSA9IHRyYWl0Lm5hbWU7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGJsb2NrIG9uY2UgYWxsIGNvZGVjcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLnZkYS4iKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFpdC5kb21haW4gPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmRlY29kZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZW5jb2RlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRlY2x0eXBlKHJhbmspPjo6bWF4KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLnZkYS4iKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmRlY29kZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZW5jb2RlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRlY2x0eXBlKHJhbmspPjo6bWF4KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZjb2RlYyA9CisgICAgICAgICAgICAgICAgcGFyc2VyLmdldENvZGVjTWFwKCkuYXQobmFtZU9yQWxpYXMpOworCisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBlaXRoZXIgdGhlIGNvZGVjIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCwgb3Igb25lIG9mIGl0cyBkb21haW5zIGlzCisgICAgICAgICAgICBib29sIGNvZGVjRW5hYmxlZCA9IGNvZGVjLnF1aXJrU2V0LmZpbmQoImF0dHJpYnV0ZTo6ZGlzYWJsZWQiKSA9PSBjb2RlYy5xdWlya1NldC5lbmQoKTsKKyAgICAgICAgICAgIGlmICghY29kZWNFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZG9tYWluIDogY29kZWMuZG9tYWluU2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3aXRjaCBlbmFibGVkID0gaXNEb21haW5FbmFibGVkKGRvbWFpbiwgc2V0dGluZ3MpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgZW50cnkgJyVzJyBpcyBpbiBkb21haW4gJyVzJyB0aGF0IGlzICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCksIGRvbWFpbi5jX3N0cigpLCBhc1N0cmluZyhlbmFibGVkKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBjb2RlYyBoYXMgdmFyaWFudHMsIGFsc28gY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBlbmFibGVkCisgICAgICAgICAgICBib29sIHZhcmlhbnRFbmFibGVkID0gY29kZWMudmFyaWFudFNldC5lbXB0eSgpOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmdmFyaWFudCA6IGNvZGVjLnZhcmlhbnRTZXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggZW5hYmxlZCA9IGlzVmFyaWFudEV4cHJlc3Npb25FbmFibGVkKHZhcmlhbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgZW50cnkgJyVzJyBoYXMgYSB2YXJpYW50ICclcycgdGhhdCBpcyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCksIHZhcmlhbnQuY19zdHIoKSwgYXNTdHJpbmcoZW5hYmxlZCkpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb2RlY0VuYWJsZWQgfHwgIXZhcmlhbnRFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvZGVjIGVudHJ5IGZvciAnJXMnIGlzIGRpc2FibGVkIiwgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgY29kZWMgZW50cnkgZm9yICclcyciLCBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gY29kZWNJbmZvID0gd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXROYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRPd25lcigoImNvZGVjMjo6IiArIHRyYWl0Lm93bmVyKS5jX3N0cigpKTsKKworICAgICAgICAgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJzID0gMDsKKworICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhaXQub3duZXIgPT0gInNvZnR3YXJlIikgeworICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcjsKKyAgICAgICAgICAgICAgICBpZiAodHJhaXQub3duZXIgPT0gInZlbmRvci1zb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlYy5xdWlya1NldC5maW5kKCJhdHRyaWJ1dGU6OnNvZnR3YXJlLWNvZGVjIikKKyAgICAgICAgICAgICAgICAgICAgICAgID09IGNvZGVjLnF1aXJrU2V0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldEF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgaWYgKCFjb2RlYy5yYW5rLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB4bWxSYW5rOworICAgICAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihjb2RlYy5yYW5rLmNfc3RyKCksICIldSVjIiwgJnhtbFJhbmssICZkdW1teSkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0geG1sUmFuazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigicmFuazogJXUiLCAodW5zaWduZWQpcmFuayk7CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldFJhbmsocmFuayk7CisKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJmFsaWFzIDogY29kZWMuYWxpYXNlcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgYWxpYXMgJyVzJyIsIGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvZGVjSW5mby0+YWRkQWxpYXMoYWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoYXV0byB0eXBlSXQgPSBjb2RlYy50eXBlTWFwLmJlZ2luKCk7IHR5cGVJdCAhPSBjb2RlYy50eXBlTWFwLmVuZCgpOyArK3R5cGVJdCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUgPSB0eXBlSXQtPmZpcnN0OworICAgICAgICAgICAgICAgIGNvbnN0IFN3aXRjaCB0eXBlRW5hYmxlZCA9IGlzU2V0dGluZ0VuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEtdHlwZS0iICsgbWVkaWFUeXBlLCBzZXR0aW5ncywgU3dpdGNoOjpFTkFCTEVEX0JZX0RFRkFVTFQoKSk7CisgICAgICAgICAgICAgICAgY29uc3QgU3dpdGNoIGRvbWFpblR5cGVFbmFibGVkID0gaXNTZXR0aW5nRW5hYmxlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS10eXBlLSIgKyBtZWRpYVR5cGUgKyAoZW5jb2RlciA/ICItZW5jb2RlciIgOiAiLWRlY29kZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLCBTd2l0Y2g6OkVOQUJMRURfQllfREVGQVVMVCgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidHlwZSAnJXMtJXMnIGlzICclcy8lcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmNfc3RyKCksIChlbmNvZGVyID8gImVuY29kZXIiIDogImRlY29kZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHR5cGVFbmFibGVkKSwgYXNTdHJpbmcoZG9tYWluVHlwZUVuYWJsZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXR5cGVFbmFibGVkIHx8ICFkb21haW5UeXBlRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgibWVkaWEgdHlwZSAnJXMnIGZvciBjb2RlYyBlbnRyeSAnJXMnIGlzIGRpc2FibGVkIiwgbWVkaWFUeXBlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dJKCJhZGRpbmcgdHlwZSAnJXMnIiwgdHlwZUl0LT5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZhdHRyTWFwID0gdHlwZUl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZE1lZGlhVHlwZShtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ2IDogYXR0ck1hcCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBrZXkgPSB2LmZpcnN0OworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IHYuc2Vjb25kOworCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJpYW50U2VwID0ga2V5LmZpbmQoIjo6OiIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudFNlcCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFudCA9IGtleS5zdWJzdHIoMCwgdmFyaWFudFNlcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggZW5hYmxlZCA9IGlzVmFyaWFudEV4cHJlc3Npb25FbmFibGVkKHZhcmlhbnQsIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2YXJpYW50ICclcycgaXMgJyVzJyIsIHZhcmlhbnQuY19zdHIoKSwgYXNTdHJpbmcoZW5hYmxlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyKHZhcmlhbnRTZXAgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZmluZCgiZmVhdHVyZS0iKSA9PSAwICYmIGtleS5maW5kKCJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludFZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0cmFpbGluZyBiYWQgY2hhcmFjdGVycyBhbmQgZGVmYXVsdCB0byAwLgorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpc3NjYW5mKHZhbHVlLmNfc3RyKCksICIlZCIsICZpbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIGludFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpOworICAgICAgICAgICAgICAgIGFkZFN1cHBvcnRlZENvbG9yRm9ybWF0cyhpbnRmLCBjYXBzLmdldCgpLCB0cmFpdCwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSAqQ3JlYXRlQnVpbGRlcigpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OkNvZGVjMkluZm9CdWlsZGVyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0lORk9fQlVJTERFUl9IXworI2RlZmluZSBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENvZGVjMkluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworcHVibGljOgorICAgIENvZGVjMkluZm9CdWlsZGVyKCkgPSBkZWZhdWx0OworICAgIH5Db2RlYzJJbmZvQnVpbGRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSU5GT19CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM1NzYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisjZGVmaW5lIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwcGVyIGludGVyZmFjZSBhcm91bmQgSW5wdXRTdXJmYWNlLgorICovCitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBJbnB1dFN1cmZhY2VXcmFwcGVyKCkKKyAgICAgICAgOiBtRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgIH0KKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRoZSBzdXJmYWNlIHdpdGggfGNvbXB8LiBBIHN1cmZhY2UgY2FuCisgICAgICogY29ubmVjdCB0byBhdCBtb3N0IG9uZSBjb21wb25lbnQgYXQgYSB0aW1lLgorICAgICAqCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gfGNvbXB8CisgICAgICogXHJldHVybiBBTFJFQURZX0VYSVNUUyAgIGFscmVhZHkgY29ubmVjdGVkIHRvIGFub3RoZXIgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApID0gMDsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgdGhlIHN1cmZhY2UgZnJvbSB0aGUgY29tcG9uZW50IGlmIGFueS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHB1c2hpbmcgYnVmZmVycyB0byB0aGUgc3VyZmFjZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVmOiBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKKworICAgIC8vLyBJbnB1dCBTdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICBzdHJ1Y3QgQ29uZmlnIHsKKyAgICAgICAgLy8gSU4gUEFSQU1TIChHQlMpCisgICAgICAgIGZsb2F0IG1NaW5GcHM7IC8vIG1pbmltdW0gZnBzIChyZXBlYXQgZnJhbWUgdG8gYWNoaWV2ZSB0aGlzKQorICAgICAgICBmbG9hdCBtTWF4RnBzOyAvLyBtYXggZnBzICh2aWEgZnJhbWUgZHJvcCkKKyAgICAgICAgZmxvYXQgbUNhcHR1cmVGcHM7IC8vIGNhcHR1cmUgZnBzCisgICAgICAgIGZsb2F0IG1Db2RlZEZwczsgICAvLyBjb2RlZCBmcHMKKyAgICAgICAgYm9vbCBtU3VzcGVuZGVkOyAvLyBzdXNwZW5kZWQKKyAgICAgICAgaW50NjRfdCBtVGltZU9mZnNldFVzOyAvLyB0aW1lIG9mZnNldCAoaW5wdXQgPT4gY29kZWMpCisgICAgICAgIGludDY0X3QgbVN1c3BlbmRBdFVzOyAvLyBzdXNwZW5kL3Jlc3VtZSB0aW1lCisgICAgICAgIGludDY0X3QgbVN0YXJ0QXRVczsgLy8gc3RhcnQgdGltZQorICAgICAgICBib29sIG1TdG9wcGVkOyAvLyBzdG9wcGVkCisgICAgICAgIGludDY0X3QgbVN0b3BBdFVzOyAvLyBzdG9wIHRpbWUKKworICAgICAgICAvLyBPVVQgUEFSQU1TIChHQlMpCisgICAgICAgIGludDY0X3QgbUlucHV0RGVsYXlVczsgLy8gZGVsYXkgYmV0d2VlbiBlbmNvZGVyIGlucHV0IGFuZCBzdXJmYWNlIGlucHV0CisKKyAgICAgICAgLy8gSU4gUEFSQU1TIChDT0RFQyBXUkFQUEVSKQorICAgICAgICBmbG9hdCBtRml4ZWRBZGp1c3RlZEZwczsgLy8gZml4ZWQgZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIGZsb2F0IG1NaW5BZGp1c3RlZEZwczsgLy8gbWluaW11bSBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICAgICAgdWludDY0X3QgbVVzYWdlOyAvLyBjb25zdW1lciB1c2FnZQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGlucHV0IHN1cmZhY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gY29uZmlnIGNvbmZpZ3VyYXRpb24uIFRoaXMgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHRoaXMgY2FsbCB0byBwcm92aWRlIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycywgYnV0IG5vdCB0byBwcm92aWRlIGNvbmZpZ3VyZWQgcGFyYW1ldGVycyAodG8gYXZvaWQgY29udGludWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgIHJlY29uZmlndXJpbmcpCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpID0gMDsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgZGVzaXJlZCBkYXRhIHNwYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGFTcGFjZSBkZXNpcmVkIGRhdGEgc3BhY2UKKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXREYXRhU3BhY2UoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYW4gdXAgQzJXb3JrIHJlbGF0ZWQgcmVmZXJlbmNlcyBpZiBuZWNlc3NhcnkuIE5vLW9wIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggaW5kZXggb2YgaW5wdXQgd29yay4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoYzJfY250cjY0X3QgLyogaW5kZXggKi8pIHt9CisKK3Byb3RlY3RlZDoKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9PbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL09teDJJR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0ZmEwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9PbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSAiT214MklHcmFwaGljQnVmZmVyU291cmNlLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBPbXhHcmFwaGljQnVmZmVyU291cmNlIC0+IElPTVhCdWZmZXJTb3VyY2UKKworc3RydWN0IE9teEdiczJJT214QnMgOiBwdWJsaWMgQm5PTVhCdWZmZXJTb3VyY2UgeworICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOworICAgIE9teEdiczJJT214QnMoc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpIDogbUJhc2V7YmFzZX0ge30KKyAgICBCblN0YXR1cyBvbk9teEV4ZWN1dGluZygpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5vbk9teEV4ZWN1dGluZygpOworICAgIH0KKyAgICBCblN0YXR1cyBvbk9teElkbGUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+b25PbXhJZGxlKCk7CisgICAgfQorICAgIEJuU3RhdHVzIG9uT214TG9hZGVkKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPm9uT214TG9hZGVkKCk7CisgICAgfQorICAgIEJuU3RhdHVzIG9uSW5wdXRCdWZmZXJBZGRlZChpbnQzMl90IGJ1ZmZlcklkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGJ1ZmZlcklkKTsKKyAgICB9CisgICAgQm5TdGF0dXMgb25JbnB1dEJ1ZmZlckVtcHRpZWQoCisgICAgICAgICAgICBpbnQzMl90IGJ1ZmZlcklkLAorICAgICAgICAgICAgT01YRmVuY2VQYXJjZWxhYmxlIGNvbnN0JiBmZW5jZVBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCBmZW5jZVBhcmNlbC5nZXQoKSk7CisgICAgfQorfTsKKworc3RydWN0IE9teE5vZGVXcmFwcGVyIDogcHVibGljIElPbXhOb2RlV3JhcHBlciB7CisgICAgc3A8SU9NWE5vZGU+IG1CYXNlOworICAgIE9teE5vZGVXcmFwcGVyKHNwPElPTVhOb2RlPiBjb25zdCYgYmFzZSkgOiBtQmFzZXtiYXNlfSB7fQorICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+ZW1wdHlCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCk7CisgICAgfQorICAgIHZvaWQgZGlzcGF0Y2hEYXRhU3BhY2VDaGFuZ2VkKAorICAgICAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsIGludDMyX3QgYXNwZWN0cywgaW50MzJfdCBwaXhlbEZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICBvbXhfbWVzc2FnZSBtc2d7fTsKKyAgICAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RVZFTlQ7CisgICAgICAgIG1zZy5mZW5jZUZkID0gLTE7CisgICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZXZlbnQgPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkOworICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGExID0gZGF0YVNwYWNlOworICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGEyID0gYXNwZWN0czsKKyAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMyA9IHBpeGVsRm9ybWF0OworICAgICAgICBtQmFzZS0+ZGlzcGF0Y2hNZXNzYWdlKG1zZyk7CisgICAgfQorfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UKK09teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6T214MklHcmFwaGljQnVmZmVyU291cmNlKAorICAgICAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCYgYmFzZSkKKyAgICAgIDogbUJhc2V7YmFzZX0sCisgICAgICAgIG1PTVhCdWZmZXJTb3VyY2V7bmV3IE9teEdiczJJT214QnMoYmFzZSl9IHsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdXNwZW5kKAorICAgICAgICBib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3VzcGVuZChzdXNwZW5kLCB0aW1lVXMpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKKyAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMocmVwZWF0QWZ0ZXJVcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldE1heEZwcyhmbG9hdCBtYXhGcHMpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRNYXhGcHMobWF4RnBzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlQ29uZmlnKAorICAgICAgICBkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFRpbWVMYXBzZUNvbmZpZyhmcHMsIGNhcHR1cmVGcHMpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdGFydFRpbWVVcygKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN0YXJ0VGltZVVzKHN0YXJ0VGltZVVzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3RvcFRpbWVVcygKKyAgICAgICAgaW50NjRfdCBzdG9wVGltZVVzKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3RvcFRpbWVVcyhzdG9wVGltZVVzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0U3RvcFRpbWVPZmZzZXRVcygKKyAgICAgICAgaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoc3RvcFRpbWVPZmZzZXRVcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldENvbG9yQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBhc3BlY3RzKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0Q29sb3JBc3BlY3RzKGFzcGVjdHMpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lT2Zmc2V0VXMoCisgICAgICAgIGludDY0X3QgdGltZU9mZnNldHNVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFRpbWVPZmZzZXRVcyh0aW1lT2Zmc2V0c1VzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgeworICAgIGlmIChvbXhOb2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvLyBEbyBzZXRJbnB1dFN1cmZhY2UoKSBmaXJzdCwgdGhlIG5vZGUgd2lsbCB0cnkgdG8gZW5hYmxlIG1ldGFkYXRhCisgICAgLy8gbW9kZSBvbiBpbnB1dCwgYW5kIGRvZXMgbmVjZXNzYXJ5IGVycm9yIGNoZWNraW5nLiBJZiB0aGlzIGZhaWxzLAorICAgIC8vIHdlIGNhbid0IHVzZSB0aGlzIGlucHV0IHN1cmZhY2Ugb24gdGhlIG5vZGUuCisgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+c2V0SW5wdXRTdXJmYWNlKG1PTVhCdWZmZXJTb3VyY2UpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOworICAgIH0KKworICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2U7CisgICAgaWYgKG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAmY29uc3VtZXJVc2FnZSwgc2l6ZW9mKGNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgICAgICBjb25zdW1lclVzYWdlID0gMDsKKyAgICB9CisKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsgLy8ga1BvcnRJbmRleElucHV0CisKKyAgICBlcnIgPSBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwb3J0IGRlZmluaXRpb246ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgfQorCisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgbmV3IE9teE5vZGVXcmFwcGVyKG9teE5vZGUpLAorICAgICAgICAgICAgZGF0YVNwYWNlLAorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vT214MklHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vT214MklHcmFwaGljQnVmZmVyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmZDFlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9PbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9NWF8yX0lHUkFQSElDQlVGRkVSU09VUkNFX0hfCisjZGVmaW5lIE9NWF8yX0lHUkFQSElDQlVGRkVSU09VUkNFX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL0JuR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgQm5TdGF0dXMgPSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOworCitzdHJ1Y3QgT214MklHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJuR3JhcGhpY0J1ZmZlclNvdXJjZSB7CisgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gbUJhc2U7CisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gbU9NWEJ1ZmZlclNvdXJjZTsKKyAgICBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2Uoc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpOworICAgIEJuU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRTdXNwZW5kKGJvb2wgc3VzcGVuZCwgaW50NjRfdCB0aW1lVXMpIG92ZXJyaWRlOworICAgIEJuU3RhdHVzIHNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0TWF4RnBzKGZsb2F0IG1heEZwcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0VGltZUxhcHNlQ29uZmlnKGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRTdGFydFRpbWVVcyhpbnQ2NF90IHN0YXJ0VGltZVVzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgZ2V0U3RvcFRpbWVPZmZzZXRVcyhpbnQ2NF90ICpzdG9wVGltZU9mZnNldFVzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRUaW1lT2Zmc2V0VXMoaW50NjRfdCB0aW1lT2Zmc2V0c1VzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBPTVhfMl9JR1JBUEhJQ0JVRkZFUlNPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDE0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQaXBlbGluZVdhdGNoZXIiCisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtSW5wdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtUGlwZWxpbmVEZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6Om91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbU91dHB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6c21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIG1TbW9vdGhuZXNzRmFjdG9yID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrUXVldWVkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+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+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGRmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA1IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyRGVidWcuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAiLAorICAgICAgICAidXRpbC9DMlBhcmFtVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgY29tcG9uZW50cworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyIsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsIC8vIGZvciBDMl9MT0cKKyAgICAgICAgImxpYmxvZyIsIC8vIGZvciBBTE9HCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBmcmFtZXdvcmsgdXRpbGl0aWVzCisvLyBUSElTIElTIE9OTFkgRk9SIEZSQU1FV09SSyBVU0UgT05MWQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaW50ZXJuYWwtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwgLy8gZm9yIHByb3BlcnRpZXMKKyAgICBdLAorCisgICAgLy8gVE9ETzogc2VwYXJhdGUgaW50ZXJuYWwgaGVhZGVycyBzbyB0aGV5IGNhbiBiZSBleHBvc2VkIGhlcmUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5N2U2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKQEAgLTAsMCArMSwxMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvckdyYWxsb2MiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2FsbG9jYXRvci8yLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvbWFwcGVyLzIuMC9JTWFwcGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9hbGxvY2F0b3IvMy4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL21hcHBlci8zLjAvSU1hcHBlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKyAgICBlbnVtIDogdWludDY0X3QgeworICAgICAgICAvKioKKyAgICAgICAgICogVXNhZ2UgbWFzayB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIGZyb20gZ3JhbGxvYyB0byBDb2RlYyAyLjAgdXNhZ2UuCisgICAgICAgICAqLworICAgICAgICBQQVNTVEhST1VHSF9VU0FHRV9NQVNLID0KKyAgICAgICAgICAgIH4oR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0sgfCBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkKKyAgICB9OworCisgICAgLy8gdmVyaWZ5IHRoYXQgcGFzc3Rocm91Z2ggbWFzayBpcyB3aXRoaW4gdGhlIHBsYXRmb3JtIG1hc2sKKyAgICBzdGF0aWNfYXNzZXJ0KCh+QzJNZW1vcnlVc2FnZTo6UExBVEZPUk1fTUFTSyAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spID09IDAsICIiKTsKK30gLy8gdW5uYW1lZAorCitDMk1lbW9yeVVzYWdlIEMyQW5kcm9pZE1lbW9yeVVzYWdlOjpGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKSB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiBDMk1lbW9yeVVzYWdlKAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpID8gQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAodXNhZ2UgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VpbnQ2NF90IEMyQW5kcm9pZE1lbW9yeVVzYWdlOjphc0dyYWxsb2NVc2FnZSgpIGNvbnN0IHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuICgoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgPyBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOIDogMCkgfAorICAgICAgICAgICAgKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEKSA/IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKGV4cGVjdGVkICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6QnVmZmVyVXNhZ2U7Cit1c2luZyBQaXhlbEZvcm1hdDIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKK3VzaW5nIFBpeGVsRm9ybWF0MyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzI6OlBpeGVsRm9ybWF0OworCit1c2luZyBJQWxsb2NhdG9yMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjphbGxvY2F0b3I6OlYyXzA6OklBbGxvY2F0b3I7Cit1c2luZyBCdWZmZXJEZXNjcmlwdG9yMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkJ1ZmZlckRlc2NyaXB0b3I7Cit1c2luZyBFcnJvcjIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpFcnJvcjsKK3VzaW5nIElNYXBwZXIyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6SU1hcHBlcjsKKwordXNpbmcgSUFsbG9jYXRvcjMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YWxsb2NhdG9yOjpWM18wOjpJQWxsb2NhdG9yOwordXNpbmcgQnVmZmVyRGVzY3JpcHRvcjMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWM18wOjpCdWZmZXJEZXNjcmlwdG9yOwordXNpbmcgRXJyb3IzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjNfMDo6RXJyb3I7Cit1c2luZyBJTWFwcGVyMyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYzXzA6OklNYXBwZXI7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvMiB7CisgICAgSU1hcHBlcjI6OkJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1hcHBlckluZm87CisgICAgdWludDMyX3Qgc3RyaWRlOworfTsKKworc3RydWN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvMyB7CisgICAgSU1hcHBlcjM6OkJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1hcHBlckluZm87CisgICAgdWludDMyX3Qgc3RyaWRlOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjMl9zdGF0dXNfdCBtYXBlcnIyZXJyb3IoRXJyb3IyIG1hcGVycikgeworICAgIHN3aXRjaCAobWFwZXJyKSB7CisgICAgICAgIGNhc2UgRXJyb3IyOjpOT05FOiAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIEVycm9yMjo6QkFEX0RFU0NSSVBUT1I6IHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3IyOjpCQURfQlVGRkVSOiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjI6OkJBRF9WQUxVRTogICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yMjo6Tk9fUkVTT1VSQ0VTOiAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIGNhc2UgRXJyb3IyOjpVTlNVUFBPUlRFRDogICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgbWFwZXJyMmVycm9yKEVycm9yMyBtYXBlcnIpIHsKKyAgICBzd2l0Y2ggKG1hcGVycikgeworICAgICAgICBjYXNlIEVycm9yMzo6Tk9ORTogICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBFcnJvcjM6OkJBRF9ERVNDUklQVE9SOiByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yMzo6QkFEX0JVRkZFUjogICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3IzOjpCQURfVkFMVUU6ICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjM6Ok5PX1JFU09VUkNFUzogICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICBjYXNlIEVycm9yMzo6VU5TVVBQT1JURUQ6ICAgIHJldHVybiBDMl9DQU5OT1RfRE87CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2Jvb2wgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlKSB7CisgICAgLy8gcGVyZm9ybSBiYXNpYyB2YWxpZGF0aW9uIG9mIGEgbmF0aXZlIGhhbmRsZQorICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBudWxsIGhhbmRsZSBpcyBjb25zaWRlcmVkIHZhbGlkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICgoc2l6ZV90KWhhbmRsZS0+dmVyc2lvbiAhPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KSB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPCAwIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPCAwIHx8CisgICAgICAgICAgICAvLyBmb3Igc2FuaXR5IGFzc3VtZSBoYW5kbGVzIG11c3Qgb2NjdXB5IGxlc3MgbWVtb3J5IHRoYW4gSU5UX01BWCBieXRlcworICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gaGFuZGxlLT5udW1JbnRzKTsKK30KKworY2xhc3MgQzJIYW5kbGVHcmFsbG9jIDogcHVibGljIEMySGFuZGxlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IEV4dHJhRGF0YSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfbG87CisgICAgICAgIHVpbnQzMl90IHVzYWdlX2hpOworICAgICAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfbG87CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfaGk7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICAgICAgdWludDMyX3QgbWFnaWM7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBOVU1fSU5UUyA9IHNpemVvZihFeHRyYURhdGEpIC8gc2l6ZW9mKGludCksCisgICAgfTsKKyAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFHSUMgPSAnXHhjMmdyXHgwMCc7CisKKyAgICBzdGF0aWMKKyAgICBjb25zdCBFeHRyYURhdGEqIGdldEV4dHJhRGF0YShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgIHx8IG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpCisgICAgICAgICAgICAgICAgfHwgaGFuZGxlLT5udW1JbnRzIDwgTlVNX0lOVFMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEV4dHJhRGF0YSo+KAorICAgICAgICAgICAgICAgICZoYW5kbGUtPmRhdGFbaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UU10pOworICAgIH0KKworICAgIHN0YXRpYworICAgIEV4dHJhRGF0YSAqZ2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KGdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOworICAgIH0KKworcHVibGljOgorICAgIHZvaWQgZ2V0SWdicERhdGEodWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSBjb25zdCB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEodGhpcyk7CisgICAgICAgICpnZW5lcmF0aW9uID0gZWQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoZWQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoZWQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKKyAgICAgICAgKmlnYnBfc2xvdCA9IGVkLT5pZ2JwX3Nsb3Q7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqY29uc3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxscHRyKSB7IC8vIG51bGwgaGFuZGxlIGlzIGFsd2F5cyB2YWxpZAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShvKTsKKyAgICAgICAgLy8gd2UgY2Fubm90IHZhbGlkYXRlIHdpZHRoL2hlaWdodC9mb3JtYXQvdXNhZ2Ugd2l0aG91dCBhY2Nlc3NpbmcgZ3JhbGxvYyBkcml2ZXIKKyAgICAgICAgcmV0dXJuIHhkICE9IG51bGxwdHIgJiYgeGQtPm1hZ2ljID09IE1BR0lDOworICAgIH0KKworICAgIHN0YXRpYyBDMkhhbmRsZUdyYWxsb2MqIFdyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCkgeworICAgICAgICAvL0NIRUNLKGhhbmRsZSAhPSBudWxscHRyKTsKKyAgICAgICAgaWYgKG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gTlVNX0lOVFMgLSBoYW5kbGUtPm51bUZkcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgRXh0cmFEYXRhIHhkID0geworICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1aW50MzJfdCh1c2FnZSAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdCh1c2FnZSA+PiAzMiksCisgICAgICAgICAgICBzdHJpZGUsIGdlbmVyYXRpb24sIHVpbnQzMl90KGlnYnBfaWQgJiAweEZGRkZGRkZGKSwgdWludDMyX3QoaWdicF9pZCA+PiAzMiksCisgICAgICAgICAgICBpZ2JwX3Nsb3QsIE1BR0lDCisgICAgICAgIH07CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyArIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAoaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMpKTsKKyAgICAgICAgICAgICpnZXRFeHRyYURhdGEocmVzKSA9IHhkOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEMySGFuZGxlR3JhbGxvYyAqPihyZXMpOworICAgIH0KKworICAgIHN0YXRpYyBDMkhhbmRsZUdyYWxsb2MqIFdyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjbG9uZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoaGFuZGxlKTsKKyAgICAgICAgaWYgKGNsb25lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIEMySGFuZGxlR3JhbGxvYyAqcmVzID0gV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgY2xvbmUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICAgICAgaWYgKHJlcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGNsb25lKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjbG9uZSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgTWlncmF0ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0ciB8fCAhaXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgRXh0cmFEYXRhICplZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoIWVkKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGVkLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgZWQtPmlnYnBfaWRfbG8gPSB1aW50MzJfdChpZ2JwX2lkICYgMHhGRkZGRkZGRik7CisgICAgICAgIGVkLT5pZ2JwX2lkX2hpID0gdWludDMyX3QoaWdicF9pZCA+PiAzMik7CisgICAgICAgIGVkLT5pZ2JwX3Nsb3QgPSBpZ2JwX3Nsb3Q7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogVW53cmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChyZXMtPm51bUZkcyArIHJlcy0+bnVtSW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IEMySGFuZGxlR3JhbGxvYyogSW1wb3J0KAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqd2lkdGggPSB4ZC0+d2lkdGg7CisgICAgICAgICpoZWlnaHQgPSB4ZC0+aGVpZ2h0OworICAgICAgICAqZm9ybWF0ID0geGQtPmZvcm1hdDsKKyAgICAgICAgKnVzYWdlID0geGQtPnVzYWdlX2xvIHwgKHVpbnQ2NF90KHhkLT51c2FnZV9oaSkgPDwgMzIpOworICAgICAgICAqc3RyaWRlID0geGQtPnN0cmlkZTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSB4ZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB4ZC0+aWdicF9pZF9sbyB8ICh1aW50NjRfdCh4ZC0+aWdicF9pZF9oaSkgPDwgMzIpOworICAgICAgICAqaWdicF9zbG90ID0geGQtPmlnYnBfc2xvdDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGVHcmFsbG9jICo+KGhhbmRsZSk7CisgICAgfQorfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUpOworfQorCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQsIHVpbnQzMl90IGlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitib29sIE1pZ3JhdGVOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6TWlncmF0ZU5hdGl2ZUhhbmRsZShoYW5kbGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKKworY2xhc3MgQzJBbGxvY2F0aW9uR3JhbGxvYyA6IHB1YmxpYyBDMkdyYXBoaWNBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25HcmFsbG9jKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1BbGxvY2F0b3JJZDsgfQorICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Mb2NrZWRIYW5kbGUgPyA6IG1IYW5kbGU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kcworICAgIC8vIHxoYW5kbGV8IHdpbGwgYmUgbW92ZWQuCisgICAgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8yICZpbmZvLAorICAgICAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyMj4gJm1hcHBlciwKKyAgICAgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCk7CisgICAgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8zICZpbmZvLAorICAgICAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyMz4gJm1hcHBlciwKKyAgICAgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCk7CisgICAgaW50IGR1cCgpIGNvbnN0OworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvMiBtSW5mbzJ7fTsKKyAgICBjb25zdCBzcDxJTWFwcGVyMj4gbU1hcHBlcjJ7bnVsbHB0cn07CisgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8zIG1JbmZvM3t9OworICAgIGNvbnN0IHNwPElNYXBwZXIzPiBtTWFwcGVyM3tudWxscHRyfTsKKyAgICBjb25zdCBoaWRsX2hhbmRsZSBtSGlkbEhhbmRsZTsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1IYW5kbGU7CisgICAgYnVmZmVyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptTG9ja2VkSGFuZGxlOworICAgIGJvb2wgbUxvY2tlZDsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtQWxsb2NhdG9ySWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6OkMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8yICZpbmZvLAorICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXIyPiAmbWFwcGVyLAorICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKQorICAgIDogQzJHcmFwaGljQWxsb2NhdGlvbihpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQpLAorICAgICAgbUluZm8yKGluZm8pLAorICAgICAgbU1hcHBlcjIobWFwcGVyKSwKKyAgICAgIG1IaWRsSGFuZGxlKHN0ZDo6bW92ZShoaWRsSGFuZGxlKSksCisgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICBtQnVmZmVyKG51bGxwdHIpLAorICAgICAgbUxvY2tlZEhhbmRsZShudWxscHRyKSwKKyAgICAgIG1Mb2NrZWQoZmFsc2UpLAorICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSB7Cit9CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6OkMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8zICZpbmZvLAorICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXIzPiAmbWFwcGVyLAorICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKQorICAgIDogQzJHcmFwaGljQWxsb2NhdGlvbihpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQpLAorICAgICAgbUluZm8zKGluZm8pLAorICAgICAgbU1hcHBlcjMobWFwcGVyKSwKKyAgICAgIG1IaWRsSGFuZGxlKHN0ZDo6bW92ZShoaWRsSGFuZGxlKSksCisgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICBtQnVmZmVyKG51bGxwdHIpLAorICAgICAgbUxvY2tlZEhhbmRsZShudWxscHRyKSwKKyAgICAgIG1Mb2NrZWQoZmFsc2UpLAorICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSB7Cit9CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6On5DMkFsbG9jYXRpb25HcmFsbG9jKCkgeworICAgIGlmIChtQnVmZmVyICYmIG1Mb2NrZWQpIHsKKyAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gaWdub3JlcyBhZGRyZXNzcyBhbmQgcmVjdAorICAgICAgICB1aW50OF90KiBhZGRyW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU10gPSB7fTsKKyAgICAgICAgdW5tYXAoYWRkciwgQzJSZWN0KCksIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgICAgIGlmICghbU1hcHBlcjItPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBmcmVlQnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1NYXBwZXIzLT5mcmVlQnVmZmVyKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyKSkuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogZnJlZUJ1ZmZlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+KG1IYW5kbGUpKSk7CisgICAgfQorICAgIGlmIChtTG9ja2VkSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QgKj4obUxvY2tlZEhhbmRsZSkpKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6Om1hcCgKKyAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoIm1hcHBpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIC8vIFRPRE8KKyAgICAodm9pZCkgZmVuY2U7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICBBTE9HRCgiYWxyZWFkeSBtYXBwZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICB9CisgICAgaWYgKCFsYXlvdXQgfHwgIWFkZHIpIHsKKyAgICAgICAgQUxPR0QoIndyb25nIHBhcmFtIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICAgICAgaWYgKCFtTWFwcGVyMi0+aW1wb3J0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtSGlkbEhhbmRsZSwgWyZlcnIsIHRoaXNdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gc3RhdGljX2Nhc3Q8YnVmZmVyX2hhbmRsZV90PihidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBpbXBvcnRCdWZmZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtTWFwcGVyMy0+aW1wb3J0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtSGlkbEhhbmRsZSwgWyZlcnIsIHRoaXNdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gc3RhdGljX2Nhc3Q8YnVmZmVyX2hhbmRsZV90PihidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBpbXBvcnRCdWZmZXIgKEAzLjApIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiaW1wb3J0QnVmZmVyIHJldHVybmVkIG51bGwgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICB1aW50NjRfdCBpZ2JwX2lkID0gMDsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90ID0gMDsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG1IYW5kbGUtPmdldElnYnBEYXRhKCZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NYXBwZXIyKSB7CisgICAgICAgICAgICBtTG9ja2VkSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8yLm1hcHBlckluZm8ud2lkdGgsIG1JbmZvMi5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvMi5tYXBwZXJJbmZvLmZvcm1hdCwgbUluZm8yLm1hcHBlckluZm8udXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIG1JbmZvMi5zdHJpZGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTG9ja2VkSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8zLm1hcHBlckluZm8ud2lkdGgsIG1JbmZvMy5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvMy5tYXBwZXJJbmZvLmZvcm1hdCwgbUluZm8zLm1hcHBlckluZm8udXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIG1JbmZvMy5zdHJpZGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQaXhlbEZvcm1hdDMgZm9ybWF0ID0gbU1hcHBlcjIgPworICAgICAgICAgICAgUGl4ZWxGb3JtYXQzKG1JbmZvMi5tYXBwZXJJbmZvLmZvcm1hdCkgOgorICAgICAgICAgICAgUGl4ZWxGb3JtYXQzKG1JbmZvMy5tYXBwZXJJbmZvLmZvcm1hdCk7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDM6OlJHQkFfMTAxMDEwMjogeworICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCisgICAgICAgICAgICAvLyBTdXJmYWNlLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgUkdCQS4gV2UgZG9uJ3Qga25vdyB3aGljaCBjYXNlIGl0IGlzIGhlcmUsIHNvCisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFlVViBmb3Igbm93LgorICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1NYXBwZXIyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzEwMTAxMDIpIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1NYXBwZXIzLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyUGl4ZWwsIGludDMyX3QgYnl0ZXNQZXJTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClieXRlc1BlclBpeGVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWJ5dGVzUGVyU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgfSkuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soUkdCQV8xMDEwMTAyKSAoQDMuMCkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRyZWF0IGFzIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQTsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSA9IG1NYXBwZXIyID8KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdChtSW5mbzIuc3RyaWRlKSA6CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QobUluZm8zLnN0cmlkZSk7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9BLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDM6OlJHQkFfODg4ODoKKyAgICAgICAgICAgIC8vIFRPRE86IGFscGhhIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0Mzo6UkdCWF84ODg4OiB7CisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjItPmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrKFJHQkFfODg4OCkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjMtPmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJQaXhlbCwgaW50MzJfdCBieXRlc1BlclN0cmlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWJ5dGVzUGVyUGl4ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpYnl0ZXNQZXJTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzg4ODgpIChAMy4wKSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9ICh1aW50OF90ICopcG9pbnRlciArIDE7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9ICh1aW50OF90ICopcG9pbnRlciArIDI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAxOworICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBtTWFwcGVyMiA/CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QobUluZm8yLnN0cmlkZSkgOgorICAgICAgICAgICAgICAgICAgICBpbnQzMl90KG1JbmZvMy5zdHJpZGUpOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0csICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0Mzo6WUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0Mzo6WVYxMjoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBzdHJ1Y3QgWUNiQ3JMYXlvdXQgeworICAgICAgICAgICAgICAgIHZvaWQqIHk7CisgICAgICAgICAgICAgICAgdm9pZCogY2I7CisgICAgICAgICAgICAgICAgdm9pZCogY3I7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeVN0cmlkZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjU3RyaWRlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNocm9tYVN0ZXA7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgWUNiQ3JMYXlvdXQgeWNiY3JMYXlvdXQ7CisgICAgICAgICAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1NYXBwZXIyLT5sb2NrWUNiQ3IoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnljYmNyTGF5b3V0XShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQgPSBZQ2JDckxheW91dHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQuY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC55U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jaHJvbWFTdGVwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9ja1lDYkNyIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1NYXBwZXIzLT5sb2NrWUNiQ3IoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnljYmNyTGF5b3V0XShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQgPSBZQ2JDckxheW91dHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQuY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC55U3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jaHJvbWFTdGVwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9ja1lDYkNyIChAMy4wKSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9ja1lDYkNyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQueTsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jYjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jcjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC55U3RyaWRlLCAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY1N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRlcmxlYXZlZCBmb3JtYXRzCisgICAgICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ub2Zmc2V0ID0gdXZPZmZzZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC0oaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCkgeworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTG9ja2VkID0gdHJ1ZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6dW5tYXAoCisgICAgICAgIHVpbnQ4X3QgKiphZGRyLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIHsKKyAgICAvLyBUT0RPOiBjaGVjayBhZGRyIGFuZCBzaXplLCB1c2UgZmVuY2UKKyAgICAodm9pZClhZGRyOworICAgICh2b2lkKXJlY3Q7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKG1NYXBwZXIyKSB7CisgICAgICAgIGlmICghbU1hcHBlcjItPnVubG9jaygKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICBbJmVyciwgJmZlbmNlXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnJlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHJlbGVhc2VGZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IHVubG9jayIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbU1hcHBlcjMtPnVubG9jaygKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICBbJmVyciwgJmZlbmNlXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnJlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHJlbGVhc2VGZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IHVubG9jayAoQDMuMCkiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBtTG9ja2VkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uR3JhbGxvYzo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXIgJiYgb3RoZXItPmhhbmRsZSgpID09IGhhbmRsZSgpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworY2xhc3MgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpOworCisgICAgaWRfdCBnZXRJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworICAgIH0KKworICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcjo6VHJhaXRzPiBtVHJhaXRzOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHNwPElBbGxvY2F0b3IyPiBtQWxsb2NhdG9yMjsKKyAgICBzcDxJTWFwcGVyMj4gbU1hcHBlcjI7CisgICAgc3A8SUFsbG9jYXRvcjM+IG1BbGxvY2F0b3IzOworICAgIHNwPElNYXBwZXIzPiBtTWFwcGVyMzsKKyAgICBjb25zdCBib29sIG1CdWZmZXJRdWV1ZTsKK307CisKK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgKHZvaWQpQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgOiBtSW5pdChDMl9PSyksIG1CdWZmZXJRdWV1ZShidWZmZXJRdWV1ZSkgeworICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gYWxsb2NhdG9yCisgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9LCBtYXhVc2FnZSA9IHsgfih1aW50NjRfdCkwLCB+KHVpbnQ2NF90KTAgfTsKKyAgICBUcmFpdHMgdHJhaXRzID0geyAiYW5kcm9pZC5hbGxvY2F0b3IuZ3JhbGxvYyIsIGlkLCBDMkFsbG9jYXRvcjo6R1JBUEhJQywgbWluVXNhZ2UsIG1heFVzYWdlIH07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3I6OlRyYWl0cz4odHJhaXRzKTsKKworICAgIC8vIGdyYWxsb2MgYWxsb2NhdG9yIGlzIGEgc2luZ2xldG9uLCBzbyBhbGwgb2JqZWN0cyBzaGFyZSBhIGdsb2JhbCBzZXJ2aWNlCisgICAgbUFsbG9jYXRvcjMgPSBJQWxsb2NhdG9yMzo6Z2V0U2VydmljZSgpOworICAgIG1NYXBwZXIzID0gSU1hcHBlcjM6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAoIW1BbGxvY2F0b3IzIHx8ICFtTWFwcGVyMykgeworICAgICAgICBtQWxsb2NhdG9yMyA9IG51bGxwdHI7CisgICAgICAgIG1NYXBwZXIzID0gbnVsbHB0cjsKKyAgICAgICAgbUFsbG9jYXRvcjIgPSBJQWxsb2NhdG9yMjo6Z2V0U2VydmljZSgpOworICAgICAgICBtTWFwcGVyMiA9IElNYXBwZXIyOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIGlmICghbUFsbG9jYXRvcjIgfHwgIW1NYXBwZXIyKSB7CisgICAgICAgICAgICBtQWxsb2NhdG9yMiA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyMiA9IG51bGxwdHI7CisgICAgICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJhbGxvY2F0aW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBoaWRsX2hhbmRsZSBidWZmZXJ7fTsKKworICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbzIgaW5mbyA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgMXUsICAvLyBsYXllckNvdW50CisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQyKGZvcm1hdCksCisgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgICAgIH07CisgICAgICAgIEJ1ZmZlckRlc2NyaXB0b3IyIGRlc2M7CisgICAgICAgIGlmICghbU1hcHBlcjItPmNyZWF0ZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLCBbJmVyciwgJmRlc2NdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGNyZWF0ZURlc2NyaXB0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElBbGxvY2F0b3Igc2hhcmVzIElNYXBwZXIgZXJyb3IgY29kZXMuCisgICAgICAgIGlmICghbUFsbG9jYXRvcjItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgMXUsCisgICAgICAgICAgICAgICAgWyZlcnIsICZidWZmZXIsICZpbmZvXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnN0cmlkZSwgYXV0byAmYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJzLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJzWzBdOworICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogYWxsb2NhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgICBpbmZvLCBtTWFwcGVyMiwgYnVmZmVyLAorICAgICAgICAgICAgICAgIEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBncmFsbG9jVXNhZ2UsIGluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbUJ1ZmZlclF1ZXVlID8gfjAgOiAwKSwKKyAgICAgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQnVmZmVyRGVzY3JpcHRvckluZm8zIGluZm8gPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgIDF1LCAgLy8gbGF5ZXJDb3VudAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0Myhmb3JtYXQpLAorICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAwdSwgIC8vIHN0cmlkZSBwbGFjZWhvbGRlcgorICAgICAgICB9OworICAgICAgICBCdWZmZXJEZXNjcmlwdG9yMyBkZXNjOworICAgICAgICBpZiAoIW1NYXBwZXIzLT5jcmVhdGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIGluZm8ubWFwcGVySW5mbywgWyZlcnIsICZkZXNjXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBjcmVhdGVEZXNjcmlwdG9yIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICAvLyBJQWxsb2NhdG9yIHNoYXJlcyBJTWFwcGVyIGVycm9yIGNvZGVzLgorICAgICAgICBpZiAoIW1BbGxvY2F0b3IzLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgIDF1LAorICAgICAgICAgICAgICAgIFsmZXJyLCAmYnVmZmVyLCAmaW5mb10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZzdHJpZGUsIGF1dG8gJmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVycy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyc1swXTsKKyAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGFsbG9jYXRlIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICAgICAgaW5mbywgbU1hcHBlcjMsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZ3JhbGxvY1VzYWdlLCBpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1CdWZmZXJRdWV1ZSA/IH4wIDogMCksCisgICAgICAgICAgICAgICAgbVRyYWl0cy0+aWQpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgQnVmZmVyRGVzY3JpcHRvckluZm8yIGluZm87CisgICAgICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IGlnYnBfaWQ7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpncmFsbG9jSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoCisgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKSZpbmZvLm1hcHBlckluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsCisgICAgICAgICAgICAgICAgJmluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIGlmIChncmFsbG9jSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBoaWRsX2hhbmRsZSBoaWRsSGFuZGxlOworICAgICAgICBoaWRsSGFuZGxlLnNldFRvKEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGdyYWxsb2NIYW5kbGUpLCB0cnVlKTsKKworICAgICAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgICBpbmZvLCBtTWFwcGVyMiwgaGlkbEhhbmRsZSwgZ3JhbGxvY0hhbmRsZSwgbVRyYWl0cy0+aWQpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvMyBpbmZvOworICAgICAgICBpbmZvLm1hcHBlckluZm8ubGF5ZXJDb3VudCA9IDF1OworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBpZ2JwX2lkOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3Q7CisgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqZ3JhbGxvY0hhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KAorICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAmaW5mby5tYXBwZXJJbmZvLndpZHRoLCAmaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAodWludDMyX3QgKikmaW5mby5tYXBwZXJJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAodWludDY0X3QgKikmaW5mby5tYXBwZXJJbmZvLnVzYWdlLAorICAgICAgICAgICAgICAgICZpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICAmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICBpZiAoZ3JhbGxvY0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaGlkbF9oYW5kbGUgaGlkbEhhbmRsZTsKKyAgICAgICAgaGlkbEhhbmRsZS5zZXRUbyhDMkhhbmRsZUdyYWxsb2M6OlVud3JhcE5hdGl2ZUhhbmRsZShncmFsbG9jSGFuZGxlKSwgdHJ1ZSk7CisKKyAgICAgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoCisgICAgICAgICAgICAgICAgaW5mbywgbU1hcHBlcjMsIGhpZGxIYW5kbGUsIGdyYWxsb2NIYW5kbGUsIG1UcmFpdHMtPmlkKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6QzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgICAgIDogbUltcGwobmV3IEltcGwoaWQsIGJ1ZmZlclF1ZXVlKSkge30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjp+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+KCk7CisgICAgICAgIHBsYXRmb3JtU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1MjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVud3JhcCB0aGUgbmF0aXZlIGhhbmRsZSBmcm9tIGEgQ29kZWMyIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4gVGhpcyBpbmNsdWRlcyBoYW5kbGVzIHJldHVybmVkIGZvciBhCisgKiBncmFwaGljIGJsb2NrIGFsbG9jYXRpb24gaGFuZGxlIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBuYXRpdmUgaGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qKgorICogV3JhcCB0aGUgZ3JhbGxvYyBoYW5kbGUgYW5kIG1ldGFkYXRhIGludG8gQ29kZWMyIGhhbmRsZSByZWNvZ25pemVkIGJ5CisgKiBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIEMySGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCk7CisKKy8qKgorICogV2hlbiB0aGUgZ3JhbGxvYyBoYW5kbGUgaXMgbWlncmF0ZWQgdG8gYW5vdGhlciBidWZmZXJxdWV1ZSwgdXBkYXRlCisgKiBidWZmZXJxdWV1ZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIG5hdGl2ZV9oYW5kbGUgaXMgYSB3cmFwcGVkIGNvZGVjMiBoYW5kbGUuCisgKi8KK2Jvb2wgTWlncmF0ZU5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpOworCisvKioKKyAqIFx0b2RvIEdldCB0aGlzIGZyb20gdGhlIGJ1ZmZlcgorICovCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpOworCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2MgOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlID0gZmFsc2UpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvckdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwNTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQWxsb2NhdG9ySW9uIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoYWxpZ24sIGhlYXBNYXNrLCBmbGFncykKKyAgICAvLworICAgIC8vIGNhcGFjaXR5IGlzIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgYmxvY2stc2l6ZSAoZGVmYXVsdHMgdG8gcGFnZSBzaXplKSB0byByZWR1Y2UgY2FjaGluZworICAgIC8vIG92ZXJoZWFkCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KEMyTWVtb3J5VXNhZ2UsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QqLCB1bnNpZ25lZCosIHVuc2lnbmVkKik+IFVzYWdlTWFwcGVyRm47CisKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JJb24oaWRfdCBpZCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKKyAgICAgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHVzYWdlIG1hc2tzIGFuZCBkZWZhdWx0IGJsb2NrLXNpemUgdG8gdXNlIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UgdG8gaW9uIGZsYWdzCisgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IHRoZSBpb24gZGV2aWNlCisgICAgICogXHBhcmFtIG1pblVzYWdlIG1pbmltdW0gYnVmZmVyIHVzYWdlIHJlcXVpcmVkIGZvciBzdXBwb3J0ZWQgYWxsb2NhdGlvbnMgKGRlZmF1bHRzIHRvIDApCisgICAgICogXHBhcmFtIG1heFVzYWdlIG1heGltdW0gYnVmZmVyIHVzYWdlIHN1cHBvcnRlZCBieSB0aGUgaW9uIGFsbG9jYXRvciAoZGVmYXVsdHMgdG8gU1dfUkVBRAorICAgICAqICAgICAgICB8IFNXX1dSSVRFKQorICAgICAqIFxwYXJhbSBibG9ja1NpemUgYWxpZ25tZW50IHVzZWQgcHJpb3IgdG8gY2FsbGluZyB8bWFwcGVyfCBmb3IgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKiAgICAgICAgVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZiBjYWNoZSByZXF1aXJlZCBmb3IgY2FjaGluZyBtYXBwZXIgcmVzdWx0cy4KKyAgICAgKiAgICAgICAgKGRlZmF1bHRzIHRvIHRoZSBwYWdlIHNpemUpCisgICAgICovCisgICAgdm9pZCBzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpOworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1Jb25GZDsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmKSBjb25zdDsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp0dXBsZTxzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTgxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8yLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfTsKKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpPiBPblJlbmRlckNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogU2V0cyByZW5kZXIgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVuZGVyQ2FsbGJhayBjYWxsYmFjayB0byBjYWxsIGZvciBhbGwgZGVxdWV1ZSBidWZmZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrID0gT25SZW5kZXJDYWxsYmFjaygpKTsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGFuIElHQlAgaW4gb3JkZXIgdG8gY3JlYXRlIGJsb2Nrcy4gQSBuZXdseSBjcmVhdGVkIGJsb2NrIGlzCisgICAgICogZGVxdWV1ZWQgZnJvbSB0aGUgY29uZmlndXJlZCBJR0JQLiBVbmlxdWUgSWQgb2YgSUdCUCBhbmQgdGhlIHNsb3QgbnVtYmVyIG9mCisgICAgICogYmxvY2tzIGFyZSBwYXNzZWQgdmlhIG5hdGl2ZV9oYW5kbGUuIE1hbmFnaW5nIElHQlAgaXMgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVyLgorICAgICAqIFdoZW4gSUdCUCBpcyBub3QgY29uZmlndXJlZCwgYmxvY2sgd2lsbCBiZSBjcmVhdGVkIHZpYSBhbGxvY2F0b3IuCisgICAgICogU2luY2UgemVybyBpcyBub3QgdXNlZCBmb3IgVW5pcXVlIElkIG9mIElHQlAsIGlmIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQgb3IgcHJvZHVjZXIKKyAgICAgKiBpcyBjb25maWd1cmVkIGFzIG51bGxwdHIsIHVuaXF1ZSBpZCB3aGljaCBpcyBidW5kbGVkIGluIG5hdGl2ZV9oYW5kbGUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwcm9kdWNlciAgICAgIHRoZSBJR0JQLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggYmxvY2tzCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKworY2xhc3MgQzJCYXNpY0xpbmVhckJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0xpbmVhckJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfTElORUFSOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICAvLyBUT0RPOiBmZXRjaENpcmN1bGFyQmxvY2sKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19HUkFQSElDOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJQb29sZWRCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpb24gSWQgZm9yIHVuZGVybHlpbmcgYnVmZmVycG9vbAorICAgICAqLworICAgIGludDY0X3QgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2Vzc29yIHdoaWNoIGlzIHVzZWQgYnkgdW5kZXJseWluZyBidWZmZXJwb29sLiAoSXQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHJlY2VpdmluZyBwcm9jZXNzLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBhY2Nlc3NvciAgICAgICAgICBJQWNjZXNzb3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb3V0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSAgICAgICAgICAgICBJQWNlc3NvciBpcyB3cml0ZW4gc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR1cm4gZmFsc2UgICAgICAgICAgICBJQWNjZXNzb3IgaXMgbm90IHdyaXR0ZW4uCisgICAgICovCisgICAgYm9vbCBnZXRBY2Nlc3NvcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbXBvbmVudCBmYWN0b3J5IG9iamVjdCB0aGF0IGVuYWJsZXMgdG8gY3JlYXRlIGEgY29tcG9uZW50IGFuZC9vciBpbnRlcmZhY2UgZnJvbSBhIGR5bmFtaWNhbGx5CisgKiBsaW5rZWQgbGlicmFyeS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50L2ludGVyZmFjZXMgYXJlIG1hbmFnZWQgb2JqZWN0cywgYnV0IHdlCisgKiBjYW5ub3Qgc2FmZWx5IGNyZWF0ZSBhIG1hbmFnZWQgb2JqZWN0IGFuZCBwYXNzIGl0IGluIEMuCisgKgorICogQ29tcG9uZW50cy9pbnRlcmZhY2VzIHR5cGljYWxseSBpbmhlcml0IGZyb20gc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgYnV0IEMgcmVxdWlyZXMKKyAqIHBhc3Npbmcgc2ltcGxlIHBvaW50ZXIsIGFuZCBzaGFyZWRfcHRyIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGtub3cgdGhlIGNsYXNzIHRvIGJlIGNvbnN0cnVjdGVkCisgKiBkZXJpdmVzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgKgorICovCitjbGFzcyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gQ29tcG9uZW50RGVsZXRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IEludGVyZmFjZURlbGV0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IElEIGZvciB0aGUgY3JlYXRlZCBjb21wb25lbnQKKyAgICAgKiBccGFyYW0gY29tcG9uZW50IHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlIElEIGZvciB0aGUgY3JlYXRlZCBpbnRlcmZhY2UKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIDo6QzJDb21wb25lbnRGYWN0b3J5KiAoKkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpKDo6QzJDb21wb25lbnRGYWN0b3J5Kik7Cit9OworCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorCisvLyBUbyBhbGxvdyBhcmJpdHJhcnkgb3JkZXJpbmcgb2YgQzJEZWJ1Zy5oIGFuZCBBUEkgaGVhZGVycyBhbmQgdG8ga2VlcCBkZWJ1ZyB1dGlsaXRpZXMgc2VwYXJhdGVseQorLy8gZnJvbSB0aGUgQVBJIGRlZmluaXRpb25zLCB3ZSBwcm92aWRlIEFQSSBoZWFkZXIgc3BlY2lmaWMgZGVidWcgaGVhZGVycy4KKyNpZmRlZiBDMlBBUkFNX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8QzIuaD4KKworLy8gc3RhbmRhcmQgRVJSTk8gbWFwcGluZ3MKK3RlbXBsYXRlPGludCBOPiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsKCk7Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8MD4oKSAgICAgICB7IHJldHVybiBDMl9PSzsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVJTlZBTD4oKSAgeyByZXR1cm4gQzJfQkFEX1ZBTFVFOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUFDQ0VTPigpICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RVBFUk0+KCkgICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RU5PTUVNPigpICB7IHJldHVybiBDMl9OT19NRU1PUlk7IH0KKworLy8gbWFwIHN0YW5kYXJkIGVycm5vLXMgdG8gdGhlIGVxdWl2YWxlbnQgYzJfc3RhdHVzX3QKK3RlbXBsYXRlPGludC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsOwordGVtcGxhdGU8aW50IEUsIGludCAuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDxFLCBOLi4uPiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRSkgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9lcnJubzJzdGF0dXNfaW1wbCA8RT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDw+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAwID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8aW50Li4uIE4+CitjMl9zdGF0dXNfdCBjMl9tYXBfZXJybm8oaW50IHJlc3VsdCkgeworICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworfQorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgKiBccGFyZW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkJsb2NrUG9vbCwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQmxvY2tQb29sKiAoKkNyZWF0ZUJsb2NrUG9vbEZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QpOworCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgKiBccGFyYW0gc3RhdHVzICAgICAgdGhlIHJldHVybmVkIHN0YXR1cyBmcm9tIGNyZWF0aW5nIGFsbG9jYXRvci4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkFsbG9jYXRvciwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQWxsb2NhdG9yKiAoKkNyZWF0ZUFsbG9jYXRvckZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6YzJfc3RhdHVzX3QqKTsKKworY2xhc3MgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEdldEluc3RhbmNlKCk7CisgICAgfkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAgICAgKiBccGFyYW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAgICAgKiBccGFyYW0gcG9vbCAgICAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYmxvY2sgcG9vbCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCg6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdG9yIGlzIG5vdCBjcmVhdGVkIGFzIHNoYXJlZCBzaW5nbGV0b24gYXMgQzJBbGxvY2F0b3JTdG9yZSBkb2VzLCBiZWNhdXNlCisgICAgICogQyBpbnRlcmZhY2Ugb25seSBhbGxvd3MgcmF3IHBvaW50ZXIgdHJhbnNtaXNzaW9uIGZvciBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3IgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUFsbG9jYXRvcig6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzTXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKKworICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgQ3JlYXRlQmxvY2tQb29sRnVuYyBtQ3JlYXRlQmxvY2tQb29sOworICAgIENyZWF0ZUFsbG9jYXRvckZ1bmMgbUNyZWF0ZUFsbG9jYXRvcjsKK307CisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisKKy8qKgorICogUGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIElEcworICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgOiBwdWJsaWMgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgZW51bSA6IGlkX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGlvbiBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBjb25zaXN0cyBvZjoKKyAgICAgICAgICogICBmZCAgc2hhcmVkIGlvbiBidWZmZXIgaGFuZGxlCisgICAgICAgICAqICAgaW50IHNpemUgKGxvIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IHNpemUgKGhpIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IG1hZ2ljICdceGMyaW9ceDAwJworICAgICAgICAgKi8KKyAgICAgICAgSU9OID0gUExBVEZPUk1fU1RBUlQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBncmFsbG9jIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgZ3JhbGxvYyBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEdSQUxMT0MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBidWZmZXJxdWV1ZSBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEJVRkZFUlFVRVVFLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgcGxhdGZvcm0gYWxsb2NhdG9yIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIGFsd2F5cyBwdXQgdGhpcyBtYWNybyBpbiB0aGUgbGFzdCBwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXh0ZW5kZWQgcGxhdGZvcm0gc3RvcmUgcGx1Z2luIHNob3VsZCB1c2UgdGhpcyBtYWNybyBhcyB0aGUgc3RhcnQgSUQgb2YgaXRzIG93biBhbGxvY2F0b3IKKyAgICAgICAgICogdHlwZXMuCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9FTkQsCisgICAgfTsKK307CisKKy8qKgorICogUmV0cmlldmVzIGEgYmxvY2sgcG9vbCBmb3IgYSBjb21wb25lbnQuCisgKgorICogXHBhcmFtIGlkICAgICAgICB0aGUgbG9jYWwgSUQgb2YgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBibG9jayBwb29sIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBmZXRjaCB0aGUgYmxvY2sgcG9vbCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbiAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICovCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJsb2NrIHBvb2wuCisgKiBccGFyYW0gYWxsb2NhdG9ySWQgIHRoZSBhbGxvY2F0b3IgSUQgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MKKyAqIFxwYXJhbSBjb21wb25lbnQgICAgIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmUgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdG9yIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYSBibG9jayBwb29sCisgKi8KK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cworICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAorICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCisgKiBjb21wb25lbnQgc3RvcmUgaXMgdXNlZC4KKyAqLwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisKKy8qCisgKiBBbmRyb2lkIHByb3ZpZGVzIGxvZ2dpbmcgYW5kIGRlYnVnIG1hY3Jvcy4gUmVkZWZpbmUgdGhlbSB3aXRoIEMyIHByZWZpeCBhbmQgYWRkIHN1cHBvcnQgZm9yCisgKiBvcHRpbmcgb3V0IG9mIHZlcmJvc2UgbG9ncy4KKyAqLworCisjaWZkZWYgQzJfTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIEMyX0xPR19UQUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2lmZGVmIEMyX0xPR19WRVJCT1NFCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZWxzZQorLyoqCisgKiBVc2UgYXMgZm9sbG93czoKKyAqCisgKiAjZGVmaW5lIEMyX0xPR19UQUcgInRhZyIKKyAqIC8vI2RlZmluZSBDMl9MT0dfVkVSQk9TRSAgLy8gZW5hYmxlIHZlcmJvc2UgbG9ncyBpbiB0aGlzIGZpbGUKKyAqICNpbmNsdWRlIDxDMkRlYnVnLmg+CisgKgorICogQzJfTE9HKERFQlVHKSA8PCBleHByIC4uLjsKKyAqCisgKiBMb2cgbGV2ZWxzIGFyZTogVkVSQk9TRSwgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBGQVRBTCAoYWJvcnRzKS4KKyAqCisgKiBObyBlbmRsIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgXAorICAgICAgICAoOjphbmRyb2lkOjpiYXNlOjpMRVZFTCAhPSA6OmFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpICYmIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2VuZGlmCisKKyNkZWZpbmUgQzJfQ0hFQ0sgICAgQ0hFQ0sKKyNkZWZpbmUgQzJfQ0hFQ0tfTFQgQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfQ0hFQ0tfTEUgQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfQ0hFQ0tfRVEgQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfQ0hFQ0tfR0UgQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfQ0hFQ0tfR1QgQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfQ0hFQ0tfTkUgQ0hFQ0tfTkUKKworI2RlZmluZSBDMl9EQ0hFQ0sgICAgRENIRUNLCisjZGVmaW5lIEMyX0RDSEVDS19MVCBEQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfRENIRUNLX0xFIERDSEVDS19MRQorI2RlZmluZSBDMl9EQ0hFQ0tfRVEgRENIRUNLX0VRCisjZGVmaW5lIEMyX0RDSEVDS19HRSBEQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfRENIRUNLX0dUIERDSEVDS19HVAorI2RlZmluZSBDMl9EQ0hFQ0tfTkUgRENIRUNLX05FCisKKyNlbmRpZiAgLy8gQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS90eXBlcy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWQzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3R5cGVzLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX1ZOREtfVFlQRVNfSAorI2RlZmluZSBDT0RFQzJfVk5ES19UWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uLzEuMi90eXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9SZWdpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gU3RhdHVzCisvLyA9PT09PT0KKwordXNpbmcgSFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgIFN0YXR1czsKKworLy8gQSBzdGF0dXNfdCB2YWx1ZSBtYXkgaGF2ZSBmbGFncyBlbmNvZGVkLiBUaGVzZSBmbGFncyBhcmUgZGVjb2RlZCBpbnRvIGJvb2xlYW4KKy8vIHZhbHVlcyBpZiB0aGVpciBjb3JyZXNwb25kaW5nIG91dHB1dCBwb2ludGVycyBhcmUgbm90IG51bGwuCitib29sIGIyaChzdGF0dXNfdCBmcm9tLCBIU3RhdHVzKiB0bywKKyAgICAgICAgIGJvb2wqIGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgIGJvb2wqIHJlbGVhc2VBbGxCdWZmZXJzID0gbnVsbHB0cik7CisvLyBTaW1wbGUgMS10by0xIG1hcHBpbmcuIElmIEJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gb3IgUkVMRUFTRV9BTExfQlVGRkVSUworLy8gbmVlZHMgdG8gYmUgYWRkZWQsIGl0IG11c3QgYmUgZG9uZSBtYW51YWxseSBhZnRlcndhcmRzLgorYm9vbCBoMmIoSFN0YXR1cyBmcm9tLCBzdGF0dXNfdCogdG8pOworCisvLyBGZW5jZQorLy8gPT09PT0KKwordXNpbmcgQkZlbmNlID0gOjphbmRyb2lkOjpGZW5jZTsKKy8vIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgbGlmZXRpbWUgb2YgYSBjb3BpZWQgaGFuZGxlLiBJdHMgZGVzdHJ1Y3RvciBjYWxscworLy8gbmF0aXZlX2hhbmRsZV9kZWxldGUoKSBidXQgbm90IG5hdGl2ZV9oYW5kbGVfY2xvc2UoKS4KK3N0cnVjdCBIRmVuY2VXcmFwcGVyIHsKKyAgICBIRmVuY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworICAgIC8vIFNldHMgbUhhbmRsZSB0byBhIG5ldyB2YWx1ZS4KKyAgICBIRmVuY2VXcmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCogaCk7CisgICAgLy8gRGVsZXRlcyBtSGFuZGxlIHdpdGhvdXQgY2xvc2luZy4KKyAgICB+SEZlbmNlV3JhcHBlcigpOworICAgIC8vIERlbGV0ZXMgbUhhbmRsZSB3aXRob3V0IGNsb3NpbmcsIHRoZW4gc2V0cyBtSGFuZGxlIHRvIGEgbmV3IHZhbHVlLgorICAgIEhGZW5jZVdyYXBwZXImIHNldChuYXRpdmVfaGFuZGxlX3QqIGgpOworICAgIEhGZW5jZVdyYXBwZXImIG9wZXJhdG9yPShuYXRpdmVfaGFuZGxlX3QqIGgpOworICAgIC8vIFJldHVybnMgYSBub24tb3duaW5nIGhpZGxfaGFuZGxlIHBvaW50aW5nIHRvIG1IYW5kbGUuCisgICAgaGlkbF9oYW5kbGUgZ2V0SGFuZGxlKCkgY29uc3Q7CisgICAgb3BlcmF0b3IgaGlkbF9oYW5kbGUoKSBjb25zdDsKK3Byb3RlY3RlZDoKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1IYW5kbGV7bnVsbHB0cn07Cit9OworCisvLyBEb2VzIG5vdCBjbG9uZSB0aGUgZmQtLS1vbmx5IGNvcHkgdGhlIGZkLiBUaGUgcmV0dXJuZWQgSEZlbmNlV3JhcHBlciBzaG91bGQKKy8vIG5vdCBvdXRsaXZlIHRoZSBpbnB1dCBGZW5jZSBvYmplY3QuCitib29sIGIyaChzcDxCRmVuY2U+IGNvbnN0JiBmcm9tLCBIRmVuY2VXcmFwcGVyKiB0byk7CisvLyBDbG9uZXMgdGhlIGZkIGFuZCBwdXRzIGl0IGluIGEgbmV3IEZlbmNlIG9iamVjdC4KK2Jvb2wgaDJiKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogZnJvbSwgc3A8QkZlbmNlPiogdG8pOworCisvLyBDb25uZWN0aW9uVHlwZQorLy8gPT09PT09PT09PT09PT0KKwordXNpbmcgSENvbm5lY3Rpb25UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgQ29ubmVjdGlvblR5cGU7CisKK2Jvb2wgYjJoKGludCBmcm9tLCBIQ29ubmVjdGlvblR5cGUqIHRvKTsKK2Jvb2wgaDJiKEhDb25uZWN0aW9uVHlwZSBmcm9tLCBpbnQqIHRvKTsKKworLy8gUmVjdAorLy8gPT09PQorCit1c2luZyBCUmVjdCA9IDo6YW5kcm9pZDo6UmVjdDsKK3VzaW5nIEhSZWN0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6UmVjdDsKKworYm9vbCBiMmgoQlJlY3QgY29uc3QmIGZyb20sIEhSZWN0KiB0byk7Citib29sIGgyYihIUmVjdCBjb25zdCYgZnJvbSwgQlJlY3QqIHRvKTsKKworLy8gUmVnaW9uCisvLyA9PT09PT0KKwordXNpbmcgQlJlZ2lvbiA9IDo6YW5kcm9pZDo6UmVnaW9uOwordXNpbmcgSFJlZ2lvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPEhSZWN0PjsKKworYm9vbCBiMmgoQlJlZ2lvbiBjb25zdCYgZnJvbSwgSFJlZ2lvbiogdG8pOworYm9vbCBoMmIoSFJlZ2lvbiBjb25zdCYgZnJvbSwgQlJlZ2lvbiogdG8pOworCisvLyBHcmFwaGljQnVmZmVyCisvLyA9PT09PT09PT09PT09CisKK3VzaW5nIEhhcmR3YXJlQnVmZmVyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6CisgICAgICAgIEhhcmR3YXJlQnVmZmVyOwordXNpbmcgSGFyZHdhcmVCdWZmZXJEZXNjcmlwdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzI6OgorICAgICAgICBIYXJkd2FyZUJ1ZmZlckRlc2NyaXB0aW9uOworCisvLyBEb2VzIG5vdCBjbG9uZSB0aGUgaGFuZGxlLiBUaGUgcmV0dXJuZWQgSGFyZHdhcmVCdWZmZXIgc2hvdWxkIG5vdCBvdXRsaXZlIHRoZQorLy8gaW5wdXQgR3JhcGhpY0J1ZmZlci4gTm90ZSB0aGF0IEhhcmR3YXJlQnVmZmVyIGRvZXMgbm90IGNhcnJ5IHRoZSBnZW5lcmF0aW9uCisvLyBudW1iZXIsIHNvIHRoaXMgZnVuY3Rpb24gbmVlZHMgYW5vdGhlciBvdXRwdXQgYXJndW1lbnQuCitib29sIGIyaChzcDxHcmFwaGljQnVmZmVyPiBjb25zdCYgZnJvbSwgSGFyZHdhcmVCdWZmZXIqIHRvLAorICAgICAgICAgdWludDMyX3QqIHRvR2VuZXJhdGlvbk51bWJlciA9IG51bGxwdHIpOworLy8gQ2xvbmVzIHRoZSBoYW5kbGUgYW5kIGNyZWF0ZXMgYSBuZXcgR3JhcGhpY0J1ZmZlciBmcm9tIHRoZSBjbG9uZWQgaGFuZGxlLgorLy8gTm90ZSB0aGF0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBvZiB0aGUgR3JhcGhpY0J1ZmZlciBoYXMgdG8gYmUgc2V0IG1hbnVhbGx5CisvLyBhZnRlcndhcmRzIGJlY2F1c2UgSGFyZHdhcmVCdWZmZXIgZG9lcyBub3QgaGF2ZSBzdWNoIGluZm9ybWF0aW9uLgorYm9vbCBoMmIoSGFyZHdhcmVCdWZmZXIgY29uc3QmIGZyb20sIHNwPEdyYXBoaWNCdWZmZXI+KiB0byk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAgLy8gbmFtZXNwYWNlIGdyYXBoaWNzCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX1ZOREtfVFlQRVNfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MGU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19CQVNFX0hfCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1ZyBwcmludCB1dGlsaXRpZXMgZm9yIENvZGVjIDIuMCBiYXNlIG9iamVjdHMuCisgKi8KKworI2RlZmluZSBDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQodHlwZSkgXAorY29uc3QgY2hhciAqYXNTdHJpbmcodHlwZSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKTsgXAoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0eXBlICZpKSB7IFwKKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaSk7IFwKK30KKworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKGMyX3N0YXR1c190KQorCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMTg3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1YzRjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfTE9HX0hfCisKKy8vIFBsYXRmb3JtIHNwZWNpZmljIGRlYnVnIHV0aWxpdGllcworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkRlYnVnLWxvZy5oPgorI2Vsc2UKKy8vIFRPRE86IGltcGxlbWVudCBiYXNlIGRlYnVnIHV0aWxzCisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWRlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19QQVJBTV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnL3ByaW50IGRlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBkZWZpbmVkIGluIEMyUGFyYW0uaAorICovCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCkKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6SW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIEludGVyZmFjZSBIZWxwZXIKKyAqLwordXNpbmcgQzJSID0gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFQsIHRydWU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcGFyYW1ldGVyIHJlZmxlY3RvcnMuIFRoaXMgY2xhc3MgaXMgZHluYW1pYyBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAqIHNoYXJlZCBieSBtdWx0aXBsZSBpbnRlcmZhY2VzLiBUaGlzIGFsbG93cyBpbnRlcmZhY2VzIHRvIGFkZCBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgYXMgbmVlZGVkLgorICovCitjbGFzcyBDMlJlZmxlY3RvckhlbHBlciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBDMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5DMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIFBhcmFtcyB0eXBlcyBvZiBjb2RlYyAyLjAgc3RydWN0cyAob3IgcGFyYW1ldGVycykgdG8gZGVzY3JpYmUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0czsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIGEgc3BlY2lmaWMgc3RydWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVrdCBkZXNjcmlwdG9yIGZvciB0aGUgc3RydWN0IHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQuCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9yKEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCk7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIGNsYXNzIEMyX0hJREUgX1R1cGxlIHsgfTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWN0cyBMaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0byBhZGQgc3VwcG9ydCBmb3IKKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKik7CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMgaW4gYSByZWN1cnNpdmUgbWFubmVyCisgICAgICogb25lIHN0cnVjdHVyZSBhdCBhIHRpbWUgdXNpbmcgYSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0ZW1wb3JhcnkuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0aGUgdHlwZSBvZiBjb2RlYyAyLjAgc3RydWN0IHRvIGRlc2NyaWJlCisgICAgICogXHBhcmFtIFBhcmFtcyByZXN0IG9mIHRoZSBzdHJ1Y3RzCisgICAgICogXHBhcmFtIHN0cnVjdHMgVGVtcG9yYXJ5IGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHVzZWQgdG8gb3B0aW1pemUgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8VCwgUGFyYW1zLi4uPiAqKSB7CisgICAgICAgIHN0cnVjdHMuZW1wbGFjZV9iYWNrKChUKiludWxscHRyKTsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IF9tTXV0ZXg7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3I+IF9tU3RydWN0czsgLy8vPCBkZXNjcmlwdG9ycworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29kZWMgMi4wIGludGVyZmFjZSBBUEktcyBmb3Igc29tZSBwYXJhbWV0ZXJzLgorICoKKyAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkLgorICovCitjbGFzcyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBvZmZzZXQgb2YgYSBmaWVsZCBhdCB8b2Zmc2V0fCB0aGF0IGNvdWxkIGJlIHBhcnQgb2YgYW4gYXJyYXkgb3IgcGFydCBvZiBhCisgICAgICogc3ViLXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGZpZWxkIHNpemUgdmVyaWZpY2F0aW9uLCBlLmcuIGlmIG9mZnNldCBpZiBvYnRhaW5lZCBmcm9tIGEgc3RydWN0dXJlLAorICAgICAqIGl0IHdpbGwgbm90IHN0b3AgYXQgdGhlIHN0cnVjdHVyZSBib3VuZGFyeSAtIHRoaXMgaXMgb2theSwgYXMgd2UganVzdCB3YW50IHRoZSBiYXNlIG9mZnNldAorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBzYW1lLgorICAgICAqLworICAgIHN0YXRpYworICAgIHNpemVfdCBHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSBoZWxwZXIgY2xhc3MgdXNlcyByZWZlcmVuY2VzIHRvIHN0ZDo6c2hhcmVkX3B0cjxUPiBjb25maWcgcGFyYW1ldGVycy4KKyAgICAgKiBJbnRlcm5hbGx5LCB0aGVzZSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIHRvIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiByZWZzLCBidXQgdGhlIGNhc3QgaXMKKyAgICAgKiBub3QgYWxsb3dlZCAoYXMgdGhlc2UgYXJlIHJlZmVyZW5jZXMpLiBBcyBzdWNoLCB0aGlzIGNsYXNzIG5ldmVyIHJldHVybnMgcG9pbnRlciB0byB0aGUKKyAgICAgKiBzaGFyZWRfcHRycy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgUGFyYW1SZWYgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBlbmFibGU9CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxULCBDMlBhcmFtPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpbmxpbmUgQzJfSElERSBQYXJhbVJlZihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtKQorICAgICAgICAgICAgOiBfbVJlZihyZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPio+KCZwYXJhbSkpIHsgfQorCisgICAgICAgIC8vIHVzZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgY29udGFpbmVycworICAgICAgICBvcGVyYXRvciBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKigpIGNvbnN0IHsgcmV0dXJuIF9tUmVmOyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGdldCgpIGNvbnN0IHsgcmV0dXJuICpfbVJlZjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICpfbVJlZjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRmllbGQgaGVscGVyLgorICAgICAqCisgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkOiBwb3NzaWJsZSB2YWx1ZXMsIGFuZCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIGNsYXNzIEZpZWxkSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGhlbHBlciBmb3IgYSBmaWVsZCB3aXRoIGdpdmVuIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciByZWZlcmVuY2UuIFRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBhdCB0aGlzCisgICAgICAgICAqICAgICAgICBwb2ludC4KKyAgICAgICAgICogXHBhcmFtIGZpZWxkIGZpZWxkIGlkZW50aWZpZXIKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBmaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgRmllbGRIZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHBhcmFtLWZpZWxkIGlkZW50aWZpZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgICAgICAgICogdW5kZXJseWluZyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFxhcmFtIGluZGV4CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQzJQYXJhbUZpZWxkCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGQgbWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0CisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gVGhpcyBkZWZhdWx0cyB0byB0aGUgcG9zc2libGUgdmFsdWVzCisgICAgICAgICAqIGlmIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHdlcmUgbmV2ZXIgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gaW1wbCBmb3Igc2FmZXR5CisgICAgICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICAgICAgX0MyRmllbGRJZCBtRmllbGRJZDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1Qb3NzaWJsZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1TdXBwb3J0ZWQ7IC8vLzwgaWYgZGlmZmVyZW50IGZyb20gcG9zc2libGUKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbTsKKyAgICBjbGFzcyBQYXJhbUhlbHBlcjsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgaXMgYW4gaW50ZXJmYWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGhlbHBlcnMgZnJvbSBhIHN0ZDo6c2hhcmVkX3B0cjxUPiAmLgorICAgICAqLworICAgIGNsYXNzIEZhY3RvcnkgeworICAgICAgICAvLyBcdG9kbyB0aGlzIG1heSBiZSBhbHJlYWR5IGluIFBhcmFtSGVscGVyCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFJlZmxlY3RvcigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCA9IDA7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUGFyYW08VD4gZ2V0KHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxUPiBhbHRWYWx1ZSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbTxUPihnZXRQYXJhbUhlbHBlcihQYXJhbVJlZihwYXJhbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdFZhbHVlID09IG51bGxwdHIgPyBwYXJhbSA6IGFsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmxlY3RvcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBmaWVsZCBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRmllbGQgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBoZWxwZXIgaGVscGVyIGZvciB0aGlzIGZpZWxkCisgICAgICAgICAqIFxwYXJhbSBpbmRleCAgcGFyYW1ldGVyIGluZGV4ICh0aGlzIGlzIG5lZWRlZCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBwYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgIGNvbnN0cnVjdGlvbikgXHRvZG8gcmVtb3ZlCisgICAgICAgICAqLworICAgICAgICBGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIGJvb2wgc3VwcG9ydHNBdEFsbChUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFBvc3NpYmxlVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc3VwcG9ydHNOb3coVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCByZXNvbHV0aW9uIHN1Z2dlc3Rpb24gYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gc2hvdWxkQmUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQKKyAgICAgICAgICogZm9yIG5vbi1jb25zdCBmaWVsZHMgdG8gZGlzYWxsb3cgc2V0dGluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IG11c3RCZSgpOworCisgICAgICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbUZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETworICAgICAgICBDMlIgdmFsaWRhdGVQb3NzaWJsZShjb25zdCBUICZ2YWx1ZSBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgLy8vIFRPRE8KKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIH07CisKKyAgICBjbGFzcyBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICBQYXJhbUhlbHBlcihQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJik7CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtSGVscGVyICYmKTsKKyAgICAgICAgflBhcmFtSGVscGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZiBmb3IgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgbW9kaWZpYWJsZS4gVGhlIGNvbnN0bmVzcyBvZiB0aGlzCisgICAgICAgIC8vLyBvYmplY3QgZGV0ZXJtaW5lcyB0aGUgY29uc3RuZXNzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgY29uc3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IHZhbHVlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgcmVxdWVzdCBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZSAgICB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBhc3NpZ25lZCB0byB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICogICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgbXVzdCBub3QgY2hhbmdlLgorICAgICAgICAgKiBccGFyYW0gbWF5QmxvY2sgd2hldGhlciBibG9ja2luZyBpcyBhbGxvd2VkCisgICAgICAgICAqIFxwYXJhbSBlbmRWYWx1ZSB0aGUgcmVzdWx0aW5nIHZhbHVlCisgICAgICAgICAqIFxwYXJhbSBmYWN0b3J5ICBwYXJhbWV0ZXIgZmFjdG9yeSAodG8gYWNjZXNzIGRlcGVuZGVuY2llcykKKyAgICAgICAgICogXHBhcmFtIGZhaWx1cmVzIHZlY3RvciBvZiBmYWlsdXJlcyB0byBhcHBlbmQgYW55IGZhaWx1cmVzIGZyb20gdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGNvbmZpZ3VyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdmFsdWUgaXMgaW5jb3JyZWN0IChUQkQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY29uZmlndXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgY29uZmlndXJhdGlvbiByZXF1aXJlcyBibG9ja2luZyB0byBiZSBhbGxvd2VkCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGludGVyZmFjZSBpcyBjb3JydXB0ZWQKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBib29sICpjaGFuZ2VkLAorICAgICAgICAgICAgICAgIEZhY3RvcnkgJmZhY3RvcnksCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICAgICAgLy8vIHJldHVybnMgcGFyYW1ldGVyIGluZGljZXMgdGhhdCBkZXBlbmQgb24gdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdDsKKworICAgICAgICAvLy8gYWRkcyBhIGRlcGVuZGVudCBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBhZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhhdCBwYXJhbWV0ZXIgcmVmcyBmb3IgcGFyYW1ldGVycyB0aGF0IGRlcGVuZCBvbiB0aGlzCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbmQgbW92ZXMgb3V0IHN0b3JlZCBzdHJ1Y3QgZGVzY3JpcHRvcgorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3IgcmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsaWRhdGVzIHBhcmFtIGhlbHBlci4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIG5vdywgdGhpcyBmaWxscyBmaWVsZCBpbmZvIGZvciBjb25zdCBwYXJhbXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGFkZGVkIGFzIHN1Y2gKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgICAgIGF0dHJpYl90JiBhdHRyaWIoKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0R2V0dGVyKHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZmllbGRzIGFuZCB0aGVpciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpOworCisgICAgICAgIC8vLyBidWlsZCB0aGlzIGludG8gYSBmaW5hbCBQYXJhbUhlbHBlciBvYmplY3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpOworCisgICAgICAgIGNsYXNzIEltcGw7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgcGFyYW1ldGVyIGhlbHBlci4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWVtYmVycyBhcyB3ZWxsIGFzIGZpZWxkIGhlbHBlcnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbSB7CisgICAgICAgIFBhcmFtKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyLCBzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IHYoKnBhcmFtLmdldCgpKSwKKyAgICAgICAgICAgICAgX21UeXBlZFBhcmFtKHBhcmFtKSwKKyAgICAgICAgICAgICAgX21IZWxwZXIoaGVscGVyKSwKKyAgICAgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICB1c2luZyBGaWVsZFR5cGUgPSBGaWVsZDwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZT46OnR5cGU+Ojp0eXBlPjsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgeworICAgICAgICAgICAgc2l6ZV90IG9mZnMgPSAodWludHB0cl90KSZmaWVsZCAtICh1aW50cHRyX3QpJmdldCgpOworICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGZhbGwgZWl0aGVyIHdpdGhpbiBzaXplb2YoVCkgKyBGTEVYX1NJWkUgb3IgcGFyYW0tPnNpemUoKQorICAgICAgICAgICAgLy8gc2l6ZV90IHNpemUgPSBzaXplb2YoZmllbGQpOworICAgICAgICAgICAgLy8gbVBhcmFtIG1heSBiZSBudWxsCisgICAgICAgICAgICBzaXplX3QgYmFzZVNpemUgPSBzaXplb2YodHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlKTsKKyAgICAgICAgICAgIHNpemVfdCBiYXNlT2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIF9tUmVmbGVjdG9yLCBUOjpDT1JFX0lOREVYLCBvZmZzIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgICAgIGlmICh+YmFzZU9mZnMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEMyX0xPRyhGQVRBTCkgPDwgInVua25vd24gZmllbGQgYXQgb2Zmc2V0ICIgPDwgb2ZmcyA8PCAiIHNpemUgIiA8PCBzaXplb2YoUykKKyAgICAgICAgICAgICAgICAvLyAgICAgICA8PCAiIGJhc2Utc2l6ZSAiIDw8IGJhc2VTaXplOworICAgICAgICAgICAgICAgIC8vIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2VPZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIgPSBfbUhlbHBlci0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlPFM+KGhlbHBlciwgX21UeXBlZFBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0IFBhcmFtIGhhdmUgY29uc3QgRmllbGRzOyBob3dldmVyLCByZW1vdmUgY29uc3QgZnJvbSBTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIGNvbnN0IEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBGaWVsZFR5cGU8Uz4+KGNvbnN0X2Nhc3Q8UGFyYW0gKj4odGhpcyktPkYoZmllbGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3QgcmVmIHZhbHVlIG9mIHRoaXMgY29uc3QgcGFyYW0uCisgICAgICAgIGNvbnN0IFQgJmdldCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBtb2RpZmlhYmxlIHJlZiB2YWx1ZSBvZiB0aGlzIG5vbi1jb25zdCBwYXJhbS4KKyAgICAgICAgVCAmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gQ29uc3QtcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZS5zCisgICAgICAgIFQgY29uc3QgJnY7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gX21UeXBlZFBhcmFtOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IF9tSGVscGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgQzJQID0gUGFyYW08VD47CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZWQgbW92ZSBidWlsZGVyIGNsYXNzIGZvciBhIHBhcmFtZXRlciBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBDMl9ISURFIFBhcmFtQnVpbGRlciA6IHByaXZhdGUgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENvbnN0cnVjdCB0aGUgcGFyYW1ldGVyIGJ1aWxkZXIgZnJvbSBtaW5pbWFsIGluZm8gcmVxdWlyZWQuICovCisgICAgICAgIFBhcmFtQnVpbGRlcihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgICAgIDogUGFyYW1IZWxwZXIocGFyYW0sIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0cikpLAorICAgICAgICAgICAgICBtVHlwZWRQYXJhbSgmcGFyYW0pIHsKKyAgICAgICAgICAgIGF0dHJpYigpID0gYXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnJlcXVpcmVkKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFUVVJUkVEOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHRyYW5zaWVudCAobm90IHBlcnNpc3RlbnQpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ0cmFuc2llbnQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSAmPSB+YXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaGlkZGVuIChub3QgZXhwb3NlZCBpbiBKQVZBIEFQSSkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmhpZGRlbigpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19ISURERU47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaW50ZXJuYWwgKG5vdCBleHBvc2VkIHRvIHF1ZXJ5L3NldHRpbmdzKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaW50ZXJuYWwoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSU5URVJOQUw7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICAvLyBDSEVDSyghbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAvLyBXQVJOX0lGKCFkZWZhdWx0Xyk7IC8vIGNvdWxkIGJlIG51bGxwdHIgaWYgT09NCisgICAgICAgICAgICAvLyB0ZWNobmljYWxseSwgdGhpcyBjb3VsZCBiZSBpbiB0aGUgcGFyZW50CisgICAgICAgICAgICAqbVR5cGVkUGFyYW0gPSBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCpkZWZhdWx0XykucmVsZWFzZSgpKSk7CisgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRHZXR0ZXIoW3R5cGVkUGFyYW1dKGJvb2wpIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlBhcmFtPigqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgYWxsIGZpZWxkcyB0byB0aGlzIHBhcmFtZXRlciB3aXRoIHRoZWlyIHBvc3NpYmxlIHZhbHVlcy4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzXykgeworICAgICAgICAgICAgc2V0RmllbGRzKHN0ZDo6bW92ZShmaWVsZHNfKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQ29uc3QgcGFyYW1ldGVycyBieSBkZWZpbml0aW9uIGhhdmUgbm8gZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgICAgICBzZXRTZXR0ZXIoW2RlZmF1bHRfXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2sgX191bnVzZWQsIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJikgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCp0eXBlZFZhbHVlICE9ICpkZWZhdWx0XykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBSZWFkT25seSgqZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChkZWZhdWx0Xyk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgY29uc3QgQzJQPFQ+ICYsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1NUUklDVDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJQPFQ+IG9sZFZhbHVlID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIG9sZFZhbHVlLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgbm9uLXN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXJrcyB0aGlzIGEgY2FsY3VsYXRlZCAocmVhZC1vbmx5KSBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIgKGNhbGN1bGF0b3IpCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZjYWxjdWxhdGVkQXMoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRUFEX09OTFk7CisgICAgICAgICAgICByZXR1cm4gd2l0aFNldHRlcihmbiwgc3RkOjpmb3J3YXJkPGRlY2x0eXBlKGRlcHMpPihkZXBzKS4uLik7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbUhlbHBlcjo6YnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKm1UeXBlZFBhcmFtOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBQYXJhbUJ1aWxkZXI8VD4gRGVmaW5lUGFyYW0oc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFBhcmFtQnVpbGRlcjxUPihwYXJhbSwgbmFtZSk7CisgICAgfQorCitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogSGVscGVyIGltcGxlbWVudGluZyBjb25maWcgY2FsbHMgYXMgd2VsbCBhcyBvdGhlciBjb25maWd1cmF0aW9uIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB2aXJ0dWFsLCBzbyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kIGl0IChhbmQgcGVyZm9ybQorICAgICAqIGFjdGlvbnMganVzdCBiZWZvcmUgYW5kIGFmdGVyIGEgY29uZmlndXJhdGlvbikuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zCisgICAgICogXHBhcmFtIG1heUJsb2NrCisgICAgICogXHBhcmFtIGZhaWx1cmVzCisgICAgICogXHBhcmFtIHVwZGF0ZVBhcmFtcyBpZiB0cnVlLCB0aGUgdXBkYXRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb3BpZWQgYmFjayBpbnRvIHRoZSBhcmd1bWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbiB8cGFyYW1zfAorICAgICAqIFxwYXJhbSBjaGFuZ2VzICAgICAgcG9pbnRlZCB0byBhIHZlY3RvciB0byByZWNlaXZlIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQuIElmIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZCBhcmUgYWRkZWQgdG8gdGhpcy4KKyAgICAgKiBccmV0dXJuIHJlc3VsdCBmcm9tIGNvbmZpZworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzLAorICAgICAgICAgICAgYm9vbCB1cGRhdGVQYXJhbXMgPSB0cnVlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyA9IG51bGxwdHIpOworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gZ2V0UmVmbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTG9jazsKKworICAgIC8qKgorICAgICAqIExvY2tzIHRoZSBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBsb2NrLiBUaGlzIGxvY2sgbXVzdCBiZSB1bmxvY2tlZCBvciByZWxlYXNlZCB3aXRob3V0CisgICAgICogY2FsbGluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KKyAgICAgKi8KKyAgICBMb2NrIGxvY2soKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHModWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3QgZW5kKSB7CisgICAgICAgIC8vIFRPRE86IGV4Y2x1ZGUgdGhpcyBoZWxwZXIKKyAgICAgICAgKHZvaWQpc3RhcnQ7CisgICAgICAgICh2b2lkKWVuZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBzdHJ1Y3QgRmFjdG9yeUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEZhY3RvcnlJbXBsPiBfbUZhY3Rvcnk7CisKKyAgICBDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIHRvIHRoaXMgaW50ZXJmYWNlLgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIENIRUNLcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gYWRkLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVwZW5kZW5jeSBpbmRleCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaXggdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJJbnRlcmZhY2VIZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN1YmNsYXNzIGluc3RhbmNlJ3MgYWRkcmVzcyBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIGFsbG93IHN1YmNsYXNzIHRvIHNwZWNpZnkgcGFyYW1ldGVyIGFkZHJlc3MgcmFuZ2UgZGlyZWN0bHkgKGUuZy4gZG8gbm90IGFzc3VtZSB0aGF0CisgICAgICogICAgICAgdGhleSBhcmUgbG9jYWwgdG8gdGhlIHN1YmNsYXNzIGluc3RhbmNlKQorICAgICAqCisgICAgICogXHBhcmFtIFQgdHlwZSBvZiB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqIFxwYXJhbSBpbnN0YW5jZSBwb2ludGVyIHRvIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJfSElERSB2b2lkIHNldERlcml2ZWRJbnN0YW5jZShUICppbnN0YW5jZSkgeworICAgICAgICBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKCh1aW50cHRyX3QpaW5zdGFuY2UsICh1aW50cHRyX3QpKGluc3RhbmNlICsgMSkpOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKEMySW50ZXJmYWNlSGVscGVyKTsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgY2xhc3MgZm9yIGEgZmllbGQgb2YgYSBwYXJhbWV0ZXIKKyAqCisgKiBccGFyYW0gc3BQYXJhbSBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGluIGFuIGludGVyZmFjZSBjbGFzcyBzdWJjbGFzc2VkIGZyb20gQzJJbnRlcmZhY2VIZWxwZXIuCisgKiBccGFyYW0gZmllbGQgICBhIGZpZWxkIG9mIHN1Y2ggcGFyYW1ldGVyCisgKi8KKyNkZWZpbmUgQzJGKHNwUGFyYW0sIGZpZWxkKSBcCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjwgXAorICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwgXAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHNwUGFyYW0tPmZpZWxkKT46OnR5cGU+Ojp0eXBlPjo6dHlwZT4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHNwUGFyYW0uZ2V0KCksICZzcFBhcmFtLT5maWVsZCkpCisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTAzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIG1hcCB1bmRlcmx5aW5nIHR5cGVzIHRvIEMyVmFsdWUgdHlwZXMgYXMgd2VsbCBhcyB0byBwcmludCBmaWVsZCB2YWx1ZXMuIFRoaXMgaXMKKyAqIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBzaW1wbHkgdGhlIHVuZGVybHlpbmcgdHlwZSBleGNlcHQgZm9yIGNoYXJhY3RlcnMgKFNUUklORykgYW5kIGJ5dGVzIChCTE9CKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXIgeworICAgIHR5cGVkZWYgVCBWYWx1ZVR5cGU7CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IHAucmVmPFQ+KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90PiB7CisgICAgdHlwZWRlZiB1aW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+IHsKKyAgICB0eXBlZGVmIGludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWUgcmFuZ2UgdXRpbGl0eSBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBtaW1pY3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlIGZvciBSQU5HRSB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCisvL3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNQVhfVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1NURVAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSByYW5nZSB3aXRoIG5vIHN1cHBvcnRlZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNQVhfVkFMVUUsIE1JTl9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYWxsIHZhbHVlcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBBbnkoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBzdXBwb3J0ZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHNvbGUgc3VwcG9ydGVkIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUFYX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNQVhfVkFMVUUpLCBNQVhfVkFMVUUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUgKyBNSU5fU1RFUCwgTUFYX1ZBTFVFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgbGVzcyB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgZ3JlYXRlciB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1JTl9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNSU5fVkFMVUUpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUgLSBNSU5fU1RFUCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb250aW51b3VzIG9yIGFyaXRobWV0aWMgcmFuZ2UgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBNSU5fU1RFUCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXRyaWMgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIDAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogcmFuZ2UgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBSQU5HRSB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gX21NYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBSYW5nZXMgYXJlIHZhbGlkIGlmIHRoZXkgYXJlIGNvbnRpbnVvdXMgb3IgbW9ub3RvbmljLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3ZlcmZsb3cgb3IgbmVnYXRpdmUgc2VyaWVzCisgICAgICAgIHJldHVybiBfbURlbm9tID4gMCAmJiBfbU51bSA+PSBfbURlbm9tICYmIF9tTWluICogKF9tRGVub20gLSBfbU51bSkgPCBfbVN0ZXAgKiBfbURlbm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmFuZ2UgYW5kIGFub3RoZXIsIGlmIGl0IGlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIHJhbmdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIGlubGluZSBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhfbU1pbiwgX21NYXgsIF9tU3RlcCwgX21OdW0sIF9tRGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1pbigpIGNvbnN0ICAgeyByZXR1cm4gX21NaW47ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtYXgoKSBjb25zdCAgIHsgcmV0dXJuIF9tTWF4OyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0ZXAgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBzdGVwKCkgY29uc3QgIHsgcmV0dXJuIF9tU3RlcDsgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWVyYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG51bSgpIGNvbnN0ICAgeyByZXR1cm4gX21OdW07ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVub21pbmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBkZW5vbSgpIGNvbnN0IHsgcmV0dXJuIF9tRGVub207IH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBhbGwgdmFsdWVzIGJldHdlZW4gX21NaW4gYW5kIF9tTWF4LgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzU2ltcGxlUmFuZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPT0gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSArIF9tU3RlcCwgd2hlcmUgX21TdGVwID4gMCBhbmQgX21NaW4gPD0geFtpXSA8PSBfbU1heAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzQXJpdGhtZXRpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA+IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2ldID0geFswXSAqIChfbU51bSAvIF9tRGVub20pIF4gaSAod2l0aCByb3VuZGluZyksIHdoZXJlIF9tTnVtID4gX21EZW5vbSA+IDAgYW5kIHhbMF0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNHZW9tZXRyaWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IDAgJiYgX21TdGVwID09IDAgJiYgX21OdW0gPiBfbURlbm9tICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKiBfbU51bSAvIF9tRGVub20gKyBfbVN0ZXAgKHdpdGggcm91bmRpbmcpLCB3aGlsZSB4W2kgKyAxXSA+IHhbaV0sIHdoZXJlCisgICAgICogX21TdGVwICE9IDAsIF9tRGVub20gPiAwIGFuZCBfbU51bSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc01hY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCAhPSAwICYmIF9tTnVtID4gMCAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGFyaXRobWV0aWMgb3IgY29udGludW91cyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0oMSksIF9tRGVub20oMSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21lcnRpYyBzb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuIFRoaXMgaXMgMCBmb3IgYSBwdXJlIGdlb21ldHJpYworICAgICAqICAgICAgICBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bShudW0pLCBfbURlbm9tKGRlbikgeyB9CisKKyAgICBUIF9tTWluOyAvLy88IGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludAorICAgIFQgX21NYXg7IC8vLzwgdXBwZXIgYm91bmQKKyAgICBUIF9tU3RlcDsgLy8vPCBzdGVwIG9mIGFuIGFyaXRobWV0aWMgc2VyaWVzICgwIGlmIGNvbnRpbnVvdXMgZmxvYXRpbmcgcG9pbnQgcmFuZ2UpCisgICAgVCBfbU51bTsgLy8vPCBudW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCisgICAgVCBfbURlbm9tOyAvLy88IGRlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZEZsYWdzIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGZsYWcgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIGZsYWdzIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJWYWx1ZTo6UHJpbWl0aXZlPigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncy4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBGTEFHUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNldCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBmbGFnIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoIWlzRW1wdHkoKSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IGZsYWdzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNldCBvZiBmbGFncyBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgVCBtaW4oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBkaXJlY3RseSBmcm9tIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyBhIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgZmxhZ3MgYW5kIGEgbWluaW11bSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0CisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHZhbHVlIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoeyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBWQUxVRVMgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIHZhbHVlIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgZmxhZyBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIHN1cHBvcnRlZCBzZXQgb2YgdmFsdWVzCit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQzJGaWVsZFN1cHBvcnRlVmFsdWVzIG9iamVjdCBmb3IgZmllbGRzIG9mIHZhcmlvdXMgdHlwZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyOworCisvLyB0ZW1wbGF0ZWQgb3BlcmF0b3IgbXVzdCBiZSBwcmVkZWNsYXJlZCBmb3IgZnJpZW5kIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYSBzcGVjaWZpYyB0eXBlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgc3RydWN0LgorICAgICAqLworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8vIFRSSUNLWTogbmVlZGVkIGZvciBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gZGVjbGFyYXRpb24KKyAgICB+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXImIG9wZXJhdG9yPShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworCisgICAgYm9vbCBzdXBwb3J0cyhUIHZhbHVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB1c2UgcGltcGwgYXMgaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworICAgIC8vZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICZpKTsKK307CisKKy8qKgorICogQnVpbGRlciBmb3Igc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIHN1Y2Nlc3NpdmVseSByZXN0cmljdCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4gVXBvbgorICogY3JlYXRpb24sIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgdmFsdWVzIHNwZWNpZmllZCAtIHdoaWNoIGZvciB0aGlzIGJ1aWxkZXIgbWVhbnMgdGhhdCBhbGwKKyAqIHZhbHVlcyBhcmUgc3VwcG9ydGVkLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBubyBkZWZpbmVkIHZhbHVlcyAtIGJ1dCBpbXBsaWNpdGx5IGFueSB2YWx1ZSBhbGxvd2VkLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmYW55KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGZyb20gdGhlIGJ1aWxkZXIgYXMgYWxsIHBhcmFtcyBtdXN0IGhhdmUgc3VwcG9ydGVkCisgICAgICogICAgICAgdmFsdWVzLCBidXQgaXMgaGVyZSBpbiBjYXNlIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZXF1YWxUbyhUIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdEdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIFsgfG1pbnwsIHxtYXh8IF0KKyAgICAgKiB3aXRoIG9wdGlvbmFsIHxzdGVwfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblJhbmdlKAorICAgICAgICAgICAgVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IFQoMCkgOiBUKDEpKSAgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblJhbmdlKG1pbiwgbWF4LCBzdGVwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBnZW9tZXRyaWMgc2VyaWVzIHN0YXJ0aW5nCisgICAgICogZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblNlcmllcyhtaW4sIG1heCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBzdGFydGluZyBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCBhbmQgfHN0ZXB8LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJbk1hY1NlcmllcyhtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHxmbGFnc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfHZhbHVlc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXImIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHJhbmdlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpOworCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKK307CisKKy8qKgorICogQnVpbGRlciBmb3IgYSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICovCitjbGFzcyBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSBzZXR0aW5nIGNvbmZsaWN0LgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbmZsaWN0IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIGFuZCByZXR1cm5zIHRoaXMKKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiB3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgKGFuZCBtb3ZlcyB0aGVtIG91dCBvZiB0aGlzIGJ1aWxkZXIuKQorICAgICAqICh0aGlzIGlzIHdoeSBpdCBpcyBub3QgY29uc3QpCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiByZXRyaWV2ZUNvbmZsaWN0cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGxpc3QgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfbUNvbmZsaWN0cy5lbXB0eSgpOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGVtcHR5KCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IF9tQ29uZmxpY3RzOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdCBidWlsZGVyIGZvciBhIHBhcmFtZXRlci4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgb25seSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgUmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYmFkLXZhbHVlIG9yIGluZm9pbmZvcm1hdGlvbmFsIGJhZC12YWx1ZSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyB0aGUgdmFsdWUgaXMgb3V0c2lkZSBvZiB0aGUgcG9zc2libGUgdmFsdWVzLiBBcyBzdWNoLCB0aGVyZSBhcmUgbm8KKyAgICAgKiBjb25mbGljdHMgZm9yIHRoaXMgY2FzZSBlaXRoZXIuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBCYWRWYWx1ZShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtRmllbGQsIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IChvciBpbmZvcm1hdGlvbmFsIGNvbmZsaWN0KSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyB0YWtlcyBGU1Ygc28gdXNlIHBhcmFtRmllbGRWYWx1ZXMgYW5kIG9wdGlvbmFsIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IENvbmZsaWN0KAorICAgICAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLAorICAgICAgICAgICAgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvLyBUT0RPOiByZXRyaWV2ZSByZXN1bHRzCisKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIEMyU2V0dGluZ1Jlc3VsdCBfbVJlc3VsdDsKKworICAgIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAmKSA9IGRlbGV0ZTsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHRzIChQTFVSQUwpIGJ1aWxkZXIuCisgKgorICogU2V0dGluZyByZXN1bHRzIGNvbnRhaW4gYSBmYWlsdXJlIHN0YXR1cyBhbG9uZyB3aXRoIGEgbGlzdCBvZiBmYWlsaW5nIGZpZWxkcyBvciBwYXJhbXMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciB7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImKSA9IGRlbGV0ZTsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgJm9wZXJhdG9yPShDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogXHJldHVybnMgKGRlZmF1bHQpIHN1Y2Nlc3NmdWwgcmVzdWx0IHdpdGggbm8gZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE9rKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfT0spOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgaXMgaW4gYmFkIHN0YXRlLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEJhZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQkFEX1NUQVRFKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIFRpbWVkT3V0KCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfVElNRURfT1VUKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gaXMgY29ycnVwdGVkLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIENvcnJ1cHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0NPUlJVUFRFRCk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBOb01lbW9yeShDMlBhcmFtOjpJbmRleCBpbmRleF8gX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGFkZCBmYWlsdXJlIHJlc3VsdAorICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfTk9fTUVNT1JZKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgYSBjb25zdHJ1Y3RvcgorICAgIC8qKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIGEgc2luZ2xlIGJhZCB2YWx1ZSBzZXR0aW5nIHJlc3VsdC4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHQgJiZyZXN1bHQpOworCisgICAgLyoqIENvbWJpbmVzIHRoaXMgcmVzdWx0cyB3aXRoIG90aGVyIHJlc3VsdHMuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgcGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpOworCisgICAgLyoqIFJldHJpZXZlIChnZXQgYW5kIG1vdmUgb3V0KSBmYWlsdXJlcyBhbmQgcmV0dXJuIHRoZSBmYWlsdXJlIHN0YXR1cy4gKi8KKyAgICBjMl9zdGF0dXNfdCByZXRyaWV2ZUZhaWx1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCitwcml2YXRlOgorICAgIC8qKiBTZXR0aW5nIHJlc3VsdHMgYmFzZWQgb24gYSBzaW5nbGUgc3RhdHVzLiBUaGlzIGlzIHVzZWQgd2hlbiBhY3R1YWwgc2V0dGluZyBjb3VsZCBub3QgYmUKKyAgICAgKiAgYXR0ZW1wdGVkIHRvIGdldCBhIHNpbmdsZSBDMlNldHRpbmdSZXN1bHQsIG9yIHdoZW4gYSBzZXR0aW5nIHN1Y2NlZWRlZCB3aXRob3V0CisgICAgICogICdjb21wbGFpbnRzJy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjMl9zdGF0dXNfdCBzdGF0dXMpOworICAgICAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VULCBDT1JSVVBURUQgb3IgTk9fTUVNT1JZCisgICAgICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQsIGJ1dAorICAgICAgICAvLyBOT19NRU1PUlkgbWF5IG5vdCBhbGxvdyB1cyB0byBjcmVhdGUgYSByZXN1bHRzIHN0cnVjdHVyZS4KKworICAgIC8qKgorICAgICAqIE9uZSBvZiBPSywgQkFEX0lOREVYLCBCQURfVkFMVUUsIEJBRF9TVEFURSwgTk9fTUVNT1JZLCBUSU1FRF9PVVQsIEJMT0NLSU5HIG9yIENPUlJVUFRFRC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBfbVN0YXR1cyBfX3VudXNlZDsKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBpbmRpdmlkdWFsIHNldHRpbmcgcmVzdWx0IGRldGFpbHMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IF9tUmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBlbnVtZXJhdGUgZmllbGRzIG9mIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHMgeworICAgIHN0cnVjdCBfSW5zcGVjdG9yOworCisgICAgLyoqCisgICAgICogQW4gZXh0ZW5kZWQgZmllbGQgZGVzY3JpcHRvciBvYmplY3Qgd2l0aCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIChsaW5lYWdlIGJhY2sgdG8gdGhlIHJvb3Qgb2YKKyAgICAgKiB0aGUgcGFyYW0pLgorICAgICAqLworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGVfdDsgLy8vPCBmaWVsZCB0eXBlCisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBOYW1lZFZhbHVlc1R5cGU7IC8vLzwgbmFtZWQgdmFsdWVzIGxpc3QgdHlwZQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgICAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIG5hbWUtdmFsdWUgcGFpcmluZ3MgZm9yIHRoaXMgZmllbGQuIFRoZSByZXR1cm5lZCByZWZlcmVuY2UgaXMKKyAgICAgICAgICogb25seSB2YWxpZCBkdXJpbmcgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhbiBpbmRleCBvZiAwLCBhbmQKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGhhcyBhbiBpbmRleCBvZiAzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgICAgICAvLy8gVFtdIGFycmF5cyBpZiB0aGlzIGluZm8gY29tZXMgZnJvbSBhIEMyUGFyYW06OkluZGV4IG9iamVjdCwgYW5kIHRoZSBjdXJyZW50bHkgdXNlZAorICAgICAgICAvLy8gZXh0ZW50IGlmIGl0IGNvbWVzIGZyb20gYSBDMlBhcmFtIG9iamVjdC4gUmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZQorICAgICAgICAvLy8gZmllbGQgaXMgbm90IGFuIGFycmF5LgorICAgICAgICBzaXplX3QgZXh0ZW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAoc3RydWN0dXJhbCkgZGVwdGggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZgorICAgICAgICAgKiAgMCwgYW5kIHBhcmFtLnN0cnVjdC5maWVsZCBvciBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YgMS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkZXB0aCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQncyBhcnJheS4gRS5nLiBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIHRoaXMgaXMgdGhlIG9mZnNldAorICAgICAgICAgKiBvZiBpdHMgc21hbGxlc3Qgc2libGluZzogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzBdLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5T2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZXh0ZW50KCkgKiBzaXplKCkKKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheVNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGUgYmFzZSBmaWVsZC4gVGhlIGJhc2UgZmllbGQgaXMgYSBjb3VzaW4gb2YgdGhlIGN1cnJlbnQgZmllbGQgd2hlcmUKKyAgICAgICAgICogYWxsIGluZGljZXMgYXJlIDAuIEUuZy4gdGhlIHRoZSBiYXNlIGZpZWxkIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaXMKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdLiBCYXNlIGZpZWxkcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yCisgICAgICAgICAqIGFsbCBjb3VzaW4gZmllbGRzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGJhc2VGaWVsZE9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhbiBhcml0aG1ldGljIChpbnRlZ3JhbCwgY291bnRlciBvciBmbG9hdCkgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzQXJpdGhtZXRpYygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gaGF2ZSBhIGZsZXhpYmxlIGV4dGVudC4gZXh0ZW50KCkgcmV0dXJucyB0aGUgY3VycmVudAorICAgICAgICAgKiBleHRlbnQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzRmxleGlibGUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gX21JbXBsICE9IG51bGxwdHI7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5mbyBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIGZpZWxkLCBvciBhbiBpbnZhbGlkIEluZm8gb2JqZWN0IGlmIGl0IGhhcyBubworICAgICAgICAvLy8gcGFyZW50cworICAgICAgICBJbmZvIHBhcmVudCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEluZm8oc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBfbUltcGw7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0luc3BlY3RvcjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYXRvciBvYmplY3Qgb3ZlciBmaWVsZHMgdXNpbmcgSW5mbyBvYmplY3RzLgorICAgICAqLworICAgIHN0cnVjdCBJdGVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCB2YWx1ZV90eXBlOworICAgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCAqIHBvaW50ZXI7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCByZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgICAgLy8vIHJldHVybiBJbmZvIGF0IGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgdmlydHVhbCByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIG1vdmUgdG8gdGhlIG5leHQgZmllbGQKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICYpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CisKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBmaWVsZHMuCisgICAgICovCisgICAgc3RydWN0IExpc3QgeworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdCgpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgTGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIChiYXNlKSBmaWVsZHMgYXQgaW5kZXggMCBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIHRoZQorICAgICAqIGZvbGxvd2luZzoKKyAgICAgKiAgIEZpZWxkcyBvZiBhIHN0cnVjdHVyZSBhcmUgZW51bWVyYXRlZCBpbiBmaWVsZCBvcmRlci4gSG93ZXZlciwgc3ViLWZpZWxkcyBvZiBhIHN0cnVjdHVyZQorICAgICAqICAgYXJlIGVudW1lcmF0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBmaWVsZCwgYW5kIHByaW9yIHRvIHNpYmxpbmcgZmllbGRzLgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSB0aGUgb3JkZXIgb2YgZW51bWVyYXRpb24gaXMgZmlyc3QgYnkgaW5jcmVhc2luZyBvZmZzZXQsIHRoZW4gYnkgZGVjcmVhc2luZyBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBlbnVtZXJhdGUgaXRzIGZpZWxkcworICAgICAqIFxwYXJhbSByZWZsZWN0b3IgcGFyYW1ldGVyIHJlZmxlY3RvciB1c2VkIGZvciBlbnVtZXJhdGlvbgorICAgICAqCisgICAgICogXHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVGaWVsZHMoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGNvdXNpbiBmaWVsZHMgdXAgdG8gZGVwdGggLSBsZXZlbCBmb3IgYSBmaWVsZC4gSWYgbGV2ZWwgaXMgMCwgaXQgZW51bWVyYXRlcworICAgICAqIG9ubHkgdGhlIGZpZWxkLiBGb3IgbGV2ZWwgMSwgaXQgZW51bWVyYXRlcyBhbGwgZmllbGRzIGluIGl0cyBjdXJyZW50IGFycmF5ICh3aGljaCBtYXkgYmUKKyAgICAgKiBpdHNlbGYgaWYgZXh0ZW50IGlzIDEpLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGJ5IGluY3JlYXNpbmcgZmllbGQgb2Zmc2V0LgorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUNvdXNpbnMoCisgICAgICAgICAgICBjb25zdCBJbmZvICZmaWVsZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxldmVsID0gfjApOworCisgICAgLyoqCisgICAgICogTG9jYXRlcyB0aGUgZmllbGQgaW4gYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBsaXN0IG9mIDIgZWxlbWVudHMgLSB0aGUgbW9zdC1zcGVjaWZpYyBmaWVsZAorICAgICAqIGFycmF5IG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIGZpZWxkLiBJZiB0aGUgZmllbGQgaXMgbm90IGEgdmFsaWQgZmllbGQKKyAgICAgKiBzcGVjaWZpZXIgZm9yIHRoaXMgcGFyYW1ldGVyIChlLmcuIGl0IGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgcGFyYW1ldGVyKSwgaXQgcmV0dXJucworICAgICAqIGFuIGVtcHR5IGxpc3QuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCit9OworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWludGVyZmFjZS5oPgorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxYmQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworc3RydWN0IEMyUGFyYW07CisKK2NsYXNzIEMyUGFyYW1VdGlscyB7CisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfUGFyYW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorCisgICAgLy8vIHNhZmUocikgcGFyc2luZyBmcm9tIHBhcmFtZXRlciBibG9iCisgICAgc3RhdGljCisgICAgQzJQYXJhbSAqUGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSk7Cit9OworCisvLy8gXGVuZGNvbmQKKworI2VuZGlmICAvLyBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlOTQ2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhOworCit9Cit9Cit9Cit9CisKKy8qKgorICogU3RvcmVzIGluZm9ybWF0aW9ucyBmcm9tIEMyQmxvY2tQb29sIGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgQzJCbG9jay4KKyAqLworc3RydWN0IEMyX0hJREUgX0MyQmxvY2tQb29sRGF0YSB7CisgICAgZW51bSB0eXBlX3QgOiBpbnQgeworICAgICAgICBUWVBFX0JVRkZFUlBPT0wgPSAwLAorICAgICAgICBUWVBFX0JVRkZFUlFVRVVFLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgX0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfl9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7Cit9OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKy8qKgorICogSW50ZXJuYWwgb25seSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrcyBieSBibG9jayBwb29sL2J1ZmZlciBwYXNzaW5nIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcdG9kbyB0aGlzIG11c3QgYmUgaGlkZGVuCisgKi8KK3N0cnVjdCBfQzJCbG9ja0ZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIG9mZnNldCBhbGxvdHRlZCByYW5nZSBvZmZzZXQKKyAgICAgKiBccGFyYW0gc2l6ZSAgYWxsb3R0ZWQgc2l6ZQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCBzZWN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGNyb3AgIGFsbG90dGVkIGNyb3AgcmVnaW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAxRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMUQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazFEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAyRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMkQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2syRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJwb29sIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgICAgICAgICAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gYnVmZmVyUG9vbERhdGEgICAgcG9pbnRlciB0byBidWZmZXJwb29sIGRhdGEgd2hlcmUgdGhlIGJ1ZmZlcnBvb2wKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHtcY29kZSB0cnVlfSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnBvb2wgZGF0YSwge1xjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKTsKKworICAgIC8qCisgICAgICogTGlmZSBDeWNsZSBNYW5hZ2VtZW50IG9mIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrcworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIEEgYmxvY2sgdGhhdCBpcyBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIHJlcXVpcmVzIHNvbWUKKyAgICAgKiBzcGVjaWFsIHRyZWF0bWVudCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gSW4gcGFydGljdWxhciwgaWYgdGhlIGJsb2NrCisgICAgICogY29ycmVzcG9uZHMgdG8gYSBoZWxkIChkZXF1ZXVlZC9hdHRhY2hlZCkgR3JhcGhpY0J1ZmZlciBpbiBhIHNsb3Qgb2YgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBpdHMgZGVzdHJ1Y3Rpb24gc2hvdWxkIHRyaWdnZXIgYSBjYWxsIHRvCisgICAgICogSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyKCkuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAgKiBHcmFwaGljQnVmZmVyIGlzIG5vdCBoZWxkLCBpLmUuLCBpZiBpdCBoYXMgYmVlbiBxdWV1ZWQgb3IgZGV0YWNoZWQsCisgICAgICogY2FuY2VsQnVmZmVyKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdXBvbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqCisgICAgICogX0MyQmxvY2tQb29sRGF0YSBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIGluY2x1ZGVzIHR3bworICAgICAqIG1haW4gcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgICAqICAgLSAiaGVsZCIgc3RhdHVzOiBXaGV0aGVyIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQgdXBvbgorICAgICAqICAgICBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICogICAtIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQ6IFRoZSBxdWFkcnVwbGUgKGlnYnAsIGdlbmVyYXRpb24sIGJxSWQsCisgICAgICogICAgIGJxU2xvdCksIHdoZXJlIGlnYnAgaXMgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBnZW5lcmF0aW9uIGlzIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIsIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgYnFJZCBpcyB0aGUgZ2xvYmFsbHkgdW5pcXVlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZSwgYW5kCisgICAgICogICAgIGJxU2xvdCBpcyB0aGUgc2xvdCBpbiB0aGUgYnVmZmVycXVldWUuCisgICAgICoKKyAgICAgKiBpZ2JwIGlzIHRoZSBpbnN0YW5jZSBvZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIG9uIHdoaWNoIGNhbmNlbEJ1ZmZlcigpCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgImhlbGQiIHN0YXR1cyBpcyB0cnVlIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4KKyAgICAgKiAoYnFTbG90IGlzIGFuIGlucHV0IHRvIGNhbmNlbEJ1ZmZlcigpLikgSG93ZXZlciwgb25seSBnZW5lcmF0aW9uLCBicUlkCisgICAgICogYW5kIGJxU2xvdCBhcmUgcmV0YWluZWQgd2hlbiBhIGJsb2NrIGlzIHRyYW5zZmVycmVkIGZyb20gb25lIHByb2Nlc3MgdG8KKyAgICAgKiBhbm90aGVyLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nCisgICAgICogcHJvY2Vzc2VzIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IG9mICJoZWxkIiBzdGF0dXMgYW5kIGlnYnAuIEJlbG93IGFyZQorICAgICAqIGZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlOgorICAgICAqCisgICAgICogICAtIEdldEJ1ZmZlclF1ZXVlRGF0YSgpOiBSZXR1cm5zIGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdC4KKyAgICAgKiAgIC0gSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byB0cnVlLgorICAgICAqICAgLSBCZWdpblRyYW5zZmVyQmxvY2tUb0NsaWVudCgpL0VuZFRyYW5zZmVyQmxvY2tUb0NsaWVudCgpOgorICAgICAqICAgICBDbGVhciAiaGVsZCIgc3RhdHVzIHRvIGZhbHNlIGlmIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLAorICAgICAqICAgICBvdGhlcndpc2UgImhlbGQiIHN0YXR1cyByZW1haW5zIHRydWUuCisgICAgICogICAtIEJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKCkvRW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKCk6CisgICAgICogICAgIFRoZSB3aWxsIGtlZXAgImhlbGQiIHN0YXR1cyB0cnVlIGlmIGF0dGFjaCB3YXMgZWxpZ2libGUuCisgICAgICogICAgIE90aGVyd2lzZSwgImhlbGQiIHN0YXR1cyBpcyBjbGVhcmVkIHRvIGZhbHNlLiBJbiB0aGF0IGNhc2UsCisgICAgICogICAgIG93bmVyc2hpcCBvZiBidWZmZXIgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRvIGJ1ZmZlcnF1ZXVlLgorICAgICAqICAgLSBEaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKCkKKyAgICAgKiAgICAgVGhpcyB3aWxsIGNsZWFyICJoZWxkIiBzdGF0dXMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gX0MyQmxvY2tQb29sRGF0YSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgICAgICogY2FsbGluZyBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgpLgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQ29uc2lzdGVuY3kgd2l0aCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIE9wZXJhdGlvbnMKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogZGVxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBibG9ja3Bvb2wuIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICogICAgIG1hbnVhbGx5LiBUaGUgYmxvY2twb29sIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY29ycmVjdAorICAgICAqICAgICBpbmZvcm1hdGlvbiBmb3IgX0MyQmxvY2tQb29sRGF0YSwgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBCZWZvcmUgcXVldWVCdWZmZXIoKSBpcyBjYWxsZWQsIERpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkIHRvIHRlc3QgZWxpZ2liaWxpdHkuIElmIGl0J3Mgbm90IGVsaWdpYmxlLCBkbyBub3QgY2FsbAorICAgICAqICAgICBxdWV1ZUJ1ZmZlcigpLgorICAgICAqCisgICAgICogYXR0YWNoQnVmZmVyKCkgLSByZW1vdGUgbWlncmF0aW9uIG9ubHkuCisgICAgICogICAtIExvY2FsIG1pZ3JhdGlvbiBvbiBibG9ja3Bvb2wgc2lkZSB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBieQorICAgICAqICAgICBibG9ja3Bvb2wuCisgICAgICogICAtIEJlZm9yZSBhdHRhY2hCdWZmZXIoKSwgQmVnaW5BdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUgY2FsbGVkCisgICAgICogICAgIHRvIHRlc3QgZWxpZ2libGl0eS4KKyAgICAgKiAgIC0gQWZ0ZXIgYXR0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBFbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQKKyAgICAgKiAgICAgYmUgY2FsbGVkLiBUaGlzIHdpbGwgc2V0ICJoZWxkIiBzdGF0dXMgdG8gdHJ1ZS4gSWYgaXQgcmV0dXJuZWQKKyAgICAgKiAgICAgZmFsc2UsIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBkZXRhY2hCdWZmZXIoKSAtIG5vLW9wLgorICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnF1ZXVlIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBccCBnZW5lcmF0aW9uIHNldCB0byBudWxscHRyIHdpbGwgcmV0dXJuCisgICAgICogd2hldGhlciB0aGUgYmxvY2sgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgYnV0IHdpbGwgbm90CisgICAgICogZmlsbCBpbiB0aGUgdmFsdWVzIGZvciBccCBnZW5lcmF0aW9uLCBccCBicUlkIG9yIFxwIGJxU2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHBvb2xEYXRhICAgYmxvY2twb29sIGRhdGEuCisgICAgICogXHBhcmFtW291dF0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbVtvdXRdIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIG93bmluZyB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtW291dF0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50NjRfdCogYnFJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIEhvbGQgYSBibG9jayBmcm9tIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gb3duZXIgICAgYmxvY2sgb3duZXIgZnJvbSBjbGllbnQgYnVmZmVycXVldWUgbWFuYWdlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBleHBpcmVkLCB0aGUgYmxvY2sgaXMgbm90IG93bmVkIGJ5IGNsaWVudAorICAgICAqICAgICAgICAgICAgICAgICBhbnltb3JlLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBibG9jay4gVGhpcyBpcyBub3QgbmVlZGVkIHdoZW4gdGhlIGJsb2NrIGlzIGxvY2FsLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBhIGJsb2NrIHRvIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHByb2Nlc3MuIFRoaXMgYmxvY2tzCisgICAgICogYnVmZmVycXVldWUgbWlncmF0aW9uIGZyb20gaGFwcGVuaW5nLiBUaGUgYmxvY2sgc2hvdWxkIGJlIGluIGhlbGQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZiB0cmFuc2ZlciBpcyBlbGlnaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgQmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBhZnRlciB0cmFuc2ZlcnJpbmcgdGhlIHNwZWNpZmllZCBibG9jayBpcyBmaW5pc2hlZC4gTWFrZSBzdXJlCisgICAgICogdGhhdCBCZWdpblRyYW5zZmVyQmxvY2tUb0NsaWVudCgpIHdhcyBjYWxsZWQgYmVmb3JlIHRoaXMgY2FsbC4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCB1bmJsb2NrIGJ1ZmZlcnF1ZXVlIG1pZ3JhdGlvbi4gSWYgdHJhbnNmZXIgcmVzdWx0IHdhcworICAgICAqIHN1Y2Nlc3NmdWwsIHRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2sgbm90IHRvIHRyaWdnZXIgYQorICAgICAqIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgdHJhbnNmZXIgYmVnYW4gYmVmb3JlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBFbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgYm9vbCB0cmFuc2ZlcnJlZCk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGEgYmxvY2sgdG8gYmUgbWlncmF0ZWQgdG8gYW5vdGhlciBidWZmZXJxdWV1ZS4gVGhpcyBibG9ja3MKKyAgICAgKiByZW5kZXJpbmcgdW50aWwgbWlncmF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLiAgVGhlIGJsb2NrIHNob3VsZCBiZSBpbgorICAgICAqIGhlbGQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZiBtaWdyYXRpb24gaXMgZWxpZ2libGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIgbWlncmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgaXMgZmluaXNoZWQuIE1ha2Ugc3VyZQorICAgICAqIHRoYXQgQmVnaW5BdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSB3YXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgdW5ibG9jayByZW5kZXJpbmcuIGlmIHJlZGVyaW5nIGlzIHRyaWVkIGR1cmluZyBtaWdyYXRpb24sCisgICAgICogdGhpcyByZXR1cm5zIGZhbHNlLiBJbiB0aGF0IGNhc2UsIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQuCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgbWlncmF0aW9uIGlzIGVsaWdpYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBFbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgaW50MzJfdCBicVNsb3QpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGEgYmxvY2sgdG8gYmUgcmVuZGVyZWQgdmVyeSBzb29uLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgbWlncmF0aW9uIGlzIGVsaWdpYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBEaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhOGYyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKK3N0cnVjdCBDMl9ISURFIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgU2V0T2Zmc2V0KEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgIGZkLl9tRmllbGRJZC5fbU9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEVuZE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IHBhcmFtU2l6ZSA9IDApIHsKKyAgICAgICAgdWludDMyX3QgZW5kT2Zmc2V0ID0gZmQuX21GaWVsZElkLl9tT2Zmc2V0ICsgZmQuX21FeHRlbnQgKiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgICAgICAvLy8gZm9yIGZsZXggcGFyYW1ldGVycyByZXR1cm4gcGFyYW1TaXplIGlmIGdpdmVuCisgICAgICAgIHJldHVybiBmZC5fbUV4dGVudCA/IGVuZE9mZnNldCA6IHN0ZDo6bWF4KGVuZE9mZnNldCwgcGFyYW1TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0SW5kZXgoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21JbmRleDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0QXR0cmliKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgICAgICByZXR1cm4gcGQuX21BdHRyaWI7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBvZmZzZXQsIHNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgX0MyRmllbGRJZCBmaWVsZCkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBmaWVsZC5fbU9mZnNldCwgZmllbGQuX21TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgdm9pZCBUcmltUGFyYW0oQzJQYXJhbSAqcGFyYW0sIHVpbnQzMl90IG5ld1NpemUpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSAmJiBwYXJhbS0+c2l6ZSgpID4gbmV3U2l6ZSAmJiBuZXdTaXplID49IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcGFyYW0tPl9tU2l6ZSA9IG5ld1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgQWRkTmFtZWRWYWx1ZXMoCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgJiZuYW1lZFZhbHVlcykgeworICAgICAgICBmZC5fbU5hbWVkVmFsdWVzID0gc3RkOjptb3ZlKG5hbWVkVmFsdWVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIENyZWF0ZVN0cnVjdERlc2NyaXB0b3IoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykgeworICAgICAgICByZXR1cm4gQzJTdHJ1Y3REZXNjcmlwdG9yKGluZGV4LCBzdGQ6Om1vdmUoZmllbGRzKSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyRmllbGREZXNjcmlwdG9yIE9mZnNldEZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHNpemVfdCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yKGZkLCBvZmZzZXQpOworICAgIH0KKworICAgIC8vIGV4cG9zZSBhdHRyaWJ1dGVzCisgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwNGY3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJxQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dWkvQnVmZmVyUXVldWVEZWZzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisKKyNpbmNsdWRlIDx0eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCit1c2luZyA6OmFuZHJvaWQ6OkJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgOjphbmRyb2lkOjpDMkFuZHJvaWRNZW1vcnlVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6RmVuY2U7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKwordXNpbmcgSEJ1ZmZlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzI6OkhhcmR3YXJlQnVmZmVyOwordXNpbmcgSFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6YjJoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6aDJiOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6SEZlbmNlV3JhcHBlcjsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMAorICAgICAgICA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSA6IHB1YmxpYyBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIGJvb2wgaGVsZDsKKyAgICBib29sIGxvY2FsOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBib29sIHRyYW5zZmVyOyAvLyBsb2NhbCB0cmFuc2ZlciB0byByZW1vdGUKKyAgICBib29sIGF0dGFjaDsgLy8gYXR0YWNoIG9uIHJlbW90ZQorICAgIGJvb2wgZGlzcGxheTsgLy8gZGlzcGxheSBvbiByZW1vdGU7CisgICAgc3RkOjp3ZWFrX3B0cjxpbnQ+IG93bmVyOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IGxvY2FsUG9vbDsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbG9jazsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiAmb3duZXIsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+JiBwb29sKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgbWlncmF0ZShjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgdWludDMyX3QgdG9HZW5lcmF0aW9uLCB1aW50NjRfdCB0b0JxSWQsCisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gKmJ1ZmZlcnMsIHVpbnQzMl90IG9sZEdlbmVyYXRpb24pOworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHBvb2xEYXRhLT5nZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKGJxSWQpIHsKKyAgICAgICAgICAgICAgICAqYnFJZCA9IHBvb2xEYXRhLT5icUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJxU2xvdCkgeworICAgICAgICAgICAgICAgICpicVNsb3QgPSBwb29sRGF0YS0+YnFTbG90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7CisgICAgICAgIHBvb2xEYXRhLT5vd25lciA9IG93bmVyOworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgfQorICAgIGlmIChwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6QmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIHBvb2xEYXRhLT50cmFuc2ZlciA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpFbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgYm9vbCB0cmFuc2ZlcikgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIHBvb2xEYXRhLT50cmFuc2ZlciA9IGZhbHNlOworICAgIGlmICh0cmFuc2ZlcikgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHBvb2xEYXRhLT5sb2NrKTsKKyAgICBpZiAocG9vbERhdGEtPmxvY2FsIHx8IHBvb2xEYXRhLT5kaXNwbGF5IHx8CisgICAgICAgIHBvb2xEYXRhLT5hdHRhY2ggfHwgIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5icUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+YXR0YWNoID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gaWYgZGlzcGxheSB3YXMgdHJpZWQgZHVyaW5nIGF0dGFjaCwgYnVmZmVyIHNob3VsZCBiZSByZXRpcmVkIEFTQVAuCitib29sIF9DMkJsb2NrRmFjdG9yeTo6RW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgIGludDMyX3QgYnFTbG90KSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7CisgICAgaWYgKHBvb2xEYXRhLT5sb2NhbCB8fCAhcG9vbERhdGEtPmF0dGFjaCApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocG9vbERhdGEtPmRpc3BsYXkpIHsKKyAgICAgICAgcG9vbERhdGEtPmF0dGFjaCA9IGZhbHNlOworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5hdHRhY2ggPSBmYWxzZTsKKyAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgcG9vbERhdGEtPm93bmVyID0gb3duZXI7CisgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgIHBvb2xEYXRhLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7CisgICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkRpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIGlmIChwb29sRGF0YS0+bG9jYWwgfHwgcG9vbERhdGEtPmRpc3BsYXkgfHwgIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5icUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+ZGlzcGxheSA9IHRydWU7CisgICAgaWYgKHBvb2xEYXRhLT5hdHRhY2gpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50NjRfdCB1c2FnZTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICB1aW50MzJfdCBicVNsb3Q7CisgICAgICAgIGFuZHJvaWQ6Ol9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBpZiAoYnFJZCB8fCBicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAvLyBCUUJCUAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClicVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworbmFtZXNwYWNlIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworYm9vbCBnZXRHZW5lcmF0aW9uTnVtYmVyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbikgeworICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgIGludCBzbG90e307CisgICAgYm9vbCBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbnt9OworICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworCisgICAgdXNpbmcgSW5wdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdXNpbmcgT3V0cHV0ID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGVxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBwcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIElucHV0ezY0MCwgNDgwLCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsIDB9LAorICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24sICZmZW5jZV0KKyAgICAgICAgICAgIChIU3RhdHVzIGhTdGF0dXMsIGludDMyX3QgaFNsb3QsIE91dHB1dCBjb25zdCYgaE91dHB1dCkgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KGhTbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoIWgyYihoU3RhdHVzLCAmc3RhdHVzKSB8fCAhaDJiKGhPdXRwdXQuZmVuY2UsICZmZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPdXRwdXQuYnVmZmVyTmVlZHNSZWFsbG9jYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkgfHwgc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgSEZlbmNlV3JhcHBlciBoRmVuY2VXcmFwcGVye307CisgICAgaWYgKCFiMmgoZmVuY2UsICZoRmVuY2VXcmFwcGVyKSkgeworICAgICAgICAodm9pZClwcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpKS5pc09rKCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZlbmNlIHJlY2VpdmVkIGZyb20gZGVxdWV1ZUJ1ZmZlci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAvLyBOLkIuIFRoaXMgYXNzdW1lcyByZXF1ZXN0QnVmZmVyIyByZXR1cm5zIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24KKyAgICAvLyBpbnN0ZWFkIG9mIGEgbmV3IGFsbG9jYXRpb24uCisgICAgdHJhbnNSZXN1bHQgPSBwcm9kdWNlci0+cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXIsICZnZW5lcmF0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBIQnVmZmVyIGNvbnN0JiBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKKyAgICAgICAgICAgICAgICBpZiAoaDJiKGhTdGF0dXMsICZzdGF0dXMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICpnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbk51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICh2b2lkKXByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCkpLmlzT2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAodm9pZClwcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpKS5pc09rKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7Citwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBJR0JQIG5vdy4KKyAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlID0gdXNhZ2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgICAgICBpbnQgc2xvdHt9OworICAgICAgICBib29sIGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9ue307CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKKworICAgICAgICB7IC8vIENhbGwgZGVxdWV1ZUJ1ZmZlcigpLgorICAgICAgICAgICAgdXNpbmcgSW5wdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVySW5wdXQ7CisgICAgICAgICAgICB1c2luZyBPdXRwdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVyT3V0cHV0OworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBJbnB1dHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCl9LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3QsICZidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICZmZW5jZV0oSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgY29uc3QmIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KGhTbG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaDJiKGhTdGF0dXMsICZzdGF0dXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoMmIoaE91dHB1dC5mZW5jZSwgJmZlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT3V0cHV0LmJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpIHx8IHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKyttRHFGYWlsdXJlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6VElNRURfT1VUIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVyIGlzIGJsb2NrZWQgdGVtcG9yYXJpbHkuIFJldHJ5aW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HRCgiY2Fubm90IGRlcXVldWUgYnVmZmVyICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURxRmFpbHVyZSA9IDA7CisgICAgICAgICAgICBtTGFzdERxVHMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgICAgICBIRmVuY2VXcmFwcGVyIGhGZW5jZVdyYXBwZXJ7fTsKKyAgICAgICAgaWYgKCFiMmgoZmVuY2UsICZoRmVuY2VXcmFwcGVyKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZmVuY2UgcmVjZWl2ZWQgZnJvbSBkZXF1ZXVlQnVmZmVyLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZlbmNlV2FpdFRpbWVNcyA9IDEwOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmZW5jZS0+d2FpdChrRmVuY2VXYWl0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLUVUSU1FKSB7CisgICAgICAgICAgICAgICAgLy8gZmVuY2UgaXMgbm90IHNpZ25hbGxlZCB5ZXQuCisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzaWduYWxUaW1lID49IDAgJiYgc2lnbmFsVGltZSA8IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ2FsbGJhY2sobVByb2R1Y2VySWQsIHNsb3QsIHNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgZmVuY2Ugc2lnbmFsIHRpbWUgb2YgJWxsZCIsIChsb25nIGxvbmcpc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gJnNsb3RCdWZmZXIgPSBtQnVmZmVyc1tzbG90XTsKKyAgICAgICAgdWludDMyX3Qgb3V0R2VuZXJhdGlvbjsKKyAgICAgICAgaWYgKGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXIsICZvdXRHZW5lcmF0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU3RhdHVzIGhTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJ1ZmZlciBjb25zdCYgaEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoMmIoaFN0YXR1cywgJnN0YXR1cykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDJiKGhCdWZmZXIsICZzbG90QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbk51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtR2VuZXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0dGluZyBnZW5lcmF0aW9uICMgbGF6aWx5IGR1ZSB0byBkZXF1ZXVlIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSBvdXRHZW5lcmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyIHdyYXBzICVsbHUgJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgIEMySGFuZGxlICpjMkhhbmRsZSA9IGFuZHJvaWQ6OldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPndpZHRoLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICBpZiAoYzJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjMkhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tzbG90XSA9IHBvb2xEYXRhOworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmxvY2sgd2FzIG5vdCBjcmVhdGVkLiBjYWxsIHJlcXVlc3RCdWZmZXIjIGFnYWluIG5leHQgdGltZS4KKyAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1HZW5lcmF0aW9uKDApLAorICAgICAgICAgIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwgbUxhc3REcUxvZ1RzKDApLAorICAgICAgICAgIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48SFN0YXR1cz4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIU3RhdHVzPih0cmFuc1Jlc3VsdCkgPT0gSFN0YXR1czo6Tk9fSU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5RGVsYXlVcyA9IDEwMDAwOworCisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUxhc3REcUxvZ1RzID09IDApIHsKKyAgICAgICAgICAgIG1MYXN0RHFMb2dUcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgICAgIGlmIChub3cgPj0gbUxhc3REcUxvZ1RzICsgNTAwMDAwMCkgeworICAgICAgICAgICAgICAgIGlmIChub3cgPj0gbUxhc3REcVRzICsgMTAwMDAwMCB8fCBtRHFGYWlsdXJlID4gNSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygibGFzdCBzdWNjZXNzZnVsIGRlcXVldWUgd2FzICVsbGQgdXMgYWdvLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlenUgY29uc2VjdXRpdmUgZmFpbHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShub3cgLSBtTGFzdERxVHMpLCBtRHFGYWlsdXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhc3REcUxvZ1RzID0gbm93OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUHJvZHVjZXJJZCA9PSAwKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOworCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9CTE9DS0lORykgeworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIGluIG9yZGVyIG5vdCB0byBkcmFpbiBjcHUgZnJvbSBjb21wb25lbnQncyBzcGlubmluZworICAgICAgICAgICAgOjp1c2xlZXAoa01heElnYnBSZXRyeURlbGF5VXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICBib29sIGhhdmVHZW5lcmF0aW9uID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHVpbnQ2NF90PiB0cmFuc1Jlc3VsdCA9IHByb2R1Y2VyLT5nZXRVbmlxdWVJZCgpOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlndXJlUHJvZHVjZXIgLS0gZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHByb2R1Y2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZHVjZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0cmFuc1Jlc3VsdCk7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm92aWRlIGduZXJhdGlvbiBudW1iZXIgZnJvbSBwYXJhbWV0ZXIuCisgICAgICAgICAgICBoYXZlR2VuZXJhdGlvbiA9IGdldEdlbmVyYXRpb25OdW1iZXIocHJvZHVjZXIsICZnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIGlmICghaGF2ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZ2V0IGdlbmVyYXRpb25OdW1iZXIgZmFpbGVkICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IG1pZ3JhdGVkID0gMDsKKyAgICAgICAgeworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+CisgICAgICAgICAgICAgICAgICAgIHBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxIU3RhdHVzPiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhTdGF0dXM+KHRyYW5zUmVzdWx0KSA9PSBIU3RhdHVzOjpOT19JTklUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3Qgb2xkR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKHByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSBwcm9kdWNlcklkOworICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uID0gaGF2ZUdlbmVyYXRpb24gPyBnZW5lcmF0aW9uIDogMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IDA7CisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIEFMT0dXKCJpbnZhbGlkIHByb2R1Y2VyIHByb2R1Y2VyKCVkKSwgZ2VuZXJhdGlvbiglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIChib29sKXByb2R1Y2VyLCBoYXZlR2VuZXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVByb2R1Y2VyICYmIGhhdmVHZW5lcmF0aW9uKSB7IC8vIG1pZ3JhdGUgYnVmZmVycworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tpXS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xvdCA9IGRhdGEtPm1pZ3JhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlciwgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJJZCwgbUJ1ZmZlcnMsIG9sZEdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbc2xvdF0gPSBtQnVmZmVyc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sRGF0YXNbc2xvdF0gPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbWlncmF0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldID0gYnVmZmVyc1tpXTsKKyAgICAgICAgICAgICAgICBtUG9vbERhdGFzW2ldID0gcG9vbERhdGFzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcm9kdWNlciAmJiBoYXZlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgQUxPR0QoImxvY2FsIGdlbmVyYXRpb24gY2hhbmdlICV1ICwgIgorICAgICAgICAgICAgICAgICAgImJxSWQ6ICVsbHUgbWlncmF0ZWQgYnVmZmVycyAjICVkIiwKKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCwgbWlncmF0ZWQpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBib29sIGNhbmNlbGxlZCA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbiAmJiBpZ2JwX2lkID09IG1Qcm9kdWNlcklkICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoaWdicF9zbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7CisgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICB1aW50NjRfdCBtUHJvZHVjZXJJZDsKKyAgICB1aW50MzJfdCBtR2VuZXJhdGlvbjsKKyAgICBPblJlbmRlckNhbGxiYWNrIG1SZW5kZXJDYWxsYmFjazsKKworICAgIHNpemVfdCBtRHFGYWlsdXJlOworICAgIGludDY0X3QgbUxhc3REcVRzOworICAgIGludDY0X3QgbUxhc3REcUxvZ1RzOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1TYXZlZFByb2R1Y2VyOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107CisgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyKSA6CisgICAgICAgIGhlbGQocHJvZHVjZXIgJiYgYnFJZCAhPSAwKSwgbG9jYWwoZmFsc2UpLAorICAgICAgICBnZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBicUlkKGJxSWQpLCBicVNsb3QoYnFTbG90KSwKKyAgICAgICAgdHJhbnNmZXIoZmFsc2UpLCBhdHRhY2goZmFsc2UpLCBkaXNwbGF5KGZhbHNlKSwKKyAgICAgICAgb3duZXIob3duZXIpLCBpZ2JwKHByb2R1Y2VyKSwKKyAgICAgICAgbG9jYWxQb29sKCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpIDoKKyAgICAgICAgaGVsZCh0cnVlKSwgbG9jYWwodHJ1ZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICB0cmFuc2ZlcihmYWxzZSksIGF0dGFjaChmYWxzZSksIGRpc3BsYXkoZmFsc2UpLAorICAgICAgICBpZ2JwKHBvb2wgPyBwb29sLT5tUHJvZHVjZXIgOiBudWxscHRyKSwKKyAgICAgICAgbG9jYWxQb29sKHBvb2wpIHsKK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIHsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsKSB7CisgICAgICAgIGlmIChsb2NhbFBvb2wpIHsKKyAgICAgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlnYnAgJiYgIW93bmVyLmV4cGlyZWQoKSkgeworICAgICAgICBpZ2JwLT5jYW5jZWxCdWZmZXIoYnFTbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7CisgICAgfQorfQoraW50IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjptaWdyYXRlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIHVpbnQzMl90IHRvR2VuZXJhdGlvbiwgdWludDY0X3QgdG9CcUlkLAorICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAqYnVmZmVycywgdWludDMyX3Qgb2xkR2VuZXJhdGlvbikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChsb2NrKTsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJidWZmZXIgaXMgbm90IG93bmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFsb2NhbCB8fCAhbG9jYWxQb29sKSB7CisgICAgICAgIEFMT0dWKCJwb29sIGlzIG5vdCBsb2NhbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChicVNsb3QgPCAwIHx8IGJxU2xvdCA+PSBOVU1fQlVGRkVSX1NMT1RTIHx8ICFidWZmZXJzW2JxU2xvdF0pIHsKKyAgICAgICAgQUxPR1YoInNsb3QgaXMgbm90IGluIGVmZmVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh0b0dlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbiAmJiBicUlkID09IHRvQnFJZCkgeworICAgICAgICBBTE9HVigiY2Fubm90IG1pZ3JhdGUgdG8gc2FtZSBidWZmZXJxdWV1ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChvbGRHZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKKyAgICAgICAgQUxPR1YoImNhbm5vdCBtaWdyYXRlIHN0YWxlIGJ1ZmZlciIpOworICAgIH0KKyAgICBpZiAodHJhbnNmZXIpIHsKKyAgICAgICAgLy8gZWl0aGVyIHRyYW5zZmVycmVkIG9yIGRldGFjaGVkLgorICAgICAgICBBTE9HVigiYnVmZmVyIGlzIGluIHRyYW5zZmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gY29uc3QmIGdyYXBoaWNCdWZmZXIgPSBidWZmZXJzW2JxU2xvdF07CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcih0b0dlbmVyYXRpb24pOworCisgICAgSEJ1ZmZlciBoQnVmZmVye307CisgICAgdWludDMyX3QgaEdlbmVyYXRpb25OdW1iZXJ7fTsKKyAgICBpZiAoIWIyaChncmFwaGljQnVmZmVyLCAmaEJ1ZmZlciwgJmhHZW5lcmF0aW9uTnVtYmVyKSkgeworICAgICAgICBBTE9HRCgiSSB0byBPIGNvbnZlcnNpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBib29sIGNvbnZlcnRlZHt9OworICAgIHN0YXR1c190IGJTdGF0dXN7fTsKKyAgICBpbnQgc2xvdDsKKyAgICBpbnQgKm91dFNsb3QgPSAmc2xvdDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgcHJvZHVjZXItPmF0dGFjaEJ1ZmZlcihoQnVmZmVyLCBoR2VuZXJhdGlvbk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgWyZjb252ZXJ0ZWQsICZiU3RhdHVzLCBvdXRTbG90XSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU3RhdHVzIGhTdGF0dXMsIGludDMyX3QgaFNsb3QsIGJvb2wgcmVsZWFzZUFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gaDJiKGhTdGF0dXMsICZiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRTbG90ID0gc3RhdGljX2Nhc3Q8aW50PihoU2xvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkICYmIHJlbGVhc2VBbGwgJiYgYlN0YXR1cyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0dXMgPSBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkgfHwgIWNvbnZlcnRlZCB8fCBiU3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dEKCJhdHRhY2ggZmFpbGVkICVkIiwgc3RhdGljX2Nhc3Q8aW50PihiU3RhdHVzKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgQUxPR1YoImxvY2FsIG1pZ3JhdGlvbiBmcm9tIGdlbiAldSA6ICV1IHNsb3QgJWQgOiAlZCIsCisgICAgICAgICAgZ2VuZXJhdGlvbiwgdG9HZW5lcmF0aW9uLCBicVNsb3QsIHNsb3QpOworICAgIGdlbmVyYXRpb24gPSB0b0dlbmVyYXRpb247CisgICAgYnFJZCA9IHRvQnFJZDsKKyAgICBicVNsb3QgPSBzbG90OworICAgIHJldHVybiBzbG90OworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjp+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIHt9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6Y29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jb25maWd1cmVQcm9kdWNlcihwcm9kdWNlcik7CisgICAgfQorfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OnNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5zZXRSZW5kZXJDYWxsYmFjayhyZW5kZXJDYWxsYmFjayk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjFlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay90eXBlcy5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPHVpL0J1ZmZlclF1ZXVlRGVmcy5oPgorI2luY2x1ZGUgPHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorI2luY2x1ZGUgPHZuZGsvaGFyZHdhcmVfYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZ3JhcGhpY3MgeworbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKy8vIFRPRE86IG1vdmUgdGhpcyBpbnRvIHVpL0J1ZmZlclF1ZXVlRGVmcy5oIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZAorLy8gdG8gaW5jbHVkZSBoZWFkZXJzIGZyb20gbGliZ3VpLgorZW51bSB7CisgICAgLy8gVGhlIEFQSSBudW1iZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBwcm9kdWNlcgorICAgIENVUlJFTlRMWV9DT05ORUNURURfQVBJID0gLTEsCisgICAgLy8gVGhlIEFQSSBudW1iZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHByb2R1Y2VyIGlzIGNvbm5lY3RlZAorICAgIE5PX0NPTk5FQ1RFRF9BUEkgICAgICAgID0gMCwKK307CisKKy8vIFN0YXR1cworLy8gPT09PT09CisKK2Jvb2wgYjJoKHN0YXR1c190IGZyb20sIEhTdGF0dXMqIHRvLAorICAgICAgICAgYm9vbCogYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24sIGJvb2wqIHJlbGVhc2VBbGxCdWZmZXJzKSB7CisgICAgc3dpdGNoIChmcm9tKSB7CisgICAgY2FzZSBPSzoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6T0s7IGJyZWFrOworICAgIGNhc2UgTk9fTUVNT1JZOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpOT19NRU1PUlk7IGJyZWFrOworICAgIGNhc2UgTk9fSU5JVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6Tk9fSU5JVDsgYnJlYWs7CisgICAgY2FzZSBCQURfVkFMVUU6CisgICAgICAgICp0byA9IEhTdGF0dXM6OkJBRF9WQUxVRTsgYnJlYWs7CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6REVBRF9PQkpFQ1Q7IGJyZWFrOworICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICp0byA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOyBicmVhazsKKyAgICBjYXNlIFRJTUVEX09VVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6VElNRURfT1VUOyBicmVhazsKKyAgICBjYXNlIFdPVUxEX0JMT0NLOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpXT1VMRF9CTE9DSzsgYnJlYWs7CisgICAgY2FzZSBVTktOT1dOX0VSUk9SOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXNfdCBtYXNrID0KKyAgICAgICAgICAgICAgICAoYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPyBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gOiAwKQorICAgICAgICAgICAgICAgIHwgKHJlbGVhc2VBbGxCdWZmZXJzID8gQnVmZmVyUXVldWVEZWZzOjpSRUxFQVNFX0FMTF9CVUZGRVJTIDogMCk7CisgICAgICAgIGlmIChmcm9tICYgfm1hc2spIHsKKyAgICAgICAgICAgICp0byA9IHN0YXRpY19jYXN0PEhTdGF0dXM+KGZyb20pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnRvID0gSFN0YXR1czo6T0s7CisgICAgICAgICAgICBpZiAoYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPSBmcm9tICYgQnVmZmVyUXVldWVEZWZzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlbGVhc2VBbGxCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgKnJlbGVhc2VBbGxCdWZmZXJzID0gZnJvbSAmIEJ1ZmZlclF1ZXVlRGVmczo6UkVMRUFTRV9BTExfQlVGRkVSUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIoSFN0YXR1cyBmcm9tLCBzdGF0dXNfdCogdG8pIHsKKyAgICBzd2l0Y2ggKGZyb20pIHsKKyAgICBjYXNlIEhTdGF0dXM6Ok9LOgorICAgICAgICAqdG8gPSBPSzsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgICp0byA9IE5PX01FTU9SWTsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpOT19JTklUOgorICAgICAgICAqdG8gPSBOT19JTklUOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OkJBRF9WQUxVRToKKyAgICAgICAgKnRvID0gQkFEX1ZBTFVFOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OkRFQURfT0JKRUNUOgorICAgICAgICAqdG8gPSBERUFEX09CSkVDVDsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgKnRvID0gSU5WQUxJRF9PUEVSQVRJT047IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6VElNRURfT1VUOgorICAgICAgICAqdG8gPSBUSU1FRF9PVVQ7IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6V09VTERfQkxPQ0s6CisgICAgICAgICp0byA9IFdPVUxEX0JMT0NLOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OlVOS05PV05fRVJST1I6CisgICAgICAgICp0byA9IFVOS05PV05fRVJST1I7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICp0byA9IHN0YXRpY19jYXN0PHN0YXR1c190Pihmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZlbmNlCisvLyA9PT09PQorCitIRmVuY2VXcmFwcGVyOjpIRmVuY2VXcmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCogaCkgOiBtSGFuZGxle2h9IHsKK30KKworSEZlbmNlV3JhcHBlcjo6fkhGZW5jZVdyYXBwZXIoKSB7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7Cit9CisKK0hGZW5jZVdyYXBwZXImIEhGZW5jZVdyYXBwZXI6OnNldChuYXRpdmVfaGFuZGxlX3QqIGgpIHsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICBtSGFuZGxlID0gaDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0hGZW5jZVdyYXBwZXImIEhGZW5jZVdyYXBwZXI6Om9wZXJhdG9yPShuYXRpdmVfaGFuZGxlX3QqIGgpIHsKKyAgICByZXR1cm4gc2V0KGgpOworfQorCitoaWRsX2hhbmRsZSBIRmVuY2VXcmFwcGVyOjpnZXRIYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGhpZGxfaGFuZGxle21IYW5kbGV9OworfQorCitIRmVuY2VXcmFwcGVyOjpvcGVyYXRvciBoaWRsX2hhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SGFuZGxlKCk7Cit9CisKK2Jvb2wgYjJoKHNwPEJGZW5jZT4gY29uc3QmIGZyb20sIEhGZW5jZVdyYXBwZXIqIHRvKSB7CisgICAgaWYgKCFmcm9tKSB7CisgICAgICAgIHRvLT5zZXQobnVsbHB0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZmVuY2VGZCA9IGZyb20tPmdldCgpOworICAgIGlmIChmZW5jZUZkID09IC0xKSB7CisgICAgICAgIHRvLT5zZXQobnVsbHB0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG5oLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICB0by0+c2V0KG5oKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBmcm9tLCBzcDxCRmVuY2U+KiB0bykgeworICAgIGlmICghZnJvbSB8fCBmcm9tLT5udW1GZHMgPT0gMCkgeworICAgICAgICAqdG8gPSBuZXcgOjphbmRyb2lkOjpGZW5jZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZyb20tPm51bUZkcyAhPSAxIHx8IGZyb20tPm51bUludHMgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICp0byA9IG5ldyBCRmVuY2UoZHVwKGZyb20tPmRhdGFbMF0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29ubmVjdGlvblR5cGUKKy8vID09PT09PT09PT09PT09CisKK2Jvb2wgYjJoKGludCBmcm9tLCBIQ29ubmVjdGlvblR5cGUqIHRvKSB7CisgICAgKnRvID0gc3RhdGljX2Nhc3Q8SENvbm5lY3Rpb25UeXBlPihmcm9tKTsKKyAgICBzd2l0Y2ggKGZyb20pIHsKKyAgICBjYXNlIENVUlJFTlRMWV9DT05ORUNURURfQVBJOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6OkNVUlJFTlRMWV9DT05ORUNURUQ7IGJyZWFrOworICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfRUdMOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6OkVHTDsgYnJlYWs7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DUFU6CisgICAgICAgICp0byA9IEhDb25uZWN0aW9uVHlwZTo6Q1BVOyBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX01FRElBOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6Ok1FRElBOyBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQToKKyAgICAgICAgKnRvID0gSENvbm5lY3Rpb25UeXBlOjpDQU1FUkE7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIoSENvbm5lY3Rpb25UeXBlIGZyb20sIGludCogdG8pIHsKKyAgICAqdG8gPSBzdGF0aWNfY2FzdDxpbnQ+KGZyb20pOworICAgIHN3aXRjaCAoZnJvbSkgeworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpDVVJSRU5UTFlfQ09OTkVDVEVEOgorICAgICAgICAqdG8gPSBDVVJSRU5UTFlfQ09OTkVDVEVEX0FQSTsgYnJlYWs7CisgICAgY2FzZSBIQ29ubmVjdGlvblR5cGU6OkVHTDoKKyAgICAgICAgKnRvID0gTkFUSVZFX1dJTkRPV19BUElfRUdMOyBicmVhazsKKyAgICBjYXNlIEhDb25uZWN0aW9uVHlwZTo6Q1BVOgorICAgICAgICAqdG8gPSBOQVRJVkVfV0lORE9XX0FQSV9DUFU7IGJyZWFrOworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpNRURJQToKKyAgICAgICAgKnRvID0gTkFUSVZFX1dJTkRPV19BUElfTUVESUE7IGJyZWFrOworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpDQU1FUkE6CisgICAgICAgICp0byA9IE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQTsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWN0CisvLyA9PT09CisKK2Jvb2wgYjJoKEJSZWN0IGNvbnN0JiBmcm9tLCBIUmVjdCogdG8pIHsKKyAgICBCUmVjdCogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDxCUmVjdCo+KHRvLT5kYXRhKCkpOworICAgIGRzdC0+bGVmdCA9IGZyb20ubGVmdDsKKyAgICBkc3QtPnRvcCA9IGZyb20udG9wOworICAgIGRzdC0+cmlnaHQgPSBmcm9tLnJpZ2h0OworICAgIGRzdC0+Ym90dG9tID0gZnJvbS5ib3R0b207CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaDJiKEhSZWN0IGNvbnN0JiBmcm9tLCBCUmVjdCogdG8pIHsKKyAgICBCUmVjdCBjb25zdCogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxCUmVjdCBjb25zdCo+KGZyb20uZGF0YSgpKTsKKyAgICB0by0+bGVmdCA9IHNyYy0+bGVmdDsKKyAgICB0by0+dG9wID0gc3JjLT50b3A7CisgICAgdG8tPnJpZ2h0ID0gc3JjLT5yaWdodDsKKyAgICB0by0+Ym90dG9tID0gc3JjLT5ib3R0b207CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlZ2lvbgorLy8gPT09PT09CisKK2Jvb2wgYjJoKEJSZWdpb24gY29uc3QmIGZyb20sIEhSZWdpb24qIHRvKSB7CisgICAgc2l6ZV90IG51bVJlY3RzOworICAgIEJSZWN0IGNvbnN0KiByZWN0QXJyYXkgPSBmcm9tLmdldEFycmF5KCZudW1SZWN0cyk7CisgICAgdG8tPnJlc2l6ZShudW1SZWN0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1SZWN0czsgKytpKSB7CisgICAgICAgIGlmICghYjJoKHJlY3RBcnJheVtpXSwgJigqdG8pW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGgyYihIUmVnaW9uIGNvbnN0JiBmcm9tLCBCUmVnaW9uKiB0bykgeworICAgIGlmIChmcm9tLnNpemUoKSA+IDApIHsKKyAgICAgICAgQlJlY3QgYlJlY3Q7CisgICAgICAgIGlmICghaDJiKGZyb21bMF0sICZiUmVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0by0+c2V0KGJSZWN0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBmcm9tLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWgyYihmcm9tW2ldLCAmYlJlY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG8tPmFkZFJlY3RVbmNoZWNrZWQoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiUmVjdC5yaWdodCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QuYm90dG9tKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0by0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEdyYXBoaWNCdWZmZXIKKy8vID09PT09PT09PT09PT0KKworLy8gVGhlIGhhbmRsZSBpcyBub3QgY2xvbmVkLiBJdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUgb3JpZ2luYWwgR3JhcGhpY0J1ZmZlci4KK2Jvb2wgYjJoKHNwPEdyYXBoaWNCdWZmZXI+IGNvbnN0JiBmcm9tLCBIYXJkd2FyZUJ1ZmZlciogdG8sCisgICAgICAgICB1aW50MzJfdCogdG9HZW5lcmF0aW9uTnVtYmVyKSB7CisgICAgaWYgKCFmcm9tKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUhhcmR3YXJlQnVmZmVyKiBod0J1ZmZlciA9IGZyb20tPnRvQUhhcmR3YXJlQnVmZmVyKCk7CisgICAgdG8tPm5hdGl2ZUhhbmRsZS5zZXRUbygKKyAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGh3QnVmZmVyKSksCisgICAgICAgICAgZmFsc2UpOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZSgKKyAgICAgICAgICAgIGh3QnVmZmVyLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBSGFyZHdhcmVCdWZmZXJfRGVzYyo+KHRvLT5kZXNjcmlwdGlvbi5kYXRhKCkpKTsKKyAgICBpZiAodG9HZW5lcmF0aW9uTnVtYmVyKSB7CisgICAgICAgICp0b0dlbmVyYXRpb25OdW1iZXIgPSBmcm9tLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBUaGUgaGFuZGxlIGlzIGNsb25lZC4KK2Jvb2wgaDJiKEhhcmR3YXJlQnVmZmVyIGNvbnN0JiBmcm9tLCBzcDxHcmFwaGljQnVmZmVyPiogdG8pIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBjb25zdCogZGVzYyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGNvbnN0Kj4oCisgICAgICAgICAgICBmcm9tLmRlc2NyaXB0aW9uLmRhdGEoKSk7CisgICAgbmF0aXZlX2hhbmRsZV90IGNvbnN0KiBoYW5kbGUgPSBmcm9tLm5hdGl2ZUhhbmRsZTsKKyAgICBBSGFyZHdhcmVCdWZmZXIqIGh3QnVmZmVyOworICAgIGlmIChBSGFyZHdhcmVCdWZmZXJfY3JlYXRlRnJvbUhhbmRsZSgKKyAgICAgICAgICAgIGRlc2MsIGhhbmRsZSwgQUhBUkRXQVJFQlVGRkVSX0NSRUFURV9GUk9NX0hBTkRMRV9NRVRIT0RfQ0xPTkUsCisgICAgICAgICAgICAmaHdCdWZmZXIpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnRvID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbUFIYXJkd2FyZUJ1ZmZlcihod0J1ZmZlcik7CisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoaHdCdWZmZXIpOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycXVldWUKK30gIC8vIG5hbWVzcGFjZSBncmFwaGljcworfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhc1N0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyICphc1N0cmluZyhjMl9zdGF0dXNfdCBpLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDMl9PSzogICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcmV0dXJuICJCQURfVkFMVUUiOworICAgICAgICBjYXNlIEMyX0JBRF9JTkRFWDogcmV0dXJuICJCQURfSU5ERVgiOworICAgICAgICBjYXNlIEMyX0NBTk5PVF9ETzogcmV0dXJuICJDQU5OT1RfRE8iOworICAgICAgICBjYXNlIEMyX0RVUExJQ0FURTogcmV0dXJuICJEVVBMSUNBVEUiOworICAgICAgICBjYXNlIEMyX05PVF9GT1VORDogcmV0dXJuICJOT1RfRk9VTkQiOworICAgICAgICBjYXNlIEMyX0JBRF9TVEFURTogcmV0dXJuICJCQURfU1RBVEUiOworICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcmV0dXJuICJCTE9DS0lORyI7CisgICAgICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6ICByZXR1cm4gIkNBTkNFTEVEIjsKKyAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHJldHVybiAiTk9fTUVNT1JZIjsKKyAgICAgICAgY2FzZSBDMl9SRUZVU0VEOiAgIHJldHVybiAiUkVGVVNFRCI7CisgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiByZXR1cm4gIlRJTUVEX09VVCI7CisgICAgICAgIGNhc2UgQzJfT01JVFRFRDogICByZXR1cm4gIk9NSVRURUQiOworICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcmV0dXJuICJDT1JSVVBURUQiOworICAgICAgICBjYXNlIEMyX05PX0lOSVQ6ICAgcmV0dXJuICJOT19JTklUIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdCBjaGFyICphc1N0cmluZyhDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIHJldHVybiAidTgiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IHJldHVybiAiYzMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OiByZXR1cm4gImM2NCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgcmV0dXJuICJmcCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgcmV0dXJuICJpMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIHJldHVybiAiaTY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiByZXR1cm4gImNociI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogcmV0dXJuICJ1MzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IHJldHVybiAidTY0IjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIChpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA/ICJzdHJ1Y3QiIDogZGVmOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtQ29yZUluZGV4KGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVjJWMlMDN4IiwKKyAgICAgICAgICAgIGkuaXNGbGV4aWJsZSgpID8gJ0YnIDogJy0nLAorICAgICAgICAgICAgaS5pc1ZlbmRvcigpID8gJ1YnIDogJy0nLAorICAgICAgICAgICAgaS5jb3JlSW5kZXgoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJQYXJhbUluZGV4KAorICAgICAgICBjb25zdCBDMlBhcmFtOjpUeXBlICZpLCBib29sIGFkZFN0cmVhbSwgdW5zaWduZWQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gU3RyaW5nUHJpbnRmKCIlYyVjIiwKKyAgICAgICAgICAgIGkuZm9ySW5wdXQoKSA/ICdJJyA6IGkuZm9yT3V0cHV0KCkgPyAnTycgOiAnLScsCisgICAgICAgICAgICBpLmZvclN0cmVhbSgpID8gJ1MnIDogaS5mb3JQb3J0KCkgPyAnUCcgOiAnRycpOworICAgIGlmIChhZGRTdHJlYW0pIHsKKyAgICAgICAgaWYgKGkuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIHYgKz0gU3RyaW5nUHJpbnRmKCIlMDJkIiwgc3RyZWFtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiArPSAiLS0iOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHYKKyAgICAgICAgICAgICsgU3RyaW5nUHJpbnRmKCIlYyAiLAorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTVFJVQ1QgID8gJ1MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6SU5GTyAgICA/ICdpJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlRVTklORyAgPyAndCcgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTRVRUSU5HID8gJ3MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6Tk9ORSAgICA/ICctJyA6ICc/JykKKyAgICAgICAgICAgICsgYXR0cmliUGFyYW1Db3JlSW5kZXgoaSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgIlBhcmFtOjpDb3JlSW5kZXgoIiA8PCBhdHRyaWJQYXJhbUNvcmVJbmRleChpKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OlR5cGUoJTA4eDogIiwgaS50eXBlKCkpCisgICAgICAgICAgICA8PCBhdHRyaWJQYXJhbUluZGV4KGksIGZhbHNlLCAwKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIlBhcmFtOjpJbmRleCglMDh4OiAiLCAodWludDMyX3QpaSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgdHJ1ZSwgaS5zdHJlYW0oKSkgPDwgIikiOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliRmllbGRJZChjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiRmllbGQoQCUwMngrJTAyeCkiLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiPCIgPDwgYXR0cmliRmllbGRJZChpKSA8PCAiPiI7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKSB7CisgICAgb3MgPDwgYXR0cmliRmllbGRJZChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQoaSkpIDw8ICIgIjsKKyAgICBpZiAoaS5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICBvcyA8PCAiZW51bSAiOworICAgIH0KKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaS50eXBlKCkpIDw8ICIgIiA8PCBpLm5hbWUoKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJbJXp1XSIsIGkuZXh0ZW50KCkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpIHsKKyAgICBvcyA8PCAiPCIgPDwgQzJQYXJhbTo6SW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KGkpKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCI6OkZpZWxkKEAlMDJ4KyUwMngpPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShpKSk7CisgICAgcmV0dXJuIG9zOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkZpZWxkVmFsdWVIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgaWYgKGlzcHJpbnQocC5pMzIpKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIiclYyciLCBwLmkzMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJ1xceCUwMngnIiwgKHVpbnQzMl90KXAuaTMyKTsKKyAgICB9Cit9CisKK3N0ZDo6b3N0cmVhbSYgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90Pjo6cHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIjB4JTAyeCIsIHAudTMyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBjMl9jbnRyX3Q8VD4gJnYpIHsKKyAgICByZXR1cm4gb3MgPDwgImN0cigiIDw8IHYucGVla3UoKSA8PCAiKSI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSkgeworICAgIG9zIDw8ICJSYW5nZSgiOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgb3MgPDwgIi4uIjsKKyAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWF4KCkpOworICAgIG9zIDw8ICIgKj0gIiA8PCBpLm51bSgpIDw8ICIgLz0gIiA8PCBpLmRlbm9tKCkgPDwgIiArPSAiIDw8IGkuc3RlcCgpIDw8ICIpIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmaSkgeworICAgIG9zIDw8ICJGbGFnc1siOworICAgIGlmICghaS5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3MgPDwgIm1pbj0iOworICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWluKCkpOworICAgIH0KKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS5mbGFncygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSkgeworICAgIG9zIDw8ICJWYWx1ZXNbIjsKKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS52YWx1ZXMoKSkgeworICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgIG9zIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCB2KTsKKyAgICAgICAgY29tbWEgPSB0cnVlOworICAgIH0KKyAgICBvcyA8PCAiXSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IF9tVHlwZTsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFZhbHVlVHlwZT4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxWYWx1ZVR5cGU+IF9tRmxhZ3M7CisKK3B1YmxpYzoKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgJmkpOworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJbXBsICZpKTsKKyAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw6OnN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCB7CisgICAgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBvcyA8PCBfbVJhbmdlOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICBvcyA8PCBfbVZhbHVlczsKKyAgICB9IGVsc2UgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICBvcyA8PCBfbUZsYWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8ICJVbmtub3duIEZTViB0eXBlOiAiIDw8ICh1aW50MzJfdClfbVR5cGU7CisgICAgfQorICAgIHJldHVybiBvczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKSB7CisgICAgcmV0dXJuIGkuX21JbXBsLT5zdHJlYW1PdXQob3MpOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD4gJmkpOworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjUyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApAQCAtMCwwICsxLDg3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmxlY3RvckhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBmb3IgKEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWt0IDogc3RydWN0cykgeworICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBzdHJ1Y3R1cmUgZGVzY3JpcHRpb25zIGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgb25lcworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9yKHN0ZDo6bW92ZShzdHJ1a3QpKTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+CitDMlJlZmxlY3RvckhlbHBlcjo6ZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBhdXRvIGl0ID0gX21TdHJ1Y3RzLmZpbmQocGFyYW1JbmRleCk7CisgICAgaWYgKGl0ID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDMlN0cnVjdERlc2NyaXB0b3I+KGl0LT5zZWNvbmQpOworICAgIH0KK307CisKK3ZvaWQgQzJSZWZsZWN0b3JIZWxwZXI6OmFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KSB7CisgICAgaWYgKF9tU3RydWN0cy5maW5kKHN0cnVrdC5jb3JlSW5kZXgoKSkgIT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgYWRkZWQKKyAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCBkZXNjcmlwdG9yIG1hdGNoZXMgc3RvcmVkIGRlc2NyaXB0b3IKKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhhdCBhbGwgc3RydWN0IGZpZWxkcyBhcmUga25vd24gdG8gdGhpcyByZWZsZWN0b3IKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCA6IHN0cnVrdCkgeworICAgICAgICBpZiAoZmQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZmQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRzsKKyAgICAgICAgICAgIGlmIChfbVN0cnVjdHMuZmluZChjb3JlSW5kZXgpID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhJTkZPKSA8PCAibWlzc2luZyBzdHJ1Y3QgZGVzY3JpcHRvciAjIiA8PCBjb3JlSW5kZXggPDwgIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmQubmFtZSgpIDw8ICIgb2Ygc3RydWN0ICMiIDw8IHN0cnVrdC5jb3JlSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfbVN0cnVjdHMuZW1wbGFjZShzdHJ1a3QuY29yZUluZGV4KCksIHN0cnVrdCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJhbUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkKKyAgICAgICAgOiBtUGFyYW0ocGFyYW0pLCBtTmFtZShuYW1lKSwgX21TdHJ1Y3Qoc3RydWt0KSB7IH0KKworICAgIEltcGwoSW1wbCYmKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KSB7CisgICAgICAgIG1Eb3duRGVwZW5kZW5jaWVzLnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorCisgICAgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgYXR0cmliKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYjsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkgeworICAgICAgICAvLyBtb3ZlIGRlcGVuZGVuY2llcyBpbnRvIGRlc2NyaXB0b3IKKyAgICAgICAgbURlc2NyaXB0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBpbmRleCgpLCAoQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KW1BdHRyaWIsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG1OYW1lKSwgc3RkOjptb3ZlKG1EZXBlbmRlbmNpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZUZpZWxkc0FuZFN1cHBvcnRlZFZhbHVlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZiA6CisgICAgICAgICAgICAgICAgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoKm1EZWZhdWx0VmFsdWUsIHJlZmxlY3RvcikpIHsKKyAgICAgICAgICAgIGlmICghZi5pc0FyaXRobWV0aWMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IGZzdlBvaW50ZXI7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJyZWFrYWJsZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIGZzdjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBicmVhayBvdXQgb2YgZG8ge30gd2hpbGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnN2UG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oZnN2KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsKKworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW0sIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLCBzdGQ6Om1vdmUoZnN2UG9pbnRlcikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUZpZWxkcy5maW5kKF9DMkZpZWxkSWQoYmFzZU9mZnMsIGJhc2VTaXplKSk7CisgICAgICAgIGlmIChpdCA9PSBtRmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Eb3duRGVwZW5kZW5jaWVzOworICAgIH0KKworICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeworICAgICAgICBpZiAoIW1EZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgbWlzc2luZyBkZWZhdWx0IHZhbHVlXG4iLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURlZmF1bHRWYWx1ZS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBDMlN0cmluZyBuYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtOworICAgIH0KKworICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX21TdHJ1Y3QpOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgICAgICBtRGVmYXVsdFZhbHVlID0gZGVmYXVsdF87CisgICAgfQorCisgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgICAgIG1EZXBlbmRlbmNpZXMgPSBpbmRpY2VzOworICAgICAgICBtRGVwZW5kZW5jaWVzQXNSZWZzID0gcmVmczsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgICAgIC8vIGRvIG5vdCBhbGxvdyBhZGRpbmcgZmllbGRzIG11bHRpcGxlIHRpbWVzLCBvciB0byBjb25zdCB2YWx1ZXMKKyAgICAgICAgaWYgKCFtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byBhZGQgZmllbGRzIHRvIHBhcmFtICIgPDwgbU5hbWUgPDwgIiBtdWx0aXBsZSB0aW1lcyI7CisgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gY29uc3QgcGFyYW0gIiA8PCBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQzJQYXJhbUZpZWxkVmFsdWVzICZwZnYgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIG1GaWVsZHMuZW1wbGFjZV9oaW50KAorICAgICAgICAgICAgICAgICAgICBtRmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAvLyBfQzJGaWVsZElkIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxGaWVsZEhlbHBlcj4obVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGZ2LnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZnYudmFsdWVzKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcikgeworICAgICAgICBtR2V0dGVyID0gZ2V0dGVyOworICAgIH0KKworICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgQzJSIHJlc3VsdCA9IG1TZXR0ZXIodmFsdWUsIG1heUJsb2NrLCBjaGFuZ2VkLCBmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXRyaWV2ZUZhaWx1cmVzKGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBpZiAoIW1TZXR0ZXIgJiYgbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coV0FSTklORykgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyLCBtYWtpbmcgaXQgY29uc3QiOworICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBlbXB0eSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIG1BdHRyaWIgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICB9IGVsc2UgaWYgKCFtU2V0dGVyKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIHNldHRlciI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKHJlZmxlY3Rvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgZGVmYXVsdCBiYXNlZCBvbiBzZXR0ZXIgYW5kIHZlcmlmeSB0aGF0IEZTViBjb3ZlcnMgdGhlIHZhbHVlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBmaWVsZHMiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW0uZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgX0MyUGFyYW1JbnNwZWN0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgX21TdHJ1Y3Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG1EZWZhdWx0VmFsdWU7CisgICAgYXR0cmliX3QgbUF0dHJpYjsKKyAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gbVNldHRlcjsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gbUdldHRlcjsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURlcGVuZGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURvd25EZXBlbmRlbmNpZXM7IC8vIFRPRE86IHRoaXMgZG9lcyBub3Qgd29yayBmb3Igc3RyZWFtIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bWFwPF9DMkZpZWxkSWQsIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4+IG1GaWVsZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBtRGVzY3JpcHRvcjsKK307CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoCisgICAgICAgIFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgIDogbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OkltcGw+KAorICAgICAgICAgICAgcGFyYW0sIG5hbWUsIHN0ZDo6bW92ZShzdHJ1a3QpKSkgeyB9CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyICYmKSA9IGRlZmF1bHQ7CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6flBhcmFtSGVscGVyKCkgPSBkZWZhdWx0OworCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPmFkZERvd25EZXBlbmRlbmN5KGluZGV4KTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWIoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5hdHRyaWIoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpidWlsZCgpIHsKKyAgICBtSW1wbC0+YnVpbGQoKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI+KHN0ZDo6bW92ZSgqdGhpcykpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1SZWY+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlcGVuZGVuY2llc0FzUmVmcygpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREb3duRGVwZW5kZW5jaWVzKCk7Cit9CisKK0MyUGFyYW06OkluZGV4IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmRleCgpOworfQorCitDMlN0cmluZyBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6Om5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5uYW1lKCk7Cit9CisKK2NvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnJlZigpOworfQorCitDMlN0cnVjdERlc2NyaXB0b3IgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpyZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pIHsKKyAgICBtSW1wbC0+c2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlcGVuZGVuY2llcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgbUltcGwtPnNldERlcGVuZGVuY2llcyhpbmRpY2VzLCByZWZzKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0R2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgbUltcGwtPnNldEdldHRlcihnZXR0ZXIpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0U2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKSB7CisgICAgbUltcGwtPnNldFNldHRlcihzZXR0ZXIpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnRyeVNldCgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmYsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICByZXR1cm4gbUltcGwtPnRyeVNldCh2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYsIGZhaWx1cmVzKTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWxpZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gbUltcGwtPnZhbGlkYXRlKHJlZmxlY3Rvcik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbHVlKCkgeworICAgIHJldHVybiBtSW1wbC0+dmFsdWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJQYXJhbUZpZWxkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6bWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoaW5kZXgsIG1GaWVsZElkKTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKQorICAgIDogbVBhcmFtKHBhcmFtKSwKKyAgICAgIG1GaWVsZElkKGZpZWxkKSwKKyAgICAgIG1Qb3NzaWJsZShzdGQ6Om1vdmUodmFsdWVzKSkgeworICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZmllbGQgaGVscGVyICIgPDwgZmllbGQgPDwgIiAiCisgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PigqbVBvc3NpYmxlKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OnNldFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKSB7CisgICAgbVN1cHBvcnRlZCA9IHN0ZDo6bW92ZSh2YWx1ZXMpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1TdXBwb3J0ZWQgPyBtU3VwcG9ydGVkIDogbVBvc3NpYmxlKS5nZXQoKTsKK30KKworY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBvc3NpYmxlLmdldCgpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGZpZWxkLXN1cHBvcnRlZC12YWx1ZXMgYnVpbGRlciB0aGF0IGdldHMgc3RvcmVkIGluIHRoZQorICogZmllbGQgaGVscGVyIHdoZW4gdGhlIGJ1aWxkZXIgZ29lcyBvdXQgb2Ygc2NvcGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3VwcG9ydGVkVmFsdWVzQnVpbGRlciA6IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4geworICAgIFN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoCisgICAgICAgICAgICBDMlBhcmFtRmllbGQgJmZpZWxkLCBzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPiBoZWxwZXIpCisgICAgICAgIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPihmaWVsZCksIF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoZmllbGQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGJ1aWxkZXIgdmFsdWVzIG9uIGRlc3RydWN0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgflN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoKSBvdmVycmlkZSB7CisgICAgICAgIF9tSGVscGVyLT5zZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjptb3ZlKEMyUGFyYW1GaWVsZFZhbHVlcygqdGhpcykudmFsdWVzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnNob3VsZEJlKCkgY29uc3QgeworICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46Om11c3RCZSgpIHsKKyAgICByZXR1cm4gU3VwcG9ydGVkVmFsdWVzQnVpbGRlcjxUPihfbUZpZWxkLCBfbUhlbHBlcik7Cit9CisKKy8qCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnZhbGlkYXRlUG9zc2libGUoVCAmdmFsdWUpCitjb25zdCB7CisgICAgLy8vIFRPRE8KKyAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6Ok9rKCk7Cit9CisqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjpGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgOiBfbUhlbHBlcihoZWxwZXIpLCBfbUZpZWxkKGhlbHBlci0+bWFrZVBhcmFtRmllbGQoaW5kZXgpKSB7IH0KKwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50OF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8Y2hhcj47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50MzJfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxpbnQ2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5SW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlcjo6RmFjdG9yeSB7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gX21SZWZsZWN0b3I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+CisgICAgZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVBhcmFtcy5maW5kKHBhcmFtKS0+c2Vjb25kOworICAgIH0KKworcHVibGljOgorICAgIEZhY3RvcnlJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIHZpcnR1YWwgfkZhY3RvcnlJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGRQYXJhbShzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgICAgIF9tUGFyYW1zLmluc2VydCh7IHBhcmFtLT5yZWYoKSwgcGFyYW0gfSk7CisgICAgICAgIF9tSW5kZXhUb0hlbHBlci5pbnNlcnQoe3BhcmFtLT5pbmRleCgpLCBwYXJhbX0pOworCisgICAgICAgIC8vIGFkZCBkb3duLWRlcGVuZGVuY2llcyAoYW5kIHZhbGlkYXRlIGRlcGVuZGVuY2llcyBhcyBhIHJlc3VsdCkKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBQYXJhbVJlZiAmcmVmIDogcGFyYW0tPmdldERlcGVuZGVuY2llc0FzUmVmcygpKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgbXVzdCBhbHJlYWR5IGJlIGRlZmluZWQKKyAgICAgICAgICAgIGlmICghX21QYXJhbXMuY291bnQocmVmKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtZXRlciAiIDw8IHBhcmFtLT5uYW1lKCkgPDwgIiBoYXMgYSBkZXBlbmRlbmN5IGF0IGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgdGhhdCBpcyBub3QgeWV0IGRlZmluZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX21QYXJhbXMuZmluZChyZWYpLT5zZWNvbmQtPmFkZERvd25EZXBlbmRlbmN5KHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKworICAgICAgICBfbURlcGVuZGVuY3lJbmRleC5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBfbURlcGVuZGVuY3lJbmRleC5zaXplKCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW0oQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIHN0cmVhbXMgc2VwYXJhdGVseQorICAgICAgICBjb25zdCBhdXRvIGl0ID0gX21JbmRleFRvSGVscGVyLmZpbmQoaXgpOworICAgICAgICBpZiAoaXQgPT0gX21JbmRleFRvSGVscGVyLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiB0aGlzIGNvdWxkIHJldHVybiBhIGNvcHkgdXNpbmcgcHJvcGVyIHBvaW50ZXIgY2FzdC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0UGFyYW1WYWx1ZShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciA9IGdldFBhcmFtKGl4KTsKKyAgICAgICAgcmV0dXJuIGhlbHBlciA/IGhlbHBlci0+dmFsdWUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBfbVBhcmFtcykgeworICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIHNpZ25hdHVyZT8KKyAgICAgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxDMlBhcmFtRGVzY3JpcHRvcj4oaXQuc2Vjb25kLT5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZXJyb3JzCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4KEMyUGFyYW06OkluZGV4IGl4KSB7CisgICAgICAgIC8vIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgaGVscGVyIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc3RyZWFtIHNvCisgICAgICAgIC8vIHdlIGNhbiBsb29rIHVwIGRpcmVjdGx5IGJ5IGluZGV4CisgICAgICAgIGF1dG8gaXQgPSBfbURlcGVuZGVuY3lJbmRleC5maW5kKGl4KTsKKyAgICAgICAgcmV0dXJuIGl0ID09IF9tRGVwZW5kZW5jeUluZGV4LmVuZCgpID8gU0laRV9NQVggOiBpdC0+c2Vjb25kOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxQYXJhbVJlZiwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21QYXJhbXM7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4+IF9tSW5kZXhUb0hlbHBlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHNpemVfdD4gX21EZXBlbmRlbmN5SW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoQzJQYXJhbSAqcCkgeworICAgIGNoYXIgYWRkclsyMF07CisgICAgc3ByaW50ZihhZGRyLCAiJXA6WyIsIHApOworICAgIHN0ZDo6c3RyaW5nIHYgPSBhZGRyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcC0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBkWzRdOworICAgICAgICBzcHJpbnRmKGQsICIgJTAyeCIsICooKCh1aW50OF90ICopcCkgKyBpKSk7CisgICAgICAgIHYgKz0gZCArIChpID09IDApOworICAgIH0KKyAgICByZXR1cm4gdiArICJdIjsKK30KKworfQorCitDMkludGVyZmFjZUhlbHBlcjo6QzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgOiBtUmVmbGVjdG9yKHJlZmxlY3RvciksCisgICAgICBfbUZhY3Rvcnkoc3RkOjptYWtlX3NoYXJlZDxGYWN0b3J5SW1wbD4ocmVmbGVjdG9yKSkgeyB9CisKKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBwYXJhbSA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBwYXJhbSBzdHJ1Y3R1cmUgbm90IGRlc2NyaWJlZAorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkIDogKnBhcmFtKSB7CisgICAgICAgIHNpemVfdCBmaWVsZE9mZnNldCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRTaXplID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBmaWVsZC5leHRlbnQoKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA9PSBmaWVsZE9mZnNldCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLmV4dGVudCgpID09IDAgfHwgb2Zmc2V0IDwgZmllbGRPZmZzZXQgKyBmaWVsZFNpemUgKiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgLy8gcmVkdWNlIHRvIGZpcnN0IGVsZW1lbnQgaW4gY2FzZSBvZiBhcnJheQorICAgICAgICAgICAgb2Zmc2V0ID0gZmllbGRPZmZzZXQgKyAob2Zmc2V0IC0gZmllbGRPZmZzZXQpICUgZmllbGRTaXplOworICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUoKSA+PSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9mZnNldCBpcyB3aXRoaW4gYSBmaWVsZAorICAgICAgICAgICAgICAgIG9mZnNldCA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0b3IsIGZpZWxkLnR5cGUoKSAmIH5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBmaWVsZE9mZnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5vZmZzZXQgPyBmaWVsZE9mZnNldCArIG9mZnNldCA6IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OmFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtUmVmbGVjdG9yLT5hZGRTdHJ1Y3REZXNjcmlwdG9yKHBhcmFtLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcGFyYW0tPnZhbGlkYXRlKG1SZWZsZWN0b3IpOworICAgIGlmIChlcnIgIT0gQzJfQ09SUlVQVEVEKSB7CisgICAgICAgIF9tRmFjdG9yeS0+YWRkUGFyYW0ocGFyYW0pOworCisgICAgICAgIC8vIHJ1biBzZXR0ZXIgdG8gZW5zdXJlIGNvcnJlY3QgdmFsdWVzCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKXBhcmFtLT50cnlTZXQocGFyYW0tPnZhbHVlKCkuZ2V0KCksIEMyX01BWV9CTE9DSywgJmNoYW5nZWQsICpfbUZhY3RvcnksICZmYWlsdXJlcyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6Y29uZmlnKAorICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsIGJvb2wgdXBkYXRlUGFyYW1zLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgX191bnVzZWQgLyogVE9ETyAqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsgLy8gVE9ETyBpcyB0aGlzIHRoZSBzYW1lIGFzIGJhZCB2YWx1ZT8KKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmFkVmFsdWUgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmxvY2tpbmcgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtVGltZWRPdXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQ29ycnVwdGVkID0gZmFsc2U7CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICAvLyBkb3duIGRlcGVuZGVuY2llcyBhcmUgbWFya2VkIGRpcnR5LCBidXQgcGFyYW1zIHNldCBhcmUgbm90IGltbWVkaWF0ZWx5CisgICAgLy8gbWFya2VkIGRpcnR5ICh1bmxlc3MgdGhleSBiZWNvbWUgZG93biBkZXBlbmRlbmN5KSBzbyB0aGF0IHdlIGNhbgorICAgIC8vIGF2b2lkIHNldHRpbmcgdGhlbSBpZiB0aGV5IGRpZCBub3QgY2hhbmdlCisKKyAgICAvLyBUT0RPOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbmRpY2VzIGZvciB0aGUgc2FtZSBkZXBlbmRlbmN5IGluZGV4CisgICAgLy8geyBkZXBJeCwgcGFyYW1JeCB9IG1heSBiZSBhIHN1aXRhYmxlIGtleQorICAgIHN0ZDo6bWFwPHNpemVfdCwgc3RkOjpwYWlyPEMyUGFyYW06OkluZGV4LCBib29sPj4gZGVwZW5kZW5jaWVzOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbVJlcXVlc3RzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBsYXRlUmVhZFBhcmFtczsKKworICAgIC8vIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGxhc3QgdmFsaWQgcGFyYW1ldGVyLCBzbyBhZGQgYW4gZXh0cmEKKyAgICAvLyBsb29wIGl0ZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAgICBmb3IgKHNpemVfdCBwX2l4ID0gMDsgcF9peCA8PSBwYXJhbXMuc2l6ZSgpOyArK3BfaXgpIHsKKyAgICAgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisgICAgICAgIEMyUGFyYW06OkluZGV4IHBhcmFtSXggPSAwdTsKKyAgICAgICAgc2l6ZV90IHBhcmFtRGVwSXggPSBTSVpFX01BWDsKKyAgICAgICAgYm9vbCBsYXN0ID0gcF9peCA9PSBwYXJhbXMuc2l6ZSgpOworICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgIHAgPSBwYXJhbXNbcF9peF07CisgICAgICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcmFtSXggPSBwLT5pbmRleCgpOworCisgICAgICAgICAgICAvLyBjb252ZXJ0IHBhcmFtZXRlciB0byByZXF1ZXN0IGluIGNhc2UgdGhpcyBpcyBhIHNwbGl0IHBhcmFtZXRlcgorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggcmVxdWVzdFBhcmFtSXggPSBwYXJhbUl4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUc7CisKKyAgICAgICAgICAgIC8vIHNldHRpbmcgYSByZXF1ZXN0IGRpcmVjdGx5IGlzIGhhbmRsZWQgYXMgbm9ybWFsCisgICAgICAgICAgICBpZiAocGFyYW1JeCAhPSByZXF1ZXN0UGFyYW1JeCkgeworICAgICAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChyZXF1ZXN0UGFyYW1JeCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtRGVwSXggPT0gU0laRV9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgc3BsaXQgcGFyYW1ldGVyLCBoYW5kbGUgaXQgbm9ybWFsbHkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1EZXBJeCA9IGdldERlcGVuZGVuY3lJbmRleF9sKHBhcmFtSXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IHBhcmFtZXRlciAtIHJlcGxhY2Ugd2l0aCBzZXR0aW5nIGZvciB0aGUgcmVxdWVzdCAtIGFuZCBxdWV1ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWN0dWFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgbGF0ZSBwYXJhbXMgYXQgdGhlIHJpZ2h0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgbGF0ZVJlYWRQYXJhbXMuZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcmVxdWVzdChDMlBhcmFtOjpDb3B5QXNSZXF1ZXN0KCpwKSk7CisgICAgICAgICAgICAgICAgICAgIHAgPSByZXF1ZXN0LmdldCgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbVJlcXVlc3RzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocmVxdWVzdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtRGVwSXggPT0gU0laRV9NQVgpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGZpcnN0IGluc2VydCAtIG1hcmsgbm90IGRpcnR5CisgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBkaXJ0eSBieSBhIGRlcGVuZGVuY3kgdXBkYXRlCisgICAgICAgICAgICAvLyB0aGlzIGRvZXMgbm90IG92ZXJyd3JpdGUoISkKKyAgICAgICAgICAgICh2b2lkKWRlcGVuZGVuY2llcy5pbnNlcnQoeyBwYXJhbURlcEl4LCB7IHBhcmFtSXgsIGZhbHNlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChwYXJhbURlcEl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkZXBlbmRlbmN5IGZvciBzZXR0aW5nIGF0ICMiIDw8IHBhcmFtRGVwSXggPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+c2Vjb25kLmZpcnN0IDw8ICIsIHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAgIDw8IChpdC0+c2Vjb25kLnNlY29uZCA/ICJhbHdheXMgKGRpcnR5KSIgOiAib25seSBpZiBjaGFuZ2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIGFueSByZW1haW5pbmcgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaGFuZGxpbmcgZGlydHkgZG93biBkZXBlbmRlbmNpZXMgYWZ0ZXIgbGFzdCBzZXR0aW5nIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgYW55IGRpcnRpZWQgZG93bi1kZXBlbmRlbmNpZXMgdW50aWwgdGhlIG5leHQgcGFyYW0KKyAgICAgICAgd2hpbGUgKGRlcGVuZGVuY2llcy5zaXplKCkgJiYgZGVwZW5kZW5jaWVzLmJlZ2luKCktPmZpcnN0IDw9IHBhcmFtRGVwSXgpIHsKKyAgICAgICAgICAgIGF1dG8gbWluID0gZGVwZW5kZW5jaWVzLmJlZ2luKCk7CisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IG1pbi0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgYm9vbCBkaXJ0eSA9IG1pbi0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5lcmFzZShtaW4pOworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm9sZCB2YWx1ZSAiIDw8IGFzU3RyaW5nKHBhcmFtLT52YWx1ZSgpLmdldCgpKTsKKyAgICAgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibmV3IHZhbHVlICIgPDwgYXNTdHJpbmcocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxhc3QgJiYgIWRpcnR5ICYmIGl4ID09IHBhcmFtSXggJiYgKnBhcmFtLT52YWx1ZSgpID09ICpwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGluIHZhbHVlIC0gYW5kIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCB1cGRhdGVkCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImlnbm9yaW5nIHNldHRpbmcgdW5jaGFuZ2VkIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFwcGx5IHNldHRpbmcKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJzZXR0aW5nIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gb2xkVmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHBhcmFtLT50cnlTZXQoCisgICAgICAgICAgICAgICAgICAgICghbGFzdCAmJiBwYXJhbUl4ID09IGl4KSA/IHAgOiBwYXJhbS0+dmFsdWUoKS5nZXQoKSwgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICZjaGFuZ2VkLCAqX21GYWN0b3J5LCBmYWlsdXJlcyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbmV3VmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIEMyX0NIRUNLX0VRKG9sZFZhbHVlID09IG5ld1ZhbHVlLCAqb2xkVmFsdWUgPT0gKm5ld1ZhbHVlKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9PSzogYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CQURfVkFMVUU6IHBhcmFtQmFkVmFsdWUgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcGFyYW1Ob01lbW9yeSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiBwYXJhbVRpbWVkT3V0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CTE9DS0lORzogIHBhcmFtQmxvY2tpbmcgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcGFyYW1Db3JydXB0ZWQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiA7Ly8gVE9ETyBmYXRhbAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGJhY2sgcmVzdWx0IGZvciBjb25maWd1cmVkIHZhbHVlcyAob3IgaW52YWxpZGF0ZSBpZiBpdCBkb2VzIG5vdCBmaXQgb3IgbWF0Y2gpCisgICAgICAgICAgICBpZiAodXBkYXRlUGFyYW1zICYmICFsYXN0ICYmIHBhcmFtSXggPT0gaXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXAtPnVwZGF0ZUZyb20oKnBhcmFtLT52YWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21wYXJlIHB0cnMgYXMgcGFyYW1zIGFyZSBjb3B5IG9uIHdyaXRlCisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicGFyYW0gIiA8PCBpeCA8PCAiIHZhbHVlIGNoYW5nZWQiOworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGNoYW5nZWQgdXBkYXRlIGRvd24tZGVwZW5kZW5jaWVzIGFuZCBtYXJrIHRoZW0gZGlydHkKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogcGFyYW0tPmdldERvd25EZXBlbmRlbmNpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbnNlcnRfcmVzID0gZGVwZW5kZW5jaWVzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSwgeyBpeCwgdHJ1ZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5zZXJ0X3Jlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqaW5zZXJ0X3Jlcy5maXJzdCkuc2Vjb25kLnNlY29uZCA9IHRydWU7IC8vIG1hcmsgZGlydHkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkpOworICAgICAgICAgICAgICAgICAgICBDMl9DSEVDSyhpdC0+c2Vjb25kLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkb3duIGRlcGVuZGVuY2llcyB0byB1cGRhdGUgYXQgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkgPDwgIjogIiA8PCBpdC0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGdldCBsYXRlIHJlYWQgcGFyYW1ldGVycworICAgIGZvciAoQzJQYXJhbSAqcCA6IGxhdGVSZWFkUGFyYW1zKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShwLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBwLT51cGRhdGVGcm9tKCp2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6CisgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBub3QgbWFya2VkIGluIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPyBDMl9PSyA6CisgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA/IEMyX09LIDogQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicXVlcnlpbmcgZmllbGQgIiA8PCBxdWVyeS5maWVsZCgpOworICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChxdWVyeS5maWVsZCgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBwYXJhbSI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgbVJlZmxlY3RvciwgaXgsCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChxdWVyeS5maWVsZCgpKSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIGlmICh+b2ZmcyA9PSAwKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIGNvdWxkIG5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJmaWVsZCByZXNvbHZlZCB0byAiCisgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJAJTAyengrJTAyeCIsIG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaWVsZCA9CisgICAgICAgICAgICBwYXJhbS0+ZmluZEZpZWxkKG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgaWYgKCFmaWVsZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgZmllbGQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICp2YWx1ZXMgPSBudWxscHRyOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5LnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgICAgICB2YWx1ZXMgPSBmaWVsZC0+Z2V0UG9zc2libGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgcXVlcnkgdHlwZTogIiA8PCBxdWVyeS50eXBlKCk7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlcykgeworICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gKnZhbHVlczsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAibm8gdmFsdWVzIHB1Ymxpc2hlZCBieSBjb21wb25lbnQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBDMkludGVyZmFjZUhlbHBlcjo6bG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PihtTXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlYzkxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKQEAgLTAsMCArMSwxMjkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1wYXJhbWV0ZXIiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFsdWUiCisKKyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UKKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFJhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgcmFuZ2UgY2FsY3VsYXRpb25zLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEZQPXN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXIgeworICAgIC8qKgorICAgICAqIHR5cGUgb2YgcmFuZ2Ugc2l6ZTogYSAtIGIgaWYgYSA+PSBiIGFuZCBhIGFuZCBiIGFyZSBvZiB0eXBlIFQKKyAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZSBEaWZmVHlwZTsKKworICAgIC8qKgorICAgICAqIGNhbGN1bGF0ZSAoaGlnaCAtIGxvdykgbW9kIHN0ZXAKKyAgICAgKi8KKyAgICBzdGF0aWMgRGlmZlR5cGUgbW9kKFQgbG93LCBUIGhpZ2gsIFQgc3RlcCkgeworICAgICAgICByZXR1cm4gRGlmZlR5cGUoaGlnaCAtIGxvdykgJSBEaWZmVHlwZShzdGVwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXI8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgVCBEaWZmVHlwZTsKKworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBmbW9kKGhpZ2ggLSBsb3csIHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+OjpDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBfbU1pbiA9IHZhbHVlcy5yYW5nZS5taW4ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21NYXggPSB2YWx1ZXMucmFuZ2UubWF4LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tU3RlcCA9IHZhbHVlcy5yYW5nZS5zdGVwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tTnVtID0gdmFsdWVzLnJhbmdlLm51bS5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbURlbm9tID0gdmFsdWVzLnJhbmdlLmRlbm9tLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX21NaW4gPSBNQVhfVkFMVUU7CisgICAgICAgIF9tTWF4ID0gTUlOX1ZBTFVFOworICAgICAgICBfbVN0ZXAgPSBNSU5fU1RFUDsKKyAgICAgICAgX21OdW0gPSAwOworICAgICAgICBfbURlbm9tID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkUmFuZ2U8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGZhbGwgYmV0d2VlbiBtaW4gYW5kIG1heAorICAgIGlmICh2YWx1ZSA8IF9tTWluIHx8IHZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzaW1wbGUgcmFuZ2VzIGNvbnRhaW4gYWxsIHZhbHVlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKGlzU2ltcGxlUmFuZ2UoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gbWluIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSByYW5nZQorICAgIGlmICh2YWx1ZSA9PSBfbU1pbikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gc3RlcHBlZCByYW5nZXMgcmVxdWlyZSAodmFsIC0gbWluKSAlIHN0ZXAgdG8gYmUgemVybworICAgIGlmIChpc0FyaXRobWV0aWNTZXJpZXMoKSkgeworICAgICAgICByZXR1cm4gX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxUPjo6bW9kKF9tTWluLCB2YWx1ZSwgX21TdGVwKSA9PSAwOworICAgIH0KKyAgICAvLyBwdXJlIGdlb21ldHJpYyBzZXJpZXMgcmVxdWlyZSAodmFsIC8gbWluKSB0byBiZSBpbnRlZ2VyIG11bHRpcGxlIG9mIChudW0vZGVub20pCisgICAgaWYgKGlzR2VvbWV0cmljU2VyaWVzKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgbG9nMmJhc2UgPSBsb2cyKF9tTnVtIC8gX21EZW5vbSk7CisgICAgICAgIGRvdWJsZSBwb3dlciA9IGxscm91bmQobG9nMih2YWx1ZSAvIGRvdWJsZShfbU1pbikpIC8gbG9nMmJhc2UpOworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IHJlc3VsdCBmYWxscyB3aXRoaW4gcHJlY2lzaW9uIChvdGhlciB0aGFuIHJvdW5kKQorICAgICAgICByZXR1cm4gdmFsdWUgPT0gVChfbU1pbiAqIHBvdyhfbU51bSAvIF9tRGVub20sIHBvd2VyKSArIE1JTl9TVEVQIC8gMik7CisgICAgfQorICAgIC8vIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHJlcXVpcmUgdmFsaWRhdGluZyBieSB3YWxraW5nIHRocm91Z2ggdGhlIHNlcmllcworICAgIGlmIChpc01hY1NlcmllcygpKSB7CisgICAgICAgIGRvdWJsZSBsYXN0VmFsdWUgPSBfbU1pbjsKKyAgICAgICAgZG91YmxlIGJhc2UgPSBfbU51bSAvIF9tRGVub207CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhc3QgaXMgc2FmZSBhcyBfbU1pbiA8PSBsYXN0VmFsdWUgPD0gX21NYXgKKyAgICAgICAgICAgIGlmIChUKGxhc3RWYWx1ZSArIE1JTl9TVEVQIC8gMikgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvdWJsZSBuZXh0VmFsdWUgPSBmbWEobGFzdFZhbHVlLCBiYXNlLCBfbVN0ZXApOworICAgICAgICAgICAgaWYgKG5leHRWYWx1ZSA8PSBsYXN0VmFsdWUgfHwgbmV4dFZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNlcmllcyBpcyBubyBsb25nZXIgbW9ub3RvbmljIG9yIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdFZhbHVlID0gbmV4dFZhbHVlOworICAgICAgICB9OworICAgIH0KKyAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgcmFuZ2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+IEMyU3VwcG9ydGVkUmFuZ2U8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIC8vIFRPRE8gLSB0aGlzIG9ubHkgd29ya3MgZm9yIHNpbXBsZSByYW5nZXMKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om1heChfbU1pbiwgbGltaXQuX21NaW4pLCBzdGQ6Om1pbihfbU1heCwgbGltaXQuX21NYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoX21TdGVwLCBsaW1pdC5fbVN0ZXApKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCisvLyBmbG9hdCBmbGFncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IGRlZmluZSBhIGZldyBtZXRob2RzIHRvIHN1cHBvcnQgZ2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGNvZGUKK3RlbXBsYXRlPD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmNvbnRhaW5zKGZsb2F0IHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxmbG9hdD4oKTsKK30KKwordGVtcGxhdGU8PgorQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlczsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPD4KK2Zsb2F0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjptaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkRmxhZ3M8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGNvbnRhaW4gdGhlIG1pbmltYWwgbWFzaworICAgIFQgbWluTWFzayA9IG1pbigpOworICAgIGlmICh+dmFsdWUgJiBtaW5NYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgJj0gfm1pbk1hc2s7CisgICAgLy8gb3RoZXJ3aXNlLCByZW1vdmUgZmxhZ3MgZnJvbSB2YWx1ZSBhbmQgc2VlIGlmIHdlIGFycml2ZSBhdCAwCisgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh+dmFsdWUgJiB2LnJlZjxWYWx1ZVR5cGU+KCkpID09IDApIHsKKyAgICAgICAgICAgIHZhbHVlICY9IH52LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVlID09IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpmbGFncygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKGMyX21heChfbVZhbHVlcy5zaXplKCksIDF1KSAtIDEpOworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSArIDEsIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApLT5UIHsKKyAgICAgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gdmFsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkRmxhZ3M8VD4gQzJTdXBwb3J0ZWRGbGFnczxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBUIG1pbk1hc2sgPSBtaW4oKSB8IGxpbWl0Lm1pbigpOworICAgIC8vIG1pbmltdW0gbWFzayBtdXN0IGJlIGNvdmVyZWQgYnkgYm90aCB0aGlzIGFuZCBvdGhlcgorICAgIGlmIChsaW1pdC5jb250YWlucyhtaW5NYXNrKSAmJiBjb250YWlucyhtaW5NYXNrKSkgeworICAgICAgICB2YWx1ZXNbMF0gPSBtaW5NYXNrOworICAgICAgICAvLyBrZWVwIG9ubHkgZmxhZ3MgdGhhdCBhcmUgY292ZXJlZCBieSBsaW1pdAorICAgICAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0LCBtaW5NYXNrXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbWluTWFzayB8fCAhbGltaXQuY29udGFpbnModmFsdWUpOyB9KTsKKyAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGRvIGl0IHZpY2UgdmVyc2EKKyAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbWluTWFzayAmJiBjb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKChWYWx1ZVR5cGUpdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgQzJTdXBwb3J0ZWRGbGFnczxUPjo6bWluKCkgY29uc3QgeworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZnJvbnQoKS50ZW1wbGF0ZSByZWY8VmFsdWVUeXBlPigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBUKDApOworICAgIH0KK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHI2NF90PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRWYWx1ZVNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKF9tVmFsdWVzLmNiZWdpbigpLCBfbVZhbHVlcy5jZW5kKCksCisgICAgICAgICAgICBbdmFsdWVdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgICAgIH0pICE9IF9tVmFsdWVzLmNlbmQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBzdGQ6OnJlbW92ZV9pZih2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpLCBbJmxpbWl0XShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYpIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7IH0pOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OnZhbHVlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKF9tVmFsdWVzLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0oX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLCBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIC0+IFQgeworICAgICAgICByZXR1cm4gcC5yZWY8VmFsdWVUeXBlPigpOworICAgIH0pOworICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgICAgIDogX21UeXBlKHZhbHVlcy50eXBlKSwKKyAgICAgICAgICBfbVJhbmdlKHZhbHVlcyksCisgICAgICAgICAgX21WYWx1ZXModmFsdWVzKSwKKyAgICAgICAgICBfbUZsYWdzKHZhbHVlcykgeyB9CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21GbGFnczsKKworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6IHJldHVybiBfbVJhbmdlLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6IHJldHVybiBfbVZhbHVlcy5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6IHJldHVybiBfbUZsYWdzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbD4odmFsdWVzKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+Ojp+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnN1cHBvcnRzKHZhbHVlKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKQorICAgICAgICA6IF9tUGFyYW1GaWVsZChmaWVsZCksCisgICAgICAgICAgX21UeXBlKHR5cGVfdDo6UkFOR0UpLAorICAgICAgICAgIF9tRGVmaW5lZChmYWxzZSksCisgICAgICAgICAgX21SYW5nZShDMlN1cHBvcnRlZFJhbmdlPFQ+OjpBbnkoKSksCisgICAgICAgICAgX21WYWx1ZXMoQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Tm9uZSgpKSwKKyAgICAgICAgICBfbUZsYWdzKEMyU3VwcG9ydGVkRmxhZ3M8VD46Ok5vbmUoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21WYWx1ZXMpOworICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21SYW5nZSk7CisgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbUZsYWdzKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRSRVNQQVNTCisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4gKi8KKyAgICB2b2lkIGFueSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4gKi8KKyAgICB2b2lkIG5vbmUoKSB7CisgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6VkFMVUVTOworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLiAqLworICAgIHZvaWQgZXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih7dmFsdWV9KSk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbVJhbmdlKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdC5saW1pdGVkVG8oX21GbGFncyk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgZmxhZ3MKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSBmbGFnIHNldC4gKi8KKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbUZsYWdzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tRmxhZ3MpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21GbGFncyA9IF9tRmxhZ3MubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgcmFuZ2VzIHRvIGZsYWdzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21SYW5nZSA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgZmxhZ3MgdG8gcmFuZ2VzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tUmFuZ2UgPSBfbVJhbmdlLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgQzJfRENIRUNLKF9tVmFsdWVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgbm9uLWNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdm9pZCBpbnN0YW50aWF0ZSgpIGNvbnN0IF9fdW51c2VkIHsKKyAgICAgICAgKHZvaWQpX21WYWx1ZXMudmFsdWVzKCk7IC8vIGluc3RhbnRpYXRlIGNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdHlwZWRlZiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgdHlwZV90OworCisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworICAgIGJvb2wgX21EZWZpbmVkOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gX21GbGFnczsKKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEMyUGFyYW1GaWVsZFZhbHVlcykoKl9tSW1wbC5nZXQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPihmaWVsZCkpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6YW55KCkgeworICAgIF9tSW1wbC0+YW55KCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bm9uZSgpIHsKKyAgICBfbUltcGwtPm5vbmUoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjplcXVhbFRvKFQgdmFsdWUpIHsKKyAgICBfbUltcGwtPmVxdWFsVG8odmFsdWUpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm90aGVyKSB7CisgICAgX21JbXBsID0gc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojp+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCkgOiBfbUNvbmZsaWN0cygpIHsgfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjp3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpyZXRyaWV2ZUNvbmZsaWN0cygpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKF9tQ29uZmxpY3RzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlNldHRpbmdSZXN1bHQvc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6UmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSkgeworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeyBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgeyBwYXJhbSB9LCB7IH0gfTsKK30KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8pIHsKKyAgICByZXR1cm4geyBpc0luZm8gPyBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFIDogQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsCisgICAgICAgICAgICAgeyBwYXJhbUZpZWxkIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6Q29uZmxpY3QoCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywgYm9vbCBpc0luZm8pIHsKKyAgICBDMl9DSEVDSyghY29uZmxpY3RzLmVtcHR5KCkpOworICAgIGlmIChpc0luZm8pIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULAorICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtRmllbGRWYWx1ZXMpLCBjb25mbGljdHMucmV0cmlldmVDb25mbGljdHMoKQorICAgICAgICB9OworICAgIH0KK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCkKKyAgICAgICAgOiBfbVN0YXR1cyhDMl9CQURfVkFMVUUpIHsKKyAgICBfbVJlc3VsdHMuZW1wbGFjZV9iYWNrKG5ldyBDMlNldHRpbmdSZXN1bHQoc3RkOjptb3ZlKHJlc3VsdCkpKTsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IHJlc3VsdHMuX21SZXN1bHRzKSB7CisgICAgICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgcmVzdWx0cy5fbVJlc3VsdHMuY2xlYXIoKTsKKyAgICAvLyBUT0RPOiBtU3RhdHVzCisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqdGhpcyk7Cit9CisKK2MyX3N0YXR1c190IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpyZXRyaWV2ZUZhaWx1cmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IF9tUmVzdWx0cykgeworICAgICAgICBmYWlsdXJlcy0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyKSk7CisgICAgfQorICAgIF9tUmVzdWx0cy5jbGVhcigpOworICAgIHJldHVybiBfbVN0YXR1czsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cykgOiBfbVN0YXR1cyhzdGF0dXMpIHsKKyAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VUIG9yIENPUlJVUFRFRAorICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6X0luc3BlY3RvciB7CisgICAgLy8vIHJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IEdldEltcGwoY29uc3QgSW5mbyAmaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5fbUltcGw7CisgICAgfQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OkluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgeworICAgIEMyRmllbGREZXNjcmlwdG9yIGZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnQ7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgdWludDMyX3QgZGVwdGg7CisgICAgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0OworICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0OworICAgIHVpbnQzMl90IHVzZWRFeHRlbnQ7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QgaW5jbHVkaW5nIGNvcGllcyBvZiBpdHMgcGFyZW50IGNoYWluCisgICAgSW1wbCBjbG9uZSgpIGNvbnN0OworCisgICAgLy8vIGNyZWF0ZXMgYSBjb3B5IG9mIGEgc2hhcmVkIHBvaW50ZXIgdG8gYW4gb2JqZWN0CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJik7CisKKyAgICBJbXBsKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZF8sIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnRfLAorICAgICAgICAgICAgdWludDMyX3QgaW5kZXhfLCB1aW50MzJfdCBkZXB0aF8sIHVpbnQzMl90IGJhc2VGaWVsZE9mZnNldF8sCisgICAgICAgICAgICB1aW50MzJfdCBhcnJheU9mZnNldF8sIHVpbnQzMl90IHVzZWRFeHRlbnRfKQorICAgICAgICA6IGZpZWxkKGZpZWxkXyksIHBhcmVudChwYXJlbnRfKSwgaW5kZXgoaW5kZXhfKSwgZGVwdGgoZGVwdGhfKSwKKyAgICAgICAgICBiYXNlRmllbGRPZmZzZXQoYmFzZUZpZWxkT2Zmc2V0XyksIGFycmF5T2Zmc2V0KGFycmF5T2Zmc2V0XyksIHVzZWRFeHRlbnQodXNlZEV4dGVudF8pIHsgfQorfTsKKworc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJmluZm8pIHsKKyAgICBpZiAoaW5mbykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihpbmZvLT5jbG9uZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW1wbCBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OmNsb25lKCkgY29uc3QgeworICAgIEltcGwgcmVzID0gSW1wbCgqdGhpcyk7CisgICAgcmVzLnBhcmVudCA9IENsb25lKHJlcy5wYXJlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IF9tSW1wbChpbXBsKSB7IH0KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+YXJyYXlPZmZzZXQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmFycmF5U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXh0ZW50KCkgKiBzaXplKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmJhc2VGaWVsZE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5iYXNlRmllbGRPZmZzZXQ7Cit9OworCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpkZXB0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5kZXB0aDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6ZXh0ZW50KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnVzZWRFeHRlbnQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmluZGV4OworfQorCitib29sIEMyRmllbGRVdGlsczo6SW5mbzo6aXNBcml0aG1ldGljKCkgY29uc3QgeworICAgIHN3aXRjaCAoX21JbXBsLT5maWVsZC50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0ZsZXhpYmxlKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLmV4dGVudCgpID09IDA7Cit9CisKK0MyU3RyaW5nIEMyRmllbGRVdGlsczo6SW5mbzo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5uYW1lKCk7Cit9CisKK2NvbnN0IEMyRmllbGRVdGlsczo6SW5mbzo6TmFtZWRWYWx1ZXNUeXBlICZDMkZpZWxkVXRpbHM6OkluZm86Om5hbWVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWVkVmFsdWVzKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86Om9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChfbUltcGwtPmZpZWxkKTsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvIEMyRmllbGRVdGlsczo6SW5mbzo6cGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBJbmZvKF9tSW1wbC0+cGFyZW50KTsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OnR5cGVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQudHlwZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIDogcHVibGljIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBpbXBsZW1lbnRzIG9iamVjdCBlcXVhbGl0eQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJiBtSGVhZCA9PSBvdGhlci0+bUhlYWQ7CisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIHBvaW50ZWQgdG8gYnkgdGhpcyBpdGVyYXRvcgorICAgIHZpcnR1YWwgdmFsdWVfdHlwZSBnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJbmZvKG1IZWFkKTsKKyAgICB9CisKKyAgICAvLy8gaW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgLy8gbm90ZTogdGhpcyBjYW5ub3QgYmUgYWJzdHJhY3QgYXMgd2UgaW5zdGFudGlhdGUgdGhpcyBmb3IgTGlzdDo6ZW5kKCkuIGluY3JlbWVudCB0byBlbmQoKQorICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEltcGwoc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCkKKyAgICAgICAgOiBtSGVhZChoZWFkKSB7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbmZvOjpJbXBsPiBtSGVhZDsgLy8vPCBjdXJyZW50IGZpZWxkCit9OworCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjp2YWx1ZV90eXBlIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldCgpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yJiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgIG1JbXBsLT5pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVxdWFscyhvdGhlci5tSW1wbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpMaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SXRlcmF0b3I6OkltcGw+IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SXRlcmF0b3I6OkltcGw+KCk7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKK307CisKK0MyRmllbGRVdGlsczo6TGlzdDo6TGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6YmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmJlZ2luKCkpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6ZW5kKCkgY29uc3QgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yKG1JbXBsLT5lbmQoKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGJhc2UgY2xhc3MgaGVscGVyIHRoYXQgYWxsb3dzIGRlc2NlbmRpbmcgaW50byB0aGUgZmllbGQgaGllcmFyY2h5LgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCB7CisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYmFzZS1maWVsZCdzIG9mZnNldCBvZiB0aGUgcGFyZW50IGZpZWxkIChvciB0aGUgcGFyYW0gb2Zmc2V0IGlmIG5vIHBhcmVudCkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBwYXJlbnQtPmJhc2VGaWVsZE9mZnNldDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudE9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxscHRyID8gc2l6ZW9mKEMyUGFyYW0pIDogR2V0T2Zmc2V0KHBhcmVudC0+ZmllbGQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvciwKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IGhlYWQgPSBudWxscHRyKQorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoaGVhZCksCisgICAgICAgICAgbVBhcmFtU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIG1SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIC8vLyByZXR1cm5zIGEgbGVhZiBpbmZvIG9iamVjdCBhdCBhIHNwZWNpZmljIGluZGV4IGZvciBhIGNoaWxkIGZpZWxkCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbWFrZUxlYWYoCisgICAgICAgICAgICBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQsIHVpbnQzMl90IGluZGV4KSB7CisgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0ID0gcGFyZW50T2Zmc2V0ICsgR2V0T2Zmc2V0KGZpZWxkKTsKKyAgICAgICAgdWludDMyX3QgdXNlZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChhcnJheU9mZnNldCwgbVBhcmFtU2l6ZSkgLSBhcnJheU9mZnNldCkgLyBHZXRTaXplKGZpZWxkKTsKKworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+KAorICAgICAgICAgICAgICAgIE9mZnNldEZpZWxkRGVzY3JpcHRvcihmaWVsZCwgcGFyZW50T2Zmc2V0ICsgaW5kZXggKiBHZXRTaXplKGZpZWxkKSksCisgICAgICAgICAgICAgICAgbUhlYWQgLyogcGFyZW50ICovLCBpbmRleCwgbUhlYWQgPT0gbnVsbHB0ciA/IDAgOiBtSGVhZC0+ZGVwdGggKyAxLAorICAgICAgICAgICAgICAgIEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZCkgKyBHZXRPZmZzZXQoZmllbGQpLAorICAgICAgICAgICAgICAgIGFycmF5T2Zmc2V0LCB1c2VkRXh0ZW50KTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgc3RydWN0IGluZGV4IGhhdmUgYmVlbiB0cmF2ZXJzZWQgdG8gZ2V0IHRvIHRoaXMgZmllbGQKKyAgICBib29sIHZpc2l0ZWQoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gJnNkIDogbUhpc3RvcnkpIHsKKyAgICAgICAgICAgIGlmIChzZC0+Y29yZUluZGV4KCkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPj4gbUhpc3Rvcnk7IC8vIHN0cnVjdHVyZSB0eXBlcyB2aXNpdGVkCit9OworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKSB0aGF0IHZpc2l0cyBlYWNoIGJhc2UgZmllbGQuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciB7CisgICAgLy8vIGVudW1lcmF0ZSBiYXNlIGZpZWxkcyBvZiBhIHBhcmFtZXRlcgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW0uc2l6ZSgpKSB7CisgICAgICAgIGRlc2NlbmRJbnRvKHBhcmFtLmNvcmVJbmRleCgpKTsKKyAgICB9CisKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgZmllbGQKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+IGltcGwpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoaW1wbC0+bVJlZmxlY3RvciwgaW1wbC0+bVBhcmFtU2l6ZSwgaW1wbC0+bUhlYWQpIHsKKyAgICAgICAgbUhpc3RvcnkgPSBpbXBsLT5tSGlzdG9yeTsKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgaWYgKCF2aXNpdGVkKGluZGV4KSkgeworICAgICAgICAgICAgICAgIGRlc2NlbmRJbnRvKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGJhc2UgZmllbGQuCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gZG9uJ3QgZ28gcGFzdCBlbmQKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGxwdHIgfHwgX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIHN0cnVjdHVyZXMKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgLy8gZG8gbm90IHJlY3Vyc2UgaW50byB0aGUgc2FtZSBzdHJ1Y3RzCisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpICYmIGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzY2VuZCBhZnRlciB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgd2hpbGUgKCFtSGlzdG9yeS5lbXB0eSgpICYmIF9tRmllbGRzLmJhY2soKSA9PSBtSGlzdG9yeS5iYWNrKCktPmVuZCgpKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1IZWFkLT5wYXJlbnQ7CisgICAgICAgICAgICBtSGlzdG9yeS5wb3BfYmFjaygpOworICAgICAgICAgICAgX21GaWVsZHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbmUgaWYgaGlzdG9yeSBpcyBub3cgZW1wdHkKKyAgICAgICAgaWYgKF9tRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIGJlIHRyYXZlcnNpbmcgYSBzdWItdHJlZSBzbyBjbGVhciBoZWFkCisgICAgICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBuZXh0ID0gX21GaWVsZHMuYmFjaygpOworICAgICAgICBtSGVhZC0+ZmllbGQgPSBPZmZzZXRGaWVsZERlc2NyaXB0b3IoKm5leHQsIEdldFBhcmVudE9mZnNldChtSGVhZC0+cGFyZW50KSk7CisgICAgICAgIG1IZWFkLT5pbmRleCA9IDA7IC8vIHJlc2V0IGluZGV4IGp1c3QgaW4gY2FzZSBmb3IgY29ycmVjdG5lc3MKKyAgICAgICAgbUhlYWQtPmJhc2VGaWVsZE9mZnNldCA9IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZC0+cGFyZW50KSArIEdldE9mZnNldCgqbmV4dCk7CisgICAgICAgIG1IZWFkLT5hcnJheU9mZnNldCA9IEdldE9mZnNldChtSGVhZC0+ZmllbGQpOworICAgICAgICBtSGVhZC0+dXNlZEV4dGVudCA9IG1IZWFkLT5maWVsZC5leHRlbnQoKSA/IDoKKyAgICAgICAgICAgICAgICAoc3RkOjptYXgobUhlYWQtPmFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIG1IZWFkLT5hcnJheU9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gR2V0U2l6ZShtSGVhZC0+ZmllbGQpOworICAgICAgICArK19tRmllbGRzLmJhY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEga25vd24sIHZhbGlkICh1bnRyYXZlcnNlZCkgc3RydWN0dXJlLCBpdCBtb2RpZmllcyB0aGlzIGl0ZXJhdG9yCisgICAgLy8vIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgZG9lcyBub3QKKyAgICAvLy8gbW9kaWZ5IHRoaXMgaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBmaXJzdCA9IGRlc2MtPmJlZ2luKCk7CisgICAgICAgICAgICBtSGVhZCA9IG1ha2VMZWFmKCpmaXJzdCwgMCAvKiBpbmRleCAqLyk7CisgICAgICAgICAgICBfbUZpZWxkcy5lbXBsYWNlX2JhY2soKytmaXJzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIG5leHQgZmllbGQgcG9pbnRlcnMgZm9yIGVhY2ggZGVwdGguCisgICAgLy8vIG5vdGU6IF9tRmllbGRzIG1heSBiZSBzaG9ydGVkIHRoYW4gbUhpc3RvcnksIGlmIGl0ZXJhdGluZyBhdCBhIGRlcHRoCisgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yPigqX21QYXJhbSwgX21SZWZsZWN0b3IpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tUGFyYW0oJnBhcmFtKSwgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtICpfbVBhcmFtOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpMaXN0KHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZT4ocGFyYW0sIHJlZmxlY3RvcikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlIHNpYmxpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gJmluZm8sIHNpemVfdCBsZXZlbCkKKyAgICAgICAgICAvLyBjbG9uZSBpbmZvIGNoYWluIGFzIHRoaXMgaXRlcmF0b3Igd2lsbCBjaGFuZ2UgaXQKKyAgICAgICAgOiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsKEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Q2xvbmUoaW5mbykpIHsKKyAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0b3JlIHBhcmVudCBjaGFpbiAodXAgdG8gbGV2ZWwpIGZvciBxdWljayBhY2Nlc3MKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbm9kZSA9IG1IZWFkOworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKDsgaXggPCBsZXZlbCAmJiBub2RlOyArK2l4KSB7CisgICAgICAgICAgICBub2RlLT5pbmRleCA9IDA7CisgICAgICAgICAgICBfbVBhdGguZW1wbGFjZV9iYWNrKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFBhdGgoaXgpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyBJbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IgYnkgdmlzaXRpbmcgZWFjaCBpbmRleC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICB3aGlsZSAoaXggPCBfbVBhdGguc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoKytfbVBhdGhbaXhdLT5pbmRleCA8IF9tUGF0aFtpeF0tPnVzZWRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFBhdGgoaXggKyAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhdGhbaXgrK10tPmluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gYWRqdXN0cyBmaWVsZCBvZmZzZXRzIGFsb25nIHRoZSBwYXRoIHVwIHRvIHRoZSBzcGVjaWZpYyBsZXZlbCAtIDEuCisgICAgLy8vIFRoaXMgaW4tZmFjdCBoYXMgdG8gYmUgZG9uZSBkb3duIHRoZSBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIGFzIGNoaWxkIGZpZWxkcyBtdXN0CisgICAgLy8vIGZhbGwgd2l0aGluIHBhcmVudCBmaWVsZHMuCisgICAgdm9pZCBzZXR1cFBhdGgoc2l6ZV90IGxldmVsKSB7CisgICAgICAgIEMyX0NIRUNLX0xFKGxldmVsLCBfbVBhdGguc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3Qgb2xkQXJyYXlPZmZzZXQgPSBsZXZlbCA/IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA6IDAgLyogdW51c2VkICovOworICAgICAgICB3aGlsZSAobGV2ZWwpIHsKKyAgICAgICAgICAgIC0tbGV2ZWw7CisgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgJnBhdGggPSAqX21QYXRoW2xldmVsXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBHZXRTaXplKHBhdGguZmllbGQpOworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gcGF0aC5hcnJheU9mZnNldCArIHNpemUgKiBwYXRoLmluZGV4OworICAgICAgICAgICAgU2V0T2Zmc2V0KHBhdGguZmllbGQsIG9mZnNldCk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBjaGlsZCdzIGFycmF5IG9mZnNldCB0byBmYWxsIHdpdGhpbiBjdXJyZW50IGluZGV4LCBidXQgaG9sZCBvbnRvIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBhcnJheU9mZnNldCBzbyB0aGF0IHdlIGNhbiBhZGp1c3Qgc3Vic2VxdWVudCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vZHVsbyBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkQXJyYXlPZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyAoX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IC0gb2xkQXJyYXlPZmZzZXQpICUgc2l6ZTsKKyAgICAgICAgICAgICAgICBvbGRBcnJheU9mZnNldCA9IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldDsKKyAgICAgICAgICAgICAgICBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgPSBjaGlsZEFycmF5T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4+IF9tUGF0aDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3I+KF9tSGVhZCwgX21MZXZlbCk7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZShjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkKKyAgICAgICAgOiBfbUhlYWQoQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yOjpHZXRJbXBsKGZpZWxkKSksIF9tTGV2ZWwobGV2ZWwpIHsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tSGVhZDsKKyAgICBzaXplX3QgX21MZXZlbDsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlQ291c2lucyhjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGU+KGZpZWxkLCBsZXZlbCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBsb2NhdGVGaWVsZCgpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLCB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW1TaXplKSwKKyAgICAgICAgICBfbUZpZWxkKGZpZWxkKSB7CisgICAgICAgIHdoaWxlIChkZXNjZW5kSW50byhpbmRleCkpIHsKKyAgICAgICAgICAgIGlmICgobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgobUhlYWQtPmZpZWxkLnR5cGUoKSAmfiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoKSB7CisgICAgICAgIG1IZWFkID0gX21UYWlsOworICAgICAgICBfbVRhaWwgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBnaXZlbiBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zCisgICAgLy8vIHRydWUuIE90aGVyd2lzZSwgaW5jbHVkaW5nIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzIGluIHRoZSBzdHJ1Y3R1cmUsIGl0IGRvZXMgbm90IG1vZGlmeSB0aGlzCisgICAgLy8vIGl0ZXJhdG9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZGVzY2VuZEludG8oQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZpZWxkIHRvIGJlIGxvY2F0ZWQgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQKKyAgICAgICAgLy8gZmllbGQKKyAgICAgICAgaWYgKG1IZWFkICE9IF9tVGFpbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworCisgICAgICAgICAgICB1aW50MzJfdCBwYXJlbnRPZmZzZXQgPSBHZXRQYXJlbnRPZmZzZXQobUhlYWQpOworCisgICAgICAgICAgICAvLyBsb2NhdGUgZmllbGQgdXNpbmcgYSBkdW1teSBmaWVsZCBkZXNjcmlwdG9yCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciBkdW1teSA9IHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQiwgMSAvKiBleHRlbnQgKi8sICJuYW1lIiwKKyAgICAgICAgICAgICAgICBHZXRPZmZzZXQoX21GaWVsZCkgLSBwYXJlbnRPZmZzZXQsIEdldFNpemUoX21GaWVsZCkKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaXJzdCBmaWVsZCB3aGVyZSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGR1bW15IG9mZnNldCAod2hpY2ggaXMgb25lIHBhc3QpCisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjp1cHBlcl9ib3VuZCgKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2JlZ2luKCksIGRlc2MtPmNlbmQoKSwgZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYSkgPCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gZGVzYy0+YmVnaW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIHByaW9yIHRvIGZpcnN0IGZpZWxkCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCA9ICppdDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBkdW1teSBlbmQtb2Zmc2V0IGlzIHdpdGhpbiB0aGlzIGZpZWxkCisgICAgICAgICAgICB1aW50MzJfdCBzdHJ1Y3RTaXplID0gc3RkOjptYXgobVBhcmFtU2l6ZSwgcGFyZW50T2Zmc2V0KSAtIHBhcmVudE9mZnNldDsKKyAgICAgICAgICAgIGlmIChHZXRFbmRPZmZzZXQoZHVtbXkpID4gR2V0RW5kT2Zmc2V0KGZpZWxkLCBzdHJ1Y3RTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCA9IChHZXRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZEluZGV4ID0KKyAgICAgICAgICAgICAgICAoR2V0RW5kT2Zmc2V0KGR1bW15KSAtIEdldE9mZnNldChmaWVsZCkgKyBHZXRTaXplKGZpZWxkKSAtIDEpIC8gR2V0U2l6ZShmaWVsZCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPiBzdGFydEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gRmllbGQgc2l6ZSBjb3VsZCBiZSB6ZXJvLCBpbiB3aGljaCBjYXNlIGVuZCBpbmRleCBpcyBzdGlsbCBvbiBzdGFydCBpbmRleC4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBmb3IgYWxsIG90aGVyIGNhc2VzLCBlbmRJbmRleCB3YXMgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbmRleCwgc28KKyAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgaXQuCisgICAgICAgICAgICAgICAgLS1lbmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHN0YXJ0TGVhZiA9CisgICAgICAgICAgICAgICAgbWFrZUxlYWYoZmllbGQsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBfbVRhaWwgPSBzdGFydExlYWY7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IG1ha2VMZWFmKGZpZWxkLCBlbmRJbmRleCk7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgX0MyRmllbGRJZCBfbUZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tVGFpbDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3I+KAorICAgICAgICAgICAgICAgIF9tSW5kZXgsIF9tRmllbGQsIF9tUGFyYW1TaXplLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgoQzJQYXJhbTo6Q29yZUluZGV4KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChwZikpKSwKKyAgICAgICAgICBfbUZpZWxkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZikpLAorICAgICAgICAgIF9tUGFyYW1TaXplKDApLAorICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0uY29yZUluZGV4KCkpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpLAorICAgICAgICAgIF9tUGFyYW1TaXplKHBhcmFtLnNpemUoKSksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBDMlBhcmFtOjpDb3JlSW5kZXggX21JbmRleDsKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgdWludDMyX3QgX21QYXJhbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geyBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBmLCByZWZsZWN0b3IpIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8QzJGaWVsZFV0aWxzOjpJbmZvPiBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBhcmFtLCBmaWVsZCwgcmVmbGVjdG9yKQorICAgIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTczZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAvLyB0byBiZSBhYmxlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBkZWZpbmVkCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNpemVfdCBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhDMlN0cmluZ0xpdGVyYWwgYSkgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYVtpXSA9PSAnXycpIHsKKyAgICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdCBjb3VudE1hdGNoaW5nKEMyU3RyaW5nTGl0ZXJhbCBhLCBjb25zdCBDMlN0cmluZyAmYikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYi5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFbaV0gfHwgYVtpXSAhPSBiW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYi5zaXplKCk7Cit9CisKKy8vIEFCQ0RlZiA9PiBhYmMtZGVmCisvLyBBQkNEMmVmID0+IGFiY2QyLWVmIC8vIDAKKy8vIEFCQ0QyRWYgPT4gYW5jZDItZWYgLy8gLTEKKy8vIEFiY0RlZiA9PiBhYmMtZGVmIC8vIC0xCisvLyBBYmMyRGVmID0+IGFiYy0yZGVmCisvLyBBYmMyZGVmID0+IGFiYy0yLWRlZgorLy8gX1lvID0+IF95bworLy8gX3lvID0+IF95bworLy8gQzJfeW8gPT4gYzIteW8KKy8vIEMyX195byA9PiBjMi15bworCisvL3N0YXRpYworQzJTdHJpbmcgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKSB7CisgICAgZW51bSB7CisgICAgICAgIGtOb25lID0gJy4nLAorICAgICAgICBrTG93ZXIgPSAnYScsCisgICAgICAgIGtVcHBlciA9ICdBJywKKyAgICAgICAga0RpZ2l0ID0gJzEnLAorICAgICAgICBrRGFzaCA9ICctJywKKyAgICAgICAga1VuZGVyc2NvcmUgPSAnXycsCisgICAgfSB0eXBlID0ga05vbmU7CisgICAgc2l6ZV90IHdvcmRfc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBuYW1lLnNpemUoKTsgKytpeCkgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgbmFtZS5zdWJzdHIoMCwgd29yZF9zdGFydCkgPDwgInwiCisgICAgICAgICAgICAgICAgPDwgbmFtZS5zdWJzdHIod29yZF9zdGFydCwgaXggLSB3b3JkX3N0YXJ0KSA8PCAiWyIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cihpeCwgMSkgPDwgIl0iIDw8IG5hbWUuc3Vic3RyKGl4ICsgMSkKKyAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChjaGFyKXR5cGU7CisgICAgICAgIGlmIChpc3VwcGVyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lW2l4XSA9IHRvbG93ZXIobmFtZVtpeF0pOworICAgICAgICAgICAgdHlwZSA9IGtVcHBlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2xvd2VyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0RpZ2l0ICYmIGl4ID4gMCkgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtVcHBlciAmJiBpeCA+IHdvcmRfc3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKyAtIDEsIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBrTG93ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtEaWdpdDsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lW2l4XSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtEYXNoKSB7CisgICAgICAgICAgICAgICAgbmFtZS5lcmFzZShpeC0tLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBrTm9uZSAmJiB0eXBlICE9IGtVbmRlcnNjb3JlKSB7CisgICAgICAgICAgICAgICAgbmFtZVtpeF0gPSAnLSc7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtEYXNoOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGUgPSBrVW5kZXJzY29yZTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZS5yZXNpemUoaXgpOworICAgICAgICB9CisgICAgfQorICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiPT4gIiA8PCBuYW1lOworICAgIHJldHVybiBuYW1lOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXgpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXM7CisgICAgQzJTdHJpbmcgcHJlZml4OworICAgIHNpemVfdCBleHRyYVVuZGVyc2NvcmVzID0gMDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoX3ByZWZpeCkgeworICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMoX3ByZWZpeCk7CisgICAgICAgIHByZWZpeCA9IF9wcmVmaXggKyBleHRyYVVuZGVyc2NvcmVzOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHByZWZpeCBhbmQgbWluaW11bSBsZWFkaW5nIHVuZGVyc2NvcmVzCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gdW5kZXJzY29yZXM7CisgICAgICAgICAgICBwcmVmaXggPSBzICsgdW5kZXJzY29yZXM7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG1hdGNoaW5nID0gY291bnRNYXRjaGluZygKKyAgICAgICAgICAgICAgICBzICsgdW5kZXJzY29yZXMsCisgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICAgICAgICAgIHByZWZpeC5yZXNpemUobWF0Y2hpbmcpOworICAgICAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IHN0ZDo6bWluKHVuZGVyc2NvcmVzLCBleHRyYVVuZGVyc2NvcmVzKTsKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpID09IDAgJiYgZXh0cmFVbmRlcnNjb3JlcyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIHN3YWxsb3cgdGhlIGZpcnN0IHVuZGVyc2NvcmUgYWZ0ZXIgdXBwZXIgY2FzZSBwcmVmaXhlcworICAgIGJvb2wgdXBwZXJDYXNlUHJlZml4ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZWZpeC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXNsb3dlcihwcmVmaXhbaV0pKSB7CisgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBDMlN0cmluZyBzYW5pdGl6ZWQgPSBDMlN0cmluZyhzLCB1bmRlcnNjb3JlcyAtIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICBzYW5pdGl6ZWQuYXBwZW5kKHMgKyBwcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXMgKworICAgICAgICAgICAgICAgICAgICAodXBwZXJDYXNlUHJlZml4ICYmIHNbcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzXSA9PSAnXycpKTsKKyAgICAgICAgc2FuaXRpemVkTmFtZXMucHVzaF9iYWNrKGNhbWVsQ2FzZVRvRGFzaGVkKHNhbml0aXplZCkpOworICAgIH0KKworICAgIGZvciAoQzJTdHJpbmcgcyA6IHNhbml0aXplZE5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgIH0KKworICAgIHJldHVybiBzYW5pdGl6ZWROYW1lczsKK30KKworLy9zdGF0aWMKK3N0ZDo6dmVjdG9yPEMyU3RyaW5nPiBfQzJFbnVtVXRpbHM6OnBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGZvdW5kTmFtZXM7CisgICAgc2l6ZV90IHBvcyA9IDAsIGxlbiA9IHN0cmxlbih2YWx1ZSk7CisgICAgZG8geworICAgICAgICBzaXplX3QgZW5kUG9zID0gc3RyY3Nwbih2YWx1ZSArIHBvcywgIiAsPSIpICsgcG9zOworICAgICAgICBpZiAoZW5kUG9zID4gcG9zKSB7CisgICAgICAgICAgICBmb3VuZE5hbWVzLmVtcGxhY2VfYmFjayh2YWx1ZSArIHBvcywgZW5kUG9zIC0gcG9zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVbZW5kUG9zXSAmJiB2YWx1ZVtlbmRQb3NdICE9ICcsJykgeworICAgICAgICAgICAgZW5kUG9zICs9IHN0cmNzcG4odmFsdWUgKyBlbmRQb3MsICIsIik7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gc3Ryc3BuKHZhbHVlICsgZW5kUG9zLCAiICwiKSArIGVuZFBvczsKKyAgICB9IHdoaWxlIChwb3MgPCBsZW4pOworICAgIHJldHVybiBmb3VuZE5hbWVzOworfQorCisvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKy8vc3RhdGljCitDMlBhcmFtICpDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICBpZiAoc2l6ZSA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYmxvYjsKKyAgICBpZiAocGFyYW0tPnNpemUoKSA+IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwYXJhbTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvQW5kcm9pZC5tayBiL21lZGlhL2NvbW1vbl90aW1lL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYTBkYjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29tbW9uX3RpbWUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotIwotIyBsaWJjb21tb25fdGltZV9jbGllbnQKLSMgKGJpbmRlciBtYXJzaGFsZXJzIGZvciBJQ29tbW9uQ2xvY2sgYXMgd2VsbCBhcyBjb21tb24gY2xvY2sgYW5kIGxvY2FsIGNsb2NrCi0jIGhlbHBlciBjb2RlKQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmNvbW1vbl90aW1lX2NsaWVudAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX1NSQ19GSUxFUyA6PSBjY19oZWxwZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICBsb2NhbF9jbG9jay5jcHAgXAotICAgICAgICAgICAgICAgICAgIElDb21tb25DbG9jay5jcHAgXAotICAgICAgICAgICAgICAgICAgIElDb21tb25UaW1lQ29uZmlnLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgdXRpbHMuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJpbmRlciBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmhhcmR3YXJlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJsb2cKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmNwcCBiL21lZGlhL2NvbW1vbl90aW1lL0lDb21tb25DbG9jay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjFmY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGNvbW1vbl90aW1lL0lDb21tb25DbG9jay5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgInV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqKioqIElDb21tb25DbG9jayAqKioqKi8KLQotZW51bSB7Ci0gICAgSVNfQ09NTU9OX1RJTUVfVkFMSUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIENPTU1PTl9USU1FX1RPX0xPQ0FMX1RJTUUsCi0gICAgTE9DQUxfVElNRV9UT19DT01NT05fVElNRSwKLSAgICBHRVRfQ09NTU9OX1RJTUUsCi0gICAgR0VUX0NPTU1PTl9GUkVRLAotICAgIEdFVF9MT0NBTF9USU1FLAotICAgIEdFVF9MT0NBTF9GUkVRLAotICAgIEdFVF9FU1RJTUFURURfRVJST1IsCi0gICAgR0VUX1RJTUVMSU5FX0lELAotICAgIEdFVF9TVEFURSwKLSAgICBHRVRfTUFTVEVSX0FERFJFU1MsCi0gICAgUkVHSVNURVJfTElTVEVORVIsCi0gICAgVU5SRUdJU1RFUl9MSVNURU5FUiwKLX07Ci0KLWNvbnN0IFN0cmluZzE2IElDb21tb25DbG9jazo6a1NlcnZpY2VOYW1lKCJjb21tb25fdGltZS5jbG9jayIpOwotY29uc3QgdWludDY0X3QgSUNvbW1vbkNsb2NrOjprSW52YWxpZFRpbWVsaW5lSUQgPSAwOwotY29uc3QgaW50MzJfdCBJQ29tbW9uQ2xvY2s6OmtFcnJvckVzdGltYXRlVW5rbm93biA9IDB4N0ZGRkZGRkY7Ci0KLWNsYXNzIEJwQ29tbW9uQ2xvY2sgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNvbW1vbkNsb2NrPgotewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBDb21tb25DbG9jayhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQ29tbW9uQ2xvY2s+KGltcGwpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGlzQ29tbW9uVGltZVZhbGlkKGJvb2wqIHZhbGlkLCB1aW50MzJfdCogdGltZWxpbmVJRCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19DT01NT05fVElNRV9WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqdmFsaWQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqdGltZWxpbmVJRCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tb25UaW1lVG9Mb2NhbFRpbWUoaW50NjRfdCBjb21tb25UaW1lLAotICAgICAgICAgICAgaW50NjRfdCogbG9jYWxUaW1lKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KGNvbW1vblRpbWUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ09NTU9OX1RJTUVfVE9fTE9DQUxfVElNRSwKLSAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqbG9jYWxUaW1lID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvY2FsVGltZVRvQ29tbW9uVGltZShpbnQ2NF90IGxvY2FsVGltZSwKLSAgICAgICAgICAgIGludDY0X3QqIGNvbW1vblRpbWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQobG9jYWxUaW1lKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQ0FMX1RJTUVfVE9fQ09NTU9OX1RJTUUsCi0gICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmNvbW1vblRpbWUgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29tbW9uVGltZShpbnQ2NF90KiBjb21tb25UaW1lKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT01NT05fVElNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmNvbW1vblRpbWUgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29tbW9uRnJlcSh1aW50NjRfdCogZnJlcSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09NTU9OX0ZSRVEsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpmcmVxID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvY2FsVGltZShpbnQ2NF90KiBsb2NhbFRpbWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0xPQ0FMX1RJTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpsb2NhbFRpbWUgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9jYWxGcmVxKHVpbnQ2NF90KiBmcmVxKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9MT0NBTF9GUkVRLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqZnJlcSA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFc3RpbWF0ZWRFcnJvcihpbnQzMl90KiBlc3RpbWF0ZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRVNUSU1BVEVEX0VSUk9SLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqZXN0aW1hdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZWxpbmVJRCh1aW50NjRfdCogaWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1RJTUVMSU5FX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqaWQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVwbHkucmVhZEludDY0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdGF0ZShTdGF0ZSogc3RhdGUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBzdGF0aWNfY2FzdDxTdGF0ZT4ocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJBZGRyKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfQUREUkVTUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKQotICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplU29ja2FkZHIoJnJlcGx5LCBhZGRyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJMaXN0ZW5lcigKLSAgICAgICAgICAgIGNvbnN0IHNwPElDb21tb25DbG9ja0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJMaXN0ZW5lcigKLSAgICAgICAgICAgIGNvbnN0IHNwPElDb21tb25DbG9ja0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ29tbW9uQ2xvY2ssICJhbmRyb2lkLm9zLklDb21tb25DbG9jayIpOwotCi1zdGF0dXNfdCBCbkNvbW1vbkNsb2NrOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIElTX0NPTU1PTl9USU1FX1ZBTElEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIHZhbGlkOwotICAgICAgICAgICAgdWludDMyX3QgdGltZWxpbmVJRDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlzQ29tbW9uVGltZVZhbGlkKCZ2YWxpZCwgJnRpbWVsaW5lSUQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih2YWxpZCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGltZWxpbmVJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDT01NT05fVElNRV9UT19MT0NBTF9USU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQ2NF90IGNvbW1vblRpbWUgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaW50NjRfdCBsb2NhbFRpbWU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tb25UaW1lVG9Mb2NhbFRpbWUoY29tbW9uVGltZSwgJmxvY2FsVGltZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxvY2FsVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMT0NBTF9USU1FX1RPX0NPTU1PTl9USU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQ2NF90IGxvY2FsVGltZSA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGNvbW1vblRpbWU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsb2NhbFRpbWVUb0NvbW1vblRpbWUobG9jYWxUaW1lLCAmY29tbW9uVGltZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGNvbW1vblRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0NPTU1PTl9USU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQ2NF90IGNvbW1vblRpbWU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRDb21tb25UaW1lKCZjb21tb25UaW1lKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoY29tbW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfQ09NTU9OX0ZSRVE6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGZyZXE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRDb21tb25GcmVxKCZmcmVxKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJlcSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfTE9DQUxfVElNRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50NjRfdCBsb2NhbFRpbWU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRMb2NhbFRpbWUoJmxvY2FsVGltZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxvY2FsVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfTE9DQUxfRlJFUTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDY0X3QgZnJlcTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldExvY2FsRnJlcSgmZnJlcSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyZXEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0VTVElNQVRFRF9FUlJPUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCBlcnJvcjsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVzdGltYXRlZEVycm9yKCZlcnJvcik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9USU1FTElORV9JRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDY0X3QgaWQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRUaW1lbGluZUlEKCZpZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGlkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfU1RBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0YXRlIHN0YXRlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U3RhdGUoJnN0YXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9NQVNURVJfQUREUkVTUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckFkZHIoJmFkZHIpOwotCi0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9PSBPSykgJiYgIWNhblNlcmlhbGl6ZVNvY2thZGRyKCZhZGRyKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVTb2NrYWRkcihyZXBseSwgJmFkZHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSRUdJU1RFUl9MSVNURU5FUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgVU5SRUdJU1RFUl9MSVNURU5FUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLS8qKioqKiBJQ29tbW9uQ2xvY2tMaXN0ZW5lciAqKioqKi8KLQotZW51bSB7Ci0gICAgT05fVElNRUxJTkVfQ0hBTkdFRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi19OwotCi1jbGFzcyBCcENvbW1vbkNsb2NrTGlzdGVuZXIgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNvbW1vbkNsb2NrTGlzdGVuZXI+Ci17Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBCcENvbW1vbkNsb2NrTGlzdGVuZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUNvbW1vbkNsb2NrTGlzdGVuZXI+KGltcGwpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25UaW1lbGluZUNoYW5nZWQodWludDY0X3QgdGltZWxpbmVJRCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKLSAgICAgICAgICAgICAgICBJQ29tbW9uQ2xvY2tMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVsaW5lSUQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fVElNRUxJTkVfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ29tbW9uQ2xvY2tMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5vcy5JQ29tbW9uQ2xvY2tMaXN0ZW5lciIpOwotCi1zdGF0dXNfdCBCbkNvbW1vbkNsb2NrTGlzdGVuZXI6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIE9OX1RJTUVMSU5FX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2tMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgdGltZWxpbmVJRCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBvblRpbWVsaW5lQ2hhbmdlZCh0aW1lbGluZUlEKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vblRpbWVDb25maWcuY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vblRpbWVDb25maWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg3YjM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2NvbW1vbl90aW1lL0lDb21tb25UaW1lQ29uZmlnLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGNvbW1vbl90aW1lL0lDb21tb25UaW1lQ29uZmlnLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioqKiogSUNvbW1vblRpbWVDb25maWcgKioqKiovCi0KLWVudW0gewotICAgIEdFVF9NQVNURVJfRUxFQ1RJT05fUFJJT1JJVFkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9NQVNURVJfRUxFQ1RJT05fUFJJT1JJVFksCi0gICAgR0VUX01BU1RFUl9FTEVDVElPTl9FTkRQT0lOVCwKLSAgICBTRVRfTUFTVEVSX0VMRUNUSU9OX0VORFBPSU5ULAotICAgIEdFVF9NQVNURVJfRUxFQ1RJT05fR1JPVVBfSUQsCi0gICAgU0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRCwKLSAgICBHRVRfSU5URVJGQUNFX0JJTkRJTkcsCi0gICAgU0VUX0lOVEVSRkFDRV9CSU5ESU5HLAotICAgIEdFVF9NQVNURVJfQU5OT1VOQ0VfSU5URVJWQUwsCi0gICAgU0VUX01BU1RFUl9BTk5PVU5DRV9JTlRFUlZBTCwKLSAgICBHRVRfQ0xJRU5UX1NZTkNfSU5URVJWQUwsCi0gICAgU0VUX0NMSUVOVF9TWU5DX0lOVEVSVkFMLAotICAgIEdFVF9QQU5JQ19USFJFU0hPTEQsCi0gICAgU0VUX1BBTklDX1RIUkVTSE9MRCwKLSAgICBHRVRfQVVUT19ESVNBQkxFLAotICAgIFNFVF9BVVRPX0RJU0FCTEUsCi0gICAgRk9SQ0VfTkVUV09SS0xFU1NfTUFTVEVSX01PREUsCi19OwotCi1jb25zdCBTdHJpbmcxNiBJQ29tbW9uVGltZUNvbmZpZzo6a1NlcnZpY2VOYW1lKCJjb21tb25fdGltZS5jb25maWciKTsKLQotY2xhc3MgQnBDb21tb25UaW1lQ29uZmlnIDogcHVibGljIEJwSW50ZXJmYWNlPElDb21tb25UaW1lQ29uZmlnPgotewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBDb21tb25UaW1lQ29uZmlnKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElDb21tb25UaW1lQ29uZmlnPihpbXBsKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJFbGVjdGlvblByaW9yaXR5KHVpbnQ4X3QgKnByaW9yaXR5KSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9FTEVDVElPTl9QUklPUklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqcHJpb3JpdHkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyRWxlY3Rpb25Qcmlvcml0eSh1aW50OF90IHByaW9yaXR5KSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocHJpb3JpdHkpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQVNURVJfRUxFQ1RJT05fUFJJT1JJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfRUxFQ1RJT05fRU5EUE9JTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVTb2NrYWRkcigmcmVwbHksIGFkZHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKCFjYW5TZXJpYWxpemVTb2NrYWRkcihhZGRyKSkKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGlmIChOVUxMID09IGFkZHIpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZVNvY2thZGRyKCZkYXRhLCBhZGRyKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9FTEVDVElPTl9FTkRQT0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJFbGVjdGlvbkdyb3VwSWQodWludDY0X3QgKmlkKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICppZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXBseS5yZWFkSW50NjQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyRWxlY3Rpb25Hcm91cElkKHVpbnQ2NF90IGlkKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQoaWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEludGVyZmFjZUJpbmRpbmcoU3RyaW5nMTYmIGlmYWNlTmFtZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlRFUkZBQ0VfQklORElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZmFjZU5hbWUgPSByZXBseS5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnRlcmZhY2VCaW5kaW5nKGNvbnN0IFN0cmluZzE2JiBpZmFjZU5hbWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihpZmFjZU5hbWUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0lOVEVSRkFDRV9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckFubm91bmNlSW50ZXJ2YWwoaW50ICppbnRlcnZhbCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfQU5OT1VOQ0VfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmludGVydmFsID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyQW5ub3VuY2VJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnRlcnZhbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0FOTk9VTkNFX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENsaWVudFN5bmNJbnRlcnZhbChpbnQgKmludGVydmFsKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NMSUVOVF9TWU5DX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICppbnRlcnZhbCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENsaWVudFN5bmNJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnRlcnZhbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ0xJRU5UX1NZTkNfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFuaWNUaHJlc2hvbGQoaW50ICp0aHJlc2hvbGQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUEFOSUNfVEhSRVNIT0xELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICp0aHJlc2hvbGQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYW5pY1RocmVzaG9sZChpbnQgdGhyZXNob2xkKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodGhyZXNob2xkKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QQU5JQ19USFJFU0hPTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXV0b0Rpc2FibGUoYm9vbCAqYXV0b0Rpc2FibGUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVUT19ESVNBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICphdXRvRGlzYWJsZSA9ICgwICE9IHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdXRvRGlzYWJsZShib29sIGF1dG9EaXNhYmxlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYXV0b0Rpc2FibGUgPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVUT19ESVNBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZm9yY2VOZXR3b3JrbGVzc01hc3Rlck1vZGUoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRk9SQ0VfTkVUV09SS0xFU1NfTUFTVEVSX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLQotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKENvbW1vblRpbWVDb25maWcsICJhbmRyb2lkLm9zLklDb21tb25UaW1lQ29uZmlnIik7Ci0KLXN0YXR1c190IEJuQ29tbW9uVGltZUNvbmZpZzo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfTUFTVEVSX0VMRUNUSU9OX1BSSU9SSVRZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJFbGVjdGlvblByaW9yaXR5KCZwcmlvcml0eSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHByaW9yaXR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0VMRUNUSU9OX1BSSU9SSVRZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldE1hc3RlckVsZWN0aW9uUHJpb3JpdHkocHJpb3JpdHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9NQVNURVJfRUxFQ1RJT05fRU5EUE9JTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoJmFkZHIpOwotCi0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9PSBPSykgJiYgIWNhblNlcmlhbGl6ZVNvY2thZGRyKCZhZGRyKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVTb2NrYWRkcihyZXBseSwgJmFkZHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0VMRUNUSU9OX0VORFBPSU5UOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0gICAgICAgICAgICBpbnQgaGFzQWRkciA9IGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgICAgIGlmIChoYXNBZGRyKSB7Ci0gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVTb2NrYWRkcigmZGF0YSwgJmFkZHIpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoJmFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZXRNYXN0ZXJFbGVjdGlvbkVuZHBvaW50KCZhZGRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9NQVNURVJfRUxFQ1RJT05fR1JPVVBfSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDY0X3QgaWQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJFbGVjdGlvbkdyb3VwSWQoJmlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50NjRfdCBpZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihkYXRhLnJlYWRJbnQ2NCgpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldE1hc3RlckVsZWN0aW9uR3JvdXBJZChpZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0lOVEVSRkFDRV9CSU5ESU5HOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0cmluZzE2IHJldDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEludGVyZmFjZUJpbmRpbmcocmV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYocmV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9JTlRFUkZBQ0VfQklORElORzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBTdHJpbmcxNiBpZmFjZU5hbWU7Ci0gICAgICAgICAgICBpZmFjZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0SW50ZXJmYWNlQmluZGluZyhpZmFjZU5hbWUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9NQVNURVJfQU5OT1VOQ0VfSU5URVJWQUw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGludGVydmFsOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWFzdGVyQW5ub3VuY2VJbnRlcnZhbCgmaW50ZXJ2YWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbnRlcnZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0FOTk9VTkNFX0lOVEVSVkFMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBpbnRlcnZhbCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNYXN0ZXJBbm5vdW5jZUludGVydmFsKGludGVydmFsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfQ0xJRU5UX1NZTkNfSU5URVJWQUw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGludGVydmFsOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0Q2xpZW50U3luY0ludGVydmFsKCZpbnRlcnZhbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGludGVydmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9DTElFTlRfU1lOQ19JTlRFUlZBTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0Q2xpZW50U3luY0ludGVydmFsKGludGVydmFsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfUEFOSUNfVEhSRVNIT0xEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCB0aHJlc2hvbGQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQYW5pY1RocmVzaG9sZCgmdGhyZXNob2xkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGhyZXNob2xkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9QQU5JQ19USFJFU0hPTEQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHRocmVzaG9sZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRQYW5pY1RocmVzaG9sZCh0aHJlc2hvbGQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9BVVRPX0RJU0FCTEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBhdXRvRGlzYWJsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1dG9EaXNhYmxlKCZhdXRvRGlzYWJsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGF1dG9EaXNhYmxlID8gMSA6IDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX0FVVE9fRElTQUJMRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGF1dG9EaXNhYmxlID0gKDAgIT0gZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBdXRvRGlzYWJsZShhdXRvRGlzYWJsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgRk9SQ0VfTkVUV09SS0xFU1NfTUFTVEVSX01PREU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZm9yY2VOZXR3b3JrbGVzc01hc3Rlck1vZGUoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL2NjX2hlbHBlci5jcHAgYi9tZWRpYS9jb21tb25fdGltZS9jY19oZWxwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdkZTc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2NvbW1vbl90aW1lL2NjX2hlbHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGNvbW1vbl90aW1lL2NjX2hlbHBlci5oPgotI2luY2x1ZGUgPGNvbW1vbl90aW1lL0lDb21tb25DbG9jay5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NdXRleCBDQ0hlbHBlcjo6bG9ja187Ci1zcDxJQ29tbW9uQ2xvY2s+IENDSGVscGVyOjpjb21tb25fY2xvY2tfOwotc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+IENDSGVscGVyOjpjb21tb25fY2xvY2tfbGlzdGVuZXJfOwotdWludDMyX3QgQ0NIZWxwZXI6OnJlZl9jb3VudF8gPSAwOwotCi1ib29sIENDSGVscGVyOjp2ZXJpZnlDbG9ja19sKCkgewotICAgIGJvb2wgcmV0ID0gZmFsc2U7Ci0KLSAgICBpZiAoY29tbW9uX2Nsb2NrXyA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbW1vbl9jbG9ja18gPSBJQ29tbW9uQ2xvY2s6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChjb21tb25fY2xvY2tfID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGJhaWxvdXQ7Ci0gICAgfQotCi0gICAgaWYgKHJlZl9jb3VudF8gPiAwKSB7Ci0gICAgICAgIGlmIChjb21tb25fY2xvY2tfbGlzdGVuZXJfID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbW1vbl9jbG9ja19saXN0ZW5lcl8gPSBuZXcgQ29tbW9uQ2xvY2tMaXN0ZW5lcigpOwotICAgICAgICAgICAgaWYgKGNvbW1vbl9jbG9ja19saXN0ZW5lcl8gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWxvdXQ7Ci0KLSAgICAgICAgICAgIGlmIChPSyAhPSBjb21tb25fY2xvY2tfLT5yZWdpc3Rlckxpc3RlbmVyKGNvbW1vbl9jbG9ja19saXN0ZW5lcl8pKQotICAgICAgICAgICAgICAgIGdvdG8gYmFpbG91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldCA9IHRydWU7Ci0KLWJhaWxvdXQ6Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgY29tbW9uX2Nsb2NrX2xpc3RlbmVyXyA9IE5VTEw7Ci0gICAgICAgIGNvbW1vbl9jbG9ja18gPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1DQ0hlbHBlcjo6Q0NIZWxwZXIoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJmxvY2tfKTsKLSAgICByZWZfY291bnRfKys7Ci0gICAgdmVyaWZ5Q2xvY2tfbCgpOwotfQotCi1DQ0hlbHBlcjo6fkNDSGVscGVyKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZsb2NrXyk7Ci0KLSAgICBhc3NlcnQocmVmX2NvdW50XyA+IDApOwotICAgIHJlZl9jb3VudF8tLTsKLQotICAgIC8vIElmIHdlIHdlcmUgdGhlIGxhc3QgQ0NIZWxwZXIgaW5zdGFuY2UgaW4gdGhlIHN5c3RlbSwgYW5kIHdlIGhhZAotICAgIC8vIHByZXZpb3VzbHkgcmVnaXN0ZXIgYSBsaXN0ZW5lciwgdW5yZWdpc3RlciBpdCBub3cgc28gdGhhdCB0aGUgY29tbW9uIHRpbWUKLSAgICAvLyBzZXJ2aWNlIGhhcyB0aGUgY2hhbmNlIHRvIGdvIGludG8gYXV0by1kaXNhYmxlZCBtb2RlLgotICAgIGlmICghcmVmX2NvdW50XyAmJgotICAgICAgIChjb21tb25fY2xvY2tfICE9IE5VTEwpICYmCi0gICAgICAgKGNvbW1vbl9jbG9ja19saXN0ZW5lcl8gIT0gTlVMTCkpIHsKLSAgICAgICAgY29tbW9uX2Nsb2NrXy0+dW5yZWdpc3Rlckxpc3RlbmVyKGNvbW1vbl9jbG9ja19saXN0ZW5lcl8pOwotICAgICAgICBjb21tb25fY2xvY2tfbGlzdGVuZXJfID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgQ0NIZWxwZXI6OkNvbW1vbkNsb2NrTGlzdGVuZXI6Om9uVGltZWxpbmVDaGFuZ2VkKHVpbnQ2NF90IC8qdGltZWxpbmVJRCovKSB7Ci0gICAgLy8gZG8gbm90aGluZzsgbGlzdGVuZXIgaXMgb25seSByZWFsbHkgdXNlZCBhcyBhIHRva2VuIHNvIHRoZSBzZXJ2ZXIgY2FuCi0gICAgLy8gZmluZCBvdXQgd2hlbiBjbGllbnRzIGRpZS4KLX0KLQotLy8gSGVscGVyIG1ldGhvZHMgd2hpY2ggYXR0ZW1wdHMgdG8gbWFrZSBjYWxscyB0byB0aGUgY29tbW9uIHRpbWUgYmluZGVyCi0vLyBzZXJ2aWNlLiAgSWYgdGhlIGZpcnN0IGF0dGVtcHQgZmFpbHMgd2l0aCBERUFEX09CSkVDVCwgdGhlIGhlbHBlcnMgd2lsbAotLy8gYXR0ZW1wdCB0byBtYWtlIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmljZSBhZ2FpbiAoYXNzdW1pbmcgdGhhdCB0aGUgcHJvY2VzcwotLy8gaG9zdGluZyB0aGUgc2VydmljZSBoYWQgY3Jhc2hlZCBhbmQgdGhlIGNsaWVudCBwcm94eSB3ZSBhcmUgaG9sZGluZyBpcyBkZWFkKQotLy8gSWYgdGhlIHNlY29uZCBhdHRlbXB0IGZhaWxzLCBvciBubyBjb25uZWN0aW9uIGNhbiBiZSBtYWRlLCB0aGUgd2UgbGV0IHRoZQotLy8gZXJyb3IgcHJvcGFnYXRlIHVwIHRoZSBzdGFjayBhbmQgbGV0IHRoZSBjYWxsZXIgZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gYXMKLS8vIGJlc3QgdGhleSBjYW4uCi0jZGVmaW5lIENDSEVMUEVSX01FVEhPRChkZWNsLCBjYWxsKSAgICAgICAgICAgICAgICAgXAotICAgIHN0YXR1c190IENDSGVscGVyOjpkZWNsIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJmxvY2tfKTsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIXZlcmlmeUNsb2NrX2woKSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tb25fY2xvY2tfLT5jYWxsOyAgICAgIFwKLSAgICAgICAgaWYgKERFQURfT0JKRUNUID09IHN0YXR1cykgeyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZiAoIXZlcmlmeUNsb2NrX2woKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbl9jbG9ja18tPmNhbGw7ICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jZGVmaW5lIFZFUklGWV9DTE9DSygpCi0KLUNDSEVMUEVSX01FVEhPRChpc0NvbW1vblRpbWVWYWxpZChib29sKiB2YWxpZCwgdWludDMyX3QqIHRpbWVsaW5lSUQpLAotICAgICAgICAgICAgICAgIGlzQ29tbW9uVGltZVZhbGlkKHZhbGlkLCB0aW1lbGluZUlEKSkKLUNDSEVMUEVSX01FVEhPRChjb21tb25UaW1lVG9Mb2NhbFRpbWUoaW50NjRfdCBjb21tb25UaW1lLCBpbnQ2NF90KiBsb2NhbFRpbWUpLAotICAgICAgICAgICAgICAgIGNvbW1vblRpbWVUb0xvY2FsVGltZShjb21tb25UaW1lLCBsb2NhbFRpbWUpKQotQ0NIRUxQRVJfTUVUSE9EKGxvY2FsVGltZVRvQ29tbW9uVGltZShpbnQ2NF90IGxvY2FsVGltZSwgaW50NjRfdCogY29tbW9uVGltZSksCi0gICAgICAgICAgICAgICAgbG9jYWxUaW1lVG9Db21tb25UaW1lKGxvY2FsVGltZSwgY29tbW9uVGltZSkpCi1DQ0hFTFBFUl9NRVRIT0QoZ2V0Q29tbW9uVGltZShpbnQ2NF90KiBjb21tb25UaW1lKSwKLSAgICAgICAgICAgICAgICBnZXRDb21tb25UaW1lKGNvbW1vblRpbWUpKQotQ0NIRUxQRVJfTUVUSE9EKGdldENvbW1vbkZyZXEodWludDY0X3QqIGZyZXEpLAotICAgICAgICAgICAgICAgIGdldENvbW1vbkZyZXEoZnJlcSkpCi1DQ0hFTFBFUl9NRVRIT0QoZ2V0TG9jYWxUaW1lKGludDY0X3QqIGxvY2FsVGltZSksCi0gICAgICAgICAgICAgICAgZ2V0TG9jYWxUaW1lKGxvY2FsVGltZSkpCi1DQ0hFTFBFUl9NRVRIT0QoZ2V0TG9jYWxGcmVxKHVpbnQ2NF90KiBmcmVxKSwKLSAgICAgICAgICAgICAgICBnZXRMb2NhbEZyZXEoZnJlcSkpCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5jcHAgYi9tZWRpYS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzYxZmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29tbW9uX3RpbWUvbG9jYWxfY2xvY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiY29tbW9uX3RpbWUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGNvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9sb2NhbF90aW1lX2hhbC5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NdXRleCBMb2NhbENsb2NrOjpkZXZfbG9ja187Ci1sb2NhbF90aW1lX2h3X2RldmljZV90KiBMb2NhbENsb2NrOjpkZXZfID0gTlVMTDsKLQotTG9jYWxDbG9jazo6TG9jYWxDbG9jaygpIHsKLSAgICBpbnQgcmVzOwotICAgIGNvbnN0IGh3X21vZHVsZV90KiBtb2Q7Ci0KLSAgICBBdXRvTXV0ZXggbG9jaygmZGV2X2xvY2tfKTsKLQotICAgIGlmIChkZXZfICE9IE5VTEwpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJlcyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoTE9DQUxfVElNRV9IQVJEV0FSRV9NT0RVTEVfSUQsIE5VTEwsICZtb2QpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGxvY2FsIHRpbWUgSEFMIG1vZHVsZSAocmVzID0gJWQpIiwgcmVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBsb2NhbF90aW1lX2h3X2RldmljZV9vcGVuKG1vZCwgJmRldl8pOwotICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gbG9jYWwgdGltZSBIQUwgZGV2aWNlIChyZXMgPSAlZCkiLCByZXMpOwotICAgICAgICAgICAgZGV2XyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJvb2wgTG9jYWxDbG9jazo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiAoTlVMTCAhPSBkZXZfKTsKLX0KLQotaW50NjRfdCBMb2NhbENsb2NrOjpnZXRMb2NhbFRpbWUoKSB7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xyk7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xy0+Z2V0X2xvY2FsX3RpbWUpOwotCi0gICAgcmV0dXJuIGRldl8tPmdldF9sb2NhbF90aW1lKGRldl8pOwotfQotCi11aW50NjRfdCBMb2NhbENsb2NrOjpnZXRMb2NhbEZyZXEoKSB7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xyk7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xy0+Z2V0X2xvY2FsX2ZyZXEpOwotCi0gICAgcmV0dXJuIGRldl8tPmdldF9sb2NhbF9mcmVxKGRldl8pOwotfQotCi1zdGF0dXNfdCBMb2NhbENsb2NrOjpzZXRMb2NhbFNsZXcoaW50MTZfdCByYXRlKSB7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xyk7Ci0KLSAgICBpZiAoIWRldl8tPnNldF9sb2NhbF9zbGV3KQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGRldl8tPnNldF9sb2NhbF9zbGV3KGRldl8sIHJhdGUpKTsKLX0KLQotaW50MzJfdCBMb2NhbENsb2NrOjpnZXREZWJ1Z0xvZyhzdHJ1Y3QgbG9jYWxfdGltZV9kZWJ1Z19ldmVudCogcmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9yZWNvcmRzKSB7Ci0gICAgYXNzZXJ0KE5VTEwgIT0gZGV2Xyk7Ci0KLSAgICBpZiAoIWRldl8tPmdldF9kZWJ1Z19sb2cpCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIHJldHVybiBkZXZfLT5nZXRfZGVidWdfbG9nKGRldl8sIHJlY29yZHMsIG1heF9yZWNvcmRzKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcCBiL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjZjJmZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb21tb25fdGltZS91dGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWJvb2wgY2FuU2VyaWFsaXplU29ja2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICBzd2l0Y2ggKGFkZHItPnNzX2ZhbWlseSkgewotICAgICAgICBjYXNlIEFGX0lORVQ6Ci0gICAgICAgIGNhc2UgQUZfSU5FVDY6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgc2VyaWFsaXplU29ja2FkZHIoUGFyY2VsKiBwLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcikgewotICAgIHN3aXRjaCAoYWRkci0+c3NfZmFtaWx5KSB7Ci0gICAgICAgIGNhc2UgQUZfSU5FVDogewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbio+KGFkZHIpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihBRl9JTkVUKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIobnRvaGwocy0+c2luX2FkZHIuc19hZGRyKSk7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG50b2hzKHMtPnNpbl9wb3J0KSkpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQUZfSU5FVDY6IHsKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHMgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KGFkZHIpOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCogYSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4ocy0+c2luNl9hZGRyLnM2X2FkZHIpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihBRl9JTkVUNik7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKG50b2hsKGFbMF0pKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIobnRvaGwoYVsxXSkpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihudG9obChhWzJdKSk7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKG50b2hsKGFbM10pKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obnRvaHMocy0+c2luNl9wb3J0KSkpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihudG9obChzLT5zaW42X2Zsb3dpbmZvKSk7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKG50b2hsKHMtPnNpbjZfc2NvcGVfaWQpKTsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgZGVzZXJpYWxpemVTb2NrYWRkcihjb25zdCBQYXJjZWwqIHAsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKSB7Ci0gICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZigqYWRkcikpOwotCi0gICAgYWRkci0+c3NfZmFtaWx5ID0gcC0+cmVhZEludDMyKCk7Ci0gICAgc3dpdGNoKGFkZHItPnNzX2ZhbWlseSkgewotICAgICAgICBjYXNlIEFGX0lORVQ6IHsKLSAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiogcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHJfaW4qPihhZGRyKTsKLSAgICAgICAgICAgIHMtPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKHAtPnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHMtPnNpbl9wb3J0ID0gaHRvbnMoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHAtPnJlYWRJbnQzMigpKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBRl9JTkVUNjogewotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiogcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oYWRkcik7Ci0gICAgICAgICAgICBpbnQzMl90KiBhID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ocy0+c2luNl9hZGRyLnM2X2FkZHIpOwotCi0gICAgICAgICAgICBhWzBdID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICAgICAgYVsxXSA9IGh0b25sKHAtPnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGFbMl0gPSBodG9ubChwLT5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhWzNdID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICAgICAgcy0+c2luNl9wb3J0ID0gaHRvbnMoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHAtPnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICBzLT5zaW42X2Zsb3dpbmZvID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICAgICAgcy0+c2luNl9zY29wZV9pZCA9IGh0b25sKHAtPnJlYWRJbnQzMigpKTsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS91dGlscy5oIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3OWQwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb21tb25fdGltZS91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9MSUJDT01NT05DTE9DS19VVElMU19ICi0jZGVmaW5lIEFORFJPSURfTElCQ09NTU9OQ0xPQ0tfVVRJTFNfSAotCi0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZXh0ZXJuIGJvb2wgY2FuU2VyaWFsaXplU29ja2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpOwotZXh0ZXJuIHZvaWQgc2VyaWFsaXplU29ja2FkZHIoUGFyY2VsKiBwLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcik7Ci1leHRlcm4gc3RhdHVzX3QgZGVzZXJpYWxpemVTb2NrYWRkcihjb25zdCBQYXJjZWwqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcik7Ci0KLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTElCQ09NTU9OQ0xPQ0tfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3NmNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAiKiIsCi1dCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li41ZDAwZDk0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsOCArMTMwLDkgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1NZXRhKG51bGxwdHIpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgewogCkBAIC0xNTEsNyArMTQ5LDkgQEAKICAgICB9CiAgICAgY2hhbm5lbCA9IChoZWFkZXJbMF0gJiAweDEpIDw8IDIgfCAoaGVhZGVyWzFdID4+IDYpOwogCisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKG1NZXRhLCBwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCBwcm9maWxlICsgMSk7CiAKICAgICBvZmY2NF90IHN0cmVhbVNpemUsIG51bUZyYW1lcyA9IDA7CiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CkBAIC0xNzQsMjkgKzE3NCwzMiBAQAogICAgICAgICAvLyBSb3VuZCB1cCBhbmQgZ2V0IHRoZSBkdXJhdGlvbgogICAgICAgICBtRnJhbWVEdXJhdGlvblVzID0gKDEwMjQgKiAxMDAwMDAwbGwgKyAoc3IgLSAxKSkgLyBzcjsKICAgICAgICAgZHVyYXRpb24gPSBudW1GcmFtZXMgKiBtRnJhbWVEdXJhdGlvblVzOwotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbik7CiAgICAgfQogCiAgICAgbUluaXRDaGVjayA9IE9LOwogfQogCiBBQUNFeHRyYWN0b3I6On5BQUNFeHRyYWN0b3IoKSB7CisgICAgaWYgKG1NZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgfQogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IEFBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqQUFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMDQsMTMgKzIwNywxMiBAQAogICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjE5LDggKzIyMSw4IEBACiBjb25zdCBzaXplX3QgQUFDU291cmNlOjprTWF4RnJhbWVTaXplID0gODE5MjsKIAogQUFDU291cmNlOjpBQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLApAQCAtMjI4LDcgKzIzMCw2IEBACiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAogICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgewogfQpAQCAtMjM5LDcgKzI0MCw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpAQCAtMjQ5LDMwICsyNTAsMjUgQEAKICAgICB9CiAKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoa01heEZyYW1lU2l6ZSk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjgyLDcgKzI3OCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBtRnJhbWVEdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHNlZWtGcmFtZSA8IDAgfHwgc2Vla0ZyYW1lID49IChpbnQ2NF90KW1PZmZzZXRWZWN0b3Iuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDIzOTUwNyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIG1GcmFtZUR1cmF0aW9uVXM7CiAKQEAgLTI5MiwxMyArMjg4LDEzIEBACiAKICAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOwogICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBmcmFtZVNpemVXaXRob3V0SGVhZGVyID0gZnJhbWVTaXplIC0gaGVhZGVyU2l6ZTsKQEAgLTMwNywzNyArMzAzLDM5IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gbUZyYW1lRHVyYXRpb25VczsKIAogICAgICpvdXQgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAqc3RhdGljX2Nhc3Q8b2ZmNjRfdCo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgQUFDRXh0cmFjdG9yKHNvdXJjZSwgb2Zmc2V0KTsKKyAgICByZXR1cm4gd3JhcChuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksIG9mZnNldCkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKIAorICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgZm9yICg7OykgewogICAgICAgICB1aW50OF90IGlkM2hlYWRlclsxMF07Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCisgICAgICAgIGlmIChoZWxwZXIucmVhZEF0KHBvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMzY0LDcgKzM2Miw3IEBACiAKICAgICB1aW50OF90IGhlYWRlclsyXTsKIAotICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0zODMsMTcgKzM4MSwyMSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJhYWMiLAorICAgIE5VTEwKK307CiAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjRmZDgwZWFlLTAzZDItNGQ3Mi05ZWI5LTQ4ZmE2YmI1NDYxMyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJBQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAppbmRleCA5ZGFkYmVkLi42NDNkM2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOSBAQAogCiAjZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+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+IG1JdGVtSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggMDg3M2M1Zi4uZDNjYjY2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMjQsMjggKzI0LDMxIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKICNpbmNsdWRlICJNUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCiAjaW5jbHVkZSAiSXRlbVRhYmxlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KQEAgLTU1LDYgKzU4LDggQEAKICNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAoNDI5NDk2NzI5NVUpCiAjZW5kaWYKIAorI2RlZmluZSBBTEFDX1NQRUNJRklDX0lORk9fU0laRSAoMzYpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CkBAIC02NiwzNSArNzEsMzggQEAKICAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAogfTsKIAotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKK3N0YXRpYyBjb25zdCBzaXplX3QgIGtNYXhQY21GcmFtZVNpemUgPSA4MTkyOwogcHVibGljOgogICAgIC8vIENhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiBib3RoICJkYXRhU291cmNlIiBhbmQgInNhbXBsZVRhYmxlIi4KLSAgICBNUEVHNFNvdXJjZShNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICBNUEVHNFNvdXJjZShBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpOworICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSwKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBlbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZyYWdtZW50ZWRSZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGZyYWdtZW50ZWRSZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIH5NUEVHNFNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgTWV0YURhdGFCYXNlICZtRm9ybWF0OwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgaW50MzJfdCBtVGltZXNjYWxlOwogICAgIHNwPFNhbXBsZVRhYmxlPiBtU2FtcGxlVGFibGU7CiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTEwNCw3ICsxMTIsNyBAQAogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKLSAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7CisgICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOyAvLyBpbiBtZWRpYSB0aW1lc2NhbGUgdGlja3MKICAgICBpbnQzMl90IG1MYXN0UGFyc2VkVHJhY2tJZDsKICAgICBpbnQzMl90IG1UcmFja0lkOwogCkBAIC0xMjUsMjIgKzEzMywyNSBAQAogCiAgICAgYm9vbCBtSXNBVkM7CiAgICAgYm9vbCBtSXNIRVZDOworICAgIGJvb2wgbUlzQUM0OworICAgIGJvb2wgbUlzUGNtOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWZmZXI7Ci0KLSAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbUJ1ZmZlcjsKIAogICAgIHNpemVfdCBtU3JjQnVmZmVyU2l6ZTsKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCiAgICAgYm9vbCBtSXNIZWlmOworICAgIGJvb2wgbUlzQXVkaW87CiAgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOwogCisgICAgLy8gU3RhcnQgb2Zmc2V0IGZyb20gY29tcG9zaXRpb24gdGltZSB0byBwcmVzZW50YXRpb24gdGltZS4KKyAgICAvLyBTdXBwb3J0IHNoaWZ0IG9ubHkgZm9yIHZpZGVvIHRyYWNrcyB0aHJvdWdoIG1FbHN0U2hpZnRTdGFydFRpY2tzIGZvciBub3cuCisgICAgdWludDY0X3QgbUVsc3RTaGlmdFN0YXJ0VGlja3M7CisKICAgICBzaXplX3QgcGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0OwogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKICAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CkBAIC0xNDksNiArMTYwLDggQEAKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncyk7CiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVFbmNyeXB0aW9uKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICAvLyByZXR1cm5zIC0xIGZvciBpbnZhbGlkIGxheWVyIElECisgICAgaW50MzJfdCBwYXJzZUhFVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtMTk0LDE0ICsyMDcsMTQgQEAKIC8vIHBvc3NpYmx5IHdyYXBwaW5nIG11bHRpcGxlIHRpbWVzIHRvIGNvdmVyIGFsbCB0cmFja3MsIGkuZS4KIC8vIEVhY2ggQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSBjYWNoZXMgdGhlIHNhbXBsZXRhYmxlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB0cmFjay4KIAotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgewotICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitjbGFzcyBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKICAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBmbGFncygpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CiAKQEAgLTIwOSw3ICsyMjIsNyBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgYm9vbCBtT3duc0RhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKQEAgLTIyMSw4ICsyMzQsOSBAQAogICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDYWNoZWRSYW5nZWREYXRhU291cmNlICYpOwogfTsKIAotQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCisgICAgOiBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAogICAgICAgbUNhY2hlZE9mZnNldCgwKSwKICAgICAgIG1DYWNoZWRTaXplKDApLApAQCAtMjMyLDcgKzI0Niw3IEBACiBDYWNoZWRSYW5nZWREYXRhU291cmNlOjp+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpIHsKICAgICBjbGVhckNhY2hlKCk7CiAgICAgaWYgKG1Pd25zRGF0YVNvdXJjZSkgewotICAgICAgICBkZWxldGUgKENhY2hlZFJhbmdlZERhdGFTb3VyY2UqKW1Tb3VyY2U7CisgICAgICAgIGRlbGV0ZSBtU291cmNlOwogICAgIH0KIH0KIApAQCAtMjQ2LDEwICsyNjAsNiBAQAogICAgIG1DYWNoZWRTaXplID0gMDsKIH0KIAotc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQogc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMzAyLDI5ICszMTIsNDkgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJDQzJNSU1FKHVpbnQzMl90IGZvdXJjYykgewogICAgIHN3aXRjaCAoZm91cmNjKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcDRhIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYW1yIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYXdiIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJlYy0zIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKKworICAgICAgICBjYXNlIEZPVVJDQygibXA0diIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzMjYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJoMjYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJIMjYzIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIAotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXZjMSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygiaHZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaGV2MSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OworICAgICAgICBjYXNlIEZPVVJDQygiT3B1cyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgIGNhc2UgRk9VUkNDKCJhbGFjIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImZMYUMiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDOworICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGZvdXJjYzogJWMlYyVjJWMiLAogICAgICAgICAgICAgICAgICAgIChmb3VyY2MgPj4gMjQpICYgMHhmZiwKQEAgLTM1MSwxMiArMzgxLDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1NUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKK01QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCiAgICAgOiBtTW9vZk9mZnNldCgwKSwKICAgICAgIG1Nb29mRm91bmQoZmFsc2UpLAogICAgICAgbU1kYXRGb3VuZChmYWxzZSksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUNhY2hlZFNvdXJjZShOVUxMKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAogICAgICAgbUlzUVQoZmFsc2UpLApAQCAtMzY2LDYgKzM5NSw3IEBACiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCkgewogICAgIEFMT0dWKCJtaW1lPSVzLCBtUHJlZmVySGVpZj0lZCIsIG1pbWUsIG1QcmVmZXJIZWlmKTsKKyAgICBtRmlsZU1ldGFEYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewpAQCAtMzgzLDcgKzQxMyw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMzkyLDEzICs0MjMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDE5LDE4ICs0NTAsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00MzgsMTYgKzQ2OSwxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCisgICAgICAgICAgICAvLyBFbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA+IElOVDY0X01BWCkgewpAQCAtNDU1LDY1ICs0ODgsODQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbiA9IHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb247CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWUgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOwotICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKLSAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2R1cmF0aW9uID0gJSIgUFJJZDY0ICIsIG1lZGlhX3RpbWUgPSAlIiBQUklkNjQKLSAgICAgICAgICAgICAgICAgICIsIGhhbGZzY2FsZSA9ICUiIFBSSWQ2NCAiLCB0aW1lc2NhbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBzZWdtZW50X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgbWVkaWFfdGltZSwKLSAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwKLSAgICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSB0cmFjay0+dGltZXNjYWxlIC8gMjsKIAotICAgICAgICAgICAgaW50NjRfdCBkZWxheTsKLSAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIHNhbXBsZXJhdGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSBtSGVhZGVyVGltZXNjYWxlLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiBJTlQzMl9NQVggfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBBTE9HVigic2VnbWVudF9kdXJhdGlvbiA9ICUiIFBSSWQ2NCAiLCBtZWRpYV90aW1lID0gJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAiLCBoYWxmc2NhbGUgPSAlIiBQUklkNjQgIiwgbWRoZF90aW1lc2NhbGUgPSAlZCwgdHJhY2tfdGltZXNjYWxlID0gJXUiLAorICAgICAgICAgICAgICAgICAgc2VnbWVudF9kdXJhdGlvbiwgbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwgbUhlYWRlclRpbWVzY2FsZSwgdHJhY2stPnRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICgodWludDMyX3Qpc2FtcGxlcmF0ZSAhPSB0cmFjay0+dGltZXNjYWxlKXsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQm90aCBkZWxheSBhbmQgcGFkZGluZ3NhbXBsZXMgaGF2ZSB0byBiZSBzZXQgaW5vcmRlciBmb3IgZWl0aGVyIHRvIGJlCisgICAgICAgICAgICAvLyBlZmZlY3RpdmUgaW4gdGhlIGxvd2VyIGxheWVycy4KKyAgICAgICAgICAgIGludDY0X3QgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1lZGlhX3RpbWUgPiAwKSB7IC8vIEdhcGxlc3MgcGxheWJhY2sKKyAgICAgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIHRyYWNrLT50aW1lc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gdHJhY2stPnRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA+IElOVDMyX01BWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoIGJvZ3VzIHZhbHVlcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOwogCi0gICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKLSAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gMDsKKyAgICAgICAgICAgIGlmIChzZWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2NhbGVkX2R1cmF0aW9uOworICAgICAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwogCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiArIG1lZGlhX3RpbWUpICogMTAwMDAwMCk7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCBtZWRpYV90aW1lLCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9lbmQsIDEwMDAwMDAsICZzZWdtZW50X2VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotCi0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQorICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbl9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkX2U2OworICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7CisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDApICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICgobWVkaWFfdGltZSAqIG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKS90cmFjay0+dGltZXNjYWxlKSApCisgICAgICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQorICAgICAgICAgICAgICAgIC8vIG1lZGlhX3RpbWUgaXMgYmFzZWQgb24gdGltZXNjYWxlIHRyYWNrIGhlYWRlci9tZWRpYSB0aW1lc2NhbGUKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCAxMDAwMDAwLCAmc2VnbWVudF9kdXJhdGlvbl9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZV9zY2FsZWQsIDEwMDAwMDAsICZtZWRpYV90aW1lX3NjYWxlZF9lNikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZWRpYV90aW1lX3NjYWxlZF9lNiAvPSB0cmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpCisgICAgICAgICAgICAgICAgICAgIHx8IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2NhbGVkX2R1cmF0aW9uLCBzZWdtZW50X2VuZCwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZW5kID0gJSIgUFJJZDY0ICIsIHBhZGRpbmcgPSAlIiBQUklkNjQsIHNlZ21lbnRfZW5kLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OIGlzKQorICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgotICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzOwotICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfZTY7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKLSAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhwYWRkaW5nLCBzYW1wbGVyYXRlLCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX21odCA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlX21odCAqIDEwMDAwMDApKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZV9taHQsIDEwMDAwMDAsICZoYWxmc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWRkaW5nc2FtcGxlcyAvPSB0aW1lc2NhbGVfZTYsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigicGFkZGluZ3NhbXBsZXMgPSAlIiBQUklkNjQsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZ3NhbXBsZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZ3NhbXBsZXMpOwogICAgICAgICB9CiAgICAgfSgpOwogCkBAIC01MjIsNyArNTc0LDcgQEAKICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAvLyBNUEVHMiB0cmFja3MgZG8gbm90IHByb3ZpZGUgQ1NELCBzbyByZWFkIHRoZSBzdHJlYW0gaGVhZGVyCiAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikpIHsKQEAgLTUzNSwzNiArNTg3LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBoZWFkZXJba01heFRyYWNrSGVhZGVyU2l6ZV07CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgc2l6ZSkgPT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGhlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIsIGhlYWRlciwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtTW9vZk9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCBkdXJhdGlvbiAvIDQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVUaW1lOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhID0gdHJhY2stPm1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIHRyYWNrLT5tZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNTk5LDEyICs2NTMsMTQgQEAKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKICAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiaGVpZiBpbWFnZSAldSBoYXMgbm8gbWV0YSEiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTYyMSw3ICs2NzcsNiBAQAogCiAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIEhFSUYgaW1hZ2UgdHJhY2sgJXUiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKLSAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjI5LDI2ICs2ODQsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOwotICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTY3Myw3ICs3MjgsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtNjk5LDIxICs3NTQsMjEgQEAKIAogc3RhdGljIGJvb2wgdW5kZXJNZXRhRGF0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCkgewogICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSA1Ci0gICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKLSAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKQotICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCi0gICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk7CisgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCJtb292IikKKyAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoInVkdGEiKQorICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygibWV0YSIpCisgICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCJpbHN0Iik7CiB9CiAKIHN0YXRpYyBib29sIHVuZGVyUVRNZXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoLCBpbnQzMl90IGRlcHRoKSB7CiAgICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDIKLSAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKLSAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKKyAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCJtb292IikKKyAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCJtZXRhIikKICAgICAgICAgICAgICYmIChkZXB0aCA9PSAyCiAgICAgICAgICAgICB8fCAoZGVwdGggPT0gMwotICAgICAgICAgICAgICAgICAgICAmJiAocGF0aFsyXSA9PSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKQotICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKQotICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhbMl0gPT0gRk9VUkNDKCJoZGxyIikKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCJpbHN0IikKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCJrZXlzIikpKSk7CiB9CiAKIC8vIEdpdmVuIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbiAxIDE5MDQsIHByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCkBAIC04MTcsNyArODcyLDcgQEAKICAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JykgJiYgY2h1bmtfZGF0YV9zaXplID4ga01heEF0b21TaXplKSB7CisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCJtZGF0IikgJiYgY2h1bmtfZGF0YV9zaXplID4ga01heEF0b21TaXplKSB7CiAgICAgICAgIGNoYXIgZXJyTXNnWzEwMF07CiAgICAgICAgIHNwcmludGYoZXJyTXNnLCAiJXMgYXRvbSBoYXMgc2l6ZSAlIiBQUklkNjQsIGNodW5rLCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICBBTE9HRSgiJXMgKGIvMjg2MTU0NDgpIiwgZXJyTXNnKTsKQEAgLTgyNSw4ICs4ODAsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnYycsICdwJywgJ3InLCAndCcpCi0gICAgICAgICAgICAmJiBjaHVua190eXBlICE9IEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpCisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCJjcHJ0IikKKyAgICAgICAgICAgICYmIGNodW5rX3R5cGUgIT0gRk9VUkNDKCJjb3ZyIikKICAgICAgICAgICAgICYmIG1QYXRoLnNpemUoKSA9PSA1ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKQEAgLTg0NSw0MCArOTAwLDQwIEBACiAgICAgfQogCiAgICAgc3dpdGNoKGNodW5rX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZicsICdyJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYycsICdoJywgJ2knKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3cnLCAnYScsICd2JywgJ2UnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1vb3YiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyYWsiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1kaWEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1pbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImRpbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0YmwiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm12ZXgiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1vb2YiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyYWYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1mcmEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInVkdGEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImlsc3QiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNpbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNjaGkiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVkdHMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIndhdmUiKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykgJiYgZGVwdGggIT0gMCkgeworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb292IikgJiYgZGVwdGggIT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJtb292OiBkZXB0aCAlZCIsIGRlcHRoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSAmJiBtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1vb3YiKSAmJiBtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImR1cGxpY2F0ZSBtb292Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykgJiYgIW1Nb29mRm91bmQpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vZiIpICYmICFtTW9vZkZvdW5kKSB7CiAgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgICAgIG1Nb29mRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gKm9mZnNldDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygic3RibCIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKQEAgLTg4OSw4ICs5NDQsOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRTb3VyY2UtPnNldENhY2hlZFJhbmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQsIGNodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSAhPSBOVUxMIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gbUNhY2hlZFNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTA0LDcgKzk1OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2wgaXNUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygidHJhayIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRlcHRoICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInRyYWs6IGRlcHRoICVkIiwgZGVwdGgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtOTEzLDcgKzk2OCw2IEBACiAKICAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIG5ldyB0cmFjayIpOwogICAgICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKLSAgICAgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bmV4dCA9IHRyYWNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05MjEsMTcgKzk3NSwzMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7CiAKLSAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBwYXNzIHVkYXRhIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIGlmIChtSXNRVCAmJiBzdG9wX29mZnNldCAtICpvZmZzZXQgPT0gNCAmJiBjaHVua190eXBlID09IEZPVVJDQygidWR0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHVkdGEgdGVybWluYXRlcyB3aXRoIHRlcm1pbmF0ZSBjb2RlIHgwMDAwMDAwMAorICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgMCB0ZXJtaW5hdG9yIGlzIG9wdGlvbmFsIGFuZCB3ZSBqdXN0IGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlcm1pbmF0ZV9jb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmdGVybWluYXRlX2NvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB0ZXJtaW5hdGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlRlcm1pbmFsIGNvZGUgZm9yIHVkdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgdWR0YSBUZXJtaW5hbCBjb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CkBAIC05NDgsOCArMTAxNSwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTk1OCw2ICsxMDI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKKwogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5za2lwVHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIHRoaXMgdHJhY2suLi4iKTsKICAgICAgICAgICAgICAgICAgICAgVHJhY2sgKmN1ciA9IG1GaXJzdFRyYWNrOwpAQCAtOTc4LDcgKzEwNDgsMjIgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBwbGFjZSB0aGluZ3Mgd2UgYnVpbHQgZWxzZXdoZXJlIGludG8gdGhlaXIgZmluYWwgbG9jYXRpb25zCisKKyAgICAgICAgICAgICAgICAvLyBwdXQgYWdncmVnYXRlZCB0eDNnIGRhdGEgaW50byB0aGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bVR4M2dGaWxsZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQdXR0aW5nICV6dSBieXRlcyBvZiB0eDNnIGRhdGEgaW50byBtZXRhIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1UeDNnQnVmZmVyLCBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgaXQgbm93IHRvIHJlZHVjZSBvdXIgZm9vdHByaW50CisgICAgICAgICAgICAgICAgICAgIGZyZWUobUxhc3RUcmFjay0+bVR4M2dCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb292IikpIHsKICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgpAQCAtOTg2LDcgKzEwNzEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygic2NobSIpOgogICAgICAgICB7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTEwMDEsMjMgKzEwODYsMjMgQEAKICAgICAgICAgICAgIHNjaGVtZV90eXBlID0gbnRvaGwoc2NoZW1lX3R5cGUpOwogICAgICAgICAgICAgaW50MzJfdCBtb2RlID0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZDsKICAgICAgICAgICAgIHN3aXRjaChzY2hlbWVfdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ2InLCAnYycsICcxJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImNiYzEiKToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrQ3J5cHRvTW9kZUFlc0NiYzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ2InLCAnYycsICdzJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImNiY3MiKToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrQ3J5cHRvTW9kZUFlc0NiYzsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZScsICduJywgJ2MnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygiY2VuYyIpOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ3RyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZScsICduJywgJ3MnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygiY2VucyIpOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ3RyOwogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbiA9IHRydWU7CkBAIC0xMDI1LDEzICsxMTEwLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKIAotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdsJywgJ3MnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiZWxzdCIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTEwNTIsNiArMTEzNyw3IEBACiAKICAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCisgICAgICAgICAgICAgICAgLy8gb3Igc3RhcnQgb2Zmc2V0CiAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9mZjY0X3QgZW50cmllc29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgODsKQEAgLTEwODYsNyArMTE3Miw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJmcm1hIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMTEwMSwxNyArMTE4NywzMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKICAgICAgICAgICAgIGlmIChBZGp1c3RDaGFubmVsc0FuZFJhdGUob3JpZ2luYWxfZm91cmNjLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSXNRVCAmJiBvcmlnaW5hbF9mb3VyY2MgPT0gRk9VUkNDKCJhbGFjIikpIHsKKyAgICAgICAgICAgICAgICBvZmY2NF90IHRtcE9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VBTEFDU2FtcGxlRW50cnkoJnRtcE9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFyc2VBTEFDU2FtcGxlRW50cnkgZXJyOiVkIExpbmU6JWQiLCBlcnIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9mZnNldCA9IHRtcE9mZnNldCArIDg7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnZScsICduJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRlbmMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMjAzLDIxICsxMzAzLDI4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgdG1wQWxnb3JpdGhtSWQ7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdG1wQWxnb3JpdGhtSWQpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZ0bXBBbGdvcml0aG1JZCkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgZGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgZGVmYXVsdElWU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZGVmYXVsdEtleUlkLCAxNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgZGVmYXVsdFNraXBCeXRlQmxvY2spOwogICAgICAgICAgICAgaWYgKGRlZmF1bHRDb25zdGFudEl2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAnZGNpdicsIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGRlZmF1bHRDb25zdGFudEl2LT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRraGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMjI5LDcgKzEzMzYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygidHJlZiIpOgogICAgICAgICB7CiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CkBAIC0xMjQ1LDcgKzEzNTIsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdoJywgJ20nLCAnYicpOgorICAgICAgICBjYXNlIEZPVVJDQygidGhtYiIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTEyNjIsNyArMTM2OSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJwc3NoIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMTI5OCw3ICsxNDA1LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1kaGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMzYxLDggKzE0NjgsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBkdXJhdGlvblVzID0gKChsb25nIGRvdWJsZSlkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW5ub3QgcmVwcmVzZW50ICVsbGQgKiAxMDAwMDAwIC8gJWxsZCBpbiA2NCBiaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZHVyYXRpb24sIChsb25nIGxvbmcpIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTM4OSwxMyArMTUwMSwxMiBAQAogICAgICAgICAgICAgbGFuZ19jb2RlWzJdID0gKGxhbmdbMV0gJiAweDFmKSArIDB4NjA7CiAgICAgICAgICAgICBsYW5nX2NvZGVbM10gPSAnXDAnOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nX2NvZGUpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzdHNkIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNDI0LDcgKzE1MzUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KQEAgLTE0NDcsNyArMTU1OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygibWV0dCIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTE0NjQsMjAgKzE1NzUsNjggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkpLCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBQcmlvciB0byBBUEkgMjksIHRoZSBtZXRhZGF0YSB0cmFjayB3YXMgbm90IGNvbXBsaWFudCB3aXRoIElTTy9JRUMKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyLTIwMTUuIFRoaXMgbGVkIHRvIHNvbWUgSVNPLWNvbXBsaWFudCBwYXJzZXJzIGZhaWxpbmcgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIG1ldGF0cmFjay4gQXMgb2YgQVBJIDI5IGFuZCBvbndhcmRzLCBhIGNoYW5nZSB3YXMgbWFkZSB0byBtZXRhZGF0YSB0cmFjayB0bworICAgICAgICAgICAgLy8gbWFrZSBpdCBjb21wbGlhbnQgd2l0aCB0aGUgc3RhbmRhcmQuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHdyaXRlIHRoZQorICAgICAgICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZyB0d2ljZS4gVGhpcyBhbGxvd3MgY29tcGxpYW50IHBhcnNlcnMgdG8KKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIG1pc3NpbmcgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBhbmQgY29udGVudF9lbmNvZGluZyBmaWVsZHMKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpcnN0IG1pbWVfdHlwZSBzdHJpbmcuIFRoZSBhY3R1YWwgbWltZV9mb3JtYXQgZmllbGQgd291bGQgdGhlbiBiZQorICAgICAgICAgICAgLy8gcmVhZCBjb3JyZWN0bHkgZnJvbSB0aGUgc2Vjb25kIHN0cmluZy4gVGhlIG5vbi1jb21wbGlhbnQgQW5kcm9pZCBmcmFtZXdvcmtzCisgICAgICAgICAgICAvLyBmcm9tIEFQSSAyOCBhbmQgZWFybGllciB3b3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG1pbWVfZm9ybWF0IGNvcnJlY3RseQorICAgICAgICAgICAgLy8gYXMgaXQgd291bGQgb25seSByZWFkIHRoZSBmaXJzdCBudWxsLXRlcm1pbmF0ZWQgbWltZV9mb3JtYXQgc3RyaW5nLiBUbyBlbmFibGUKKyAgICAgICAgICAgIC8vIHJlYWRpbmcgbWV0YWRhdGEgdHJhY2tzIGdlbmVyYXRlZCBmcm9tIGJvdGggdGhlIG5vbi1jb21wbGlhbnQgYW5kIGNvbXBsaWFudAorICAgICAgICAgICAgLy8gZm9ybWF0cywgYSBjaGVjayBuZWVkcyB0byBiZSBkb25lIHRvIHNlZSB3aGljaCBmb3JtYXQgaXMgdXNlZC4KKyAgICAgICAgICAgIGludCBudWxsX3BvcyA9IDA7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHIgPSBidWZmZXIuZ2V0KCk7CisgICAgICAgICAgICB3aGlsZSAobnVsbF9wb3MgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgaWYgKCooc3RyICsgbnVsbF9wb3MpID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICArK251bGxfcG9zOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobnVsbF9wb3MgPT0gY2h1bmtfZGF0YV9zaXplIC0gMSkgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG9tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFuZGFyZCBjb21wbGlhbnQgbWV0YWRhdGEgdHJhY2suCisgICAgICAgICAgICAgIFN0cmluZzggY29udGVudEVuY29kaW5nKChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSArIDgpKTsKKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSArIDggKyBjb250ZW50RW5jb2Rpbmcuc2l6ZSgpICsgMSksCisgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUgLSA4IC0gY29udGVudEVuY29kaW5nLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgorICAgICAgICBjYXNlIEZPVVJDQygibXA0YSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZW5jYSIpOgorICAgICAgICBjYXNlIEZPVVJDQygic2FtciIpOgorICAgICAgICBjYXNlIEZPVVJDQygic2F3YiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiT3B1cyIpOgorICAgICAgICBjYXNlIEZPVVJDQygidHdvcyIpOgorICAgICAgICBjYXNlIEZPVVJDQygic293dCIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYWxhYyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZkxhQyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgorICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykKLSAgICAgICAgICAgICAgICAgICAgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygndycsICdhJywgJ3YnLCAnZScpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIG1wNGEgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCisgICAgICAgICAgICBpZiAobUlzUVQgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygid2F2ZSIpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImFsYWMiKSkgeworICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldFRtcCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQUxBQ1NhbXBsZUVudHJ5KCZvZmZzZXRUbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFyc2VBTEFDU2FtcGxlRW50cnkgZXJyOiVkIExpbmU6JWQiLCBlcnIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGF0b21zIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgYWxsIGF0b21zIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbSIpOwogICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE1MDYsNyArMTY2NSw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKIAotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKKyAgICAgICAgICAgIGlmIChtSXNRVCkgewogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtMTUzOSwxNSArMTY5OCwxMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpKSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoImVuY2EiKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY2EsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBmcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKICAgICAgICAgICAgICAgICBBZGp1c3RDaGFubmVsc0FuZFJhdGUoY2h1bmtfdHlwZSwgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgc2FtcGxlX3NpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoInR3b3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4sIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIioqKiBjb2Rpbmc9JyVzJyAlZCBjaGFubmVscywgc2l6ZSAlZCwgcmF0ZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBjaHVuaywgbnVtX2NoYW5uZWxzLCBzYW1wbGVfc2l6ZSwgc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygiT3B1cyIpKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBvcHVzSW5mb1tBT1BVU19PUFVTSEVBRF9NQVhTSVpFXTsKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0luZm9TaXplID0gY2h1bmtfZGF0YV9zaXplIC0gc2l6ZW9mKGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBpZiAob3B1c0luZm9TaXplIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fAorICAgICAgICAgICAgICAgICAgICBvcHVzSW5mb1NpemUgPiBBT1BVU19PUFVTSEVBRF9NQVhTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFJlYWQgT3B1cyBIZWFkZXIKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBvcHVzSW5mbywgb3B1c0luZm9TaXplKSA8IG9wdXNJbmZvU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3B1c0hlYWRlciBtdXN0IHN0YXJ0IHdpdGggdGhpcyBtYWdpYyBzZXF1ZW5jZSwgb3ZlcndyaXRlIGZpcnN0IDggYnl0ZXMKKyAgICAgICAgICAgICAgICAvLyBodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcgorICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilvcHVzSW5mbywgIk9wdXNIZWFkIiwgOCk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uIHNoYWxsIGJlIDAgYXMgcGVyIG1wNCBPcHVzIFNwZWNpZmljIEJveAorICAgICAgICAgICAgICAgIC8vIChodHRwczovL29wdXMtY29kZWMub3JnL2RvY3Mvb3B1c19pbl9pc29ibWZmLmh0bWwjNC4zLjIpCisgICAgICAgICAgICAgICAgaWYgKG9wdXNJbmZvWzhdKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZvcmNlIHZlcnNpb24gdG8gMSBhcyBwZXIgT3B1c0hlYWQgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIC8vIChodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcikKKyAgICAgICAgICAgICAgICBvcHVzSW5mb1s4XSA9IDE7CisKKyAgICAgICAgICAgICAgICAvLyBSZWFkIE9wdXMgU3BlY2lmaWMgQm94IHZhbHVlcworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzT2Zmc2V0ID0gMTA7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcHJlX3NraXAgPSBVMTZfQVQoJm9wdXNJbmZvW29wdXNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IFUzMl9BVCgmb3B1c0luZm9bb3B1c09mZnNldCArIDJdKTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBvdXRfZ2FpbiA9IFUxNl9BVCgmb3B1c0luZm9bb3B1c09mZnNldCArIDZdKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgT3B1cyBTcGVjaWZpYyBCb3ggdmFsdWVzLiBQYXJzZU9wdXNIZWFkZXIgZXhwZWN0cworICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZXMgaW4gTEUsIGhvd2V2ZXIgTVA0IHN0b3JlcyB0aGVzZSB2YWx1ZXMgYXMgQkUKKyAgICAgICAgICAgICAgICAvLyBodHRwczovL29wdXMtY29kZWMub3JnL2RvY3Mvb3B1c19pbl9pc29ibWZmLmh0bWwjNC4zLjIKKyAgICAgICAgICAgICAgICBtZW1jcHkoJm9wdXNJbmZvW29wdXNPZmZzZXRdLCAmcHJlX3NraXAsIHNpemVvZihwcmVfc2tpcCkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmb3B1c0luZm9bb3B1c09mZnNldCArIDJdLCAmc2FtcGxlX3JhdGUsIHNpemVvZihzYW1wbGVfcmF0ZSkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmb3B1c0luZm9bb3B1c09mZnNldCArIDZdLCAmb3V0X2dhaW4sIHNpemVvZihvdXRfZ2FpbikpOworCisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NlZWtQcmVSb2xsTnMgPSA4MDAwMDAwMDsgIC8vIEZpeGVkIDgwIG1zZWMKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNvZGVjRGVsYXkgPSBwcmVfc2tpcCAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBvcHVzSW5mbywgb3B1c0luZm9TaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAma1NlZWtQcmVSb2xsTnMsIHNpemVvZihrU2Vla1ByZVJvbGxOcykpOworCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gb3B1c0luZm9TaXplOworICAgICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgqb2Zmc2V0LCBzdG9wX29mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImFsYWMiKSkgeworICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihidWZmZXIpOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VBTEFDU2FtcGxlRW50cnkoJmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwYXJzZUFMQUNTYW1wbGVFbnRyeSBlcnI6JWQgTGluZTolZCIsIGVyciwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImZMYUMiKSkgeworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20veGlwaC9mbGFjL2Jsb2IvbWFzdGVyL2RvYy9pc29mbGFjLnR4dAorICAgICAgICAgICAgICAgIC8vIDQgZm9yIG1pbWUsIDQgZm9yIGJsb2NrVHlwZSBhbmQgQmxvY2tMZW4sIDM0IGZvciBtZXRhZGF0YQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmxhY0luZm9bNCArIDQgKyAzNF07CisgICAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgZEZsYSwgdmVyc2lvbgorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihidWZmZXIpICsgMTI7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZsYWNPZmZzZXQgPSA0OworICAgICAgICAgICAgICAgIC8vIEFkZCBmbGFDIGhlYWRlciBtaW1lIHR5cGUgdG8gQ1NECisgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKWZsYWNJbmZvLCAiZkxhQyIsIDQpOworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGZsYWNJbmZvICsgZmxhY09mZnNldCwgc2l6ZW9mKGZsYWNJbmZvKSAtIGZsYWNPZmZzZXQpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXNpemVvZihmbGFjSW5mbykgLSBmbGFjT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGZsYWNJbmZvKSAtIGZsYWNPZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGZsYWNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsYWNJbmZvKSk7CisgICAgICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKCpvZmZzZXQsIHN0b3Bfb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwpAQCAtMTU2MiwxNCArMTgyMywxNSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAndicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygibXA0diIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZW5jdiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiczI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiSDI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaDI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaHZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaGV2MSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls3OF07CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKQEAgLTE1OTksMTIgKzE4NjEsMTMgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICd2JykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTYyMSw4ICsxODg0LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0Y28iKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImNvNjQiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xNjQxLDcgKzE5MDQsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzYyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xNjU5LDggKzE5MjIsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzeiIpOgorICAgICAgICBjYXNlIEZPVVJDQygic3R6MiIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTE2NzYsNiArMTkzOSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgYWRqdXN0UmF3RGVmYXVsdEZyYW1lU2l6ZSgpOworCiAgICAgICAgICAgICBzaXplX3QgbWF4X3NpemU7CiAgICAgICAgICAgICBlcnIgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4X3NpemUpOwogCkBAIC0xNjkyLDEyICsxOTU3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJtYXggc2FtcGxlIHNpemUgdG9vIGJpZzogJXp1IiwgbWF4X3NpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplICsgMTAgKiAyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUhlaWdodCwoaW50MzJfdCopICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIChpbnQzMl90Kikmd2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwoaW50MzJfdCopICZoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyB3aWR0aCBvciBoZWlnaHQsIGFzc3VtaW5nIHdvcnN0IGNhc2UgMTA4MHAiKTsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOTIwOwogICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxMDgwOwpAQCAtMTcxMiw3ICsxOTgwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF1ZGlvLCB1c2UgMTI4S0IKICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSAxMDI0ICogMTI4OwpAQCAtMTcyOSwyNiArMTk5NywyOCBAQAogICAgICAgICAgICAgICAgIC8vIEhBQ0s6IGFsbG93IDEwJSBvdmVyaGVhZAogICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgc2FtcGxlIHNpemUgZnJvbSB0cmFmIGF0b20gZm9yIGZyYWdtZW50ZWQgTVBFRzQuCiAgICAgICAgICAgICAgICAgbWF4X3NpemUgKz0gbWF4X3NpemUgLyAxMDsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGZyYW1lIHJhdGUuCiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICAgICAgICAgIHNpemVfdCBuU2FtcGxlcyA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5jb3VudFNhbXBsZXMoKTsKICAgICAgICAgICAgICAgICBpZiAoblNhbXBsZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAvIHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNzU2LDI4ICsyMDI2LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IChuU2FtcGxlcyAqIDEwMDAwMDBMTCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uVXMgPj4gMSkpIC8gZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldHRpbmcgZnJhbWUgY291bnQgJXp1IiwgblNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZUNvdW50LCBuU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsIG5TYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0dHMiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKKyAgICAgICAgICAgIGlmIChkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gIT0gRk9VUkNDKCJzdGJsIikpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNodW5rWzVdOworICAgICAgICAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbZGVwdGggLSAxXSwgY2h1bmspOworICAgICAgICAgICAgICAgIEFMT0dXKCJzdHRzJ3MgcGFyZW50IGJveCAoJXMpIGlzIG5vdCBzdGJsLCBza2lwIGl0LiIsIGNodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNzg5LDcgKzIwNjksNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygiY3R0cyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xODA3LDcgKzIwODcsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzcyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xODI2LDcgKzIxMDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gXHhBOXh5egotICAgICAgICBjYXNlIEZPVVJDQygweEE5LCAneCcsICd5JywgJ3onKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF4eXoiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xODcyLDExICsyMTUyLDExIEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04sICZidWZmZXJbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygiZXNkcyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTE4ODQsOSArMjE2NCwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzI1Nl07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplID4gKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gdG1wLmdldCgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KApAQCAtMTkwMiwxMSArMjE4MywxMSBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0YSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gZnJvbSB0aGUgRVNEUyBtdXN0IGJlIHJlbGllZCBvbiBmb3IgcHJvcGVyCiAgICAgICAgICAgICAgICAgLy8gc2V0dXAgb2Ygc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWwgY291bnQgZm9yIE1QRUc0IEF1ZGlvLgogICAgICAgICAgICAgICAgIC8vIFRoZSBnZW5lcmljIGhlYWRlciBhcHBlYXJzIHRvIG9ubHkgY29udGFpbiBnZW5lcmljCkBAIC0xOTIwLDIxICsyMjAxLDIyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0diIpKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpZGVvIGlzIE1QRUcyCiAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKCZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdiJywgJ3QnLCAncicsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJidHJ0Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKQEAgLTE5NTQsMTUgKzIyMzYsMTcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IG1heEJpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbOF0pOwogICAgICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2Y0MiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xOTgxLDEyICsyMjY1LDEyIEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJodmNDIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOwogCkBAIC0yMDAzLDE0ICsyMjg3LDM2IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgorICAgICAgICB7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICBjYXNlIEZPVVJDQygnZCcsICcyJywgJzYnLCAnMycpOgorICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoImQyNjMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgLyoKQEAgLTIwMzksMTIgKzIzNDUsMTMgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1ldGEiKToKICAgICAgICAgewogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwpAQCAtMjA4OCwxMyArMjM5NSwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWxvYyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWluZiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBycCIpOgorICAgICAgICBjYXNlIEZPVVJDQygicGl0bSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWRhdCIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXJlZiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBybyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUlzSGVpZikgewogICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKQEAgLTIxMTAsOSArMjQxNyw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtZWFuIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJuYW1lIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkYXRhIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjEyNyw3ICsyNDM0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm12aGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMTY3LDE5ICsyNDc0LDE5IEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CiAgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EQVRFLCBzLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnaCcsICdkJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtZWhkIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjIxNywxMyArMjUyNCwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygibWRhdCIpOgogICAgICAgICB7CiAgICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKIApAQCAtMjIzMSw3ICsyNTM5LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImhkbHIiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMjQ5LDE2ICsyNTU3LDE3IEBACiAgICAgICAgICAgICAvLyBGb3IgdGhlIDNHUFAgZmlsZSBmb3JtYXQsIHRoZSBoYW5kbGVyLXR5cGUgd2l0aGluIHRoZSAnaGRscicgYm94CiAgICAgICAgICAgICAvLyBzaGFsbCBiZSAndGV4dCcuIFdlIGFsc28gd2FudCB0byBzdXBwb3J0ICdzYnRsJyBoYW5kbGVyIHR5cGUKICAgICAgICAgICAgIC8vIGZvciBhIHByYWN0aWNhbCByZWFzb24gYXMgdmFyaW91cyBNUEVHNCBjb250YWluZXJzIHVzZSBpdC4KLSAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygndCcsICdlJywgJ3gnLCAndCcpIHx8IHR5cGUgPT0gRk9VUkNDKCdzJywgJ2InLCAndCcsICdsJykpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygidGV4dCIpIHx8IHR5cGUgPT0gRk9VUkNDKCJzYnRsIikpIHsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJrZXlzIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjI3MSw3ICsyNTgwLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyZXgiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMjkwLDUyICsyNTk5LDY1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0eDNnIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBsYWluIGFib3V0IHJpZGljdWxvdXMgY2h1bmtzCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGtNYXhBdG9tU2l6ZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyBjaHVua19zaXplXTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY29tcGxhaW4gYWJvdXQgZW1wdHkgYXRvbXMKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzEyNDMzMDIwNCIpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0MzMwMjA0Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAvLyBzaG91bGQgZmlsbCBidWZmZXIgYmFzZWQgb24gImRhdGFfb2Zmc2V0IiBhbmQgImNodW5rX2RhdGFfc2l6ZSIKKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgKm9mZnNldCBhbmQgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSd2ZSBiZWVuIGZlZWRpbmcgdGhlIGV4dHJhIGRhdGEgdG8gY29uc3VtZXJzIGZvciBtdWx0aXBsZSByZWxlYXNlcyBhbmQKKyAgICAgICAgICAgIC8vIGlmIHRob3NlIGFwcHMgYXJlIGNvbXBlbnNhdGluZyBmb3IgaXQsIHdlJ2QgYnJlYWsgdGhlbSB3aXRoIHN1Y2ggYSBjaGFuZ2UKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tVHgzZ1NpemUgLSBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgZ3Jvd3RoID0ga1R4M2dHcm93dGg7CisgICAgICAgICAgICAgICAgaWYgKGdyb3d0aCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3Jvd3RoID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWx0aG91Z2ggdGhpcyBkaXNhbGxvd3MgMiB0eDNnIGF0b21zIG9mIG5lYXJseSBrTWF4QXRvbVNpemUuLi4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQ2NF90KSBtTGFzdFRyYWNrLT5tVHgzZ1NpemUgKyBncm93dGggPiBrTWF4QXRvbVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMTI0MzMwMjA0IC0gdG9vIG11Y2ggc3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzMzAyMDQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCAqdXBkYXRlZCA9ICh1aW50OF90ICopcmVhbGxvYyhtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1UeDNnU2l6ZSArIGdyb3d0aCk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciA9IHVwZGF0ZWQ7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dTaXplICs9IGdyb3d0aDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzaXplX3QpKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyICsgc2l6ZSwgY2h1bmtfc2l6ZSkpCisgICAgICAgICAgICBpZiAoKHNpemVfdCkobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dCdWZmZXIgKyBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpKQogICAgICAgICAgICAgICAgICAgICA8IGNodW5rX3NpemUpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLQorICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dGaWxsZWQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImNvdnIiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMzU5LDE5ICsyNjgxLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAogICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJjb2xyIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBpbiBhIFZpc3VhbFNhbXBsZUVudHJ5IGJveCB1bmRlciB0aGUgU2FtcGxlIERlc2NyaXB0aW9uIEJveCAoJ3N0c2QnKQogICAgICAgICAgICAgLy8gaWdub3JlIG90aGVyd2lzZQotICAgICAgICAgICAgaWYgKGRlcHRoID49IDIgJiYgbVBhdGhbZGVwdGggLSAyXSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgeworICAgICAgICAgICAgaWYgKGRlcHRoID49IDIgJiYgbVBhdGhbZGVwdGggLSAyXSA9PSBGT1VSQ0MoInN0c2QiKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ29sb3JJbmZvKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTIzODEsMTIgKzI3MDMsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaScsICd0JywgJ2wnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndScsICd0JywgJ2gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRpdGwiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF1dGgiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFsYm0iKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInlycmMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMzk5LDcgKzI3MjEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgorICAgICAgICBjYXNlIEZPVVJDQygiSUQzMiIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTI0MTIsNyArMjczNCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCctJywgJy0nLCAnLScsICctJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCItLS0tIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uY2xlYXIoKTsKICAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuY2xlYXIoKTsKQEAgLTI0MjEsNyArMjc0Myw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2knLCAnZCcsICd4Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzaWR4Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlU2VnbWVudEluZGV4KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjQzMSwxMyArMjc1Myw0NiBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7IC8vIHN0b3AgcGFyc2luZyBhZnRlciBzaWR4CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnMycpOgorICAgICAgICBjYXNlIEZPVVJDQygiYWMtMyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTYW1wbGVFbnRyeShkYXRhX29mZnNldCk7CisgICAgICAgICAgICAvLyBieXBhc3MgYWMtMyBpZiBwYXJzZSBmYWlsCisgICAgICAgICAgICBpZiAocGFyc2VBQzNTcGVjaWZpY0JveChkYXRhX29mZnNldCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIHBhcnNlIGFjLTMiKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiZWMtMyIpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvLyBieXBhc3MgZWMtMyBpZiBwYXJzZSBmYWlsCisgICAgICAgICAgICBpZiAocGFyc2VFQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBlYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTQgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUM0U3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy00Iik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDggfHwgZGVwdGggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0yNDYyLDE2ICsyODE3LDE2IEBACiAgICAgICAgICAgICAgICAgYnJhbmRTZXQuaW5zZXJ0KGJyYW5kKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoInF0ICAiKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJykpID4gMAotICAgICAgICAgICAgICAgICAmJiBicmFuZFNldC5jb3VudChGT1VSQ0MoJ2gnLCAnZScsICdpJywgJ2MnKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygibWlmMSIpKSA+IDAKKyAgICAgICAgICAgICAgICAgJiYgYnJhbmRTZXQuY291bnQoRk9VUkNDKCJoZWljIikpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCBIRUlGIGltYWdlIik7CiAKICAgICAgICAgICAgICAgICAgICAgbUlzSGVpZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygnbScsICdpJywgJ2YnLCAnMScpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJykpOworICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoIm1pZjEiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygiaGVpYyIpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoIWJyYW5kU2V0LmVtcHR5KCkpIHsKQEAgLTI1MDgsMzYgKzI4NjMsMzMwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCkgeworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSkgewogICAgIC8vIHNraXAgMTYgYnl0ZXM6CiAgICAgLy8gICsgNi1ieXRlIHJlc2VydmVkLAogICAgIC8vICArIDItYnl0ZSBkYXRhIHJlZmVyZW5jZSBpbmRleCwKICAgICAvLyAgKyA4LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gMTY7Ci0gICAgdWludDE2X3QgY2hhbm5lbENvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZjaGFubmVsQ291bnQpKSB7CisgICAgKm9mZnNldCArPSAxNjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgY2hhbm5lbENvdW50KSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgY2hhbm5lbCBjb3VudCIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIDggYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIGNoYW5uZWxDb3VudCwKICAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlIHNpemUsCiAgICAgLy8gICsgNC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDg7Ci0gICAgdWludDE2X3Qgc2FtcGxlUmF0ZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmc2FtcGxlUmF0ZSkpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CisgICAgKm9mZnNldCArPSA4OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNigqb2Zmc2V0LCBzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0KICAgICAvLyBza2lwIDQgYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZVJhdGUsCiAgICAgLy8gICsgMi1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3gob2Zmc2V0LCBzYW1wbGVSYXRlKTsKKyAgICAqb2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveCgKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxDb3VudCwgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtBQzRNaW5pbXVtQm94U2l6ZSA9IDQgKyA0ICsgMzsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwgc2l6ZSA8IGtBQzRNaW5pbXVtQm94U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBibG9jazogY2Fubm90IHJlYWQgc3BlY2lmaWMgYm94IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoImRhYzQiKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkYWM0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIG9mZnNldCArPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplID0gMTE3NjsKKyAgICB1aW50OF90IGNodW5rW2tBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKKyAgICBzc2l6ZV90IGRzaVNpemUgPSBzaXplIC0gODsgLy8gc2l6ZSBvZiBib3ggLSBzaXplIGFuZCB0eXBlIGZpZWxkcworICAgIGlmIChkc2lTaXplID49IChzc2l6ZV90KWtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplIHx8CisgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgZHNpU2l6ZSkgIT0gZHNpU2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyArIHNpemUtYnl0ZSBwYXlsb2FkCisgICAgb2Zmc2V0ICs9IGRzaVNpemU7CisgICAgQUJpdFJlYWRlciBicihjaHVuaywgZHNpU2l6ZSk7CisgICAgQUM0RFNJUGFyc2VyIHBhcnNlcihicik7CisgICAgaWYgKCFwYXJzZXIucGFyc2UoKSl7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IHNwZWNpZmljIGJsb2NrIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gcHJlc2VudGF0aW9uczsKKyAgICAvLyB0cmFuc2xhdGUgdGhlIEFDNCBwcmVzZW50YXRpb24gaW5mb3JtYXRpb24gdG8gYXVkaW8gcHJlc2VudGF0aW9ucyBmb3IgdGhpcyB0cmFjaworICAgIEFDNERTSVBhcnNlcjo6QUM0UHJlc2VudGF0aW9ucyBhYzRQcmVzZW50YXRpb25zID0gcGFyc2VyLmdldFByZXNlbnRhdGlvbnMoKTsKKyAgICBpZiAoIWFjNFByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjNFByZXNlbnRhdGlvbiA6IGFjNFByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXNlbnRhdGlvbiA9IGFjNFByZXNlbnRhdGlvbi5zZWNvbmQ7CisgICAgICAgICAgICBpZiAoIXByZXNlbnRhdGlvbi5tRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIGFwLm1QcmVzZW50YXRpb25JZCA9IHByZXNlbnRhdGlvbi5tR3JvdXBJbmRleDsKKyAgICAgICAgICAgIGFwLm1Qcm9ncmFtSWQgPSBwcmVzZW50YXRpb24ubVByb2dyYW1JRDsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHByZXNlbnRhdGlvbi5tTGFuZ3VhZ2U7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uLm1QcmVWaXJ0dWFsaXplZCkgeworICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX0hFQURQSE9ORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb24ubUNoYW5uZWxNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV9Nb25vOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfU3RlcmVvOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1RFUkVPOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8zXzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNTI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9TVVJST1VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV85XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzIyXzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl8zRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtb2RlIGluIEFDNCBwcmVzZW50YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVmlzdWFsbHlJbXBhaXJlZCk7CisgICAgICAgICAgICBhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gKHByZXNlbnRhdGlvbi5tQ29udGVudENsYXNzaWZpZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtWb2ljZU92ZXIpOworICAgICAgICAgICAgYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBwcmVzZW50YXRpb24ubUhhc0RpYWxvZ0VuaGFuY2VtZW50czsKKyAgICAgICAgICAgIGlmICghYXAubUxhbmd1YWdlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoYXAubUxhbmd1YWdlLCBwcmVzZW50YXRpb24ubURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBDbGVhciBhdWRpbyBwcmVzZW50YXRpb24gaW5mbyBpbiBtZXRhZGF0YS4KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBudWxscHRyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0U3RyZWFtKHN0ZDo6aW9zOjpvdXQpOworICAgICAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMocHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywKKyAgICAgICAgICAgICAgICBvdXRTdHJlYW0uc3RyKCkuZGF0YSgpLCBvdXRTdHJlYW0uc3RyKCkuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplID0gMTE7CisgICAgLy8gMTMgKyAzICsgKDggKiAoMiArIDUgKyA1ICsgMyArIDEgKyAzICsgNCArICgxNCAqIDkgKyAxKSkpIGJpdHMgPT0gMTUyIGJ5dGVzIHRoZW9yZXRpY2FsIG1heAorICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWlyZWQgYml0cyByZWFkIGJlbG93IGFzIHdlbGwgYXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGVwZW5kZW50CisgICAgLy8gYW5kIGRlcGVuZGFudCBzdWIgc3RyZWFtcyB5b3UgY2FuIGhhdmUKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSA9IDE1MjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwKKyAgICAgICAgc2l6ZSA8IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplIHx8CisgICAgICAgIHNpemUgPiBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoImRlYzMiKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGVjMyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQ4X3QqIGNodW5rID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZV07CisgICAgaWYgKGNodW5rID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplKTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1bnNpZ25lZCBkYXRhX3JhdGUgPSBici5nZXRCaXRzKDEzKTsKKyAgICBBTE9HVigiRUFDMyBkYXRhIHJhdGUgPSAlZCIsIGRhdGFfcmF0ZSk7CisKKyAgICB1bnNpZ25lZCBudW1faW5kX3N1YiA9IGJyLmdldEJpdHMoMykgKyAxOworICAgIEFMT0dWKCJFQUMzIGluZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9pbmRfc3ViKTsKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IChudW1faW5kX3N1YiAqIDIzKSkgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1faW5kX3N1YjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGZzY29kID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgaWYgKGZzY29kID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIGlmIChib3hTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAorICAgICAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgIGlmIChic2lkID09IDkgfHwgYnNpZCA9PSAxMCkgeworICAgICAgICAgICAgQUxPR1coIkVBQzMgc3RyZWFtIChic2lkPSVkKSBtYXkgYmUgc2lsZW5jZWQgYnkgdGhlIGRlY29kZXIiLCBic2lkKTsKKyAgICAgICAgfSBlbHNlIGlmIChic2lkID4gMTYpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIHN0cmVhbSAoYnNpZD0lZCkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFVFNJIFRTIDEwMiAzNjYgdjEuNC4xIiwgYnNpZCk7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwCisgICAgICAgIGJyLnNraXBCaXRzKDIpOworICAgICAgICB1bnNpZ25lZCBic21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOworICAgICAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBzdHJlYW0KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiYnNtb2QgPSAlZCwgYWNtb2QgPSAlZCwgbGZlb24gPSAlZCIsIGJzbW9kLCBhY21vZCwgbGZlb24pOworCisgICAgICAgIGJyLnNraXBCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBudW1fZGVwX3N1YiA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIEFMT0dWKCJFQUMzIGRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1fZGVwX3N1Yik7CisgICAgICAgIGlmIChudW1fZGVwX3N1YiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNoYW5fbG9jX3RibFtdID0geyAiTGMvUmMiLCJMcnMvUnJzIiwiQ3MiLCJUcyIsIkxzZC9Sc2QiLAorICAgICAgICAgICAgICAgICJMdy9SdyIsIkx2aC9SdmgiLCJDdmgiLCJMZmUyIiB9OworICAgICAgICAgICAgdW5zaWduZWQgY2hhbl9sb2MgPSBici5nZXRCaXRzKDkpOworICAgICAgICAgICAgdW5zaWduZWQgbWFzayA9IDE7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgOTsgaisrLCBtYXNrIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKChjaGFuX2xvYyAmIG1hc2spICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYXJlIDIgY2hhbm5lbHMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDAgfHwgaiA9PSAxIHx8IGogPT0gNCB8fCBqID09IDUgfHwgaiA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAlcyIsIGNoYW5fbG9jX3RibFtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBici5za2lwQml0cygxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChici5udW1CaXRzTGVmdCgpICE9IDApIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgbWFzayA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKDB4MSA8PCBpKSAmJiBtYXNrKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvbXBsZXhpdHkgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgYSBKT0Mgc3RyZWFtIHdpdGggY29tcGxleGl0eSA9ICVkIiwgY29tcGxleGl0eSk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKworICAgIGRlbGV0ZVtdIGNodW5rOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICB1aW50MzJfdCBzaXplOwogICAgIC8vICsgNC1ieXRlIHNpemUKICAgICAvLyArIDQtYnl0ZSB0eXBlCkBAIC0yNTUwLDcgKzMxOTksNyBAQAogCiAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgdWludDMyX3QgdHlwZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnYScsICdjJywgJzMnKSkgeworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygiZGFjMyIpKSB7CiAgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRhYzMiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CkBAIC0yNTkyLDEyICszMjQxLDQ4IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUxBQ1NhbXBsZUVudHJ5KG9mZjY0X3QgKm9mZnNldCkgeworICAgIC8vIFNlZSAnZXh0ZXJuYWwvYWxhYy9BTEFDTWFnaWNDb29raWVEZXNjcmlwdGlvbi50eHQgZm9yIHRoZSBkZXRhaWwnLgorICAgIC8vIFN0b3JlIEFMQUMgbWFnaWMgY29va2llIChkZWNvZGVyIG5lZWRzIGl0KS4KKyAgICB1aW50OF90IGFsYWNJbmZvWzEyXTsKKyAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGFsYWNJbmZvLCBzaXplb2YoYWxhY0luZm8pKSA8IChzc2l6ZV90KXNpemVvZihhbGFjSW5mbykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplID0gVTMyX0FUKCZhbGFjSW5mb1swXSk7CisgICAgaWYgKChzaXplICE9IEFMQUNfU1BFQ0lGSUNfSU5GT19TSVpFKSB8fAorICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bNF0pICE9IEZPVVJDQygiYWxhYyIpKSB8fAorICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bOF0pICE9IDApKSB7CisgICAgICAgIEFMT0dWKCJTaXplOiV1LCBVMzJfQVQoJmFsYWNJbmZvWzRdKToldSwgVTMyX0FUKCZhbGFjSW5mb1s4XSk6JXUiLAorICAgICAgICAgICAgc2l6ZSwgVTMyX0FUKCZhbGFjSW5mb1s0XSksIFUzMl9BVCgmYWxhY0luZm9bOF0pKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGFsYWNJbmZvKTsKKyAgICB1aW50OF90IGNvb2tpZVtzaXplIC0gc2l6ZW9mKGFsYWNJbmZvKV07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBkYXRhX29mZnNldCwgY29va2llLCBzaXplb2YoY29va2llKSkgPCAoc3NpemVfdClzaXplb2YoY29va2llKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGJpdHNQZXJTYW1wbGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjb29raWVbOV0pOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgVTMyX0FUKCZjb29raWVbMjBdKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGNvb2tpZSk7CisgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjcxNyw4ICszNDAyLDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwotICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaWR4RHVyYXRpb24pOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0yNzU0LDcgKzM0NDAsNyBAQAogCiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQgKyA0LCAmdHlwZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IEZPVVJDQygnbScsICdkJywgJ3QnLCAnYScpKSB7CisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBGT1VSQ0MoIm1kdGEiKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCkBAIC0yNzk2LDcgKzM0ODIsNyBAQAogICAgIH0KICAgICB1aW50MzJfdCBhdG9tRm91ckNDOwogICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmYXRvbUZvdXJDQykKLSAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCJkYXRhIikpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgdWludDMyX3QgZGF0YVR5cGU7CkBAIC0yODE2LDcgKzM1MDIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC5jYXB0dXJlLmZwcyIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUsICooZmxvYXQgKikmdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gNjcgJiYgZGF0YVNpemUgPj0gNCkgewogICAgICAgICAvLyBCRSBzaWduZWQgaW50MzIKQEAgLTI4MjUsNyArMzUxMSw4IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLnZpZGVvLnRlbXBvcmFsX2xheWVyc19jb3VudCIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCwgdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCkBAIC0yODc5LDcgKzM1NjYsNyBAQAogICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsIGlkKTsKIAogICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7CiAgICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKQEAgLTI5MTUsMTUgKzM2MDIsMTUgQEAKICAgICB9CiAKICAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCByb3RhdGlvbkRlZ3JlZXMpOwogICAgIH0KIAogICAgIC8vIEhhbmRsZSBwcmVzZW50YXRpb24gZGlzcGxheSBzaXplLCB3aGljaCBjb3VsZCBiZSBkaWZmZXJlbnQKLSAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBrS2V5V2lkdGggYW5kIGtLZXlIZWlnaHQuCisgICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkgQU1FRElBRk9STUFUX0tFWV9XSURUSCBhbmQgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQuCiAgICAgdWludDMyX3Qgd2lkdGggPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTJdKTsKICAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTZdKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIHdpZHRoID4+IDE2KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBoZWlnaHQgPj4gMTYpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIHdpZHRoID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgaGVpZ2h0ID4+IDE2KTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTI5NTEsNjggKzM2MzgsNjQgQEAKIAogICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGJ1ZmZlcik7CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwogICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgIHN3aXRjaCAoKGludDMyX3QpbVBhdGhbNF0pIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2EnLCAnbCcsICdiJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxYWxiIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ0EnLCAnUicsICdUJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdBJywgJ1InLCAnVCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiYUFSVCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdkJywgJ2EnLCAneScpOgorICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWRheSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlZZWFyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAieWVhciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnbicsICdhJywgJ20nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFuYW0iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAndycsICdyJywgJ3QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF3cnQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJjb3ZyIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFnZW4iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdwJywgJ2knLCAnbCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiY3BpbCIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc2l6ZSA9PSA5ICYmIGZsYWdzID09IDIxKSB7CiAgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdrJywgJ24nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRya24iKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHNpemUgPT0gMTYgJiYgZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKQEAgLTMwMjAsMTEgKzM3MDMsMTEgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsVHJhY2tzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBUcmFjayksIG50b2hzKCpwVG90YWxUcmFja3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAncycsICdrJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXNrIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoc2l6ZSA9PSAxNCB8fCBzaXplID09IDE2KSAmJiBmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwpAQCAtMzAzMiwyMSArMzcxNSwyMSBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxEaXNjcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwRGlzYyksIG50b2hzKCpwVG90YWxEaXNjcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJy0nLCAnLScsICctJywgJy0nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi0tLS0iKToKICAgICAgICAgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKICAgICAgICAgICAgIHN3aXRjaCAobVBhdGhbNV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgorICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCJtZWFuIik6CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygibmFtZSIpOgogICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgNCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImRhdGEiKToKICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtMzA3Niw4ICszNzU5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMDkyLDEyICszNzc3LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgIHZvaWQgKnRtcERhdGE7CisgICAgc2l6ZV90IHRtcERhdGFTaXplOworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJgorICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpICYmCisgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgJnMpKSB7CisgICAgICAgIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiYWxidW1hcnQiKSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgOCwgc2l6ZSAtIDgpOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlHZW5yZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJnZW5yZSIpKSB7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQogICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0CkBAIC0zMTExLDE4ICszODAwLDE4IEBACiAgICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07CiAgICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIGdlbnJlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKICAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzE1MCwyMyArMzgzOSwzMyBAQAogICAgIH0KIAogICAgIGludDMyX3QgdHlwZSA9IFUzMl9BVCgmYnVmZmVyWzBdKTsKLSAgICBpZiAoKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykgJiYgc2l6ZSA+PSAxMSkKLSAgICAgICAgICAgIHx8ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAnYycpICYmIHNpemUgPj0gMTApKSB7Ci0gICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOwotCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotCisgICAgaWYgKCh0eXBlID09IEZPVVJDQygibmNseCIpICYmIHNpemUgPj0gMTEpCisgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoIm5jbGMiKSAmJiBzaXplID49IDEwKSkgewogICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIGludDMyX3QgZXhpc3RpbmdDb2xvcjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCAmZXhpc3RpbmdDb2xvcikpIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOworCisgICAgICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTkzLDQxICszODkyLDQxIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0aXRsIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdXRoIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgorICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJhbGJtIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChidWZmZXJbc2l6ZSAtIDFdICE9ICdcMCcpIHsKICAgICAgICAgICAgICAgY2hhciB0bXBbNF07CiAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCBidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ5cnJjIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzaXplIDwgNikgewogICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKQEAgLTMyNDIsNyArMzk0MSw3IEBACiAgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMyNTEsNyArMzk1MCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgaWYgKG1ldGFkYXRhS2V5KSB7CiAgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwpAQCAtMzI4NywxMSArMzk4NiwxMSBAQAogCiAgICAgICAgIGlmIChpc1VURjgpIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgogICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzA2LDI3ICs0MDA1LDI4IEBACiAKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVJUSVNULCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0dFTlJFLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgIlRDUCIsICJUQ01QIiB9LAogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzczsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgJnNzKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTMzNDIsNyArNDA0Miw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMzUxLDEzICs0MDUxLDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzM4MCw3ICs0MDc5LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzM5NiwxNiArNDA5NSwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzQxNiwxMCArNDExNCw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM0MzEsMTEgKzQxMjgsMjkgQEAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgYW5kICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgYW5kIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUgPiAwKSB7CisgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzIDolIiBQUkl1NjQsIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICB9CiAKICAgICBNUEVHNFNvdXJjZSAqc291cmNlID0gIG5ldyBNUEVHNFNvdXJjZSgKICAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgaXRlbVRhYmxlKTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSwKKyAgICAgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICBpZiAoc291cmNlLT5pbml0KCkgIT0gT0spIHsKICAgICAgICAgZGVsZXRlIHNvdXJjZTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDQ2LDI2ICs0MTYxLDI2IEBACiAvLyBzdGF0aWMKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVFU0RTKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMzU1MCwxNiArNDI2NSwxNCBAQAogICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gID09IDB4NmIpIHsKLSAgICAgICAgLy8gVGhlIG1lZGlhIHN1YnR5cGUgaXMgTVAzIGF1ZGlvCi0gICAgICAgIC8vIE91ciBzb2Z0d2FyZSBNUDMgYXVkaW8gZGVjb2RlciBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlCi0gICAgICAgIC8vIHBhY2tldGl6ZWQgTVAzIGF1ZGlvOyBmb3Igbm93LCBsZXRzIGp1c3QgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVECi0gICAgICAgIEFMT0dFKCJNUDMgdHJhY2sgaW4gTVA0LzNHUFAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2QiB8fCBvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweDY5KSB7CisgICAgICAgIC8vIG1wMyBhdWRpbworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKQEAgLTM1NjcsMTAgKzQyODAsMTIgQEAKICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CiAgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOwogICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzU5OCw2ICs0MzEzLDc3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4ZGQpIHsKKyAgICAgICAgLy8gdm9yYmlzIGF1ZGlvCisgICAgICAgIGlmIChjc2RbMF0gIT0gMHgwMikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvZGVjSW5mbyBzdGFydHMgd2l0aCB0d28gbGVuZ3RocywgbGVuMSBhbmQgbGVuMiwgdGhhdCBhcmUKKyAgICAgICAgLy8gIlhpcGgtc3R5bGUtbGFjaW5nIGVuY29kZWQiLi4KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICAgICAgc2l6ZV90IGxlbjEgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgY3NkX3NpemUgJiYgY3NkW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgMHhmZiwgJmxlbjEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPj0gY3NkX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgY3NkW29mZnNldF0sICZsZW4xKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICArK29mZnNldDsKKyAgICAgICAgaWYgKGxlbjEgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW4yID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGNzZF9zaXplICYmIGNzZFtvZmZzZXRdID09IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIDB4ZmYsICZsZW4yKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID49IGNzZF9zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIGNzZFtvZmZzZXRdLCAmbGVuMikpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAgIGlmIChsZW4yID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+PSBjc2Rfc2l6ZSB8fCBjc2Rbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY3NkW29mZnNldF0sIGxlbjEpOworCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMSwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwMykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMiwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwNSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNzZFtvZmZzZXRdLCBjc2Rfc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MApAQCAtMzYxNCw3ICs0NDAwLDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIC8va2VlcCBBT1QgdHlwZQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIG9iamVjdFR5cGUpOwogCiAgICAgdWludDMyX3QgZnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKIApAQCAtMzYzNSw3ICs0NDIxLDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwpAQCAtMzY1Miw3ICs0NDM4LDcgQEAKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KLSAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwogICAgIH0KIAogICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKQEAgLTM4MDUsMzkgKzQ1OTEsNTUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcHJldlNhbXBsZVJhdGUpKTsKIAogICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOwogCiAgICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwcmV2Q2hhbm5lbENvdW50KSk7CiAKICAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtQ2hhbm5lbHMpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1QRUc0RXh0cmFjdG9yOjphZGp1c3RSYXdEZWZhdWx0RnJhbWVTaXplKCkgeworICAgIGludDMyX3QgY2hhbkNvdW50ID0gMDsKKyAgICBpbnQzMl90IGJpdFdpZHRoID0gMDsKKyAgICBjb25zdCBjaGFyICptaW1lU3RyID0gTlVMTDsKKworICAgIGlmKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVN0cikgJiYKKyAgICAgICAgIXN0cmNhc2VjbXAobWltZVN0ciwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbkNvdW50KSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRXaWR0aCkpIHsKKyAgICAgICAgLy8gc2FtcGxlc2l6ZSBpbiBzdHN6IG1heSBub3QgcmlnaHQgLCBzbyB1cGRhZGUgZGVmYXVsdCBzYW1wbGVzaXplCisgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRQcmVkaWN0U2FtcGxlU2l6ZShjaGFuQ291bnQgKiBiaXRXaWR0aCAvIDgpOworICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSwKKyAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzg1OCw0NiArNDY2MCw1MSBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCisgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXJTaXplKDApLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKICAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAotICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKKyAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSwKKyAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzKGVsc3RTaGlmdFN0YXJ0VGlja3MpIHsKIAogICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CiAKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZtQ3J5cHRvTW9kZSk7CiAgICAgbURlZmF1bHRJVlNpemUgPSAwOwotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmbURlZmF1bHRJVlNpemUpOwotICAgIHVpbnQzMl90IGtleXR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqa2V5OworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCAmbURlZmF1bHRJVlNpemUpOworICAgIHZvaWQgKmtleTsKICAgICBzaXplX3Qga2V5c2l6ZTsKLSAgICBpZiAobUZvcm1hdC5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAma2V5dHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgJmtleSwgJmtleXNpemUpKSB7CiAgICAgICAgIENIRUNLKGtleXNpemUgPD0gMTYpOwogICAgICAgICBtZW1zZXQobUNyeXB0b0tleSwgMCwgMTYpOwogICAgICAgICBtZW1jcHkobUNyeXB0b0tleSwga2V5LCBrZXlzaXplKTsKICAgICB9CiAKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCAmbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCAmbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCAmbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCAmbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gbUZvcm1hdC5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogCiAgICAgbUlzQVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKICAgICBtSXNIRVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgfHwKICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBtSXNBQzQgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOwogCiAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpOwogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIApAQCAtMzkwNywxMCArNDcxNCw5IEBACiAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGxlbmd0aCBvZiBhIE5BTCB1bml0LgogICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CiAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBDSEVDSyhmb3JtYXQuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpOwogCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIApAQCAtMzkyMCwxNiArNDcyNiw2MCBAQAogICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzE0ICsgN10gJiAzKTsKICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBtSXNQY20gPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKworICAgIGlmIChtSXNQY20pIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDA7CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSA9IDA7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CisKKyAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKKyAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKKworICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkKKyAgICAgICAgICAgICAgIHx8IGJpdHNQZXJTYW1wbGUgIT0gMTYpIHsKKyAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgIG1Jc1BjbSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZtVHJhY2tJZCkpOwogCiB9CiAKIHN0YXR1c190IE1QRUc0U291cmNlOjppbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgIT0gMCkgewogICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgICAgIHJldHVybiBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgICAgICBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgICAgICBpZihlcnIgPT0gT0sgJiYgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KQorICAgICAgICAgICAgJiYgIW1DdXJyZW50U2FtcGxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG9mZnNldCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB0byBjb21wb3NpdGlvbiB0aW1lIG9mIGZpcnN0IHNhbXBsZS4KKyAgICAgICAgICAgIC8vIElTTyA6IHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldCwgdmVyc2lvbiAwICh1bnNpZ25lZCkgZm9yIG1ham9yIGJyYW5kcy4KKyAgICAgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzID0gc3RkOjptaW4obUVsc3RTaGlmdFN0YXJ0VGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCkoKm1DdXJyZW50U2FtcGxlcy5iZWdpbigpKS5jb21wb3NpdGlvbk9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgdWludDY0X3QgZmlyc3RTYW1wbGVDVFMgPSAwOworICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKDAsIE5VTEwsIE5VTEwsICZmaXJzdFNhbXBsZUNUUyk7CisgICAgICAgIC8vIFN0YXJ0IG9mZnNldCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB0byBjb21wb3NpdGlvbiB0aW1lIG9mIGZpcnN0IHNhbXBsZS4KKyAgICAgICAgLy8gQ29tcG9zaXRpb24gdGltZSBzdGFtcCBvZiBmaXJzdCBzYW1wbGUgY2Fubm90IGJlIG5lZ2F0aXZlLgorICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLCBmaXJzdFNhbXBsZUNUUyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogTVBFRzRTb3VyY2U6On5NUEVHNFNvdXJjZSgpIHsKQEAgLTM5NDAsMjEgKzQ3OTAsMTMgQEAKICAgICBmcmVlKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMpOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdGFydCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQotICAgICAgICAmJiB2YWwgIT0gMCkgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOwotICAgIH0KLQogICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZ0bXApKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJnRtcCkpOwogICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKIAogICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcwpAQCAtMzk2MiwzMyArNDgwNCwzMSBAQAogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgaWYgKG1heF9zaXplID09IDApIHsKICAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgLy8gQWxsb3cgdXAgdG8ga01heEJ1ZmZlcnMsIGJ1dCBub3QgaWYgdGhlIHRvdGFsIGV4Y2VlZHMga01heEJ1ZmZlclNpemUuCiAgICAgY29uc3Qgc2l6ZV90IGtJbml0aWFsQnVmZmVycyA9IDI7CiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJzID0gODsKICAgICBjb25zdCBzaXplX3QgcmVhbE1heEJ1ZmZlcnMgPSBtaW4oa01heEJ1ZmZlclNpemUgLyBtYXhfc2l6ZSwga01heEJ1ZmZlcnMpOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOwogICAgIG1TcmNCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFttYXhfc2l6ZV07CiAgICAgaWYgKG1TcmNCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBmaWxlIHByb2JhYmx5IHNwZWNpZmllZCBhIGJhZCBtYXggc2l6ZQotICAgICAgICBkZWxldGUgbUdyb3VwOwotICAgICAgICBtR3JvdXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgbVNyY0J1ZmZlclNpemUgPSBtYXhfc2l6ZTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CkBAIC00MDAyLDEzICs0ODQyLDEwIEBACiAgICAgZGVsZXRlW10gbVNyY0J1ZmZlcjsKICAgICBtU3JjQnVmZmVyID0gTlVMTDsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CkBAIC00MDQ0LDggKzQ4ODEsOCBAQAogCiAgICAgc3dpdGNoKGNodW5rX3R5cGUpIHsKIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0cmFmIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtb29mIik6IHsKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKQEAgLTQwNTQsNyArNDg5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vZiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gKm9mZnNldCBwb2ludHMgdG8gdGhlIGJveCBmb2xsb3dpbmcgdGhpcyBtb29mLiBGaW5kIHRoZSBuZXh0IG1vb2YgZnJvbSB0aGVyZS4KIAogICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CkBAIC00MDgzLDcgKzQ5MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vZiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CkBAIC00MDk1LDcgKzQ5MzIsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0ZmhkIik6IHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MTA0LDcgKzQ5NDEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICd1JywgJ24nKTogeworICAgICAgICBjYXNlIEZPVVJDQygidHJ1biIpOiB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgPT0gbVRyYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CkBAIC00MTE2LDcgKzQ5NTMsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ3onKTogeworICAgICAgICBjYXNlIEZPVVJDQygic2FpeiIpOiB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNDEyNCwxNiArNDk2MSwxNyBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ28nKTogeworICAgICAgICBjYXNlIEZPVVJDQygic2FpbyIpOiB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkKKyAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICdlJywgJ24nLCAnYycpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJzZW5jIik6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVFbmNyeXB0aW9uKGRhdGFfb2Zmc2V0KSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNDE0Miw3ICs0OTgwLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKTogeworICAgICAgICBjYXNlIEZPVVJDQygibWRhdCIpOiB7CiAgICAgICAgICAgICAvLyBwYXJzZSBEUk0gaW5mbyBpZiBwcmVzZW50CiAgICAgICAgICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsgbWRhdCIpOwogICAgICAgICAgICAgLy8gaWYgc2Fpei9zYW9pIHdhcyBwcmV2aW91c2x5IG9ic2VydmVkLCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgc2FtcGxlaW5mb3MKQEAgLTQyNTcsNyArNTA5NSw4IEBACiAgICAgaWYgKGVudHJ5Y291bnQgPiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKSB7CiAgICAgICAgIHVpbnQ2NF90ICpuZXdQdHIgPSAodWludDY0X3QgKilyZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPSBuZXdQdHI7CkBAIC00Mjk2LDEwICs1MTM1LDEzIEBACiAgICAgcmV0dXJuIHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhkcm1vZmZzZXQsIGZhbHNlLCAwKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CiAKLSAgICBpbnQgaXZsZW5ndGg7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZpdmxlbmd0aCkpOworICAgIGludDMyX3QgaXZsZW5ndGg7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCAmaXZsZW5ndGgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgLy8gb25seSAwLCA4IGFuZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIHN1cHBvcnRlZAogICAgIGlmIChpdmxlbmd0aCAhPSAwICYmIGl2bGVuZ3RoICE9IDggJiYgaXZsZW5ndGggIT0gMTYpIHsKQEAgLTQ0ODIsNyArNTMyNCw3IEBACiAKIHN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgewogCi0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKKyAgICBBTE9HVigiTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOwogICAgIGlmIChzaXplIDwgOCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC00NTg5LDggKzU0MzEsMzAgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IChvZmY2NF90KShzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoYnl0ZXNQZXJTYW1wbGUgIT0gMCkgeworICAgICAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhbXBsZUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJiLzEyMzM4OTg4MSBzYW1wbGVEdXJhdGlvbiA9PSAwIik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyNDM4OTg4MSB6ZXJvIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IHNvbWUgc2FuaXR5ICh2cyBzdHJpY3QgbGVnYWxpdHkpIGNoZWNrcworICAgICAgICAvLworICAgICAgICAvLyBjbGFtcCB0aGUgY291bnQgb2YgZW50cmllcyBpbiB0aGUgdHJ1biBib3gsIHRvIGF2b2lkIHNwZW5kaW5nIGZvcmV2ZXIgcGFyc2luZworICAgICAgICAvLyB0aGlzIGJveC4gQ2xhbXBpbmcgKHZzIGVycm9yKSBsZXRzIHVzIHBsYXkgKnNvbWV0aGluZyouCisgICAgICAgIC8vIDEgbWlsbGlvbiBpcyBhYm91dCA0MDAgbXNlY3Mgb24gYSBQaXhlbDMsIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gYSBjb3VwbGUgc2Vjb25kcworICAgICAgICAvLyBvbiB0aGUgc2xvd2VzdCBkZXZpY2VzLgorICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhUcnVuU2FtcGxlQ291bnQgPSAxMDAwMDAwOworICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HVygiYi8xMjMzODk4ODEgY2xhbXAgc2FtcGxlQ291bnQoJXUpIEAga01heFRydW5TYW1wbGVDb3VudCgldSkiLAorICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQsIGtNYXhUcnVuU2FtcGxlQ291bnQpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzODk4ODEgY291bnQiKTsKKworICAgICAgICB9CiAgICAgfQogCiAgICAgU2FtcGxlIHRtcDsKQEAgLTQ2MjQsMTAgKzU0ODgsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCisgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IGN0c09mZnNldCAlIiBQUkl1MzIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MsIHNhbXBsZUN0c09mZnNldCk7CiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOwpAQCAtNDY0MywxMCArNTUwNywxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtZXRhID0gbUZvcm1hdDsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewpAQCAtNDY2OCwxNSArNTUzMiw0NiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworaW50MzJfdCBNUEVHNFNvdXJjZTo6cGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA8IG1OQUxMZW5ndGhTaXplICsgMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gSEVWQyBOQUwtaGVhZGVyICgxNi1iaXQpCisgICAgLy8gIDEgICA2ICAgICAgNiAgICAgMworICAgIC8vIHwtfHV1dXV1dXwtLS0tLS18aWlpfAorICAgIC8vICAgICAgXiAgICAgICAgICAgIF4KKyAgICAvLyAgTkFMX3R5cGUgICAgICAgIGxheWVyX2lkICsgMQorICAgIC8vCisgICAgLy8gTGF5ZXItaWQgaXMgbm9uLXplcm8gb25seSBmb3IgVGVtcG9yYWwgU3ViLWxheWVyIEFjY2VzcyBwaWN0dXJlcyAoVFNBKQorICAgIGVudW0geworICAgICAgICBUU0FfTiA9IDIsCisgICAgICAgIFRTQV9SID0gMywKKyAgICAgICAgU1RTQV9OID0gNCwKKyAgICAgICAgU1RTQV9SID0gNSwKKyAgICB9OworCisgICAgZGF0YSArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICB1aW50MTZfdCBuYWxIZWFkZXIgPSBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworCisgICAgdWludDE2X3QgbmFsVHlwZSA9IChuYWxIZWFkZXIgPj4gOSkgJiAweDNGdTsKKyAgICBpZiAobmFsVHlwZSA9PSBUU0FfTiB8fCBuYWxUeXBlID09IFRTQV9SIHx8IG5hbFR5cGUgPT0gU1RTQV9OIHx8IG5hbFR5cGUgPT0gU1RTQV9SKSB7CisgICAgICAgIGludDMyX3QgbGF5ZXJJZFBsdXNPbmUgPSBuYWxIZWFkZXIgJiAweDd1OworICAgICAgICBBTE9HRF9JRihsYXllcklkUGx1c09uZSA9PSAwLCAiZ290IGxheWVySWQgMCBmb3IgVFNBIHBpY3R1cmUiKTsKKyAgICAgICAgcmV0dXJuIGxheWVySWRQbHVzT25lIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1CdWZmZXJHcm91cC0+aGFzX2J1ZmZlcnMoKSkgewogICAgICAgICAqb3V0ID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0KIAogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ID4gMCkgewpAQCAtNDY5MCwxMiArNTU4NSwxMyBAQAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworCiAgICAgICAgIGlmIChtSXNIZWlmKSB7CiAgICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwogICAgICAgICAgICAgaW50MzJfdCBpbWFnZUluZGV4OwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJmltYWdlSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CkBAIC00NzA1LDcgKzU2MDEsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWxJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CkBAIC00NzI3LDYgKzU2MjMsOSBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbW9kZSAhPSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKz0gKChsb25nIGRvdWJsZSltRWxzdFNoaWZ0U3RhcnRUaWNrcyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCkBAIC00NzQxLDEzICs1NjQwLDE2IEBACiAgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXggPSBzYW1wbGVJbmRleDsKKyAgICAgICAgICAgIC8vIGFzc3VtZSBldmVyeSBhdWRpbyBzYW1wbGUgaXMgYSBzeW5jIHNhbXBsZS4gVGhpcyB3b3JrcyBhcm91bmQKKyAgICAgICAgICAgIC8vIHNlZWsgaXNzdWVzIHdpdGggZmlsZXMgdGhhdCB3ZXJlIGluY29ycmVjdGx5IHdyaXR0ZW4gd2l0aCBhbgorICAgICAgICAgICAgLy8gZW1wdHkgb3Igc2luZ2xlLXNhbXBsZSBzdHNzIGJsb2NrIGZvciB0aGUgYXVkaW8gdHJhY2sKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgIW1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc2FtcGxlVGltZSk7CkBAIC00NzYwLDE0ICs1NjYyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUCiAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgLT0gbUVsc3RTaGlmdFN0YXJ0VGlja3M7CiAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKICAgICAgICAgICAgIH0KIApAQCAtNDc5Niw3ICs1Njk5LDcgQEAKIAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY3RzLCBzdHRzOworICAgIHVpbnQ2NF90IGN0cywgc3R0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTQ4MDYsNiArNTcwOSwxNCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgICAgICBpZihlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvKiBDb21wb3NpdGlvbiBUaW1lIFN0YW1wIGNhbm5vdCBiZSBuZWdhdGl2ZS4gU29tZSBmaWxlcyBoYXZlIHZpZGVvIFNhbXBsZQorICAgICAgICAgICAgICAgICogVGltZShTVFRTKWRlbHRhIHdpdGggemVybyB2YWx1ZShiLzExNzQwMjQyMCkuICBIZW5jZSBzdWJ0cmFjdCBvbmx5CisgICAgICAgICAgICAgICAgKiBtaW4oY3RzLCBtRWxzdFNoaWZ0U3RhcnRUaWNrcyksIHNvIHRoYXQgYXVkaW8gdHJhY2tzIGNhbiBiZSBwbGF5ZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjdHMgLT0gc3RkOjptaW4oY3RzLCBtRWxzdFNoaWZ0U3RhcnRUaWNrcyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/CkBAIC00ODE3LDE5NSArNTcyOCwxNTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsgLy8gRVJST1JfQlVGRkVSX1RPT19TTUFMTAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQyAmJiAhbUlzQUM0KSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKLSAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobUlzUGNtKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHR3b3MnIFBDTSBibG9jayByZWFkZXIgYXNzdW1lcyB0aGF0IGFsbCBzYW1wbGVzIGhhcyB0aGUgc2FtZSBzaXplLgogCi0gICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZXNUb1JlYWQgPSBtU2FtcGxlVGFibGUtPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtQ3VycmVudFNhbXBsZUluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlc1RvUmVhZCA+IGtNYXhQY21GcmFtZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvUmVhZCA9IGtNYXhQY21GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIEFMT0dWKCJSZWFkaW5nICVkIFBDTSBmcmFtZXMgb2Ygc2l6ZSAlenUgYXQgaW5kZXggJWQgdG8gc3RvcCBvZiBjaHVuayBhdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1RvUmVhZCwgc2l6ZSwgbUN1cnJlbnRTYW1wbGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSk7CisKKyAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKKyAgICAgICAgICAgICAgICB1aW50OF90KiBidWYgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHRvdGFsU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IChzc2l6ZV90KXRvdGFsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU9yZGVyOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgJmJ5dGVPcmRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZU9yZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQmlnLWVuZGlhbiAtPiBsaXR0bGUtZW5kaWFuCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3REYXRhID0gKHVpbnQxNl90ICopYnVmOworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqc3JjRGF0YSA9ICh1aW50MTZfdCAqKWJ1ZjsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGJ5dGVzUmVhZCAvIHNpemVvZih1aW50MTZfdCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGFbal0gPSBudG9ocyhzcmNEYXRhW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggKz0gc2FtcGxlc1RvUmVhZDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgdG90YWxTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CisgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOworICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLQotICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gQU1FRElBX09LOwogCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKLSAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOwotCisgICAgfSBlbHNlIGlmIChtSXNBQzQpIHsKICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQotICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCi0gICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKLSAgICAgICAgaWYgKHVzZXNEUk0gJiYgc2l6ZSA8PSBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXVzZXNEUk0gJiYgc2l6ZSA8PSBtU3JjQnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGlzIGxhcmdlciB0aGFuIHRoZSBleHBlY3RlZCBtYXhpbXVtIHNpemUuIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHRoZSBmYWlsdXJlCi0gICAgICAgICAgICAvLyBiZSBoYW5kbGVkIGJ5IHRoZSBmb2xsb3dpbmcgaWYuCi0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE4ODg5MzU1OSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAvLyBBZGQgQUMtNCBzeW5jIGhlYWRlciB0byBNUEVHNCBlbmNhcHN1bGF0ZWQgQUMtNCByYXcgZnJhbWUKKyAgICAgICAgLy8gQUM0MCBzeW5jIHdvcmQsIG1lYW5pbmcgbm8gQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhBQzsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweDQwOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMTYpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDgpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDApICYgMHhGRik7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRzdERhdGEgKyBkc3RPZmZzZXQsIHNpemUpOworICAgICAgICBpZiAobnVtQnl0ZXNSZWFkICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtNTAxMywxMiArNTg4NSwxMTIgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CisgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIGJvb2wgbVNyY0J1ZmZlckZpdHNEYXRhVG9SZWFkID0gc2l6ZSA8PSBtU3JjQnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKG1TcmNCdWZmZXJGaXRzRGF0YVRvUmVhZCkgeworICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGFyZSB0cnlpbmcgdG8gcmVhZCBhIHNhbXBsZSBsYXJnZXIgdGhhbiB0aGUgZXhwZWN0ZWQgbWF4IHNhbXBsZSBzaXplLgorICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCBhbmQgbGV0IHRoZSBmYWlsdXJlIGJlIGhhbmRsZWQgYnkgdGhlIGZvbGxvd2luZyBpZi4KKyAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjE4ODg5MzU1OSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBtU3JjQnVmZmVyRml0c0RhdGFUb1JlYWQgPyBBTUVESUFfRVJST1JfSU8gOiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAvL2lmIG5hbGxlbmd0aCBhYm5vcm1hbCxpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgQUxPR1coImFibm9ybWFsIG5hbGxlbmd0aCwgaWdub3JlIHRoaXMgTkFMIik7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0FWQykgeworICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAKICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkIik7CiAKQEAgLTUwMzIsNiArNjAwNCwxMCBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAKKyAgICAgICAgc2Vla1RpbWVVcyArPSAoKGxvbmcgZG91YmxlKW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICBBTE9HVigic2hpZnRlZCBzZWVrVGltZVVzIDolIiBQUklkNjQgIiwgbUVsc3RTaGlmdFN0YXJ0VGlja3M6JSIgUFJJdTY0LCBzZWVrVGltZVVzLAorICAgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyk7CisKICAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gbVNlZ21lbnRzLnNpemUoKTsKICAgICAgICAgaWYgKG51bVNpZHhFbnRyaWVzICE9IDApIHsKICAgICAgICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKQEAgLTUwNTksNyArNjAzNSw3IEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01MDcxLDcgKzYwNDcsNyBAQAogICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0bXApOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQpAQCAtNTA4NiwxNiArNjA2MiwyMCBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMgPSAwOworICAgIHVpbnQ2NF90IGN0cyA9IDA7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGUgPSBmYWxzZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwotICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKKyAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCisgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICB9CiAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudCBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgICAgIGlmIChtTmV4dE1vb2ZPZmZzZXQgPD0gbUN1cnJlbnRNb29mT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsKICAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG5leHRNb29mOwpAQCAtNTEwMywxMCArNjA4MywxMCBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZuZXh0TW9vZik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUxMTQsNTkgKzYwOTQsNjUgQEAKICAgICAgICAgb2Zmc2V0ID0gc21wbC0+b2Zmc2V0OwogICAgICAgICBzaXplID0gc21wbC0+c2l6ZTsKICAgICAgICAgY3RzID0gbUN1cnJlbnRUaW1lICsgc21wbC0+Y29tcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKLSAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7IC8vIFhYWAorICAgICAgICAvKiBDb21wb3NpdGlvbiBUaW1lIFN0YW1wIGNhbm5vdCBiZSBuZWdhdGl2ZS4gU29tZSBmaWxlcyBoYXZlIHZpZGVvIFNhbXBsZQorICAgICAgICAqIFRpbWUoU1RUUylkZWx0YSB3aXRoIHplcm8gdmFsdWUoYi8xMTc0MDI0MjApLiAgSGVuY2Ugc3VidHJhY3Qgb25seQorICAgICAgICAqIG1pbihjdHMsIG1FbHN0U2hpZnRTdGFydFRpY2tzKSwgc28gdGhhdCBhdWRpbyB0cmFja3MgY2FuIGJlIHBsYXllZC4KKyAgICAgICAgKi8KKyAgICAgICAgY3RzIC09IHN0ZDo6bWluKGN0cywgbUVsc3RTaGlmdFN0YXJ0VGlja3MpOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOworCisgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICBNZXRhRGF0YUJhc2UgJmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBidWZtZXRhLmNsZWFyKCk7CisgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKGJ1Zm1ldGEpOwogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCiAgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOwotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgICAgIGNvbnN0IHZvaWQgKml2ID0gTlVMTDsKKyAgICAgICAgdm9pZCAqaXYgPSBOVUxMOwogICAgICAgICBzaXplX3QgaXZsZW5ndGggPSAwOwotICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZERhdGEoCi0gICAgICAgICAgICAgICAga0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZsZW5ndGgpKSB7Ci0gICAgICAgICAgICBpdiA9IHNtcGwtPml2OworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAiY3J5cHRvLWl2IiwgJml2LCAmaXZsZW5ndGgpKSB7CisgICAgICAgICAgICBpdiA9ICh2b2lkICopIHNtcGwtPml2OwogICAgICAgICAgICAgaXZsZW5ndGggPSAxNjsgLy8gdXNlIDE2IG9yIHRoZSBhY3R1YWwgc2l6ZT8KICAgICAgICAgfQotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBpdiwgaXZsZW5ndGgpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGl2LCBpdmxlbmd0aCk7CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CkBAIC01MTc3LDEwMyArNjE2Myw1NyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSXNBVkMpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gQU1FRElBX09LOwogCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIndob2xlIE5BTCIpOwogICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CiAgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwogICAgICAgICB2b2lkICpkYXRhID0gTlVMTDsKICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IGZhbHNlOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGludDMyX3QgbWF4X3NpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZtYXhfc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IG1heF9zaXplOwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbWF4X3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNNYWxGb3JtZWQgfHwgZGF0YSA9PSBOVUxMKSB7CkBAIC01MjgyLDcgKzYyMjIsNyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKIApAQCAtNTI5MSw3NSArNjIzMSw2OSBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7Ci0gICAgICAgIH0KIAotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01MzY3LDE1ICs2MzAxLDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTM4NCw3ICs2MzIwLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU0MTAsMjcgKzYzNDYsMzAgQEAKIAogc3RhdGljIGJvb2wgaXNDb21wYXRpYmxlQnJhbmQodWludDMyX3QgZm91cmNjKSB7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDb21wYXRpYmxlQnJhbmRzW10gPSB7Ci0gICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnbScpLAotICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCi0gICAgICAgIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKSwKLSAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAncCcsICc0JyksCi0gICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdkJywgJ2EnLCAncycsICdoJyksCisgICAgICAgIEZPVVJDQygiaXNvbSIpLAorICAgICAgICBGT1VSQ0MoImlzbzIiKSwKKyAgICAgICAgRk9VUkNDKCJhdmMxIiksCisgICAgICAgIEZPVVJDQygiaHZjMSIpLAorICAgICAgICBGT1VSQ0MoImhldjEiKSwKKyAgICAgICAgRk9VUkNDKCJhdjAxIiksCisgICAgICAgIEZPVVJDQygiM2dwNCIpLAorICAgICAgICBGT1VSQ0MoIm1wNDEiKSwKKyAgICAgICAgRk9VUkNDKCJtcDQyIiksCisgICAgICAgIEZPVVJDQygiZGFzaCIpLAorICAgICAgICBGT1VSQ0MoIm52cjEiKSwKIAogICAgICAgICAvLyBXb24ndCBwcm9taXNlIHRoYXQgdGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGNhbiBiZSBwbGF5ZWQuCiAgICAgICAgIC8vIEp1c3QgZ2l2ZSB0aGVzZSBmaWxlIHR5cGVzIGEgY2hhbmNlLgotICAgICAgICBGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCi0gICAgICAgIEZPVVJDQygnTScsICdTJywgJ04nLCAnVicpLCAgLy8gU29ueSdzIFBTUAorICAgICAgICBGT1VSQ0MoInF0ICAiKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCisgICAgICAgIEZPVVJDQygiTVNOViIpLCAgLy8gU29ueSdzIFBTUAorICAgICAgICBGT1VSQ0MoIndtZiAiKSwKIAotICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCi0gICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAotICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKLSAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCi0gICAgICAgIEZPVVJDQygnbScsICdzJywgJ2YnLCAnMScpLCAgLy8gSEVJRiBpbWFnZSBzZXF1ZW5jZQotICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJ2MnKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCIzZzJhIiksICAvLyAzR1BQMgorICAgICAgICBGT1VSQ0MoIjNnMmIiKSwKKyAgICAgICAgRk9VUkNDKCJtaWYxIiksICAvLyBIRUlGIGltYWdlCisgICAgICAgIEZPVVJDQygiaGVpYyIpLCAgLy8gSEVJRiBpbWFnZQorICAgICAgICBGT1VSQ0MoIm1zZjEiKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCJoZXZjIiksICAvLyBIRUlGIGltYWdlIHNlcXVlbmNlCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOwpAQCAtNTQ0OSw3ICs2Mzg4LDcgQEAKIC8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKIC8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgogLy8gdGhlIG1ldGFkYXRhLgotc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOwogCkBAIC01NDk1LDkgKzY0MzQsMTAgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwKKyAgICAgICAgICAgICAgICBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoY2h1bmtEYXRhU2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTUzMiw3ICs2NDcyLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCJtb292Iik6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbW9vdkF0b21FbmRPZmZzZXQgPSBvZmZzZXQgKyBjaHVua1NpemU7CiAKQEAgLTU1NTYsMTggKzY0OTYsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKikgeworICAgIHJldHVybiB3cmFwKG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKLSAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CkBAIC01NTc1LDE2ICs2NTE2LDMxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIjNnMiIsCisgICAgIjNnYSIsCisgICAgIjNncCIsCisgICAgIjNncHAiLAorICAgICIzZ3BwMiIsCisgICAgIm00YSIsCisgICAgIm00ciIsCisgICAgIm00diIsCisgICAgIm1vdiIsCisgICAgIm1wNCIsCisgICAgInF0IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIyNzU3NWM2Ny00NDE3LTRjNTQtOGQzZC04ZTYyNjk4NWExNjQiKSwKLSAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAyLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDQgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKaW5kZXggM2VhMDk2My4uZmNkZGJiOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCkBAIC0yMCw5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+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+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3I7CiBzdHJ1Y3QgT2dnU291cmNlOwogCi1zdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKQEAgLTQ2LDcgKzQ3LDcgQEAKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIE15T2dnRXh0cmFjdG9yICptSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IDA2NzkzM2UuLjdlODkyNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtNywxMSArNywxMyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCkBAIC0zNCw5ICszNiw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggODM3ZjhkMC4uOTc2YjdkOSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIyICs2NiwyMiBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCi0gICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5XQVZTb3VyY2UoKTsKQEAgLTc4LDY0ICs4OSw3MiBAQAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OwogICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIHVpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICB1aW50MzJfdCBtQml0c1BlclNhbXBsZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc2l6ZV90IG1TaXplOwogICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CiAKICAgICBXQVZTb3VyY2UoY29uc3QgV0FWU291cmNlICYpOwogICAgIFdBVlNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFdBVlNvdXJjZSAmKTsKIH07CiAKLVdBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitXQVZFeHRyYWN0b3I6OldBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVZhbGlkRm9ybWF0KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzayhDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKKyAgICBtVHJhY2tNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7CiB9CiAKIFdBVkV4dHJhY3Rvcjo6fldBVkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqV0FWRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIG5ldyBXQVZTb3VyY2UoCiAgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YSwKLSAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBtQml0c1BlclNhbXBsZSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CisgICAgICAgICAgICBtV2F2ZUZvcm1hdCwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobUJpdHNQZXJTYW1wbGUpLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtVHJhY2tNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7CkBAIC0xODUsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVVMQVcKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVNHU00KICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGZtdFNpemUgPSAxNjsKQEAgLTE5OCwxMyArMjE3LDEzIEBACiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IFUxNl9MRV9BVCgmZm9ybWF0U3BlY1syXSk7CiAKLSAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IDgpIHsKKyAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IEZDQ184KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IEZDQ18yKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjI0LDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgdmFsaXRCaXRzUGVyU2FtcGxlID09IGJpdHNQZXJTYW1wbGUgYnV0IHNvbWUgV0FWX0VYVAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBkb24ndCBjb3JyZWN0bHkgc2V0IHRoZSB2YWxpZCBiaXRzIHZhbHVlLCBhbmQgbGVhdmUgaXQgYXQgMC4KQEAgLTI4NCwzNCArMzAzLDMzIEBACiAgICAgICAgICAgICAgICAgbURhdGFPZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgbURhdGFTaXplID0gY2h1bmtTaXplOwogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5jbGVhcigpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtVHJhY2tNZXRhKTsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAobVdhdmVGb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9QQ006CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX01TR1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1XYXZlRm9ybWF0LCAodWludDE2X3QpV0FWRV9GT1JNQVRfTVVMQVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIG1CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwpAQCAtMzIxLDE4ICszMzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzUGVyU2FtcGxlIHx8ICFtTnVtQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQpAQCAtMzQ3LDI1ICszNjUsMjEgQEAKIGNvbnN0IHNpemVfdCBXQVZTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAzMjc2ODsKIAogV0FWU291cmNlOjpXQVZTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKICAgICAgIG1XYXZlRm9ybWF0KHdhdmVGb3JtYXQpLAotICAgICAgbVNhbXBsZVJhdGUoMCksCi0gICAgICBtTnVtQ2hhbm5lbHMoMCksCi0gICAgICBtQml0c1BlclNhbXBsZShiaXRzUGVyU2FtcGxlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtT2Zmc2V0KG9mZnNldCksCiAgICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Hcm91cChOVUxMKSB7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAoaW50MzJfdCopICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAoaW50MzJfdCopICZtTnVtQ2hhbm5lbHMpKTsKLQotICAgIG1NZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOworICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIChpbnQzMl90KikgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIChpbnQzMl90KikgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIChpbnQzMl90KikgJm1CaXRzUGVyU2FtcGxlKSk7CiB9CiAKIFdBVlNvdXJjZTo6fldBVlNvdXJjZSgpIHsKQEAgLTM3NCw1MiArMzg4LDUxIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOwotCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBpZiAoIW1CdWZmZXJHcm91cC0+aW5pdCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBtQ3VycmVudFBvcyA9IG1PZmZzZXQ7CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0b3AiKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpnZXRGb3JtYXQiKTsKIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGtNYXhGcmFtZVNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgewotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC00NDEsMTYgKzQ1NCwyMCBAQAogICAgICAgICBtQ3VycmVudFBvcyA9IHBvcyArIG1PZmZzZXQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1heEJ5dGVzVG9SZWFkIGlzIG11bHRpcGxlIG9mIDMsIGluIDI0LWJpdCBjYXNlCi0gICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0KLSAgICAgICAgbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGtNYXhGcmFtZVNpemUgLyAyIDogCi0gICAgICAgIChtQml0c1BlclNhbXBsZSA9PSAyNCA/IDMqKGtNYXhGcmFtZVNpemUvMyk6IGtNYXhGcmFtZVNpemUpOworICAgIC8vIG1heEJ5dGVzVG9SZWFkIG1heSBiZSByZWR1Y2VkIHNvIHRoYXQgaW4tcGxhY2UgZGF0YSBjb252ZXJzaW9uIHdpbGwgZml0IGluIGJ1ZmZlciBzaXplLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gc3RkOjptaW4oYnVmZmVyLT5zaXplKCksIGtNYXhGcmFtZVNpemUpOworICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZDsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7IC8vIGRlc3RpbmF0aW9uIGlzIGZsb2F0IGF0IDQgYnl0ZXMgcGVyIHNhbXBsZSwgc291cmNlIG1heSBiZSBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtQml0c1BlclNhbXBsZSAvIDgpICogKGJ1ZmZlclNpemUgLyA0KTsKKyAgICB9IGVsc2UgeyAvLyBkZXN0aW5hdGlvbiBpcyBpbnQxNl90IGF0IDIgYnl0ZXMgcGVyIHNhbXBsZSwgb25seSBzb3VyY2Ugb2YgOCBiaXRzIGlzIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGJ1ZmZlclNpemUgLyAyIDogYnVmZmVyU2l6ZTsKKyAgICB9CiAKICAgICBjb25zdCBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQogICAgICAgICAobUN1cnJlbnRQb3MgPCBtT2Zmc2V0IHx8IG1DdXJyZW50UG9zIC0gbU9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkKQEAgLTQ4MSw0NSArNDk4LDU5IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7CiAKICAgICAvLyBUT0RPOiBhZGQgY2FwYWJpbGl0eSB0byByZXR1cm4gZGF0YSBhcyBmbG9hdCBQQ00gaW5zdGVhZCBvZiAxNiBiaXQgUENNLgogICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgOC1iaXQgdW5zaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGJ1ZmZlciB3aXRoIDIgYnl0ZSB3aWRlIHNhbXBsZXMKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqdG1wOwotICAgICAgICAgICAgQ0hFQ0tfRVEobUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KChpbnQxNl90ICopdG1wLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOwotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSB0bXA7Ci0gICAgICAgIH0gZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMjQpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMjQtYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgIGNvbnN0IHNpemVfdCBieXRlc1BlckZyYW1lID0gKG1CaXRzUGVyU2FtcGxlID4+IDMpICogbU51bUNoYW5uZWxzOworICAgICAgICBjb25zdCBzaXplX3QgbnVtRnJhbWVzID0gbiAvIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogbU51bUNoYW5uZWxzOworICAgICAgICBpZiAobU91dHB1dEZsb2F0KSB7CisgICAgICAgICAgICBmbG9hdCAqZmRlc3QgPSAoZmxvYXQgKilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3U4KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZkZXN0LCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7IC8vIGJ1ZmZlciByYW5nZSBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTMyKGZkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQxNl90ICppZGVzdCA9IChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0gIGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KGlkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIC8vIG5vIGNvbnZlcnNpb24gbmVlZGVkCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoaWRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IGZsb2F0IHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICBpZiAoIW1PdXRwdXRGbG9hdCkgeyAvLyBtQml0c1BlclNhbXBsZSA9PSAzMgorICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChpZGVzdCwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6IGlmIG91dHB1dCBlbmNvZGluZyBpcyBmbG9hdCwgbm8gbmVlZCB0byBjb252ZXJ0IGlmIHNvdXJjZSBpcyBmbG9hdC4KICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKQEAgLTUzMiwzOSArNTYzLDQzIEBACiAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogICAgIG1DdXJyZW50UG9zICs9IG47CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqaGVscGVyID0gbmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKTsKICAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICBpZiAoaGVscGVyLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIlJJRkYiLCA0KSB8fCBtZW1jbXAoJmhlYWRlcls4XSwgIldBVkUiLCA0KSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIFdBVkV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3RvcihoZWxwZXIpOyAvLyBleHRyYWN0b3Igb3ducyB0aGUgaGVscGVyCiAgICAgaW50IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBkZWxldGUgZXh0cmFjdG9yOwogICAgIGlmIChudW1UcmFja3MgPT0gMCkgewpAQCAtNTc2LDE2ICs2MTEsMjEgQEAKICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJ3YXYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAppbmRleCA0NjdkMGI3Li5iNTE0MTk2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMTksMzAgKzE5LDMxIEBACiAjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQogCiAgICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CkBAIC01Miw3ICs1Myw3IEBACiAgICAgdWludDE2X3QgbUJpdHNQZXJTYW1wbGU7CiAgICAgb2ZmNjRfdCBtRGF0YU9mZnNldDsKICAgICBzaXplX3QgbURhdGFTaXplOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YTsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAppbmRleCBkZThmMTIwLi44ODE5Zjg3IDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICAgICAgQ0ZBX1JHR0IsCiAgICAgICAgICAgICBDRkFfQkdHUiwKICAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX05PTkUsCiAgICAgICAgIH07CiAKICAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKQEAgLTg5LDcgKzkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQogICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCkBAIC0xOTcsNiArMTk3LDMzIEBACiAKICAgICAgICAgc3RhdHVzX3QgYWRkT3Bjb2RlUHJlYW1ibGUodWludDMyX3Qgb3Bjb2RlSWQpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIH07CiAKIH0gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKaW5kZXggOWFjN2UyYS4uNzkxNDAzMCAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTYwLDM0ICs2MCwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKLSAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7Ci0gICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CiAKLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OwotCi0gICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cwotICAgIHNpemVfdCBqID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7Ci0gICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOwotICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07Ci0gICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOwotICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgc3dpdGNoIChjZmEpIHsKKyAgICAgICAgY2FzZSBDRkFfUkdHQjoKKyAgICAgICAgY2FzZSBDRkFfR1JCRzoKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgY2FzZSBDRkFfQkdHUjoKKyAgICAgICAgICAgIGVyciA9IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGNmYSwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX05PTkU6CisgICAgICAgICAgICBlcnIgPSBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIENGQSBsYXlvdXQgJWQiLCBfX0ZVTkNUSU9OX18sIGNmYSk7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisgICAgcmV0dXJuIGVycjsKK30KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CiAgICAgdWludDMyX3QgcmVkVG9wID0gMDsKICAgICB1aW50MzJfdCByZWRMZWZ0ID0gMDsKICAgICB1aW50MzJfdCBncmVlbkV2ZW5Ub3AgPSAwOwpAQCAtMTQzLDEwICsxNDUsMzYgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKKyAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOworICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKKyAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL3JlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovcmVkTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCkBAIC0xNjMsOCArMTkxLDggQEAKIAogICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2dyZWVuRXZlblRvcCwKICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovZ3JlZW5FdmVuTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCkBAIC0xODEsOCArMjA5LDggQEAKIAogICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2dyZWVuT2RkVG9wLAogICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbk9kZExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCiAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLApAQCAtMTk5LDggKzIyNyw4IEBACiAKICAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ibHVlVG9wLAogICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ibHVlTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCkBAIC0yMTYsNiArMjQ0LDQ2IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICptYXAgPSBtYXBWZWN0b3IuZGF0YSgpOworCisgICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOworICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgbWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaV07CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9tYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLApAQCAtMjk2LDggKzM2NCw4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1ggPSBvcHRpY2FsQ2VudGVyWCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlXaWR0aCAtIDEpOwotICAgIGRvdWJsZSBub3JtYWxpemVkT0NZID0gb3B0aWNhbENlbnRlclkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGFjdGl2ZUFycmF5SGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1ggPSBvcHRpY2FsQ2VudGVyWCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlXaWR0aCk7CisgICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1kgPSBvcHRpY2FsQ2VudGVyWSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlIZWlnaHQpOwogCiAgICAgbm9ybWFsaXplZE9DWCA9IENMQU1QKG5vcm1hbGl6ZWRPQ1gsIDAsIDEpOwogICAgIG5vcm1hbGl6ZWRPQ1kgPSBDTEFNUChub3JtYWxpemVkT0NZLCAwLCAxKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKaW5kZXggZjAwZjdhOC4uMTY5NThmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKQEAgLTMyLDYgKzMyLDYgQEAKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmFhdWRpb19oZWFkZXJzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImxpYmFhdWRpby5tYXAudHh0IiwKIH0KIAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCmluZGV4IDYzOWZhYjIuLjQ5YmQ1ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMyBAQAotc3ViZGlycyA9IFsiKiJdCi0KIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInV0aWxzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icAppbmRleCBkOGM1ODQzLi41ZDM5OWI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKQEAgLTUsNiArNSw3IEBACiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQogCiBjY190ZXN0IHsKQEAgLTE0LDQgKzE1LDUgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI5ODFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3IuY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yX2NhbGxiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvX3ByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbGliYWF1ZGlvLnNvCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLWluY2x1ZGUgJChQUkVCVUlMVF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0NDc1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVE9ETyByZW1vdmUgdGhlbiB3aGVuIHdlIHN1cHBvcnQgb3RoZXIgYXJjaGl0ZWN0dXJlcwotQVBQX0FCSSA6PSBhcm02NC12OGEKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCmluZGV4IDViN2Q5NTYuLjUzZTUwMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCkBAIC05LDQgKzksNSBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViZTg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic25kZmlsZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYXVkaW91dGlscwotTE9DQUxfTU9EVUxFIDo9IGFhdWRpb19sb29wYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKaW5kZXggZWY5YTc1My4uOGViNzBiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKQEAgLTM0LDEyICszNCwxMjMgQEAKIAogLy8gVGFnIGZvciBtYWNoaW5lIHJlYWRhYmxlIHJlc3VsdHMgYXMgcHJvcGVydHkgPSB2YWx1ZSBwYWlycwogI2RlZmluZSBMT09QQkFDS19SRVNVTFRfVEFHICAgICAgIlJFU1VMVDogIgotI2RlZmluZSBMT09QQkFDS19TQU1QTEVfUkFURSAgICAgNDgwMDAKIAotI2RlZmluZSBNSUxMSVNfUEVSX1NFQ09ORCAgICAgICAgMTAwMAorY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRTYW1wbGVSYXRlID0gNDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWlsbGlzUGVyU2Vjb25kICAgPSAxMDAwOworY29uc3RleHByIGludDMyX3Qga01pbkxhdGVuY3lNaWxsaXMgID0gNDsgICAgLy8gYXJiaXRyYXJ5IGFuZCB2ZXJ5IGxvdworY29uc3RleHByIGludDMyX3Qga01heExhdGVuY3lNaWxsaXMgID0gNDAwOyAgLy8gYXJiaXRyYXJ5IGFuZCBnZW5lcm91cworY29uc3RleHByIGRvdWJsZSAga01heEVjaG9HYWluICAgICAgID0gMTAuMDsgLy8gYmFzZWQgb24gZXhwZXJpbWVudHMsIG90aGVyd2lzZSB0b28gbm9pc3kKK2NvbnN0ZXhwciBkb3VibGUgIGtNaW5pbXVtQ29uZmlkZW5jZSA9IDAuNTsKIAotI2RlZmluZSBNQVhfWkVST1RIX1BBUlRJQUxfQklOUyAgNDAKLWNvbnN0ZXhwciBkb3VibGUgTUFYX0VDSE9fR0FJTiA9IDEwLjA7IC8vIGJhc2VkIG9uIGV4cGVyaW1lbnRzLCBvdGhlcndpc2UgYXV0b2NvcnJlbGF0aW9uIHRvbyBub2lzeQorc3RhdGljIHZvaWQgcHJpbnRBdWRpb1Njb3BlKGZsb2F0IHNhbXBsZSkgeworICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDgwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKKyAgICBjaGFyIGMgPSAnKic7CisgICAgaWYgKHNhbXBsZSA8IC0xLjApIHsKKyAgICAgICAgc2FtcGxlID0gLTEuMDsKKyAgICAgICAgYyA9ICckJzsKKyAgICB9IGVsc2UgaWYgKHNhbXBsZSA+IDEuMCkgeworICAgICAgICBzYW1wbGUgPSAxLjA7CisgICAgICAgIGMgPSAnJCc7CisgICAgfQorICAgIGludCBudW1TcGFjZXMgPSAoaW50KSAoKChzYW1wbGUgKyAxLjApICogMC41KSAqIG1heFN0YXJzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNwYWNlczsgaSsrKSB7CisgICAgICAgIHB1dGNoYXIoJyAnKTsKKyAgICB9CisgICAgcHJpbnRmKCIlY1xuIiwgYyk7Cit9CisKKy8qCisKK0ZJUiBmaWx0ZXIgZGVzaWduZWQgd2l0aAoraHR0cDovL3QtZmlsdGVyLmFwcHNwb3QuY29tCisKK3NhbXBsaW5nIGZyZXF1ZW5jeTogNDgwMDAgSHoKKworKiAwIEh6IC0gODAwMCBIegorICBnYWluID0gMS4yCisgIGRlc2lyZWQgcmlwcGxlID0gNSBkQgorICBhY3R1YWwgcmlwcGxlID0gNS41OTUyNjYxNjk3MDM2OTMgZEIKKworKiAxMjAwMCBIeiAtIDIwMDAwIEh6CisgIGdhaW4gPSAwCisgIGRlc2lyZWQgYXR0ZW51YXRpb24gPSAtNDAgZEIKKyAgYWN0dWFsIGF0dGVudWF0aW9uID0gLTM3LjU4NjkxNTY2NTcxOTE0IGRCCisKKyovCisKKyNkZWZpbmUgRklMVEVSX1RBUF9OVU0gMTEKKworc3RhdGljIGNvbnN0IGZsb2F0IHNGaWx0ZXJUYXBzODAwMFtGSUxURVJfVEFQX05VTV0gPSB7CisgICAgICAgIC0wLjA1OTQ0MjE5MzUzMzQzMTg5ZiwKKyAgICAgICAgLTAuMDczMDM0MzQ4Mzk1MDMyMDhmLAorICAgICAgICAtMC4wMzc2OTA0ODc2NzI2ODkwNjZmLAorICAgICAgICAwLjE4NzA0ODA1MDY1OTY1MTJmLAorICAgICAgICAwLjM5MTAzMzczNTc4MzY4MzNmLAorICAgICAgICAwLjUzMzM2NzIzODU0MjU2MzdmLAorICAgICAgICAwLjM5MTAzMzczNTc4MzY4MzNmLAorICAgICAgICAwLjE4NzA0ODA1MDY1OTY1MTJmLAorICAgICAgICAtMC4wMzc2OTA0ODc2NzI2ODkwNjZmLAorICAgICAgICAtMC4wNzMwMzQzNDgzOTUwMzIwOGYsCisgICAgICAgIC0wLjA1OTQ0MjE5MzUzMzQzMTg5ZgorfTsKKworY2xhc3MgTG93UGFzc0ZpbHRlciB7CitwdWJsaWM6CisKKyAgICAvKgorICAgICAqIEZpbHRlciBvbmUgaW5wdXQgc2FtcGxlLgorICAgICAqIEByZXR1cm4gZmlsdGVyZWQgb3V0cHV0CisgICAgICovCisgICAgZmxvYXQgZmlsdGVyKGZsb2F0IGlucHV0KSB7CisgICAgICAgIGZsb2F0IG91dHB1dCA9IDAuMGY7CisgICAgICAgIG1YW21DdXJzb3JdID0gaW5wdXQ7CisgICAgICAgIC8vIEluZGV4IGJhY2t3YXJkcyBvdmVyIHguCisgICAgICAgIGludCB4SW5kZXggPSBtQ3Vyc29yICsgRklMVEVSX1RBUF9OVU07CisgICAgICAgIC8vIFdyaXRlIHR3aWNlIHNvIHdlIGF2b2lkIGhhdmluZyB0byB3cmFwIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNvbnZvbHV0aW9uLgorICAgICAgICBtWFt4SW5kZXhdID0gaW5wdXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklMVEVSX1RBUF9OVU07IGkrKykgeworICAgICAgICAgICAgb3V0cHV0ICs9IHNGaWx0ZXJUYXBzODAwMFtpXSAqIG1YW3hJbmRleC0tXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKyttQ3Vyc29yID49IEZJTFRFUl9UQVBfTlVNKSB7CisgICAgICAgICAgICBtQ3Vyc29yID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBQQVNTRUQKKyAgICAgKi8KKyAgICBib29sIHRlc3QoKSB7CisgICAgICAgIC8vIE1lYXN1cmUgdGhlIGltcHVsc2Ugb2YgdGhlIGZpbHRlciBhdCBkaWZmZXJlbnQgcGhhc2VzIHNvIHdlIGV4ZXJjaXNlCisgICAgICAgIC8vIGFsbCB0aGUgd3JhcGFyb3VuZCBjYXNlcyBpbiB0aGUgRklSLgorICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCAoRklMVEVSX1RBUF9OVU0gKiAyKTsgb2Zmc2V0KysgKSB7CisgICAgICAgICAgICAvLyBwcmludGYoIkxvd1Bhc3NGaWx0ZXI6IGN1cnNvciA9ICVkXG4iLCBtQ3Vyc29yKTsKKyAgICAgICAgICAgIC8vIE9mZnNldCBieSBvbmUgZWFjaCB0aW1lLgorICAgICAgICAgICAgaWYgKGZpbHRlcigwLjBmKSAhPSAwLjBmKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogZmlsdGVyIHNob3VsZCByZXR1cm4gMC4wIGJlZm9yZSBpbXB1bHNlIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJTFRFUl9UQVBfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBvdXRwdXQgPSBmaWx0ZXIoKGkgPT0gMCkgPyAxLjBmIDogMC4wZik7IC8vIGltcHVsc2UKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IHNGaWx0ZXJUYXBzODAwMFtpXSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBmaWx0ZXIgc2hvdWxkIHJldHVybiBpbXB1bHNlIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklMVEVSX1RBUF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIoMC4wZikgIT0gMC4wZikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBmaWx0ZXIgc2hvdWxkIHJldHVybiAwLjAgYWZ0ZXIgaW1wdWxzZSByZXNwb25zZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgorICAgIGZsb2F0ICAgbVhbRklMVEVSX1RBUF9OVU0gKiAyXXt9OyAvLyB0d2ljZSBhcyBiaWcgYXMgbmVlZGVkIHRvIGF2b2lkIHdyYXBwaW5nCisgICAgaW50MzJfdCBtQ3Vyc29yID0gMDsKK307CiAKIC8vIEEgbmFycm93IGltcHVsc2Ugc2VlbXMgdG8gaGF2ZSBiZXR0ZXIgaW1tdW5pdHkgYWdhaW5zdCBvdmVyIGVzdGltYXRpbmcgdGhlCiAvLyBsYXRlbmN5IGR1ZSB0byBkZXRlY3Rpbmcgc3ViaGFybW9uaWNzIGJ5IHRoZSBhdXRvLWNvcnJlbGF0b3IuCkBAIC03OCw2ICsxODksMTIgQEAKICAgICBpbnQ2NF90IG1TZWVkID0gOTk4ODc3NjY7CiB9OwogCisKK3R5cGVkZWYgc3RydWN0IExhdGVuY3lSZXBvcnRfcyB7CisgICAgZG91YmxlIGxhdGVuY3lJbkZyYW1lczsKKyAgICBkb3VibGUgY29uZmlkZW5jZTsKK30gTGF0ZW5jeVJlcG9ydDsKKwogc3RhdGljIGRvdWJsZSBjYWxjdWxhdGVDb3JyZWxhdGlvbihjb25zdCBmbG9hdCAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dTaXplKQpAQCAtMTAxLDEzMCArMjE4LDc1IEBACiAgICAgcmV0dXJuIGNvcnJlbGF0aW9uOwogfQogCi1zdGF0aWMgaW50IGNhbGN1bGF0ZUNvcnJlbGF0aW9ucyhjb25zdCBmbG9hdCAqaGF5c3RhY2ssIGludCBoYXlzdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbmVlZGxlLCBpbnQgbmVlZGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpyZXN1bHRzLCBpbnQgcmVzdWx0U2l6ZSkKLXsKLSAgICBpbnQgbWF4Q29ycmVsYXRpb25zID0gaGF5c3RhY2tTaXplIC0gbmVlZGxlU2l6ZTsKLSAgICBpbnQgbnVtQ29ycmVsYXRpb25zID0gc3RkOjptaW4obWF4Q29ycmVsYXRpb25zLCByZXN1bHRTaXplKTsKLQotICAgIGZvciAoaW50IGljID0gMDsgaWMgPCBudW1Db3JyZWxhdGlvbnM7IGljKyspIHsKLSAgICAgICAgZG91YmxlIGNvcnJlbGF0aW9uID0gY2FsY3VsYXRlQ29ycmVsYXRpb24oJmhheXN0YWNrW2ljXSwgbmVlZGxlLCBuZWVkbGVTaXplKTsKLSAgICAgICAgcmVzdWx0c1tpY10gPSBjb3JyZWxhdGlvbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVtQ29ycmVsYXRpb25zOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKioKLSAqIFNjYW4gdW50aWwgd2UgZ2V0IGEgY29ycmVsYXRpb24gb2YgYSBzaW5nbGUgc2NhbiB0aGF0IGdvZXMgb3ZlciB0aGUgdG9sZXJhbmNlIGxldmVsLAotICogcGVha3MgdGhlbiBkcm9wcyBiYWNrIGRvd24uCi0gKi8KLXN0YXRpYyBkb3VibGUgZmluZEZpcnN0TWF0Y2goY29uc3QgZmxvYXQgKmhheXN0YWNrLCBpbnQgaGF5c3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbmVlZGxlLCBpbnQgbmVlZGxlU2l6ZSwgZG91YmxlIHRocmVzaG9sZCAgKQotewotICAgIGludCBpYzsKLSAgICAvLyBIb3cgbWFueSBjb3JyZWxhdGlvbnMgY2FuIHdlIGNhbGN1bGF0ZT8KLSAgICBpbnQgbnVtQ29ycmVsYXRpb25zID0gaGF5c3RhY2tTaXplIC0gbmVlZGxlU2l6ZTsKLSAgICBkb3VibGUgbWF4Q29ycmVsYXRpb24gPSAwLjA7Ci0gICAgaW50IHBlYWtJbmRleCA9IC0xOwotICAgIGRvdWJsZSBsb2NhdGlvbiA9IC0xLjA7Ci0gICAgY29uc3QgZG91YmxlIGJhY2tUaHJlc2hvbGRTY2FsZXIgPSAwLjU7Ci0KLSAgICBmb3IgKGljID0gMDsgaWMgPCBudW1Db3JyZWxhdGlvbnM7IGljKyspIHsKLSAgICAgICAgZG91YmxlIGNvcnJlbGF0aW9uID0gY2FsY3VsYXRlQ29ycmVsYXRpb24oJmhheXN0YWNrW2ljXSwgbmVlZGxlLCBuZWVkbGVTaXplKTsKLQotICAgICAgICBpZiggKGNvcnJlbGF0aW9uID4gbWF4Q29ycmVsYXRpb24pICkgewotICAgICAgICAgICAgbWF4Q29ycmVsYXRpb24gPSBjb3JyZWxhdGlvbjsKLSAgICAgICAgICAgIHBlYWtJbmRleCA9IGljOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9wcmludGYoIlBhUWFfRmluZEZpcnN0TWF0Y2g6IGljID0gJTRkLCBjb3JyZWxhdGlvbiA9ICU4ZiwgbWF4U3VtID0gJThmXG4iLAotICAgICAgICAvLyAgICBpYywgY29ycmVsYXRpb24sIG1heFN1bSApOwotICAgICAgICAvLyBBcmUgd2UgcGFzdCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/Ci0gICAgICAgIGlmKChtYXhDb3JyZWxhdGlvbiA+IHRocmVzaG9sZCkgJiYgKGNvcnJlbGF0aW9uIDwgYmFja1RocmVzaG9sZFNjYWxlciAqIG1heENvcnJlbGF0aW9uKSkgewotICAgICAgICAgICAgbG9jYXRpb24gPSBwZWFrSW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBsb2NhdGlvbjsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgTGF0ZW5jeVJlcG9ydF9zIHsKLSAgICBkb3VibGUgbGF0ZW5jeUluRnJhbWVzOwotICAgIGRvdWJsZSBjb25maWRlbmNlOwotfSBMYXRlbmN5UmVwb3J0OwotCi0vLyBBcHBseSBhIHRlY2huaXF1ZSBzaW1pbGFyIHRvIEhhcm1vbmljIFByb2R1Y3QgU3BlY3RydW0gQW5hbHlzaXMgdG8gZmluZCBlY2hvIGZ1bmRhbWVudGFsLgotLy8gVXNpbmcgZmlyc3QgZWNobyBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBpbXB1bHNlIGZvciBhIGJldHRlciBtYXRjaC4KLXN0YXRpYyBpbnQgbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MoY29uc3QgZmxvYXQgKmhheXN0YWNrLCBpbnQgaGF5c3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpuZWVkbGUsIGludCBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVuY3lSZXBvcnQgKnJlcG9ydCkgewotICAgIGNvbnN0IGRvdWJsZSB0aHJlc2hvbGQgPSAwLjE7Ci0gICAgcHJpbnRmKCJtZWFzdXJlTGF0ZW5jeUZyb21FY2hvczogaGF5c3RhY2tTaXplID0gJWQsIG5lZWRsZVNpemUgPSAlZFxuIiwKLSAgICAgICAgICAgaGF5c3RhY2tTaXplLCBuZWVkbGVTaXplKTsKLQotICAgIC8vIEZpbmQgZmlyc3QgcGVhawotICAgIGludCBmaXJzdCA9IChpbnQpIChmaW5kRmlyc3RNYXRjaChoYXlzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF5c3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCkgKyAwLjUpOwotCi0gICAgLy8gVXNlIGZpcnN0IGVjaG8gYXMgdGhlIG5lZWRsZSBmb3IgdGhlIG90aGVyIGVjaG9zIGJlY2F1c2UKLSAgICAvLyBpdCB3aWxsIGJlIG1vcmUgc2ltaWxhci4KLSAgICBuZWVkbGUgPSAmaGF5c3RhY2tbZmlyc3RdOwotICAgIGludCBhZ2FpbiA9IChpbnQpIChmaW5kRmlyc3RNYXRjaChoYXlzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF5c3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCkgKyAwLjUpOwotCi0gICAgcHJpbnRmKCJtZWFzdXJlTGF0ZW5jeUZyb21FY2hvczogZmlyc3QgPSAlZCwgYWdhaW4gYXQgJWRcbiIsIGZpcnN0LCBhZ2Fpbik7Ci0gICAgZmlyc3QgPSBhZ2FpbjsKLQorc3RhdGljIGludCBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhjb25zdCBmbG9hdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GbG9hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZW5jeVJlcG9ydCAqcmVwb3J0KSB7CiAgICAgLy8gQWxsb2NhdGUgcmVzdWx0cyBhcnJheQotICAgIGludCByZW1haW5pbmcgPSBoYXlzdGFja1NpemUgLSBmaXJzdDsKLSAgICBjb25zdCBpbnQgbWF4UmVhc29uYWJsZUxhdGVuY3lGcmFtZXMgPSA0ODAwMCAqIDI7IC8vIGFyYml0cmFyeSBidXQgZ2VuZXJvdXMgdmFsdWUKLSAgICBpbnQgbnVtQ29ycmVsYXRpb25zID0gc3RkOjptaW4ocmVtYWluaW5nLCBtYXhSZWFzb25hYmxlTGF0ZW5jeUZyYW1lcyk7Ci0gICAgZmxvYXQgKmNvcnJlbGF0aW9ucyA9IG5ldyBmbG9hdFtudW1Db3JyZWxhdGlvbnNdOwotICAgIGZsb2F0ICpoYXJtb25pY1N1bXMgPSBuZXcgZmxvYXRbbnVtQ29ycmVsYXRpb25zXSgpOyAvLyBzZXQgdG8gemVybworICAgIGNvbnN0IGludCBtaW5SZWFzb25hYmxlTGF0ZW5jeUZyYW1lcyA9IHNhbXBsZVJhdGUgKiBrTWluTGF0ZW5jeU1pbGxpcyAvIGtNaWxsaXNQZXJTZWNvbmQ7CisgICAgY29uc3QgaW50IG1heFJlYXNvbmFibGVMYXRlbmN5RnJhbWVzID0gc2FtcGxlUmF0ZSAqIGtNYXhMYXRlbmN5TWlsbGlzIC8ga01pbGxpc1BlclNlY29uZDsKKyAgICBpbnQzMl90IG1heENvcnJlbGF0aW9uU2l6ZSA9IG1heFJlYXNvbmFibGVMYXRlbmN5RnJhbWVzICogMzsKKyAgICBpbnQgbnVtQ29ycmVsYXRpb25zID0gc3RkOjptaW4obnVtRmxvYXRzLCBtYXhDb3JyZWxhdGlvblNpemUpOworICAgIGZsb2F0ICpjb3JyZWxhdGlvbnMgPSBuZXcgZmxvYXRbbnVtQ29ycmVsYXRpb25zXXt9OworICAgIGZsb2F0ICpoYXJtb25pY1N1bXMgPSBuZXcgZmxvYXRbbnVtQ29ycmVsYXRpb25zXXt9OwogCi0gICAgLy8gR2VuZXJhdGUgY29ycmVsYXRpb24gZm9yIGV2ZXJ5IHBvc2l0aW9uLgotICAgIG51bUNvcnJlbGF0aW9ucyA9IGNhbGN1bGF0ZUNvcnJlbGF0aW9ucygmaGF5c3RhY2tbZmlyc3RdLCByZW1haW5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25zLCBudW1Db3JyZWxhdGlvbnMpOworICAgIC8vIFBlcmZvcm0gc2xpZGluZyBhdXRvLWNvcnJlbGF0aW9uLgorICAgIC8vIFNraXAgZmlyc3QgZnJhbWVzIHRvIGF2b2lkIGh1Z2UgcGVhayBhdCB6ZXJvIG9mZnNldC4KKyAgICBmb3IgKGludCBpID0gbWluUmVhc29uYWJsZUxhdGVuY3lGcmFtZXM7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgeworICAgICAgICBpbnQzMl90IHJlbWFpbmluZyA9IG51bUZsb2F0cyAtIGk7CisgICAgICAgIGZsb2F0IGNvcnJlbGF0aW9uID0gKGZsb2F0KSBjYWxjdWxhdGVDb3JyZWxhdGlvbigmZGF0YVtpXSwgZGF0YSwgcmVtYWluaW5nKTsKKyAgICAgICAgY29ycmVsYXRpb25zW2ldID0gY29ycmVsYXRpb247CisgICAgICAgIC8vIHByaW50ZigiY29ycmVsYXRpb25bJWRdID0gJWZcbiIsIGljLCBjb3JyZWxhdGlvbik7CisgICAgfQogCi0gICAgLy8gQWRkIGhpZ2hlciBoYXJtb25pY3MgbWFwcGVkIG9udG8gbG93ZXIgaGFybW9uaWNzLgotICAgIC8vIFRoaXMgcmVpbmZvcmNlcyB0aGUgImZ1bmRhbWVudGFsIiBlY2hvLgotICAgIGNvbnN0IGludCBudW1FY2hvZXMgPSAxMDsKKyAgICAvLyBBcHBseSBhIHRlY2huaXF1ZSBzaW1pbGFyIHRvIEhhcm1vbmljIFByb2R1Y3QgU3BlY3RydW0gQW5hbHlzaXMgdG8gZmluZCBlY2hvIGZ1bmRhbWVudGFsLgorICAgIC8vIEFkZCBoaWdoZXIgaGFybW9uaWNzIG1hcHBlZCBvbnRvIGxvd2VyIGhhcm1vbmljcy4gVGhpcyByZWluZm9yY2VzIHRoZSAiZnVuZGFtZW50YWwiIGVjaG8uCisgICAgY29uc3QgaW50IG51bUVjaG9lcyA9IDg7CiAgICAgZm9yIChpbnQgcGFydGlhbCA9IDE7IHBhcnRpYWwgPCBudW1FY2hvZXM7IHBhcnRpYWwrKykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBtaW5SZWFzb25hYmxlTGF0ZW5jeUZyYW1lczsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7CiAgICAgICAgICAgICBoYXJtb25pY1N1bXNbaSAvIHBhcnRpYWxdICs9IGNvcnJlbGF0aW9uc1tpXSAvIHBhcnRpYWw7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBGaW5kIGhpZ2hlc3QgcGVhayBpbiBjb3JyZWxhdGlvbiBhcnJheS4KICAgICBmbG9hdCBtYXhDb3JyZWxhdGlvbiA9IDAuMDsKLSAgICBmbG9hdCBzdW1PZlBlYWtzID0gMC4wOwogICAgIGludCBwZWFrSW5kZXggPSAwOwotICAgIGNvbnN0IGludCBza2lwID0gTUFYX1pFUk9USF9QQVJUSUFMX0JJTlM7IC8vIHNraXAgbG93IGJpbnMKLSAgICBmb3IgKGludCBpID0gc2tpcDsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgewogICAgICAgICBpZiAoaGFybW9uaWNTdW1zW2ldID4gbWF4Q29ycmVsYXRpb24pIHsKICAgICAgICAgICAgIG1heENvcnJlbGF0aW9uID0gaGFybW9uaWNTdW1zW2ldOwotICAgICAgICAgICAgc3VtT2ZQZWFrcyArPSBtYXhDb3JyZWxhdGlvbjsKICAgICAgICAgICAgIHBlYWtJbmRleCA9IGk7Ci0gICAgICAgICAgICBwcmludGYoIm1heENvcnJlbGF0aW9uID0gJWYgYXQgJWRcbiIsIG1heENvcnJlbGF0aW9uLCBwZWFrSW5kZXgpOworICAgICAgICAgICAgLy8gcHJpbnRmKCJtYXhDb3JyZWxhdGlvbiA9ICVmIGF0ICVkXG4iLCBtYXhDb3JyZWxhdGlvbiwgcGVha0luZGV4KTsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJlcG9ydC0+bGF0ZW5jeUluRnJhbWVzID0gcGVha0luZGV4OwotICAgIGlmIChzdW1PZlBlYWtzIDwgMC4wMDAxKSB7CisvKgorICAgIHsKKyAgICAgICAgaW50MzJfdCB0b3BQZWFrID0gcGVha0luZGV4ICogNyAvIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9wUGVhazsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBoYXJtb25pY1N1bXNbaV07CisgICAgICAgICAgICBwcmludGYoIiU0ZDogJTcuNWYgIiwgaSwgc2FtcGxlKTsKKyAgICAgICAgICAgIHByaW50QXVkaW9TY29wZShzYW1wbGUpOworICAgICAgICB9CisgICAgfQorKi8KKworICAgIC8vIENhbGN1bGF0ZSBjb25maWRlbmNlLgorICAgIGlmIChtYXhDb3JyZWxhdGlvbiA8IDAuMDAxKSB7CiAgICAgICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IDAuMDsKICAgICB9IGVsc2UgewotICAgICAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSBtYXhDb3JyZWxhdGlvbiAvIHN1bU9mUGVha3M7CisgICAgICAgIC8vIENvbXBhcmUgcGVhayB0byBhdmVyYWdlIHZhbHVlIGFyb3VuZCBwZWFrLgorICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBzdGQ6Om1pbihudW1Db3JyZWxhdGlvbnMsIHBlYWtJbmRleCAqIDIpOworICAgICAgICBpZiAobnVtU2FtcGxlcyA8PSAwKSB7CisgICAgICAgICAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSAwLjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gMC4wOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gaGFybW9uaWNTdW1zW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgZG91YmxlIGF2ZXJhZ2UgPSBzdW0gLyBudW1TYW1wbGVzOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHJhdGlvID0gYXZlcmFnZSAvIG1heENvcnJlbGF0aW9uOyAvLyB3aWxsIGJlIDwgMS4wCisgICAgICAgICAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSAxLjAgLSBzcXJ0KHJhdGlvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGRlbGV0ZVtdIGNvcnJlbGF0aW9uczsKQEAgLTI0OCw3ICszMTAsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIFNIT1JUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoaW50MTZfdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCiAgICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKQEAgLTI2MCw3ICszMjIsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIEZMT0FUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKICAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwpAQCAtMjcxLDcgKzMzMyw3IEBACiAgICAgICAgIHJldHVybiBudW1GcmFtZXM7CiAgICAgfQogCi0gICAgaW50IHNpemUoKSB7CisgICAgaW50MzJfdCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKICAgICB9CiAKQEAgLTMyMCw3ICszODIsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgYXNzZXJ0KGluZm8uY2hhbm5lbHMgPT0gMSk7CisgICAgICAgIGFzc2VydChpbmZvLmZvcm1hdCA9PSBTRl9GT1JNQVRfRkxPQVQpOwogCisgICAgICAgIHNldFNhbXBsZVJhdGUoaW5mby5zYW1wbGVyYXRlKTsKICAgICAgICAgYWxsb2NhdGUoaW5mby5mcmFtZXMpOwogICAgICAgICBtRnJhbWVDb3VudGVyID0gc2ZfcmVhZGZfZmxvYXQoc25kRmlsZSwgbURhdGEsIGluZm8uZnJhbWVzKTsKIApAQCAtMzI4LDExICszOTIsNDkgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50ZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU3F1YXJlIHRoZSBzYW1wbGVzIHNvIHRoZXkgYXJlIGFsbCBwb3NpdGl2ZSBhbmQgc28gdGhlIHBlYWtzIGFyZSBlbXBoYXNpemVkLgorICAgICAqLworICAgIHZvaWQgc3F1YXJlKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1GcmFtZUNvdW50ZXI7IGkrKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gbURhdGFbaV07CisgICAgICAgICAgICBtRGF0YVtpXSA9IHNhbXBsZSAqIHNhbXBsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvdyBwYXNzIGZpbHRlciB0aGUgcmVjb3JkaW5nIHVzaW5nIGEgc2ltcGxlIEZJUiBmaWx0ZXIuCisgICAgICogTm90ZSB0aGF0IHRoZSBsb3dwYXNzIGZpbHRlciBjdXRvZmYgdHJhY2tzIHRoZSBzYW1wbGUgcmF0ZS4KKyAgICAgKiBUaGF0IGlzIE9LIGJlY2F1c2UgdGhlIGltcHVsc2Ugd2lkdGggaXMgYSBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcy4KKyAgICAgKi8KKyAgICB2b2lkIGxvd1Bhc3NGaWx0ZXIoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7CisgICAgICAgICAgICBtRGF0YVtpXSA9IG1Mb3dQYXNzRmlsdGVyLmZpbHRlcihtRGF0YVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgREMgb2Zmc2V0IHVzaW5nIGEgb25lLXBvbGUgb25lLXplcm8gSUlSIGZpbHRlci4KKyAgICAgKi8KKyAgICB2b2lkIGRjQmxvY2tlcigpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgUiA9IDAuOTk2OyAvLyBuYXJyb3cgbm90Y2ggYXQgemVybyBIegorICAgICAgICBmbG9hdCB4MSA9IDAuMDsKKyAgICAgICAgZmxvYXQgeTEgPSAwLjA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZyYW1lQ291bnRlcjsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB4ID0gbURhdGFbaV07CisgICAgICAgICAgICBjb25zdCBmbG9hdCB5ID0geCAtIHgxICsgKFIgKiB5MSk7CisgICAgICAgICAgICBtRGF0YVtpXSA9IHk7CisgICAgICAgICAgICB5MSA9IHk7CisgICAgICAgICAgICB4MSA9IHg7CisgICAgICAgIH0KKyAgICB9CisKIHByaXZhdGU6Ci0gICAgZmxvYXQgICptRGF0YSA9IG51bGxwdHI7Ci0gICAgaW50MzJfdCBtRnJhbWVDb3VudGVyID0gMDsKLSAgICBpbnQzMl90IG1NYXhGcmFtZXMgPSAwOwotICAgIGludDMyX3QgbVNhbXBsZVJhdGUgPSA0ODAwMDsgLy8gY29tbW9uIGRlZmF1bHQKKyAgICBmbG9hdCAgICAgICAgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgIG1GcmFtZUNvdW50ZXIgPSAwOworICAgIGludDMyX3QgICAgICAgbU1heEZyYW1lcyA9IDA7CisgICAgaW50MzJfdCAgICAgICBtU2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxlUmF0ZTsgLy8gY29tbW9uIGRlZmF1bHQKKyAgICBMb3dQYXNzRmlsdGVyIG1Mb3dQYXNzRmlsdGVyOwogfTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zNDEsOSArNDQzLDE0IEBACiAgICAgdmlydHVhbCB+TG9vcGJhY2tQcm9jZXNzb3IoKSA9IGRlZmF1bHQ7CiAKIAorICAgIGVudW0gcHJvY2Vzc19yZXN1bHQgeworICAgICAgICBQUk9DRVNTX1JFU1VMVF9PSywKKyAgICAgICAgUFJPQ0VTU19SRVNVTFRfR0xJVENICisgICAgfTsKKwogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgdmlydHVhbCBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpID0gMDsKIApAQCAtMzUyLDggKzQ1OSwxMiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHByaW50U3RhdHVzKCkge307CiAKLSAgICB2aXJ0dWFsIGludCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBpbnQzMl90IGdldFJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBzZXRSZXN1bHQoaW50MzJfdCByZXN1bHQpIHsKKyAgICAgICAgbVJlc3VsdCA9IHJlc3VsdDsKICAgICB9CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNEb25lKCkgewpAQCAtMzgyLDcgKzQ5Myw3IEBACiAgICAgc3RhdGljIGZsb2F0IG1lYXN1cmVQZWFrQW1wbGl0dWRlKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgewogICAgICAgICBmbG9hdCBwZWFrID0gMC4wZjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgcG9zID0gZmFicygqaW5wdXREYXRhKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBvcyA9IGZhYnMoKmlucHV0RGF0YSk7CiAgICAgICAgICAgICBpZiAocG9zID4gcGVhaykgewogICAgICAgICAgICAgICAgIHBlYWsgPSBwb3M7CiAgICAgICAgICAgICB9CkBAIC0zOTMsNyArNTA0LDggQEAKIAogCiBwcml2YXRlOgotICAgIGludDMyX3QgbVNhbXBsZVJhdGUgPSBMT09QQkFDS19TQU1QTEVfUkFURTsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlID0ga0RlZmF1bHRTYW1wbGVSYXRlOworICAgIGludDMyX3QgbVJlc3VsdCA9IDA7CiB9OwogCiBjbGFzcyBQZWFrRGV0ZWN0b3IgewpAQCAtNDEyLDI0ICs1MjQsNiBAQAogICAgIGZsb2F0ICBtUHJldmlvdXMgPSAwLjBmOwogfTsKIAotCi1zdGF0aWMgdm9pZCBwcmludEF1ZGlvU2NvcGUoZmxvYXQgc2FtcGxlKSB7Ci0gICAgY29uc3QgaW50IG1heFN0YXJzID0gODA7IC8vIGFyYml0cmFyeSwgZml0cyBvbiBvbmUgbGluZQotICAgIGNoYXIgYyA9ICcqJzsKLSAgICBpZiAoc2FtcGxlIDwgLTEuMCkgewotICAgICAgICBzYW1wbGUgPSAtMS4wOwotICAgICAgICBjID0gJyQnOwotICAgIH0gZWxzZSBpZiAoc2FtcGxlID4gMS4wKSB7Ci0gICAgICAgIHNhbXBsZSA9IDEuMDsKLSAgICAgICAgYyA9ICckJzsKLSAgICB9Ci0gICAgaW50IG51bVNwYWNlcyA9IChpbnQpICgoKHNhbXBsZSArIDEuMCkgKiAwLjUpICogbWF4U3RhcnMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3BhY2VzOyBpKyspIHsKLSAgICAgICAgcHV0Y2hhcignICcpOwotICAgIH0KLSAgICBwcmludGYoIiVjXG4iLCBjKTsKLX0KLQogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvKioKICAqIE1lYXN1cmUgbGF0ZW5jeSBnaXZlbiBhIGxvb3BiYWNrIHN0cmVhbSBkYXRhLgpAQCAtNDUwLDE3ICs1NDQsMTMgQEAKICAgICB9CiAKICAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgewotICAgICAgICBtRG93bkNvdW50ZXIgPSAyMDA7CisgICAgICAgIG1Eb3duQ291bnRlciA9IGdldFNhbXBsZVJhdGUoKSAvIDI7CiAgICAgICAgIG1Mb29wQ291bnRlciA9IDA7CiAgICAgICAgIG1NZWFzdXJlZExvb3BHYWluID0gMC4wZjsKICAgICAgICAgbUVjaG9HYWluID0gMS4wZjsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5JVElBTF9TSUxFTkNFOwogICAgIH0KIAotICAgIHZpcnR1YWwgaW50IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9ET05FID8gMCA6IC0xOwotICAgIH0KLQogICAgIHZpcnR1YWwgYm9vbCBpc0RvbmUoKSB7CiAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfRE9ORSB8fCBtU3RhdGUgPT0gU1RBVEVfRkFJTEVEOwogICAgIH0KQEAgLTQ3MywyNyArNTYzLDU3IEBACiAgICAgICAgIHJldHVybiBtRWNob0dhaW47CiAgICAgfQogCi0gICAgdm9pZCByZXBvcnQoKSBvdmVycmlkZSB7CisgICAgYm9vbCB0ZXN0TG93UGFzc0ZpbHRlcigpIHsKKyAgICAgICAgTG93UGFzc0ZpbHRlciBmaWx0ZXI7CisgICAgICAgIHJldHVybiBmaWx0ZXIudGVzdCgpOworICAgIH0KIAorICAgIHZvaWQgcmVwb3J0KCkgb3ZlcnJpZGUgewogICAgICAgICBwcmludGYoIkVjaG9BbmFseXplciAtLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibWVhc3VyZWQuZ2FpbiAgICAgICAgICA9ICVmXG4iLCBtTWVhc3VyZWRMb29wR2Fpbik7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJlY2hvLmdhaW4gICAgICAgICAgICAgID0gJWZcbiIsIG1FY2hvR2Fpbik7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgICAgID0gJWRcbiIsIG1TdGF0ZSk7Ci0gICAgICAgIGlmIChtTWVhc3VyZWRMb29wR2FpbiA+PSAwLjk5OTkpIHsKKyAgICAgICAgaWYgKGdldFJlc3VsdCgpICE9IDApIHsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJyZXN1bHQgICAgICAgICAgPSAlZFxuIiwgZ2V0UmVzdWx0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJpbnRmKCJMb3dQYXNzRmlsdGVyIHRlc3QgJXNcbiIsIHRlc3RMb3dQYXNzRmlsdGVyKCkgPyAiUEFTU0VEIiA6ICJGQUlMRUQiKTsKKworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibWVhc3VyZWQuZ2FpbiAgICAgICAgICA9ICU4ZlxuIiwgbU1lYXN1cmVkTG9vcEdhaW4pOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZWNoby5nYWluICAgICAgICAgICAgICA9ICU4ZlxuIiwgbUVjaG9HYWluKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICAgICAgPSAlOGRcbiIsIG1TdGF0ZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlLm5hbWUgICAgICAgID0gJThzXG4iLCBjb252ZXJ0U3RhdGVUb1RleHQobVN0YXRlKSk7CisKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFKSB7CisgICAgICAgICAgICBwcmludGYoIldBUk5JTkcgLSBTdHVjayB3YWl0aW5nIGZvciBzaWxlbmNlLiBJbnB1dCBtYXkgYmUgdG9vIG5vaXN5IVxuIik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfTk9JU1kpOworICAgICAgICB9IGVsc2UgaWYgKG1NZWFzdXJlZExvb3BHYWluID49IDAuOTk5OSkgewogICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNsaXBwaW5nLCB0dXJuIGRvd24gdm9sdW1lIHNsaWdodGx5XG4iKTsKKyAgICAgICAgICAgIHNldFJlc3VsdChFUlJPUl9DTElQUElORyk7CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IFNUQVRFX0RPTkUgJiYgbVN0YXRlICE9IFNUQVRFX0dBVEhFUklOR19FQ0hPUykgeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gQmFkIHN0YXRlLiBDaGVjayB2b2x1bWUgb24gZGV2aWNlLlxuIik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfSU5WQUxJRF9TVEFURSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCAqbmVlZGxlID0gc19JbXB1bHNlOwotICAgICAgICAgICAgaW50IG5lZWRsZVNpemUgPSAoaW50KSAoc2l6ZW9mKHNfSW1wdWxzZSkgLyBzaXplb2YoZmxvYXQpKTsKLSAgICAgICAgICAgIGZsb2F0ICpoYXlzdGFjayA9IG1BdWRpb1JlY29yZGluZy5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpbnQgaGF5c3RhY2tTaXplID0gbUF1ZGlvUmVjb3JkaW5nLnNpemUoKTsKLSAgICAgICAgICAgIG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGhheXN0YWNrLCBoYXlzdGFja1NpemUsIG5lZWRsZSwgbmVlZGxlU2l6ZSwgJm1MYXRlbmN5UmVwb3J0KTsKLSAgICAgICAgICAgIGlmIChtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlIDwgMC4wMSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAgRVJST1IgLSBjb25maWRlbmNlIHRvbyBsb3cgPSAlZlxuIiwgbUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0gMTAwMC4wICogbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmZyYW1lcyAgICAgICAgPSAlOC4yZlxuIiwgbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5tc2VjICAgICAgICAgID0gJTguMmZcbiIsIGxhdGVuY3lNaWxsaXMpOwotICAgICAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmNvbmZpZGVuY2UgICAgPSAlOC42ZlxuIiwgbUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSk7CisgICAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBzaWduYWwgdG8gaW1wcm92ZSB0aGUgYXV0by1jb3JyZWxhdGlvbi4KKyAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy5kY0Jsb2NrZXIoKTsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy5zcXVhcmUoKTsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy5sb3dQYXNzRmlsdGVyKCk7CisKKyAgICAgICAgICAgIHByaW50ZigiUGxlYXNlIHdhaXQgc2V2ZXJhbCBzZWNvbmRzIGZvciBhdXRvLWNvcnJlbGF0aW9uIHRvIGNvbXBsZXRlLlxuIik7CisgICAgICAgICAgICBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhtQXVkaW9SZWNvcmRpbmcuZ2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeVJlcG9ydCk7CisKKyAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0ga01pbGxpc1BlclNlY29uZCAqIChkb3VibGUpIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmZyYW1lcyAgICAgICAgID0gJTguMmZcbiIsCisgICAgICAgICAgICAgICAgICAgbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzKTsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5Lm1zZWMgICAgICAgICAgID0gJTguMmZcbiIsCisgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1pbGxpcyk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgICA9ICU4LjZmXG4iLAorICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOworICAgICAgICAgICAgaWYgKG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UgPCBrTWluaW11bUNvbmZpZGVuY2UpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93IVxuIik7CisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0NPTkZJREVOQ0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTE5LDcgKzYzOSwxMiBAQAogICAgICAgICBzZW5kSW1wdWxzZXMob3V0cHV0RGF0YSwgb3V0cHV0Q2hhbm5lbENvdW50LCBrSW1wdWxzZVNpemVJbkZyYW1lcyk7CiAgICAgfQogCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICAvLyBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgZm9yIGEgdHlwaWNhbCBibG9jayBvZiBwcm9jZXNzaW5nCisgICAgaW50MzJfdCBnZXRCbG9ja0ZyYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZVJhdGUoKSAvIDg7CisgICAgfQorCisgICAgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7CiAgICAgICAgIGludCBjaGFubmVsc1ZhbGlkID0gc3RkOjptaW4oaW5wdXRDaGFubmVsQ291bnQsIG91dHB1dENoYW5uZWxDb3VudCk7CkBAIC01MjcsNyArNjUyLDcgQEAKICAgICAgICAgaW50IG51bVdyaXR0ZW47CiAgICAgICAgIGludCBudW1TYW1wbGVzOwogCi0gICAgICAgIGVjaG9fc3RhdGVfdCBuZXh0U3RhdGUgPSBtU3RhdGU7CisgICAgICAgIGVjaG9fc3RhdGUgbmV4dFN0YXRlID0gbVN0YXRlOwogCiAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICBjYXNlIFNUQVRFX0lOSVRJQUxfU0lMRU5DRToKQEAgLTUzNiwxMCArNjYxLDExIEBACiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVtpXSA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXItLSA8PSAwKSB7CisgICAgICAgICAgICAgICAgbURvd25Db3VudGVyIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlID0gU1RBVEVfTUVBU1VSSU5HX0dBSU47CiAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9NRUFTVVJJTkdfR0FJTlxuIiwgbUxvb3BDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gODsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gZ2V0QmxvY2tGcmFtZXMoKSAqIDI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01NDgsMTQgKzY3NCwxNiBAQAogICAgICAgICAgICAgICAgIHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICAgICAgICAgIC8vIElmIHdlIGdldCBzZXZlcmFsIGluIGEgcm93IHRoZW4gZ28gdG8gbmV4dCBzdGF0ZS4KICAgICAgICAgICAgICAgICBpZiAocGVhayA+IG1QdWxzZVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyLS0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFLCBtZWFzdXJlZCBwZWFrID0gJWZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBtTG9vcENvdW50ZXIsIHBlYWspOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IGdldEJsb2NrRnJhbWVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IHBlYWs7ICAvLyBhc3N1bWVzIG9yaWdpbmFsIHB1bHNlIGFtcGxpdHVkZSBpcyBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWxlbmNlVGhyZXNob2xkID0gcGVhayAqIDAuMTsgLy8gc2NhbGUgc2lsZW5jZSB0byBtZWFzdXJlZCBwdWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGdhaW4gdGhhdCB3aWxsIGdpdmUgdXMgYSBuaWNlIGRlY2F5aW5nIGVjaG8uCiAgICAgICAgICAgICAgICAgICAgICAgICBtRWNob0dhaW4gPSBtRGVzaXJlZEVjaG9HYWluIC8gbU1lYXN1cmVkTG9vcEdhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVjaG9HYWluID4gTUFYX0VDSE9fR0FJTikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FY2hvR2FpbiA+IGtNYXhFY2hvR2FpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBsb29wIGdhaW4gdG9vIGxvdy4gSW5jcmVhc2UgdGhlIHZvbHVtZS5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX0ZBSUxFRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01NjMsNyArNjkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtRnJhbWVzID4ga0ltcHVsc2VTaXplSW5GcmFtZXMpeyAvLyBpZ25vcmUgc2hvcnQgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IGdldEJsb2NrRnJhbWVzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01NzYsMTMgKzcwNCwxNCBAQAogICAgICAgICAgICAgICAgIHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICAgICAgICAgIC8vIElmIHdlIGdldCBzZXZlcmFsIGluIGEgcm93IHRoZW4gZ28gdG8gbmV4dCBzdGF0ZS4KICAgICAgICAgICAgICAgICBpZiAocGVhayA8IG1TaWxlbmNlVGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXItLSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlID0gU1RBVEVfU0VORElOR19QVUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9TRU5ESU5HX1BVTFNFXG4iLCBtTG9vcENvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IGdldEJsb2NrRnJhbWVzKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNjE1LDE3ICs3NDQsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG51bVdyaXR0ZW4gIDwgbnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9ET05FXG4iLCBtTG9vcENvdW50ZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBTVEFURV9ET05FOgorICAgICAgICAgICAgY2FzZSBTVEFURV9GQUlMRUQ6CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgbVN0YXRlID0gbmV4dFN0YXRlOwogICAgICAgICBtTG9vcENvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIFBST0NFU1NfUkVTVUxUX09LOwogICAgIH0KIAogICAgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBvdmVycmlkZSB7CkBAIC02MzMsMTIgKzc2MywyMyBAQAogICAgIH0KIAogICAgIGludCBsb2FkKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmRpbmcubG9hZChmaWxlTmFtZSk7CisgICAgICAgIGludCByZXN1bHQgPSBtQXVkaW9SZWNvcmRpbmcubG9hZChmaWxlTmFtZSk7CisgICAgICAgIHNldFNhbXBsZVJhdGUobUF1ZGlvUmVjb3JkaW5nLmdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0RPTkU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiBwcml2YXRlOgogCi0gICAgZW51bSBlY2hvX3N0YXRlX3QgeworICAgIGVudW0gZXJyb3JfY29kZSB7CisgICAgICAgIEVSUk9SX09LID0gMCwKKyAgICAgICAgRVJST1JfTk9JU1kgPSAtOTksCisgICAgICAgIEVSUk9SX0NMSVBQSU5HLAorICAgICAgICBFUlJPUl9DT05GSURFTkNFLAorICAgICAgICBFUlJPUl9JTlZBTElEX1NUQVRFCisgICAgfTsKKworICAgIGVudW0gZWNob19zdGF0ZSB7CiAgICAgICAgIFNUQVRFX0lOSVRJQUxfU0lMRU5DRSwKICAgICAgICAgU1RBVEVfTUVBU1VSSU5HX0dBSU4sCiAgICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0UsCkBAIC02NDgsNiArNzg5LDM1IEBACiAgICAgICAgIFNUQVRFX0ZBSUxFRAogICAgIH07CiAKKyAgICBjb25zdCBjaGFyICpjb252ZXJ0U3RhdGVUb1RleHQoZWNob19zdGF0ZSBzdGF0ZSkgeworICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQgPSAiVW5rbm93biI7CisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURV9JTklUSUFMX1NJTEVOQ0U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIklOSVQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJJTkdfR0FJTjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiR0FJTiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlNJTEVOQ0UiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9TRU5ESU5HX1BVTFNFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJQVUxTRSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0dBVEhFUklOR19FQ0hPUzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRUNIT1MiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9ET05FOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJET05FIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKICAgICBpbnQzMl90ICAgICAgICAgbURvd25Db3VudGVyID0gNTAwOwogICAgIGludDMyX3QgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOwogICAgIGludDMyX3QgICAgICAgICBtU2FtcGxlSW5kZXggPSAwOwpAQCAtNjU2LDcgKzgyNiw3IEBACiAgICAgZmxvYXQgICAgICAgICAgIG1NZWFzdXJlZExvb3BHYWluID0gMC4wZjsKICAgICBmbG9hdCAgICAgICAgICAgbURlc2lyZWRFY2hvR2FpbiA9IDAuOTVmOwogICAgIGZsb2F0ICAgICAgICAgICBtRWNob0dhaW4gPSAxLjBmOwotICAgIGVjaG9fc3RhdGVfdCAgICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7CisgICAgZWNob19zdGF0ZSAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOSVRJQUxfU0lMRU5DRTsKIAogICAgIEF1ZGlvUmVjb3JkaW5nICBtQXVkaW9SZWNvcmRpbmc7IC8vIGNvbnRhaW5zIG9ubHkgdGhlIGlucHV0IGFmdGVyIHRoZSBnYWluIGRldGVjdGlvbiBidXJzdAogICAgIExhdGVuY3lSZXBvcnQgICBtTGF0ZW5jeVJlcG9ydDsKQEAgLTY3NCwyNyArODQ0LDM4IEBACiBjbGFzcyBTaW5lQW5hbHl6ZXIgOiBwdWJsaWMgTG9vcGJhY2tQcm9jZXNzb3IgewogcHVibGljOgogCi0gICAgdmlydHVhbCBpbnQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0xPQ0tFRCA/IDAgOiAtMTsKLSAgICB9Ci0KICAgICB2b2lkIHJlcG9ydCgpIG92ZXJyaWRlIHsKICAgICAgICAgcHJpbnRmKCJTaW5lQW5hbHl6ZXIgLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsuYW1wbGl0dWRlICAgICA9ICU3LjVmXG4iLCBtUGVha0FtcGxpdHVkZSk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLm1hZ25pdHVkZSAgICAgPSAlNy41ZlxuIiwgbU1hZ25pdHVkZSk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJwaGFzZS5vZmZzZXQgICAgICAgPSAlNy41ZlxuIiwgbVBoYXNlT2Zmc2V0KTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInJlZi5waGFzZSAgICAgICAgICA9ICU3LjVmXG4iLCBtUGhhc2UpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWVzLmFjY3VtdWxhdGVkID0gJTZkXG4iLCBtRnJhbWVzQWNjdW11bGF0ZWQpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5wZXJpb2QgICAgICAgID0gJTZkXG4iLCBtU2luZVBlcmlvZCk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgPSAlNmRcbiIsIG1TdGF0ZSk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJmcmFtZS5jb3VudCAgICAgICAgPSAlNmRcbiIsIG1GcmFtZUNvdW50ZXIpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGVhay5hbXBsaXR1ZGUgICAgID0gJThmXG4iLCBtUGVha0FtcGxpdHVkZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLm1hZ25pdHVkZSAgICAgPSAlOGZcbiIsIG1NYWduaXR1ZGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGVhay5ub2lzZSAgICAgICAgID0gJThmXG4iLCBtUGVha05vaXNlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInJtcy5ub2lzZSAgICAgICAgICA9ICU4ZlxuIiwgbVJvb3RNZWFuU3F1YXJlTm9pc2UpOworICAgICAgICBmbG9hdCBhbXBsaXR1ZGVSYXRpbyA9IG1NYWduaXR1ZGUgLyBtUGVha05vaXNlOworICAgICAgICBmbG9hdCBzaWduYWxUb05vaXNlID0gYW1wbGl0dWRlUmF0aW8gKiBhbXBsaXR1ZGVSYXRpbzsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpZ25hbC50by5ub2lzZSAgICA9ICU4LjJmXG4iLCBzaWduYWxUb05vaXNlKTsKKyAgICAgICAgZmxvYXQgc2lnbmFsVG9Ob2lzZURCID0gMTAuMCAqIGxvZyhzaWduYWxUb05vaXNlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpZ25hbC50by5ub2lzZS5kYiA9ICU4LjJmXG4iLCBzaWduYWxUb05vaXNlREIpOworICAgICAgICBpZiAoc2lnbmFsVG9Ob2lzZURCIDwgTUlOX1NOUkFUSU9fREIpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBzaWduYWwgdG8gbm9pc2UgcmF0aW8gaXMgdG9vIGxvdyEgPCAlZCBkQi4gQWRqdXN0IHZvbHVtZS5cbiIsIE1JTl9TTlJBVElPX0RCKTsKKyAgICAgICAgICAgIHNldFJlc3VsdChFUlJPUl9OT0lTWSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lcy5hY2N1bXVsYXRlZCA9ICU4ZFxuIiwgbUZyYW1lc0FjY3VtdWxhdGVkKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICU4ZFxuIiwgbVNpbmVQZXJpb2QpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgID0gJThkXG4iLCBtU3RhdGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgID0gJThkXG4iLCBtRnJhbWVDb3VudGVyKTsKICAgICAgICAgLy8gRGlkIHdlIGV2ZXIgZ2V0IGEgbG9jaz8KICAgICAgICAgYm9vbCBnb3RMb2NrID0gKG1TdGF0ZSA9PSBTVEFURV9MT0NLRUQpIHx8IChtR2xpdGNoQ291bnQgPiAwKTsKICAgICAgICAgaWYgKCFnb3RMb2NrKSB7CiAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gZmFpbGVkIHRvIGxvY2sgb24gcmVmZXJlbmNlIHNpbmUgdG9uZVxuIik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfTk9fTE9DSyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPbmx5IHByaW50IGlmIG1lYW5pbmdmdWwuCi0gICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZ2xpdGNoLmNvdW50ICAgICAgID0gJTZkXG4iLCBtR2xpdGNoQ291bnQpOworICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImdsaXRjaC5jb3VudCAgICAgICA9ICU4ZFxuIiwgbUdsaXRjaENvdW50KTsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJtYXguZ2xpdGNoICAgICAgICAgPSAlOGZcbiIsIG1NYXhHbGl0Y2hEZWx0YSk7CisgICAgICAgICAgICBpZiAobUdsaXRjaENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBudW1iZXIgb2YgZ2xpdGNoZXMgPiAwXG4iKTsKKyAgICAgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfR0xJVENIRVMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03MjEsOSArOTAyLDEwIEBACiAgICAgICogQHBhcmFtIGlucHV0RGF0YSBjb250YWlucyBtaWNyb3Bob25lIGRhdGEgd2l0aCBzaW5lIHNpZ25hbCBmZWVkYmFjawogICAgICAqIEBwYXJhbSBvdXRwdXREYXRhIGNvbnRhaW5zIHRoZSByZWZlcmVuY2Ugc2luZSB3YXZlCiAgICAgICovCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcHJvY2Vzc19yZXN1bHQgcmVzdWx0ID0gUFJPQ0VTU19SRVNVTFRfT0s7CiAgICAgICAgIG1Qcm9jZXNzQ291bnQrKzsKIAogICAgICAgICBmbG9hdCBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKQEAgLTczMiwxNSArOTE0LDQ4IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBib29sIHNpbmVFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IGlucHV0RGF0YVtpICogaW5wdXRDaGFubmVsQ291bnRdOwogCiAgICAgICAgICAgICBmbG9hdCBzaW5PdXQgPSBzaW5mKG1QaGFzZSk7CiAKICAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOgorICAgICAgICAgICAgICAgICAgICBzaW5lRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXItLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NRUFTVVJFX05PSVNFOworICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gTk9JU0VfRlJBTUVfQ09VTlQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJFX05PSVNFOgorICAgICAgICAgICAgICAgICAgICBzaW5lRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtUGVha05vaXNlID0gc3RkOjptYXgoYWJzKHNhbXBsZSksIG1QZWFrTm9pc2UpOworICAgICAgICAgICAgICAgICAgICBtTm9pc2VTdW1TcXVhcmVkICs9IHNhbXBsZSAqIHNhbXBsZTsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgbVJvb3RNZWFuU3F1YXJlTm9pc2UgPSBzcXJ0KG1Ob2lzZVN1bVNxdWFyZWQgLyBOT0lTRV9GUkFNRV9DT1VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG9sZXJhbmNlID0gc3RkOjptYXgoTUlOX1RPTEVSQU5DRSwgbVBlYWtOb2lzZSAqIDIuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBoYXNlID0gMC4wOyAvLyBwcmV2ZW50IHNwaWtlIGF0IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0lNTVVORToKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChwZWFrID4gbVRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfTE9DSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLXG4iLCBtRnJhbWVDb3VudGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfTE9DSzoKICAgICAgICAgICAgICAgICAgICAgbVNpbkFjY3VtdWxhdG9yICs9IHNhbXBsZSAqIHNpbk91dDsKICAgICAgICAgICAgICAgICAgICAgbUNvc0FjY3VtdWxhdG9yICs9IHNhbXBsZSAqIGNvc2YobVBoYXNlKTsKQEAgLTc2NiwxMyArOTgxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50ZigiICAgIHByZWRpY3RlZCA9ICVmLCBhY3R1YWwgPSAlZlxuIiwgcHJlZGljdGVkLCBzYW1wbGUpOwogCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpZmYgPSBwcmVkaWN0ZWQgLSBzYW1wbGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWJzKGRpZmYpID4gbVRvbGVyYW5jZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhYnNEaWZmID0gZmFicyhkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgbU1heEdsaXRjaERlbHRhID0gc3RkOjptYXgobU1heEdsaXRjaERlbHRhLCBhYnNEaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFic0RpZmYgPiBtVG9sZXJhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtR2xpdGNoQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX0dMSVRDSDsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IEdvdCBhIGdsaXRjaCAjICVkLCBwcmVkaWN0ZWQgPSAlZiwgYWN0dWFsID0gJWZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBtRnJhbWVDb3VudGVyLCBtR2xpdGNoQ291bnQsIHByZWRpY3RlZCwgc2FtcGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9JTU1VTkVcbiIsIG1GcmFtZUNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gbVNpbmVQZXJpb2Q7ICAvLyBTZXQgZHVyYXRpb24gb2YgSU1NVU5FIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gbVNpbmVQZXJpb2QgKiBQRVJJT0RTX0lNTVVORTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGluY29taW5nIHNpZ25hbCBhbmQgc2xvd2x5IGFkanVzdCBtYWduaXR1ZGUgdG8gYWNjb3VudApAQCAtNzkyLDQ0ICsxMDA5LDI0IEBACiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgZmxvYXQgb3V0cHV0ID0gMC4wZjsKICAgICAgICAgICAgIC8vIE91dHB1dCBzaW5lIHdhdmUgc28gd2UgY2FuIG1lYXN1cmUgaXQuCi0gICAgICAgICAgICBvdXRwdXREYXRhW2kgKiBvdXRwdXRDaGFubmVsQ291bnRdID0gKHNpbk91dCAqIG1PdXRwdXRBbXBsaXR1ZGUpCi0gICAgICAgICAgICAgICAgICAgICsgKG1XaGl0ZU5vaXNlLm5leHRSYW5kb21Eb3VibGUoKSAqIG1Ob2lzZUFtcGxpdHVkZSk7Ci0gICAgICAgICAgICAvLyBwcmludGYoIiU1ZDogc2luKCVmKSA9ICVmLCAlZlxuIiwgaSwgbVBoYXNlLCBzaW5PdXQsICBtUGhhc2VJbmNyZW1lbnQpOwotCi0gICAgICAgICAgICAvLyBhZHZhbmNlIGFuZCB3cmFwIHBoYXNlCi0gICAgICAgICAgICBtUGhhc2UgKz0gbVBoYXNlSW5jcmVtZW50OwotICAgICAgICAgICAgaWYgKG1QaGFzZSA+IE1fUEkpIHsKLSAgICAgICAgICAgICAgICBtUGhhc2UgLT0gKDIuMCAqIE1fUEkpOworICAgICAgICAgICAgaWYgKHNpbmVFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gKHNpbk91dCAqIG1PdXRwdXRBbXBsaXR1ZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAobVdoaXRlTm9pc2UubmV4dFJhbmRvbURvdWJsZSgpICogbU5vaXNlQW1wbGl0dWRlKTsKKyAgICAgICAgICAgICAgICAvLyBwcmludGYoIiU1ZDogc2luKCVmKSA9ICVmLCAlZlxuIiwgaSwgbVBoYXNlLCBzaW5PdXQsICBtUGhhc2VJbmNyZW1lbnQpOworICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgYW5kIHdyYXAgcGhhc2UKKyAgICAgICAgICAgICAgICBtUGhhc2UgKz0gbVBoYXNlSW5jcmVtZW50OworICAgICAgICAgICAgICAgIGlmIChtUGhhc2UgPiBNX1BJKSB7CisgICAgICAgICAgICAgICAgICAgIG1QaGFzZSAtPSAoMi4wICogTV9QSSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0RGF0YVtpICogb3V0cHV0Q2hhbm5lbENvdW50XSA9IG91dHB1dDsKKwogCiAgICAgICAgICAgICBtRnJhbWVDb3VudGVyKys7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBEbyB0aGVzZSBvbmNlIHBlciBidWZmZXIuCi0gICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOyAvLyBzbyB3ZSBjYW4gdGVsbCB3aGVuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lNTVVORToKLSAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgLT0gbnVtRnJhbWVzOwotICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw7Ci0gICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUxcbiIsIG1GcmFtZUNvdW50ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOgotICAgICAgICAgICAgICAgIGlmIChwZWFrID4gbVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOwotICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfTE9DS1xuIiwgbUZyYW1lQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0xPQ0tFRDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgdm9pZCByZXNldEFjY3VtdWxhdG9yKCkgewpAQCAtODQwLDE4ICsxMDM3LDMxIEBACiAKICAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgewogICAgICAgICBtR2xpdGNoQ291bnQgPSAwOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7Ci0gICAgICAgIG1Eb3duQ291bnRlciA9IElNTVVORV9GUkFNRV9DT1VOVDsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKKyAgICAgICAgbURvd25Db3VudGVyID0gSURMRV9GUkFNRV9DT1VOVDsKICAgICAgICAgbVBoYXNlSW5jcmVtZW50ID0gMi4wICogTV9QSSAvIG1TaW5lUGVyaW9kOwogICAgICAgICBwcmludGYoInBoYXNlSW5jID0gJWYgZm9yIHBlcmlvZCAlZFxuIiwgbVBoYXNlSW5jcmVtZW50LCBtU2luZVBlcmlvZCk7CiAgICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKICAgICAgICAgbVByb2Nlc3NDb3VudCA9IDA7CisgICAgICAgIG1QZWFrTm9pc2UgPSAwLjBmOworICAgICAgICBtTm9pc2VTdW1TcXVhcmVkID0gMC4wOworICAgICAgICBtUm9vdE1lYW5TcXVhcmVOb2lzZSA9IDAuMDsKKyAgICAgICAgbVBoYXNlID0gMC4wZjsKKyAgICAgICAgbU1heEdsaXRjaERlbHRhID0gMC4wOwogICAgIH0KIAogcHJpdmF0ZToKIAorICAgIGVudW0gZXJyb3JfY29kZSB7CisgICAgICAgIE9LLAorICAgICAgICBFUlJPUl9OT19MT0NLID0gLTgwLAorICAgICAgICBFUlJPUl9HTElUQ0hFUywKKyAgICAgICAgRVJST1JfTk9JU1kKKyAgICB9OworCiAgICAgZW51bSBzaW5lX3N0YXRlX3QgewogICAgICAgICBTVEFURV9JRExFLAorICAgICAgICBTVEFURV9NRUFTVVJFX05PSVNFLAogICAgICAgICBTVEFURV9JTU1VTkUsCiAgICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTCwKICAgICAgICAgU1RBVEVfV0FJVElOR19GT1JfTE9DSywKQEAgLTg1OSwxMCArMTA2OSwxNiBAQAogICAgIH07CiAKICAgICBlbnVtIGNvbnN0YW50cyB7Ci0gICAgICAgIElNTVVORV9GUkFNRV9DT1VOVCA9IDQ4ICogNTAwLAotICAgICAgICBQRVJJT0RTX05FRURFRF9GT1JfTE9DSyA9IDgKKyAgICAgICAgLy8gQXJiaXRyYXJ5IGR1cmF0aW9ucywgYXNzdW1pbmcgNDgwMDAgSHoKKyAgICAgICAgSURMRV9GUkFNRV9DT1VOVCA9IDQ4ICogMTAwLAorICAgICAgICBOT0lTRV9GUkFNRV9DT1VOVCA9IDQ4ICogNjAwLAorICAgICAgICBQRVJJT0RTX05FRURFRF9GT1JfTE9DSyA9IDgsCisgICAgICAgIFBFUklPRFNfSU1NVU5FID0gMiwKKyAgICAgICAgTUlOX1NOUkFUSU9fREIgPSA2NQogICAgIH07CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IE1JTl9UT0xFUkFOQ0UgPSAwLjAxOworCiAgICAgaW50ICAgICBtU2luZVBlcmlvZCA9IDc5OwogICAgIGRvdWJsZSAgbVBoYXNlSW5jcmVtZW50ID0gMC4wOwogICAgIGRvdWJsZSAgbVBoYXNlID0gMC4wOwpAQCAtODcwLDI1ICsxMDg2LDI5IEBACiAgICAgZG91YmxlICBtUHJldmlvdXNQaGFzZU9mZnNldCA9IDAuMDsKICAgICBkb3VibGUgIG1NYWduaXR1ZGUgPSAwLjA7CiAgICAgZG91YmxlICBtVGhyZXNob2xkID0gMC4wMDU7Ci0gICAgZG91YmxlICBtVG9sZXJhbmNlID0gMC4wMTsKKyAgICBkb3VibGUgIG1Ub2xlcmFuY2UgPSBNSU5fVE9MRVJBTkNFOwogICAgIGludDMyX3QgbUZyYW1lc0FjY3VtdWxhdGVkID0gMDsKICAgICBpbnQzMl90IG1Qcm9jZXNzQ291bnQgPSAwOwogICAgIGRvdWJsZSAgbVNpbkFjY3VtdWxhdG9yID0gMC4wOwogICAgIGRvdWJsZSAgbUNvc0FjY3VtdWxhdG9yID0gMC4wOworICAgIGZsb2F0ICAgbU1heEdsaXRjaERlbHRhID0gMC4wZjsKICAgICBpbnQzMl90IG1HbGl0Y2hDb3VudCA9IDA7CiAgICAgZG91YmxlICBtUGVha0FtcGxpdHVkZSA9IDAuMDsKLSAgICBpbnQgICAgIG1Eb3duQ291bnRlciA9IElNTVVORV9GUkFNRV9DT1VOVDsKKyAgICBpbnQgICAgIG1Eb3duQ291bnRlciA9IElETEVfRlJBTUVfQ09VTlQ7CiAgICAgaW50MzJfdCBtRnJhbWVDb3VudGVyID0gMDsKICAgICBmbG9hdCAgIG1PdXRwdXRBbXBsaXR1ZGUgPSAwLjc1OwogCisgICAgLy8gbWVhc3VyZSBiYWNrZ3JvdW5kIG5vaXNlCisgICAgZmxvYXQgICBtUGVha05vaXNlID0gMC4wZjsKKyAgICBkb3VibGUgIG1Ob2lzZVN1bVNxdWFyZWQgPSAwLjA7CisgICAgZG91YmxlICBtUm9vdE1lYW5TcXVhcmVOb2lzZSA9IDAuMDsKKwogICAgIFBzZXVkb1JhbmRvbSAgbVdoaXRlTm9pc2U7CiAgICAgZmxvYXQgICBtTm9pc2VBbXBsaXR1ZGUgPSAwLjAwOyAvLyBVc2VkIHRvIGV4cGVyaW1lbnQgd2l0aCB3YXJibGluZyBjYXVzZWQgYnkgRFJDLgogCiAgICAgc2luZV9zdGF0ZV90ICBtU3RhdGUgPSBTVEFURV9JRExFOwogfTsKIAotCi0jdW5kZWYgTE9PUEJBQ0tfU0FNUExFX1JBVEUKICN1bmRlZiBMT09QQkFDS19SRVNVTFRfVEFHCiAKICNlbmRpZiAvKiBBQVVESU9fRVhBTVBMRVNfTE9PUEJBQ0tfQU5BTFlTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAppbmRleCA5MWViZjczLi40OWQ5MjFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcApAQCAtMzQsMjEgKzM0LDMyIEBACiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJMb29wYmFja0FuYWx5emVyLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCisKKy8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCBhdXRvLWNvcnJlbGF0ZSBlbnRpcmUgZWNobworLy8gVjAuNC4wMSA9IGFkZCAtaCBoYW5nIG9wdGlvbgorLy8gICAgICAgICAgIGZpeCAtbiBvcHRpb24gdG8gc2V0IG91dHB1dCBidWZmZXIgZm9yIC10bQorLy8gICAgICAgICAgIHBsb3QgZmlyc3QgZ2xpdGNoCisvLyBWMC40LjAyID0gYWxsb3cgLW4wIGZvciBtaW5pbWFsIGJ1ZmZlciBzaXplCisjZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjQuMDIiCiAKIC8vIFRhZyBmb3IgbWFjaGluZSByZWFkYWJsZSByZXN1bHRzIGFzIHByb3BlcnR5ID0gdmFsdWUgcGFpcnMKICNkZWZpbmUgUkVTVUxUX1RBRyAgICAgICAgICAgICAgIlJFU1VMVDogIgotI2RlZmluZSBOVU1fU0VDT05EUyAgICAgICAgICAgICA1Ci0jZGVmaW5lIFBFUklPRF9NSUxMSVMgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgTlVNX0lOUFVUX0NIQU5ORUxTICAgICAgMQogI2RlZmluZSBGSUxFTkFNRV9BTEwgICAgICAgICAgICAiL2RhdGEvbG9vcGJhY2tfYWxsLndhdiIKICNkZWZpbmUgRklMRU5BTUVfRUNIT1MgICAgICAgICAgIi9kYXRhL2xvb3BiYWNrX2VjaG9zLndhdiIKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuMi4wNCIKKyNkZWZpbmUgRklMRU5BTUVfUFJPQ0VTU0VEICAgICAgIi9kYXRhL2xvb3BiYWNrX3Byb2Nlc3NlZC53YXYiCiAKK2NvbnN0ZXhwciBpbnQga0xvZ1BlcmlvZE1pbGxpcyAgICAgICA9IDEwMDA7Citjb25zdGV4cHIgaW50IGtOdW1JbnB1dENoYW5uZWxzICAgICAgPSAxOwogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EcmFpbiAgID0gMjA7Citjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb05vdFJlYWQgPSAwOyAvLyBsZXQgaW5wdXQgZmlsbCBiYWNrIHVwCiBjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQgPSAyMDsKK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRIYW5nVGltZU1pbGxpcyA9IDUwOworY29uc3RleHByIGludCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlID0gMzI7CiAKIHN0cnVjdCBMb29wYmFja0RhdGEgewogICAgIEFBdWRpb1N0cmVhbSAgICAgICppbnB1dFN0cmVhbSA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgKm91dHB1dFN0cmVhbSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGlucHV0RnJhbWVzTWF4aW11bSA9IDA7CiAgICAgaW50MTZfdCAgICAgICAgICAgKmlucHV0U2hvcnREYXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCAgICAgICAgICAgICAqaW5wdXRGbG9hdERhdGEgPSBudWxscHRyOwpAQCAtNTYsNiArNjcsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxJbnB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbE91dHB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRHJhaW4gPSBrTnVtQ2FsbGJhY2tzVG9EcmFpbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID0ga051bUNhbGxiYWNrc1RvTm90UmVhZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0ga051bUNhbGxiYWNrc1RvRGlzY2FyZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwogICAgIGludDMyX3QgICAgICAgICAgICBtYXhOdW1GcmFtZXMgPSAwOwpAQCAtNjMsNiArNzUsOSBAQAogICAgIGludDMyX3QgICAgICAgICAgICBpbnN1ZmZpY2llbnRSZWFkRnJhbWVzID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzUmVhZFRvdGFsID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzV3JpdHRlblRvdGFsID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1BlcmlvZE1pbGxpcyA9IDUgKiAxMDAwOyAvLyB0aW1lIGJldHdlZW4gaGFuZ3MKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyA9IDUgKiA0ODAwMDsgLy8gZnJhbWVzIHRpbCBuZXh0IGhhbmcKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSAwOyAvLyAwIGZvciBubyBoYW5nCiAgICAgYm9vbCAgICAgICAgICAgICAgIGlzRG9uZSA9IGZhbHNlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIGlucHV0RXJyb3IgPSBBQVVESU9fT0s7CkBAIC03Miw2ICs4NywyOSBAQAogICAgIEVjaG9BbmFseXplciAgICAgICBlY2hvQW5hbHl6ZXI7CiAgICAgQXVkaW9SZWNvcmRpbmcgICAgIGF1ZGlvUmVjb3JkaW5nOwogICAgIExvb3BiYWNrUHJvY2Vzc29yICpsb29wYmFja1Byb2Nlc3NvcjsKKworICAgIGludDMyX3QgICAgICAgICAgICBnbGl0Y2hGcmFtZXNba01heEdsaXRjaEV2ZW50c1RvU2F2ZV07CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUdsaXRjaEV2ZW50cyA9IDA7CisKKyAgICB2b2lkIGhhbmdJZlJlcXVlc3RlZChpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBpZiAoaGFuZ1RpbWVNaWxsaXMgPiAwKSB7CisgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgIGlmIChoYW5nQ291bnRkb3duRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0TmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIHVzbGVlcChoYW5nVGltZU1pbGxpcyAqIDEwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZW5kTmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZWxhcHNlZE1pY3JvcyA9IChpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICAgICAgKChlbmROYW5vcyAtIHN0YXJ0TmFub3MpIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjYWxsYmFjayBoYW5naW5nIGZvciAlZCBtaWxsaXMsIGFjdHVhbCA9ICVkIG1pY3Jvc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMsIGVsYXBzZWRNaWNyb3MpOworICAgICAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgPSAoaW50NjRfdCkgaGFuZ1BlcmlvZE1pbGxpcworICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShvdXRwdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAvIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQogfTsKIAogc3RhdGljIHZvaWQgY29udmVydFBjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCkBAIC0xMDMsOSArMTQxLDE0IEBACiAgICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgfQogICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgewotICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOwotICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAotICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgICAgICAvLyBFeHBlY3QgSU5WQUxJRF9TVEFURSBpZiBTVEFURV9TVEFSVElORworICAgICAgICBpZiAobXlEYXRhLT5mcmFtZXNSZWFkVG90YWwgPiAwKSB7CisgICAgICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQgPSAlc1xuIiwgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChmcmFtZXNSZWFkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsICs9IGZyYW1lc1JlYWQ7CiAgICAgfQpAQCAtMTQ3LDggKzE5MCwxMCBAQAogICAgICAgICBpbnQzMl90IHRvdGFsRnJhbWVzUmVhZCA9IDA7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCkgeworICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgdG90YWxGcmFtZXNSZWFkICs9IGFjdHVhbEZyYW1lc1JlYWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBiZWNhdXNlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LgogICAgICAgICB9IHdoaWxlIChhY3R1YWxGcmFtZXNSZWFkID4gMCk7CkBAIC0xNTcsNiArMjAyLDkgQEAKICAgICAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbi0tOwogICAgICAgICB9CiAKKyAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID4gMCkgeworICAgICAgICAvLyBMZXQgdGhlIGlucHV0IGZpbGwgdXAgYSBiaXQgc28gd2UgYXJlIG5vdCBzbyBjbG9zZSB0byB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb05vdFJlYWQtLTsKICAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkID4gMCkgewogICAgICAgICAvLyBJZ25vcmUuIEFsbG93IHRoZSBpbnB1dCB0byBmaWxsIGJhY2sgdXAgdG8gZXF1aWxpYnJpdW0gd2l0aCB0aGUgb3V0cHV0LgogICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOwpAQCAtMTY2LDYgKzIxNCw3IEBACiAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkLS07CiAKICAgICB9IGVsc2UgeworICAgICAgICBteURhdGEtPmhhbmdJZlJlcXVlc3RlZChudW1GcmFtZXMpOwogCiAgICAgICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IG51bUZyYW1lcyAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICBtZW1zZXQobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtSW5wdXRCeXRlcyk7CkBAIC0xNzQsMTQgKzIyMywxNSBAQAogICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG15RGF0YS0+aW5wdXRTdHJlYW0pOwogICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0pOwogICAgICAgICBpbnQ2NF90IGZyYW1lc0F2YWlsYWJsZSA9IGlucHV0RnJhbWVzV3JpdHRlbiAtIGlucHV0RnJhbWVzUmVhZDsKLSAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKKworICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOyAvLyBSRUFECiAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICB9IGVsc2UgewogCiAgICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IG51bUZyYW1lcykgewogICAgICAgICAgICAgICAgIGlmKGFjdHVhbEZyYW1lc1JlYWQgPCAoaW50MzJfdCkgZnJhbWVzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGJ1dCBudW1GcmFtZXMgPSAlZCIKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgZm9yIG5vIHJlYXNvbiwgbnVtRnJhbWVzID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFjdHVhbEZyYW1lc1JlYWQgPSAlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaW5wdXRGcmFtZXNXcml0dGVuID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzUmVhZCA9ICVkIgpAQCAtMTk0LDYgKzI0NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG15RGF0YS0+aW5zdWZmaWNpZW50UmVhZENvdW50Kys7CiAgICAgICAgICAgICAgICAgbXlEYXRhLT5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzICs9IG51bUZyYW1lcyAtIGFjdHVhbEZyYW1lc1JlYWQ7IC8vIGRlZmljaXQKKyAgICAgICAgICAgICAgICAvLyBwcmludGYoIkVycm9yIGluc3VmZmljaWVudFJlYWRDb3VudCA9ICVkXG4iLChpbnQpbXlEYXRhLT5pbnN1ZmZpY2llbnRSZWFkQ291bnQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBhY3R1YWxGcmFtZXNSZWFkICogbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudDsKQEAgLTIwMSwxNiArMjUyLDI1IEBACiAgICAgICAgICAgICBpZiAobXlEYXRhLT5hY3R1YWxJbnB1dEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKICAgICAgICAgICAgICAgICBjb252ZXJ0UGNtMTZUb0Zsb2F0KG15RGF0YS0+aW5wdXRTaG9ydERhdGEsIG15RGF0YS0+aW5wdXRGbG9hdERhdGEsIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIuCi0gICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLndyaXRlKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKICAgICAgICAgICAgIC8vIEFuYWx5emUgdGhlIGRhdGEuCi0gICAgICAgICAgICBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5wcm9jZXNzKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6cHJvY2Vzc19yZXN1bHQgcHJvY1Jlc3VsdCA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxPdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKKyAgICAgICAgICAgIGlmIChwcm9jUmVzdWx0ID09IExvb3BiYWNrUHJvY2Vzc29yOjpQUk9DRVNTX1JFU1VMVF9HTElUQ0gpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlEYXRhLT5udW1HbGl0Y2hFdmVudHMgPCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+Z2xpdGNoRnJhbWVzW215RGF0YS0+bnVtR2xpdGNoRXZlbnRzKytdID0gbXlEYXRhLT5hdWRpb1JlY29yZGluZy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlci4KKyAgICAgICAgICAgIG15RGF0YS0+YXVkaW9SZWNvcmRpbmcud3JpdGUobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCk7CisKICAgICAgICAgICAgIG15RGF0YS0+aXNEb25lID0gbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+aXNEb25lKCk7CiAgICAgICAgICAgICBpZiAobXlEYXRhLT5pc0RvbmUpIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CkBAIC0yMzYsOCArMjk2LDEwIEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1Ce2ZyYW1lc30gICAgICAgIGlucHV0IGNhcGFjaXR5IGluIGZyYW1lc1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtQ3tjaGFubmVsc30gICAgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHNcbiIpOworICAgIHByaW50ZigiICAgICAgLUR7ZGV2aWNlSWR9ICAgICAgaW5wdXQgZGV2aWNlIElEXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1GezAsMSwyfSAgICAgICAgIGlucHV0IGZvcm1hdCwgMT1JMTYsIDI9RkxPQVRcbiIpOwogICAgIHByaW50ZigiICAgICAgLWd7Z2Fpbn0gICAgICAgICAgcmVjaXJjdWxhdGluZyBsb29wYmFjayBnYWluXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe2hhbmdNaWxsaXN9ICAgIG9jY2FzaW9uYWxseSBoYW5nIGluIHRoZSBjYWxsYmFja1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtUHtpblBlcmZ9ICAgICAgICBzZXQgaW5wdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CiAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMjk2LDkgKzM1OCw3IEBACiAgICAgcmV0dXJuIHRlc3RNb2RlOwogfQogCi12b2lkIHByaW50QXVkaW9HcmFwaChBdWRpb1JlY29yZGluZyAmcmVjb3JkaW5nLCBpbnQgbnVtU2FtcGxlcykgewotICAgIGludDMyX3Qgc3RhcnQgPSByZWNvcmRpbmcuc2l6ZSgpIC8gMjsKLSAgICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbnVtU2FtcGxlczsKK3ZvaWQgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKSB7CiAgICAgaWYgKGVuZCA+PSByZWNvcmRpbmcuc2l6ZSgpKSB7CiAgICAgICAgIGVuZCA9IHJlY29yZGluZy5zaXplKCkgLSAxOwogICAgIH0KQEAgLTMzNSwxMyArMzk1LDE0IEBACiAgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKm91dHB1dFN0cmVhbSAgICAgICAgICAgICAgID0gbnVsbHB0cjsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGludCAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IE5VTV9JTlBVVF9DSEFOTkVMUzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBrTnVtSW5wdXRDaGFubmVsczsKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgcmVxdWVzdGVkSW5wdXRGb3JtYXQgICAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENhcGFjaXR5ICAgICA9IC0xOworICAgIGludDMyX3QgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENhcGFjaXR5ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGlucHV0UGVyZm9ybWFuY2VMZXZlbCAgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICBvdXRwdXRGcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIG91dHB1dEZyYW1lc1BlckJ1cnN0ICAgICAgID0gMDsKIAogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgICAgICAgICA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSAgICAgICAgICAgPSAwOwpAQCAtMzQ5LDYgKzQxMCw3IEBACiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgdGVzdE1vZGUgICAgICAgICAgICAgICAgICAgPSBURVNUX0VDSE9fTEFURU5DWTsKICAgICBkb3VibGUgICAgICAgICAgICAgICAgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgPSAxLjA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzICAgICAgICAgICAgID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgpAQCAtMzU2LDYgKzQxOCw5IEBACiAKICAgICBwcmludGYoIiVzIC0gQXVkaW8gbG9vcGJhY2sgdXNpbmcgQUF1ZGlvIFYiIEFQUF9WRVJTSU9OICJcbiIsIGFyZ3ZbMF0pOwogCisgICAgLy8gVXNlIExPV19MQVRFTkNZIGFzIHRoZSBkZWZhdWx0IHRvIG1hdGNoIGlucHV0IGRlZmF1bHQuCisgICAgYXJnUGFyc2VyLnNldFBlcmZvcm1hbmNlTW9kZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CisKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwogICAgICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJnKGFyZykpIHsKQEAgLTM2OSwxMiArNDM0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXREZXZpY2VJZCA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICBnYWluID0gYXRvZigmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhcyB0aGVyZSBhIG51bWJlciBhZnRlciB0aGUgIi1oIj8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdbMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIG51bWJlciB0aGVuIHVzZSB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyA9IGtEZWZhdWx0SGFuZ1RpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgPSBwYXJzZVBlcmZvcm1hbmNlTW9kZShhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MDQsMTAgKzQ4MSwxMiBAQAogICAgIH0KIAogICAgIGludDMyX3QgcmVxdWVzdGVkRHVyYXRpb24gPSBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCk7Ci0gICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcyA9IHJlcXVlc3RlZER1cmF0aW9uICogTUlMTElTX1BFUl9TRUNPTkQ7CisgICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcyA9IHJlcXVlc3RlZER1cmF0aW9uICoga01pbGxpc1BlclNlY29uZDsKICAgICBpbnQzMl90IHRpbWVNaWxsaXMgPSAwOwogICAgIGludDMyX3QgcmVjb3JkaW5nRHVyYXRpb24gPSBzdGQ6Om1pbig2MCAqIDUsIHJlcXVlc3RlZER1cmF0aW9uKTsKIAorICAgIGludDMyX3QgcmVxdWVzdGVkT3V0cHV0QnVyc3RzID0gYXJnUGFyc2VyLmdldE51bWJlck9mQnVyc3RzKCk7CisKICAgICBzd2l0Y2godGVzdE1vZGUpIHsKICAgICAgICAgY2FzZSBURVNUX1NJTkVfTUFHTklUVURFOgogICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yID0gJmxvb3BiYWNrRGF0YS5zaW5lQW5hbHl6ZXI7CkBAIC00MjEsOSArNTAwLDExIEBACiAKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuZWNob0FuYWx5emVyOwogICAgICAgICAgICAgaW50IHJlYWQgPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmxvYWQoRklMRU5BTUVfRUNIT1MpOwotICAgICAgICAgICAgcHJpbnRmKCJtYWluKCkgcmVhZCAlZCBtb25vIHNhbXBsZXMgZnJvbSAlcyBvbiBBbmRyb2lkIGRldmljZVxuIiwgcmVhZCwgRklMRU5BTUVfRUNIT1MpOworICAgICAgICAgICAgcHJpbnRmKCJtYWluKCkgcmVhZCAlZCBtb25vIHNhbXBsZXMgZnJvbSAlcyBvbiBBbmRyb2lkIGRldmljZSwgcmF0ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHJlYWQsIEZJTEVOQU1FX0VDSE9TLAorICAgICAgICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVwb3J0KCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGdvdG8gcmVwb3J0X3Jlc3VsdDsKICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MzcsNyArNTE4LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwogICAgICAgICBleGl0KDEpOwogICAgIH0KLSAgICBvdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CisgICAgb3V0cHV0U3RyZWFtID0gbG9vcGJhY2tEYXRhLm91dHB1dFN0cmVhbSA9IHBsYXllci5nZXRTdHJlYW0oKTsKIAogICAgIGFjdHVhbE91dHB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQob3V0cHV0U3RyZWFtKTsKICAgICBpZiAoYWN0dWFsT3V0cHV0Rm9ybWF0ICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CkBAIC00NTQsMjAgKzUzNSwxNiBAQAogCiAgICAgcHJpbnRmKCJJTlBVVCAgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgIC8vIFVzZSBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3IgdGhlIGlucHV0LgotICAgIGFyZ1BhcnNlci5zZXROdW1iZXJPZkJ1cnN0cyhBQVVESU9fVU5TUEVDSUZJRUQpOworICAgIGFyZ1BhcnNlci5zZXREZXZpY2VJZChyZXF1ZXN0ZWRJbnB1dERldmljZUlkKTsKKyAgICBhcmdQYXJzZXIuc2V0TnVtYmVyT2ZCdXJzdHMoQUF1ZGlvUGFyYW1ldGVyczo6a0RlZmF1bHROdW1iZXJPZkJ1cnN0cyk7CiAgICAgYXJnUGFyc2VyLnNldEZvcm1hdChyZXF1ZXN0ZWRJbnB1dEZvcm1hdCk7CiAgICAgYXJnUGFyc2VyLnNldFBlcmZvcm1hbmNlTW9kZShpbnB1dFBlcmZvcm1hbmNlTGV2ZWwpOwogICAgIGFyZ1BhcnNlci5zZXRDaGFubmVsQ291bnQocmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQpOwogICAgIGFyZ1BhcnNlci5zZXRTaGFyaW5nTW9kZShyZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5wdXQgYnVmZmVyIGhhcyBwbGVudHkgb2YgY2FwYWNpdHkuCi0gICAgLy8gRXh0cmEgY2FwYWNpdHkgb24gaW5wdXQgc2hvdWxkIG5vdCBpbmNyZWFzZSBsYXRlbmN5IGlmIHdlIGtlZXAgaXQgZHJhaW5lZC4KLSAgICBpbnQzMl90IGlucHV0QnVmZmVyQ2FwYWNpdHkgPSByZXF1ZXN0ZWRJbnB1dENhcGFjaXR5OwotICAgIGlmIChpbnB1dEJ1ZmZlckNhcGFjaXR5IDwgMCkgewotICAgICAgICBpbnQzMl90IG91dHB1dEJ1ZmZlckNhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgaW5wdXRCdWZmZXJDYXBhY2l0eSA9IDIgKiBvdXRwdXRCdWZmZXJDYXBhY2l0eTsKKyAgICBpZiAocmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgcHJpbnRmKCJXYXJuaW5nISBJZiB5b3Ugc2V0IGlucHV0IGNhcGFjaXR5IHRoZW4gbWF5YmUgbm8gRkFTVCB0cmFjayBvbiBMZWdhY3kgcGF0aCFcbiIpOwogICAgIH0KLSAgICBhcmdQYXJzZXIuc2V0QnVmZmVyQ2FwYWNpdHkoaW5wdXRCdWZmZXJDYXBhY2l0eSk7CisgICAgYXJnUGFyc2VyLnNldEJ1ZmZlckNhcGFjaXR5KHJlcXVlc3RlZElucHV0Q2FwYWNpdHkpOwogCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbihhcmdQYXJzZXIpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC00NzgsMjQgKzU1NSwyOSBAQAogCiAgICAgewogICAgICAgICBpbnQzMl90IGFjdHVhbENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOwotICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGlucHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotICAgICAgICB9IGVsc2Uge30KLSAgICB9CisgICAgICAgICh2b2lkKSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGlucHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7CiAKLSAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERQorICAgICAgICAgICAgICAgICYmIHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMob3V0cHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhvdXRwdXQpIHJldHVybmVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJPdXRwdXQgYnVmZmVyIHNpemUgc2V0IHRvIG1hdGNoIGlucHV0IGNhcGFjaXR5ID0gJWQgZnJhbWVzIVxuIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBpcyB0b28gc21hbGwgdGhlbiB3ZSBjYW5ub3Qgc2F0aXNmeSB0aGUgb3V0cHV0IGNhbGxiYWNrLgotICAgIHsKLSAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBpcyB0b28gc21hbGwgdGhlbiB3ZSBjYW5ub3Qgc2F0aXNmeSB0aGUgb3V0cHV0IGNhbGxiYWNrLgogICAgICAgICBpZiAoYWN0dWFsQ2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3QpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBpbnB1dCBjYXBhY2l0eSA8IDIgKiBvdXRwdXRGcmFtZXNQZXJCdXJzdFxuIik7CiAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgfQogICAgIH0KIAorICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7CisKICAgICAvLyAtLS0tLS0tIFNldHVwIGxvb3BiYWNrRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoaW5wdXRTdHJlYW0pOwogCkBAIC01MTQsMTggKzU5NiwxNiBAQAogCiAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXNldCgpOwogCisgICAgbG9vcGJhY2tEYXRhLmhhbmdUaW1lTWlsbGlzID0gaGFuZ1RpbWVNaWxsaXM7CisKICAgICAvLyBTdGFydCBPVVRQVVQgZmlyc3Qgc28gSU5QVVQgZG9lcyBub3Qgb3ZlcmZsb3cuCiAgICAgcmVzdWx0ID0gcGxheWVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQob3V0cHV0KSByZXR1cm5lZCAlZCA9ICVzXG4iLAotICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQogCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIuc3RhcnQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChpbnB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIApAQCAtNTY4LDcgKzY0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pCiAgICAgICAgICAgICApOwogICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgcGVyaW9kTWlsbGlzID0gKHRpbWVNaWxsaXMgPCAyMDAwKSA/IFBFUklPRF9NSUxMSVMgLyA0IDogUEVSSU9EX01JTExJUzsKKyAgICAgICAgaW50MzJfdCBwZXJpb2RNaWxsaXMgPSAodGltZU1pbGxpcyA8IDIwMDApID8ga0xvZ1BlcmlvZE1pbGxpcyAvIDQgOiBrTG9nUGVyaW9kTWlsbGlzOwogICAgICAgICB1c2xlZXAocGVyaW9kTWlsbGlzICogMTAwMCk7CiAgICAgICAgIHRpbWVNaWxsaXMgKz0gcGVyaW9kTWlsbGlzOwogICAgIH0KQEAgLTU5MCw0NSArNjcwLDYgQEAKICAgICBwcmludGYoImlucHV0IGVycm9yID0gJWQgPSAlc1xuIiwKICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmlucHV0RXJyb3IsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yKSk7CiAKLSAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFKSB7Ci0gICAgICAgICAgICBwcmludEF1ZGlvR3JhcGgobG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCAyMDApOwotICAgICAgICB9Ci0gICAgICAgIC8vIFByaW50IGFnYWluIHNvIHdlIGRvbid0IGhhdmUgdG8gc2Nyb2xsIHBhc3Qgd2F2ZWZvcm0uCi0gICAgICAgIHByaW50ZigiT1VUUFVUIFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHByaW50ZigiSU5QVVQgIFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKLQotICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoaW5wdXRTdHJlYW0pOwotICAgICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihpbnB1dFN0cmVhbSk7Ci0gICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFVUXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgIGlucHV0IG92ZXJydW5zICAgPSAlZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChpbnB1dFN0cmVhbSkpOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7Ci0gICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKLSAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzUmVhZCAgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNSZWFkVG90YWwpOwotICAgICAgICBwcmludGYoIiAgd3JpdHRlbiAtIHJlYWQgICA9ICU4ZFxuIiwgKGludCkgKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKSk7Ci0gICAgICAgIHByaW50ZigiICBpbnN1ZmZpY2llbnQgIyAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50KTsKLSAgICAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50IGZyYW1lcyA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRGcmFtZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgcHJpbnRmKCJDYWxsYmFjayBSZXN1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1VUUFVUXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgIG91dHB1dCB1bmRlcnJ1bnMgPSAlZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pKTsKLSAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzV3JpdHRlbiAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNXcml0dGVuVG90YWwpOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7Ci0gICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKLSAgICAgICAgcHJpbnRmKCIgIG1pbiBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5taW5OdW1GcmFtZXMpOwotICAgICAgICBwcmludGYoIiAgbWF4IG51bUZyYW1lcyAgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLm1heE51bUZyYW1lcyk7Ci0gICAgfQotCiAgICAgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+c2F2ZShGSUxFTkFNRV9FQ0hPUyk7CiAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgIHByaW50ZigibWFpbigpIHdyb3RlICU4ZCBtb25vIHNhbXBsZXMgdG8gXCIlc1wiIG9uIEFuZHJvaWQgZGV2aWNlXG4iLApAQCAtNjQxLDEwICs2ODIsNTYgQEAKICAgICAgICAgICAgICAgIHdyaXR0ZW4sIEZJTEVOQU1FX0FMTCk7CiAgICAgfQogCi0gICAgaWYgKGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0UmVzdWx0KCkgPCAwKSB7Ci0gICAgICAgIHByaW50ZigiRVJST1I6IExPT1BCQUNLIFBST0NFU1NJTkcgRkFJTEVELiBNYXliZSBiZWNhdXNlIHRoZSB2b2x1bWUgd2FzIHRvbyBsb3cuXG4iKTsKLSAgICAgICAgcmVzdWx0ID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5nZXRSZXN1bHQoKTsKKyAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgPT0gQUFVRElPX09LKSB7CisgICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFKSB7CisgICAgICAgICAgICBpZiAobG9vcGJhY2tEYXRhLm51bUdsaXRjaEV2ZW50cyA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBHcmFwaCBhcm91bmQgdGhlIGZpcnN0IGdsaXRjaCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5nbGl0Y2hGcmFtZXNbMF0gLSA4OworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyBvdXRwdXRGcmFtZXNQZXJCdXJzdCArIDggKyA4OworICAgICAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaFJlZ2lvbihsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPciBncmFwaCB0aGUgbWlkZGxlIG9mIHRoZSBzaWduYWwuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZy5zaXplKCkgLyAyOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyAyMDA7CisgICAgICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwogICAgIH0KKworICAgIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoaW5wdXRTdHJlYW0pOworICAgICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihpbnB1dFN0cmVhbSk7CisgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVzQXZhaWxhYmxlID0gZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQ7CisgICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElOUFVUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIGlucHV0IG92ZXJydW5zICAgPSAlOGRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoaW5wdXRTdHJlYW0pKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOworICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7CisgICAgICAgIHByaW50ZigiICBteUZyYW1lc1JlYWQgICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzUmVhZFRvdGFsKTsKKyAgICAgICAgcHJpbnRmKCIgIHdyaXR0ZW4gLSByZWFkICAgPSAlOGRcbiIsIChpbnQpIGZyYW1lc0F2YWlsYWJsZSk7CisgICAgICAgIHByaW50ZigiICBpbnN1ZmZpY2llbnQgIyAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50KTsKKyAgICAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIiAgaW5zdWZmaWMuIGZyYW1lcyA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRGcmFtZXMpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgYWN0dWFsSW5wdXRDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDIgKiBhY3R1YWxJbnB1dENhcGFjaXR5KSB7CisgICAgICAgICAgICBwcmludGYoIiAgV0FSTklORzogd3JpdHRlbiAtIHJlYWQgPiAyKmNhcGFjaXR5ICFcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChvdXRwdXRTdHJlYW0pOworICAgICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihvdXRwdXRTdHJlYW0pOworICAgICAgICBwcmludGYoIkNhbGxiYWNrIFJlc3VsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPVVRQVVRcbiIpOworICAgICAgICBwcmludGYoIiAgb3V0cHV0IHVuZGVycnVucyA9ICU4ZFxuIiwgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pKTsKKyAgICAgICAgcHJpbnRmKCIgIG15RnJhbWVzV3JpdHRlbiAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5mcmFtZXNXcml0dGVuVG90YWwpOworICAgICAgICBwcmludGYoIiAgZnJhbWVzV3JpdHRlbiAgICA9ICU4ZFxuIiwgZnJhbWVzV3JpdHRlbik7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNSZWFkICAgICAgID0gJThkXG4iLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgcHJpbnRmKCIgIG1pbiBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5taW5OdW1GcmFtZXMpOworICAgICAgICBwcmludGYoIiAgbWF4IG51bUZyYW1lcyAgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLm1heE51bUZyYW1lcyk7CisgICAgfQorCiAgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQgPiAzKSB7CiAgICAgICAgIHByaW50ZigiRVJST1I6IExPT1BCQUNLIFBST0NFU1NJTkcgRkFJTEVELiBpbnN1ZmZpY2llbnRSZWFkQ291bnQgdG9vIGhpZ2hcbiIpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CkBAIC02NTYsMTQgKzc0MywyOCBAQAogICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dEZsb2F0RGF0YTsKICAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuaW5wdXRTaG9ydERhdGE7CiAKK3JlcG9ydF9yZXN1bHQ6CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BiYWNrRGF0YS5udW1HbGl0Y2hFdmVudHM7IGkrKykgeworICAgICAgICBwcmludGYoIiAgZ2xpdGNoIGF0IGZyYW1lICVkXG4iLCBsb29wYmFja0RhdGEuZ2xpdGNoRnJhbWVzW2ldKTsKKyAgICB9CisKKyAgICB3cml0dGVuID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5zYXZlKEZJTEVOQU1FX1BST0NFU1NFRCk7CisgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CisgICAgICAgIHByaW50ZigibWFpbigpIHdyb3RlICU4ZCBwcm9jZXNzZWQgc2FtcGxlcyB0byBcIiVzXCIgb24gQW5kcm9pZCBkZXZpY2VcbiIsCisgICAgICAgICAgICAgICB3cml0dGVuLCBGSUxFTkFNRV9QUk9DRVNTRUQpOworICAgIH0KKworICAgIGlmIChsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpIDwgMCkgeworICAgICAgICByZXN1bHQgPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpOworICAgIH0KICAgICBwcmludGYoUkVTVUxUX1RBRyAicmVzdWx0ID0gJWQgXG4iLCByZXN1bHQpOyAvLyBtYWNoaW5lIHJlYWRhYmxlCiAgICAgcHJpbnRmKCJyZXN1bHQgaXMgJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOyAvLyBodW1hbiByZWFkYWJsZQogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRkFJTFVSRVxuIik7CisgICAgICAgIHByaW50ZigiVEVTVCBGQUlMRURcbiIpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiU1VDQ0VTU1xuIik7CisgICAgICAgIHByaW50ZigiVEVTVCBQQVNTRURcbiIpOwogICAgICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggODhkNzQwMS4uOTExNTc3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0zNiwxMSArMzYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSA9IG51bGxwdHI7CiBzdGF0aWMgdm9pZCAoKnNfc2V0SW5wdXRQcmVzZXQpKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgPSBudWxscHRyOworc3RhdGljIHZvaWQgKCpzX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5KShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCB1c2FnZSkgPSBudWxscHRyOwogCiBzdGF0aWMgYm9vbCBzX2xvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKIHN0YXRpYyBhYXVkaW9fdXNhZ2VfdCAoKnNfZ2V0VXNhZ2UpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CiBzdGF0aWMgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICgqc19nZXRDb250ZW50VHlwZSkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKIHN0YXRpYyBhYXVkaW9faW5wdXRfcHJlc2V0X3QgKCpzX2dldElucHV0UHJlc2V0KShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOworc3RhdGljIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgKCpzX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOwogCiAvLyBMaW5rIHRvIHRlc3QgZnVuY3Rpb25zIGluIHNoYXJlZCBsaWJyYXJ5Lgogc3RhdGljIHZvaWQgbG9hZEZ1dHVyZUZ1bmN0aW9ucygpIHsKQEAgLTYxLDYgKzY0LDEwIEBACiAgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldCIpOwogICAgICAgICBpZiAoc19zZXRJbnB1dFByZXNldCA9PSBudWxscHRyKSBnb3RvIGVycm9yOwogCisgICAgICAgIHNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgPSAodm9pZCAoKikoQUF1ZGlvU3RyZWFtQnVpbGRlciAqLCBhYXVkaW9faW5wdXRfcHJlc2V0X3QpKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kiKTsKKyAgICAgICAgaWYgKHNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKwogICAgICAgICBzX2dldFVzYWdlID0gKGFhdWRpb191c2FnZV90ICgqKShBQXVkaW9TdHJlYW0gKikpCiAgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtX2dldFVzYWdlIik7CiAgICAgICAgIGlmIChzX2dldFVzYWdlID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CkBAIC03Miw2ICs3OSwxMCBAQAogICAgICAgICBzX2dldElucHV0UHJlc2V0ID0gKGFhdWRpb19pbnB1dF9wcmVzZXRfdCAoKikoQUF1ZGlvU3RyZWFtICopKQogICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldCIpOwogICAgICAgICBpZiAoc19nZXRJbnB1dFByZXNldCA9PSBudWxscHRyKSBnb3RvIGVycm9yOworCisgICAgICAgIHNfZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgPSAoYWF1ZGlvX2lucHV0X3ByZXNldF90ICgqKShBQXVkaW9TdHJlYW0gKikpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5Iik7CisgICAgICAgIGlmIChzX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5ID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIHJldHVybjsKIApAQCAtMTY5LDYgKzE4MCwxNCBAQAogICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKICAgICB9CiAKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG93ZWRDYXB0dXJlUG9saWN5OworICAgIH0KKworICAgIHZvaWQgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gcG9saWN5OworICAgIH0KKwogICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlSWQ7CiAgICAgfQpAQCAtMTg1LDE4ICsyMDQsMjYgQEAKICAgICAgICAgbU51bWJlck9mQnVyc3RzID0gbnVtQnVyc3RzOwogICAgIH0KIAorICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQ2FsbGJhY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQ2FsbGJhY2s7CisgICAgfQorICAgIHZvaWQgc2V0RnJhbWVzUGVyQ2FsbGJhY2soaW50MzJfdCBzaXplKSB7CisgICAgICAgIG1GcmFtZXNQZXJDYWxsYmFjayA9IHNpemU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlc2UgcGFyYW1ldGVycyB0byBhIHN0cmVhbSBidWlsZGVyLgogICAgICAqIEBwYXJhbSBidWlsZGVyCiAgICAgICovCiAgICAgdm9pZCBhcHBseVBhcmFtZXRlcnMoQUF1ZGlvU3RyZWFtQnVpbGRlciAqYnVpbGRlcikgY29uc3QgeworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoYnVpbGRlciwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGJ1aWxkZXIsIG1DaGFubmVsQ291bnQpOwotICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChidWlsZGVyLCBtRm9ybWF0KTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGJ1aWxkZXIsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGJ1aWxkZXIsIG1CdWZmZXJDYXBhY2l0eSk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGV2aWNlSWQoYnVpbGRlciwgbURldmljZUlkKTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShidWlsZGVyLCBtU2hhcmluZ01vZGUpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChidWlsZGVyLCBtRm9ybWF0KTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soYnVpbGRlciwgbUZyYW1lc1BlckNhbGxiYWNrKTsKICAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYnVpbGRlciwgbVBlcmZvcm1hbmNlTW9kZSk7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShidWlsZGVyLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoYnVpbGRlciwgbVNoYXJpbmdNb2RlKTsKIAogICAgICAgICAvLyBDYWxsIFAgZnVuY3Rpb25zIGlmIHN1cHBvcnRlZC4KICAgICAgICAgbG9hZEZ1dHVyZUZ1bmN0aW9ucygpOwpAQCAtMjE1LDggKzI0MiwxNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG1Vc2FnZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpewogICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRJbnB1dFByZXNldCBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsIFEgZnVuY3Rpb25zIGlmIHN1cHBvcnRlZC4KKyAgICAgICAgaWYgKHNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc19zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShidWlsZGVyLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOworICAgICAgICB9IGVsc2UgaWYgKG1BbGxvd2VkQ2FwdHVyZVBvbGljeSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrRGVmYXVsdE51bWJlck9mQnVyc3RzID0gMjsKKwogcHJpdmF0ZToKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1Gb3JtYXQgICAgICAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwpAQCAtMjMwLDggKzI2NiwxMCBAQAogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgbUFsbG93ZWRDYXB0dXJlUG9saWN5ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1OdW1iZXJPZkJ1cnN0cyAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQnVyc3RzICA9IGtEZWZhdWx0TnVtYmVyT2ZCdXJzdHM7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckNhbGxiYWNrID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogY2xhc3MgQUF1ZGlvQXJnc1BhcnNlciA6IHB1YmxpYyBBQXVkaW9QYXJhbWV0ZXJzIHsKQEAgLTI1OCw2ICsyOTYsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgJ2MnOgogICAgICAgICAgICAgICAgICAgICBzZXRDaGFubmVsQ291bnQoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShwYXJzZUFsbG93ZWRDYXB0dXJlUG9saWN5KGFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlSWQoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjcyLDcgKzMxMyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYXJnKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFBdWRpb19zZXRNTWFwUG9saWN5KHBvbGljeSkgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBpbnZhbGlkIE1NQVAgcG9saWN5IG1vZGUgJWlcbiIsIHBvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgICBzZXROdW1iZXJPZkJ1cnN0cyhhdG9pKCZhcmdbMl0pKTsKQEAgLTI5NSw2ICszMzgsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50VHlwZShhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICAgICAgICAgIHNldEZyYW1lc1BlckNhbGxiYWNrKGF0b2koJmFyZ1syXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB1bnJlY29nbml6ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMyNyw2ICszNzMsMTAgQEAKICAgICAgICAgcHJpbnRmKCIgICAgICBEZWZhdWx0IHZhbHVlcyBhcmUgVU5TUEVDSUZJRUQgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtYntidWZmZXJDYXBhY2l0eX0gZnJhbWVzXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtY3tjaGFubmVsc30gZm9yIGV4YW1wbGUgMiBmb3Igc3RlcmVvXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtQ3thfHN8bn0gc2V0IHBsYXliYWNrIGNhcHR1cmUgcG9saWN5XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgYSA9IF9BTEwgKGRlZmF1bHQpXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgcyA9IF9TWVNURU1cbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICBuID0gX05PTkVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ke2RldmljZUlkfSBkZWZhdWx0IGlzICVkXG4iLCBBQVVESU9fVU5TUEVDSUZJRUQpOwogICAgICAgICBwcmludGYoIiAgICAgIC1mezB8MXwyfSBzZXQgZm9ybWF0XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMCA9IFVOU1BFQ0lGSUVEXG4iKTsKQEAgLTMzOCw3ICszODgsNyBAQAogICAgICAgICBwcmludGYoIiAgICAgICAgICAxID0gX05FVkVSLCBuZXZlciB1c2UgTU1BUFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDIgPSBfQVVUTywgdXNlIE1NQVAgaWYgYXZhaWxhYmxlLCBkZWZhdWx0IGZvciAtbSB3aXRoIG5vIG51bWJlclxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDMgPSBfQUxXQVlTLCB1c2UgTU1BUCBvciBmYWlsXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAtbntudW1iZXJPZkJ1cnN0c30gZm9yIHNldEJ1ZmZlclNpemVcbiIpOworICAgICAgICBwcmludGYoIiAgICAgIC1ue251bWJlck9mQnVyc3RzfSBmb3Igc2V0QnVmZmVyU2l6ZSwgZGVmYXVsdCAlZFxuIiwga0RlZmF1bHROdW1iZXJPZkJ1cnN0cyk7CiAgICAgICAgIHByaW50ZigiICAgICAgLXB7cGVyZm9ybWFuY2VNb2RlfSBzZXQgb3V0cHV0IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFKiwgZGVmYXVsdCBOT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbiBmb3IgX05PTkVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICBsIGZvciBfTEFURU5DWVxuIik7CkBAIC0zNDgsNiArMzk4LDI2IEBACiAgICAgICAgIHByaW50ZigiICAgICAgLXV7dXNhZ2V9IGVnLiAxNCBmb3IgQUFVRElPX1VTQUdFX0dBTUVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC14IHRvIHVzZSBFWENMVVNJVkUgbW9kZVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLXl7Y29udGVudFR5cGV9IGVnLiAxIGZvciBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSFxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgLXp7Y2FsbGJhY2tTaXplfSBvciBibG9jayBzaXplLCBpbiBmcmFtZXMsIGRlZmF1bHQgPSAwXG4iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwYXJzZUFsbG93ZWRDYXB0dXJlUG9saWN5KGNoYXIgYykgeworICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSA9IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICBwb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBwb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBwb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBpbnZhbGlkIHBsYXliYWNrIGNhcHR1cmUgcG9saWN5ICVjXG4iLCBjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9saWN5OwogICAgIH0KIAogICAgIHN0YXRpYyBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBhcnNlUGVyZm9ybWFuY2VNb2RlKGNoYXIgYykgewpAQCAtMzYzLDcgKzQzMyw3IEBACiAgICAgICAgICAgICAgICAgbW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBpbnZhbGlkIHBlcmZvcm1hbmNlIG1vZGUgJWNcbiIsIGMpOworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGludmFsaWQgcGVyZm9ybWFuY2UgbW9kZSAlY1xuIiwgYyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1vZGU7CkBAIC0zOTIsMTcgKzQ2MiwzMSBAQAogICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksIEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSk7CiAKICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChzdHJlYW0pOwotICAgICAgICBpbnQzMl90IHNpemVGcmFtZXMgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKHN0cmVhbSk7CiAgICAgICAgIHByaW50ZigiICBCdWZmZXI6ICAgICAgIGJ1cnN0ICAgICA9ICVkXG4iLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICAgICAgaW50MzJfdCBzaXplRnJhbWVzID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhzdHJlYW0pOwogICAgICAgICBpZiAoZnJhbWVzUGVyQnVyc3QgPiAwKSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgQnVmZmVyOiAgICAgICBzaXplICAgICAgPSAlZCA9ICglZCAqICVkKSArICVkXG4iLAorICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZWRTaXplID0gZ2V0TnVtYmVyT2ZCdXJzdHMoKSAqIGZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgcHJpbnRmKCIgIEJ1ZmZlclNpemU6ICAgcmVxdWVzdGVkID0gJTRkLCBhY3R1YWwgPSAlNGQgPSAoJWQgKiAlZCkgKyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLAogICAgICAgICAgICAgICAgICAgIHNpemVGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgKHNpemVGcmFtZXMgLyBmcmFtZXNQZXJCdXJzdCksCiAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3QsCiAgICAgICAgICAgICAgICAgICAgKHNpemVGcmFtZXMgJSBmcmFtZXNQZXJCdXJzdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHByaW50ZigiICBCdWZmZXJTaXplOiAgICAlZFxuIiwgc2l6ZUZyYW1lcyk7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIgIENhcGFjaXR5OiAgICAgcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLCBnZXRCdWZmZXJDYXBhY2l0eSgpLAotICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoc3RyZWFtKSk7CisKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eUZyYW1lcyA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKHN0cmVhbSk7CisgICAgICAgIHByaW50ZigiICBDYXBhY2l0eTogICAgIHJlcXVlc3RlZCA9ICU0ZCwgYWN0dWFsID0gJTRkID0gKCVkICogJWQpICsgJWRcbiIsCisgICAgICAgICAgICAgICBnZXRCdWZmZXJDYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgY2FwYWNpdHlGcmFtZXMsCisgICAgICAgICAgICAgICAoY2FwYWNpdHlGcmFtZXMgLyBmcmFtZXNQZXJCdXJzdCksCisgICAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdCwKKyAgICAgICAgICAgICAgIChjYXBhY2l0eUZyYW1lcyAlIGZyYW1lc1BlckJ1cnN0KSk7CisKKyAgICAgICAgcHJpbnRmKCIgIENhbGxiYWNrU2l6ZTogcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLCBnZXRGcmFtZXNQZXJDYWxsYmFjaygpLAorICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhzdHJlYW0pKTsKIAogICAgICAgICBwcmludGYoIiAgU2hhcmluZ01vZGU6ICByZXF1ZXN0ZWQgPSAlcywgYWN0dWFsID0gJXNcbiIsCiAgICAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQoZ2V0U2hhcmluZ01vZGUoKSksCkBAIC00MzEsNiArNTE1LDExIEBACiAgICAgICAgIHByaW50ZigiICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChzdHJlYW0pCiAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CiAKKyAgICAgICAgaWYgKHNfZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJpbnRmKCIgIENvbnRlbnRUeXBlOiAgcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCksIHNfZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koc3RyZWFtKSk7CisgICAgICAgIH0KKwogICAgIH0KIAogICAgIGludDMyX3QgZ2V0RHVyYXRpb25TZWNvbmRzKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCmluZGV4IDU0Yjc3YmEuLmZkMWZjNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKQEAgLTMyLDggKzMyLDYgQEAKIAogLy8gQXJiaXRyYXJ5IHBlcmlvZCBmb3IgZ2xpdGNoZXMKICNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVMgICAgKDIgKiA0ODAwMCkKLS8vIEhvdyBsb25nIHRvIHNsZWVwIGluIGEgY2FsbGJhY2sgdG8gY2F1c2UgYW4gaW50ZW50aW9uYWwgZ2xpdGNoLiBGb3IgdGVzdGluZy4KLSNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyAgICAgKDEwICogMTAwMCkKIAogI2RlZmluZSBNQVhfVElNRVNUQU1QUyAgICAgICAgICAgICAgICAgICAxNgogCkBAIC0xMjIsMTAgKzEyMCw5IEBACiAKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIGludDMyX3Qgc2l6ZUluQnVyc3RzID0gcGFyYW1ldGVycy5nZXROdW1iZXJPZkJ1cnN0cygpOwotICAgICAgICAgICAgaWYgKHNpemVJbkJ1cnN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KG1TdHJlYW0pOwotICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMobVN0cmVhbSwgc2l6ZUluQnVyc3RzICogZnJhbWVzUGVyQnVyc3QpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChtU3RyZWFtKTsKKyAgICAgICAgICAgIGludDMyX3QgYnVmZmVyU2l6ZUZyYW1lcyA9IHNpemVJbkJ1cnN0cyAqIGZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhtU3RyZWFtLCBidWZmZXJTaXplRnJhbWVzKTsKICAgICAgICAgfQogCiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGJ1aWxkZXIpOwpAQCAtMTkzLDcgKzE5MCw3IEBACiAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIHsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQob3V0cHV0KSByZXR1cm5lZCAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjAzLDcgKzIwMCw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKG91dHB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IHhSdW5Db3VudCA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQobVN0cmVhbSk7CkBAIC0yMTUsNyArMjEyLDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoKSByZXR1cm5lZCAlZCAlc1xuIiwKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKG91dHB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IHhSdW5Db3VudCA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQobVN0cmVhbSk7CkBAIC0yMjMsMTEgKzIyMCwyNyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGFhdWRpb19yZXN1bHRfdCB3YWl0VW50aWxQYXVzZWQoKSB7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUobVN0cmVhbSk7CisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HOworICAgICAgICB3aGlsZSAocmVzdWx0ID09IEFBVURJT19PSyAmJiBjdXJyZW50U3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKG1TdHJlYW0sIGlucHV0U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50U3RhdGUsIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgaW5wdXRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGN1cnJlbnRTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkKKyAgICAgICAgICAgICAgID8gQUFVRElPX09LIDogQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCiAgICAgLy8gRmx1c2ggdGhlIHN0cmVhbS4gQUF1ZGlvIHdpbGwgc3RvcCBjYWxsaW5nIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChvdXRwdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI1OSw3ICsyNzIsNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgIHNjaGVkdWxlciA9IDA7CiAgICAgYm9vbCAgICAgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIEFBdWRpb1NpbXBsZVBsYXllciBzaW1wbGVQbGF5ZXI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGNhbGxiYWNrQ291bnQgPSAwOwpAQCAtMzExLDEwICszMjQsMTIgQEAKICAgICAgICAgc2luZURhdGEtPnNldHVwU2luZVN3ZWVwcygpOwogICAgIH0KIAotICAgIGlmIChzaW5lRGF0YS0+Zm9yY2VVbmRlcnJ1bnMpIHsKKyAgICBpZiAoc2luZURhdGEtPmhhbmdUaW1lTVNlYyA+IDApIHsKICAgICAgICAgaWYgKHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+IHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgewotICAgICAgICAgICAgdXNsZWVwKEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MpOwotICAgICAgICAgICAgcHJpbnRmKCJTaW11bGF0ZSBnbGl0Y2ggYXQgJWxsZFxuIiwgKGxvbmcgbG9uZykgc2luZURhdGEtPmZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIHVzbGVlcChzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjICogMTAwMCk7CisgICAgICAgICAgICBwcmludGYoIkhhbmcgY2FsbGJhY2sgYXQgJWxsZCBmcmFtZXMgZm9yICVkIG1zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICBzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjKTsKICAgICAgICAgICAgIHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCArPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggODY5ZmFkMC4uMjQ2ZTJkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTIwMSw4ICsyMDEsMTAgQEAKICAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0KCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChpbnB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgRGlkIHlvdSByZW1lbWJlciB0byBlbnRlcjogICBhZGIgcm9vdCAgICA/Pz8/XG4iKTsKKwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjExLDggKzIxMyw5IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGlucHV0KSByZXR1cm5lZCAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjIxLDcgKzIyNCw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShpbnB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCmluZGV4IGFhMjVlNjcuLmNjODA4NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icApAQCAtNCw2ICs0LDcgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CiAKIGNjX3Rlc3QgewpAQCAtMTIsNCArMTMsNSBAQAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWJkNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKaW5kZXggZTMzZTlmOC4uY2E2MDIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcApAQCAtMjYsMTAgKzI2LDE1IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKwogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS43IgorCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEhhbmdUaW1lTVNlYyA9IDEwOworCiAvKioKICAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgogICoKQEAgLTM5LDcgKzQ0LDcgQEAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3BDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmaXhUb25lTXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZVVuZGVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5nVGltZU1TZWMpCiB7CiAgICAgU2luZVRocmVhZGVkRGF0YV90IG15RGF0YTsKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgJnBsYXllciA9IG15RGF0YS5zaW1wbGVQbGF5ZXI7CkBAIC01MSwxMCArNTYsMTIgQEAKICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJ1biBjb21wbGV0ZSB0ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKLSAgICBteURhdGEuZm9yY2VVbmRlcnJ1bnMgPSBmb3JjZVVuZGVycnVuczsgLy8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKKyAgICBteURhdGEuaGFuZ1RpbWVNU2VjID0gaGFuZ1RpbWVNU2VjOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQogCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLCAmbXlEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICZteURhdGEpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlc1xuIiwKICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKQEAgLTEwOSwxNiArMTE2LDIxIEBACiAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zID0gZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKTsKICAgICAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgZHVyYXRpb25TZWNvbmRzOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gU2xlZXAgYSB3aGlsZS4gV2FrZSB1cCBlYXJseSBpZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgYSBESVNDT05ORUNULgotICAgICAgICAgICAgbG9uZyByZXQgPSBteURhdGEud2FrZXIud2FpdChBQVVESU9fT0ssIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgbXlEYXRhLndha2VyLndhaXQoQUFVRElPX09LLCBOQU5PU19QRVJfU0VDT05EKTsKICAgICAgICAgICAgIGludDY0X3QgbWlsbGlzID0KICAgICAgICAgICAgICAgICAgICAgKGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQykgLSBzdGFydGVkQXROYW5vcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7Ci0gICAgICAgICAgICBwcmludGYoIndhaXQoKSByZXR1cm5zICVsZCwgYWF1ZGlvX3Jlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXNXcml0dGVuID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICByZXQsIHJlc3VsdCwgKGludCkgbWlsbGlzLAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgeHJ1bnMgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBwcmludGYoIiB3YWtlciByZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgKGludCkgbWlsbGlzLAogICAgICAgICAgICAgICAgICAgIHNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIHhydW5zKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICBiYWlsT3V0ID0gdHJ1ZTsKQEAgLTEzOCw2ICsxNTAsMTAgQEAKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHBsYXllci53YWl0VW50aWxQYXVzZWQoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IHBsYXllci5mbHVzaCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0yMDQsNyArMjIwLDkgQEAKICAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOwogICAgIHByaW50ZigiICAgICAgLWx7Y291bnR9IGxvb3BDb3VudCBzdGFydC9zdG9wLCBldmVyeSBvdGhlciBvbmUgaXMgc2lsZW50XG4iKTsKICAgICBwcmludGYoIiAgICAgIC10e21zZWN9ICBwbGF5IGEgaGlnaCBwaXRjaGVkIHRvbmUgYXQgdGhlIGJlZ2lubmluZ1xuIik7Ci0gICAgcHJpbnRmKCIgICAgICAteiAgICAgICAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IHNsZWVwaW5nIGluIGNhbGxiYWNrXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe21zZWN9ICBmb3JjZSBwZXJpb2RpYyB1bmRlcnJ1bnMgYnkgaGFuZ2luZyBpbiBjYWxsYmFja1xuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgSWYgbm8gdmFsdWUgc3BlY2lmaWVkIHRoZW4gJWQgdXNlZC5cbiIsCisgICAgICAgICAgICBrRGVmYXVsdEhhbmdUaW1lTVNlYyk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKQEAgLTIxMywxMyArMjMxLDE0IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbG9vcENvdW50ID0gMTsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSAwOwotICAgIGJvb2wgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYwLjEuNFxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWJXNcbiIsCisgICAgICAgIGFyZ3ZbMF0sIEFQUF9WRVJTSU9OKTsKIAogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CkBAIC0yMzQsOCArMjUzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSB0cnVlOyAgLy8gWnp6enp6egorICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IChhcmdbMl0pIC8vIHZhbHVlIHNwZWNpZmllZD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdG9pKCZhcmdbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0RlZmF1bHRIYW5nVGltZU1TZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CkBAIC0yNTEsNyArMjcyLDggQEAKICAgICB9CiAKICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KLSAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsIHByZWZpeFRvbmVNc2VjLCBmb3JjZVVuZGVycnVucykpCisgICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlciwgbG9vcENvdW50LAorICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMsIGhhbmdUaW1lTVNlYykpCiAgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCA1YjI5NDE5Li5lZTVkMDg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0zNyw3ICszNyw3IEBACiAKIC8qKgogICogVGhpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlIHRoYXQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZC4KLSAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjb3VsZCB1c2UgQUFVRElPX1VOU1BFQ0lGSUVEIHRvIGluZGljYXRlCisgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY291bGQgdXNlIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfSB0byBpbmRpY2F0ZQogICogdGhhdCBpcyBkaWQgbm90IG5vdCBjYXJlIHdoYXQgdGhlIHNwZWNpZmljIHZhbHVlIG9mIGEgcGFyYW1ldGVyIHdhcwogICogYW5kIHdvdWxkIGFjY2VwdCB3aGF0ZXZlciBpdCB3YXMgZ2l2ZW4uCiAgKi8KQEAgLTIzMiw3ICsyMzIsOCBAQAogICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IGNlcnRhaW4gcGxhdGZvcm1zIG9yIHJvdXRpbmcgcG9saWNpZXMKICAqIHRvIG1ha2UgbW9yZSByZWZpbmVkIHZvbHVtZSBvciByb3V0aW5nIGRlY2lzaW9ucy4KICAqCi0gKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIEF1ZGlvQXR0cmlidXRlcyBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KKyAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzfQorICogaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgogICovCkBAIC0zMDMsMTIgKzMwNCwxMyBAQAogLyoqCiAgKiBUaGUgQ09OVEVOVF9UWVBFIGF0dHJpYnV0ZSBkZXNjcmliZXMgIndoYXQiIHlvdSBhcmUgcGxheWluZy4KICAqIEl0IGV4cHJlc3NlcyB0aGUgZ2VuZXJhbCBjYXRlZ29yeSBvZiB0aGUgY29udGVudC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbC4KLSAqIEJ1dCBpbiBjYXNlIGl0IGlzIGtub3duIChmb3IgaW5zdGFuY2Uge0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFfSBmb3IgYQotICogbW92aWUgc3RyZWFtaW5nIHNlcnZpY2Ugb3Ige0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSH0gZm9yCisgKiBCdXQgaW4gY2FzZSBpdCBpcyBrbm93biAoZm9yIGluc3RhbmNlIEFBVURJT19DT05URU5UX1RZUEVfTU9WSUUgZm9yIGEKKyAqIG1vdmllIHN0cmVhbWluZyBzZXJ2aWNlIG9yIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIGZvcgogICogYW4gYXVkaW8gYm9vayBhcHBsaWNhdGlvbikgdGhpcyBpbmZvcm1hdGlvbiBtaWdodCBiZSB1c2VkIGJ5IHRoZSBhdWRpbyBmcmFtZXdvcmsgdG8KICAqIGVuZm9yY2UgYXVkaW8gZm9jdXMuCiAgKgotICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiBBdWRpb0F0dHJpYnV0ZXMgaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc30KKyAqIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgogICoKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqLwpAQCAtMzczLDEwICszNzUsNTkgQEAKICAgICAgKiBzbyB0aGUgcmVjb3JkZWQgdm9sdW1lIG1heSBiZSB2ZXJ5IGxvdy4KICAgICAgKi8KICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID0gOSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCBmb3IgY2FwdHVyaW5nIGF1ZGlvIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBpbiByZWFsIHRpbWUKKyAgICAgKiBhbmQgcGxheWVkIGJhY2sgZm9yIGxpdmUgcGVyZm9ybWFuY2UgKGUuZyBrYXJhb2tlKS4KKyAgICAgKiBUaGUgY2FwdHVyZSBwYXRoIHdpbGwgbWluaW1pemUgbGF0ZW5jeSBhbmQgY291cGxpbmcgd2l0aCBwbGF5YmFjayBwYXRoLgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UgPSAxMCwKIH07CiB0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2lucHV0X3ByZXNldF90OwogCiAvKioKKyAqIFNwZWNpZnlpbmcgaWYgYXVkaW8gbWF5IG9yIG1heSBub3QgYmUgY2FwdHVyZWQgYnkgb3RoZXIgYXBwcyBvciB0aGUgc3lzdGVtLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzfQorICogaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI5LgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYXVkaW8gbWF5IGJlIGNhcHR1cmVkIGJ5IGFueSBhcHAuCisgICAgICoKKyAgICAgKiBGb3IgcHJpdmFjeSwgdGhlIGZvbGxvd2luZyB1c2FnZXMgY2FuIG5vdCBiZSByZWNvcmRlZDogQUFVRElPX1ZPSUNFX0NPTU1VTklDQVRJT04qLAorICAgICAqIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04qLCBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRSogYW5kIHtAbGluayAjQUFVRElPX1VTQUdFX0FTU0lTVEFOVH0uCisgICAgICoKKyAgICAgKiBPbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1F9LCB0aGlzIG1lYW5zIG9ubHkge0BsaW5rICNBQVVESU9fVVNBR0VfTUVESUF9CisgICAgICogYW5kIHtAbGluayAjQUFVRElPX1VTQUdFX0dBTUV9IG1heSBiZSBjYXB0dXJlZC4KKyAgICAgKgorICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMjQUxMT1dfQ0FQVFVSRV9CWV9BTEx9LgorICAgICAqLworICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTCA9IDEsCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGF1ZGlvIG1heSBvbmx5IGJlIGNhcHR1cmVkIGJ5IHN5c3RlbSBhcHBzLgorICAgICAqCisgICAgICogU3lzdGVtIGFwcHMgY2FuIGNhcHR1cmUgZm9yIG1hbnkgcHVycG9zZXMgbGlrZSBhY2Nlc3NpYmlsaXR5LCB1c2VyIGd1aWRhbmNlLi4uCisgICAgICogYnV0IGhhdmUgc3Ryb25nIHJlc3RyaWN0aW9uLiBTZWUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMjQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU19IGZvciB3aGF0IHRoZSBzeXN0ZW0gYXBwcworICAgICAqIGNhbiBkbyB3aXRoIHRoZSBjYXB0dXJlIGF1ZGlvLgorICAgICAqLworICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSA9IDIsCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGF1ZGlvIG1heSBub3QgYmUgcmVjb3JkZWQgYnkgYW55IGFwcCwgZXZlbiBpZiBpdCBpcyBhIHN5c3RlbSBhcHAuCisgICAgICoKKyAgICAgKiBJdCBpcyBlbmNvdXJhZ2VkIHRvIHVzZSB7QGxpbmsgI0FBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTX0gaW5zdGVhZCBvZiB0aGlzIHZhbHVlIGFzIHN5c3RlbSBhcHBzCisgICAgICogcHJvdmlkZSBzaWduaWZpY2FudCBhbmQgdXNlZnVsIGZlYXR1cmVzIGZvciB0aGUgdXNlciAoZWcuIGFjY2Vzc2liaWxpdHkpLgorICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMjQUxMT1dfQ0FQVFVSRV9CWV9OT05FfS4KKyAgICAgKi8KKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FID0gMywKK307CisKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90OworCisvKioKICAqIFRoZXNlIG1heSBiZSB1c2VkIHdpdGggQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKS4KICAqCiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCkBAIC00MjMsNyArNDc0LDcgQEAKICAqCiAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFBdWRpbyByZXN1bHQgY29kZS4KICAqLwotQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpOworQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogVGhlIHRleHQgaXMgdGhlIEFTQ0lJIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJlYW0gc3RhdGUsCkBAIC00MzMsNyArNDg0LDggQEAKICAqCiAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFBdWRpbyBzdGF0ZS4KICAqLwotQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOworQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU3RyZWFtQnVpbGRlcgpAQCAtNDQ0LDMyICs0OTYsMzMgQEAKICAqCiAgKiBUaGUgZGV2aWNlSWQgaXMgaW5pdGlhbGx5IHVuc3BlY2lmaWVkLCBtZWFuaW5nIHRoYXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBkZXZpY2Ugd2lsbCBiZSB1c2VkLgogICoKLSAqIFRoZSBkZWZhdWx0IGRpcmVjdGlvbiBpcyBBQVVESU9fRElSRUNUSU9OX09VVFBVVC4KLSAqIFRoZSBkZWZhdWx0IHNoYXJpbmcgbW9kZSBpcyBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRC4KKyAqIFRoZSBkZWZhdWx0IGRpcmVjdGlvbiBpcyB7QGxpbmsgI0FBVURJT19ESVJFQ1RJT05fT1VUUFVUfS4KKyAqIFRoZSBkZWZhdWx0IHNoYXJpbmcgbW9kZSBpcyB7QGxpbmsgI0FBVURJT19TSEFSSU5HX01PREVfU0hBUkVEfS4KICAqIFRoZSBkYXRhIGZvcm1hdCwgc2FtcGxlc1BlckZyYW1lcyBhbmQgc2FtcGxlUmF0ZSBhcmUgdW5zcGVjaWZpZWQgYW5kIHdpbGwgYmUKICAqIGNob3NlbiBieSB0aGUgZGV2aWNlIHdoZW4gaXQgaXMgb3BlbmVkLgogICoKICAqIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIGJ1aWxkZXIuCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKEFBdWRpb1N0cmVhbUJ1aWxkZXIqKiBidWlsZGVyKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKEFBdWRpb1N0cmVhbUJ1aWxkZXIqKiBidWlsZGVyKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFJlcXVlc3QgYW4gYXVkaW8gZGV2aWNlIGlkZW50aWZpZWQgZGV2aWNlIHVzaW5nIGFuIElELgogICogT24gQW5kcm9pZCwgZm9yIGV4YW1wbGUsIHRoZSBJRCBjb3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBKYXZhIEF1ZGlvTWFuYWdlci4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRCwKKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LAogICogaW4gd2hpY2ggY2FzZSB0aGUgcHJpbWFyeSBkZXZpY2Ugd2lsbCBiZSB1c2VkLgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gZGV2aWNlSWQgZGV2aWNlIGlkZW50aWZpZXIgb3IgQUFVRElPX1VOU1BFQ0lGSUVECisgKiBAcGFyYW0gZGV2aWNlSWQgZGV2aWNlIGlkZW50aWZpZXIgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBSZXF1ZXN0IGEgc2FtcGxlIHJhdGUgaW4gSGVydHouCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqIEFuIG9wdGltYWwgdmFsdWUgd2lsbCB0aGVuIGJlIGNob3NlbiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgogICogQWZ0ZXIgb3BlbmluZyBhIHN0cmVhbSB3aXRoIGFuIHVuc3BlY2lmaWVkIHZhbHVlLCB0aGUgYXBwbGljYXRpb24gbXVzdAogICogcXVlcnkgZm9yIHRoZSBhY3R1YWwgdmFsdWUsIHdoaWNoIG1heSB2YXJ5IGJ5IGRldmljZS4KQEAgLTQ4MSwxMiArNTM0LDEyIEBACiAgKiBAcGFyYW0gc2FtcGxlUmF0ZSBmcmFtZXMgcGVyIHNlY29uZC4gQ29tbW9uIHJhdGVzIGluY2x1ZGUgNDQxMDAgYW5kIDQ4MDAwIEh6LgogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFJlcXVlc3QgYSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBzdHJlYW0uCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqIEFuIG9wdGltYWwgdmFsdWUgd2lsbCB0aGVuIGJlIGNob3NlbiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgogICogQWZ0ZXIgb3BlbmluZyBhIHN0cmVhbSB3aXRoIGFuIHVuc3BlY2lmaWVkIHZhbHVlLCB0aGUgYXBwbGljYXRpb24gbXVzdAogICogcXVlcnkgZm9yIHRoZSBhY3R1YWwgdmFsdWUsIHdoaWNoIG1heSB2YXJ5IGJ5IGRldmljZS4KQEAgLTQ5OCw3ICs1NTEsNyBAQAogICogQHBhcmFtIGNoYW5uZWxDb3VudCBOdW1iZXIgb2YgY2hhbm5lbHMgZGVzaXJlZC4KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogSWRlbnRpY2FsIHRvIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkuCkBAIC01MDcsMTIgKzU2MCwxMiBAQAogICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBhIGZyYW1lLgogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgotICogUmVxdWVzdCBhIHNhbXBsZSBkYXRhIGZvcm1hdCwgZm9yIGV4YW1wbGUgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LgorICogUmVxdWVzdCBhIHNhbXBsZSBkYXRhIGZvcm1hdCwgZm9yIGV4YW1wbGUge0BsaW5rICNBQVVESU9fRk9STUFUX1BDTV9JMTZ9LgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCiAgKiBBbiBvcHRpbWFsIHZhbHVlIHdpbGwgdGhlbiBiZSBjaG9zZW4gd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqIEFmdGVyIG9wZW5pbmcgYSBzdHJlYW0gd2l0aCBhbiB1bnNwZWNpZmllZCB2YWx1ZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QKICAqIHF1ZXJ5IGZvciB0aGUgYWN0dWFsIHZhbHVlLCB3aGljaCBtYXkgdmFyeSBieSBkZXZpY2UuCkBAIC01MjEsNjQgKzU3NCw2NiBAQAogICogSWYgYSBzdHJlYW0gY2Fubm90IGJlIG9wZW5lZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgdGhlbiB0aGUgb3BlbiB3aWxsIGZhaWwuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBmb3JtYXQgY29tbW9uIGZvcm1hdHMgYXJlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUIGFuZCBBQVVESU9fRk9STUFUX1BDTV9JMTYuCisgKiBAcGFyYW0gZm9ybWF0IGNvbW1vbiBmb3JtYXRzIGFyZSB7QGxpbmsgI0FBVURJT19GT1JNQVRfUENNX0ZMT0FUfSBhbmQKKyAqICAgICAgICAgICAgICAge0BsaW5rICNBQVVESU9fRk9STUFUX1BDTV9JMTZ9LgogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogUmVxdWVzdCBhIG1vZGUgZm9yIHNoYXJpbmcgdGhlIGRldmljZS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19TSEFSSU5HX01PREVfU0hBUkVEfS4KICAqCiAgKiBUaGUgcmVxdWVzdGVkIHNoYXJpbmcgbW9kZSBtYXkgbm90IGJlIGF2YWlsYWJsZS4KICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gcXVlcnkgZm9yIHRoZSBhY3R1YWwgbW9kZSBhZnRlciB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIHNoYXJpbmdNb2RlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEIG9yIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFCisgKiBAcGFyYW0gc2hhcmluZ01vZGUge0BsaW5rICNBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRH0gb3Ige0BsaW5rICNBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRX0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKyAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFJlcXVlc3QgdGhlIGRpcmVjdGlvbiBmb3IgYSBzdHJlYW0uCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fRElSRUNUSU9OX09VVFBVVC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fRElSRUNUSU9OX09VVFBVVH0uCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBkaXJlY3Rpb24gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQgb3IgQUFVRElPX0RJUkVDVElPTl9JTlBVVAorICogQHBhcmFtIGRpcmVjdGlvbiB7QGxpbmsgI0FBVURJT19ESVJFQ1RJT05fT1VUUFVUfSBvciB7QGxpbmsgI0FBVURJT19ESVJFQ1RJT05fSU5QVVR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2V0IHRoZSByZXF1ZXN0ZWQgYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcy4KICAqIFRoZSBmaW5hbCBBQXVkaW9TdHJlYW0gY2FwYWNpdHkgbWF5IGRpZmZlciwgYnV0IHdpbGwgcHJvYmFibHkgYmUgYXQgbGVhc3QgdGhpcyBiaWcuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgY2FwYWNpdHkgaW4gZnJhbWVzIG9yIEFBVURJT19VTlNQRUNJRklFRAorICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgY2FwYWNpdHkgaW4gZnJhbWVzIG9yIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKTsKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2V0IHRoZSByZXF1ZXN0ZWQgcGVyZm9ybWFuY2UgbW9kZS4KICAqCi0gKiBTdXBwb3J0ZWQgbW9kZXMgYXJlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORwotICogYW5kIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLgorICogU3VwcG9ydGVkIG1vZGVzIGFyZSB7QGxpbmsgI0FBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkV9LAorICoge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkd9ICogYW5kIHtAbGluayAjQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1l9LgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORS4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FfS4KICAqCiAgKiBZb3UgbWF5IG5vdCBnZXQgdGhlIG1vZGUgeW91IHJlcXVlc3RlZC4KLSAqIFlvdSBjYW4gY2FsbCBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlKCkgdG8gZmluZCBvdXQgdGhlIGZpbmFsIG1vZGUgZm9yIHRoZSBzdHJlYW0uCisgKiBZb3UgY2FuIGNhbGwgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZSgpCisgKiB0byBmaW5kIG91dCB0aGUgZmluYWwgbW9kZSBmb3IgdGhlIHN0cmVhbS4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIG1vZGUgdGhlIGRlc2lyZWQgcGVyZm9ybWFuY2UgbW9kZSwgZWcuIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCisgKiBAcGFyYW0gbW9kZSB0aGUgZGVzaXJlZCBwZXJmb3JtYW5jZSBtb2RlLCBlZy4ge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWX0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpOworICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2V0IHRoZSBpbnRlbmRlZCB1c2UgY2FzZSBmb3IgdGhlIHN0cmVhbS4KQEAgLTU4NywxNSArNjQyLDE1IEBACiAgKiBiZWhhdmlvciBvZiB0aGUgc3RyZWFtLgogICogVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIGFmZmVjdCBob3cgdm9sdW1lIGFuZCBmb2N1cyBpcyBoYW5kbGVkIGZvciB0aGUgc3RyZWFtLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VTQUdFX01FRElBLgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VU0FHRV9NRURJQX0uCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gdXNhZ2UgdGhlIGRlc2lyZWQgdXNhZ2UsIGVnLiBBQVVESU9fVVNBR0VfR0FNRQorICogQHBhcmFtIHVzYWdlIHRoZSBkZXNpcmVkIHVzYWdlLCBlZy4ge0BsaW5rICNBQVVESU9fVVNBR0VfR0FNRX0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSk7CisgICAgICAgIGFhdWRpb191c2FnZV90IHVzYWdlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFNldCB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhIHRoYXQgdGhlIHN0cmVhbSB3aWxsIGNhcnJ5LgpAQCAtNjA0LDE1ICs2NTksMTUgQEAKICAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCiAgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IHdoZXRoZXIgYSBzdHJlYW0gaXMgcGF1c2VkIHdoZW4gYSBub3RpZmljYXRpb24gb2NjdXJzLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQy4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDfS4KICAqCiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhLCBlZy4gQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gKKyAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhLCBlZy4ge0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSH0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSk7CisgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgdGhlIGlucHV0IChjYXB0dXJlKSBwcmVzZXQgZm9yIHRoZSBzdHJlYW0uCkBAIC02MjIsNyArNjc3LDcgQEAKICAqIFRoaXMgY291bGQsIGZvciBleGFtcGxlLCBhZmZlY3Qgd2hpY2ggbWljcm9waG9uZXMgYXJlIHVzZWQgYW5kIGhvdyB0aGUKICAqIHJlY29yZGVkIGRhdGEgaXMgcHJvY2Vzc2VkLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTi4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OfS4KICAqIFRoYXQgaXMgYmVjYXVzZSBWT0lDRV9SRUNPR05JVElPTiBpcyB0aGUgcHJlc2V0IHdpdGggdGhlIGxvd2VzdCBsYXRlbmN5CiAgKiBvbiBtYW55IHBsYXRmb3Jtcy4KICAqCkBAIC02MzIsMTYgKzY4NywzMiBAQAogICogQHBhcmFtIGlucHV0UHJlc2V0IHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIHJlY29yZGluZwogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KTsKKyAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworCisvKioKKyAqIFNwZWNpZnkgd2hldGhlciB0aGlzIHN0cmVhbSBhdWRpbyBtYXkgb3IgbWF5IG5vdCBiZSBjYXB0dXJlZCBieSBvdGhlciBhcHBzIG9yIHRoZSBzeXN0ZW0uCisgKgorICogVGhlIGRlZmF1bHQgaXMge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEx9LgorICoKKyAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gYWxzbyBzZXQgaXRzIGdsb2JhbCBwb2xpY3ksIGluIHdoaWNoIGNhc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUKKyAqIHBvbGljeSBpcyBhbHdheXMgYXBwbGllZC4gU2VlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlcyNzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShpbnQpfQorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOS4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGlucHV0UHJlc2V0IHRoZSBkZXNpcmVkIGxldmVsIG9mIG9wdC1vdXQgZnJvbSBiZWluZyBjYXB0dXJlZC4KKyAqLworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBjYXB0dXJlUG9saWN5KSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCiAvKiogU2V0IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRC4KICAqCiAgKiBUaGUgc2Vzc2lvbiBJRCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBzdHJlYW0gd2l0aCBlZmZlY3RzIHByb2Nlc3NvcnMuCiAgKiBUaGUgZWZmZWN0cyBhcmUgY29udHJvbGxlZCB1c2luZyB0aGUgQW5kcm9pZCBBdWRpb0VmZmVjdCBKYXZhIEFQSS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19TRVNTSU9OX0lEX05PTkUuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfTk9ORX0uCiAgKgotICogSWYgc2V0IHRvIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFIHRoZW4gYSBzZXNzaW9uIElEIHdpbGwgYmUgYWxsb2NhdGVkCisgKiBJZiBzZXQgdG8ge0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURX0gdGhlbiBhIHNlc3Npb24gSUQgd2lsbCBiZSBhbGxvY2F0ZWQKICAqIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKgogICogVGhlIGFsbG9jYXRlZCBzZXNzaW9uIElEIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nIEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoKQpAQCAtNjU5LDEwICs3MzAsMTAgQEAKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIHNlc3Npb25JZCBhbiBhbGxvY2F0ZWQgc2Vzc2lvbklEIG9yIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFCisgKiBAcGFyYW0gc2Vzc2lvbklkIGFuIGFsbG9jYXRlZCBzZXNzaW9uSUQgb3Ige0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURX0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCk7CisgICAgICAgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybiBvbmUgb2YgdGhlc2UgdmFsdWVzIGZyb20gdGhlIGRhdGEgY2FsbGJhY2sgZnVuY3Rpb24uCkBAIC03NDIsMTUgKzgxMywxNiBAQAogICoKICAqIE5vdGUgdGhhdCB3aGVuIHVzaW5nIHRoaXMgY2FsbGJhY2ssIHRoZSBhdWRpbyBkYXRhIHdpbGwgYmUgcGFzc2VkIGluIG9yIG91dAogICogb2YgdGhlIGZ1bmN0aW9uIGFzIGFuIGFyZ3VtZW50LgotICogU28geW91IGNhbm5vdCBjYWxsIEFBdWRpb1N0cmVhbV93cml0ZSgpIG9yIEFBdWRpb1N0cmVhbV9yZWFkKCkgb24gdGhlIHNhbWUgc3RyZWFtCi0gKiB0aGF0IGhhcyBhbiBhY3RpdmUgZGF0YSBjYWxsYmFjay4KKyAqIFNvIHlvdSBjYW5ub3QgY2FsbCBBQXVkaW9TdHJlYW1fd3JpdGUoKSBvciBBQXVkaW9TdHJlYW1fcmVhZCgpCisgKiBvbiB0aGUgc2FtZSBzdHJlYW0gdGhhdCBoYXMgYW4gYWN0aXZlIGRhdGEgY2FsbGJhY2suCiAgKgotICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgc3RhcnQgYmVpbmcgY2FsbGVkIGFmdGVyIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKSBpcyBjYWxsZWQuCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBzdGFydCBiZWluZyBjYWxsZWQgYWZ0ZXIgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpCisgKiBpcyBjYWxsZWQuCiAgKiBJdCB3aWxsIHN0b3AgYmVpbmcgY2FsbGVkIGFmdGVyIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoKSBvcgogICogQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkgaXMgY2FsbGVkLgogICoKICAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gYSByZWFsLXRpbWUgdGhyZWFkIG93bmVkIGJ5IEFBdWRpby4gU2VlCi0gKiB7QGxpbmsgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKiB7QGxpbmsgI0FBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2t9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKICAqIE5vdGUgdGhhdCB0aGUgQUF1ZGlvIGNhbGxiYWNrcyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCiAgKgpAQCAtNzYwLDE0ICs4MzIsMTMgQEAKICAqICAgICAgICAgIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMuCiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpOworICAgICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICp1c2VyRGF0YSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBTZXQgdGhlIHJlcXVlc3RlZCBkYXRhIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcy4KLSAqIFNlZSB7QGxpbmsgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30uCisgKiBTZWUge0BsaW5rICNBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICoKICAqIEZvciB0aGUgbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3ksIGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24uIEFBdWRpbyB3aWxsIHRoZW4KICAqIGNhbGwgdGhlIGRhdGFQcm9jIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggd2hhdGV2ZXIgc2l6ZSBpcyBvcHRpbWFsLgpAQCAtNzg0LDEwICs4NTUsMTAgQEAKICAqIGhhbGYgdGhlIGJ1ZmZlciBjYXBhY2l0eSwgdG8gYWxsb3cgZG91YmxlIGJ1ZmZlcmluZy4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3IgQUFVRElPX1VOU1BFQ0lGSUVECisgKiBAcGFyYW0gbnVtRnJhbWVzIHRoZSBkZXNpcmVkIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFByb3RvdHlwZSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkIHRvCkBAIC04NDAsMjkgKzkxMSwyOSBAQAogICogICAgICAgICAgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2Vycm9yQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSk7CisgICAgICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICp1c2VyRGF0YSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBPcGVuIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBvcHRpb25zIGluIHRoZSBTdHJlYW1CdWlsZGVyLgogICoKLSAqIEFBdWRpb1N0cmVhbV9jbG9zZSBtdXN0IGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIHN0cmVhbSB0byByZWNvdmVyCisgKiBBQXVkaW9TdHJlYW1fY2xvc2UoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIHN0cmVhbSB0byByZWNvdmVyCiAgKiB0aGUgbWVtb3J5IGFuZCB0byBmcmVlIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQogICogQHBhcmFtIHN0cmVhbSBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgbmV3IHN0cmVhbSByZWZlcmVuY2UKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbSoqIHN0cmVhbSk7CisgICAgICAgIEFBdWRpb1N0cmVhbSoqIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBEZWxldGUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFN0cmVhbUJ1aWxkZXIuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlcik7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlcikKKyAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFN0cmVhbSBDb250cm9sCkBAIC04NzIsNzAgKzk0Myw3NCBAQAogICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHN0cmVhbSBjcmVhdGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX2Nsb3NlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fY2xvc2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQXN5bmNocm9ub3VzbHkgcmVxdWVzdCB0byBzdGFydCBwbGF5aW5nIHRoZSBzdHJlYW0uIEZvciBvdXRwdXQgc3RyZWFtcywgb25lIHNob3VsZAogICogd3JpdGUgdG8gdGhlIHN0cmVhbSB0byBmaWxsIHRoZSBidWZmZXIgYmVmb3JlIHN0YXJ0aW5nLgogICogT3RoZXJ3aXNlIGl0IHdpbGwgdW5kZXJmbG93LgotICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcgb3IgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELgorICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElOR30gb3IKKyAqIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEfS4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFzeW5jaHJvbm91cyByZXF1ZXN0IGZvciB0aGUgc3RyZWFtIHRvIHBhdXNlLgogICogUGF1c2luZyBhIHN0cmVhbSB3aWxsIGZyZWV6ZSB0aGUgZGF0YSBmbG93IGJ1dCBub3QgZmx1c2ggYW55IGJ1ZmZlcnMuCi0gKiBVc2UgQUF1ZGlvU3RyZWFtX1N0YXJ0KCkgdG8gcmVzdW1lIHBsYXliYWNrIGFmdGVyIGEgcGF1c2UuCi0gKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HIG9yIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELgorICogVXNlIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKSB0byByZXN1bWUgcGxheWJhY2sgYWZ0ZXIgYSBwYXVzZS4KKyAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lOR30gb3IKKyAqIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUR9LgogICoKLSAqIFRoaXMgd2lsbCByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQgZm9yIGlucHV0IHN0cmVhbXMuCisgKiBUaGlzIHdpbGwgcmV0dXJuIHtAbGluayAjQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUR9IGZvciBpbnB1dCBzdHJlYW1zLgogICogRm9yIGlucHV0IHN0cmVhbXMgdXNlIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpLgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQXN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIHRoZSBzdHJlYW0gdG8gZmx1c2guCiAgKiBGbHVzaGluZyB3aWxsIGRpc2NhcmQgYW55IHBlbmRpbmcgZGF0YS4KICAqIFRoaXMgY2FsbCBvbmx5IHdvcmtzIGlmIHRoZSBzdHJlYW0gaXMgcGF1c2luZyBvciBwYXVzZWQuIFRPRE8gcmV2aWV3CiAgKiBGcmFtZSBjb3VudGVycyBhcmUgbm90IHJlc2V0IGJ5IGEgZmx1c2guIFRoZXkgbWF5IGJlIGFkdmFuY2VkLgotICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkcgb3IgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVELgorICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElOR30gb3IKKyAqIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEfS4KICAqCi0gKiBUaGlzIHdpbGwgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEIGZvciBpbnB1dCBzdHJlYW1zLgorICogVGhpcyB3aWxsIHJldHVybiB7QGxpbmsgI0FBVURJT19FUlJPUl9VTklNUExFTUVOVEVEfSBmb3IgaW5wdXQgc3RyZWFtcy4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFzeW5jaHJvbm91cyByZXF1ZXN0IGZvciB0aGUgc3RyZWFtIHRvIHN0b3AuCiAgKiBUaGUgc3RyZWFtIHdpbGwgc3RvcCBhZnRlciBhbGwgb2YgdGhlIGRhdGEgY3VycmVudGx5IGJ1ZmZlcmVkIGhhcyBiZWVuIHBsYXllZC4KLSAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HIG9yIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRC4KKyAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkd9IG9yCisgKiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRH0uCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgotICogUXVlcnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNsaWVudCwgZWcuIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORworICogUXVlcnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNsaWVudCwgZWcuIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HfQogICoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIHN0YXRlIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHN0YXRlLgogICogSWYgeW91IHdhbnQgdG8gdXBkYXRlIHRoZSBjbGllbnQgc3RhdGUgYmFzZWQgb24gdGhlIHNlcnZlciBzdGF0ZSB0aGVuCiAgKiBjYWxsIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoKSB3aXRoIGN1cnJlbnRTdGF0ZQotICogc2V0IHRvIEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiBhbmQgYSB6ZXJvIHRpbWVvdXQuCisgKiBzZXQgdG8ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV059IGFuZCBhIHplcm8gdGltZW91dC4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICovCi1BQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFdhaXQgdW50aWwgdGhlIGN1cnJlbnQgc3RhdGUgbm8gbG9uZ2VyIG1hdGNoZXMgdGhlIGlucHV0IHN0YXRlLgpAQCAtOTU3LDEyICsxMDMyLDExIEBACiAgKiBAcGFyYW0gaW5wdXRTdGF0ZSBUaGUgc3RhdGUgd2Ugd2FudCB0byBhdm9pZC4KICAqIEBwYXJhbSBuZXh0U3RhdGUgUG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIG5ldyBzdGF0ZS4KICAqIEBwYXJhbSB0aW1lb3V0TmFub3NlY29uZHMgTWF4aW11bSBudW1iZXIgb2YgbmFub3NlY29uZHMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgaW5wdXRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICpuZXh0U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGlucHV0U3RhdGUsIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAqbmV4dFN0YXRlLAorICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTdHJlYW0gSS9PCkBAIC05ODksOSArMTA2Myw3IEBACiAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHJlYWQgb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3JlYWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICAgICAgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogV3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtLgpAQCAtMTAxNCw5ICsxMDg2LDcgQEAKICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgd3JpdHRlbiBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd3JpdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU3RyZWFtIC0gcXVlcmllcwpAQCAtMTAzOSw3ICsxMTA5LDcgQEAKICAqIEByZXR1cm4gYWN0dWFsIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciBhIG5lZ2F0aXZlIGVycm9yCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGhvdXQgYmxvY2tpbmcuCkBAIC0xMDQ3LDcgKzExMTcsNyBAQAogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYnVmZmVyIHNpemUgaW4gZnJhbWVzLgogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmVhZCBvciB3cml0ZSBhdApAQCAtMTA2Miw3ICsxMTMyLDcgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGJ1cnN0IHNpemUKICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFF1ZXJ5IG1heGltdW0gYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcy4KQEAgLTEwNzAsNyArMTE0MCw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiAgYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcwogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZGF0YVByb2MgY2FsbGJhY2sKQEAgLTEwNzksMTkgKzExNDksMTkgQEAKICAqIFRoaXMgY2FsbCBjYW4gYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8ga25vdyB0aGUgdmFsdWUgb2YgbnVtRnJhbWVzIGJlZm9yZQogICogdGhlIHN0cmVhbSBpcyBzdGFydGVkLiBUaGlzIGlzIG5vdCBub3JtYWxseSBuZWNlc3NhcnkuCiAgKgotICogSWYgYSBzcGVjaWZpYyBzaXplIHdhcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpCi0gKiB0aGVuIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplLgorICogSWYgYSBzcGVjaWZpYyBzaXplIHdhcyByZXF1ZXN0ZWQgYnkgY2FsbGluZworICogQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKSB0aGVuIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplLgogICoKICAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkgd2FzIG5vdCBjYWxsZWQgdGhlbiB0aGlzIHdpbGwKLSAqIHJldHVybiB0aGUgc2l6ZSBjaG9zZW4gYnkgQUF1ZGlvLCBvciBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiByZXR1cm4gdGhlIHNpemUgY2hvc2VuIGJ5IEFBdWRpbywgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICoKLSAqIEFBVURJT19VTlNQRUNJRklFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGJhY2sgYnVmZmVyIHNpemUgZm9yIHRoaXMgc3RyZWFtCisgKiB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0gaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGZvciB0aGlzIHN0cmVhbQogICogbWF5IHZhcnkgZnJvbSBvbmUgZGF0YVByb2MgY2FsbGJhY2sgdG8gdGhlIG5leHQuCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gY2FsbGJhY2sgYnVmZmVyIHNpemUgaW4gZnJhbWVzIG9yIEFBVURJT19VTlNQRUNJRklFRAorICogQHJldHVybiBjYWxsYmFjayBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9CiAgKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFuIFhSdW4gaXMgYW4gVW5kZXJydW4gb3IgYW4gT3ZlcnJ1bi4KQEAgLTExMDgsMTMgKzExNzgsMTMgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIHRoZSB1bmRlcnJ1biBvciBvdmVycnVuIGNvdW50CiAgKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGFjdHVhbCBzYW1wbGUgcmF0ZQogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEEgc3RyZWFtIGhhcyBvbmUgb3IgbW9yZSBjaGFubmVscyBvZiBkYXRhLgpAQCAtMTEyMyw3ICsxMTkzLDcgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGFjdHVhbCBudW1iZXIgb2YgY2hhbm5lbHMKICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogSWRlbnRpY2FsIHRvIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoKS4KQEAgLTExMzEsMzkgKzEyMDEsNDEgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGFjdHVhbCBudW1iZXIgb2Ygc2FtcGxlcyBmcmFtZQogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGV2aWNlIElECiAgKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGF0YSBmb3JtYXQKICAqLwotQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFByb3ZpZGUgYWN0dWFsIHNoYXJpbmcgbW9kZS4KICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuICBhY3R1YWwgc2hhcmluZyBtb2RlCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IEFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19zaGFyaW5nX21vZGVfdCBBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogR2V0IHRoZSBwZXJmb3JtYW5jZSBtb2RlIHVzZWQgYnkgdGhlIHN0cmVhbS4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICovCi1BQVVESU9fQVBJIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBkaXJlY3Rpb24KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fZGlyZWN0aW9uX3QgQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19kaXJlY3Rpb25fdCBBQXVkaW9TdHJlYW1fZ2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFBhc3NlcyBiYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gc2luY2UgdGhlIHN0cmVhbSB3YXMgY3JlYXRlZC4KQEAgLTExNzYsNyArMTI0OCw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBmcmFtZXMgd3JpdHRlbgogICovCi1BQVVESU9fQVBJIGludDY0X3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFBhc3NlcyBiYWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgc2luY2UgdGhlIHN0cmVhbSB3YXMgY3JlYXRlZC4KQEAgLTExODksNyArMTI2MSw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBmcmFtZXMgcmVhZAogICovCi1BQVVESU9fQVBJIGludDY0X3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFBhc3NlcyBiYWNrIHRoZSBzZXNzaW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4KQEAgLTExOTcsMzQgKzEyNjksMzUgQEAKICAqIFRoZSBzZXNzaW9uIElEIGNhbiBiZSB1c2VkIHRvIGFzc29jaWF0ZSBhIHN0cmVhbSB3aXRoIGVmZmVjdHMgcHJvY2Vzc29ycy4KICAqIFRoZSBlZmZlY3RzIGFyZSBjb250cm9sbGVkIHVzaW5nIHRoZSBBbmRyb2lkIEF1ZGlvRWZmZWN0IEphdmEgQVBJLgogICoKLSAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkgd2FzIGNhbGxlZCB3aXRoIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcworICogY2FsbGVkIHdpdGgge0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURX0KICAqIHRoZW4gYSBuZXcgc2Vzc2lvbiBJRCBzaG91bGQgYmUgYWxsb2NhdGVkIG9uY2Ugd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqCiAgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBjYWxsZWQgd2l0aCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCiAgKiBzZXNzaW9uIElEIHRoZW4gdGhhdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCiAgKgogICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMgbm90IGNhbGxlZCB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkCi0gKiByZXR1cm4gQUFVRElPX1NFU1NJT05fSURfTk9ORS4KKyAqIHJldHVybiB7QGxpbmsgI0FBVURJT19TRVNTSU9OX0lEX05PTkV9LgogICoKICAqIFRoZSBzZXNzaW9uSUQgZm9yIGEgc3RyZWFtIHNob3VsZCBub3QgY2hhbmdlIG9uY2UgdGhlIHN0cmVhbSBoYXMgYmVlbiBvcGVuZWQuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIHNlc3Npb24gSUQgb3IgQUFVRElPX1NFU1NJT05fSURfTk9ORQorICogQHJldHVybiBzZXNzaW9uIElEIG9yIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfTk9ORX0KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fc2Vzc2lvbl9pZF90IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fc2Vzc2lvbl9pZF90IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUGFzc2VzIGJhY2sgdGhlIHRpbWUgYXQgd2hpY2ggYSBwYXJ0aWN1bGFyIGZyYW1lIHdhcyBwcmVzZW50ZWQuCiAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIGF1ZGlvIHdpdGggdmlkZW8gb3IgTUlESS4KICAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gYWxpZ24gYSByZWNvcmRlZCBzdHJlYW0gd2l0aCBhIHBsYXliYWNrIHN0cmVhbS4KICAqCi0gKiBUaW1lc3RhbXBzIGFyZSBvbmx5IHZhbGlkIHdoZW4gdGhlIHN0cmVhbSBpcyBpbiBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQuCi0gKiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBzdHJlYW0gaXMgbm90IHN0YXJ0ZWQuCisgKiBUaW1lc3RhbXBzIGFyZSBvbmx5IHZhbGlkIHdoZW4gdGhlIHN0cmVhbSBpcyBpbiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRH0uCisgKiB7QGxpbmsgI0FBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFfSB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBzdHJlYW0gaXMgbm90IHN0YXJ0ZWQuCiAgKiBOb3RlIHRoYXQgYmVjYXVzZSByZXF1ZXN0U3RhcnQoKSBpcyBhc3luY2hyb25vdXMsIHRpbWVzdGFtcHMgd2lsbCBub3QgYmUgdmFsaWQgdW50aWwKICAqIGEgc2hvcnQgdGltZSBhZnRlciBjYWxsaW5nIHJlcXVlc3RTdGFydCgpLgotICogU28gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGEgZmF0YWwgZXJyb3IuCisgKiBTbyB7QGxpbmsgI0FBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFfSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYSBmYXRhbCBlcnJvci4KICAqIEp1c3QgdHJ5IGNhbGxpbmcgYWdhaW4gbGF0ZXIuCiAgKgogICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGVuIHRoZSBwb3NpdGlvbiBhbmQgdGltZSB3aWxsIG5vdCBiZSBtb2RpZmllZC4KQEAgLTEyMzUsMTIgKzEzMDgsMTAgQEAKICAqIEBwYXJhbSBjbG9ja2lkIENMT0NLX01PTk9UT05JQyBvciBDTE9DS19CT09UVElNRQogICogQHBhcmFtIGZyYW1lUG9zaXRpb24gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHBvc2l0aW9uCiAgKiBAcGFyYW0gdGltZU5hbm9zZWNvbmRzIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byByZWNlaXZlIHRoZSB0aW1lCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NraWRfdCBjbG9ja2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpOworICAgICAgICBjbG9ja2lkX3QgY2xvY2tpZCwgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFJldHVybiB0aGUgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCkBAIC0xMjUwLDcgKzEzMjEsNyBAQAogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gZnJhbWVzIHJlYWQKICAqLwotQUFVRElPX0FQSSBhYXVkaW9fdXNhZ2VfdCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fdXNhZ2VfdCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmV0dXJuIHRoZSBjb250ZW50IHR5cGUgZm9yIHRoZSBzdHJlYW0uCkBAIC0xMjU4LDkgKzEzMjksMTAgQEAKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBjb250ZW50IHR5cGUsIGZvciBleGFtcGxlIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMKKyAqIEByZXR1cm4gY29udGVudCB0eXBlLCBmb3IgZXhhbXBsZSB7QGxpbmsgI0FBVURJT19DT05URU5UX1RZUEVfTVVTSUN9CiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19jb250ZW50X3R5cGVfdCBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmV0dXJuIHRoZSBpbnB1dCBwcmVzZXQgZm9yIHRoZSBzdHJlYW0uCkBAIC0xMjY4LDkgKzEzNDAsMjIgQEAKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBpbnB1dCBwcmVzZXQsIGZvciBleGFtcGxlIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSCisgKiBAcmV0dXJuIGlucHV0IHByZXNldCwgZm9yIGV4YW1wbGUge0BsaW5rICNBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUn0KICAqLwotQUFVRElPX0FQSSBhYXVkaW9faW5wdXRfcHJlc2V0X3QgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX2lucHV0X3ByZXNldF90IEFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI4KTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHBvbGljeSB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgYXVkaW8gbWF5IG9yIG1heSBub3QgYmUgY2FwdHVyZWQKKyAqIGJ5IG90aGVyIGFwcHMgb3IgdGhlIHN5c3RlbS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjkuCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gdGhlIGFsbG93ZWQgY2FwdHVyZSBwb2xpY3ksIGZvciBleGFtcGxlIHtAbGluayAjQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMfQorICovCitBQVVESU9fQVBJIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KAorICAgICAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQgYi9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKaW5kZXggY2JmNTkyMS4uYTg3ZWRlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CisrKyBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dApAQCAtMjAsNiArMjAsNyBAQAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2U7ICAgICAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQ7ICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3k7ICMgaW50cm9kdWNlZD0yOQogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkOyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZTsKQEAgLTQ5LDYgKzUwLDcgQEAKICAgICBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2U7ICAgICAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0OyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3k7ICMgaW50cm9kdWNlZD0yOQogICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuOwogICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkOwogICAgIEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQ7ICAgIyBpbnRyb2R1Y2VkPTI4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggYjllMjhhMC4uNDA5MDI4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtNiw2ICs2LDcgQEAKICAgICAgICAgImNsaWVudCIsCiAgICAgICAgICJjb3JlIiwKICAgICAgICAgImZpZm8iLAorICAgICAgICAiZmxvd2dyYXBoIiwKICAgICAgICAgImxlZ2FjeSIsCiAgICAgICAgICJ1dGlsaXR5IiwKICAgICBdLApAQCAtMjUsOSArMjYsOSBAQAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIiwKLSAgICAgICAgInV0aWxpdHkvTGluZWFyUmFtcC5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQnVmZmVyLmNwcCIsCiAgICAgICAgICJmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAiLAorICAgICAgICAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIiwKQEAgLTQyLDYgKzQzLDE2IEBACiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9SYW1wTGluZWFyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0kxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMjQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggZGQ2MjBlMy4uN2IwZDMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTk3LDggKzk3LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBiaW5kZXItPmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gcmV2aWV3IHdoYXQgd2Ugc2hvdWxkIGRvIGlmIHRoaXMgZmFpbHMKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRBQXVkaW9TZXJ2aWNlOiBsaW5rVG9EZWF0aChtQUF1ZGlvQ2xpZW50ID0gJXApIHJldHVybmVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUFBdWRpb0NsaWVudC5nZXQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgLSBsaW5rVG9EZWF0aCgpIHJldHVybmVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1BQXVkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb1NlcnZpY2U+KGJpbmRlcik7CiAgICAgICAgICAgICAgICAgbmVlZFRvUmVnaXN0ZXIgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDk1OWRiNjEuLmE5ODdmYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CkBAIC0zNiw2ICs0MCw3IEBACiAKIHN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0RGV2aWNlSWQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0U2FtcGxlUmF0ZSgpKTsKQEAgLTQ2LDYgKzUxLDcgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Rm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldERpcmVjdGlvbigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRCdWZmZXJDYXBhY2l0eSgpKTsKQEAgLTU2LDExICs2MiwxMyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRJbnB1dFByZXNldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0U2Vzc2lvbklkKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbCgpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODAsNyArODgsOCBAQAogICAgIHNldFNoYXJpbmdNb2RlKChhYXVkaW9fc2hhcmluZ19tb2RlX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Rm9ybWF0KChhYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKyAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKQEAgLTk4LDkgKzEwNywxMyBAQAogICAgIHNldElucHV0UHJlc2V0KChhYXVkaW9faW5wdXRfcHJlc2V0X3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QpIHZhbHVlKTsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0U2Vzc2lvbklkKHZhbHVlKTsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiByZWFkIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDYyMGVkYzcuLjk3YWQyYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApAQCAtNzIsNyArNzIsNiBAQAogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IHRyYW5zYWN0KE9QRU5fU1RSRUFNKSByZWFkSW50ICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBPUEVOX1NUUkVBTSBwYXNzZWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgICAgIHJldHVybiBzdHJlYW07CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gY29uZmlndXJhdGlvbk91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwpAQCAtMjUyLDggKzI1MSwxNSBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJQUF1ZGlvQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvQ2xpZW50PigKICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgcmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIC8vIHJlYWRTdHJvbmdCaW5kZXIoKSBjYW4gcmV0dXJuIG51bGwKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6OiVzKFJFR0lTVEVSX0NMSUVOVCkgY2xpZW50IGlzIE5VTEwhIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE2MjMwNDUzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNsaWVudChjbGllbnQpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIE9QRU5fU1RSRUFNOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKaW5kZXggMGIwY2Y3Ny4uYjZlODQ3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogCiB2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnNldHVwKGNvbnN0IHVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpIHsKICAgICBtRmQucmVzZXQoZHVwKGZkLmdldCgpKSk7IC8vIHN0b3JlIGEgZHVwbGljYXRlIGZkCi0gICAgQUxPR1YoInNldHVwKCVkIC0+ICVkLCAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CisgICAgQUxPR1YoInNldHVwKGZkID0gJWQgLT4gJWQsIHNpemUgPSAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKQEAgLTEwNCw3ICsxMDQsOCBAQAogICAgIG1SZXNvbHZlZEFkZHJlc3MgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaXplSW5CeXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZC5nZXQoKSwgMCk7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgPT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKLSAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIGVycm5vID0gJXMiLCBmZC5nZXQoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICVkLCBlcnJubyA9ICVzIiwKKyAgICAgICAgICAgICAgZmQuZ2V0KCksIG1TaXplSW5CeXRlcywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTE1Niw1ICsxNTcsNCBAQAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpkdW1wKCkgewogICAgIEFMT0dEKCJtRmQgPSAlZCIsIG1GZC5nZXQoKSk7CiAgICAgQUxPR0QoIm1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKLSAgICBBTE9HRCgibVJlc29sdmVkQWRkcmVzcyA9ICVwIiwgbVJlc29sdmVkQWRkcmVzcyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAppbmRleCA4MmMyMjQwLi40ZWMzOGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKQEAgLTcwLDggKzcwLDggQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZVNoYXJlZE1lbW9yeShjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAgIG1GZDsKLSAgICBpbnQzMl90ICAgICBtU2l6ZUluQnl0ZXMgPSAwOwotICAgIHVpbnQ4X3QgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2l6ZUluQnl0ZXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKIAogcHJpdmF0ZToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyYzQ4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb0Zsb3dHcmFwaCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBdWRpb0Zsb3dHcmFwaC5oIgorCisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0Zsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMTYuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTI0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9GbG93R3JhcGg6OmNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CisKKyAgICBBTE9HVigiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgc291cmNlQ2hhbm5lbENvdW50LCBzaW5rRm9ybWF0LCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHN3aXRjaCAoc291cmNlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUZsb2F0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMTY+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VJMjQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dCA9ICZtU291cmNlLT5vdXRwdXQ7CisKKyAgICAvLyBBcHBseSB2b2x1bWUgYXMgYSByYW1wIHRvIGF2b2lkIHBvcHMuCisgICAgbVZvbHVtZVJhbXAgPSBzdGQ6Om1ha2VfdW5pcXVlPFJhbXBMaW5lYXI+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVZvbHVtZVJhbXAtPmlucHV0KTsKKyAgICBsYXN0T3V0cHV0ID0gJm1Wb2x1bWVSYW1wLT5vdXRwdXQ7CisKKyAgICAvLyBGb3IgYSBwdXJlIGZsb2F0IGdyYXBoLCB0aGVyZSBpcyBjaGFuY2UgdGhhdCB0aGUgZGF0YSByYW5nZSBtYXkgYmUgdmVyeSBsYXJnZS4KKyAgICAvLyBTbyB3ZSBzaG91bGQgY2xpcCB0byBhIHJlYXNvbmFibGUgdmFsdWUgdGhhdCBhbGxvd3MgYSBsaXR0bGUgaGVhZHJvb20uCisgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUICYmIHNpbmtGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtQ2xpcHBlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpcFRvUmFuZ2U+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DbGlwcGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNsaXBwZXItPm91dHB1dDsKKyAgICB9CisKKyAgICAvLyBFeHBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpZiByZXF1aXJlZC4KKyAgICBpZiAoc291cmNlQ2hhbm5lbENvdW50ID09IDEgJiYgc2lua0NoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgbUNoYW5uZWxDb252ZXJ0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vbm9Ub011bHRpQ29udmVydGVyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNoYW5uZWxDb252ZXJ0ZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2hhbm5lbENvbnZlcnRlci0+b3V0cHV0OworICAgIH0gZWxzZSBpZiAoc291cmNlQ2hhbm5lbENvdW50ICE9IHNpbmtDaGFubmVsQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgQ2hhbm5lbCByZWR1Y3Rpb24gbm90IHN1cHBvcnRlZC4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNpbmtGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtGbG9hdD4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTE2PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNpbmsgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc2lua0Zvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1TaW5rLT5pbnB1dCk7CisKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6cHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Tb3VyY2UtPnNldERhdGEoc291cmNlLCBudW1GcmFtZXMpOworICAgIG1TaW5rLT5yZWFkKGRlc3RpbmF0aW9uLCBudW1GcmFtZXMpOworfQorCisvKioKKyAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICovCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRUYXJnZXQodm9sdW1lKTsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcykgeworICAgIG1Wb2x1bWVSYW1wLT5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlmNjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisjZGVmaW5lIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisKK2NsYXNzIEFBdWRpb0Zsb3dHcmFwaCB7CitwdWJsaWM6CisgICAgLyoqIENvbm5lY3Qgc2V2ZXJhbCBtb2R1bGVzIHRvZ2V0aGVyIHRvIGNvbnZlcnQgZnJvbSBzb3VyY2UgdG8gc2luay4KKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZUZvcm1hdAorICAgICAqIEBwYXJhbSBzb3VyY2VDaGFubmVsQ291bnQKKyAgICAgKiBAcGFyYW0gc2lua0Zvcm1hdAorICAgICAqIEBwYXJhbSBzaW5rQ2hhbm5lbENvdW50CisgICAgICogQHJldHVybgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBzaW5rRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICpzb3VyY2UsIHZvaWQgKmRlc3RpbmF0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgdm9pZCBzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU291cmNlPiAgICAgICAgICBtU291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OlJhbXBMaW5lYXI+ICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpDbGlwVG9SYW5nZT4gICAgICAgICAgbUNsaXBwZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6TW9ub1RvTXVsdGlDb252ZXJ0ZXI+IG1DaGFubmVsQ29udmVydGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkF1ZGlvU2luaz4gICAgICAgICAgICBtU2luazsKK307CisKKworI2VuZGlmIC8vQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IGY4ZTM0ZDEuLjIxNGY4ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKQpAQCAtMjA2LDE1ICsyMDYsMTUgQEAKIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VXcml0ZUluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlUmVhZEluZGV4KGludDMyX3QgZGVsdGFGcmFtZXMpIHsKLSAgICBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVJlYWRJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6c2V0RGF0YVJlYWRDb3VudGVyKGZpZm9fY291bnRlcl90IGZyYW1lc1JlYWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCmluZGV4IDkyMDQ4MjQuLjUyZWFkZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIApAQCAtNjMsNyArNjIsNyBAQAogICAgICAgICAsIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKEFBVURJT19IQU5ETEVfSU5WQUxJRCkKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkKICAgICAgICAgLCBtU2VydmljZUludGVyZmFjZShzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQorICAgICAgICAsIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcCgpCiAgICAgICAgICwgbVdha2V1cERlbGF5TmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgICwgbU1pbmltdW1TbGVlcE5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgewpAQCAtNzcsNiArNzYsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaW50MzJfdCBjYXBhY2l0eTsKICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0OworICAgIGludDMyX3QgZnJhbWVzUGVySGFyZHdhcmVCdXJzdDsKICAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0IHJlcXVlc3Q7CiAgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uT3V0cHV0OwogCkBAIC05MSwxMiArOTEsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBjb25zdCBpbnQzMl90IGJ1cnN0TWluTWljcm9zID0gQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOworICAgIGludDMyX3QgYnVyc3RNaWNyb3MgPSAwOworCiAgICAgLy8gV2UgaGF2ZSB0byBkbyB2b2x1bWUgc2NhbGluZy4gU28gd2UgcHJlZmVyIEZMT0FUIGZvcm1hdC4KLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCi0gICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwpAQCAtMTI2LDEzICsxMjksMTIgQEAKICAgICAgICAgLy8gaWYgdGhhdCBmYWlsZWQgdGhlbiB0cnkgc3dpdGNoaW5nIGZyb20gbW9ubyB0byBzdGVyZW8gaWYgT1VUUFVULgogICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaW4gdGhlIGNsaWVudC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGEgbW9ubyBtaXhlciBpbiB0aGUgc2VydmljZQogICAgICAgICAvLyB0aGF0IHdyaXRlcyB0byBhIHN0ZXJlbyBNTUFQIHN0cmVhbS4KLSAgICAgICAgQUxPR0QoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKDIpOyAvLyBzdGVyZW8KICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBtU2VydmljZVN0cmVhbUhhbmRsZTsKICAgICB9CiAKQEAgLTE3NSw4ICsxNzcsMjIgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICAvLyBWYWxpZGF0ZSByZXN1bHQgZnJvbSBzZXJ2ZXIuCi0gICAgZnJhbWVzUGVyQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisgICAgZnJhbWVzUGVySGFyZHdhcmVCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKKworICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCisgICAgLy8gVGhpcyBpcyB0byBhdm9pZCB3YWtpbmcgdGhlIENQVSB0b28gb2Z0ZW4gd2hlbiB0aGUgSFcgYnVyc3QgaXMgdmVyeSBzbWFsbAorICAgIC8vIG9yIGF0IGhpZ2ggc2FtcGxlIHJhdGVzLgorICAgIGZyYW1lc1BlckJ1cnN0ID0gZnJhbWVzUGVySGFyZHdhcmVCdXJzdDsKKyAgICBkbyB7CisgICAgICAgIGlmIChidXJzdE1pY3JvcyA+IDApIHsgIC8vIHNraXAgZmlyc3QgbG9vcAorICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3QgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBidXJzdE1pY3JvcyA9IGZyYW1lc1BlckJ1cnN0ICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oMTAwMDAwMCkgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgfSB3aGlsZSAoYnVyc3RNaWNyb3MgPCBidXJzdE1pbk1pY3Jvcyk7CisgICAgQUxPR0QoIiVzKCkgb3JpZ2luYWwgSFcgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQgPT4gU1cgYnVyc3QgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZnJhbWVzUGVySGFyZHdhcmVCdXJzdCwgYnVyc3RNaW5NaWNyb3MsIGZyYW1lc1BlckJ1cnN0KTsKKworICAgIC8vIFZhbGlkYXRlIGZpbmFsIGJ1cnN0IHNpemUuCiAgICAgaWYgKGZyYW1lc1BlckJ1cnN0IDwgTUlOX0ZSQU1FU19QRVJfQlVSU1QgfHwgZnJhbWVzUGVyQnVyc3QgPiBNQVhfRlJBTUVTX1BFUl9CVVJTVCkgewogICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIF9fZnVuY19fLCBmcmFtZXNQZXJCdXJzdCk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CkBAIC0xOTIsMTggKzIwOCwxOCBAQAogICAgIH0KIAogICAgIG1DbG9ja01vZGVsLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgIG1DbG9ja01vZGVsLnNldEZyYW1lc1BlckJ1cnN0KGZyYW1lc1BlckhhcmR3YXJlQnVyc3QpOwogCiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkpIHsKICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICAgICAgaWYgKG1DYWxsYmFja0ZyYW1lcyA+IGdldEJ1ZmZlckNhcGFjaXR5KCkgLyAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayB0b28gYmlnID0gJWQsIGNhcGFjaXR5ID0gJWQiLAorICAgICAgICAgICAgQUxPR1coIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2FsbGJhY2tGcmFtZXMsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICAgICAgfSBlbHNlIGlmIChtQ2FsbGJhY2tGcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTIxMiw5ICsyMjgsNyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lID0gZ2V0U2FtcGxlc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOwotICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwogICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOwogICAgIH0KIApAQCAtMjI3LDIyICsyNDEsMTggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmNsb3NlKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgQUxPR0QoIiVzKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICBBTE9HVigiJXMoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSAhPSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgLy8gRG9uJ3QgY2xvc2UgYSBzdHJlYW0gd2hpbGUgaXQgaXMgcnVubmluZy4KICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7Ci0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CisgICAgICAgIC8vIERvbid0IGNsb3NlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuIFN0b3AgaXQgZmlyc3QuCisgICAgICAgIC8vIElmIERJU0NPTk5FQ1RFRCB0aGVuIHdlIHNob3VsZCBzdGlsbCB0cnkgdG8gc3RvcCBpbiBjYXNlIHRoZQorICAgICAgICAvLyBlcnJvciBjYWxsYmFjayBpcyBzdGlsbCBydW5uaW5nLgorICAgICAgICBpZiAoaXNBY3RpdmUoKSB8fCBjdXJyZW50U3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgIHJlcXVlc3RTdG9wKCk7Ci0gICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgbmV4dFN0YXRlOwotICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMgPSBNSU5fVElNRU9VVF9OQU5PUzsKLSAgICAgICAgICAgIHJlc3VsdCA9IHdhaXRGb3JTdGF0ZUNoYW5nZShjdXJyZW50U3RhdGUsICZuZXh0U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgd2FpdEZvclN0YXRlQ2hhbmdlKCkgcmV0dXJuZWQgJWQgJXMiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7CiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CkBAIC0yODcsMTcgKzI5NywxNyBAQAogewogICAgIGludDY0X3Qgc3RhcnRUaW1lOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIGFscmVhZHkgYWN0aXZlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgb3JpZ2luYWxTdGF0ZSA9IGdldFN0YXRlKCk7CiAgICAgaWYgKG9yaWdpbmFsU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIGJ1dCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIGJ1dCBESVNDT05ORUNURUQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpOwpAQCAtMzQzLDM5ICszNTMsNDggQEAKICAgICByZXR1cm4gY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CiB9CiAKKy8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6c3RvcENhbGxiYWNrKCkKIHsKLSAgICBpZiAoaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSkgeworICAgIGlmIChpc0RhdGFDYWxsYmFja1NldCgpCisgICAgICAgICAgICAmJiAoaXNBY3RpdmUoKSB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSkgewogICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIGpvaW5UaHJlYWQoTlVMTCk7CisgICAgICAgIHJldHVybiBqb2luVGhyZWFkKE5VTEwpOyAvLyBtYXkgdGVtcG9yYXJpbHkgdW5sb2NrIG1TdHJlYW1Mb2NrCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpCi17CisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKyAgICAvLyBUaGUgc3RyZWFtIG1heSBoYXZlIGJlZW4gdW5sb2NrZWQgdGVtcG9yYXJpbHkgdG8gbGV0IGEgY2FsbGJhY2sgZmluaXNoCisgICAgLy8gYW5kIHRoZSBjYWxsYmFjayBtYXkgaGF2ZSBzdG9wcGVkIHRoZSBzdHJlYW0uCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdHJlYW0gc3RpbGwgbmVlZHMgdG8gYmUgc3RvcHBlZC4KKyAgICAvLyBTZWUgYWxzbyBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKS4KKyAgICBpZiAoIShpc0FjdGl2ZSgpIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfQogCiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0b3BJbnRlcm5hbCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQgPSAweCUwOFgiLAotICAgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQgPSAweCUwOFgiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJyZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucmVnaXN0ZXJBdWRpb1RocmVhZChtU2VydmljZVN0cmVhbUhhbmRsZSwKQEAgLTM4NSw3ICs0MDQsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dW5yZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyVGhyZWFkKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIpOworICAgICAgICBBTE9HVygiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS51bnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGdldHRpZCgpKTsKQEAgLTQxNyw4ICs0MzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0ludGVybmFsVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0ludGVybmFsVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgICAgICBpZiAocG9zaXRpb24gPj0gMCkgewogICAgICAgICAgICAgKmZyYW1lUG9zaXRpb24gPSBwb3NpdGlvbjsKQEAgLTQ2NSw3ICs0ODQsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAobWVzc2FnZS0+dGltZXN0YW1wLnBvc2l0aW9uLCBtZXNzYWdlLT50aW1lc3RhbXAudGltZXN0YW1wKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtNjk2LDcgKzcxNSw2IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7Ci0gICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC03MTYsNiArNzM0LDExIEBACiAgICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKIH0KIAorLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICByZXR1cm4gQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQocmV0dXJuQXJnLCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChnZXRGcmFtZXNQZXJCdXJzdCgpKSk7CiB9CisKK2Jvb2wgQXVkaW9TdHJlYW1JbnRlcm5hbDo6aXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3QgeworICAgIHJldHVybiBpc0FjdGl2ZSgpICYmIG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSAmJiBtQ2xvY2tNb2RlbC5pc1J1bm5pbmcoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCAwNDI1Y2Q1Li44NmM0Njk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CkBAIC0xNDUsNiArMTQ0LDE0IEBACiAgICAgICovCiAgICAgYm9vbCBpc0luU2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1JblNlcnZpY2U7IH0KIAorICAgIC8qKgorICAgICAqIElzIHRoZSBzZXJ2aWNlIEZJRk8gcG9zaXRpb24gY3VycmVudGx5IGNvbnRyb2xsZWQgYnkgdGhlIEFBdWRpbyBzZXJ2aWNlIG9yIEhBTCwKKyAgICAgKiBvciBzZXQgYmFzZWQgb24gdGhlIENsb2NrIE1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDbG9ja01vZGVsIGlzIGN1cnJlbnRseSBkZXRlcm1pbmluZyB0aGUgRklGTyBwb3NpdGlvbgorICAgICAqLworICAgIGJvb2wgaXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3Q7CisKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKIAogICAgIEF1ZGlvRW5kcG9pbnQgICAgICAgICAgICBtQXVkaW9FbmRwb2ludDsgICAvLyBzb3VyY2UgZm9yIHJlYWRzIG9yIHNpbmsgZm9yIHdyaXRlcwpAQCAtMTY0LDcgKzE3MSw3IEBACiAKICAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmbVNlcnZpY2VJbnRlcmZhY2U7ICAgLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlCiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgIG1OZWVkQ2F0Y2hVcDsgICAvLyBBc2sgcmVhZCgpIG9yIHdyaXRlKCkgdG8gc3luYyBvbiBmaXJzdCB0aW1lc3RhbXAuCiAKQEAgLTE5Myw2ICsyMDAsOCBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIAorICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudCBmcm9tIHRoZSBhcHAuCisgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAwNzE5ZmUxLi5hNmNjNDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgpAQCAtMTY1LDM1ICsxNjYsMzYgQEAKICAgICAvLyBSZWFkIGRhdGEgaW4gb25lIG9yIHR3byBwYXJ0cy4KICAgICBmb3IgKGludCBwYXJ0SW5kZXggPSAwOyBmcmFtZXNMZWZ0ID4gMCAmJiBwYXJ0SW5kZXggPCBXcmFwcGluZ0J1ZmZlcjo6U0laRTsgcGFydEluZGV4KyspIHsKICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNMZWZ0OwotICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOworICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOwogICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlIDw9IDApIGJyZWFrOwogCiAgICAgICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiBmcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgIGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0F2YWlsYWJsZTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBjb25zdCBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOworICAgICAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZGVzdGluYXRpb25Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IGdldEZvcm1hdCgpKSB7CisgICAgICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gZGVzdGluYXRpb25Gb3JtYXQpIHsKICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBudW1CeXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAogICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEgYXVkaW9fZm9ybWF0X3Qgc291cmNlID0gJXUsIGRlc3QgPSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgfQogICAgICAgICBkZXN0aW5hdGlvbiArPSBudW1CeXRlczsKQEAgLTIwOCwxNyArMjEwLDEyIEBACiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1dyaXR0ZW4oKSB7Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmU7Ci0gICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlID0gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKLSAgICB9Ci0gICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpCisgICAgICAgICAgICA/IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKQorICAgICAgICAgICAgOiBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgogICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwotICAgIC8vQUxPR0QoImdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAotICAgIC8vICAgICAgKGxvbmcgbG9uZyltTGFzdEZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBtTGFzdEZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTI1Niw3ICsyNTMsOCBAQAogICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1heWJlQ2FsbERhdGFDYWxsYmFjayhtQ2FsbGJhY2tCdWZmZXIsIG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR0QoImNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIpOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDc5NWJhMmMuLmI4ZWYyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQzLDEzICs0MywyMiBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGJ1aWxkZXIpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHJlc3VsdCA9IG1GbG93R3JhcGguY29uZmlndXJlKGdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgICAvLyBTYW1wbGUgcmF0ZSBpcyBjb25zdHJhaW5lZCB0byBjb21tb24gdmFsdWVzIGJ5IG5vdyBhbmQgc2hvdWxkIG5vdCBvdmVyZmxvdy4KICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBrUmFtcE1TZWMgKiBnZXRTYW1wbGVSYXRlKCkgLyBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQ7Ci0gICAgICAgIG1Wb2x1bWVSYW1wLnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgICAgIG1GbG93R3JhcGguc2V0UmFtcExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKKy8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZSgpCiB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOwpAQCAtNTcsMTkgKzY2LDE5IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnBhdXNlU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0Rmx1c2goKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0yMTYsMjIgKzIyNSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Xcml0ZTsKLSAgICAgICAgICAgIC8vIERhdGEgY29udmVyc2lvbi4KLSAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbTsKLSAgICAgICAgICAgIGZsb2F0IGxldmVsVG87Ci0gICAgICAgICAgICBtVm9sdW1lUmFtcC5uZXh0U2VnbWVudChmcmFtZXNUb1dyaXRlLCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7CiAKLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgc291cmNlKAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWJ5dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIGRlc3RpbmF0aW9uKAotICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7Ci0KLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoc291cmNlLCBkZXN0aW5hdGlvbiwgZnJhbWVzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKKyAgICAgICAgICAgIG1GbG93R3JhcGgucHJvY2Vzcygodm9pZCAqKWJ5dGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUpOwogCiAgICAgICAgICAgICBieXRlQnVmZmVyICs9IG51bUJ5dGVzOwogICAgICAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1dyaXRlOwpAQCAtMjQ2LDI3ICsyNDMsMTcgQEAKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAotaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzUmVhZCgpCi17Ci0gICAgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmU7Ci0gICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgZnJhbWVzUmVhZEhhcmR3YXJlID0gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lc1JlYWRIYXJkd2FyZSA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpOwotICAgIH0KLSAgICBpbnQ2NF90IGZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7Ci0gICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KLSAgICBpZiAoZnJhbWVzUmVhZCA8IG1MYXN0RnJhbWVzUmVhZCkgewotICAgICAgICBmcmFtZXNSZWFkID0gbUxhc3RGcmFtZXNSZWFkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1MYXN0RnJhbWVzUmVhZCA9IGZyYW1lc1JlYWQ7Ci0gICAgfQotICAgIHJldHVybiBmcmFtZXNSZWFkOworaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzUmVhZCgpIHsKKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1JlYWRIYXJkd2FyZSA9IGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpCisgICAgICAgICAgICA/IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKQorICAgICAgICAgICAgOiBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKKyAgICAvLyBBZGQgc2VydmljZSBvZmZzZXQgYW5kIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCisgICAgbUxhc3RGcmFtZXNSZWFkID0gc3RkOjptYXgobUxhc3RGcmFtZXNSZWFkLCBmcmFtZXNSZWFkSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOworICAgIHJldHVybiBtTGFzdEZyYW1lc1JlYWQ7CiB9CiAKLWludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKQotewotICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKQoraW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzV3JpdHRlbigpIHsKKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KQEAgLTI5Nyw3ICsyODQsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR1YoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXN1bHQgPSBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTMxMyw2ICszMDEsNiBAQAogICAgIGZsb2F0IGNvbWJpbmVkVm9sdW1lID0gbVN0cmVhbVZvbHVtZSAqIGdldER1Y2tBbmRNdXRlVm9sdW1lKCk7CiAgICAgQUxPR0QoIiVzKCkgbVN0cmVhbVZvbHVtZSAqIGR1Y2tBbmRNdXRlVm9sdW1lID0gJWYgKiAlZiA9ICVmIiwKICAgICAgICAgICBfX2Z1bmNfXywgbVN0cmVhbVZvbHVtZSwgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSwgY29tYmluZWRWb2x1bWUpOwotICAgIG1Wb2x1bWVSYW1wLnNldFRhcmdldChjb21iaW5lZFZvbHVtZSk7CisgICAgbUZsb3dHcmFwaC5zZXRUYXJnZXRWb2x1bWUoY29tYmluZWRWb2x1bWUpOwogICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IDk3N2E5MDkuLmNhYjI5NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIgorI2luY2x1ZGUgImNsaWVudC9BQXVkaW9GbG93R3JhcGguaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKQEAgLTkzLDcgKzk0LDcgQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSAwOyAvLyB1c2VkIHRvIHByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24KIAotICAgIExpbmVhclJhbXAgICAgICAgICAgICAgICBtVm9sdW1lUmFtcDsKKyAgICBBQXVkaW9GbG93R3JhcGggICAgICAgICAgbUZsb3dHcmFwaDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKaW5kZXggOTViNTJiZS4uNzQ3ZDBlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCkBAIC02MCwxMCArNjAsMTQgQEAKICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogfQogCi1ib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNTdGFydGluZygpIHsKK2Jvb2wgSXNvY2hyb25vdXNDbG9ja01vZGVsOjppc1N0YXJ0aW5nKCkgY29uc3QgewogICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfU1RBUlRJTkc7CiB9CiAKK2Jvb2wgSXNvY2hyb25vdXNDbG9ja01vZGVsOjppc1J1bm5pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HOworfQorCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6cHJvY2Vzc1RpbWVzdGFtcChpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpIHsKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBmcmFtZVBvc2l0aW9uID0gJWxsZCBhdCBuYW5vVGltZSAlbGx1IiwKIC8vICAgICAgICAgKGxvbmcgbG9uZylmcmFtZVBvc2l0aW9uLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA3MTgyMzc2Li40NmNhNDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMzYsNyArMzYsMTUgQEAKICAgICB2b2lkIHN0YXJ0KGludDY0X3QgbmFub1RpbWUpOwogICAgIHZvaWQgc3RvcChpbnQ2NF90IG5hbm9UaW1lKTsKIAotICAgIGJvb2wgaXNTdGFydGluZygpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgc3RhcnRpbmcgdXAKKyAgICAgKi8KKyAgICBib29sIGlzU3RhcnRpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgcnVubmluZyBhbmQgcHJvZHVjaW5nIHZhbGlkIHJlc3VsdHMKKyAgICAgKi8KKyAgICBib29sIGlzUnVubmluZygpIGNvbnN0OwogCiAgICAgdm9pZCBwcm9jZXNzVGltZXN0YW1wKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50NjRfdCBuYW5vVGltZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IGRmMGRiNzkuLjQ0ZDUxMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtMTQ2LDE0ICsxNDYsMTQgQEAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQogewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtMTY3LDcgKzE2Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChmb3JtYXQpOworICAgIC8vIFVzZSBhdWRpb19mb3JtYXRfdCBldmVyeXdoZXJlIGludGVybmFsbHkuCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZm9ybWF0KTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtMjAyLDYgKzIwNCwxMiBAQAogICAgIHN0cmVhbUJ1aWxkZXItPnNldEJ1ZmZlckNhcGFjaXR5KGZyYW1lcyk7CiB9CiAKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5KAorICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLCBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSkgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHBvbGljeSk7Cit9CisKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKQogewpAQCAtMjM4LDE4ICsyNDYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CisgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGlkID0gMDsKICAgICAvLyBQbGVhc2UgbGVhdmUgdGhlc2UgbG9ncyBiZWNhdXNlIHRoZXkgYXJlIHZlcnkgaGVscGZ1bCB3aGVuIGRlYnVnZ2luZy4KLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HSSgiJXMoKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fKTsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBDT01NT05fR0VUX0ZST01fQlVJTERFUl9PUl9SRVRVUk4oc3RyZWFtUHRyKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RyZWFtQnVpbGRlci0+YnVpbGQoJmF1ZGlvU3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkgcmV0dXJucyAlZCA9ICVzIGZvciAoJXApIC0tLS0tLS0tLS0tLS0tLS0iLAotICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSwgYXVkaW9TdHJlYW0pOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIGF1ZGlvU3RyZWFtLT5yZWdpc3RlclBsYXllckJhc2UoKTsKICAgICAgICAgKnN0cmVhbVB0ciA9IChBQXVkaW9TdHJlYW0qKSBhdWRpb1N0cmVhbTsKKyAgICAgICAgaWQgPSBhdWRpb1N0cmVhbS0+Z2V0SWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICAqc3RyZWFtUHRyID0gbnVsbHB0cjsKICAgICB9CisgICAgQUxPR0koIiVzKCkgcmV0dXJucyAlZCA9ICVzIGZvciBzIyV1IC0tLS0tLS0tLS0tLS0tLS0iLAorICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLCBpZCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjY3LDggKzI3Nyw5IEBACiB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19FUlJPUl9OVUxMOwogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CiAgICAgaWYgKGF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGlkID0gYXVkaW9TdHJlYW0tPmdldElkKCk7CisgICAgICAgIEFMT0dEKCIlcyhzIyV1KSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkKTsKICAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnNhZmVDbG9zZSgpOwogICAgICAgICAvLyBDbG9zZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgogICAgICAgICAvLyBUaGF0IHdvdWxkIHJlc3VsdCBpbiBkZWxldGluZyBhbiBhY3RpdmUgc3RyZWFtLCB3aGljaCB3b3VsZCBjYXVzZSBhIGNyYXNoLgpAQCAtMjc4LDQzICsyODksNDAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBhdHRlbXB0IHRvIGNsb3NlIGZhaWxlZC4gQ2xvc2UgaXQgZnJvbSBhbm90aGVyIHRocmVhZC4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKHMjJXUpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCwgcmVzdWx0KTsKICAgICB9Ci0gICAgLy8gV2UncmUgcG90ZW50aWFsbHkgZnJlZWluZyBgc3RyZWFtYCBhYm92ZSwgc28gaXRzIHVzZSBoZXJlIG1ha2VzIHNvbWUKLSAgICAvLyBzdGF0aWMgYW5hbHlzaXMgdG9vbHMgdW5oYXBweS4gQ2FzdGluZyB0byB1aW50cHRyX3QgaGVscHMgYXNzdXJlCi0gICAgLy8gc2FpZCB0b29scyB0aGF0IHdlJ3JlIG5vdCBkb2luZyBhbnl0aGluZyBiYWQgaGVyZS4KLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCUjIiBQUkl4UFRSICIpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0cmVhbSksIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBhYXVkaW9fc3RyZWFtX2lkX3QgaWQgPSBhdWRpb1N0cmVhbS0+Z2V0SWQoKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKKyAgICBBTE9HRCgiJXMocyMldSkgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIiwgX19mdW5jX18sIGF1ZGlvU3RyZWFtLT5nZXRJZCgpKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVBhdXNlKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIiwgX19mdW5jX18sIGF1ZGlvU3RyZWFtLT5nZXRJZCgpKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnNhZmVGbHVzaCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCglcCkiLCBzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOworICAgIEFMT0dEKCIlcyhzIyV1KSBjYWxsZWQiLCBfX2Z1bmNfXywgYXVkaW9TdHJlYW0tPmdldElkKCkpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTM2Myw3ICszNzEsNyBAQAogCiAgICAgLy8gRG9uJ3QgYWxsb3cgd3JpdGVzIHdoZW4gcGxheWluZyB3aXRoIGEgY2FsbGJhY2suCiAgICAgaWYgKGF1ZGlvU3RyZWFtLT5pc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgd3JpdGUgdG8gYSBjYWxsYmFjayBzdHJlYW0gd2hlbiBydW5uaW5nLiIpOworICAgICAgICBBTE9HRCgiQ2Fubm90IHdyaXRlIHRvIGEgY2FsbGJhY2sgc3RyZWFtIHdoZW4gcnVubmluZy4iKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtNDA4LDcgKzQxNiw5IEBACiBBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxseS4KKyAgICBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTQ5MCw2ICs1MDAsMTMgQEAKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldElucHV0UHJlc2V0KCk7CiB9CiAKK0FBVURJT19BUEkgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koCisgICAgICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpOworfQorCiBBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCmluZGV4IGQ1NjcwMWIuLmM5NzExZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKQEAgLTM1LDI4ICszNSw0MyBAQAogQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6fkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogCiB2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKSB7Ci0gICAgbVNhbXBsZXNQZXJGcmFtZSA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7Ci0gICAgbVNhbXBsZVJhdGUgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOwotICAgIG1EZXZpY2VJZCAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7Ci0gICAgbVNlc3Npb25JZCAgICAgICA9IG90aGVyLm1TZXNzaW9uSWQ7Ci0gICAgbVNoYXJpbmdNb2RlICAgICA9IG90aGVyLm1TaGFyaW5nTW9kZTsKLSAgICBtQXVkaW9Gb3JtYXQgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OwotICAgIG1EaXJlY3Rpb24gICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOwotICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7Ci0gICAgbVVzYWdlICAgICAgICAgICA9IG90aGVyLm1Vc2FnZTsKLSAgICBtQ29udGVudFR5cGUgICAgID0gb3RoZXIubUNvbnRlbnRUeXBlOwotICAgIG1JbnB1dFByZXNldCAgICAgPSBvdGhlci5tSW5wdXRQcmVzZXQ7CisgICAgbVNhbXBsZXNQZXJGcmFtZSAgICAgID0gb3RoZXIubVNhbXBsZXNQZXJGcmFtZTsKKyAgICBtU2FtcGxlUmF0ZSAgICAgICAgICAgPSBvdGhlci5tU2FtcGxlUmF0ZTsKKyAgICBtRGV2aWNlSWQgICAgICAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7CisgICAgbVNlc3Npb25JZCAgICAgICAgICAgID0gb3RoZXIubVNlc3Npb25JZDsKKyAgICBtU2hhcmluZ01vZGUgICAgICAgICAgPSBvdGhlci5tU2hhcmluZ01vZGU7CisgICAgbUF1ZGlvRm9ybWF0ICAgICAgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OworICAgIG1EaXJlY3Rpb24gICAgICAgICAgICA9IG90aGVyLm1EaXJlY3Rpb247CisgICAgbUJ1ZmZlckNhcGFjaXR5ICAgICAgID0gb3RoZXIubUJ1ZmZlckNhcGFjaXR5OworICAgIG1Vc2FnZSAgICAgICAgICAgICAgICA9IG90aGVyLm1Vc2FnZTsKKyAgICBtQ29udGVudFR5cGUgICAgICAgICAgPSBvdGhlci5tQ29udGVudFR5cGU7CisgICAgbUlucHV0UHJlc2V0ICAgICAgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OworICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IG90aGVyLm1BbGxvd2VkQ2FwdHVyZVBvbGljeTsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBpc0Zvcm1hdFZhbGlkKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoImF1ZGlvRm9ybWF0IG5vdCB2YWxpZCwgYXVkaW9fZm9ybWF0X3QgPSAweCUwOHgiLCBmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1TYW1wbGVzUGVyRnJhbWUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlc1BlckZyYW1lIDwgU0FNUExFU19QRVJfRlJBTUVfTUlOIHx8IG1TYW1wbGVzUGVyRnJhbWUgPiBTQU1QTEVTX1BFUl9GUkFNRV9NQVgpKSB7Ci0gICAgICAgIEFMT0dFKCJjaGFubmVsQ291bnQgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgQUxPR0QoImNoYW5uZWxDb3VudCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKICAgICBpZiAobURldmljZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiZGV2aWNlSWQgb3V0IG9mIHJhbmdlID0gJWQiLCBtRGV2aWNlSWQpOworICAgICAgICBBTE9HRCgiZGV2aWNlSWQgb3V0IG9mIHJhbmdlID0gJWQiLCBtRGV2aWNlSWQpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKQEAgLTc0LDMwICs4OSwyMiBAQAogICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiaWxsZWdhbCBzaGFyaW5nTW9kZSA9ICVkIiwgbVNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgIEFMT0dEKCJpbGxlZ2FsIHNoYXJpbmdNb2RlID0gJWQiLCBtU2hhcmluZ01vZGUpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQogCi0gICAgc3dpdGNoIChtQXVkaW9Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOgotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImF1ZGlvRm9ybWF0IG5vdCB2YWxpZCA9ICVkIiwgbUF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgICAgICAgICAvLyBicmVhazsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGlzRm9ybWF0VmFsaWQgKG1BdWRpb0Zvcm1hdCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CiAKICAgICBpZiAobVNhbXBsZVJhdGUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlUmF0ZSA8IFNBTVBMRV9SQVRFX0haX01JTiB8fCBtU2FtcGxlUmF0ZSA+IFNBTVBMRV9SQVRFX0haX01BWCkpIHsKLSAgICAgICAgQUxPR0UoInNhbXBsZVJhdGUgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIEFMT0dEKCJzYW1wbGVSYXRlIG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZVJhdGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlckNhcGFjaXR5IDwgMCkgewotICAgICAgICBBTE9HRSgiYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOworICAgICAgICBBTE9HRCgiYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKQEAgLTEwNiw3ICsxMTMsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7CisgICAgICAgICAgICBBTE9HRCgiZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC0xMjcsNyArMTM0LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfQVNTSVNUQU5UOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgidXNhZ2Ugbm90IHZhbGlkID0gJWQiLCBtVXNhZ2UpOworICAgICAgICAgICAgQUxPR0QoInVzYWdlIG5vdCB2YWxpZCA9ICVkIiwgbVVzYWdlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE0MCw3ICsxNDcsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiY29udGVudCB0eXBlIG5vdCB2YWxpZCA9ICVkIiwgbUNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIEFMT0dEKCJjb250ZW50IHR5cGUgbm90IHZhbGlkID0gJWQiLCBtQ29udGVudFR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQpAQCAtMTUyLDkgKzE1OSwyMiBAQAogICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTjoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OOgogICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRToKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImlucHV0IHByZXNldCBub3QgdmFsaWQgPSAlZCIsIG1JbnB1dFByZXNldCk7CisgICAgICAgICAgICBBTE9HRCgiaW5wdXQgcHJlc2V0IG5vdCB2YWxpZCA9ICVkIiwgbUlucHV0UHJlc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAobUFsbG93ZWRDYXB0dXJlUG9saWN5KSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDoKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU06CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoImFsbG93ZWQgY2FwdHVyZSBwb2xpY3kgbm90IHZhbGlkID0gJWQiLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQpAQCAtMTYzLDE1ICsxODMsMTYgQEAKIH0KIAogdm9pZCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpkdW1wKCkgY29uc3QgewotICAgIEFMT0dEKCJtRGV2aWNlSWQgICAgICAgID0gJTZkIiwgbURldmljZUlkKTsKLSAgICBBTE9HRCgibVNlc3Npb25JZCAgICAgICA9ICU2ZCIsIG1TZXNzaW9uSWQpOwotICAgIEFMT0dEKCJtU2FtcGxlUmF0ZSAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOwotICAgIEFMT0dEKCJtU2FtcGxlc1BlckZyYW1lID0gJTZkIiwgbVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgQUxPR0QoIm1TaGFyaW5nTW9kZSAgICAgPSAlNmQiLCAoaW50KW1TaGFyaW5nTW9kZSk7Ci0gICAgQUxPR0QoIm1BdWRpb0Zvcm1hdCAgICAgPSAlNmQiLCAoaW50KW1BdWRpb0Zvcm1hdCk7Ci0gICAgQUxPR0QoIm1EaXJlY3Rpb24gICAgICAgPSAlNmQiLCBtRGlyZWN0aW9uKTsKLSAgICBBTE9HRCgibUJ1ZmZlckNhcGFjaXR5ICA9ICU2ZCIsIG1CdWZmZXJDYXBhY2l0eSk7Ci0gICAgQUxPR0QoIm1Vc2FnZSAgICAgICAgICAgPSAlNmQiLCBtVXNhZ2UpOwotICAgIEFMT0dEKCJtQ29udGVudFR5cGUgICAgID0gJTZkIiwgbUNvbnRlbnRUeXBlKTsKLSAgICBBTE9HRCgibUlucHV0UHJlc2V0ICAgICA9ICU2ZCIsIG1JbnB1dFByZXNldCk7CisgICAgQUxPR0QoIm1EZXZpY2VJZCAgICAgICAgICAgICA9ICU2ZCIsIG1EZXZpY2VJZCk7CisgICAgQUxPR0QoIm1TZXNzaW9uSWQgICAgICAgICAgICA9ICU2ZCIsIG1TZXNzaW9uSWQpOworICAgIEFMT0dEKCJtU2FtcGxlUmF0ZSAgICAgICAgICAgPSAlNmQiLCBtU2FtcGxlUmF0ZSk7CisgICAgQUxPR0QoIm1TYW1wbGVzUGVyRnJhbWUgICAgICA9ICU2ZCIsIG1TYW1wbGVzUGVyRnJhbWUpOworICAgIEFMT0dEKCJtU2hhcmluZ01vZGUgICAgICAgICAgPSAlNmQiLCAoaW50KW1TaGFyaW5nTW9kZSk7CisgICAgQUxPR0QoIm1BdWRpb0Zvcm1hdCAgICAgICAgICA9ICU2ZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKKyAgICBBTE9HRCgibURpcmVjdGlvbiAgICAgICAgICAgID0gJTZkIiwgbURpcmVjdGlvbik7CisgICAgQUxPR0QoIm1CdWZmZXJDYXBhY2l0eSAgICAgICA9ICU2ZCIsIG1CdWZmZXJDYXBhY2l0eSk7CisgICAgQUxPR0QoIm1Vc2FnZSAgICAgICAgICAgICAgICA9ICU2ZCIsIG1Vc2FnZSk7CisgICAgQUxPR0QoIm1Db250ZW50VHlwZSAgICAgICAgICA9ICU2ZCIsIG1Db250ZW50VHlwZSk7CisgICAgQUxPR0QoIm1JbnB1dFByZXNldCAgICAgICAgICA9ICU2ZCIsIG1JbnB1dFByZXNldCk7CisgICAgQUxPR0QoIm1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICU2ZCIsIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAppbmRleCBjZTVkYWNkLi4yZTIxYThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKQEAgLTU2LDExICs1NiwxMSBAQAogICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gc2FtcGxlc1BlckZyYW1lOwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUF1ZGlvRm9ybWF0OwogICAgIH0KIAotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIG1BdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0OwogICAgIH0KIApAQCAtMTEyLDYgKzExMiwxNCBAQAogICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKICAgICB9CiAKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG93ZWRDYXB0dXJlUG9saWN5OworICAgIH0KKworICAgIHZvaWQgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gcG9saWN5OworICAgIH0KKwogICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKICAgICB9CkBAIC0xMjAsOCArMTI4LDExIEBACiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiBieXRlcyBwZXIgZnJhbWUgb2YgZ2V0Rm9ybWF0KCkKKyAgICAgKi8KICAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0Rm9ybWF0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1LDE3ICsxNDYsMTggQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbURldmljZUlkICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICBtU2hhcmluZ01vZGUgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgbUF1ZGlvRm9ybWF0ICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgbURpcmVjdGlvbiAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwotICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCAgICAgICAgbVNlc3Npb25JZCAgICAgICA9IEFBVURJT19TRVNTSU9OX0lEX05PTkU7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgICAgICBtU2hhcmluZ01vZGUgICAgICAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgICAgICAgbURpcmVjdGlvbiAgICAgICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgICAgICBtQ29udGVudFR5cGUgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgICAgICBtSW5wdXRQcmVzZXQgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCAgICAgICAgICAgICBtU2Vzc2lvbklkICAgICAgICAgICAgPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAppbmRleCAzNTgwMjFiLi45Yjc3MjIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKQEAgLTI4LDE2ICsyOCwyMyBAQAogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCisKKy8vIFNlcXVlbnRpYWwgbnVtYmVyIGFzc2lnbmVkIHRvIHN0cmVhbXMgc29sZWx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCitzdGF0aWMgYWF1ZGlvX3N0cmVhbV9pZF90IEFBdWRpb19nZXROZXh0U3RyZWFtSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljIDxhYXVkaW9fc3RyZWFtX2lkX3Q+IG5leHRTdHJlYW1JZHsxfTsKKyAgICByZXR1cm4gbmV4dFN0cmVhbUlkKys7Cit9CisKIEF1ZGlvU3RyZWFtOjpBdWRpb1N0cmVhbSgpCiAgICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKLXsKKyAgICAgICAgLCBtU3RyZWFtSWQoQUF1ZGlvX2dldE5leHRTdHJlYW1JZCgpKQorICAgICAgICB7CiAgICAgLy8gbVRocmVhZCBpcyBhIHB0aHJlYWRfdCBvZiB1bmtub3duIHNpemUgc28gd2UgbmVlZCBtZW1zZXQuCiAgICAgbWVtc2V0KCZtVGhyZWFkLCAwLCBzaXplb2YobVRocmVhZCkpOwogICAgIHNldFBlcmlvZE5hbm9zZWNvbmRzKDApOwogfQogCiBBdWRpb1N0cmVhbTo6fkF1ZGlvU3RyZWFtKCkgewotICAgIEFMT0dEKCJkZXN0cm95aW5nICVwLCBzdGF0ZSA9ICVzIiwgdGhpcywgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTQ5LDIyICs1Niw2IEBACiAgICAgbVBsYXllckJhc2UtPmNsZWFyUGFyZW50UmVmZXJlbmNlKCk7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGhpcyBBdWRpb1N0cmVhbQogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqQXVkaW9TdHJlYW1fY29udmVydFNoYXJpbmdNb2RlVG9TaG9ydFRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7Ci0gICAgY29uc3QgY2hhciAqcmVzdWx0OwotICAgIHN3aXRjaCAoc2hhcmluZ01vZGUpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKLSAgICAgICAgICAgIHJlc3VsdCA9ICJFWCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKLSAgICAgICAgICAgIHJlc3VsdCA9ICJTSCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJlc3VsdCA9ICI/ISI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciYgYnVpbGRlcikKIHsKICAgICAvLyBDYWxsIGhlcmUgYXMgd2VsbCBiZWNhdXNlIHRoZSBBQXVkaW9TZXJ2aWNlIHdpbGwgY2FsbCB0aGlzIHdpdGhvdXQgY2FsbGluZyBidWlsZCgpLgpAQCAtOTUsNiArODYsMTAgQEAKICAgICBpZiAobUlucHV0UHJlc2V0ID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtSW5wdXRQcmVzZXQgPSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgIH0KKyAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBidWlsZGVyLmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCk7CisgICAgaWYgKG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOworICAgIH0KIAogICAgIC8vIGNhbGxiYWNrcwogICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBidWlsZGVyLmdldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpOwpAQCAtMTAzLDM4ICs5OCwzMiBAQAogICAgIG1EYXRhQ2FsbGJhY2tVc2VyRGF0YSA9IGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKTsKICAgICBtRXJyb3JDYWxsYmFja1VzZXJEYXRhID0gYnVpbGRlci5nZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKTsKIAotICAgIC8vIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIGxlYXZlIGl0IGluLgotICAgIEFMT0dJKCJvcGVuKCkgcmF0ZSAgID0gJWQsIGNoYW5uZWxzICAgID0gJWQsIGZvcm1hdCAgID0gJWQsIHNoYXJpbmcgPSAlcywgZGlyID0gJXMiLAotICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2FtcGxlc1BlckZyYW1lLCBtRm9ybWF0LAotICAgICAgICAgIEF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KG1TaGFyaW5nTW9kZSksCi0gICAgICAgICAgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSA/ICJPVVRQVVQiIDogIklOUFVUIik7Ci0gICAgQUxPR0koIm9wZW4oKSBkZXZpY2UgPSAlZCwgc2Vzc2lvbklkICAgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAotICAgICAgICAgIG1EZXZpY2VJZCwKLSAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgIG1QZXJmb3JtYW5jZU1vZGUsCi0gICAgICAgICAgKGlzRGF0YUNhbGxiYWNrU2V0KCkgPyAiT04iIDogIk9GRiIpLAotICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwotICAgIEFMT0dJKCJvcGVuKCkgdXNhZ2UgID0gJWQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQiLAotICAgICAgICAgIG1Vc2FnZSwgbUNvbnRlbnRUeXBlLCBtSW5wdXRQcmVzZXQpOwotCiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RhcnQoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0YXJ0KCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgcmV0dXJuIHJlcXVlc3RTdGFydCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RTdGFydCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0YXJ0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVBhdXNlKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1QYXVzZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisKICAgICBpZiAoIWlzUGF1c2VTdXBwb3J0ZWQoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CiAgICAgfQogCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTE3MCw3ICsxNTksMTIgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVxdWVzdFBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RQYXVzZSgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnBhdXNlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUZsdXNoKCkgewpAQCAtMTkzLDEyICsxODcsMzIgQEAKICAgICByZXR1cm4gcmVxdWVzdEZsdXNoKCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUFwcCgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKLSAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgc3RvcHBlZCBmcm9tIGEgY2FsbGJhY2shIik7CisgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKIAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICAvLyBQcm9jZWVkIHdpdGggc3RvcHBpbmcuCkBAIC0yMjUsNyArMjM5LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygicmVxdWVzdFN0b3AoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CkBAIC0yMzQsNiArMjQ4LDcgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlQ2xvc2UoKSB7CisgICAgLy8gVGhpcyBnZXQgdGVtcG9yYXJpbHkgdW5sb2NrZWQgaW4gdGhlIGNsb3NlIHdoZW4gam9pbmluZyBjYWxsYmFjayB0aHJlYWRzLgogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwpAQCAtMjQzLDE1ICsyNTgsMTUgQEAKIH0KIAogdm9pZCBBdWRpb1N0cmVhbTo6c2V0U3RhdGUoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKSB7Ci0gICAgQUxPR1YoIiVzKCVwKSBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sIHRoaXMsIG1TdGF0ZSwgc3RhdGUpOworICAgIEFMT0dWKCIlcyglZCkgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLCBnZXRJZCgpLCBtU3RhdGUsIHN0YXRlKTsKICAgICAvLyBDTE9TRUQgaXMgYSBmaW5hbCBzdGF0ZQogICAgIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVwKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIHRoaXMsIHN0YXRlKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKIAogICAgIC8vIE9uY2UgRElTQ09OTkVDVEVELCB3ZSBjYW4gb25seSBtb3ZlIHRvIENMT1NFRCBzdGF0ZS4KICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAogICAgICAgICAgICAgICAgJiYgc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVwKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgRElTQ09OTkVDVEVEIiwgX19mdW5jX18sIHRoaXMsIHN0YXRlKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSB0cmllZCB0byBzZXQgdG8gJWQgYnV0IGFscmVhZHkgRElTQ09OTkVDVEVEIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKIAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwpAQCAtMzUwLDIxICszNjUsMzcgQEAKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKKy8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMgX191bnVzZWQpCiB7CiAgICAgaWYgKCFtSGFzVGhyZWFkKSB7CiAgICAgICAgIEFMT0dFKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgLy8gSWYgdGhlIGNhbGxiYWNrIGlzIHN0b3BwaW5nIHRoZSBzdHJlYW0gYmVjYXVzZSB0aGUgYXBwIHBhc3NlZCBiYWNrIFNUT1AKKyAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gam9pbigpLiBUaGUgdGhyZWFkIGlzIGFscmVhZHkgYWJvdXQgdG8gZXhpdC4KKyAgICBpZiAocHRocmVhZF9zZWxmKCkgIT0gbVRocmVhZCkgeworICAgICAgICAvLyBDYWxsZWQgZnJvbSBhbiBhcHAgdGhyZWFkLiBOb3QgdGhlIGNhbGxiYWNrLgorICAgICAgICAvLyBVbmxvY2sgYmVjYXVzZSB0aGUgY2FsbGJhY2sgbWF5IGJlIHRyeWluZyB0byBzdG9wIHRoZSBzdHJlYW0gYnV0IGlzIGJsb2NrZWQuCisgICAgICAgIG1TdHJlYW1Mb2NrLnVubG9jaygpOwogI2lmIDAKLSAgICAvLyBUT0RPIGltcGxlbWVudCBlcXVpdmFsZW50IG9mIHB0aHJlYWRfdGltZWRqb2luX25wKCkKLSAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLSAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7CisgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKKyAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOwogI2Vsc2UKLSAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgcmV0dXJuQXJnKTsKICNlbmRpZgorICAgICAgICBtU3RyZWFtTG9jay5sb2NrKCk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIHB0aHJlYWRfam9pbigpIHJldHVybnMgZXJyID0gJWQiLCBfX2Z1bmNfXywgZXJyKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgZmFsc2Ugc28gdGhhdCB0aGUgY2FsbGJhY2sgdGhyZWFkIGNhbiBiZSBjcmVhdGVkCisgICAgLy8gd2hlbiB0aGUgc3RyZWFtIGlzIHJlc3RhcnRlZC4KICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcmV0dXJuIGVyciA/IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnJubykgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OworICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyByZXN1bHQgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OwogfQogCiBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6bWF5YmVDYWxsRGF0YUNhbGxiYWNrKHZvaWQgKmF1ZGlvRGF0YSwKQEAgLTQzOCw3ICs0NjksNiBAQAogfQogCiBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgewotICAgIEFMT0dWKCJNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoJXApIGRlbGV0ZWQiLCB0aGlzKTsKIH0KIAogdm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDMxYjg5NWMuLjA0NGM5NzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0zNiw2ICszNiw3IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogdHlwZWRlZiB2b2lkICooKmFhdWRpb19hdWRpb190aHJlYWRfcHJvY190KSh2b2lkICopOwordHlwZWRlZiB1aW50MzJfdCBhYXVkaW9fc3RyZWFtX2lkX3Q7CiAKIGNsYXNzIEF1ZGlvU3RyZWFtQnVpbGRlcjsKIApAQCAtNTEsMjEgKzUyLDYgQEAKIAogICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtKCk7CiAKLSAgICAvKioKLSAgICAgKiBMb2NrIGEgbXV0ZXggYW5kIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNhbGxpbmcgZnJvbSBhIGNhbGxiYWNrIGZ1bmN0aW9uLgotICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHJlcXVlc3RTdGFydCgpOwotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RhcnQoKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlUGF1c2UoKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVDbG9zZSgpOwotCi0gICAgLy8gPT09PT09PT09PT0gQmVnaW4gQUJTVFJBQ1QgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KIHByb3RlY3RlZDoKIAogICAgIC8qIEFzeW5jaHJvbm91cyByZXF1ZXN0cy4KQEAgLTc0LDcgKzYwLDcgQEAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgc3RhdGUgdG8gc2VlIGlmIFBhdXNlIGlmIGN1cnJlbnRseSBsZWdhbC4KKyAgICAgKiBDaGVjayB0aGUgc3RhdGUgdG8gc2VlIGlmIFBhdXNlIGlzIGN1cnJlbnRseSBsZWdhbC4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgcG9pbnRlciB0byByZXR1cm4gY29kZQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBPSyB0byBjb250aW51ZSwgaWYgZmFsc2UgdGhlbiByZXR1cm4gcmVzdWx0CkBAIC0xMzYsNiArMTIyLDEyIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogCisgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gaWRlbnRpZnkgYSBzdHJlYW0gaW4gdGhlIGxvZ3Mgd2l0aG91dAorICAgIC8vIHJldmVhbGluZyBhbnkgcG9pbnRlcnMuCisgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGdldElkKCkgeworICAgICAgICByZXR1cm4gbVN0cmVhbUlkOworICAgIH0KKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpID0gMDsKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNyZWF0ZVRocmVhZChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLApAQCAtMTkyLDcgKzE4NCw3IEBACiAgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgewogICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICB9CiAKQEAgLTIzNCw2ICsyMjYsMTAgQEAKICAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKICAgICB9CiAKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG93ZWRDYXB0dXJlUG9saWN5OworICAgIH0KKwogICAgIGludDMyX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKICAgICB9CkBAIC0yNDksMjEgKzI0NSwxNCBAQAogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhtRm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXREZXZpY2VGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXREZXZpY2VGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0RGV2aWNlRm9ybWF0KCkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgPSAwOwpAQCAtMzYzLDMzICszNTIsMjggQEAKICAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CiAgICAgfQogCi0gICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKLSAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCi0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdGFydCgpOwogCi0gICAgLy8gUGFzcyBwYXVzZSByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCk7CiAKLSAgICAvLyBQYXNzIHN0b3AgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgotICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RvcCgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGFwcCBjYWxscyBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKTsKKyAgICAgKiBJdCBwcmV2ZW50cyBjYWxscyBmcm9tIGEgY2FsbGJhY2suCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQXBwKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gYW4gYXBwIGNhbGxiYWNrIHJldHVybnMgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7CiAKIHByb3RlY3RlZDoKIAotICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgotICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KLSAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KLSAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbSB2b2x1bWUuCiAgICAgY2xhc3MgTXlQbGF5ZXJCYXNlIDogcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgTXlQbGF5ZXJCYXNlKEF1ZGlvU3RyZWFtICpwYXJlbnQpOwpAQCAtNDEzLDIwICszOTcsMTkgQEAKIAogICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdGFydCBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvLyBtUGFyZW50IHNob3VsZCBOT1QgYmUgbnVsbC4gU28gZ28gYWhlYWQgYW5kIGNyYXNoIGlmIGl0IGlzLgotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHBhdXNlIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlUGF1c2UoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdG9wIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdG9wKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdG9wKCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTZXRWb2x1bWUoKSBvdmVycmlkZSB7CkBAIC00NzgsMTggKzQ2MSwxOCBAQAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldERldmljZUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlRm9ybWF0OwogICAgIH0KIApAQCAtNTUzLDggKzUzNiwxNyBAQAogICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IHBvbGljeTsKKyAgICB9CisKIHByaXZhdGU6CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKKwogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOwogCiAgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOwpAQCAtNTY1LDE5ICs1NTcsMjAgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIAogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAKICAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGZvcm1hdCBmcm9tIHRoZSBhcHAuCiAgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCiAgICAgLy8gY2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02MDEsNiArNTk0LDggQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqbVRocmVhZEFyZyA9IG51bGxwdHI7CiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgICAgIG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQgPSBBQVVESU9fT0s7CiAKKyAgICBjb25zdCBhYXVkaW9fc3RyZWFtX2lkX3QgICAgbVN0cmVhbUlkOworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKaW5kZXggM2E3YTU3OC4uMDhmNDk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAKQEAgLTEwNCw2ICsxMDQsOCBAQAogICAgIH0KICAgICAqc3RyZWFtUHRyID0gbnVsbHB0cjsKIAorICAgIGxvZ1BhcmFtZXRlcnMoKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB2YWxpZGF0ZSgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xNTAsNiArMTUyLDExIEBACiAgICAgICAgIGFsbG93TU1hcCA9IGZhbHNlOwogICAgIH0KIAorICAgIGlmICghYWxsb3dNTWFwICYmICFhbGxvd0xlZ2FjeSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBiYWNrZW5kIGF2YWlsYWJsZTogbmVpdGhlciBNTUFQIG5vciBsZWdhY3kgcGF0aCBhcmUgYWxsb3dlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgIH0KKwogICAgIHJlc3VsdCA9IGJ1aWxkZXJfY3JlYXRlU3RyZWFtKGdldERpcmVjdGlvbigpLCBzaGFyaW5nTW9kZSwgYWxsb3dNTWFwLCAmYXVkaW9TdHJlYW0pOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIC8vIE9wZW4gdGhlIHN0cmVhbSB1c2luZyB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBidWlsZGVyLgpAQCAtMjEyLDMgKzIxOSw0MSBAQAogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KKworc3RhdGljIGNvbnN0IGNoYXIgKkFBdWRpb19jb252ZXJ0U2hhcmluZ01vZGVUb1Nob3J0VGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKKyAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CisgICAgICAgICAgICByZXR1cm4gIkVYIjsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKKyAgICAgICAgICAgIHJldHVybiAiU0giOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICI/ISI7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqQUF1ZGlvX2NvbnZlcnREaXJlY3Rpb25Ub1RleHQoYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICByZXR1cm4gIk9VVFBVVCI7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKKyAgICAgICAgICAgIHJldHVybiAiSU5QVVQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICI/ISI7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3RyZWFtQnVpbGRlcjo6bG9nUGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGlzIHZlcnkgaGVscGZ1bCBmb3IgZGVidWdnaW5nIGluIHRoZSBmdXR1cmUuIFBsZWFzZSBsZWF2ZSBpdCBpbi4KKyAgICBBTE9HSSgicmF0ZSAgID0gJTZkLCBjaGFubmVscyAgPSAlZCwgZm9ybWF0ICAgPSAlZCwgc2hhcmluZyA9ICVzLCBkaXIgPSAlcyIsCisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZ2V0Rm9ybWF0KCksCisgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGdldFNoYXJpbmdNb2RlKCkpLAorICAgICAgICAgIEFBdWRpb19jb252ZXJ0RGlyZWN0aW9uVG9UZXh0KGdldERpcmVjdGlvbigpKSk7CisgICAgQUxPR0koImRldmljZSA9ICU2ZCwgc2Vzc2lvbklkID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKKyAgICAgICAgICBnZXREZXZpY2VJZCgpLAorICAgICAgICAgIGdldFNlc3Npb25JZCgpLAorICAgICAgICAgIGdldFBlcmZvcm1hbmNlTW9kZSgpLAorICAgICAgICAgICgoZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpID8gIk9OIiA6ICJPRkYiKSwKKyAgICAgICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKKyAgICBBTE9HSSgidXNhZ2UgID0gJTZkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkLCBhbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICVkIiwKKyAgICAgICAgICBnZXRVc2FnZSgpLCBnZXRDb250ZW50VHlwZSgpLCBnZXRJbnB1dFByZXNldCgpLCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAppbmRleCBhNDNjZmE4Li44MTQ5YWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCkBAIC0xMDIsNiArMTAyLDggQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKKyAgICB2b2lkIGxvZ1BhcmFtZXRlcnMoKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IGIwOTI1OGUuLmY1MTEzZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIzLDMwICsyMywyNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIgogI2luY2x1ZGUgIkZpZm9CdWZmZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7IC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdDsKIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCi0gICAgICAgICwgbVN0b3JhZ2UobnVsbHB0cikKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCiB7Ci0gICAgLy8gVE9ETyBIYW5kbGUgcG9zc2libGUgZmFpbHVyZXMgdG8gYWxsb2NhdGUuIE1vdmUgb3V0IG9mIGNvbnN0cnVjdG9yPwotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVyKGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOworICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlcj4oY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwogICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwogICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOwotICAgIEFMT0dWKCJjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCi0gICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgQUxPR1YoIiVzKCkgY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKIH0KIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlciggaW50MzJfdCAgIGJ5dGVzUGVyRnJhbWUsCkBAIC01NSwxNCArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICogIHdyaXRlSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICBkYXRhU3RvcmFnZUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKICAgICAgICAgLCBtU3RvcmFnZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KGRhdGFTdG9yYWdlQWRkcmVzcykpCi0gICAgICAgICwgbUZyYW1lc1JlYWRDb3VudCgwKQotICAgICAgICAsIG1GcmFtZXNVbmRlcnJ1bkNvdW50KDApCi0gICAgICAgICwgbVVuZGVycnVuQ291bnQoMCkKIHsKLSAgICBtRmlmbyA9IG5ldyBGaWZvQ29udHJvbGxlckluZGlyZWN0KGNhcGFjaXR5SW5GcmFtZXMsCisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVySW5kaXJlY3Q+KGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXhBZGRyZXNzKTsKQEAgLTczLDEwICs2NSw4IEBACiAgICAgaWYgKG1TdG9yYWdlT3duZWQpIHsKICAgICAgICAgZGVsZXRlW10gbVN0b3JhZ2U7CiAgICAgfQotICAgIGRlbGV0ZSBtRmlmbzsKIH0KIAotCiBpbnQzMl90IEZpZm9CdWZmZXI6OmNvbnZlcnRGcmFtZXNUb0J5dGVzKGZpZm9fZnJhbWVzX3QgZnJhbWVzKSB7CiAgICAgcmV0dXJuIGZyYW1lcyAqIG1CeXRlc1BlckZyYW1lOwogfQpAQCAtODcsMTEgKzc3LDEyIEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KLSAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CisgICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBjYXBhY2l0eSkgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7Ci0gICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IGNhcGFjaXR5IC0gc3RhcnRJbmRleDsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmaXJzdEZyYW1lczsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gJm1TdG9yYWdlWzBdOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IGZyYW1lc0F2YWlsYWJsZSAtIGZpcnN0RnJhbWVzOwpAQCAtMTA3LDcgKzk4LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRGdWxsRGF0YUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWZvLT5nZXRDYXBhY2l0eSgpKTsKICAgICBmaWZvX2ZyYW1lc190IHN0YXJ0SW5kZXggPSBtRmlmby0+Z2V0UmVhZEluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMTUsNyArMTA3LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7CiAgICAgLy8gVGhlIEZJRk8gbWlnaHQgaGF2ZSB1bmRlcnJ1biBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksIG1GcmFtZUNhcGFjaXR5KTsKKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xODMsMjMgKzE3Niw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6cmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7Ci0gICAgbUxhc3RSZWFkU2l6ZSA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNSZWFkID0gcmVhZChidWZmZXIsIG51bUZyYW1lcyk7Ci0gICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNSZWFkQ291bnQgKz0gZnJhbWVzUmVhZDsKLSAgICBtRnJhbWVzVW5kZXJydW5Db3VudCArPSBmcmFtZXNMZWZ0OwotICAgIC8vIFplcm8gb3V0IGFueSBzYW1wbGVzIHdlIGNvdWxkIG5vdCBzZXQuCi0gICAgaWYgKGZyYW1lc0xlZnQgPiAwKSB7Ci0gICAgICAgIG1VbmRlcnJ1bkNvdW50Kys7Ci0gICAgICAgIGludDMyX3QgYnl0ZXNUb1plcm8gPSBjb252ZXJ0RnJhbWVzVG9CeXRlcyhmcmFtZXNMZWZ0KTsKLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNUb1plcm8pOwotICAgIH0KLQotICAgIHJldHVybiBmcmFtZXNSZWFkOwotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldFRocmVzaG9sZCgpIHsKICAgICByZXR1cm4gbUZpZm8tPmdldFRocmVzaG9sZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKaW5kZXggZjVhOWUyNy4uMGQxODhjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEZJRk9fRklGT19CVUZGRVJfSAogI2RlZmluZSBGSUZPX0ZJRk9fQlVGRkVSX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgpAQCAtNzcsMjQgKzc4LDEyIEBACiAgICAgICovCiAgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKTsKIAotICAgIC8qKgotICAgICAqIENvcHkgZGF0YSBmcm9tIHRoZSBGSUZPIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogQHBhcmFtIG51bUZyYW1lcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBmaWZvX2ZyYW1lc190IHJlYWROb3codm9pZCAqYnVmZmVyLCBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7Ci0KLSAgICBpbnQ2NF90IGdldE5leHRSZWFkVGltZShpbnQzMl90IGZyYW1lUmF0ZSk7Ci0KLSAgICBpbnQzMl90IGdldFVuZGVycnVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtVW5kZXJydW5Db3VudDsgfQotCi0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICpnZXRGaWZvQ29udHJvbGxlckJhc2UoKSB7IHJldHVybiBtRmlmbzsgfQotCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgewogICAgICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiAgICAgfQogCisgICAgLy8gUHJveHkgbWV0aG9kcyBmb3IgdGhlIGludGVybmFsIEZpZm9Db250cm9sbGVyCisKICAgICBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIHsKICAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRSZWFkQ291bnRlcigpOwogICAgIH0KQEAgLTExMSw2ICsxMDAsMjIgQEAKICAgICAgICAgbUZpZm8tPnNldFdyaXRlQ291bnRlcihuKTsKICAgICB9CiAKKyAgICB2b2lkIGFkdmFuY2VSZWFkSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VSZWFkSW5kZXgobnVtRnJhbWVzKTsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZUluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1GaWZvLT5hZHZhbmNlV3JpdGVJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICBmaWZvX2ZyYW1lc190IGdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKwogICAgIC8qCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KICAgICAgKi8KQEAgLTEyMSwxNSArMTI2LDEyIEBACiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlLCBpbnQzMl90IHN0YXJ0SW5kZXgpOwogCi0gICAgY29uc3QgZmlmb19mcmFtZXNfdCBtRnJhbWVDYXBhY2l0eTsKLSAgICBjb25zdCBpbnQzMl90IG1CeXRlc1BlckZyYW1lOwotICAgIHVpbnQ4X3QgKm1TdG9yYWdlOwotICAgIGJvb2wgbVN0b3JhZ2VPd25lZDsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPwotICAgIEZpZm9Db250cm9sbGVyQmFzZSAqbUZpZm87Ci0gICAgZmlmb19jb3VudGVyX3QgbUZyYW1lc1JlYWRDb3VudDsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzVW5kZXJydW5Db3VudDsKLSAgICBpbnQzMl90IG1VbmRlcnJ1bkNvdW50OyAvLyBuZWVkPyBqdXN0IHVzZSBmcmFtZXMKLSAgICBpbnQzMl90IG1MYXN0UmVhZFNpemU7CisgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZTsKKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgc3RkOjp1bmlxdWVfcHRyIGZvciBtU3RvcmFnZSBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgcG9pbnRlciB0bworICAgIC8vIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIGNhbm5vdCBiZSBkZWxldGVkIHRyaXZpYWxseS4KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgKm1TdG9yYWdlID0gbnVsbHB0cjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWZvQ29udHJvbGxlckJhc2U+IG1GaWZve307CiB9OwogCiB9ICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCmluZGV4IDc5ZDk4YTEuLjA1N2E5NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCkBAIC0zMCw3ICszMCw3IEBACiBjbGFzcyBGaWZvQ29udHJvbGxlciA6IHB1YmxpYyBGaWZvQ29udHJvbGxlckJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWZvQ29udHJvbGxlcihmaWZvX2NvdW50ZXJfdCBidWZmZXJTaXplLCBmaWZvX2NvdW50ZXJfdCB0aHJlc2hvbGQpCisgICAgRmlmb0NvbnRyb2xsZXIoZmlmb19mcmFtZXNfdCBidWZmZXJTaXplLCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkKICAgICA6IEZpZm9Db250cm9sbGVyQmFzZShidWZmZXJTaXplLCB0aHJlc2hvbGQpCiAgICAgLCBtUmVhZENvdW50ZXIoMCkKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggNTFhOGUzNC4uNjZlMjQ3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTU5LDUgKzU5LDEwIEBACiB9CiAKIHZvaWQgRmlmb0NvbnRyb2xsZXJCYXNlOjpzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpIHsKKyAgICBpZiAodGhyZXNob2xkID4gbUNhcGFjaXR5KSB7CisgICAgICAgIHRocmVzaG9sZCA9IG1DYXBhY2l0eTsKKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDApIHsKKyAgICAgICAgdGhyZXNob2xkID0gMDsKKyAgICB9CiAgICAgbVRocmVzaG9sZCA9IHRocmVzaG9sZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAppbmRleCA2NGFmNzc3Li4xZWRiOGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCkBAIC0xMDIsNiArMTAyLDkgQEAKICAgICAvKioKICAgICAgKiBZb3UgY2FuIHJlcXVlc3QgdGhhdCB0aGUgYnVmZmVyIG5vdCBiZSBmaWxsZWQgYWJvdmUgYSBtYXhpbXVtCiAgICAgICogbnVtYmVyIG9mIGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoZSB0aHJlc2hvbGQgd2lsbCBiZSBjbGlwcGVkIGJldHdlZW4gemVybyBhbmQgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgogICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgICAqLwogICAgIHZvaWQgc2V0VGhyZXNob2xkKGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjdmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvUHJvY2Vzc29yQmFzZTo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGlmIChmcmFtZVBvc2l0aW9uID4gbUxhc3RGcmFtZVBvc2l0aW9uKSB7CisgICAgICAgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CisgICAgICAgIG1GcmFtZXNWYWxpZCA9IG9uUHJvY2VzcyhmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gbUZyYW1lc1ZhbGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQXVkaW9GbG9hdEJsb2NrUG9ydDo6QXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrKQorICAgICAgICA6IEF1ZGlvUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgLCBtRnJhbWVzUGVyQmxvY2soZnJhbWVzUGVyQmxvY2spCisgICAgICAgICwgbVNhbXBsZUJsb2NrKE5VTEwpIHsKKyAgICBpbnQzMl90IG51bUZsb2F0cyA9IGZyYW1lc1BlckJsb2NrICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgbVNhbXBsZUJsb2NrID0gbmV3IGZsb2F0W251bUZsb2F0c117MC4wZn07Cit9CisKK0F1ZGlvRmxvYXRCbG9ja1BvcnQ6On5BdWRpb0Zsb2F0QmxvY2tQb3J0KCkgeworICAgIGRlbGV0ZVtdIG1TYW1wbGVCbG9jazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBudW1GcmFtZXMgPSBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpOworICAgIHJldHVybiBtUGFyZW50LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8vIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIC5jcHAgZmlsZSBiZWNhdXNlIG9mIGZvcndhcmQgY3Jvc3MgcmVmZXJlbmNlcy4KK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmNvbm5lY3QodGhpcyk7Cit9CisKK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvRmxvYXRJbnB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gTlVMTCkKKyAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKQorICAgICAgICAgICAgOiBtQ29ubmVjdGVkLT5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworfQorCitmbG9hdCAqQXVkaW9GbG9hdElucHV0UG9ydDo6Z2V0QmxvY2soKSB7CisgICAgaWYgKG1Db25uZWN0ZWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2soKTsgLy8gbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUNvbm5lY3RlZC0+Z2V0QmxvY2soKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvU2luazo6cHVsbChpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgYWN0dWFsRnJhbWVzID0gaW5wdXQucHVsbERhdGEobUZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgbUZyYW1lUG9zaXRpb24gKz0gYWN0dWFsRnJhbWVzOworICAgIHJldHVybiBhY3R1YWxGcmFtZXM7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE0NmFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBBdWRpb1Byb2Nlc3NvckJhc2UuaAorICoKKyAqIEF1ZGlvIHByb2Nlc3Npbmcgbm9kZSBhbmQgcG9ydHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbXBsZSBkYXRhIGZsb3cgZ3JhcGguCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIFRPRE8gY29uc2lkZXIgcHVibGlzaGluZyBhbGwgaGVhZGVyIGZpbGVzIHVuZGVyICJpbmNsdWRlL2xpYmFhdWRpby9GbG93R3JhcGguaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEF1ZGlvRmxvYXRCbG9ja1BvcnQgaXMgY3JlYXRlZC4KKy8vIElmIGl0IGlzIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgaGF2ZSB0b28gbXVjaCBvdmVyaGVhZCBmcm9tIHN3aXRjaGluZyBiZXR3ZWVuIG5vZGVzLgorLy8gSWYgaXQgaXMgdG9vIGhpZ2ggdGhlbiB3ZSB3aWxsIHRocmFzaCB0aGUgY2FjaGVzLgorY29uc3RleHByIGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQorCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1Byb2Nlc3NvckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGN1c3RvbSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBmcmFtZVBvc2l0aW9uIGlzIGF0IG9yIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHBvc2l0aW9uIHRoZW4gY2FsbCBvblByb2Nlc3MoKS4KKyAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCisgICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGludDY0X3QgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IC0xOyAvLyBTdGFydCBhdCAtMSBzbyB0aGF0IHRoZSBmaXJzdCBwdWxsIHdvcmtzLgorCitwcml2YXRlOgorICAgIGludDMyX3QgIG1GcmFtZXNWYWxpZCA9IDA7IC8vIG51bSB2YWxpZCBmcmFtZXMgaW4gdGhlIGJsb2NrCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgorICAqLworY2xhc3MgQXVkaW9Qb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkKKyAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgorICAgIEF1ZGlvUG9ydChjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKyAgICBBdWRpb1BvcnQmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKworICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQ7CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtU2FtcGxlc1BlckZyYW1lID0gMTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFRoaXMgcG9ydCBjb250YWlucyBhIGZsb2F0IHR5cGUgYnVmZmVyLgorICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQmxvY2sgKiBzYW1wbGVzUGVyRnJhbWUpLgorICovCitjbGFzcyBBdWRpb0Zsb2F0QmxvY2tQb3J0ICA6IHB1YmxpYyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50LAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2sgPSBrRGVmYXVsdEJsb2NrU2l6ZQorICAgICAgICAgICAgICAgICk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0QmxvY2tQb3J0KCk7CisKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJsb2NrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJsb2NrOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCAqZ2V0QmxvY2soKSB7CisgICAgICAgIHJldHVybiBtU2FtcGxlQmxvY2s7CisgICAgfQorCisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQmxvY2sgPSAxOworICAgIGZsb2F0ICAgICAgICAgICAqbVNhbXBsZUJsb2NrID0gbnVsbHB0cjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhlIHJlc3VsdHMgb2YgYSBtb2R1bGUgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG9mIHRoZSBvdXRwdXQgcG9ydHMuCisgICovCitjbGFzcyBBdWRpb0Zsb2F0T3V0cHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0T3V0cHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIHVzaW5nIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrOworCisgICAgLyoqCisgICAgICogQ2FsbCB0aGUgcGFyZW50IG1vZHVsZSdzIG9uUHJvY2VzcygpIG1ldGhvZC4KKyAgICAgKiBUaGF0IG1heSBwdWxsIGRhdGEgZnJvbSBpdHMgaW5wdXRzIGFuZCByZWN1cnNpdmVseQorICAgICAqIHByb2Nlc3MgdGhlIGVudGlyZSBncmFwaC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHVsbGVkCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBJZiB5b3UgY29ubmVjdCBhIHNlY29uZCBvdXRwdXQgcG9ydCB0byBhbiBpbnB1dCBwb3J0CisgICAgICogdGhlbiBpdCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuIERvIG5vdCBtb2RpZnkgdGhlIGdyYXBoIHRvcG9sb2d5IGZvcm0gYW5vdGhlciB0aHJlYWQgd2hpbGUgcnVubmluZy4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdElucHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KKyAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgorICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCisgICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgorICAgICAqLworICAgIGZsb2F0ICpnZXRCbG9jaygpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUHVsbCBkYXRhIGZyb20gYW55IG91dHB1dCBwb3J0IHRoYXQgaXMgY29ubmVjdGVkLgorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgorICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAorICAgICAqIHRvIHRoaXMgcG9ydC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJsb2NrU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QmxvY2soKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbG9hdHM7IGkrKykgeworICAgICAgICAgICAgKmJ1ZmZlcisrID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7CisgICAgICAgICh2b2lkKSBwb3J0OworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbUNvbm5lY3RlZCA9IG51bGxwdHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7CisgICAgICAgIG1GcmFtZUluZGV4ID0gMDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKKyAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9TaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9TaW5rKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKworICAgIC8qKgorICAgICAqIER1bW15IHByb2Nlc3Nvci4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCkgZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIHZpcnR1YWwgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQzMl90IHB1bGwoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIGludDY0X3QgbUZyYW1lUG9zaXRpb24gPSAwOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvKiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJDbGlwVG9SYW5nZS5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitDbGlwVG9SYW5nZTo6Q2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IENsaXBUb1JhbmdlOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc3RkOjptaW4obU1heGltdW0sIHN0ZDo6bWF4KG1NaW5pbXVtLCAqaW5wdXRCdWZmZXIrKykpOworICAgIH0KKworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCisvLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgorLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCitjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhIZWFkcm9vbSA9IDEuNDEyNTM3NTRmOworY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWluSGVhZHJvb20gPSAta0RlZmF1bHRNYXhIZWFkcm9vbTsKKworY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5DbGlwVG9SYW5nZSgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNaW5pbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWluaW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNaW5pbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1pbmltdW07CisgICAgfQorCisgICAgdm9pZCBzZXRNYXhpbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWF4aW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNYXhpbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1heGltdW07CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisgICAgZmxvYXQgbU1pbmltdW0gPSBrRGVmYXVsdE1pbkhlYWRyb29tOworICAgIGZsb2F0IG1NYXhpbXVtID0ga0RlZmF1bHRNYXhIZWFkcm9vbTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJNb25vVG9NdWx0aUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6TW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIDEpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKK30KKworTW9ub1RvTXVsdGlDb252ZXJ0ZXI6On5Nb25vVG9NdWx0aUNvbnZlcnRlcigpIHsgfQorCitpbnQzMl90IE1vbm9Ub011bHRpQ29udmVydGVyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIC8vIFRPRE8gbWF5YmUgbW92ZSB0byBhdWRpb191dGlsIGFzIGF1ZGlvX21vbm9fdG9fbXVsdGkoKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyBpKyspIHsKKyAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIG1hbnkKKyAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbENvdW50OyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHNhbXBsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ1M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBNb25vVG9NdWx0aUNvbnZlcnRlciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfk1vbm9Ub011bHRpQ29udmVydGVyKCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJhbXBMaW5lYXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiUmFtcExpbmVhci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitSYW1wTGluZWFyOjpSYW1wTGluZWFyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7CisgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Cit9CisKK2Zsb2F0IFJhbXBMaW5lYXI6OmludGVycG9sYXRlQ3VycmVudCgpIHsKKyAgICByZXR1cm4gbUxldmVsVG8gLSAobVJlbWFpbmluZyAqIG1TY2FsZXIpOworfQorCitpbnQzMl90IFJhbXBMaW5lYXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgZmxvYXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgeworICAgICAgICAvLyBTdGFydCBuZXcgcmFtcC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KKyAgICAgICAgbUxldmVsRnJvbSA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKKyAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKKyAgICAgICAgQUxPR1YoIiVzKCkgbUxldmVsRnJvbSA9ICVmLCBtTGV2ZWxUbyA9ICVmLCBtUmVtYWluaW5nID0gJWQsIG1TY2FsZXIgPSAlZiIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtTGV2ZWxGcm9tLCBtTGV2ZWxUbywgbVJlbWFpbmluZywgbVNjYWxlcik7CisgICAgICAgIG1TY2FsZXIgPSAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1MZW5ndGhJbkZyYW1lczsgLy8gZm9yIGludGVycG9sYXRpb24KKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAgICBpZiAobVJlbWFpbmluZyA+IDApIHsgLy8gUmFtcGluZz8gVGhpcyBkb2Vzbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLgorICAgICAgICBpbnQzMl90IGZyYW1lc1RvUmFtcCA9IHN0ZDo6bWluKGZyYW1lc0xlZnQsIG1SZW1haW5pbmcpOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvUmFtcDsKKyAgICAgICAgd2hpbGUgKGZyYW1lc1RvUmFtcCA+IDApIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRMZXZlbCA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogY3VycmVudExldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbWFpbmluZy0tOworICAgICAgICAgICAgZnJhbWVzVG9SYW1wLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGFueSBmcmFtZXMgYWZ0ZXIgdGhlIHJhbXAuCisgICAgaW50MzJfdCBzYW1wbGVzTGVmdCA9IGZyYW1lc0xlZnQgKiBjaGFubmVsQ291bnQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVzTGVmdDsgaSsrKSB7CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogbUxldmVsVG87CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM4ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgUmFtcExpbmVhciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+UmFtcExpbmVhcigpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgbmV4dCByYW1wLgorICAgICAqIENhbGxpbmcgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYSByYW1wIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICovCisgICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcyk7CisKKyAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWF5IGJlIHNhZmVseSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCk7CisKKyAgICBmbG9hdCBnZXRUYXJnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgorICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgorICAgICAqCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICovCisgICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKKyAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOworICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOworICAgIH0KKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCitwcml2YXRlOgorCisgICAgZmxvYXQgaW50ZXJwb2xhdGVDdXJyZW50KCk7CisKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gIG1UYXJnZXQ7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMC4wZiAvIDEwMC4wZiA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHo7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtUmVtYWluaW5nICAgICAgID0gMDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1TY2FsZXIgICAgICAgICAgPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfUkFNUF9MSU5FQVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZGNiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0Zsb2F0OjpTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNpbmtGbG9hdDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSAoZmxvYXQgKikgZGF0YTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1lbWNweShmbG9hdERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NWMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19GTE9BVF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rRmxvYXQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlYzhmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0kxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rSTE2OjpTaW5rSTE2KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kxNjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDE2X3QgKnNob3J0RGF0YSA9IChpbnQxNl90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzaG9ydERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyk7CisgICAgICAgIHNob3J0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpzaWduYWwrKyAqIDMyNzY4LjBmKTsKKyAgICAgICAgICAgICpzaG9ydERhdGErKyA9IHN0ZDo6bWluKElOVDE2X01BWCwgc3RkOjptYXgoSU5UMTZfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NjI2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kxNiA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkyODI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKworU2lua0kyNDo6U2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMjQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICB1aW50OF90ICpieXRlRGF0YSA9ICh1aW50OF90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19wMjRfZnJvbV9mbG9hdChieXRlRGF0YSwgZmxvYXREYXRhLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworICAgICAgICBieXRlRGF0YSArPSBudW1TYW1wbGVzICoga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1heCA9IDB4MDA3RkZGRkY7CisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1pbiA9IDB4RkY4MDAwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpmbG9hdERhdGErKyAqIDB4MDA4MDAwMDApOworICAgICAgICAgICAgbiA9IHN0ZDo6bWluKGtJMjRQYWNrZWRNYXgsIHN0ZDo6bWF4KGtJMjRQYWNrZWRNaW4sIG4pKTsgLy8gY2xpcAorICAgICAgICAgICAgLy8gV3JpdGUgYXMgYSBwYWNrZWQgMjQtYml0IGludGVnZXIgaW4gTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSBuOworICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgKG4gPj4gOCk7CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiAxNik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWI1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMjRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMjQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTI0X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI2NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlRmxvYXQ6OlNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUZsb2F0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworCisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBmbG9hdCAqZmxvYXRCYXNlID0gKGZsb2F0ICopIG1EYXRhOworICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSAmZmxvYXRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKyAgICBtZW1jcHkob3V0cHV0QnVmZmVyLCBmbG9hdERhdGEsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMTYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlSTE2OjpTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTE2OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgaW50MTZfdCAqc2hvcnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtRGF0YSk7CisgICAgY29uc3QgaW50MTZfdCAqc2hvcnREYXRhID0gJnNob3J0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdERhdGEsIHNob3J0RGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpmbG9hdERhdGErKyA9ICpzaG9ydERhdGErKyAqICgxLjBmIC8gMzI3NjgpOworICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExNmNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMTYgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE5ODgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1NvdXJjZUkyNDo6U291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUkyNDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVCYXNlID0gKHVpbnQ4X3QgKikgbURhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZURhdGEgPSAmYnl0ZUJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnQgKiBrQnl0ZXNQZXJJMjRQYWNrZWRdOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmxvYXREYXRhLCBieXRlRGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEuIC8gKGZsb2F0KSgxVUwgPDwgMzEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIC8vIEFzc2VtYmxlIHRoZSBkYXRhIGFzc3VtaW5nIExpdHRsZSBFbmRpYW4gZm9ybWF0LgorICAgICAgICBpbnQzMl90IHBhZCA9IGJ5dGVEYXRhWzJdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVsxXTsKKyAgICAgICAgcGFkIDw8PSA4OworICAgICAgICBwYWQgfD0gYnl0ZURhdGFbMF07CisgICAgICAgIHBhZCA8PD0gODsgLy8gU2hpZnQgdG8gMzIgYml0IGRhdGEgc28gdGhlIHNpZ24gaXMgY29ycmVjdC4KKyAgICAgICAgYnl0ZURhdGEgKz0ga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICAqZmxvYXREYXRhKysgPSBwYWQgKiBzY2FsZTsgLy8gc2NhbGUgdG8gcmFuZ2UgLTEuMCB0byAxLjAKKyAgICB9CisjZW5kaWYKKworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmMTRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTI0IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCmluZGV4IGE2YjlmNWQuLjkxZDJlZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKQEAgLTc4LDggKzc4LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKLSAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvRmxpbmdlciB0byBzdG9wIGNhbGxpbmcgdXMuCi0gICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgQXVkaW9GbGluZ2VyIGtpbGxpbmcgdGhlIHN0cmVhbS4KKyAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvUmVjb3JkIG9yIEF1ZGlvVHJhY2sgdG8gc3RvcCBjYWxsaW5nIHVzLgorICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZW0ga2lsbGluZyB0aGUgc3RyZWFtIHdoZW4gdGhleSBzZWUgYSBzaXplIG91dCBvZiByYW5nZS4KKyAgICAvLyBUaGF0IGlzIGFuIHVuZG9jdW1lbnRlZCBiZWhhdmlvci4KICAgICAvLyBUT0RPIGFkZCB0byBBUEkgaW4gQXVkaW9SZWNvcmQgYW5kIEF1ZGlvVHJhY2sKICAgICBjb25zdCBzaXplX3QgU0laRV9TVE9QX0NBTExCQUNLUyA9IFNJWkVfTUFYOwogCkBAIC05NSw3ICs5Niw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdG9wcGluZyBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKQEAgLTExNSwxMCArMTE2LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gU1RPUCBvciBpbnZhbGlkIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXF1ZXN0ZWQgc3RvcCwgZmFrZSBhbiBlcnJvciIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwotICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgQXVkaW9GbGluZ2VyIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIHRoZSBzeXN0ZW0ga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTk5LDcgKzIwNiw5IEBACiAKIHZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6Om9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKIHsKLSAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIGRldmljZUlkICVkIiwgKGludClkZXZpY2VJZCk7CisgICAgLy8gRGV2aWNlIHJvdXRpbmcgaXMgYSBjb21tb24gc291cmNlIG9mIGVycm9ycyBhbmQgRElTQ09OTkVDVFMuCisgICAgLy8gUGxlYXNlIGxlYXZlIHRoaXMgbG9nIGluIHBsYWNlLgorICAgIEFMT0dEKCIlcygpIGRldklkICVkID0+ICVkIiwgX19mdW5jX18sIChpbnQpIGdldERldmljZUlkKCksIChpbnQpZGV2aWNlSWQpOwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJiBnZXREZXZpY2VJZCgpICE9IGRldmljZUlkICYmCiAgICAgICAgICAgICBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIC8vIE5vdGUgdGhhdCBpc0RhdGFDYWxsYmFja0FjdGl2ZSgpIGlzIGFmZmVjdGVkIGJ5IHN0YXRlIHNvIGNhbGwgaXQgYmVmb3JlIERJU0NPTk5FQ1RJTkcuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCA0OTRlZGJjLi44ZTc4NTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTc3LDcgKzc3LDYgQEAKIAogICAgIHZpcnR1YWwgaW50NjRfdCBpbmNyZW1lbnRDbGllbnRGcmFtZUNvdW50ZXIoaW50MzJfdCBmcmFtZXMpICA9IDA7CiAKLQogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gbUZyYW1lc1dyaXR0ZW4uZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IDUwNWYyZWUuLjcxZWZjMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTU3LDMyICs1Nyw0MSBAQAogCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1JlY29yZAogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVE9ETyBTdXBwb3J0IFVOU1BFQ0lGSUVEIGluIEF1ZGlvUmVjb3JkLiBGb3Igbm93LCB1c2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHNhbXBsZXNQZXJGcmFtZSA8PSAyID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZm9yX2luZGV4X2Fzc2lnbm1lbnRfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOwogCiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgPyAwCiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAogCi0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2ggKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19JTlBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBObyBmbGFncy4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgLy8gUHJlc2VydmUgYmVoYXZpb3Igb2YgQVBJIDI2Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KIAogICAgIC8vIE1heWJlIGNoYW5nZSBkZXZpY2UgZm9ybWF0IHRvIGdldCBhIEZBU1QgcGF0aC4KQEAgLTk5LDEyICsxMDgsMTIgQEAKICAgICAvLyBXZSBqdXN0IG1heSBub3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICAvLyBCdXQgd2Ugd291bGRuJ3QgaGF2ZSBhbnl3YXkgd2l0aG91dCB0aGlzIGhhY2suCiAgICAgY29uc3RleHByIGludDMyX3Qga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdCA9IDQ4MDAwOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCiAgICAgICAgICAgICAmJiBwZXJmTW9kZSA9PSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQogICAgICAgICAgICAgJiYgKHNhbXBsZXNQZXJGcmFtZSA8PSAyKSAvLyBGQVNUIG9ubHkgZm9yIG1vbm8gYW5kIHN0ZXJlbwogICAgICAgICAgICAgJiYgKGdldFNhbXBsZVJhdGUoKSA9PSBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0CiAgICAgICAgICAgICAgICAgfHwgZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkpIHsKLSAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0kxNik7CisgICAgICAgIHNldERldmljZUZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKICAgICB9CkBAIC0xNDEsMTQgKzE1MCwxMCBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICAvLyAtLS0tLS0tLS0tLSBvcGVuIHRoZSBBdWRpb1JlY29yZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBNaWdodCByZXRyeSwgYnV0IG5ldmVyIG1vcmUgdGhhbiBvbmNlLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKIAogICAgICAgICBtQXVkaW9SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUgLy8gY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUgVE9ETyBkb2VzIG5vdCBjb21waWxlCkBAIC0yMTQsOCArMjE5LDggQEAKICAgICB9CiAKICAgICAvLyBBbGxvY2F0ZSBmb3JtYXQgY29udmVyc2lvbiBidWZmZXIgaWYgbmVlZGVkLgotICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKLSAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewogCiAgICAgICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FsbGJhY2sgdGhlbiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGRhdGEgaW50byBhbiBpbnRlcm5hbCBmbG9hdApAQCAtMzIzLDE2ICszMjgsMTMgQEAKICAgICBpZiAobUF1ZGlvUmVjb3JkLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4gdGhlIHRyYWNrIGlzIHJlY29yZGluZy4KLSAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuU3RhcnRpbmcpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7Ci0gICAgfQogCi0gICAgLy8gRW5hYmxlIGNhbGxiYWNrIGJlZm9yZSBzdGFydGluZyBBdWRpb1RyYWNrIHRvIGF2b2lkIHNodXR0aW5nCisgICAgLy8gRW5hYmxlIGNhbGxiYWNrIGJlZm9yZSBzdGFydGluZyBBdWRpb1JlY29yZCB0byBhdm9pZCBzaHV0dGluZwogICAgIC8vIGRvd24gYmVjYXVzZSBvZiBhIHJhY2UgY29uZGl0aW9uLgogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgZXJyID0gbUF1ZGlvUmVjb3JkLT5zdGFydCgpOworICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzCisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7IC8vIHJlc2V0cyBwb3NpdGlvbiB0byB6ZXJvCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9IGVsc2UgewpAQCAtMzQ2LDEyICszNDgsMTAgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKGdldEZyYW1lc1JlYWQoKSAtIGdldEZyYW1lc1dyaXR0ZW4oKSk7IC8vIFRPRE8gcmV2aWV3Ci0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNSZWFkKCkpOworICAgIG1GcmFtZXNXcml0dGVuLmNhdGNoVXBUbyhnZXRGcmFtZXNSZWFkKCkpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5jYXRjaFVwVG8oZ2V0RnJhbWVzUmVhZCgpKTsKICAgICBtQXVkaW9SZWNvcmQtPnN0b3AoKTsKICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKLSAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7IC8vIHNlcnZpY2Ugd3JpdGVzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBmbHVzaAotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgLy8gUGFzcyBmYWxzZSB0byBwcmV2ZW50IGVycm9yQ2FsbGJhY2sgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgZGlzY29ubmVjdAogICAgIC8vIHdoZW4gYXBwIGhhcyBhbHJlYWR5IHJlcXVlc3RlZCBhIHN0b3AoKS4KICAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7CkBAIC0zNjUsMTAgKzM2NSwxMiBAQAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgIC8vIFRPRE8gYWRkIGJldHRlciBzdGF0ZSB2aXNpYmlsaXR5IHRvIEF1ZGlvUmVjb3JkCiAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgorICAgICAgICAvLyBXaGVuIHN0YXJ0aW5nLCB0aGUgcG9zaXRpb24gd2lsbCBiZWdpbiBhdCB6ZXJvIGFuZCB0aGVuIGdvIHBvc2l0aXZlLgorICAgICAgICAvLyBUaGUgcG9zaXRpb24gY2FuIHdyYXAgYnV0IGJ5IHRoYXQgdGltZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgU1RBUlRJTkcuCiAgICAgICAgIGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiAhPSBtUG9zaXRpb25XaGVuU3RhcnRpbmcpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IDApIHsKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC00ODMsNiArNDg1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSB7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXh0ZW5kZWRUaW1lc3RhbXA7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5nZXRUaW1lc3RhbXAoJmV4dGVuZGVkVGltZXN0YW1wKTsKICAgICBpZiAoc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTQ5OCwxMiArNTAzLDEyIEBACiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzoKICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbi51cGRhdGUzMihwb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCA1MDVjZDc3Li4wOTRjZGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtNTksMTggKzU5LDI3IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1RyYWNrCiAgICAgLy8gVXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gc2FtcGxlc1BlckZyYW1lIDw9IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZm9yX2luZGV4X2Fzc2lnbm1lbnRfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOwogCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2gocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKICAgICAgICAgICAgIC8vIEJ5cGFzcyB0aGUgbm9ybWFsIG1peGVyIGFuZCBnbyBzdHJhaWdodCB0byB0aGUgRkFTVCBtaXhlci4KLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CkBAIC04MSw2ICs5MCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIE5vIGZsYWdzLiBVc2UgYSBub3JtYWwgbWl4ZXIgaW4gZnJvbnQgb2YgdGhlIEZBU1QgbWl4ZXIuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTg4LDkgKzk4LDkgQEAKIAogICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKIAotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKQorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkKICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgOiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgOiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCiAgICAgQXVkaW9UcmFjazo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7CkBAIC0xMjYsMjAgKzEzNiwxNyBAQAogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9jb250ZW50VHlwZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRDb250ZW50VHlwZSgpKTsKICAgICBjb25zdCBhdWRpb191c2FnZV90IHVzYWdlID0KICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKGJ1aWxkZXIuZ2V0VXNhZ2UoKSk7CisgICAgY29uc3QgYXVkaW9fZmxhZ3NfbWFza190IGF0dHJpYnV0ZXNGbGFncyA9CisgICAgICAgIEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhidWlsZGVyLmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOwogCiAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CiAgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCiAgICAgICAgICAgICAudXNhZ2UgPSB1c2FnZSwKICAgICAgICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCwgLy8gb25seSB1c2VkIGZvciByZWNvcmRpbmcKLSAgICAgICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTk9ORSwgLy8gRGlmZmVyZW50IHRoYW4gdGhlIEFVRElPX09VVFBVVF9GTEFHUworICAgICAgICAgICAgLmZsYWdzID0gYXR0cmlidXRlc0ZsYWdzLAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBzdGF0aWNfYXNzZXJ0KEFBVURJT19VTlNQRUNJRklFRCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLCAiU2Vzc2lvbiBJRHMgc2hvdWxkIG1hdGNoIik7Ci0KLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwpAQCAtMTc4LDEwICsxODUsOCBAQAogCiAgICAgLy8gR2V0IHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIEF1ZGlvVHJhY2suCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKLSAgICBzZXRGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLSAgICBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBzZXRGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKKyAgICBzZXREZXZpY2VGb3JtYXQobUF1ZGlvVHJhY2stPmZvcm1hdCgpKTsKIAogICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCkBAIC0yODcsNyArMjkyLDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMDMsNyArMzA4LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdEZsdXNoKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCkBAIC0zMTcsMTMgKzMyMiwxMyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOworICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOyAvLyBUT0RPIHJldmlldwotICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtRnJhbWVzUmVhZC5jYXRjaFVwVG8oZ2V0RnJhbWVzV3JpdHRlbigpKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uY2F0Y2hVcFRvKGdldEZyYW1lc1dyaXR0ZW4oKSk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHJlYWRzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBzdG9wCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwpAQCAtNDE5LDYgKzQyNCwxMCBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6c2V0QnVmZmVyU2l6ZShpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykKIHsKKyAgICAvLyBEbyBub3QgYXNrIGZvciBsZXNzIHRoYW4gb25lIGJ1cnN0LgorICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPCBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CisgICAgICAgIHJlcXVlc3RlZEZyYW1lcyA9IGdldEZyYW1lc1BlckJ1cnN0KCk7CisgICAgfQogICAgIHNzaXplX3QgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPnNldEJ1ZmZlclNpemVJbkZyYW1lcyhyZXF1ZXN0ZWRGcmFtZXMpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAppbmRleCA0MGViYjc2Li45NmVkNTZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcApAQCAtMzMsMzk1ICszMyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi0vLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgotLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCi0jZGVmaW5lIE1BWF9IRUFEUk9PTSAoMS40MTI1Mzc1NGYpCi0jZGVmaW5lIE1JTl9IRUFEUk9PTSAoMCAtIE1BWF9IRUFEUk9PTSkKLQotaW50MzJfdCBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgIGludDMyX3Qgc2l6ZSA9IEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihmbG9hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gVE9ETyBleHBvc2UgYW5kIGNhbGwgY2xhbXAxNl9mcm9tX2Zsb2F0IGZ1bmN0aW9uIGluIHByaW1pdGl2ZXMuaAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTZfZnJvbV9mbG9hdChmbG9hdCBmKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMSA8PCAxNTsKLSAgICByZXR1cm4gKGludDE2X3QpIHJvdW5kZihmbWF4ZihmbWluZihmICogc2NhbGUsIHNjYWxlIC0gMS5mKSwgLXNjYWxlKSk7Ci19Ci0KLS8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotLy8gQnkgdXNpbmcgZm1pbiBhbmQgZm1heCB3ZSBhbHNvIHByb3RlY3QgYWdhaW5zdCBOYU4uCi1zdGF0aWMgZmxvYXQgY2xpcFRvTWluTWF4SGVhZHJvb20oZmxvYXQgaW5wdXQpIHsKLSAgICByZXR1cm4gZm1pbihNQVhfSEVBRFJPT00sIGZtYXgoTUlOX0hFQURST09NLCBpbnB1dCkpOwotfQotCi1zdGF0aWMgZmxvYXQgY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KGZsb2F0IHNhbXBsZSwgZmxvYXQgc2NhbGVyKSB7Ci0gICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgIC8vIFNjYWxlIGFuZCBjb252ZXJ0IHRvIGEgc2hvcnQuCi0gICAgZmxvYXQgZnZhbCA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KGZ2YWwpOwotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgLy8gZGl2aWRlIGJ5IG51bUZyYW1lcyBzbyB0aGF0IHdlIGFsbW9zdCByZWFjaCBhbXBsaXR1ZGUyCi0gICAgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgU0hPUlRfU0NBTEUgIDMyNzY4Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICAgICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAgKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQ29udmVydCBNb25vIFRvIFN0ZXJlbyBhdCB0aGUgc2FtZSB0aW1lIGFzIGNvbnZlcnRpbmcgZm9ybWF0Lgotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIxID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZsb2F0IHNjYWxlciA9IHNjYWxlcjEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ZyYW1lSW5kZXhdICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0KLSAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBmbG9hdCBzYW1wbGVTY2FsZWQgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCi0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KLSAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydCgKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotCi0gICAgaWYgKHNvdXJjZS5jaGFubmVsQ291bnQgPT0gMSAmJiBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjb252ZXJ0TW9ub1RvU3RlcmVvKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBtb25vIHRvIHN0ZXJlbyBjb252ZXJzaW9uLiBPdGhlcndpc2Ugc291cmNlIGFuZCBkZXN0aW5hdGlvbgotICAgICAgICAvLyBtdXN0IG1hdGNoLgotICAgICAgICBhc3NlcnQoc291cmNlLmNoYW5uZWxDb3VudCA9PSBkZXN0aW5hdGlvbi5jaGFubmVsQ291bnQpOwotICAgICAgICBjb252ZXJ0Q2hhbm5lbHNNYXRjaChzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRNb25vVG9TdGVyZW8oCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydENoYW5uZWxzTWF0Y2goCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLSAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBzb3VyY2UuY2hhbm5lbENvdW50OwotCi0gICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXR1c190IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpIHsKICAgICAvLyBUaGlzIGNvdmVycyB0aGUgY2FzZSBmb3IgQUFVRElPX09LIGFuZCBmb3IgcG9zaXRpdmUgcmVzdWx0cy4KICAgICBpZiAocmVzdWx0ID49IDApIHsKQEAgLTUxMyw2ICsxMjQsOSBAQAogYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQpIHsKICAgICBhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0OwogICAgIHN3aXRjaCAoYWF1ZGlvRm9ybWF0KSB7CisgICAgY2FzZSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOgorICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgogICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIGJyZWFrOwpAQCAtNTIwLDE2ICsxMzQsMTkgQEAKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYWF1ZGlvRm9ybWF0KTsKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFhdWRpb0Zvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYW5kcm9pZEZvcm1hdDsKIH0KIAogYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChhdWRpb19mb3JtYXRfdCBhbmRyb2lkRm9ybWF0KSB7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0OwogICAgIHN3aXRjaCAoYW5kcm9pZEZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKICAgICAgICAgYnJlYWs7CkBAIC01MzgsNyArMTU1LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgICAgICBBTE9HRSgiQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0IDB4JTA4WCB1bnJlY29nbml6ZWQiLCBhbmRyb2lkRm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhbmRyb2lkRm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBhYXVkaW9Gb3JtYXQ7CkBAIC01OTMsMTIgKzIxMCwyOSBAQAogICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pOwogICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQgPT0gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFKTsKICAgICBpZiAocHJlc2V0ID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBwcmVzZXQgPSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgIH0KICAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KSBwcmVzZXQ7IC8vIHNhbWUgdmFsdWUKIH0KIAorYXVkaW9fZmxhZ3NfbWFza190IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzaygKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICBzd2l0Y2ggKHBvbGljeSkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT05FOworICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT047CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04gfCBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBwb2xpY3kpOworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9ORTsgLy8KKyAgICB9Cit9CisKIGludDMyX3QgQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKGludDMyX3QgbnVtRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqc2l6ZUluQnl0ZXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAppbmRleCA0Yjk3NWU4Li43NmQwNDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCkBAIC00NSwxNTYgKzQ1LDYgQEAKIGF1ZGlvX3Nlc3Npb25fdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCk7CiAKIC8qKgotICogQ29udmVydCBhbiBhcnJheSBvZiBmbG9hdHMgdG8gYW4gYXJyYXkgb2YgaW50MTZfdC4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGFycmF5Ci0gKiBAcGFyYW0gYW1wbGl0dWRlIGxldmVsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqLwotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotCi0vKioKLSAqIENvbnZlcnQgZmxvYXRzIHRvIGludDE2X3QgYW5kIHNjYWxlIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgQUtBIG51bWJlciBvZiBjaGFubmVscwotICogQHBhcmFtIGFtcGxpdHVkZTEgbGV2ZWwgYXQgc3RhcnQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICogQHBhcmFtIGFtcGxpdHVkZTIgbGV2ZWwgcGFzdCBlbmQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIENvbnZlcnQgaW50MTZfdCBhcnJheSB0byBmbG9hdCBhcnJheSByYW5naW5nIGZyb20gLTEuMCB0byArMS4wLgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcwotICovCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLCBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uKTsKLQotLyoqCi0gKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSArLy0gYW1wbGl0dWRlLgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtU2FtcGxlcwotICogQHBhcmFtIGFtcGxpdHVkZQotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBhdCBlbmQgb2YgcmFtcCwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwotCi0vKioKLSAqIFNjYWxlIGZsb2F0cyBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lCi0gKiBAcGFyYW0gYW1wbGl0dWRlMQotICogQHBhcmFtIGFtcGxpdHVkZTIKLSAqLwotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgaW50MTZfdCdzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLWNsYXNzIEFBdWRpb0RhdGFDb252ZXJ0ZXIgewotcHVibGljOgotCi0gICAgc3RydWN0IEZvcm1hdHRlZERhdGEgewotCi0gICAgICAgIEZvcm1hdHRlZERhdGEodm9pZCAqZGF0YSwgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50MzJfdCBjaGFubmVsQ291bnQpCi0gICAgICAgICAgICA6IGRhdGEoZGF0YSkKLSAgICAgICAgICAgICwgZm9ybWF0KGZvcm1hdCkKLSAgICAgICAgICAgICwgY2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCkge30KLQotICAgICAgICBjb25zdCB2b2lkICAgICAgICAgICAgKmRhdGEgPSBudWxscHRyOwotICAgICAgICBjb25zdCBhYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKLSAgICB9OwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgY29udmVydE1vbm9Ub1N0ZXJlbyhjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0Q2hhbm5lbHNNYXRjaChjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOwotfTsKLQotLyoqCiAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBhbmQgcHJldmVudCBudW1lcmljIG92ZXJmbG93LgogICogVGhlICpzaXplSW5CeXRlcyB3aWxsIGJlIHNldCB0byB6ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICoKQEAgLTIzNSwxMCArODUsMTIgQEAKIGF1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOwogCiAvKioKLSAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhlIHBhc3NlZCBpbiB2YWx1ZS4KKyAqIFRoYXQgaXMgZG9uZSBzb21ld2hlcmUgZWxzZS4KKyAqIEByZXR1cm4gaW50ZXJuYWwgYXVkaW8gZmxhZ3MgbWFzawogICovCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQorYXVkaW9fZmxhZ3NfbWFza190IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzaygKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpOwogCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxNGJiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTGluZWFyUmFtcC5oIgotCi1ib29sIExpbmVhclJhbXA6OmlzUmFtcGluZygpIHsKLSAgICBmbG9hdCB0YXJnZXQgPSBtVGFyZ2V0LmxvYWQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7Ci0gICAgICAgIC8vIFVwZGF0ZSB0YXJnZXQuIENvbnRpbnVlIGZyb20gcHJldmlvdXMgbGV2ZWwuCi0gICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OwotICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVJlbWFpbmluZyA+IDA7Ci0gICAgfQotfQotCi1ib29sIExpbmVhclJhbXA6Om5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbykgewotICAgIGJvb2wgcmFtcGluZyA9IGlzUmFtcGluZygpOwotICAgICpsZXZlbEZyb20gPSBtTGV2ZWxGcm9tOwotICAgIGlmIChyYW1waW5nKSB7Ci0gICAgICAgIGZsb2F0IGxldmVsOwotICAgICAgICBpZiAoZnJhbWVzID49IG1SZW1haW5pbmcpIHsKLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsVG87Ci0gICAgICAgICAgICBtUmVtYWluaW5nID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEludGVycG9sYXRlIHRvIGEgcG9pbnQgYWxvbmcgdGhlIGZ1bGwgcmFtcC4KLSAgICAgICAgICAgIGxldmVsID0gbUxldmVsRnJvbSArIChmcmFtZXMgKiAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1SZW1haW5pbmcpOwotICAgICAgICAgICAgbVJlbWFpbmluZyAtPSBmcmFtZXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOyAvLyBmb3IgbmV4dCByYW1wCi0gICAgICAgICpsZXZlbFRvID0gbGV2ZWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmxldmVsVG8gPSBtTGV2ZWxUbzsKLSAgICB9Ci0gICAgcmV0dXJuIHJhbXBpbmc7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWI4ZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQUFVRElPX0xJTkVBUl9SQU1QX0gKLSNkZWZpbmUgQUFVRElPX0xJTkVBUl9SQU1QX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotLyoqCi0gKiBHZW5lcmF0ZSBzZWdtZW50cyBhbG9uZyBhIGxpbmVhciByYW1wLgotICogVGhlIHJhbXAgdGFyZ2V0IGNhbiBiZSB1cGRhdGVkIGZyb20gYW5vdGhlciB0aHJlYWQuCi0gKiBXaGVuIHRoZSB0YXJnZXQgaXMgdXBkYXRlZCwgYSBuZXcgcmFtcCBpcyBzdGFydGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKgotICogVGhlIGZpcnN0IHJhbXAgc3RhcnRzIGF0IDAuMC4KLSAqCi0gKi8KLWNsYXNzIExpbmVhclJhbXAgewotcHVibGljOgotICAgIExpbmVhclJhbXAoKSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcykgewotICAgICAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRMZW5ndGhJbkZyYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIG1MZW5ndGhJbkZyYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0gICAgICogQHBhcmFtIHRhcmdldAotICAgICAqLwotICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0VGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbVRhcmdldC5sb2FkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yY2UgdGhlIG5leHRTZWdtZW50IHRvIHN0YXJ0IGZyb20gdGhpcyBsZXZlbC4KLSAgICAgKgotICAgICAqIFdBUk5JTkc6IHRoaXMgY2FuIGNhdXNlIGEgZGlzY29udGludWl0eSBpZiBjYWxsZWQgd2hpbGUgdGhlIHJhbXAgaXMgYmVpbmcgdXNlZC4KLSAgICAgKiBPbmx5IGNhbGwgdGhpcyB3aGVuIHNldHRpbmcgdGhlIGluaXRpYWwgcmFtcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZXZlbAotICAgICAqLwotICAgIHZvaWQgZm9yY2VDdXJyZW50KGZsb2F0IGxldmVsKSB7Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsKLSAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsgLy8gZm9yY2VzIGEgcmFtcCBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0YXJnZXQKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRDdXJyZW50KCkgewotICAgICAgICByZXR1cm4gbUxldmVsRnJvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGV2ZWxzIGZvciBuZXh0IHJhbXAgc2VnbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgc2VnbWVudAotICAgICAqIEBwYXJhbSBsZXZlbEZyb20gcG9pbnRlciB0byBzdGFydGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcGFyYW0gbGV2ZWxUbyBwb2ludGVyIHRvIGVuZGluZyBhbXBsaXR1ZGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmFtcCBpcyBzdGlsbCBtb3ZpbmcgdG93YXJkcyB0aGUgdGFyZ2V0Ci0gICAgICovCi0gICAgYm9vbCBuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pOwotCi1wcml2YXRlOgotCi0gICAgYm9vbCBpc1JhbXBpbmcoKTsKLQotICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgIG1UYXJnZXQ7Ci0KLSAgICBpbnQzMl90IG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMCAvIDEwMDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIegotICAgIGludDMyX3QgbVJlbWFpbmluZyAgICAgICA9IDA7Ci0gICAgZmxvYXQgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKLSAgICBmbG9hdCAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOwotfTsKLQotCi0jZW5kaWYgLy9BQVVESU9fTElORUFSX1JBTVBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggNTgzM2VhYi4uNjNhZGQ0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC00MSwxMCArNDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIKKyAgICAgKiBhZHZhbmNlIHRoZSBjdXJyZW50IHZhbHVlIHRvIG1hdGNoIHRoZSBjb3VudGVyCiAgICAgICovCi0gICAgdm9pZCBzZXQoaW50NjRfdCBjb3VudGVyKSB7Ci0gICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgIHZvaWQgY2F0Y2hVcFRvKGludDY0X3QgY291bnRlcikgeworICAgICAgICBpZiAoKGNvdW50ZXIgLSBtQ291bnRlcjY0KSA+IDApIHsKKyAgICAgICAgICAgIG1Db3VudGVyNjQgPSBjb3VudGVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDY4MTk0ZGIuLjYxMDFlOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxOCBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9jbG9ja19tb2RlbCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Nsb2NrX21vZGVsLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLApAQCAtMzQsMTMgKzQ2LDYgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3RfbGluZWFyX3JhbXAiLAotICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsidGVzdF9saW5lYXJfcmFtcC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKLX0KLQotY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3Rfb3Blbl9wYXJhbXMiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9vcGVuX3BhcmFtcy5jcHAiXSwKQEAgLTE2NywzICsxNzIsNDYgQEAKICAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Zsb3dncmFwaCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Zsb3dncmFwaC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9zdG9wX2hhbmciLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9zdG9wX2hhbmcuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9mdWxsX3F1ZXVlIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfZnVsbF9xdWV1ZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAppbmRleCAwZWRmZWJlLi4xMzBlZjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPwogICAgICAgICAvLyBGb3IgRW1wdHlSb29tCiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRFbXB0eVJvb21BdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CiAgICAgICAgIC8vIEZvciBGdWxsRGF0YQogICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCiAgICAgdm9pZCB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1dyaXRlID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgewogICAgICAgICAgICAgbURhdGFbaV0gPSBtTmV4dFdyaXRlSW5kZXgrKzsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIC8vIFJlYWQgd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIERvIG5vdCB1bmRlcmZsb3cuCiAgICAgdm9pZCB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOwogICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9SZWFkLCBhY3R1YWwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgLy8gUmVhZCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcwogICAgIHZvaWQgdmVyaWZ5UmVxdWVzdGVkRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIEFTU0VSVF9MRShudW1GcmFtZXMsIGZyYW1lc0F2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CkBAIC0yODIsMTIgKzI4MiwxMiBAQAogICAgIHZvaWQgY2hlY2tSYW5kb21Xcml0ZVJlYWQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNFbXB0eSA9Ci0gICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRW1wdHkpOwogICAgICAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwogICAgICAgICAgICAgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKaW5kZXggYjAxYWYyNS4uMzJlZTJhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCA9IERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgY2FwdHVyZVBvbGljeSA9IERPTlRfU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewogCiAgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CkBAIC01Niw2ICs1Nyw5IEBACiAgICAgaWYgKHByZXNldCAhPSBET05UX1NFVCkgewogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0KGFhdWRpb0J1aWxkZXIsIHByZXNldCk7CiAgICAgfQorICAgIGlmIChjYXB0dXJlUG9saWN5ICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvQnVpbGRlciwgY2FwdHVyZVBvbGljeSk7CisgICAgfQogCiAgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSkpOwpAQCAtODAsNiArODQsMTIgQEAKICAgICAgICAgICAgIDogcHJlc2V0OwogICAgIEVYUEVDVF9FUShleHBlY3RlZFByZXNldCwgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KGFhdWRpb1N0cmVhbSkpOwogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBleHBlY3RlZENhcHR1cmVQb2xpY3kgPQorICAgICAgICAgICAgKGNhcHR1cmVQb2xpY3kgPT0gRE9OVF9TRVQgfHwgY2FwdHVyZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTCAvLyBkZWZhdWx0CisgICAgICAgICAgICA6IHByZXNldDsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRDYXB0dXJlUG9saWN5LCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvU3RyZWFtKSk7CisKICAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOwogCiAgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CkBAIC0xMzAsNiArMTQwLDE1IEBACiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFLAorfTsKKworc3RhdGljIGNvbnN0IGFhdWRpb19pbnB1dF9wcmVzZXRfdCBzQWxsb3dDYXB0dXJlUG9saWNpZXNbXSA9IHsKKyAgICBET05UX1NFVCwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMLAorICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSwKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FLAogfTsKIAogc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgewpAQCAtMTM4LDcgKzE1Nyw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNDb250ZW50VHlwZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcGVyZk1vZGUpIHsKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKICAgICBmb3IgKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA6IHNDb250ZW50eXBlcykgewogICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsIERPTlRfU0VULCBjb250ZW50VHlwZSk7CiAgICAgfQpAQCAtMTUwLDYgKzE2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc0FsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICBmb3IgKGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5IDogc0FsbG93Q2FwdHVyZVBvbGljaWVzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOwogICAgIH0KIH0KQEAgLTE2Niw2ICsxOTcsMTAgQEAKICAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKIH0KIAorVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3BlcmZub25lKSB7CisgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZENhcHR1cmVQb2xpY3koQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSk7Cit9CisKIFRFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fdXNhZ2VfbG93bGF0KSB7CiAgICAgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwogfQpAQCAtMTc3LDMgKzIxMiw3IEBACiBURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9sb3dsYXQpIHsKICAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CiB9CisKK1RFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV9sb3dsYXQpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkQ2FwdHVyZVBvbGljeShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YWJiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgdGVzdHMgZm9yIElzb2Nocm9ub3VzIENsb2NrIE1vZGVsCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCisvLyBXZSBjYW4gdXNlIGFyYml0cmFyeSB2YWx1ZXMgaGVyZSBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbmluZyBhIHJlYWwgYXVkaW8gc3RyZWFtLgorI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICA0ODAwMAorI2RlZmluZSBIV19GUkFNRVNfUEVSX0JVUlNUICAgICA0OAorI2RlZmluZSBOQU5PU19QRVJfQlVSU1QgICAgICAgICAoTkFOT1NfUEVSX1NFQ09ORCAqIEhXX0ZSQU1FU19QRVJfQlVSU1QgLyBTQU1QTEVfUkFURSkKKworY2xhc3MgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDbG9ja01vZGVsVGVzdEZpeHR1cmUoKSB7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIHsKKyAgICAgICAgbW9kZWwuc2V0U2FtcGxlUmF0ZShTQU1QTEVfUkFURSk7CisgICAgICAgIG1vZGVsLnNldEZyYW1lc1BlckJ1cnN0KEhXX0ZSQU1FU19QRVJfQlVSU1QpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSB7CisgICAgfQorCisgICAgfkNsb2NrTW9kZWxUZXN0Rml4dHVyZSgpICB7CisgICAgICAgIC8vIGNsZWFudXAgYW55IHBlbmRpbmcgc3R1ZmYsIGJ1dCBubyBleGNlcHRpb25zIGFsbG93ZWQKKyAgICB9CisKKyAgICAvLyBUZXN0IHByb2Nlc3Npbmcgb2YgdGltZXN0YW1wcyB3aGVuIHRoZSBoYXJkd2FyZSBtYXkgYmUgc2xpZ2h0bHkgb2ZmIGZyb20KKyAgICAvLyB0aGUgZXhwZWN0ZWQgc2FtcGxlIHJhdGUuCisgICAgdm9pZCBjaGVja0RyaWZ0aW5nQ2xvY2soZG91YmxlIGhhcmR3YXJlRnJhbWVzUGVyU2Vjb25kLCBpbnQgbnVtTG9vcHMpIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWVOYW5vcyA9IDUwMDAwMDAwMDsgLy8gYXJiaXRyYXJ5CisgICAgICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZU5hbm9zKTsKKworICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0UG9zaXRpb25GcmFtZXMgPSBIV19GUkFNRVNfUEVSX0JVUlNUOyAvLyBoYXJkd2FyZQorICAgICAgICAvLyBhcmJpdHJhcnkgdGltZSBmb3IgZmlyc3QgYnVyc3QKKyAgICAgICAgY29uc3QgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lTmFub3MgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQKKyAgICAgICAgICAgICAgICArICgyMDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworCisgICAgICAgIC8vIFNob3VsZCBzZXQgaW5pdGlhbCBtYXJrZXIuCisgICAgICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAoc3RhcnRQb3NpdGlvbkZyYW1lcywgbWFya2VyVGltZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGFydFBvc2l0aW9uRnJhbWVzLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSkpOworCisgICAgICAgIGRvdWJsZSBlbGFwc2VkVGltZVNlY29uZHMgPSBzdGFydFRpbWVOYW5vcyAvIChkb3VibGUpIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTG9vcHM7IGkrKykgeworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJhbmRvbSBkZWxheSBvdmVyIHNldmVyYWwgYnVyc3RzLgorICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVEZWxheVNlY29uZHMgPSAxMC4wICogZHJhbmQ0OCgpICogTkFOT1NfUEVSX0JVUlNUIC8gTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgICAgIGVsYXBzZWRUaW1lU2Vjb25kcyArPSB0aW1lRGVsYXlTZWNvbmRzOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBlbGFwc2VkVGltZU5hbm9zID0gKGludDY0X3QpKGVsYXBzZWRUaW1lU2Vjb25kcyAqIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gc3RhcnRUaW1lTmFub3MgKyBlbGFwc2VkVGltZU5hbm9zOworICAgICAgICAgICAgLy8gU2ltdWxhdGUgRFNQIHJ1bm5pbmcgYXQgdGhlIHNwZWNpZmllZCByYXRlLgorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZUZyYW1lcyA9IHN0YXJ0UG9zaXRpb25GcmFtZXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShoYXJkd2FyZUZyYW1lc1BlclNlY29uZCAqIGVsYXBzZWRUaW1lU2Vjb25kcyk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG51bUJ1cnN0cyA9IGN1cnJlbnRUaW1lRnJhbWVzIC8gSFdfRlJBTUVTX1BFUl9CVVJTVDsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYWxpZ25lZFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbkZyYW1lcyArIChudW1CdXJzdHMgKiBIV19GUkFNRVNfUEVSX0JVUlNUKTsKKworICAgICAgICAgICAgLy8gQXBwbHkgZHJpZnRpbmcgdGltZXN0YW1wLgorICAgICAgICAgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChhbGlnbmVkUG9zaXRpb24sIGN1cnJlbnRUaW1lTmFub3MpOworCisgICAgICAgICAgICBBU1NFUlRfRVEoYWxpZ25lZFBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oY3VycmVudFRpbWVOYW5vcykpOworICAgICAgICB9CisgICAgfQorCisgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsIG1vZGVsOworfTsKKworLy8gQ2hlY2sgZGVmYXVsdCBzZXR1cC4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3NldHVwKSB7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBtb2RlbC5nZXRTYW1wbGVSYXRlKCkpOworICAgIEFTU0VSVF9FUShIV19GUkFNRVNfUEVSX0JVUlNULCBtb2RlbC5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKK30KKworLy8gVGVzdCBkZWx0YSBjYWxjdWxhdGlvbnMuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19kZWx0YXMpIHsKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBwb3NpdGlvbik7CisKKyAgICAvLyBEZWx0YXMgYXJlIG5vdCBxdWFudGl6ZWQuCisgICAgLy8gQ29tcGFyZSB0aW1lIHRvIHRoZSBlcXVpdmFsZW50IHBvc2l0aW9uIGluIGZyYW1lcy4KKyAgICBjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJCdXJzdCA9IEhXX0ZSQU1FU19QRVJfQlVSU1QgKiBOQU5PU19QRVJfU0VDT05EIC8gU0FNUExFX1JBVEU7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMikpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMiksIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCwgdGltZSk7CisKKyAgICAvLyBDb21wYXJlIHBvc2l0aW9uIGluIGZyYW1lcyB0byB0aGUgZXF1aXZhbGVudCB0aW1lLgorICAgIHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMikpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMiksIHRpbWUpOworfQorCisvLyBzdGFydCgpIHNob3VsZCBmb3JjZSB0aGUgaW50ZXJuYWwgbWFya2VycworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc3RhcnQpIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihzdGFydFRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24pOworICAgIEVYUEVDVF9FUShzdGFydFRpbWUsIHRpbWUpOworCisgICAgdGltZSA9IHN0YXJ0VGltZSArICg1MDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7Cit9CisKKy8vIHRpbWVzdGFtcHMgbW92ZXMgdGhlIHdpbmRvdyBpZiBvdXRzaWRlIHRoZSBib3VuZHMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3RpbWVzdGFtcCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBjb25zdCBpbnQ2NF90IHBvc2l0aW9uID0gSFdfRlJBTUVTX1BFUl9CVVJTVDsgLy8gaGFyZHdhcmUKKyAgICBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWUgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQgKyAoMjAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKworICAgIC8vIFNob3VsZCBzZXQgbWFya2VyLgorICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAocG9zaXRpb24sIG1hcmtlclRpbWUpOworICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUpKTsKKworICAgIC8vIGNvbnZlcnRUaW1lVG9Qb3NpdGlvbiByb3VuZHMgZG93bgorICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUgKyAoNzMgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpKSk7CisKKyAgICAvLyBjb252ZXJ0UG9zaXRpb25Ub1RpbWUgcm91bmRzIHVwCisgICAgRVhQRUNUX0VRKG1hcmtlclRpbWUgKyBOQU5PU19QRVJfQlVSU1QsIG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbiArIDE3KSk7Cit9CisKKyNkZWZpbmUgTlVNX0xPT1BTX0RSSUZUICAgMTAwMDAKKworLy8gdGVzdCBudWRnaW5nIHRoZSB3aW5kb3cgYnkgdXNpbmcgYSBkcmlmdGluZyBIVyBjbG9jaworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfbm9fZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9CisKKy8vIFRoZXNlIHNsb3cgZHJpZnQgcmF0ZXMgY2F1c2VkIGVycm9ycyB3aGVuIEkgZGlzYWJsZWQgdGhlIGNvZGUgdGhhdCBoYW5kbGVzCisvLyBkcmlmdGluZyBpbiB0aGUgY2xvY2sgbW9kZWwuIFNvIEkgdGhpbmsgdGhlIHRlc3QgaXMgdmFsaWQuCisvLyBJdCBpcyB1bmxpa2VseSB0aGF0IHJlYWwgaGFyZHdhcmUgd291bGQgYmUgb2ZmIGJ5IG1vcmUgdGhhbiB0aGlzIGFtb3VudC4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3Nsb3dfZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soMC45OTggKiBTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KKworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZmFzdF9kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jaygxLjAwMiAqIFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjNhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGVzdCBGbG93R3JhcGgKKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0Zsb2F0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMTYuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kyNC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMTYuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3NpbmtpMTYpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAwLjVmLCAtMC4yNWYsIC0xLjBmLCAwLjBmLCA1My45ZiwgLTg3LjJmfTsKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBleHBlY3RlZFtdID0gezMyNzY3LCAxNjM4NCwgLTgxOTIsIC0zMjc2OCwgMCwgMzI3NjcsIC0zMjc2OH07CisgICAgaW50MTZfdCBvdXRwdXRbMjBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIFNpbmtJMTYgc2lua0kxNnsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmc2lua0kxNi5pbnB1dCk7CisKKyAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kxNi5yZWFkKG91dHB1dCwgbnVtT3V0cHV0RnJhbWVzKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgb3V0cHV0W2ldKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9tb25vX3RvX3N0ZXJlbykgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDIuMGYsIDMuMGZ9OworICAgIGZsb2F0IG91dHB1dFsxMDBdID0ge307CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgTW9ub1RvTXVsdGlDb252ZXJ0ZXIgbW9ub1RvU3RlcmVvezJ9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7Mn07CisKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCAzKTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZtb25vVG9TdGVyZW8uaW5wdXQpOworICAgIG1vbm9Ub1N0ZXJlby5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgOCk7CisgICAgQVNTRVJUX0VRKDMsIG51bVJlYWQpOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzBdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMF0sIG91dHB1dFsxXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbMl0pOworICAgIEVYUEVDVF9FUShpbnB1dFsxXSwgb3V0cHV0WzNdKTsKK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3JhbXBfbGluZWFyKSB7CisgICAgY29uc3RleHByIGludCByYW1wU2l6ZSA9IDU7CisgICAgY29uc3RleHByIGludCBudW1PdXRwdXQgPSAxMDA7CisgICAgY29uc3RleHByIGZsb2F0IHZhbHVlID0gMS4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgdGFyZ2V0ID0gMTAwLjBmOworICAgIGZsb2F0IG91dHB1dFtudW1PdXRwdXRdID0ge307CisgICAgUmFtcExpbmVhciByYW1wTGluZWFyezF9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7MX07CisKKyAgICByYW1wTGluZWFyLmlucHV0LnNldFZhbHVlKHZhbHVlKTsKKyAgICByYW1wTGluZWFyLnNldExlbmd0aEluRnJhbWVzKHJhbXBTaXplKTsKKyAgICByYW1wTGluZWFyLnNldFRhcmdldCh0YXJnZXQpOworICAgIHJhbXBMaW5lYXIuZm9yY2VDdXJyZW50KDAuMGYpOworCisgICAgcmFtcExpbmVhci5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtT3V0cHV0KTsKKyAgICBBU1NFUlRfRVEobnVtT3V0cHV0LCBudW1SZWFkKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgaW50IGkgPSAwOworICAgIGZvciAoOyBpIDwgcmFtcFNpemU7IGkrKykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGkgKiB2YWx1ZSAqIHRhcmdldCAvIHJhbXBTaXplOworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IG51bU91dHB1dDsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdmFsdWUgKiB0YXJnZXQ7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorfQorCisvLyBJdCBpcyBlYXNpZXN0IHRvIHJlcHJlc2VudCBwYWNrZWQgMjQtYml0IGRhdGEgYXMgYSBieXRlIGFycmF5LgorLy8gVGhpcyB0ZXN0IHdpbGwgcmVhZCBmcm9tIGlucHV0LCBjb252ZXJ0IHRvIGZsb2F0LCB0aGVuIHdyaXRlCisvLyBiYWNrIHRvIG91dHB1dCBhcyBieXRlcy4KK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9wYWNrZWRfMjQpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbnB1dFtdID0gezB4MDEsIDB4MjMsIDB4NDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LCAweDg5LCAweEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDRCwgMHhFRiwgMHg1QX07CisgICAgdWludDhfdCBvdXRwdXRbOTldID0ge307CisgICAgU291cmNlSTI0IHNvdXJjZUkyNHsxfTsKKyAgICBTaW5rSTI0IHNpbmtJMjR7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8ga0J5dGVzUGVySTI0UGFja2VkOworICAgIHNvdXJjZUkyNC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlSTI0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTI0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMjQucmVhZChvdXRwdXQsIHNpemVvZihvdXRwdXQpIC8ga0J5dGVzUGVySTI0UGFja2VkKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGlucHV0KTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShpbnB1dFtpXSwgb3V0cHV0W2ldKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9jbGlwX3RvX3JhbmdlKSB7CisgICAgY29uc3RleHByIGZsb2F0IG15TWluID0gLTIuMGY7CisgICAgY29uc3RleHByIGZsb2F0IG15TWF4ID0gMS41ZjsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gey05LjcsIDAuNWYsIC0wLjI1LCAxLjBmLCAxMi4zfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZXhwZWN0ZWRbXSA9IHtteU1pbiwgMC41ZiwgLTAuMjUsIDEuMGYsIG15TWF4fTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBDbGlwVG9SYW5nZSBjbGlwcGVyezF9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisKKyAgICBjbGlwcGVyLnNldE1pbmltdW0obXlNaW4pOworICAgIGNsaXBwZXIuc2V0TWF4aW11bShteU1heCk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmY2xpcHBlci5pbnB1dCk7CisgICAgY2xpcHBlci5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihvdXRwdXRbMF0pOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtT3V0cHV0RnJhbWVzKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZnVsbF9xdWV1ZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mdWxsX3F1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZnVsbF9xdWV1ZS5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRlc3Qgd2hldGhlciBhIHN0cmVhbSBkaWVzIGlmIGl0IGlzIHdyaXR0ZW4gdG8gYWZ0ZXIgYSBkZWxheS4KKy8vIE1heWJlIGJlY2F1c2UgdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSB0aGUgQUF1ZGlvIHNlcnZpY2UgZmlsbHMgdXAuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlclNlY29uZCA9IDEwMDAwMDAwMDA7Citjb25zdGV4cHIgaW50NjRfdCBrVGltZW91dE5hbm9zID0ga05hbm9zUGVyU2Vjb25kIC8gMjsKK2NvbnN0ZXhwciBpbnQga051bUZyYW1lcyA9IDI1NjsKK2NvbnN0ZXhwciBpbnQga0NoYW5uZWxDb3VudCA9IDI7CisKK3N0YXRpYyB2b2lkIGNoZWNrRnVsbFF1ZXVlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsZWVwTWlsbGlzKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oCisgICAgICAgICAgICBrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudCk7CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGFhdWRpb0J1aWxkZXIsIGtDaGFubmVsQ291bnQpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwKKyAgICAgICAgICAgICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAvLyBTbGVlcCBmb3IgYXdoaWxlLiBUaGlzIG1pZ2h0IGtpbGwgdGhlIHN0cmVhbS4KKyAgICB1c2xlZXAoc2xlZXBNaWxsaXMgKiAxMDAwKTsgLy8gMTAwMCBtaWxsaXMgaW4gYSBtaWNyb3NlY29uZAorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICBrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgIGtUaW1lb3V0TmFub3MpOworICAgICAgICBFWFBFQ1RfRVEoa051bUZyYW1lcywgcmVzdWx0KTsKKyAgICAgICAgaWYgKGtOdW1GcmFtZXMgIT0gcmVzdWx0KSBicmVhazsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9wZXJmX25vbmVfNTApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCA1MCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9wZXJmX25vbmVfMjAwKSB7CisgICAgY2hlY2tGdWxsUXVldWUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgMjAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX3BlcmZfbm9uZV8xMDAwKSB7CisgICAgY2hlY2tGdWxsUXVldWUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgMTAwMCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9sb3dfbGF0ZW5jeV81MCkgeworICAgIGNoZWNrRnVsbFF1ZXVlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCA1MCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9sb3dfbGF0ZW5jeV8yMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgMjAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX2xvd19sYXRlbmN5XzEwMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgMTAwMCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjUyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBSZXR1cm4gc3RvcCBmcm9tIHRoZSBjYWxsYmFjay4KKyAqIEV4cGVjdCB0aGUgY2FsbGJhY2sgdG8gY2Vhc2UuCisgKiBDaGVjayB0aGUgbG9nY2F0IGZvciBiYWQgYmVoYXZpb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisjZGVmaW5lIFNUT1BfQVRfTVNFQyAgICAgICAgICAxMDAwCisjZGVmaW5lIExPT1BfRFVSQVRJT05fTVNFQyAgICA0MDAwCisjZGVmaW5lIFNMRUVQX0RVUkFUSU9OX01TRUMgICAgMjAwCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgICAgICAgICAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBzdG9wQXRGcmFtZSA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIC8vIFRoZXNlIGNvdW50ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBjYWxsYmFjayBhbmQgdGhlIG1haW4gdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBzdGFydGluZ0ZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBmcmFtZXNDYWxsZWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50e307CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gY2FsbGJhY2tDb3VudEFmdGVyU3RvcHt9OworCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZnJhbWVzUmVhZC5zdG9yZSgwKTsKKyAgICAgICAgc3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBmcmFtZXNDYWxsZWQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnRBZnRlclN0b3Auc3RvcmUoMCk7CisgICAgICAgIHN0b3BwZWQgPSBmYWxzZTsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKHN0cnVjdCBBdWRpb0VuZ2luZSAqKXVzZXJEYXRhOworICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudCsrOworICAgIGlmIChlbmdpbmUtPnN0b3BwZWQpIHsKKyAgICAgICAgZW5naW5lLT5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wKys7CisgICAgfQorCisgICAgZW5naW5lLT5mcmFtZXNSZWFkID0gKGludDMyX3QpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICBpZiAoZW5naW5lLT5zdGFydGluZ0ZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICBlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZC5zdG9yZShlbmdpbmUtPmZyYW1lc1JlYWQubG9hZCgpKTsKKyAgICB9CisgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQgKz0gbnVtRnJhbWVzOworICAgIGlmIChlbmdpbmUtPmZyYW1lc0NhbGxlZCA+PSBlbmdpbmUtPnN0b3BBdEZyYW1lKSB7CisgICAgICAgIGVuZ2luZS0+c3RvcHBlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CisgICAgfQorfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmZW5naW5lLT5idWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoZW5naW5lLT5idWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLT5idWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihlbmdpbmUtPmJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RGF0YUNhbGxiYWNrUHJvYywgZW5naW5lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShlbmdpbmUtPmJ1aWxkZXIsICZlbmdpbmUtPnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX0Nsb3NlQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChlbmdpbmUtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShlbmdpbmUtPnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbmdpbmUtPnN0cmVhbSA9IG51bGxwdHI7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGVuZ2luZS0+YnVpbGRlcik7CisgICAgZW5naW5lLT5idWlsZGVyID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgcHJpbnRmKCIlcygpIC0gZXJyb3IgPSAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQgc191c2FnZSgpIHsKKyAgICBwcmludGYoInRlc3RfcmV0dXJuX3N0b3AgWy1pXSBbLXhdIFstbl0gWy1jXVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7CisgICAgcHJpbnRmKCIgICAgIC14IHNoYXJpbmcgbW9kZSBFWENMVVNJVkUsIG90aGVyd2lzZSBTSEFSRURcbiIpOworICAgIHByaW50ZigiICAgICAtbiBwZXJmb3JtYW5jZSBtb2RlIE5PTkUsIG90aGVyd2lzZSBMT1dfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGFsd2F5cyByZXR1cm4gQ09OVElOVUUgZnJvbSBjYWxsYmFjaywgbm90IFNUT1BcbiIpOworfQorCisvKioKKyAqIEByZXR1cm4gMCBpcyBPSywgLTEgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc19jaGVja0VuZ2luZVBvc2l0aW9ucyhBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS0+c3RyZWFtKTsKKyAgICBjb25zdCBpbnQzMl90IGRlbHRhID0gKGludDMyX3QpKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKTsKKyAgICBwcmludGYoInBsYXlpbmcgZnJhbWVzUmVhZCA9ICU3ZCwgZnJhbWVzV3JpdHRlbiA9ICU3ZCIKKyAgICAgICAgICAgIiwgZGVsdGEgPSAlNGQsIGZyYW1lc0NhbGxlZCA9ICU2ZCwgY2FsbGJhY2tDb3VudCA9ICU0ZFxuIiwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1JlYWQsCisgICAgICAgICAgIChpbnQzMl90KSBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICBkZWx0YSwKKyAgICAgICAgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQubG9hZCgpLAorICAgICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnQubG9hZCgpCisgICAgKTsKKyAgICBpZiAoZGVsdGEgPiBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhlbmdpbmUtPnN0cmVhbSkpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGRlbHRhID4gY2FwYWNpdHlcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKyAgICBzdHJ1Y3QgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sIGFsd2F5c0NvbnRpbnVlID0gZmFsc2U7CisgICAgaW50IGVycm9yQ291bnQgPSAwOworICAgIGludCBjYWxsYmFja1Jlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IFJldHVybiBTdG9wIFYxLjBcbiIpOworICAgIHByaW50ZigiV2FpdCBmb3IgYSBmZXcgc2Vjb25kcy5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgY2FsbGJhY2tDb3VudCBhbmQgZnJhbWVzUmVhZCBzdG9wIGFkdmFuY2luZ1xuIik7CisgICAgcHJpbnRmKCJ3aGVuIGNhbGxiYWNrQ291bnQgcmVhY2hlcyAlZCBtc2VjXG4iLCBTVE9QX0FUX01TRUMpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGFsd2F5c0NvbnRpbnVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IHNfT3BlbkF1ZGlvU3RyZWFtKCZlbmdpbmUsIGRpcmVjdGlvbiwgc2hhcmluZ01vZGUsIHBlcmZNb2RlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoInNfT3BlbkF1ZGlvU3RyZWFtIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGVuZ2luZS5zdHJlYW0pOworICAgIC8vIFVzZSBkb3VibGUgYnVmZmVyZWQgc3RyZWFtLgorICAgIGNvbnN0IGludDMyX3QgYnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoZW5naW5lLnN0cmVhbSwgMiAqIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYnVmZmVyU2l6ZSkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBmcmFtZXNQZXJCdXJzdCA9ICUzZCwgcGVyZk1vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgZGV2aWNlSWQsIGZyYW1lc1BlckJ1cnN0LCBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgY2FsbGJhY2tzIG5lZWRlZC4KKyAgICBpZiAoYWx3YXlzQ29udGludWUpIHsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBTVE9QX0FUX01TRUMgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBsb29wcyA9IDA7IGxvb3BzIDwgMiAmJiByZXN1bHQgPT0gQUFVRElPX09LOyBsb29wcysrKSB7CisgICAgICAgIGVuZ2luZS5yZXNldCgpOworCisgICAgICAgIC8vIFN0YXJ0IHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gTE9PUF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB3YXRjaExvb3BzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RvcEF0RnJhbWUgIT0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IChlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcCA9PSAwKSA/IEVYSVRfU1VDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQ2FsbGJhY2sgY291bnQgYWZ0ZXIgU1RPUCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5sb2FkKCkpOworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RhcnRpbmdGcmFtZXNSZWFkLmxvYWQoKSA9PSBlbmdpbmUuZnJhbWVzUmVhZC5sb2FkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBmcmFtZXNSZWFkIGRpZCBub3QgYWR2YW5jZSBhY3Jvc3MgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCA8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgfQorCisgICAgc19DbG9zZUF1ZGlvU3RyZWFtKCZlbmdpbmUpOworCisgICAgcHJpbnRmKCJhYXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICBwcmludGYoInRlc3QgJXNcbiIsIGVycm9yQ291bnQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworICAgIHJldHVybiBlcnJvckNvdW50ID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RvcF9oYW5nLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5N2I2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrCisgKiBhbmQgdGhlbiBjbG9zZSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNkZWZpbmUgRFVSQVRJT05fU0VDT05EUyAgIDUKKworc3RydWN0IEF1ZGlvRW5naW5lIHsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICpidWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAgICpzdHJlYW0gPSBudWxscHRyOworICAgIHN0ZDo6dGhyZWFkICAgICAgICAgKnRocmVhZCA9IG51bGxwdHI7CisKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgIHN0YXJ0ZWR7ZmFsc2V9OworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgZG9uZUxvY2s7IC8vIFVzZSBhIG11dGV4IHNvIHdlIGNhbiBzbGVlcCBvbiBpdCB3aGlsZSBqb2luKClpbmcuCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICBkb25le2ZhbHNlfTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBqb2luKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgYmxvY2sgaWYgdGhlIHRocmVhZCBpcyBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG11dGV4IGlzIHVzZWQgdG8gY2xvc2UoKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVmb3JlIHRoZSByZXF1ZXN0U3RvcCgpIGlzIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZG9uZUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50Zigiam9pbigpIGdvdCBtdXRleCBidXQgc3RyZWFtIG5vdCBkb25lISIpOworICAgICAgICAgICAgICAgIHVzbGVlcCgxMCAqIDEwMDApOyAvLyBzbGVlcCB0aGVuIGNoZWNrIGFnYWluCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2Uoc3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBzdHJlYW07CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZW5naW5lLT5kb25lTG9jayk7CisgICAgZW5naW5lLT5zdGFydGVkID0gdHJ1ZTsKKyAgICB1c2xlZXAoRFVSQVRJT05fU0VDT05EUyAqIDEwMDAgKiAxMDAwKTsgLy8gTWltaWMgU3ludGhNYXJrIHByb2NlZHVyZS4KKyAgICBlbmdpbmUtPmRvbmUgPSB0cnVlOworICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKKyAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmVuZ2luZS0+YnVpbGRlcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlciByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGVuZ2luZS0+YnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teUVycm9yQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oZW5naW5lLT5idWlsZGVyLCAmZW5naW5lLT5zdHJlYW0pOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBpbnQgZXJyb3JDb3VudCA9IDA7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiVGVzdCBSZXR1cm4gU3RvcCBIYW5nIFYxLjBcbiIpOworCisgICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJzX09wZW5BdWRpb1N0cmVhbSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLCBkZXZpY2VJZCwgYWN0dWFsUGVyZk1vZGUpOworCisgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICB3aGlsZSAoIWVuZ2luZS5zdGFydGVkKSB7CisgICAgICAgICAgICBwcmludGYoIldhaXRpbmcgZm9yIHN0cmVhbSB0byBzdGFydCwgJWRcbiIsIGNvdW50ZXIrKyk7CisgICAgICAgICAgICB1c2xlZXAoNSAqIDEwMDApOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgbW9yZSBtZXNzYWdlcyAlZCBzZWNvbmRzIGFmdGVyIHRoaXMuIElmIG5vdCB0aGVuIHRoZSB0ZXN0IGZhaWxlZCFcbiIsCisgICAgICAgICAgICAgICBEVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLmpvaW4oKTsgLy8gVGhpcyBtaWdodCBoYW5nIQorICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShlbmdpbmUuYnVpbGRlcik7CisgICAgICAgIGVuZ2luZS5idWlsZGVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/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+JiB3aG8gX191bnVzZWQpCkBAIC0xMzk1LDggKzE0MzQsOSBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCitBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlcikKKyAgICA6IFRocmVhZCh0cnVlIC8qIGJDYW5DYWxsSmF2YSAqLykgIC8vIGJpbmRlciByZWN1cnNpb24gb24gcmVzdG9yZVJlY29yZF9sKCkgbWF5IGNhbGwgSmF2YS4KKyAgICAsIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQpAQCAtMTQ0Niw5ICsxNDg2LDkgQEAKICAgICBjYXNlIE5TX1dIRU5FVkVSOgogICAgICAgICAvLyBFdmVudCBkcml2ZW46IGNhbGwgd2FrZSgpIHdoZW4gY2FsbGJhY2sgbm90aWZpY2F0aW9ucyBjb25kaXRpb25zIGNoYW5nZS4KICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCkgcmV0dXJuZWQgJWxsZCIsIF9fZnVuY19fLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjMDcyOTAxLi4wMmRjNTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+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+Z2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKK30KKwogZmxvYXQgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZURCKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKQEAgLTEzMDQsNiArMTQxMCwxMTUgQEAKICAgICByZXR1cm4gYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworfQorCitib29sIEF1ZGlvU3lzdGVtOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgeworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgorICAgICAgICAmIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJnN0cmVhbV0oY29uc3QgYXV0byAmYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFN0cmVhbVR5cGUoKSA9PSBzdHJlYW07IH0pOworICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVzIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBwc0lkOworICAgIHN0YXR1c190IHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyhhdHRyKSwgcHNJZCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibm8gc3RyYXRlZ3kgZm91bmQgZm9yIGF0dHJpYnV0ZXMgJXMiLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LmdldElkKCkgPT0gcHNJZCkgeworICAgICAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZhdHRyXShjb25zdCBhdXRvICZyZWZBdHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZBdHRyLmdldEF0dHJpYnV0ZXMoKSwgYXR0cik7IH0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKGF0dHJWZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRTdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgYXR0cmlidXRlcyAlcyB3aGVuIGNvbnZlcnRpbmcgdG8gc3RyZWFtIiwgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEscHJvZHVjdFN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0UnR0RW5hYmxlZChlbmFibGVkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTEzNTMsNiArMTU2OCw0NyBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLmFkZChjYWxsYmFjayk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCitpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sucmVtb3ZlQXQoaSk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CkBAIC0xMzY5LDkgKzE2MjUsMTQgQEAKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKQEAgLTEzNzksNyArMTY0MCw4IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0xMzkwLDYgKzE2NTIsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGFiOWVmZTguLjRhODBjZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiwxNiArMjIsMTkgQEAKICNpbmNsdWRlIDxtYXRoLmg+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+bUZyYW1lQ291bnRIQUwgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW9EZXNjLT5tTGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1Qb3J0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA4Y2Q0YTg1Li42NGYwYWNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjQsMTEgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1MSwxMCBAQAogICAgIElOSVRfU1RSRUFNX1ZPTFVNRSwKICAgICBTRVRfU1RSRUFNX1ZPTFVNRSwKICAgICBHRVRfU1RSRUFNX1ZPTFVNRSwKKyAgICBTRVRfVk9MVU1FX0FUVFJJQlVURVMsCisgICAgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTLAorICAgIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAorICAgIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAogICAgIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLAogICAgIEdFVF9PVVRQVVRfRk9SX0VGRkVDVCwKICAgICBSRUdJU1RFUl9FRkZFQ1QsCkBAIC02Myw2ICs2Niw3IEBACiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCiAgICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQsCisgICAgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsCiAgICAgTElTVF9BVURJT19QT1JUUywKICAgICBHRVRfQVVESU9fUE9SVCwKICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCkBAIC03OCwxMSArODIsMjkgQEAKICAgICBTVEFSVF9BVURJT19TT1VSQ0UsCiAgICAgU1RPUF9BVURJT19TT1VSQ0UsCiAgICAgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwKKyAgICBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsCiAgICAgU0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9NQVNURVJfTU9OTywKICAgICBHRVRfU1RSRUFNX1ZPTFVNRV9EQiwKICAgICBHRVRfU1VSUk9VTkRfRk9STUFUUywKLSAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQKKyAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsCisgICAgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBTRVRfQVNTSVNUQU5UX1VJRCwKKyAgICBTRVRfQTExWV9TRVJWSUNFU19VSURTLAorICAgIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQsCisgICAgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgR0VUX09GRkxPQURfRk9STUFUU19BMkRQLAorICAgIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTLAorICAgIEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUywKKyAgICBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsCisgICAgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUywKKyAgICBTRVRfQUxMT1dFRF9DQVBUVVJFX1BPTElDWSwKKyAgICBNT1ZFX0VGRkVDVFNfVE9fSU8sCisgICAgU0VUX1JUVF9FTkFCTEVECiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05OSw3ICsxMjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTA3LDYgKzEzMCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXRlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihlbmNvZGVkRm9ybWF0KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTI1LDEzICsxNDksMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTE3Myw0NyArMTk5LDQxIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZQogICAgICAgICB7CiAgICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGlmIChhdHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKTogTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIGFuZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciB1bnNwZWNpZmllZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyIE5VTEwgb3V0cHV0IC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHNlbGVjdGVkRGV2aWNlSWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBvdXRwdXQgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9ydElkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHBvcnRJZCAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBzZWxlY3RlZERldmljZUlkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIGRhdGEud3JpdGUoYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlY29uZGFyeU91dHB1dHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTIzNSw2ICsyNTUsMTAgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbFN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CkBAIC0yNDIsNDkgKzI2Niw0MCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5yZXNpemUocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWQoc2Vjb25kYXJ5T3V0cHV0cy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+c2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0zMTQsNiArMzI5LDcgQEAKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyaWlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CkBAIC0zMzYsMTYgKzM1MiwxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICpzaWxlbmNlZCA9IHJlcGx5LnJlYWRJbnQzMigpID09IDE7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC00MDcsMTMgKzQyMCw3NyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RyZWFtKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCkBAIC00NzAsNiArNTQ3LDIyIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBpZCA6IGlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIoaW8pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTU9WRV9FRkZFQ1RTX1RPX0lPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUyNCw2ICs2MTcsMTUgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUzMyw2ICs2MzUsMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNjc0LDYgKzc4NiwxNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQgPyAxIDogMCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCkBAIC03NTMsMTEgKzg3MywxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOwpAQCAtNzcwLDE1ICs4OTAsMTUgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC04NzksNiArOTk5LDI5MSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQorICAgIHsKKyAgICAgICAgaWYgKGZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGlzdF9zaXplID0gcmVwbHkucmVhZFVpbnQzMigpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvcm1hdHMtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocmVwbHkucmVhZEludDMyKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisKKyAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzYWdlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BU1NJU1RBTlRfVUlELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byB1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ExMVlfU0VSVklDRVNfVUlEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZGV2aWNlcy5zaXplKCk7CisgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOworICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1TdHJhdGVnaWVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJhdGVnaWVzOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5IHN0cmF0ZWd5OworICAgICAgICAgICAgc3RhdHVzID0gc3RyYXRlZ3kucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHN0cmF0ZWdpZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyYXRlZ2llcy5wdXNoX2JhY2soc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1Hcm91cHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwIGdyb3VwOworICAgICAgICAgICAgc3RhdHVzID0gZ3JvdXAucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHZvbHVtZSBncm91cHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGdyb3Vwcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHZvbHVtZUdyb3VwID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZW5hYmxlZCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1JUVF9FTkFCTEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZSwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZSIpOwpAQCAtODk3LDcgKzEzMDIsNiBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOgogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6CiAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDoKLSAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTToKICAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgUkVHSVNURVJfRUZGRUNUOgogICAgICAgICBjYXNlIFVOUkVHSVNURVJfRUZGRUNUOgpAQCAtOTA1LDYgKzEzMDksNyBAQAogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0FUVFI6CiAgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjoKICAgICAgICAgY2FzZSBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOgorICAgICAgICBjYXNlIE1PVkVfRUZGRUNUU19UT19JTzoKICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAogICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKQEAgLTkzMiwxMSArMTMzNywxNyBAQAogICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgogICAgICAgICBjYXNlIFJFR0lTVEVSX1BPTElDWV9NSVhFUzoKICAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01PTk86Ci0gICAgICAgIGNhc2UgU1RBUlRfQVVESU9fU09VUkNFOgotICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOgogICAgICAgICBjYXNlIEdFVF9TVVJST1VORF9GT1JNQVRTOgotICAgICAgICBjYXNlIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRDogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICBjYXNlIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRDoKKyAgICAgICAgY2FzZSBTRVRfQVNTSVNUQU5UX1VJRDoKKyAgICAgICAgY2FzZSBTRVRfQTExWV9TRVJWSUNFU19VSURTOgorICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOgorICAgICAgICBjYXNlIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZOgorICAgICAgICBjYXNlIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUDoKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFM6CisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUzoKKyAgICAgICAgY2FzZSBTRVRfUlRUX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk0OCw5ICsxMzU5LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvUG9saWN5U2VydmljZTogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKQEAgLTk2MSw2ICsxMzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUgZm9yIGRldmljZSAldSIsIGRldmljZSk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwpAQCAtOTY4LDcgKzEzNzksOCBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTk5NCwxMyArMTQwNiwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTEwNDEsMTIgKzE0NTYsMTIgQEAKIAogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0FUVFI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9OwotICAgICAgICAgICAgYm9vbCBoYXNBdHRyaWJ1dGVzID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cik7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHIpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgICAgICAgICAgYm9vbCBoYXNTdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7CkBAIC0xMDYzLDQ4ICsxNDc4LDQzIEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHIoaGFzQXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwKICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS0+d3JpdGUoc2Vjb25kYXJ5T3V0cHV0cy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExMTQsNiArMTUyNCw3IEBACiAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKCZhdHRyKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkID0gKGF1ZGlvX3VuaXF1ZV9pZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7CkBAIC0xMTI0LDcgKzE1MzUsNyBAQAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgc2Vzc2lvbiwgcGlkLCB1aWQsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgcmlpZCwgc2Vzc2lvbiwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKQEAgLTExMzksMTAgKzE1NTAsOCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExOTgsNyArMTYwNyw3NCBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGV2aWNlKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMjU2LDYgKzE3MzIsMzEgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIE1PVkVfRUZGRUNUU19UT19JTzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gaWRzOworICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KG1vdmVFZmZlY3RzVG9JbyhpZHMsIGlvKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgSVNfU1RSRUFNX0FDVElWRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CkBAIC0xMzEzLDYgKzE4MTQsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHt9OworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQzOCw2ICsxOTUxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChkYXRhLnJlYWRJbnQzMigpID09IDEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KApAQCAtMTQ5OCwxNyArMjAxNywxNyBAQAogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xNTg3LDYgKzIxMDYsMjY5IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBlbmNvZGluZ0Zvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZlbmNvZGluZ0Zvcm1hdHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGVuY29kaW5nRm9ybWF0cy5zaXplKCkpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5jb2RpbmdGb3JtYXRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVuY29kaW5nRm9ybWF0c1tpXSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKworICAgICAgICBjYXNlIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWlkcy5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlQm9vbChpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZS5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmF0ZWdpZXMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ2llc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3k7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciBncm91cHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBncm91cHMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzW2ldLndyaXRlVG9QYXJjZWwocmVwbHkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBncm91cCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDxpbnQ+KGdyb3VwKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGZsYWdzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9SVFRfRU5BQkxFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UnR0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IGFkN2YxZGUuLjBmOTU4MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC0zMSw3ICszMSw4IEBACiAgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgUEFUQ0hfTElTVF9VUERBVEUsCiAgICAgTUlYX1NUQVRFX1VQREFURSwKLSAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKKyAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsCisgICAgVk9MVU1FX0dST1VQX0NIQU5HRUQsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OSwxNSArNTAsNDIgQEAKIH0KIAogaW5saW5lIHZvaWQgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBjbGllbnRJbmZvLT5yaWlkID0gKGF1ZGlvX3VuaXF1ZV9pZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CiAgICAgY2xpZW50SW5mby0+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+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5oIgogCkBAIC04NSw3ICs4OCw3IEBACiAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwotICAgICAgICAgICAgc2hvcnQqICAgICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAorICAgICAgICAgICAgaW50MTZfdCogICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAogICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgICAgIH07CkBAIC0xODksNyArMTkyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IE1JQ19GSUVMRF9ESU1FTlNJT05fREVGQVVMVCk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1JlY29yZCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9SZWNvcmQuCkBAIC0yMjgsNyArMjM0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtNTM0LDkgKzU0MywyMyBAQAogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCi0gICAgLyoKLSAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgorICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nIHB1cnBvc2VzKS4KICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCisgICAgLyogU2V0IHRoZSBNaWNyb3Bob25lIHpvb20gZmFjdG9yIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgICogb2YgYSBnaXZlbiBBdWRpb1JlY29yZCBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyAgICAgLyoKKyAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC01NDgsNyArNTcxLDcgQEAKICAgICBjbGFzcyBBdWRpb1JlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIpOwogCiAgICAgICAgIC8vIERvIG5vdCBjYWxsIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHJlcXVlc3RFeGl0KCkuCiAgICAgICAgIC8vIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHZpcnR1YWwsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBlbm91Z2guCkBAIC01OTgsNiArNjIxLDggQEAKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gICBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyPiBtVHJhY2tlcjsKKwogICAgIC8vIEN1cnJlbnQgY2xpZW50IHN0YXRlOiAgZmFsc2UgPSBzdG9wcGVkLCB0cnVlID0gYWN0aXZlLiAgUHJvdGVjdGVkIGJ5IG1Mb2NrLiAgSWYgbW9yZSBzdGF0ZXMKICAgICAvLyBhcmUgYWRkZWQsIGNvbnNpZGVyIGNoYW5naW5nIHRoaXMgdG8gZW51bSBTdGF0ZSB7IC4uLiB9IG1TdGF0ZSBhcyBpbiBBdWRpb1RyYWNrLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CkBAIC02NTQsNiArNjc5LDcgQEAKICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICBtT3JpZ0ZsYWdzOyAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIGNvbnN0CiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCkBAIC02NjIsNyArNjg4LDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OwotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRmb3JBdHRyKCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CkBAIC03MDEsMTAgKzcyNywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGFuZCBjb25uZWN0ZWQgZGV2aWNlcwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAKKyAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IG1TZWxlY3RlZE1pY0RpcmVjdGlvbjsKKyAgICBmbG9hdCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbjsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBNZWRpYU1ldHJpY3MgewogICAgICAgcHVibGljOgotICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvcmVjb3JkIikpLAorICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3JlY29yZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZE5zKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZE5zKDApLCBtRHVyYXRpb25OcygwKSwgbUNvdW50KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RXJyb3IoTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCA0YzBmNzk2Li4wOWU4MGIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KQEAgLTM1LDkgKzM3LDE0IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7CiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtMjA0LDE3ICsyMTEsMTkgQEAKICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCiAgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgc3RhdGljIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLApAQCAtMjIzLDIxICsyMzIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVJlY29yZCgpLAogICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTI0Nyw4ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0yNjEsNiArMjY1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKwogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMjcyLDYgKzI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAKICAgICAvLyBjbGVhciBzdHJlYW0gdG8gb3V0cHV0IG1hcHBpbmcgY2FjaGUgKGdTdHJlYW1PdXRwdXRNYXApCiAgICAgLy8gYW5kIG91dHB1dCBjb25maWd1cmF0aW9uIGNhY2hlIChnT3V0cHV0cykKQEAgLTI4NSw2ICszMDEsOCBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyk7CisKICAgICAvLyBDaGVjayBpZiBodyBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgc3RhdGljIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKTsKQEAgLTMyNywxOSArMzQ1LDI5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSk7CisKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCkBAIC0zNDksOCArMzc3LDQyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSk7CisKKyAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpOworCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisgICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygpIHt9CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlRGllZCgpID0gMDsKKworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKwogICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKICAgICB7CiAgICAgcHVibGljOgpAQCAtMzc5LDkgKzQ0MSwxMSBAQAogICAgIH07CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKIApAQCAtNDEyLDE3ICs0NzYsMjAgQEAKIAogCiAgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gPiAgIG1Jb0Rlc2NyaXB0b3JzOwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzOworCisgICAgICAgIHN0ZDo6bWFwPGF1ZGlvX2lvX2hhbmRsZV90LCBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPj4+CisgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzOwogICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGZvciByZWNvcmRpbmcgZ2V0SW5wdXRCdWZmZXJTaXplKCkgcXVlcmllcwogICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5CdWZmU2l6ZTsgICAgLy8gemVybyBpbmRpY2F0ZXMgY2FjaGUgaXMgaW52YWxpZAogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5TYW1wbGluZ1JhdGU7CkBAIC00NDIsMjEgKzUwOSwzMSBAQAogICAgICAgICBpbnQgcmVtb3ZlQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjayk7CiAgICAgICAgIGJvb2wgaXNBdWRpb1BvcnRDYkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiAobUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCkgIT0gMCk7IH0KIAorICAgICAgICBpbnQgYWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgaW50IHJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgICAgIGJvb2wgaXNBdWRpb1ZvbHVtZUdyb3VwQ2JFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpICE9IDApOyB9CisKICAgICAgICAgLy8gRGVhdGhSZWNpcGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKICAgICAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIFZlY3RvciA8c3AgPEF1ZGlvUG9ydENhbGxiYWNrPiA+ICAgIG1BdWRpb1BvcnRDYWxsYmFja3M7CisgICAgICAgIFZlY3RvciA8c3AgPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4gPiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrOwogICAgIH07CiAKICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAppbmRleCA0OThkZThlLi5lNTkyNWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCkBAIC0xMzUsOCArMTM1LDIzIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBkb3VibGUgZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHVpbnQzMl90IHNhbXBsZVJhdGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldExhdGVuY3lNcyhzYW1wbGVSYXRlLCBMT0NBVElPTl9TRVJWRVIsIExPQ0FUSU9OX0tFUk5FTCk7CisgICAgfQorCisgICAgZG91YmxlIGdldExhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlLCBMb2NhdGlvbiBsb2NhdGlvbjEsIExvY2F0aW9uIGxvY2F0aW9uMikgY29uc3QgeworICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjFdID4gMCAmJiBtVGltZU5zW2xvY2F0aW9uMl0gPiAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lRGlmZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvbltsb2NhdGlvbjFdIC0gbVBvc2l0aW9uW2xvY2F0aW9uMl07CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVEaWZmZXJlbmNlTnMgPQorICAgICAgICAgICAgICAgICAgICBtVGltZU5zW2xvY2F0aW9uMV0gLSBtVGltZU5zW2xvY2F0aW9uMl07CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpZnJhbWVEaWZmZXJlbmNlICogMWU5IC8gc2FtcGxlUmF0ZSAtIHRpbWVEaWZmZXJlbmNlTnMpICogMWUtNjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMC47CisgICAgfQorCiAgICAgLy8gY29udmVydCBmaWVsZHMgdG8gYSBwcmludGFibGUgc3RyaW5nCi0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CiAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogCiAgICAgICAgIHNzIDw8ICJCT09UVElNRSBvZmZzZXQgIiA8PCBtVGltZWJhc2VPZmZzZXRbVElNRUJBU0VfQk9PVFRJTUVdIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDNlYjYyN2QuLmRmNWVhYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC03NCw2ICs3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWFwcGluZyBmcm9tIGZyYW1lIHBvc2l0aW9uIHRvIHByZXNlbnRhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIEF1ZGlvVGltZXN0YW1wIGZvciB0aGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgd2l0aCBldmVudC4KICNlbmRpZgorICAgICAgICBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBID0gOSwvLyBOb3RpZmljYXRpb24gdGhhdCBtb3JlIGRhdGEgY2FuIGJlIGdpdmVuIGJ5IHdyaXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgb25seSBvY2N1cnMgZm9yIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0suCiAgICAgfTsKIAogICAgIC8qIENsaWVudCBzaG91bGQgZGVjbGFyZSBhIEJ1ZmZlciBhbmQgcGFzcyB0aGUgYWRkcmVzcyB0byBvYnRhaW5CdWZmZXIoKQpAQCAtMTAyLDcgKzEwNCw3IEBACiAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwotICAgICAgICAgICAgc2hvcnQqICAgICAgaTE2OyAgICAgIC8vIHNpZ25lZCAxNi1iaXQKKyAgICAgICAgICAgIGludDE2X3QqICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCiAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCk6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgIH07CkBAIC0xNDUsNiArMTQ3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpOwogCisgICAgLyogQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciB0aGUgZ2l2ZW4gYXVkaW8gY29uZmlndXJhdGlvbiBhbmQgYXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBvdXRwdXQgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKKwogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIHRvIEF1ZGlvVHJhY2sKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewpAQCAtMTUzLDYgKzE2MSw3IEBACiAgICAgICAgIFRSQU5TRkVSX09CVEFJTiwgICAgLy8gY2FsbCBvYnRhaW5CdWZmZXIoKSBhbmQgcmVsZWFzZUJ1ZmZlcigpCiAgICAgICAgIFRSQU5TRkVSX1NZTkMsICAgICAgLy8gc3luY2hyb25vdXMgd3JpdGUoKQogICAgICAgICBUUkFOU0ZFUl9TSEFSRUQsICAgIC8vIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSywgLy8gc3luY2hyb25vdXMgd3JpdGUoKSwgbm90aWYgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQQogICAgIH07CiAKICAgICAvKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9UcmFjay4gTm8gY29ubmVjdGlvbiB3aXRoCkBAIC0yOTUsNiArMzA0LDggQEAKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvVHJhY2sgY29uc3RydWN0b3JzIGFib3ZlOgogICAgICAqCiAgICAgICogdGhyZWFkQ2FuQ2FsbEphdmE6ICBXaGV0aGVyIGNhbGxiYWNrcyBhcmUgbWFkZSBmcm9tIGFuIGF0dGFjaGVkIHRocmVhZCBhbmQgdGh1cyBjYW4gY2FsbCBKTkkuCisgICAgICogICAgICBPbmx5IHNldCB0byB0cnVlIHdoZW4gQXVkaW9UcmFjayBvYmplY3QgaXMgdXNlZCBmb3IgYSBqYXZhIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjaworICAgICAqICAgICAgaW4gaXRzIEpOSSBjb2RlLgogICAgICAqCiAgICAgICogSW50ZXJuYWwgc3RhdGUgcG9zdCBjb25kaXRpb246CiAgICAgICogICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIGltcGxpZXMgdGhpcyBBdWRpb1RyYWNrIGhhcyB2YWxpZCBhdHRyaWJ1dGVzCkBAIC05MDcsNyArOTE4LDE0IEBACiAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfQUNUSVZFIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgIH0KLXByb3RlY3RlZDoKKworICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1RyYWNrIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAqIFRoZSBJRCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBhdWRpb3NlcnZlciBjbGllbnRzIGFuZCBjYW4gY2hhbmdlIGR1cmluZyB0aGUgbGlmZSBjeWNsZQorICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9UcmFjayBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgKi8KKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0UG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfTsKKworIHByb3RlY3RlZDoKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHRyYWNrcyBpcyBub3QgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CkBAIC05MTYsNyArOTM0LDcgQEAKICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEF1ZGlvVHJhY2tUaHJlYWQoQXVkaW9UcmFjayYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICBBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyKTsKIAogICAgICAgICAvLyBEbyBub3QgY2FsbCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIHdpdGhvdXQgZmlyc3QgY2FsbGluZyByZXF1ZXN0RXhpdCgpLgogICAgICAgICAvLyBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB2aXJ0dWFsLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gZW5vdWdoLgpAQCAtMTAwMyw3ICsxMDIxLDcgQEAKICAgICBzcDxJQXVkaW9UcmFjaz4gICAgICAgICBtQXVkaW9UcmFjazsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dDsgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiAgICBtQXVkaW9UcmFja1RocmVhZDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmE7CkBAIC0xMDU4LDYgKzEwNzYsMTkgQEAKICAgICAgICAgU1RBVEVfU1RPUFBJTkcsCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlOwogCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdGF0ZVRvU3RyaW5nKFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0FDVElWRTogICAgICAgICAgcmV0dXJuICJTVEFURV9BQ1RJVkUiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6ICAgICAgICAgIHJldHVybiAiU1RBVEVfUEFVU0VEIjsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfU1RPUFBJTkc6IHJldHVybiAiU1RBVEVfUEFVU0VEX1NUT1BQSU5HIjsKKyAgICAgICAgY2FzZSBTVEFURV9GTFVTSEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfRkxVU0hFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBJTkc6ICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQSU5HIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBmb3IgY2xpZW50IGNhbGxiYWNrIGhhbmRsZXIKICAgICBjYWxsYmFja190ICAgICAgICAgICAgICBtQ2JmOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7CkBAIC0xMTIwLDggKzExNTEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrcy4KIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkOy8vIHRydWUgaWYgbVByZXZpb3VzVGltZXN0YW1wIGlzIHZhbGlkCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZDsgLy8gcmVkdWNlIGxvZyBzcGFtCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZDsgLy8gcmVkdWNlIGxvZyBzcGFtCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZDsgICAgICAvLyByZWR1Y2UgbG9nIHNwYW0KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVBvc2l0aW9uUmVwb3J0ZWQ7IC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlVGltZVJlcG9ydGVkOyAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQ7ICAgICAgICAgICAgICAvLyByZWR1Y2UgbG9nIHNwYW0KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhbGVUaW1lUmVwb3J0ZWQ7ICAgICAgICAgIC8vIHJlZHVjZSBsb2cgc3BhbQogICAgIEF1ZGlvVGltZXN0YW1wICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcDsgICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHJldHJvZ3JhZGUgbW90aW9uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXA6OkxvY2F0aW9uIG1QcmV2aW91c0xvY2F0aW9uOyAgLy8gbG9jYXRpb24gdXNlZCBmb3IgcHJldmlvdXMgdGltZXN0YW1wCiAKQEAgLTExNDgsNiArMTE4Miw3IEBACiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKQEAgLTExOTUsNyArMTIzMCw3IEBACiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6Ci0gICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW90cmFjayIpKSB7CisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdHJhY2siKSkgewogICAgICAgICB9CiAgICAgICAgIH5NZWRpYU1ldHJpY3MoKSB7CiAgICAgICAgICAgICAvLyBtQW5hbHl0aWNzSXRlbSBhbGxvYyBmYWlsdXJlIHdpbGwgYmUgZmxhZ2dlZCBpbiB0aGUgY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ZWEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwIDogcHVibGljIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1ZvbHVtZUdyb3VwKCkge30KKyAgICBBdWRpb1ZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVzVmVjdG9yICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUdyb3VwSWQoZ3JvdXApLCBtQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBtU3RyZWFtcyhzdHJlYW1zKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwSWQ7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXM7IH0KKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbXM7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXBJZCA9IFZPTFVNRV9HUk9VUF9OT05FOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIG1TdHJlYW1zOworfTsKKwordXNpbmcgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvVm9sdW1lR3JvdXA+OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IGU2YmY3MmYuLjhlYzg5MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0xNDYsNiArMTQ2LDcgQEAKICAgICAgICAgICAgIGFmU2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZEludDY0KCk7CiAgICAgICAgICAgICBhZkxhdGVuY3lNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Myw2ICsxNjQsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE3OSw2ICsxODEsNyBAQAogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKQEAgLTIwMiw2ICsyMDUsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmcmlpZCwgc2l6ZW9mKGF1ZGlvX3VuaXF1ZV9pZF90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKQEAgLTIxOCw2ICsyMjQsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwogICAgICAgICAgICAgKHZvaWQpY2xpZW50SW5mby53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZyaWlkLCBzaXplb2YoYXVkaW9fdW5pcXVlX2lkX3QpKTsKIAogICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKQEAgLTIzMyw2ICsyNDAsNyBAQAogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgQXVkaW9DbGllbnQgY2xpZW50SW5mbzsKICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZDsKIAogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKQEAgLTI3MSw2ICsyNzksNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTI5Nyw2ICszMDYsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMzEzLDYgKzMyMyw3IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0SWQ7CiAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvLyBpbnZhcmlhbnQgb24gZXhpdCBmb3IgYWxsIEFQSXMgdGhhdCByZXR1cm4gYW4gc3A8PjoKQEAgLTM1Myw2ICszNjQsOSBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QgPSAwOworCiAgICAgLyogc2V0L2dldCBzdHJlYW0gdHlwZSBzdGF0ZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgYnkKICAgICAgKiB0aGUgcHJlZmVyZW5jZSBwYW5lbCwgbW9zdGx5LgogICAgICAqLwpAQCAtNDI4LDcgKzQ0Miw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTQ0Niw2ICs0NjIsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSA9IDA7CisKICAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkgPSAwOwogCiAgICAgLy8gaGVscGVycyBmb3IgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuZ2V0UHJvcGVydHkoKSwgc2VlIGRlc2NyaXB0aW9uIHRoZXJlIGZvciBtZWFuaW5nCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGMzODc2YWYuLjMyMjc1Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMCwxNSArMjAsMTQgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLQogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ1LDE4ICs0NCwyMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLApAQCAtNjUsMTggKzY2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtODUsOCArODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtOTgsNiArOTQsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkgPSAwOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CkBAIC0xMDgsNiArMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKSA9IDA7CiAgICAgdmlydHVhbCBib29sICAgICBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sICAgICBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ID0gMDsKQEAgLTExNSwxMCArMTIzLDI5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgPSAwOwogICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCiAgICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nIG9yIG9mZmxvYWQgcHJvcGVydHkgaXMgZW5hYmxlZAogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pID0gMDsKIAorICAgIC8vIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzYW1wbGUgcmF0ZSwgY2hhbm5lbCBtYXNrIGFuZCBmbGFncy4KKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKKwogICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE0Nyw2ICsxNzQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKQEAgLTE1NywxMCArMTg2LDE1IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCisgICAgICAgICAgICA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKSA9IDA7CkBAIC0xNzEsNyArMjA1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgPSAwOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZTBkMjQ5NS4uNDdiMzFlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTE3LDE5ICsxNywyNiBAQAogI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogCisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyB7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZDsKICAgICB1aWRfdCB1aWQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydF9pZDsKKyAgICBib29sIHNpbGVuY2VkOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OwpAQCAtNDEsNiArNDgsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KTsKIAorICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIHZvbHVtZSBncm91cAorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBwYXRjaCBjb25maWd1cmF0aW9uLgpAQCAtNTEsOCArNjAsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDk0YWZlM2MuLjA2ZTc4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTcwLDYgKzcwLDkgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5MWE3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BTkRST0lEX1JFQ09SRElOR19BQ1RJVklUWV9UUkFDS0VSX0hfXworI2RlZmluZSBfX0FORFJPSURfUkVDT1JESU5HX0FDVElWSVRZX1RSQUNLRVJfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSUF1ZGlvTWFuYWdlcjsKK2NsYXNzIElCaW5kZXI7CisKK2NsYXNzIFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcgoreworcHVibGljOgorICAgIFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpOworICAgIH5SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKTsKKyAgICBhdWRpb191bmlxdWVfaWRfdCBnZXRSaWlkKCk7CisgICAgdm9pZCByZWNvcmRpbmdTdGFydGVkKCk7CisgICAgdm9pZCByZWNvcmRpbmdTdG9wcGVkKCk7CisKK3ByaXZhdGU6CisgICAgc3A8SUF1ZGlvTWFuYWdlcj4gbUF1ZGlvTWFuYWdlcjsKKyAgICBhdWRpb191bmlxdWVfaWRfdCBtUklJZDsKKyAgICBzcDxJQmluZGVyPiAgICAgICBtVG9rZW47Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfX0FORFJPSURfUkVDT1JESU5HX0FDVElWSVRZX1RSQUNLRVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmluZGV4IDdhZTZhYTYuLjViMDY4OWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCkBAIC0yNjMsOSArMjYzLDkgQEAKICAgICBjbGFzcyBUb25lU2VnbWVudCB7CiAgICAgcHVibGljOgogICAgICAgICB1bnNpZ25lZCBpbnQgZHVyYXRpb247Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHdhdmVGcmVxW1RPTkVHRU5fTUFYX1dBVkVTKzFdOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wQ250OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb29wSW5keDsKKyAgICAgICAgdWludDE2X3Qgd2F2ZUZyZXFbVE9ORUdFTl9NQVhfV0FWRVMrMV07CisgICAgICAgIHVpbnQxNl90IGxvb3BDbnQ7CisgICAgICAgIHVpbnQxNl90IGxvb3BJbmR4OwogICAgIH07CiAKICAgICBjbGFzcyBUb25lRGVzY3JpcHRvciB7CkBAIC0yODYsMTQgKzI4NiwxNCBAQAogICAgIHVuc2lnbmVkIGludCBtTWF4U21wOyAgLy8gTWF4aW11bSBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwbGF5ZWQgKG1heGltdW4gdG9uZSBkdXJhdGlvbikKICAgICBpbnQgbUR1cmF0aW9uTXM7ICAvLyBNYXhpbXVtIHRvbmUgZHVyYXRpb24gaW4gbXMKIAotICAgIHVuc2lnbmVkIHNob3J0IG1DdXJTZWdtZW50OyAgLy8gQ3VycmVudCBzZWdtZW50IGluZGV4IGluIFRvbmVEZXNjcmlwdG9yIHNlZ21lbnRzW10KLSAgICB1bnNpZ25lZCBzaG9ydCBtQ3VyQ291bnQ7ICAvLyBDdXJyZW50IHNlcXVlbmNlIHJlcGVhdCBjb3VudAotICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1TdGF0ZTsgIC8vIFRvbmVHZW5lcmF0b3Igc3RhdGUgKHRvbmVfc3RhdGUpCi0gICAgdW5zaWduZWQgc2hvcnQgbVJlZ2lvbjsKKyAgICB1aW50MTZfdCBtQ3VyU2VnbWVudDsgIC8vIEN1cnJlbnQgc2VnbWVudCBpbmRleCBpbiBUb25lRGVzY3JpcHRvciBzZWdtZW50c1tdCisgICAgdWludDE2X3QgbUN1ckNvdW50OyAgLy8gQ3VycmVudCBzZXF1ZW5jZSByZXBlYXQgY291bnQKKyAgICB2b2xhdGlsZSB1aW50MTZfdCBtU3RhdGU7ICAvLyBUb25lR2VuZXJhdG9yIHN0YXRlICh0b25lX3N0YXRlKQorICAgIHVpbnQxNl90IG1SZWdpb247CiAgICAgY29uc3QgVG9uZURlc2NyaXB0b3IgKm1wVG9uZURlc2M7ICAvLyBwb2ludGVyIHRvIGFjdGl2ZSB0b25lIGRlc2NyaXB0b3IKICAgICBjb25zdCBUb25lRGVzY3JpcHRvciAqbXBOZXdUb25lRGVzYzsgIC8vIHBvaW50ZXIgdG8gbmV4dCBhY3RpdmUgdG9uZSBkZXNjcmlwdG9yCiAKLSAgICB1bnNpZ25lZCBzaG9ydCBtTG9vcENvdW50ZXI7IC8vIEN1cnJlbnQgdG9uZSBsb29wYmFjayBjb3VudAorICAgIHVpbnQxNl90IG1Mb29wQ291bnRlcjsgLy8gQ3VycmVudCB0b25lIGxvb3BiYWNrIGNvdW50CiAKICAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOyAgLy8gQXVkaW9GbGluZ2VyIFNhbXBsaW5nIHJhdGUKICAgICBzcDxBdWRpb1RyYWNrPiBtcEF1ZGlvVHJhY2s7ICAvLyBQb2ludGVyIHRvIGF1ZGlvIHRyYWNrIHVzZWQgZm9yIHBsYXliYWNrCkBAIC0zMjEsMjYgKzMyMSwyNiBAQAogICAgICAgICAgICAgV0FWRUdFTl9TVE9QICAvLyBTdG9wIHdhdmUgb24gemVybyBjcm9zc2luZwogICAgICAgICB9OwogCi0gICAgICAgIFdhdmVHZW5lcmF0b3IodWludDMyX3Qgc2FtcGxpbmdSYXRlLCB1bnNpZ25lZCBzaG9ydCBmcmVxdWVuY3ksCisgICAgICAgIFdhdmVHZW5lcmF0b3IodWludDMyX3Qgc2FtcGxpbmdSYXRlLCB1aW50MTZfdCBmcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lKTsKICAgICAgICAgfldhdmVHZW5lcmF0b3IoKTsKIAotICAgICAgICB2b2lkIGdldFNhbXBsZXMoc2hvcnQgKm91dEJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICB2b2lkIGdldFNhbXBsZXMoaW50MTZfdCAqb3V0QnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0IHNob3J0IEdFTl9BTVAgPSAzMjAwMDsgIC8vIGFtcGxpdHVkZSBvZiBnZW5lcmF0b3IKLSAgICAgICAgc3RhdGljIGNvbnN0IHNob3J0IFNfUTE0ID0gMTQ7ICAvLyBzaGlmdCBmb3IgUTE0Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaG9ydCBTX1ExNSA9IDE1OyAgLy8gc2hpZnQgZm9yIFExNQorICAgICAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBHRU5fQU1QID0gMzIwMDA7ICAvLyBhbXBsaXR1ZGUgb2YgZ2VuZXJhdG9yCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IFNfUTE0ID0gMTQ7ICAvLyBzaGlmdCBmb3IgUTE0CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IFNfUTE1ID0gMTU7ICAvLyBzaGlmdCBmb3IgUTE1CiAKLSAgICAgICAgc2hvcnQgbUExX1ExNDsgIC8vIFExNCBjb2VmZmljaWVudAorICAgICAgICBpbnQxNl90IG1BMV9RMTQ7ICAvLyBRMTQgY29lZmZpY2llbnQKICAgICAgICAgLy8gZGVsYXkgbGluZSBvZiBmdWxsIGFtcGxpdHVkZSBnZW5lcmF0b3IKICAgICAgICAgbG9uZyBtUzEsIG1TMjsgIC8vIGRlbGF5IGxpbmUgUzIgb2xkZXN0Ci0gICAgICAgIHNob3J0IG1TMl8wOyAgLy8gc2F2ZWQgdmFsdWUgZm9yIHJlaW5pdGlhbGlzYXRpb24KLSAgICAgICAgc2hvcnQgbUFtcGxpdHVkZV9RMTU7ICAvLyBRMTUgYW1wbGl0dWRlCisgICAgICAgIGludDE2X3QgbVMyXzA7ICAvLyBzYXZlZCB2YWx1ZSBmb3IgcmVpbml0aWFsaXNhdGlvbgorICAgICAgICBpbnQxNl90IG1BbXBsaXR1ZGVfUTE1OyAgLy8gUTE1IGFtcGxpdHVkZQogICAgIH07CiAKLSAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCBzaG9ydCwgV2F2ZUdlbmVyYXRvciAqPiBtV2F2ZUdlbnM7ICAvLyBsaXN0IG9mIGFjdGl2ZSB3YXZlIGdlbmVyYXRvcnMuCisgICAgS2V5ZWRWZWN0b3I8dWludDE2X3QsIFdhdmVHZW5lcmF0b3IgKj4gbVdhdmVHZW5zOyAgLy8gbGlzdCBvZiBhY3RpdmUgd2F2ZSBnZW5lcmF0b3JzLgogfTsKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTZmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTlkNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFjYjU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzIwMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1OTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgewotICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDg4NDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YmU3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1N2Q2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZhNTAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMDA4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmIwMzJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZkYWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDBlNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjljZDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0gICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7Ci0gICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKLSAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKLSAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7Ci0gICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KLSAgICByZXR1cm4gZXJyID09IDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KLQotVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotaXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgotV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KLQotVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCi10aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCi1JU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCi1mcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCi0KLVRoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAotYnkgQXVkaW9GbGluZ2VyLgotCi0qLwotCi1zdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKLSAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQotCi0gICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgfQotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgotICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKLSAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQotICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KLSAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7Ci0gICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7Ci0gICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKLSAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7Ci0gICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOwotICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKLSAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgewotICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKLSAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWQ4YWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEwN2U1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgewotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOwotICAgIH0KLX0KLQotU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKLSAgICBtU3RyZWFtID0gMDsKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOGQwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YjFhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2RlZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNzUwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwotICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwotICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQotICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKLSAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCi0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAotICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgewotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07Ci0gICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOwotICAgIH0KLSAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKLX0KLQotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi0vLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgotc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgotICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKLSAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAotICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYWxBZGRyZXNzOwotfQotCi0vL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycwotCi1hdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKLSAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7Ci0gICAgfQotfQotCi1hdWRpb19taWNyb3Bob25lX2xvY2F0aW9uX3QgbG9jYXRpb25Ub0hhbChBdWRpb01pY3JvcGhvbmVMb2NhdGlvbiBsb2NhdGlvbikgewotICAgIHN3aXRjaCAobG9jYXRpb24pIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFk7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZX01PVkFCTEU6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWV9NT1ZBQkxFOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpQRVJJUEhFUkFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fUEVSSVBIRVJBTDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gbG9jYXRpb25Ub0hhbCBjb252ZXJzaW9uICVkIiwgbG9jYXRpb24pOwotICAgIH0KLX0KLWF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgewotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6bWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpIHsKLSAgICBpZiAocERzdCAhPSBOVUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmRldmljZV9pZCwgc2l6ZW9mKHBEc3QtPmRldmljZV9pZCksCi0gICAgICAgICAgICAgICAgICIlcyIsIHNyYy5kZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgcERzdC0+ZGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzcmMuZGV2aWNlQWRkcmVzcy5kZXZpY2UpOwotICAgICAgICBzbnByaW50ZihwRHN0LT5hZGRyZXNzLCBzaXplb2YocERzdC0+YWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICIlcyIsIGRldmljZUFkZHJlc3NUb0hhbChzcmMuZGV2aWNlQWRkcmVzcykuY19zdHIoKSk7Ci0gICAgICAgIGlmIChzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICV6dSBjaGFubmVsTWFwcGluZyBlbGVtZW50cy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgIHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCksIEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY2g7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgJiYgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IGNoYW5uZWxNYXBwaW5nVG9IYWwoc3JjLmNoYW5uZWxNYXBwaW5nW2NoXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKLSAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+bG9jYXRpb24gPSBsb2NhdGlvblRvSGFsKHNyYy5sb2NhdGlvbik7Ci0gICAgICAgIHBEc3QtPmdyb3VwID0gKGF1ZGlvX21pY3JvcGhvbmVfZ3JvdXBfdClzcmMuZ3JvdXA7Ci0gICAgICAgIHBEc3QtPmluZGV4X2luX3RoZV9ncm91cCA9ICh1bnNpZ25lZCBpbnQpc3JjLmluZGV4SW5UaGVHcm91cDsKLSAgICAgICAgcERzdC0+c2Vuc2l0aXZpdHkgPSBzcmMuc2Vuc2l0aXZpdHk7Ci0gICAgICAgIHBEc3QtPm1heF9zcGwgPSBzcmMubWF4U3BsOwotICAgICAgICBwRHN0LT5taW5fc3BsID0gc3JjLm1pblNwbDsKLSAgICAgICAgcERzdC0+ZGlyZWN0aW9uYWxpdHkgPSBkaXJlY3Rpb25hbGl0eVRvSGFsKHNyYy5kaXJlY3Rpb25hbGl0eSk7Ci0gICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gKHVuc2lnbmVkIGludClzcmMuZnJlcXVlbmN5UmVzcG9uc2Uuc2l6ZSgpOwotICAgICAgICBpZiAocERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPiBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKSB7Ci0gICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlZCBmcmVxdWVuY3kgcmVzcG9uc2VzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMsIEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpOwotICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGsrKykgewotICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5mcmVxdWVuY3k7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmxldmVsOwotICAgICAgICB9Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi54ID0gc3JjLnBvc2l0aW9uLng7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi55ID0gc3JjLnBvc2l0aW9uLnk7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi56ID0gc3JjLnBvc2l0aW9uLno7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnggPSBzcmMub3JpZW50YXRpb24ueDsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueSA9IHNyYy5vcmllbnRhdGlvbi55OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi56ID0gc3JjLm9yaWVudGF0aW9uLno7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgVjRfMAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjNhOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0gICAgc3RhdGljIHZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKLQotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKLSAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgotICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0PiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0IHJldHZhbCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0JiByZXN1bHQpOwotCi0gICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNjYTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCi0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAotICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCi0gICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcwotICAgIFNpbmtNZXRhZGF0YSBtZXRhZGF0YSA9IHt7e0F1ZGlvU291cmNlKHNvdXJjZSksIDF9fX07Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCi0gICAgICAgICAgICBoaWRsUG9ydCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvL2NvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMjE3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDVkZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM0MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMxOTRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAotICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7Ci0gICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCi19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDg4OWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMWVjN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZWRkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWM1MjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdjODlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1NzhjNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotCi0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTljNGM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IG1rRW51bUNvbnZlcnRlcjxBdWRpb0NoYW5uZWxNYXNrPihoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBta0VudW1Db252ZXJ0ZXI8RWZmZWN0Q29uZmlnUGFyYW1ldGVycz4oaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgotICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOwotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgewotICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMuCi0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbW9uIGNhc2UuCi0gICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7Ci0gICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKLSAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCi0gICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgUmV0dXJuPHZvaWQ+IHJldDsKLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOwotICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOwotICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZGFiMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVkNzg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7Ci0gICAgfQotICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwotfQotCi0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyZmRiMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbnRlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvVXNhZ2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQbGF5YmFja1RyYWNrTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVjb3JkVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0oYXV0byBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIGF1dG8gbSwgYXV0byBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1TdHJlYW0sIGhpZGxQYXJhbXMsIHt9IC8qIG9wdGlvbnMgKi8pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgbVN0cmVhbSwKLSAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+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+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLS8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwotdGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KLXN0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKLSAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvLyBjb252ZXJ0Ci0gICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKLSAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7Ci0gICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkYTBmOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbUluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dC5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1JbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwotdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKLXVzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGw7Ci0KLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKLSAgICBJU3RyZWFtICptU3RyZWFtOwotICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7Ci0gICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KLSAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOwotICAgIHZvaWQgb25EcmFpblJlYWR5KCk7Ci0gICAgdm9pZCBvbkVycm9yKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDk2YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+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+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzc1MDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjcyMDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDZjMmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci1uYW1lc3BhY2UgdXRpbHMgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+Ci1SZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgewotICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWxzCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjZkZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBiN2ExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwotICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAppbmRleCAzYTVkZjI3Li41ODRjMmMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKQEAgLTgsMTYgKzgsMjAgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDIuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAorICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggNGM4ZWFmNi4uZjg2MDA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTYsMTkgKzE2LDIyIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzUuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KIAotI2luY2x1ZGUgPERldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY1XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFY1XzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworICAgICAgICByZXR1cm4gVjRfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWMl8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCBlYWQxZmEyLi5iZDNlZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwyMCArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNS4wL0lFZmZlY3RzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjVfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNV8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjRfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlYyXzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDIgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCisKKyAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLAorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTQiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDUuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTUiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhhNTIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CisgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CisgICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCisgICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcworICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKKyAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7CisgICAgfQorICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOworfQorCitDb252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQorICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCitzdGF0aWMgc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKKyAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgorICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKKyAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAorICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBoYWxBZGRyZXNzOworfQorCisvL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycworCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7CisgICAgc3dpdGNoIChtYXBwaW5nKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOworICAgIH0KK30KKworc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7CisgICAgfQorfQorc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgeworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKKyAgICB9Cit9CisKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgeworICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKKyAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOworICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKKyAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKKyAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKKyAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7CisgICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOworICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKKyAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7CisgICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7CisgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKKyAgICB9Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2JiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyBDb3JlUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgICAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCisgICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Q29yZVJlc3VsdD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBDb3JlUmVzdWx0IHJldHZhbCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7CisKKyAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworfTsKKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpNaWNyb3Bob25lSW5mbzsKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCk7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWY4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCituYW1lc3BhY2UgeworCitzdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgeworICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7CisKKyAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOworICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworfQorCitEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKKyAgICBpZiAobURldmljZSAhPSAwKSB7CisgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7CisgICAgLy8gT2Jzb2xldGUuCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIEFQSSBzbyB0aGF0IGNvbnRleHQgYW5kIGt2UGFpcnMgYXJlIHNlcGFyYXRlZAorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtRGV2aWNlLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMobURldmljZSwKKyAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIEVudW1CaXRmaWVsZDxBdWRpb091dHB1dEZsYWc+KGZsYWdzKSwKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAorI2VuZGlmCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKKyAgICBhdXRvIHNpbmtNZXRhZGF0YSA9IEF1ZGlvU291cmNlKHNvdXJjZSk7CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCisgICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcworICAgIFNpbmtNZXRhZGF0YSBzaW5rTWV0YWRhdGEgPSB7e3sgLnNvdXJjZSA9IEF1ZGlvU291cmNlKHNvdXJjZSksIC5nYWluID0gMSB9fX07CisjZW5kaWYKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorICAgICh2b2lkKW91dHB1dERldmljZTsKKyAgICAodm9pZClvdXRwdXREZXZpY2VBZGRyZXNzOworI2Vsc2UKKyAgICBpZiAob3V0cHV0RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIERldmljZUFkZHJlc3MgaGlkbE91dHB1dERldmljZTsKKyAgICAgICAgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwob3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaGlkbE91dHB1dERldmljZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIHNpbmtNZXRhZGF0YS50cmFja3NbMF0uZGVzdGluYXRpb24uZGV2aWNlKHN0ZDo6bW92ZShoaWRsT3V0cHV0RGV2aWNlKSk7CisgICAgfQorI2VuZGlmCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvSW5wdXRGbGFnPihmbGFncyksCisgICAgICAgICAgICBzaW5rTWV0YWRhdGEsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAorICAgICAgICAgICAgaGlkbFBvcnQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy9jb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q0NjVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOworICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qb3V0cHV0RGV2aWNlKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKi8qb3V0cHV0RGV2aWNlQWRkcmVzcyovLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKKyAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgeworICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGI3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDFlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgc3A8SURldmljZXNGYWN0b3J5PiBkZWZhdWx0RmFjdG9yeXtJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKX07CisgICAgaWYgKCFkZWZhdWx0RmFjdG9yeSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3RvcnkvZGVmYXVsdCBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhkZWZhdWx0RmFjdG9yeSk7CisgICAgaWYgKE1BSk9SX1ZFUlNJT04gPj0gNCkgeworICAgICAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwgYW5kIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIGF0IEhBTCA0LjAKKyAgICAgICAgc3A8SURldmljZXNGYWN0b3J5PiBtc2RGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCl9OworICAgICAgICBpZiAobXNkRmFjdG9yeSkgeworICAgICAgICAgICAgbURldmljZUZhY3Rvcmllcy5wdXNoX2JhY2sobXNkRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogbURldmljZUZhY3RvcmllcykgeworICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCisgICAgICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBmYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfQorfQorCisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXRpYyBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOworICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgcmV0dXJuIHt9OworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0aWMgY29uc3QgY2hhciogaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtRGV2aWNlRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdXRvIGhpZGxJZCA9IGlkRnJvbUhhbChuYW1lLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAorICAgICAgICAgICAgICAgIGhpZGxJZCwKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIHN3aXRjaCAocmV0dmFsKSB7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGFuZCB3YXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGJ1dCBmYWlsZWQgdG8gaW5pdGFsaXplLgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29udGludWUgaXRlcmF0aW5nLgorICAgICAgICAgICAgZGVmYXVsdDogOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCJUaGUgc3BlY2lmaWVkIGRldmljZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkOiBcIiVzXCIiLCBuYW1lKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDY0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZXNGYWN0b3J5LmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIHN0ZDo6dmVjdG9yPHNwPElEZXZpY2VzRmFjdG9yeT4+IG1EZXZpY2VGYWN0b3JpZXM7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM3YThiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKKyAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAorICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgorICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMwZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKworICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OworICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Cit9OworCitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3N0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7CisgICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworCitvdXQ6CisgICAgKmRldiA9IE5VTEw7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7CisgICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKKyAgICBpZiAocmMgPT0gT0spIHsKKyAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTA4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2Nzk3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXRvbWljPgorCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OworICAgIHJldHVybiBjb3VudGVyKys7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCisgICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOworICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7CisgICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7CisgICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgaWYgKGFzaG1lbSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKKyAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7CisgICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK2F1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKKyAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKK30KKwordm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKK30KKworYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7CisgICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKKyAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgeworICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgeworICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7CisgICAgbU1lbW9yeS0+Y29tbWl0KCk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNjgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjU3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCisgICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7CisgICAgaWYgKG1FZmZlY3QgIT0gMCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgeworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOworICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOworICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7CisgICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOworfQorCisvLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgorLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKKyAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWctPmNoYW5uZWxzID0gRW51bUJpdGZpZWxkPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IEVudW1CaXRmaWVsZDxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7CisgICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOworICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgeworICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOworICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7CisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7CisgICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgeworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKKyAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworCisgICAgLy8gU3BlY2lhbCBjYXNlcy4KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZS4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKKyAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgeworICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKKyAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAorICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOworICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKKyAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgorICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOworICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjM4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3QuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7CisKKyAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcworICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7CisKKyAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKworICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQorCisgICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKKyAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOworICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgorICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKKyAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOworICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7CisgICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ2YmRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE3OGZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdHNGYWN0b3J5LmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpDUFBfVkVSU0lPTjo6Q29udmVyc2lvbkhlbHBlckhpZGw7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworCisgICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OworICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7CisKKyAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Cit9OworCitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4ZGRkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgLyogJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpICovKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RkOjp2ZWN0b3I8UGFyYW1ldGVyVmFsdWU+IHBhcmFtZXRlcnM7CisgICAgU3RyaW5nOCBoYWxQYXJhbWV0ZXJzOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQsIHN0ZDo6dG9fc3RyaW5nKHByZXNlbnRhdGlvbklkKX0pOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkLCBzdGQ6OnRvX3N0cmluZyhwcm9ncmFtSWQpfSk7CisgICAgcGFyYW1ldGVyc1RvSGFsKGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPihwYXJhbWV0ZXJzKSwgJmhhbFBhcmFtZXRlcnMpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKGhhbFBhcmFtZXRlcnMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNlbGVjdFByZXNlbnRhdGlvbiIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCkpOworfQorI2VuZGlmCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSkgeworICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQorICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCisgICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7CisgICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKKyAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOworICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgorICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOworICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKKyAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7CisgICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAorICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOworICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisvKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+CitzdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiAvKiBzaW5rTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNpbmsgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvLyBjb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QKKyAgICAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiIsCisgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oc3RhdGljX2Nhc3Q8TWljcm9waG9uZURpcmVjdGlvbj4oZGlyZWN0aW9uKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uIiwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODc4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Cit1c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbDsKKworY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOworICAgIElTdHJlYW0gKm1TdHJlYW07CisgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSBvdmVycmlkZTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIG92ZXJyaWRlOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE4ZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAvKiAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgKi8pIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisjaWYgTUFKT1JfVkVSU0lPTiA8IDUKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24obVN0cmVhbSwgZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKG1TdHJlYW0sIHpvb20pOworCit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmMmJkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsOworCitjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7CisKKyAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKworICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCisgICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKKworICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKKworICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKKworICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisKKyAgICAvLyBTZXRzIG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBhNDJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworbmFtZXNwYWNlIHV0aWxzIHsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzE5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorCisvKiogQGZpbGUgTGlicmFyeSBlbnRyeSBwb2ludHMgdG8gY3JlYXRlIHRoZSBIQUwgZmFjdG9yaWVzLiAqLworCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBWMl8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjJfMAorCituYW1lc3BhY2UgVjRfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY0XzAKKworbmFtZXNwYWNlIFY1XzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNV8wCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKKworbmFtZXNwYWNlIFYyXzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmluZGV4IDdkZThlYjMuLmU1NjUyMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApAQCAtODQsNiArODQsOCBAQAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCiAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKICAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pID0gMDsKIAogICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaAppbmRleCA5MjYyMmFhLi4wMzE2NWJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKQEAgLTU1LDYgKzU1LDggQEAKICAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KICAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgRWZmZWN0SGFsSW50ZXJmYWNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IGM5NjllMjguLjZjM2IyMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSA9IDA7CiAKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7CisKICAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgPSAwOwogCkBAIC0xNzYsNiArMTc5LDEyIEBACiAgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKIAorICAgIC8vIFNldCBkaXJlY3Rpb24gZm9yIGNhcHR1cmUgcHJvY2Vzc2luZworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90KSA9IDA7CisKKyAgICAvLyBTZXQgem9vbSBmYWN0b3IgZm9yIGNhcHR1cmUgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOworCiAgICAgc3RydWN0IFNpbmtNZXRhZGF0YSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHJlY29yZF90cmFja19tZXRhZGF0YV90PiB0cmFja3M7CiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ODA2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX2RlZmF1bHRzIiwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJzb25pYyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorCisgICAgICAgIC8vIHVuY29tbWVudCB0byBkaXNhYmxlIE5FT04gb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGFjdHVhbGx5IGRvIHN1cHBvcnQgTkVPTiwgZm9yIGJlbmNobWFya2luZworICAgICAgICAvLyAiLURVU0VfTkVPTj1mYWxzZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmciLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQnVmZmVyUHJvdmlkZXJzLmNwcCIsCisgICAgICAgICJSZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwIiwKKyAgICBdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19hcm0iXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfYXJtIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3Byb2Nlc3NpbmdfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvTWl4ZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvUmVzYW1wbGVyLmNwcCIsCisgICAgICAgICJBdWRpb1Jlc2FtcGxlckN1YmljLmNwcCIsCisgICAgICAgICJBdWRpb1Jlc2FtcGxlclNpbmMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUmVzYW1wbGVyRHluLmNwcCIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5tayBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFlY2MyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBBdWRpb01peGVyLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyRHluLmNwcC5hcm0gXAotICAgIEJ1ZmZlclByb3ZpZGVycy5jcHAgXAotICAgIFJlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKFRPUCkgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJuYmFpbyBcCi0gICAgbGlibmJsb2cgXAotICAgIGxpYnNvbmljIFwKLSAgICBsaWJ1dGlscyBcCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3Byb2Nlc3NpbmcKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKLQotIyB1bmNvbW1lbnQgdG8gZGlzYWJsZSBORU9OIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBhY3R1YWxseSBkbyBzdXBwb3J0IE5FT04sIGZvciBiZW5jaG1hcmtpbmcKLSNMT0NBTF9DRkxBR1MgKz0gLURVU0VfTkVPTj1mYWxzZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAppbmRleCBmNmY4MTdhLi5mN2NjMDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCkBAIC0xMTMsMTAgKzExMywxMCBAQAogICAgICAgICAvLyBJbnRlZ2VyIHZvbHVtZS4KICAgICAgICAgLy8gQ3VycmVudGx5IGludGVnZXIgdm9sdW1lIGlzIGtlcHQgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KICAgICAgICAgLy8gV2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlciBwYXRoIGlzIHJlbW92ZWQuCi0gICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVDsKLSAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7CisgICAgICAgIHQtPnZvbHVtZVswXSA9IDA7CisgICAgICAgIHQtPnZvbHVtZVsxXSA9IDA7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSAwIDw8IDE2OworICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gMCA8PCAxNjsKICAgICAgICAgdC0+dm9sdW1lSW5jWzBdID0gMDsKICAgICAgICAgdC0+dm9sdW1lSW5jWzFdID0gMDsKICAgICAgICAgdC0+YXV4TGV2ZWwgPSAwOwpAQCAtMTI0LDEwICsxMjQsMTAgQEAKICAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKIAogICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCi0gICAgICAgIHQtPm1Wb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tVm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1Wb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1Wb2x1bWVbMV0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzBdID0gMC5mOworICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IDAuZjsKICAgICAgICAgdC0+bVZvbHVtZUluY1swXSA9IDAuOwogICAgICAgICB0LT5tVm9sdW1lSW5jWzFdID0gMC47CiAgICAgICAgIHQtPm1BdXhMZXZlbCA9IDAuOwpAQCAtMTM2LDYgKzEzNiw5IEBACiAKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCiAgICAgICAgIC8vIHQtPmZyYW1lQ291bnQKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgICAgIHQtPm1IYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bUhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICAgICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKICAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgdC0+ZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKQEAgLTE2Miw2ICsxNjUsMTYgQEAKICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICAvLyBoYXB0aWMKKyAgICAgICAgdC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOworICAgICAgICB0LT5tSGFwdGljSW50ZW5zaXR5ID0gSEFQVElDX1NDQUxFX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0LT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0LT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKICAgICAgICAgLy8gQ2hlY2sgdGhlIGRvd25taXhpbmcgKG9yIHVwbWl4aW5nKSByZXF1aXJlbWVudHMuCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHQtPnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTE3MSw2ICsxODQsOCBAQAogICAgICAgICAvLyBwcmVwYXJlRm9yRG93bm1peCgpIG1heSBjaGFuZ2UgbURvd25taXhSZXF1aXJlc0Zvcm1hdAogICAgICAgICBBTE9HVlYoIm1NaXhlckZvcm1hdDolI3ggIG1NaXhlckluRm9ybWF0OiUjeFxuIiwgdC0+bU1peGVyRm9ybWF0LCB0LT5tTWl4ZXJJbkZvcm1hdCk7CiAgICAgICAgIHQtPnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOwogCiAgICAgICAgIG1UcmFja3NbbmFtZV0gPSB0OwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xODUsMTMgKzIwMCwyMCBAQAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay0+Y2hhbm5lbE1hc2sKLSAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSB7CisgICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5jaGFubmVsTWFzayB8IHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09ICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICB0cmFja0NoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbWl4ZXJDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhoYXB0aWNDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgbWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVySGFwdGljQ2hhbm5lbE1hc2spOwogCiAgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKICAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CkBAIC0yMDAsNiArMjIyLDI0IEBACiAgICAgdHJhY2stPmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OwogICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2s7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxDb3VudCA9IG1peGVyQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBoYXB0aWNDaGFubmVsTWFzazsKKyAgICB0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudCA9IGhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBtaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSBtaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKworICAgIGlmICh0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50ICsgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gZmFsc2U7CisgICAgfQogCiAgICAgLy8gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQsIGRvZXMgdGhpcyB0cmFjayBuZWVkIGEgZG93bm1peGVyPwogICAgIC8vIHVwZGF0ZSB0byB0cnkgdXNpbmcgb3VyIGRlc2lyZWQgZm9ybWF0IChpZiB3ZSBhcmVuJ3QgYWxyZWFkeSB1c2luZyBpdCkKQEAgLTIxMiw2ICsyNTIsOSBAQAogICAgIC8vIGRvIGl0IGFmdGVyIGRvd25taXggc2luY2UgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCiAgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogCisgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisKICAgICBpZiAodHJhY2stPm1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyByZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay0+c2FtcGxlUmF0ZTsKQEAgLTI2MCwxNCArMzAzLDE5IEBACiAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spCiAgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTgogICAgICAgICAgICAgJiYgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSgpKSB7Ci0gICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIG1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSktPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4Ci0gICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBmbG9hdCBvciBpbnQxNiBkb3dubWl4ZXIsIGluIHRoYXQgb3JkZXIuCisgICAgICAgIGZvciAoY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0IDogeyBBVURJT19GT1JNQVRfUENNX0ZMT0FULCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB9KSB7CisgICAgICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgbU1peGVyQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxEb3dubWl4ZXJCdWZmZXJQcm92aWRlciAqPihtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgcmVzZXQgYmVsb3cuCiAgICAgfQpAQCAtMzM1LDkgKzM4Myw4MiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyIpOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsIG91dENoYW5uZWxDb3VudDogJXUiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgIGlmIChtQWRqdXN0SW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlIik7CisgICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsICIKKyAgICAgICAgICAib3V0Q2hhbm5lbENvdW50OiAldSwga2VlcENvbnRyYWN0ZWRDaGFubmVsczogJWQiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzKTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CisgICAgaWYgKG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCkgeworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtS2VlcENvbnRyYWN0ZWRDaGFubmVscworICAgICAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1haW5CdWZmZXIgKyBmcmFtZXMgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQsIG1NaXhlckZvcm1hdCkKKyAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzID8gbU1peGVyRm9ybWF0IDogQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKQoreworICAgIGlmIChtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBzdGF0aWNfY2FzdDxBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKj4oCisgICAgICAgICAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+Y2xlYXJDb250cmFjdGVkRnJhbWVzKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCiB7CisgICAgLy8gY29uZmlndXJlIGZyb20gdXBzdHJlYW0gdG8gZG93bnN0cmVhbSBidWZmZXIgcHJvdmlkZXJzLgogICAgIGJ1ZmZlclByb3ZpZGVyID0gbUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CisgICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CiAgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKTsKQEAgLTUzMiw3ICs2NTMsOCBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIHRyYWNrQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KQEAgLTU0MSw2ICs2NjMsOSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC01NzAsMTYgKzY5NSwzNSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19FTkFCTEVEOiB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19JTlRFTlNJVFk6IHsKKyAgICAgICAgICAgIGNvbnN0IGhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkgPSBzdGF0aWNfY2FzdDxoYXB0aWNfaW50ZW5zaXR5X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY0ludGVuc2l0eSAhPSBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQpAQCAtODEzLDE0ICs5NTcsMTkgQEAKICAgICBpZiAodHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID09IGJ1ZmZlclByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgcmVzZXQgYW55IGJ1ZmZlciBwcm92aWRlcnMgaWYgaWRlbnRpY2FsLgogICAgIH0KLSAgICBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgLy8gcmVzZXQgb3JkZXIgZnJvbSBkb3duc3RyZWFtIHRvIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCisgICAgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgdHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0KIAogICAgIHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwpAQCAtODc1LDcgKzEwMjQsNyBAQAogICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFjazo6Z2V0VHJhY2tIb29rKFRSQUNLVFlQRV9SRVNBTVBMRSwgdC0+bU1peGVyQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4ICsgcmVzYW1wbGUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4ICsgcmVzYW1wbGUiLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPT0gTkVFRFNfQ0hBTk5FTF8xKXsKICAgICAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soCkBAIC04OTAsNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFjazo6Z2V0VHJhY2tIb29rKFRSQUNLVFlQRV9OT1JFU0FNUExFLCB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXgiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIG5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI2NCw4ICsxNDEzLDggQEAKIAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tncm91cFswXV07CiAgICAgICAgIG1lbXNldCh0LT5tYWluQnVmZmVyLCAwLAotICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpKTsKIAogICAgICAgICAvLyBub3cgY29uc3VtZSBkYXRhCiAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgewpAQCAtMTcwNCw2ICsxODUzLDQwIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NIYXB0aWNEYXRhKCkKK3sKKyAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdGlvbkVmZmVjdC5zY2FsZShpbnQsIGZsb2F0LCBpbnQpCisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUdyb3VwcykgeworICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IG1haW4gYnVmZmVyLgorICAgICAgICBjb25zdCBhdXRvICZncm91cCA9IHBhaXIuc2Vjb25kOworICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgaWYgKHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBmbG9hdCBnYW1tYSA9IHQtPmdldEhhcHRpY1NjYWxlR2FtbWEoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhBbXBsaXR1ZGVSYXRpbyA9IHQtPmdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCk7CisgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBhaXIuZmlyc3QgKyBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHQtPm1NaXhlckZvcm1hdCkgeworICAgICAgICAgICAgICAgIC8vIE1peGVyIGZvcm1hdCBzaG91bGQgYmUgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZvdXQgPSAoZmxvYXQqKSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXVsID0gZm91dFtpXSA+PSAwID8gMS4wIDogLTEuMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdXRbaV0gPSBwb3dmKGZhYnNmKGZvdXRbaV0gLyBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCksIGdhbW1hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heEFtcGxpdHVkZVJhdGlvICogSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgKiBtdWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtTWl4ZXJGb3JtYXQ6ICUjeCIsIHQtPm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBkbyByZXNhbXBsaW5nIHRoZW4gbWl4aW5nLAogICogcHVsbGluZyBmcm9tIHRoZSB0cmFjaydzIHVwc3RyZWFtIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKaW5kZXggZWVlZWNjZS4uZWM1NmIwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCkBAIC0yMDEsNiArMjAxLDggQEAKICAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLnN0b3BiYW5kIiwgbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbik7CiAgICAgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCA9IHByb3BlcnR5X2dldF9pbnQzMigKICAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmN1dG9mZl9wZXJjZW50IiwgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCk7CisgICAgbVByb3BlcnR5VHJhbnNpdGlvbkJhbmR3aWR0aENoZWF0ID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QudGJ3Y2hlYXQiLCBtUHJvcGVydHlUcmFuc2l0aW9uQmFuZHdpZHRoQ2hlYXQpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgpAQCAtMjQzLDcgKzI0NSw3IEBACiB7CiAgICAgLy8gY29tcHV0ZSB0aGUgbm9ybWFsaXplZCB0cmFuc2l0aW9uIGJhbmR3aWR0aAogICAgIGNvbnN0IGRvdWJsZSB0YncgPSBmaXJLYWlzZXJUYncoYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuKTsKLSAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3IC8gMi47CisgICAgY29uc3QgZG91YmxlIGhhbGZidyA9IHRidyAqIDAuNTsKIAogICAgIGRvdWJsZSBmY3I7IC8vIGNvbXB1dGUgZmNyLCB0aGUgMyBkQiBhbXBsaXR1ZGUgY3V0LW9mZi4KICAgICBpZiAoaW5TYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZSkgeyAvLyB1cHNhbXBsZQpAQCAtMjkwLDcgKzI5Miw3IEBACiAKICNpZiAwCiAgICAgLy8gS2VlcCB0aGlzIGRlYnVnIGNvZGUgaW4gY2FzZSBhbiBhcHAgY2F1c2VzIHJlc2FtcGxlciBkZXNpZ24gaXNzdWVzLgotICAgIGNvbnN0IGRvdWJsZSBoYWxmYncgPSB0YncgLyAyLjsKKyAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3ICogMC41OwogICAgIC8vIHByaW50IGJhc2ljIGZpbHRlciBzdGF0cwogICAgIEFMT0dEKCJMOiVkICBobmM6JWQgIHN0b3BCYW5kQXR0ZW46JWxmICBmY3I6JWxmICBhdHRlbjolbGYgIHRidzolbGZcbiIsCiAgICAgICAgICAgICBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW51YXRpb24sIHRidyk7CkBAIC0zMDUsNyArMzA3LDcgQEAKIAogICAgIGNvbnN0IGludDMyX3QgcGFzc1N0ZXBzID0gMTAwMDsKIAotICAgIHRlc3RGaXIoY29lZnMsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCBwYXNzU3RlcHMsIHBhc3NTdGVwcyAqIGMuTUwgLypzdG9wU3RlcHMqLywKKyAgICB0ZXN0RmlyKGNvZWZzLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIGZwLCBmcywgcGFzc1N0ZXBzLCBwYXNzU3RlcHMgKiBjLm1MIC8qc3RvcFN0ZXBzKi8sCiAgICAgICAgICAgICBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlLCBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKICAgICBBTE9HRCgicGFzc2JhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjhsZiAlLjhsZlxuIiwgMC4sIGZwLCBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlKTsKICAgICBBTE9HRCgic3RvcGJhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjNsZlxuIiwgZnMsIDAuNSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CkBAIC0zNzksMTIgKzM4MSwyOCBAQAogICAgICAgICAgICAgaGFsZkxlbmd0aCA9IG1Qcm9wZXJ0eUhhbGZGaWx0ZXJMZW5ndGg7CiAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbjsKICAgICAgICAgICAgIHVzZVMzMiA9IHRydWU7Ci0gICAgICAgICAgICBmY3IgPSBtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlCi0gICAgICAgICAgICAgICAgICAgID8gMC41IDogMC41ICogbVNhbXBsZVJhdGUgLyBtSW5TYW1wbGVSYXRlOwotICAgICAgICAgICAgZmNyICo9IG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgLyAxMDAuOworCisgICAgICAgICAgICAvLyBVc2UgZWl0aGVyIHRoZSBzdG9wYmFuZCBsb2NhdGlvbiBmb3IgZGVzaWduICh0YndDaGVhdCkKKyAgICAgICAgICAgIC8vIG9yIHVzZSB0aGUgM2RCIGN1dG9mZiBsb2NhdGlvbiBmb3IgZGVzaWduIChmY3IpLgorICAgICAgICAgICAgLy8gVGhpcyBjaG9pY2UgaXMgZXhjbHVzaXZlIGFuZCBiYXNlZCBvbiB3aGV0aGVyIGZjciA+IDAuCisgICAgICAgICAgICBpZiAobVByb3BlcnR5VHJhbnNpdGlvbkJhbmR3aWR0aENoZWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IG1Qcm9wZXJ0eVRyYW5zaXRpb25CYW5kd2lkdGhDaGVhdCAvIDEwMC47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZjciA9IG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gMC41IDogMC41ICogbVNhbXBsZVJhdGUgLyBtSW5TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgIGZjciAqPSBtUHJvcGVydHlDdXRvZmZQZXJjZW50IC8gMTAwLjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFZvaWNlIHF1YWxpdHkgZGV2aWNlcyBoYXZlIGxvd2VyIHNhbXBsaW5nIHJhdGVzCisgICAgICAgICAgICAvLyAoYW5kIG1heSBiZSBhIGNvbnNlcXVlbmNlIG9mIGRvd25zdHJlYW0gQU1SLVdCIC8gRy43MjIgY29kZWNzKS4KKyAgICAgICAgICAgIC8vIEZvciB0aGVzZSBkZXZpY2VzLCB3ZSBlbnN1cmUgYSB3aWRlciByZXNhbXBsZXIgcGFzc2JhbmQKKyAgICAgICAgICAgIC8vIGF0IHRoZSBleHBlbnNlIG9mIGFsaWFzaW5nIG5vaXNlIChzdG9wYmFuZCBhdHRlbnVhdGlvbgorICAgICAgICAgICAgLy8gYW5kIHN0b3BiYW5kIGZyZXF1ZW5jeSkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtWb2ljZURldmljZVNhbXBsZVJhdGUgPSAxNjAwMDsKKwogICAgICAgICAgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKLSAgICAgICAgICAgICAgICAvLyAzMmIgY29lZmZpY2llbnRzLCA2NCBsZW5ndGgKKyAgICAgICAgICAgICAgICAvLyBmbG9hdCBvciAzMmIgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgdXNlUzMyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gOTguOwogICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CkBAIC0zOTQsOCArNDEyLDE4IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA8PSBrVm9pY2VEZXZpY2VTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoICs9IDE2OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4NC47CisgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9MT1dfUVVBTElUWSkgewotICAgICAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDE2LTMyIGxlbmd0aAorICAgICAgICAgICAgICAgIC8vIGZsb2F0IG9yIDE2YiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODAuOwogICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CkBAIC00MDUsMTMgKzQzMywxOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA4OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TYW1wbGVSYXRlIDw9IGtWb2ljZURldmljZVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBEWU5fTUVEX1FVQUxJVFkKLSAgICAgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAzMi02NCBsZW5ndGgKKyAgICAgICAgICAgICAgICAvLyBmbG9hdCBvciAxNmIgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgLy8gbm90ZTogPiA2NCBsZW5ndGggZmlsdGVycyB3aXRoIDE2YiBjb2VmcyBjYW4gaGF2ZSBxdWFudGl6YXRpb24gbm9pc2UgcHJvYmxlbXMKICAgICAgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOwpAQCAtNDIyLDcgKzQ1NSwxNSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworCisgICAgICAgICAgICAgICAgaWYgKG1TYW1wbGVSYXRlIDw9IGtWb2ljZURldmljZVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDE7CkBAIC00MzAsNiArNDcxLDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoZmNyID4gMC4pIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbUZpbHRlclF1YWxpdHk6JWQgaW5TYW1wbGVSYXRlOiVkIG1TYW1wbGVSYXRlOiVkIGhhbGZMZW5ndGg6JWQgIgorICAgICAgICAgICAgICAgICAgICAic3RvcEJhbmRBdHRlbjolbGYgZmNyOiVsZiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtRmlsdGVyUXVhbGl0eSwgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFsZkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiwgZmNyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogbUZpbHRlclF1YWxpdHk6JWQgaW5TYW1wbGVSYXRlOiVkIG1TYW1wbGVSYXRlOiVkIGhhbGZMZW5ndGg6JWQgIgorICAgICAgICAgICAgICAgICAgICAic3RvcEJhbmRBdHRlbjolbGYgdGJ3Q2hlYXQ6JWxmIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1GaWx0ZXJRdWFsaXR5LCBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYWxmTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuLCB0YndDaGVhdCk7CisgICAgICAgIH0KKworCiAgICAgICAgIC8vIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHBvbHlwaGFzZXMgaW4gdGhlIGZpbHRlcmJhbmsuCiAgICAgICAgIC8vIGZvciAxNmIsIGl0IGlzIGRlc2lyYWJsZSB0byBoYXZlIDJeKDE2LzIpID0gMjU2IHBoYXNlcy4KICAgICAgICAgLy8gaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9yZXNhbXBsZS9SZWxhdGlvbl9JbnRlcnBvbGF0aW9uX0Vycm9yX1F1YW50aXphdGlvbi5odG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCmluZGV4IDkyMTQ0ZDAuLjgyYjk1MDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC01NSw2ICs1NSwxMSBAQAogICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKKyAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeworICAgICAgICBBdWRpb1Jlc2FtcGxlcjo6cmVzZXQoKTsKKyAgICAgICAgbUluQnVmZmVyLnJlc2V0KCk7CisgICAgfQorCiAgICAgLy8gTWFrZSBhdmFpbGFibGUga2V5IGRlc2lnbiBjcml0ZXJpYSBmb3IgdGVzdGluZwogICAgIGludCBnZXRIYWxmTGVuZ3RoKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5tSGFsZk51bUNvZWZzOwpAQCAtMTg4LDYgKzE5MywxMyBAQAogICAgICAgICAgICAgICBpbnQzMl90IG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgPSAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QuY3V0b2ZmX3BlcmNlbnQiCiAKKyAgICAgICAgICAgICAgLy8gU3BlY2lmeSB0aGUgdHJhbnNpdGlvbiBiYW5kd2lkdGggZXh0ZW5zaW9uIGJleW9uZCBOeXF1aXN0LgorICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vbnplcm8gdGhlbiBtUHJvcGVydHlDdXRvZmZQZXJjZW50IGlzIGlnbm9yZWQuCisgICAgICAgICAgICAgIC8vIEEgdmFsdWUgb2YgMTAwIG9yIGdyZWF0ZXIgaXMgdHlwaWNhbGx5IHVzZWQsIHdoZXJlIDEwMCBtZWFucyB0aGUKKyAgICAgICAgICAgICAgLy8gc3RvcGJhbmQgaXMgYXQgTnlxdWlzdCAodGhpcyBpcyBhIHR5cGljYWwgZGVzaWduKS4KKyAgICAgICAgICAgICAgaW50MzJfdCBtUHJvcGVydHlUcmFuc2l0aW9uQmFuZHdpZHRoQ2hlYXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLnRid2NoZWF0IgorCiAgICAgLy8gRmlsdGVyIGNyZWF0aW9uIGRlc2lnbiBwYXJhbWV0ZXJzLCBzZWUgc2V0U2FtcGxlUmF0ZSgpCiAgICAgICAgICAgICAgZG91YmxlIG1TdG9wYmFuZEF0dGVudWF0aW9uRGIgPSAwLjsKICAgICAgICAgICAgICBkb3VibGUgbVBhc3NiYW5kUmlwcGxlRGIgPSAwLjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKaW5kZXggMzljYWZlYi4uMTAwYmFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKQEAgLTU0Nyw4ICs1NDcsOCBAQAogICAgICAgICB3c3RhcnQgKz0gd3N0ZXA7CiAgICAgfQogICAgIC8vIHJlbm9ybWFsaXplIC0gdGhpcyBpcyBuZWVkZWQgZm9yIGludGVnZXIgZmlsdGVyIHR5cGVzLCB1c2UgMSBmb3IgZmxvYXQgb3IgZG91YmxlLgotICAgIGNvbnN0ZXhwciBpbnQ2NF90IGludGVncmFsU2hpZnQgPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IChzaXplb2YoVCkgKiA4IC0gMSkgOiAwOwotICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyAoTCA8PCBpbnRlZ3JhbFNoaWZ0KTsKKyAgICBjb25zdGV4cHIgaW50IGludGVncmFsU2hpZnQgPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IChzaXplb2YoVCkgKiBDSEFSX0JJVCAtIDEpIDogMDsKKyAgICBjb25zdCBkb3VibGUgbm9ybSA9IDEuIC8gKGludDY0X3R7TH0gPDwgaW50ZWdyYWxTaGlmdCk7CiAKICAgICBmaXJNaW4gPSBmbWluICogbm9ybTsKICAgICBmaXJNYXggPSBmbWF4ICogbm9ybTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCBhNzQxNjc3Li45YjcwYTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOwogICAgIH0KICAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKLSAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgKm91dCsrICs9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6dm9sdW1lKG91dCwgZ2Fpbik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDMyMGI4Y2YuLjVhMDNhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAppbmRleCAyZDllMWNiLi4yMWQyNWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcApAQCAtMTcsOSArMTcsMTIgQEAKICNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUHJvdmlkZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8ZXh0ZXJuYWwvc29uaWMvc29uaWMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPHNvbmljLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KQEAgLTM1LDEzICszOCw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KIENvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKICAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKICAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKQEAgLTYzLDcgKzU5LDggQEAKIAogQ29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKIHsKLSAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigiJXMoJXApICV6dSAlcCAlcCIsCisgICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBtQnVmZmVyLmZyYW1lQ291bnQsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtTG9jYWxCdWZmZXJEYXRhKTsKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgIH0KQEAgLTk4LDggKzk1LDggQEAKICAgICAgICAgbUNvbnN1bWVkID0gMDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKLSAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKLSAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IHN0ZDo6bWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOwogICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLApAQCAtMTMzLDYgKzEzMCwxNiBAQAogICAgIG1Db25zdW1lZCA9IDA7CiB9CiAKK3ZvaWQgQ29weUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7CisgICAgQUxPR1YoIiVzKCVwKTogbVRyYWNrQnVmZmVyUHJvdmlkZXI6JXAgIG1CdWZmZXIuZnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHAsIG1UcmFja0J1ZmZlclByb3ZpZGVyLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIGlmIChtVHJhY2tCdWZmZXJQcm92aWRlciA9PSBwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyOjpzZXRCdWZmZXJQcm92aWRlcihwKTsKK30KKwogRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNDc5LDcgKzQ4Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyB0aW1lLXN0cmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgZHN0QXZhaWxhYmxlID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKKyAgICAgICAgZHN0QXZhaWxhYmxlID0gc3RkOjptaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOwogICAgICAgICBzaXplX3Qgc3JjQXZhaWxhYmxlID0gbUJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICBwcm9jZXNzRnJhbWVzKCh1aW50OF90KiltTG9jYWxCdWZmZXJEYXRhICsgbVJlbWFpbmluZyAqIG1GcmFtZVNpemUsICZkc3RBdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5yYXcsICZzcmNBdmFpbGFibGUpOwpAQCAtNTI4LDYgKzUzNSwxNiBAQAogICAgIG1SZW1haW5pbmcgPSAwOwogfQogCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBzdGF0dXNfdCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtNTY3LDcgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xpY2FsbHkgcmVwZWF0IHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSAwOyBjb3VudCA8ICpkc3RGcmFtZXM7IGNvdW50ICs9ICpzcmNGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IG1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc3RkOjptaW4oKnNyY0ZyYW1lcywgKmRzdEZyYW1lcyAtIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90Kilkc3RCdWZmZXIgKyBtRnJhbWVTaXplICogY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLCBtRnJhbWVTaXplICogcmVtYWluaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02MDksNSArNjI2LDcyIEBACiAgICAgICAgIH0KICAgICB9CiB9CisKK0FkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LCBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwgdm9pZCogY29udHJhY3RlZEJ1ZmZlcikgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKGluQ2hhbm5lbENvdW50LCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtSW5DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAorICAgICAgICBtT3V0Q2hhbm5lbENvdW50KG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlcyhhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAorICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQgLSBvdXRDaGFubmVsQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZEZvcm1hdChjb250cmFjdGVkRm9ybWF0KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRCdWZmZXIoY29udHJhY3RlZEJ1ZmZlciksCisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcygwKQoreworICAgIEFMT0dWKCJBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKCVwKSglI3gsICV6dSwgJXp1LCAlenUsICUjeCwgJXApIiwgdGhpcywgZm9ybWF0LAorICAgICAgICAgICAgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgY29udHJhY3RlZEZvcm1hdCwgY29udHJhY3RlZEJ1ZmZlcik7CisgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNvbnRyYWN0ZWRDaGFubmVsQ291bnQsIG1Db250cmFjdGVkRm9ybWF0KTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBwQnVmZmVyKQoreworICAgIGlmIChtQ29udHJhY3RlZEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFJlc3RyaWN0IGZyYW1lIGNvdW50IG9ubHkgd2hlbiBpdCBpcyBuZWVkZWQgdG8gc2F2ZSBjb250cmFjdGVkIGZyYW1lcy4KKyAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lc0xlZnQgPSBtRnJhbWVDb3VudCAtIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICAgICAgaWYgKG91dEZyYW1lc0xlZnQgPCBwQnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyBSZXN0cmljdCB0aGUgZnJhbWUgY291bnQgc28gdGhhdCB3ZSBkb24ndCB3cml0ZSBvdmVyIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IG91dEZyYW1lc0xlZnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyKTsKK30KKwordm9pZCBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIGlmIChtSW5DaGFubmVsQ291bnQgPiBtT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIC8vIEZvciBjYXNlIG11bHRpIHRvIG1vbm8sIGFkanVzdF9jaGFubmVscyBoYXMgc3BlY2lhbCBsb2dpYyB0aGF0IHdpbGwgbWl4IGZpcnN0IHR3byBpbnB1dAorICAgICAgICAvLyBjaGFubmVscyBpbnRvIGEgc2luZ2xlIG91dHB1dCBjaGFubmVsLiBJbiB0aGF0IGNhc2UsIHVzZSBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlCisgICAgICAgIC8vIHRvIGtlZXAgb25seSBvbmUgY2hhbm5lbCBkYXRhIGV2ZW4gd2hlbiBjb250cmFjdGluZyB0byBtb25vLgorICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOworICAgICAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQKKyAgICAgICAgICAgICYmIG1Db250cmFjdGVkQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjb250cmFjdGVkSWR4ID0gZnJhbWVzICogbU91dENoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikgbUNvbnRyYWN0ZWRCdWZmZXIgKyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKiBtQ29udHJhY3RlZEZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQsICh1aW50OF90KikgZHN0ICsgY29udHJhY3RlZElkeCwgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQgKiBmcmFtZXMpOworICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICs9IGZyYW1lczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFByZWZlciBleHBhbmRpbmcgZGF0YSBmcm9tIHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKHNyYywgbUluQ2hhbm5lbENvdW50LCBkc3QsIG1PdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzLCBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOworICAgIH0KK30KKwordm9pZCBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpyZXNldCgpCit7CisgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzID0gMDsKKyAgICBDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCk7Cit9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvUmVjb3JkQnVmZmVyQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwCmluZGV4IDU0MTUxZjUuLjdkNmZlNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwCkBAIC0xMTcsNiArMTE3LDExIEBACiAgICAgICAgIC8vIGZvcm1hdCBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgogICAgICAgICBjb252ZXJ0UmVzYW1wbGVyKGRzdCwgbUJ1ZiwgZnJhbWVzKTsKICAgICB9CisgICAgLy8gUmVsZWFzZSB1bnVzZWQgZnJhbWVzIGluIHRoZSBJbnB1dENvbnZlcnRlclByb3ZpZGVyIGJ1ZmZlciBzbyB0aGF0CisgICAgLy8gdGhlIFJlY29yZFRocmVhZCBpcyBhYmxlIHRvIHByb3Blcmx5IGFjY291bnQgZm9yIGNvbnN1bWVkIGZyYW1lcy4KKyAgICBpZiAobUlucHV0Q29udmVydGVyUHJvdmlkZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9CiAgICAgcmV0dXJuIGZyYW1lczsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzAzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpby1yZXNhbXBsZXIiLAorCisgICAgc3JjczogWyJBdWRpb1Jlc2FtcGxlckNvZWZmaWNpZW50cy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjgwN2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBBdWRpb1Jlc2FtcGxlckNvZWZmaWNpZW50cy5jcHAKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvLXJlc2FtcGxlcgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJ1dGlscyBsaWJsb2cKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMDU1ZjcyNC4uNTBjYTMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnByMikgewogICAgIHJldHVybiBmYWJzKHByMS5tU3BlZWQgLSBwcjIubVNwZWVkKSA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTl9ERUxUQSAmJgogICAgICAgICAgICBmYWJzKHByMS5tUGl0Y2ggLSBwcjIubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSAmJgotICAgICAgICAgICBwcjIubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKLSAgICAgICAgICAgcHIyLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CisgICAgICAgICAgIHByMS5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgorICAgICAgICAgICBwcjEubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZChjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTAxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgbGliYXVkaW9wcm9jZXNzaW5nCisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliYmFzZV9oZWFkZXJzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidmlicmF0b3IiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKKy8vCisvLyByZXNhbXBsZXIgdW5pdCB0ZXN0CisvLworY2NfdGVzdCB7CisgICAgbmFtZTogInJlc2FtcGxlcl90ZXN0cyIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsicmVzYW1wbGVyX3Rlc3RzLmNwcCJdLAorfQorCisvLworLy8gYXVkaW8gbWl4ZXIgdGVzdCB0b29sCisvLworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAidGVzdC1taXhlciIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsidGVzdC1taXhlci5jcHAiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJzbmRmaWxlIl0sCit9CisKKy8vCisvLyBidWlsZCBhdWRpbyByZXNhbXBsZXIgdGVzdCB0b29sCisvLworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAidGVzdC1yZXNhbXBsZXIiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ190ZXN0X2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbInRlc3QtcmVzYW1wbGVyLmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnNuZGZpbGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTFjM2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBsaWJhdWRpb3Byb2Nlc3NpbmcKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIHJlc2FtcGxlciB1bml0IHRlc3QKLSMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3V0aWxzIFwKLSAgICBsaWJhdWRpb3Byb2Nlc3NpbmcgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIHJlc2FtcGxlcl90ZXN0cy5jcHAKLQotTE9DQUxfTU9EVUxFIDo9IHJlc2FtcGxlcl90ZXN0cwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLSMKLSMgYXVkaW8gbWl4ZXIgdGVzdCB0b29sCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICB0ZXN0LW1peGVyLmNwcCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzbmRmaWxlIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wcm9jZXNzaW5nIFwKLSAgICBsaWJhdWRpb3V0aWxzIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotCi1MT0NBTF9NT0RVTEUgOj0gdGVzdC1taXhlcgotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotIwotIyBidWlsZCBhdWRpbyByZXNhbXBsZXIgdGVzdCB0b29sCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICB0ZXN0LXJlc2FtcGxlci5jcHAgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic25kZmlsZSBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcHJvY2Vzc2luZyBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLQotTE9DQUxfTU9EVUxFIDo9IHRlc3QtcmVzYW1wbGVyCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAppbmRleCBlMTYyM2Y3Li44MjkyMjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApAQCAtMjQ2LDcgKzI0Niw4IEBACiB9CiAKIHZvaWQgdGVzdEZpbHRlclJlc3BvbnNlKAotICAgICAgICBzaXplX3QgY2hhbm5lbHMsIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSkKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCB1bnNpZ25lZCBpbnB1dEZyZXEsIHVuc2lnbmVkIG91dHB1dEZyZXEsCisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5ID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFkpCiB7CiAgICAgLy8gY3JlYXRlIHJlc2FtcGxlcgogICAgIHVzaW5nIFJlc2FtcGxlclR5cGUgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlckR5bjxmbG9hdCwgZmxvYXQsIGZsb2F0PjsKQEAgLTI1Niw3ICsyNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KSkpOwogICAgIHJkeW4tPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKIAogICAgIC8vIGdldCBkZXNpZ24gcGFyYW1ldGVycwpAQCAtMjY4LDE3ICsyNjksMjAgQEAKICAgICBjb25zdCBkb3VibGUgYXR0ZW51YXRpb24gPSByZHluLT5nZXRGaWx0ZXJBdHRlbnVhdGlvbigpOwogICAgIGNvbnN0IGRvdWJsZSBzdG9wYmFuZERiID0gcmR5bi0+Z2V0U3RvcGJhbmRBdHRlbnVhdGlvbkRiKCk7CiAgICAgY29uc3QgZG91YmxlIHBhc3NiYW5kRGIgPSByZHluLT5nZXRQYXNzYmFuZFJpcHBsZURiKCk7Ci0gICAgY29uc3QgZG91YmxlIGZwID0gZmNyIC0gdGJ3IC8gMjsKLSAgICBjb25zdCBkb3VibGUgZnMgPSBmY3IgKyB0YncgLyAyOworICAgIGNvbnN0IGRvdWJsZSBmcCA9IGZjciAtIHRidyAqIDAuNTsKKyAgICBjb25zdCBkb3VibGUgZnMgPSBmY3IgKyB0YncgKiAwLjU7CisgICAgY29uc3QgZG91YmxlIGlkZWFsZnMgPSBpbnB1dEZyZXEgPD0gb3V0cHV0RnJlcQorICAgICAgICA/IDAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cHNhbXBsZQorICAgICAgICA6IDAuNSAqIG91dHB1dEZyZXEgIC8gaW5wdXRGcmVxOyAvLyBkb3duc2FtcGxlCiAKLSAgICBwcmludGYoImlucHV0RnJlcTolZCBvdXRwdXRGcmVxOiVkIGRlc2lnbiIKKyAgICBwcmludGYoImlucHV0RnJlcTolZCBvdXRwdXRGcmVxOiVkIGRlc2lnbiBxdWFsaXR5ICVkIgogICAgICAgICAgICAgIiBwaGFzZXM6JWQgaGFsZkxlbmd0aDolZCIKLSAgICAgICAgICAgICIgZmNyOiVsZiBmcDolbGYgZnM6JWxmIHRidzolbGYiCisgICAgICAgICAgICAiIGZjcjolbGYgZnA6JWxmIGZzOiVsZiB0Ync6JWxmIGZjcnA6JWxmIgogICAgICAgICAgICAgIiBhdHRlbnVhdGlvbjolbGYgc3RvcFJpcHBsZTolLmxmIHBhc3NSaXBwbGU6JWxmIgogICAgICAgICAgICAgIlxuIiwKLSAgICAgICAgICAgIGlucHV0RnJlcSwgb3V0cHV0RnJlcSwKKyAgICAgICAgICAgIGlucHV0RnJlcSwgb3V0cHV0RnJlcSwgcXVhbGl0eSwKICAgICAgICAgICAgIHBoYXNlcywgaGFsZkxlbmd0aCwKLSAgICAgICAgICAgIGZjciwgZnAsIGZzLCB0YncsCisgICAgICAgICAgICBmY3IsIGZwLCBmcywgdGJ3LCBmY3IgKiAxMDAuIC8gaWRlYWxmcywKICAgICAgICAgICAgIGF0dGVudWF0aW9uLCBzdG9wYmFuZERiLCBwYXNzYmFuZERiKTsKIAogICAgIC8vIHZlcmlmeSBkZXNpZ24gcGFyYW1ldGVycwpAQCAtNTQxLDggKzU0NSwzNiBAQAogICAgIH0KIH0KIAotVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBmaWx0ZXJyZXNwb25zZSkgewotICAgIHN0ZDo6dmVjdG9yPGludD4gaW5TYW1wbGVSYXRlc3sKKy8vIFNlbGVjdGVkIGRvd25zYW1wbGluZyByZXNwb25zZXMgZm9yIHZhcmlvdXMgZnJlcXVlbmNpZXMgcmVsYXRpbmcgdG8gaGVhcmluZyBhaWQuCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGRvd25zYW1wbGluZ3Jlc3BvbnNlKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0aWVzW10gPSB7CisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgaW5TYW1wbGVSYXRlc1tdID0geworICAgICAgICAzMjAwMCwKKyAgICAgICAgNDQxMDAsCisgICAgICAgIDQ4MDAwLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgb3V0U2FtcGxlUmF0ZXNbXSA9IHsKKyAgICAgICAgMTYwMDAsCisgICAgICAgIDI0MDAwLAorICAgIH07CisKKyAgICBmb3IgKGF1dG8gcXVhbGl0eSA6IHF1YWxpdGllcykgeworICAgICAgICBmb3IgKGludCBvdXRTYW1wbGVSYXRlIDogb3V0U2FtcGxlUmF0ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGluU2FtcGxlUmF0ZSA6IGluU2FtcGxlUmF0ZXMpIHsKKyAgICAgICAgICAgICAgICB0ZXN0RmlsdGVyUmVzcG9uc2UoMiAvKiBjaGFubmVscyAqLywgaW5TYW1wbGVSYXRlLCBvdXRTYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gR2VuZXJhbCByZXNwb25zZXMgZm9yIHR5cGljYWwgb3V0cHV0IGRldmljZSBzY2VuYXJpb3MgLSA0NC4xLCA0OCwgOTYga0h6CisvLyAoNDgsIDk2IGFyZSBwYXJ0IG9mIHRoZSBzYW1lIHJlc2FtcGxlciBnZW5lcmF0aW9uIGZhbWlseSkuCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGdlbmVyYWxyZXNwb25zZSkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGluU2FtcGxlUmF0ZXNbXSA9IHsKICAgICAgICAgODAwMCwKICAgICAgICAgMTEwMjUsCiAgICAgICAgIDEyMDAwLApAQCAtNTU3LDcgKzU4OSw4IEBACiAgICAgICAgIDE3NjQwMCwKICAgICAgICAgMTkyMDAwLAogICAgIH07Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiBvdXRTYW1wbGVSYXRlc3sKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBvdXRTYW1wbGVSYXRlc1tdID0geworICAgICAgICA0NDEwMCwKICAgICAgICAgNDgwMDAsCiAgICAgICAgIDk2MDAwLAogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1yZXNhbXBsZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtcmVzYW1wbGVyLmNwcAppbmRleCBmYmM5MzI2Li5mMTc4YmRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1yZXNhbXBsZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LXJlc2FtcGxlci5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyLmg+CkBAIC04NywxNCArODgsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgJywnOgogICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CiAgICAgICAgICAgICAgICAgaGFkRGlnaXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBudW1WYWx1ZXMrKzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0X3V0aWxzLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdF91dGlscy5oCmluZGV4IGI2MWE5MjkuLjIxZjU4NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0X3V0aWxzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3RfdXRpbHMuaApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KIAogI2lmbmRlZiBBUlJBWV9TSVpFCkBAIC03NywxNCArNzgsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgJywnOgogICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CiAgICAgICAgICAgICAgICAgaGFkRGlnaXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBudW1WYWx1ZXMrKzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkM2YxNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyJmYWN0b3J5IiwgImNvbmZpZyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggMzUxYjFlZS4uZjM5ZWIwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMTE1LDYgKzExNSw3IEBACiAgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCiAgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFLCAidm9pY2VfcGVyZm9ybWFuY2UifSwKIH07CiAKIC8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCkBAIC0zMDUsNyArMzA2LDcgQEAKICAgICAgICAgcmV0dXJuIHBhcnNlV2l0aFBhdGgocGF0aCk7CiAgICAgfQogCi0gICAgZm9yIChzdGQ6OnN0cmluZyBsb2NhdGlvbiA6IERFRkFVTFRfTE9DQVRJT05TKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgbG9jYXRpb24gOiBERUZBVUxUX0xPQ0FUSU9OUykgewogICAgICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0UGF0aCA9IGxvY2F0aW9uICsgJy8nICsgREVGQVVMVF9OQU1FOwogICAgICAgICBpZiAoYWNjZXNzKGRlZmF1bHRQYXRoLmNfc3RyKCksIFJfT0spICE9IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzgyYjFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorLy8gTXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGxpYnJhcnkKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZG93bm1peCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJFZmZlY3REb3dubWl4LmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbImxpYmF1ZGlvdXRpbHMiIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZiZjE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgTXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlFZmZlY3REb3dubWl4LmMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIGxpYmxvZwotCi1MT0NBTF9NT0RVTEU6PSBsaWJkb3dubWl4Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCi0KLSMtREJVSUxEX0ZMT0FUCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZmM1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEJ1aWxkIHRlc3RiZW5jaCBmb3IgZG93bm1peCBtb2R1bGUuCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4dGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRvd25taXh0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZhZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL2Jhc2gKKyMKKyNSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorI2Vuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2Rvd25taXh0ZXN0IgorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBEb3dubWl4IgorYWRiIHNoZWxsIG1rZGlyICR0ZXN0ZGlyCisKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IFwKKyR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgorCisjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCitmb3IgZnMgaW4gJHtmc19hcnJbKl19CitkbworICAgIGZvciBmX2NoIGluIHsxLi44fQorICAgIGRvCisgICAgICAgIGZvciBjaF9mbXQgaW4gezAuLjR9CisgICAgICAgIGRvCisgICAgICAgICAgICBhZGIgc2hlbGwgIExEX0xJQlJBUllfUEFUSD0vdmVuZG9yL2xpYjY0L3NvdW5kZnggXAorICAgICAgICAgICAgJHRlc3RkaXIvZG93bm1peHRlc3QgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgLWNoX2ZtdDokY2hfZm10IC1mY2g6JGZfY2ggLWZzOiRmcworCisgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCB0ZXN0OgorICAgICAgICAgICAgIyBjaGVjayB0aGF0IGhpZ2hlciBmcmVxdWVuY2llcyBtYXRjaCA4IGtIeiByZXN1bHQuCisgICAgICAgICAgICBpZiBbICRmcyAhPSA4MDAwIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wIFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfODAwMC5yYXcgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmODNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKKyNkZWZpbmUgRlJBTUVfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDgKKworc3RydWN0IGRvd25taXhfY250eHRfcyB7CisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKKyAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKworICBpbnQgbnVtRmlsZUNoYW5uZWxzOworICBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzOworfTsKKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiIpOworICBwcmludGYoIlxuICAgICBkb3dubWl4dGVzdCA8aW5wdXRfZmlsZT4gPG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIik7CisgIHByaW50ZigiXG4gICAgIDxpbnB1dF9maWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dF9maWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgICAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaF9mbXQ6PGZvcm1hdF9vZl9pbnB1dF9hdWRpbz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDA6QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMShkZWZhdWx0KSIpOworICBwcmludGYoIlxuICAgICAgICAgMTpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDI6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgIHByaW50ZigiXG4gICAgICAgICAzOkFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgNDpBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpIik7CisgIHByaW50ZigiXG4iKTsKK30KKworaW50MzJfdCBEb3dubWl4RGVmYXVsdENvbmZpZyhlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpIHsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKworICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgIHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgaW50MzJfdCBlcnIgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CisKKyAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gY29uZmlndXJlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gZW5hYmxlIGVmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4RXhlY3V0ZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKworICBjb25zdCBpbnQgbnVtRmlsZUNoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bUZpbGVDaGFubmVsczsKKyAgY29uc3QgaW50IG51bVByb2Nlc3NDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1Qcm9jZXNzQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmaWxlRnJhbWVTaXplID0gbnVtRmlsZUNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG91dHB1dENoYW5uZWxzID0KKyAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRGbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGluRmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXIsIG91dGJ1ZmZlcjsKKyAgaW5idWZmZXIuZjMyID0gaW5GbG9hdC5kYXRhKCk7CisgIG91dGJ1ZmZlci5mMzIgPSBvdXRGbG9hdC5kYXRhKCk7CisgIGluYnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisgIG91dGJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworCisgIGF1ZGlvX2J1ZmZlcl90ICpwaW5idWYsICpwb3V0YnVmOworICBwaW5idWYgPSAmaW5idWZmZXI7CisgIHBvdXRidWYgPSAmb3V0YnVmZmVyOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW5TMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXRTMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgd2hpbGUgKGZyZWFkKGluUzE2LmRhdGEoKSwgZmlsZUZyYW1lU2l6ZSwgRlJBTUVfTEVOR1RILCBmaW5wKSA9PQorICAgICAgICAgRlJBTUVfTEVOR1RIKSB7CisgICAgaWYgKG51bUZpbGVDaGFubmVscyAhPSBudW1Qcm9jZXNzQ2hhbm5lbHMpIHsKKyAgICAgIGFkanVzdF9jaGFubmVscyhpblMxNi5kYXRhKCksIG51bUZpbGVDaGFubmVscywgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG51bVByb2Nlc3NDaGFubmVscywgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBmaWxlRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoaW5GbG9hdC5kYXRhKCksIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogbnVtUHJvY2Vzc0NoYW5uZWxzKTsKKworICAgIGNvbnN0IGludDMyX3QgZXJyID0gKERvd25taXhfYXBpLT5wcm9jZXNzKSgqZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0UzE2LmRhdGEoKSwgb3V0RmxvYXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyk7CisgICAgZndyaXRlKG91dFMxNi5kYXRhKCksIHNpemVvZihzaG9ydCksIChGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyksCisgICAgICAgICAgIGZvdXQpOworICAgIGZyYW1lQ291bnRlcisrOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dtaXhNYWluUHJvY2Vzcyhkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGludDMyX3Qgc2Vzc2lvbklkID0gMCwgaW9JZCA9IDA7CisgIGNvbnN0IGVmZmVjdF91dWlkX3QgZG93bm1peF91dWlkID0geworICAgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAmZG93bm1peF91dWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICBlZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peExpYl9DcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFBhc3NpbmcgdGhlIGluaXQgY29uZmlnIGZvciB0aW1lIGJlaW5nLgorICBlcnIgPSBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUocERlc2NyaXB0b3IpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peENvbmZpZ3VyZUFuZEVuYWJsZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIGV4ZWN1dGUgY2FsbCBmb3IgZG93bm1peC4KKyAgZXJyID0gRG93bm1peEV4ZWN1dGUocERlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peEV4ZWN1dGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWxlYXNlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdCgqZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhSZWxlYXNlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG51bUZpbGVDaGFubmVscyA9IDEsIG51bVByb2Nlc3NDaGFubmVscyA9IDg7CisgIGRvd25taXhfY250eHRfcyBkZXNjcmlwdG9yID0ge307CisgIERvd25taXhEZWZhdWx0Q29uZmlnKCYoZGVzY3JpcHRvci5jb25maWcpKTsKKworICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgeworICAgICAgaWYgKGluZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgaWYgKG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRmaWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgLy8gQWRkIGEgY2hlY2sgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbXMuCisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoX2ZtdDoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGZvcm1hdCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgdWludDMyX3QgKmF1ZGlvVHlwZSA9ICZkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bVByb2Nlc3NDaGFubmVscyA9CisgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKCphdWRpb1R5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bUZpbGVDaGFubmVscyA9IGZDaGFubmVsczsKKworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1oIiwgMikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICgvKmluZmlsZSA9PSBudWxscHRyIHx8ICovIG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY29uc3QgaW50IGVyciA9IERvd21peE1haW5Qcm9jZXNzKCZkZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgLy8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIHByaW50ZigiRXJyb3I6ICVkXG4iLCBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZjNDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gRHluYW1pY3NQcm9jZXNzaW5nIGxpYnJhcnkKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZHlucHJvYyIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwIiwKKyAgICAgICAgImRzcC9EUEJhc2UuY3BwIiwKKyAgICAgICAgImRzcC9EUEZyZXF1ZW5jeS5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1PMiIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmVpZ2VuIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTBjNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIER5bmFtaWNzUHJvY2Vzc2luZyBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi0KLUVJR0VOX1BBVEggOj0gZXh0ZXJuYWwvZWlnZW4KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChFSUdFTl9QQVRIKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcCBcCi0gICAgZHNwL0RQQmFzZS5jcHAgXAotICAgIGRzcC9EUEZyZXF1ZW5jeS5jcHAKLQotTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nIFwKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFOj0gbGliZHlucHJvYwotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb2VmZmVjdHMKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0VmZmVjdER5bmFtaWNzUHJvY2Vzc2luZy5jcHAKaW5kZXggMGI4ODNmMS4uYzAzYzZlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9FZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bmV3PgogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogCiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZHluYW1pY3Nwcm9jZXNzaW5nLmg+CiAjaW5jbHVkZSA8ZHNwL0RQQmFzZS5oPgpAQCAtMjI1LDEwICsyMjYsNiBAQAogICAgIH0gLy9zd2l0Y2gKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzUG93ZXJPZjIodW5zaWduZWQgbG9uZyBuKSB7Ci0gICAgcmV0dXJuIChuICYgKG4gLSAxKSkgPT0gMDsKLX0KLQogdm9pZCBEUF9jb25maWd1cmVWYXJpYW50KER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBpbnQgbmV3VmFyaWFudCkgewogICAgIEFMT0dWKCJEUF9jb25maWd1cmVWYXJpYW50ICVkIiwgbmV3VmFyaWFudCk7CiAgICAgc3dpdGNoKG5ld1ZhcmlhbnQpIHsKQEAgLTI0Miw3ICsyMzksNyBAQAogICAgICAgICAgICAgICAgIGRlc2lyZWRCbG9jayk7CiAgICAgICAgIGlmIChkZXNpcmVkQmxvY2sgPCBtaW5CbG9ja1NpemUpIHsKICAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IG1pbkJsb2NrU2l6ZTsKLSAgICAgICAgfSBlbHNlIGlmICghaXNQb3dlck9mMihkZXNpcmVkQmxvY2spKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXBvd2Vyb2YyKGRlc2lyZWRCbG9jaykpIHsKICAgICAgICAgICAgIC8vZmluZCBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMi4KICAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IDEgPDwgKDMyIC0gX19idWlsdGluX2NseihkZXNpcmVkQmxvY2spKTsKICAgICAgICAgfQpAQCAtMTI5Nyw0ICsxMjk0LDMgQEAKIH07CiAKIH07IC8vIGV4dGVybiAiQyIKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5jcHAKaW5kZXggZDA2ZmQ3MC4uYWU1YzAyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgIkRQRnJlcXVlbmN5LmgiCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogCiBuYW1lc3BhY2UgZHBfZnggewogCkBAIC0zMCwxMCArMzEsNiBAQAogI2RlZmluZSBDSVJDVUxBUl9CVUZGRVJfVVBTQU1QTEUgNCAgLy80IHRpbWVzIGJ1ZmZlciBzaXplCiAKIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgTUlOX0VOVkVMT1BFID0gMWUtNmY7IC8vLTEyMCBkQgotLy9oZWxwZXIgZnVuY3Rpb25TCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNQb3dlck9mMih1bnNpZ25lZCBsb25nIG4pIHsKLSAgICByZXR1cm4gKG4gJiAobiAtIDEpKSA9PSAwOwotfQogc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBFUFNJTE9OID0gMC4wMDAwMDAxZjsKIAogc3RhdGljIGlubGluZSBib29sIGlzWmVybyhmbG9hdCBmKSB7CkBAIC02NSwxMSArNjIsNiBAQAogICAgIGNCSW5wdXQucmVzaXplKG1CbG9ja1NpemUgKiBDSVJDVUxBUl9CVUZGRVJfVVBTQU1QTEUpOwogICAgIGNCT3V0cHV0LnJlc2l6ZShtQmxvY2tTaXplICogQ0lSQ1VMQVJfQlVGRkVSX1VQU0FNUExFKTsKIAotICAgIC8vZmlsbCBpbnB1dCB3aXRoIGhhbGYgYmxvY2sgc2l6ZS4uLgotICAgIGZvciAodW5zaWduZWQgaW50IGsgPSAwOyBrIDwgbUJsb2NrU2l6ZS8yOyBrKyspIHsKLSAgICAgICAgY0JJbnB1dC53cml0ZSgwKTsKLSAgICB9Ci0KICAgICAvL3RlbXAgdmVjdG9ycwogICAgIGlucHV0LnJlc2l6ZShtQmxvY2tTaXplKTsKICAgICBvdXRwdXQucmVzaXplKG1CbG9ja1NpemUpOwpAQCAtMTUxLDcgKzE0Myw3IEBACiAgICAgfSBlbHNlIGlmIChtQmxvY2tTaXplIDwgTUlOX0JMT0NLU0laRSkgewogICAgICAgICBtQmxvY2tTaXplID0gTUlOX0JMT0NLU0laRTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWlzUG93ZXJPZjIoYmxvY2tTaXplKSkgeworICAgICAgICBpZiAoIXBvd2Vyb2YyKGJsb2NrU2l6ZSkpIHsKICAgICAgICAgICAgIC8vZmluZCBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMi4KICAgICAgICAgICAgIG1CbG9ja1NpemUgPSAxIDw8ICgzMiAtIF9fYnVpbHRpbl9jbHooYmxvY2tTaXplKSk7CiAgICAgICAgIH0KQEAgLTE3Myw2ICsxNjUsMTEgQEAKIAogICAgIGZpbGxfd2luZG93KG1WV2luZG93LCBSRFNQX1dJTkRPV19IQU5OSU5HX0ZMQVRfVE9QLCBtQmxvY2tTaXplLCBtT3ZlcmxhcFNpemUpOwogCisgICAgLy9zcGxpdCB3aW5kb3cgaW50byBhbmFseXNpcyBhbmQgc3ludGhlc2lzLiBCb3RoIGFyZSB0aGUgc3FydCgpIG9mIG9yaWdpbmFsCisgICAgLy93aW5kb3cKKyAgICBFaWdlbjo6TWFwPEVpZ2VuOjpWZWN0b3JYZj4gZVdpbmRvdygmbVZXaW5kb3dbMF0sIG1WV2luZG93LnNpemUoKSk7CisgICAgZVdpbmRvdyA9IGVXaW5kb3cuYXJyYXkoKS5zcXJ0KCk7CisKICAgICAvL2NvbXB1dGUgd2luZG93IHJtcyBmb3IgZW5lcmd5IGNvbXBlbnNhdGlvbgogICAgIG1XaW5kb3dSbXMgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVZXaW5kb3cuc2l6ZSgpOyBpKyspIHsKQEAgLTY2OSw2ICs2NjYsMTEgQEAKICAgICAvLyMjaWZmdCBkaXJlY3RseSB0byBvdXRwdXQuCiAgICAgRWlnZW46Ok1hcDxFaWdlbjo6VmVjdG9yWGY+IGVPdXRwdXQoJmNiLm91dHB1dFswXSwgY2Iub3V0cHV0LnNpemUoKSk7CiAgICAgbUZmdFNlcnZlci5pbnYoZU91dHB1dCwgY2IuY29tcGxleFRlbXApOworCisgICAgLy9hcHBseSByZXN0IG9mIHdpbmRvdyBmb3IgcmVzeW50aGVzaXMKKyAgICBFaWdlbjo6TWFwPEVpZ2VuOjpWZWN0b3JYZj4gZVdpbmRvdygmbVZXaW5kb3dbMF0sIG1WV2luZG93LnNpemUoKSk7CisgICAgZU91dHB1dCA9IGVPdXRwdXQuY3dpc2VQcm9kdWN0KGVXaW5kb3cpOworCiAgICAgcmV0dXJuIG1CbG9ja1NpemU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTEzYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIExvdWRuZXNzRW5oYW5jZXIgbGlicmFyeQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJsZG5obmNyIiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJFZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcCIsCisgICAgICAgICJkc3AvY29yZS9keW5hbWljX3JhbmdlX2NvbXByZXNzaW9uLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLU8yIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvZWZmZWN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJjYmQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIExvdWRuZXNzRW5oYW5jZXIgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEVmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIFwKLSAgICBkc3AvY29yZS9keW5hbWljX3JhbmdlX2NvbXByZXNzaW9uLmNwcAotCi1MT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEU6PSBsaWJsZG5obmNyCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvZWZmZWN0cwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAppbmRleCA5ZDI5Y2YxLi5kNjFlZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKQEAgLTMwLDYgKzMwLDI2IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbG91ZG5lc3NlbmhhbmNlci5oPgogI2luY2x1ZGUgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uaCIKIAorLy8gQlVJTERfRkxPQVQgdGFyZ2V0cyBidWlsZGluZyBhIGZsb2F0IGVmZmVjdCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgaW50MTZfdCBlZmZlY3QuCisjZGVmaW5lIEJVSUxEX0ZMT0FUCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIGV4dGVybiAiQyIgewogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBMRSBlZmZlY3QKQEAgLTgwLDEzICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTEVfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE1OSw3ICsxNzIsNyBAQAogCiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTE2Nyw3ICsxODAsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTI4NCwxOCArMjk3LDQxIEBACiAKICAgICAvL0FMT0dWKCJMRSBhYm91dCB0byBwcm9jZXNzICVkIHNhbXBsZXMiLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgdWludDE2X3QgaW5JZHg7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OyAvLyBwb3dlciBvZiAyIGlzIGxvc3NsZXNzIGNvbnZlcnNpb24gdG8gaW50MTZfdCByYW5nZQorICAgIGNvbnN0ZXhwciBmbG9hdCBpbnZlcnNlU2NhbGUgPSAxLmYgLyBzY2FsZTsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZikgKiBzY2FsZTsKKyNlbHNlCiAgICAgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpOworI2VuZGlmCiAgICAgZmxvYXQgbGVmdFNhbXBsZSwgcmlnaHRTYW1wbGU7CiAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50IDsgaW5JZHgrKykgewogICAgICAgICAvLyBtYWtldXAgZ2FpbiBpcyBhcHBsaWVkIG9uIHRoZSBpbnB1dCBvZiB0aGUgY29tcHJlc3NvcgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdOworICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXTsKKyAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4XSAgICA9IGxlZnRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeCArMV0gPSByaWdodFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyNlbHNlCiAgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4XTsKICAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdOwogICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHhdICAgID0gKGludDE2X3QpIGxlZnRTYW1wbGU7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeCArMV0gPSAoaW50MTZfdCkgcmlnaHRTYW1wbGU7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTMwMyw2ICszMzksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IExPVURORVNTX0VOSEFOQ0VSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTBmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxNyBAQAorLy8gTXVzaWMgYnVuZGxlCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYm11c2ljYnVuZGxlIiwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYyIsCisgICAgICAgICJCYXNzL3NyYy9MVkRCRV9Db250cm9sLmMiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfSW5pdC5jIiwKKyAgICAgICAgIkJhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyIsCisgICAgICAgICJCYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYyIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMiLAorICAgICAgICAiQnVuZGxlL3NyYy9MVk1fSW5pdC5jIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9Db250cm9sLmMiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYyIsCisgICAgICAgICJFcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyIsCisgICAgICAgICJFcS9zcmMvTFZFUU5CX0luaXQuYyIsCisgICAgICAgICJFcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyIsCisgICAgICAgICJFcS9zcmMvTFZFUU5CX1RhYmxlcy5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvSW5zdEFsbG9jLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Db3B5XzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9UaW1lci5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYyIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiRXEvbGliIiwKKyAgICAgICAgIkVxL3NyYyIsCisgICAgICAgICJCYXNzL2xpYiIsCisgICAgICAgICJCYXNzL3NyYyIsCisgICAgICAgICJDb21tb24vc3JjIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL2xpYiIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJDb21tb24vbGliIiwKKyAgICAgICAgIkJ1bmRsZS9saWIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKKyAgICAgICAgIi1ESElHSEVSX0ZTIiwKKyAgICAgICAgIi1EU1VQUE9SVF9NQyIsCisKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKK30KKworLy8gUmV2ZXJiIGxpYnJhcnkKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlicmV2ZXJiIiwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuYyIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQWJzXzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9JbnN0QWxsb2MuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Db3B5XzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL01vbm9UbzJJXzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIlJldmVyYi9zcmMiLAorICAgICAgICAiQ29tbW9uL3NyYyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJSZXZlcmIvbGliIiwKKyAgICAgICAgIkNvbW1vbi9saWIiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFlYjNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIE11c2ljIGJ1bmRsZQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfQVJNX01PREUgOj0gYXJtCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIFwKLSAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIFwKLSAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIFwKLSAgICBCYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgXAotICAgIEJhc3Mvc3JjL0xWREJFX0luaXQuYyBcCi0gICAgQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIFwKLSAgICBCYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBcCi0gICAgQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMgXAotICAgIEJ1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBcCi0gICAgQnVuZGxlL3NyYy9MVk1fSW5pdC5jIFwKLSAgICBCdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgXAotICAgIEJ1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIFwKLSAgICBCdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgXAotICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyBcCi0gICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBcCi0gICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBcCi0gICAgRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIFwKLSAgICBFcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBcCi0gICAgRXEvc3JjL0xWRVFOQl9Jbml0LmMgXAotICAgIEVxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIFwKLSAgICBFcS9zcmMvTFZFUU5CX1RhYmxlcy5jIFwKLSAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKLSAgICBDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyBcCi0gICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgXAotICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuYyBcCi0gICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCi0gICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAotICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCi0gICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKLSAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKLSAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKLSAgICBDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMgXAotICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKLSAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKLSAgICBDb21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBcCi0gICAgQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIFwKLSAgICBDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgXAotICAgIENvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIFwKLSAgICBDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jIFwKLSAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAotICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgXAotICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMgXAotICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgXAotICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jCi0KLUxPQ0FMX01PRFVMRTo9IGxpYm11c2ljYnVuZGxlCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoTE9DQUxfUEFUSCkvRXEvbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL0VxL3NyYyBcCi0gICAgJChMT0NBTF9QQVRIKS9CYXNzL2xpYiBcCi0gICAgJChMT0NBTF9QQVRIKS9CYXNzL3NyYyBcCi0gICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMgXAotICAgICQoTE9DQUxfUEFUSCkvQnVuZGxlL2xpYiBcCi0gICAgJChMT0NBTF9QQVRIKS9CdW5kbGUvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCi0gICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi0KLQotIyBSZXZlcmIgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBcCi0gICAgUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMgXAotICAgIFJldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBcCi0gICAgUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBcCi0gICAgUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIFwKLSAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKLSAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKLSAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKLSAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKLSAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKLSAgICBDb21tb24vc3JjL011bHQzc18zMngxNi5jIFwKLSAgICBDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgXAotICAgIENvbW1vbi9zcmMvQ29weV8xNi5jIFwKLSAgICBDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIFwKLSAgICBDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYyBcCi0gICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKLSAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAotICAgIENvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBcCi0gICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9GT19IUEYuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgXAotICAgIENvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIFwKLSAgICBDb21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAotICAgIENvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgXAotICAgIENvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgXAotICAgIENvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAotICAgIENvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnJldmVyYgotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKExPQ0FMX1BBVEgpL1JldmVyYi9saWIgXAotICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiL3NyYyBcCi0gICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCA0YzJiOTU0Li5jYzA2NmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMTk5LDggKzE5OSwxMCBAQAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0jZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgNDA5NgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bQpAQCAtMjE1LDggKzIxNywxMCBAQAogICAgIExWREJFX0ZTXzQ0MTAwID0gNywKICAgICBMVkRCRV9GU180ODAwMCA9IDgsCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgTFZEQkVfRlNfOTYwMDAgPSA5LAotICAgIExWREJFX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzg4MjAwID0gOSwKKyAgICBMVkRCRV9GU185NjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzE3NjQwMCA9IDExLAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwpAQCAtMjU2LDYgKzI2MCw5IEBACiAgICAgTFZEQkVfVm9sdW1lX2VuICAgICAgICAgVm9sdW1lQ29udHJvbDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWb2x1bWVkQjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBIZWFkcm9vbWRCOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZEQkVfUGFyYW1zX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAppbmRleCA0ZWNhZjE0Li44ZjA1OGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC01ODAsMTIgKzU4MCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTYzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ0ODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MzY2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTcyMzNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzIzN2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDU4OGYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgpAQCAtNjQyLDEyICs2NTQsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODc4NzFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKQEAgLTcwMywxMiArNzI3LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5MzU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE4MmYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTk4NGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzMyMjRmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjA3NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDgzZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczNTM5ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCkBAIC03NjQsMTIgKzgwMCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNDk3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4MTY4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTA5NDRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MDk4NWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODg5MmYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkxNjgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI2MjlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTQ3MmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1NDgyZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyOTkyZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCkBAIC04MzEsMTIgKzg3OSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA4MzFmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDgzMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODMyMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTgzMzhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzYyZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDYxZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwNDE2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA0MTZmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkxNjRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MTY5ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCkBAIC04OTIsMTIgKzk1MiwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQpAQCAtOTUzLDEyICsxMDI1LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMTY5M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE2OTNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2NTgyZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTY2MTVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NTU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njg2MGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA4NDdmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODI5OGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODMwNmYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc3OGYpCkBAIC0xMDE0LDEyICsxMDk4LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA4M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMDgzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NzkxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTgzNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTkxM2YpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MTM0ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDQyZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNDJmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc5MDRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3OTE1ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKQEAgLTEwNDUsNyArMTE0MSw5IEBACiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTYyOGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfQVRUQUNLX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDU4ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NzEyZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTk5ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODMwZgogI2VuZGlmCiAKQEAgLTEwNjIsNyArMTE2MCw5IEBACiAjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfREVDQVlfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTg4ZgogI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCiAjZW5kaWYKIApAQCAtMTEyNSw3ICsxMjI1LDkgQEAKICNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ1MjVmCiAjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MTU4ZgogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBWT0xfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjI2M2YKICNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTMxZgogI2RlZmluZSBWT0xfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTAzOWYKICNlbmRpZgogI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCkBAIC0xMTM4LDkgKzEyNDAsMTMgQEAKICNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwogI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4OTcwNCAqLworI2RlZmluZSBNSVhfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQzMAogI2RlZmluZSBNSVhfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNTMwICovCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDgzOCAqLworI2RlZmluZSBNSVhfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjU5OAogI2RlZmluZSBNSVhfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjYxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCiAjZW5kaWYKIAogI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwppbmRleCBmZDQwMTZiLi4wYmEyYzg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cwogICAgICAqLwogICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOwogI2VuZGlmCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggM2ZmZjJhMi4uMjk0NjczNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC05NSw3ICs5NSw3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7CiAjZWxzZQotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsgICAKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7CiAjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA0ZTUyMDdmLi40MjI1YTMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTY0LDcgKzY0LDEyIEBACiAjZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwogI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCisjZWxzZQogI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogCiAjZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KICNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggMTBlYTcwMC4uYzRkMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yMSwxMSArMjEsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0CiAjaW5jbHVkZSAiTFZEQkUuaCIKICNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIkFHQy5oIgogI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4Nyw0MiArMTg5LDQ5IEBACiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCiAgICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAogICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQorICAgIGNvbnN0IExWTV9VSU5UMTYgTnJGcmFtZXMpIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KIHsKLQogICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCi0gIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKLSAgTFZNX0ZMT0FUICpwTW9ubzsKLSAgTFZNX0lOVDMyIGlpID0gMDsKIAotICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7Ci0vLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKKyAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCi0gIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOworICAvKiBTcGFjZSB0byBzdG9yZSBEQkUgcGF0aCBjb21wdXRhdGlvbiAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9CisgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CiAKICAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YKKyAgICogTnJTYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoLgogICAgKi8KLSAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgIExWTV9GTE9BVCAqIGNvbnN0IHBNb25vID0gcFNjcmF0Y2ggKyBOclNhbXBsZXM7CisKKyAgLyoKKyAgICogVFJJQ0tZOiBwTW9ubyBpcyB1c2VkIGFuZCBkaXNjYXJkZWQgYnkgdGhlIERCRSBwYXRoLgorICAgKiAgICAgICAgIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgdXNlIGZvciB0aGUgcFNjcmF0Y2hWb2wKKyAgICogICAgICAgICBwYXRoIHdoaWNoIGlzIGNvbXB1dGVkIGFmdGVyd2FyZHMuCisgICAqCisgICAqIFNwYWNlIHRvIHN0b3JlIFZvbHVtZSBDb250cm9sIHBhdGggY29tcHV0YXRpb24uCisgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHBNb25vIChzZWUgVFJJQ0tZIGNvbW1lbnQpLgorICAgKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2hWb2wgPSBwTW9ubzsKKworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCiAgIHsKLSAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICAgIHJldHVybiBMVkRCRV9UT09NQU5ZU0FNUExFUzsKICAgfQogCiAgIC8qCi0gICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gRmxvYXQKLSAgICovCi0gIENvcHlfRmxvYXQocEluRGF0YSwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICBwU2NyYXRjaF9pbiwgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLQotICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgewotICAgIHBTY3JhdGNoW2lpXSA9IHBTY3JhdGNoX2luW2lpXTsKLSAgfQotICAvKgogICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKICAgICovCiAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCkBAIC0yMzAsNTAgKzIzOSw4MSBAQAogICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKICAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCiAgIHsKKyAgICAvLyBtYWtlIGNvcHkgb2YgaW5wdXQgZGF0YQorICAgIENvcHlfRmxvYXQocEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICB9CiAKICAgICAvKgogICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KICAgICAgKi8KLSAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KICAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICovCisgICAgICAgIE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICAgICAqLworICAgICAgICBOckNoYW5uZWxzKTsgLyogTnVtYmVyIG9mIGNoYW5uZWxzICAgICAqLworI2Vsc2UKICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KICAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICBOckZyYW1lcyk7CisjZW5kaWYKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgewogICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KLSAgICAgIGlmKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgIGlmIChwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CiAgICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7Ci0gICAgICB9IGVsc2UgaWYocFNjcmF0Y2hbaWldID4gMS4wKSB7CisgICAgICB9IGVsc2UgaWYgKHBTY3JhdGNoW2lpXSA+IDEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CiAgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIERCRSBwcm9jZXNzZWQgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwogICB9CiAKICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjg2LDIxICszMjYsNDAgQEAKICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgogICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCiAgICAgICovCi0gICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcFNjcmF0Y2hfaW4sCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qCiAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAogICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIHBTY3JhdGNoLAorICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAogICAgICAgcFNjcmF0Y2gsCiAgICAgICBwU2NyYXRjaFZvbCwKICAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLQotICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisjZW5kaWYKKyAgcmV0dXJuIExWREJFX1NVQ0NFU1M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwppbmRleCBjNGE5YjE0Li5hMmNlNDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC04OCwxMSArODgsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKQEAgLTE0NywxMSArMTU3LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCkBAIC0yMDcsMTEgKzIyNywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLApAQCAtMjY5LDExICsyOTksMjEgQEAKIAogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7SFBGX0ZzODgyMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKQEAgLTMyMCw5ICszNjAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLAorICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKQEAgLTM1Nyw5ICs0MDMsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCkBAIC0zOTQsOSArNDQ2LDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LApAQCAtNDMyLDkgKzQ5MCwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0JQRl9Gczg4MjAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CkBAIC00NjYsNyArNTMwLDkgQEAKICAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCiAgICAgQUdDX0FUVEFDS19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAogICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE3NjQwMAogICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCiAjZW5kaWYKIApAQCAtNDg4LDcgKzU1NCw5IEBACiAgICAgQUdDX0RFQ0FZX0ZzNDQxMDAsCiAgICAgQUdDX0RFQ0FZX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0RFQ0FZX0ZzODgyMDAKICAgICAsQUdDX0RFQ0FZX0ZTOTYwMDAKKyAgICAsQUdDX0RFQ0FZX0ZzMTc2NDAwCiAgICAgLEFHQ19ERUNBWV9GUzE5MjAwMAogI2VuZGlmCiAKQEAgLTU4Myw3ICs2NTEsOSBAQAogICAgIFZPTF9UQ19GczQ0MTAwLAogICAgIFZPTF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLFZPTF9UQ19Gczg4MjAwCiAgICAgLFZPTF9UQ19Gczk2MDAwCisgICAgLFZPTF9UQ19GczE3NjQwMAogICAgICxWT0xfVENfRnMxOTIwMDAKICNlbmRpZgogfTsKQEAgLTYwMiw3ICs2NzIsOSBAQAogICAgIE1JWF9UQ19GczQ0MTAwLAogICAgIE1JWF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLE1JWF9UQ19Gczg4MjAwCiAgICAgLE1JWF9UQ19Gczk2MDAwCisgICAgLE1JWF9UQ19GczE3NjQwMAogICAgICxNSVhfVENfRnMxOTIwMDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDliNmRhMzEuLjUwODJhNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC0yOTYsNiArMjk2LDEwIEBACiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCiAgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7CiAgICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBDaE1hc2s7CisjZW5kaWYKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwppbmRleCAwYTNjMzBlLi5iZGNhNWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsOCArNjQsMTEgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTIwNyw4ICsyMTIsNyBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOwotCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC00OTksNyArNTAzLDcgQEAKICAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIG51bWJyIG9mIHNhbXBsZXMgdG8gb3V0cHV0ICovCkBAIC03NTAsNyArNzU0LDExIEBACiAgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKQEAgLTc1OCw3ICs3NjYsNiBAQAogICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7CiAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOwogCi0KICAgICAvKgogICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKICAgICAgICovCkBAIC03ODYsMTQgKzc5MywyNSBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIG91dHB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCkBAIC04MDMsMjMgKzgyMSw0MCBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgIH0KICAgICB9CkBAIC04MzYsMTMgKzg3MSwyMyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgICAgICArPSBOckNoYW5uZWxzICogRnJhbWVDb3VudDsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgfQpAQCAtODUxLDE0ICs4OTYsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwogICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KICAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KICAgICAgICAgfQpAQCAtODcwLDkgKzkyNiwxNiBAQAogICAgICAqLwogICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLwogICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CiAgICAgfQpAQCAtMTA2MywxNCArMTEyNiwyOSBAQAogewogCiAgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9MjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIE1vbm8gaW5wdXQgaXMgcHJvY2Vzc2VkIGFzIHN0ZXJlbyBieSBMVk0gbW9kdWxlICovCisgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKyAgICB9CisjdW5kZWYgTnJGcmFtZXMKKyNkZWZpbmUgTnJGcmFtZXMgKCpwTnVtU2FtcGxlcykgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbHNlCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IDI7CisjZW5kaWYKIAogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDhjMDQ4NDcuLmJhYjQwNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTQ4Nyw2ICs0ODcsOTcgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KKy8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDAyNjRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ3MTQ2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMTkwNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDE5NTNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQ4ODM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Njk3NzdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjkzNTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzE2MjM4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MDY0MTJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNTE3NzE0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMwNTY4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNjQ5ODMwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU3NTkzOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KQEAgLTU4MCw2ICs2NzEsOTggQEAKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTc1NTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzYwNzg0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDI5NzM5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODcwNDA1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDcxMzEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTkwMjYzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKQEAgLTEyMTYsNCArMTM5OSw0IEBACiAKIAogI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCmluZGV4IGNmZTUzYjguLjFiMjdjYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSwxOCArNzEsMzAgQEAKICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKICNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCiAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8CiAjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKKyNlbHNlCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CisjZW5kaWYKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPSBwUGFyYW1zLT5OckNoYW5uZWxzOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkNoTWFzayAgICAgPSBwUGFyYW1zLT5DaE1hc2s7CisjZW5kaWYKICAgICAvKgogICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCiAgICAgICovCkBAIC01NjksNiArNTgzLDExIEBACiAgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgIChDb3VudCA+IDApKTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworICAgIHBJbnN0YW5jZS0+Q2hNYXNrID0gTG9jYWxQYXJhbXMuQ2hNYXNrOworI2VuZGlmCisKICAgICAvKiBDbGVhciBhbGwgaW50ZXJuYWwgZGF0YSBpZiBmb3JtYXQgY2hhbmdlKi8KICAgICBpZihMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KQogICAgIHsKQEAgLTcxOSw2ICs3MzgsOSBAQAogICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgREJFX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwpAQCAtNzcxLDExICs3OTMsMjIgQEAKICAgICAgICAgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX1NURVJFTzsKICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgLyogTm90ZTogQ3VycmVudGx5IFNvdXJjZUZvcm1hdCBmaWVsZCBvZiBFUU5CIGlzIG5vdCBiZWVuCisgICAgICAgICAqICAgICAgIHVzZWQgYnkgdGhlIG1vZHVsZS4KKyAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTVVMVElDSEFOTkVMOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpAQCAtODM4LDcgKzg3MSwxNiBAQAogICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKICAgICAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBDb25jZXJ0IHNvdW5kIG1vZHVsZSBwcm9jZXNzZXMgb25seSB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMKKyAgICAgICAgICogZGF0YS4gU28gdGhlIFNvdXJjZSBGb3JtYXQgaXMgc2V0IHRvIExWQ1NfU1RFUkVPIGZvciBtdWx0aWNoYW5uZWwKKyAgICAgICAgICogaW5wdXQgYWxzby4KKyAgICAgICAgICovCisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTyB8fAorICAgICAgICAgICAgTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NVUxUSUNIQU5ORUwpCisjZWxzZQogICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pICAgIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KKyNlbmRpZgogICAgICAgICB7CiAgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CiAgICAgICAgIH0KQEAgLTg0OSw3ICs4OTEsOSBAQAogICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwogICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOwogICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ1NfUGFyYW1zLk5yQ2hhbm5lbHMgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwppbmRleCAyNmMxYzRmLi5jNTc0OThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTYxLDYgKzYxLDcyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KKyAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCisgKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcworICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCisgKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCisgKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKKyAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKKyAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKKyAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCisgKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKKyAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKKyAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKKyAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKKyAqICAgVG90YWwgTWVtb3J5IFNpemU6CisgKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCisgKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAorICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICoKKyAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgorICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCisgKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKKyAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgorICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQorICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQorICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCisgKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAorICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAorICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCisgKi8KKwogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKQEAgLTE2OCw3ICsyMzQsMTMgQEAKICAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7CiAgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpOworI2VuZGlmCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLApAQCAtMjMzLDcgKzMwNSwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTI3MCw3ICszNDgsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0zNTcsOCArNDQxLDEzIEBACiAgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKIAogICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAKICAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKICAgICAgICAgICAgIHsKQEAgLTU0NywxMyArNjM2LDIwIEBACiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAvKiBTY3JhdGNoIDEgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilCdW5kbGVTY3JhdGNoU2l6ZSk7CiAjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKICNlbHNlCiAgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLApAQCAtNTg0LDggKzY4MCwxMSBAQAogICAgIC8qCiAgICAgICogREMgcmVtb3ZhbCBmaWx0ZXIKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7Ci0KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQKQEAgLTc0NCw3ICs4NDMsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xOTIwMDA7CiAjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC04MDIsNyArOTA3LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CiAjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMTAzOSw3ICsxMTUwLDExIEBACiAgICAgTFZNX1NldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAogICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbHNlCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2VuZGlmCiAKICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAppbmRleCBiNDUzMjIyLi5jZGQzMTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTE0NCwxMiArMTQ0LDE5IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzMgKiBMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisjZWxzZQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyW0xWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT3V0RGVsYXlTYW1wbGVzOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCkBAIC0yODIsNiArMjg5LDExIEBACiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOworI2VuZGlmCisKIH0gTFZNX0luc3RhbmNlX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggNGExOWExMy4uYmM2NjZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC0yMSw2ICsyMSw3IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKQEAgLTY1LDYgKzY2LDExIEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgTnJDaGFubmVscyAgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDaE1hc2sgICAgICA9IHBJbnN0YW5jZS0+Q2hNYXNrOworI2RlZmluZSBOckZyYW1lcyBTYW1wbGVDb3VudCAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVybwpAQCAtMTEyLDYgKzExOCwxMSBAQAogICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQogICAgIHsKICAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgbG9jYWwgdmFyaWFibGUgTnJDaGFubmVscyBmcm9tIHBJbnN0YW5jZS0+TnJDaGFubmVscyB2YWx1ZSAqLworICAgICAgICBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworICAgICAgICBDaE1hc2sgICAgID0gcEluc3RhbmNlLT5DaE1hc2s7CisjZW5kaWYKIAogICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCiAgICAgICAgIHsKQEAgLTEzMCw2ICsxNDEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKICAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgTnJDaGFubmVscyA9IDI7CisgICAgICAgIENoTWFzayAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKICAgICB9CiAKIApAQCAtMTUzLDcgKzE2OCw2IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICAgICAgewotCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KQEAgLTE3MSwxMCArMTg1LDE4IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworI2VuZGlmCiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKQEAgLTIwOCw5ICsyMzAsMTUgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBDb3B5IGFsbCBzYW1wbGVzICovCisjZWxzZQogICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyNlbmRpZgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgpAQCAtMjIxLDIwICsyNDksMzkgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisjZW5kaWYKIAogICAgICAgICAgICAgfQotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hNYXNrKTsKKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCkBAIC0yNDIsMjggKzI4OSwzOSBAQAogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjZW5kaWYKIAotICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogREMgcmVtb3ZhbAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLQotCisjZW5kaWYKICAgICAgICAgfQotCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAgICAgKi8KQEAgLTQ5Nyw0ICs1NTUsNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCmluZGV4IDE5OWRkZGUuLmE1MzU2ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKQEAgLTI2OSw2ICsyNjksNTMgQEAKICAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgLyogODhrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKQEAgLTMxNiw2ICszNjMsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKIAorICAgICAgICAgICAgICAgICAgICAvKiAxNzZrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCiAgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggOWEzZDM1ZC4uMDZlNzQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTc4LDYgKzc4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDNlZTdmNjMuLjAxNTM5YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0zMCw4ICszMCwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBUaGUgbWVtb3J5IHJlZ2lvbiBjcmVhdGVkIGJ5IHRoaXMgc3RydWN0dXJlIGluc3RhbmNlIGlzIHR5cGVjYXN0CisgICAgICogaW50byBhbm90aGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciBhbmQgYW4gYXJyYXkgb2YgZmlsdGVyCisgICAgICogY29lZmZpY2llbnRzLiBJbiBvbmUgY2FzZSB0aGlzIG1lbW9yeSByZWdpb24gaXMgdXNlZCBmb3Igc3RvcmluZworICAgICAqIERDIGNvbXBvbmVudCBvZiBjaGFubmVscworICAgICAqLworICAgIExWTV9GTE9BVCAqcFN0b3JhZ2U7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbTFZNX01BWF9DSEFOTkVMU107CisjZWxzZQogICAgIExWTV9GTE9BVCBTdG9yYWdlWzZdOwotCisjZW5kaWYKIH0gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE3OSw3ICsxODgsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE5NywxMiArMjExLDE3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbIChMVk1fTUFYX0NIQU5ORUxTICogNCkgXTsKKyNlbHNlCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTM2Niw2ICszODUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKQEAgLTQzNCw2ICs0NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLApAQCAtNTI3LDYgKzU2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApAQCAtNTQwLDEyICs1ODAsMjIgQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOworCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCmluZGV4IDgxZTI4OGMuLmE3NjM1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC00NCw3ICs0NCwxNSBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworICAgIC8qCisgICAgICogVGhlIG1lbW9yeSBhcmVhIGNyZWF0ZWQgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgaW50ZXJuYWxseQorICAgICAqIHR5cGVjYXN0IHRvIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgYW5kIHVzZWQuCisgICAgICogVGhlIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3Qgc3RydWN0dXJlIGhhcyAzIHBvaW50ZXIgdHlwZSBlbGVtZW50cworICAgICAqIDIgZWxlbWVudHMgb2YgdHlwZSBMVk1fSU5UMzIgYW5kIG9uZSBlbGVtZW50IG9mIHR5cGUgTFZNX0lOVDE2LgorICAgICAqIElub3JkZXIgdG8gY2F0ZXIgYm90aCAzMiBhbmQgNjQgYml0IGJ1aWxkcywgU3RvcmFnZSBhcnJheSBzaG91bGQKKyAgICAgKiBoYXZlIGEgbWluaW11bSBvZiA5IGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyLgorICAgICAqLworICAgIExWTV9JTlQzMiBTdG9yYWdlWzldOwogCiB9IExWTV9UaW1lcl9JbnN0YW5jZV90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IGVhMTYwNzIuLmZiZmRkNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC05NCw2ICs5NCw3IEBACiAKIHR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50NjRfdCAgICAgICAgICAgICBMVk1fSU5UNjQ7ICAgICAgICAgIC8qIFNpZ25lZCA2NC1iaXQgd29yZCAqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKIApAQCAtMTIyLDYgKzEyMywxMiBAQAogCiAjZW5kaWYgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgogCisjaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDggLy8gRkNDXzgKKyNlbHNlCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgMiAvLyBGQ0NfMgorI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0Myw2ICsxNTAsOSBAQAogICAgIExWTV9TVEVSRU8gICAgICAgICAgPSAwLAogICAgIExWTV9NT05PSU5TVEVSRU8gICAgPSAxLAogICAgIExWTV9NT05PICAgICAgICAgICAgPSAyLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fTVVMVElDSEFOTkVMICAgID0gMywKKyNlbmRpZgogICAgIExWTV9TT1VSQ0VfRFVNTVkgICAgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCkBAIC0xNjAsOCArMTcwLDEwIEBACiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GU185NjAwMCA9IDksCi0gICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWTV9GU184ODIwMCA9IDksCisgICAgTFZNX0ZTXzk2MDAwID0gMTAsCisgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAorICAgIExWTV9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWTV9GU19JTlZBTElEID0gTFZNX01BWEVOVU0tMSwKICAgICBMVk1fRlNfRFVNTVkgPSBMVk1fTUFYRU5VTQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IDBiYTIwYTMuLjc0NjhhOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTQ3LDYgKzQ3LDE2IEBACiB2b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC0xODEsNiArMTkxLDEyIEBACiB2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKaW5kZXggZmE5ZjAxZi4uNWM4NjU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKQEAgLTMwNSw0ICszMDUsMTUwIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNY1NyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNY1NyYyAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9TcmMgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRHN0ICAgICAgICAgICAgICAgICAgICBNdWx0aWNoYW5uZWwgZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5yRnJhbWVzICAgICAgICAgICAgICAgIE51bWJlciBvZiBmcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJDaGFubmVscyAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1jU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisKKyAgICAvKgorICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgIGksIGpqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgIFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHZhbHVlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworCisgICAgICAgIEFic1BlYWsgPSAwLjBmOworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KKyAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBpbnB1dCBzaWduYWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgID0gU2FtcGxlVmFsICAqIFZvbF9NdWx0OworCisgICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgPiBBYnNQZWFrID8gQWJzX0Zsb2F0KFNhbXBsZVZhbCkgOiBBYnNQZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBNb25vU3JjKys7CisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8qU1VQUE9SVF9NQyovCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwppbmRleCBlM2VkY2NjLi42NmQ2YWRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTQzLDExICs0MywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihhPDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYz0weDgwMDAwMDAwbDsKKyAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICAgICAgYz0weDdGRkZGRkZGTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwppbmRleCA5NjBkZTc5Li5kNjMzNjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTEyMyw2ICsxMjMsODcgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKKworCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBDSEFOTkVMLVdJU0UKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogeW49IChBMiAgKiB4KG4tMikpICovCisgICAgICAgICAgICAgICAgeW4gPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMSAgKiB4KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9IChBMCAgKiB4KG4pKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMiAgKiB5KG4tMikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjEgICogeShuLTEpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSAoTFZNX0ZMT0FUKXluOyAvKiBVcGRhdGUgeShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bjsgLyogV3JpdGUgamogQ2hhbm5lbCBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KKwogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwppbmRleCBlNDg5MDMxLi4zODU4NDUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCkBAIC04NCw1ICs4NCw2NSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8vIEV4dHJhY3Qgb3V0IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyIGZyb20gbXVsdGljaGFubmVsIHNvdXJjZS4KK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICAgICAgZHN0ICs9IDI7CisgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCisgICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOworICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdCAtPSAyOworICAgICAgICAgICAgc3JjIC0tOworICAgICAgICB9CisgICAgfQorfQorCisvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIGRzdCwgdG8gZHN0Lgordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUICpzcmNfc3QgPSBkc3QgKyAyICogKE5yRnJhbWVzIC0gMSk7CisKKyAgICAvLyByZXBhY2sgZHN0IHdoaWNoIGNhcnJpZXMgc3RlcmVvIGluZm9ybWF0aW9uCisgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgorICAgIGRzdCArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBkc3RbMV0gPSBzcmNfc3RbMV07CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsgLy8gY29weSAxIGJlZm9yZSAwIGlzIHJlcXVpcmVkIGZvciBOckNoYW5uZWxzID09IDMuCisgICAgICAgIGZvciAoamogPSAyOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtqal0gPSBzcmNbampdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjX3N0IC09IDI7CisgICAgfQorfQorI2VuZGlmCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKaW5kZXggZDI2MWM5ZS4uMTNmYWM1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CiAgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCiAgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CiAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQpAQCAtNjQsNiArNjQsNTggQEAKIAogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBEQyByZW1vdmFsIGZyb20gYWxsIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwSW5zdGFuY2UgICAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgcERhdGFJbiAgICAgICAgSW5wdXQvU291cmNlCisgKiAgcERhdGFPdXQgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBMVk1fSU5UMzIgaTsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworCisgICAgICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgICAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gKihwRGF0YUluKyspIC0gKENoRENbaV0pOworICAgICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSArPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDRmNGZjZDguLjBmOTQxYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTI0LDYgKzI0LDE3IEBACiAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQoreworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IExWTV9NQVhfQ0hBTk5FTFM7IGkrKykKKyAgICB7CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+Q2hEQ1tpXSA9IDAuMGY7CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggZmE2YjcyOS4uZGIzYTZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMzQsNiArMzQsMTMgQEAKICAgICBMVk1fRkxPQVQgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCiB9RmlsdGVyX0ZMT0FUX1N0YXRlOwogdHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGUgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlIDsKKyNpZmRlZiBTVVBQT1JUX01DCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlX01jXworeworICAgIExWTV9GTE9BVCAgQ2hEQ1tMVk1fTUFYX0NIQU5ORUxTXTsgICAgIC8qIENoYW5uZWxEQyAgKi8KK30gRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwordHlwZWRlZiBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIDsKKyNlbmRpZgogI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYwppbmRleCAyZTIwZDc5Li5iMDRlOThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMKQEAgLTUzLDExICs1MywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihhIDwgMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMGw7CisgICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGbDsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRkw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKmRzdCA9IGM7CkBAIC03MiwxMSArNzIsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYoYSA8IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRmw7CisgICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlbGF5W0FsbFBhc3NPZmZzZXRdID0gYzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwppbmRleCAxOTI5MjdjLi4yYTUwZjE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0xMTcsNiArMTE3LDkzIEBACiAgICAgICAgIH0KIAogICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FTU1VNUFRJT05TOgorQ09FRlMtCitwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLAorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqY2ggKyAwXSBpcyB4KG4tMSkgb2YgdGhlICdjaCcgLSBjaGFubmVsCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDFdIGlzIHkobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK1RoZSBpbmRleCAnY2gnIHJ1bnMgZnJvbSAwIHRvIChOckNoYW5uZWxzIC0gMSkKKworUEFSQU1FVEVSUzoKKyBwSW5zdGFuY2UgICAgICAgIFBvaW50ZXIgSW5zdGFuY2UKKyBwRGF0YUluICAgICAgICAgIElucHV0L1NvdXJjZQorIHBEYXRhT3V0ICAgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgTnJGcmFtZXMgICAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgTnJDaGFubmVscyAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKworUkVUVVJOUzoKKyB2b2lkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgIHluOworICAgICAgICBMVk1fRkxPQVQgICBUZW1wOworICAgICAgICBMVk1fSU5UMTYgICBpaTsKKyAgICAgICAgTFZNX0lOVDE2ICAgY2g7CisgICAgICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBMVk1fRkxPQVQgICAqcERlbGF5cyA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5czsKKyAgICAgICAgTFZNX0ZMT0FUICAgKnBDb2VmcyAgPSAmcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTAgPSBwQ29lZnNbMV07CisgICAgICAgIExWTV9GTE9BVCAgIEExID0gcENvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBCMSA9IHBDb2Vmc1syXTsKKworCisKKworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgQ0hBTk5FTFMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8geW4gPUExICAqIHgobi0xKQorICAgICAgICAgICAgICAgIHluID0gKExWTV9GTE9BVClBMSAqIHBEZWxheXNbMF07CisKKyAgICAgICAgICAgICAgICAvLyB5bis9QTAgICogeChuKQorICAgICAgICAgICAgICAgIHluICs9IChMVk1fRkxPQVQpQTAgKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAgICAgLy8geW4gKz0gICgtQjEgICogeShuLTEpKQorICAgICAgICAgICAgICAgIFRlbXAgPSBCMSAqIHBEZWxheXNbMV07CisgICAgICAgICAgICAgICAgeW4gKz0gVGVtcDsKKworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcERlbGF5c1sxXSA9IHluOyAvLyBVcGRhdGUgeShuLTEpCisgICAgICAgICAgICAgICAgcERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKQorCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCisgICAgICAgICAgICAgICAgaWYgKHluID4gMS4wZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHluIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAtMS4wZjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW47CisgICAgICAgICAgICAgICAgcERlbGF5cyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcERlbGF5cyAtPSBOckNoYW5uZWxzICogMjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwppbmRleCBhYzFlZWE4Li5kMDJhZjg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwpAQCAtNjgsNSArNjgsNDcgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIEZyb21NY1RvTW9ub19GbG9hdAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIENyZWF0ZXMgYSBtb25vIHN0cmVhbSBmcm9tIGEgbXVsdGljaGFubmVsIGlucHV0IHRha2luZyB0aGUgYXZlcmdhZSBvZgorICogIHNhbXBsZSB2YWx1ZXMgb2YgYWxsIGNoYW5uZWxzCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgRnJvbU1jVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIExWTV9GTE9BVCBUZW1wOworCisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9IDAuMGY7CisgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgKz0gKCpzcmMpOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICAgICAgKmRzdCA9IFRlbXAgLyBOckNoYW5uZWxzOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKKwogI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCBlYjU3NTVlLi5kYjc2Y2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC01OSw2ICs1OSwzMSBAQAogCiAKIH0KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlW2pqXSk7CisgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCBkMjY5NGNjLi40MTljN2M1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKIAogICAgIExWTV9JTlQxNiAgIE91dExvb3A7CkBAIC0xMTQsNiArMTE0LDEzOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorCisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKaW5kZXggNjU2YTExNy4uNTZiNWRhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwpAQCAtMTQ2LDYgKzE0Niw1MSBAQAogICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKIAogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMzIgICBpaSwgY2g7CisgICAgTFZNX0ZMT0FUICAgVGVtcCA9MC4wZjsKKyAgICBMVk1fRkxPQVQgICB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQorICAgIHsKKyAgICAgICAgdGVtcEN1cnJlbnRbY2hdID0gcHRySW5zdGFuY2VbY2hdLT5DdXJyZW50OworICAgIH0KKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpID4gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSBwdHJJbnN0YW5jZVtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICBDdXJyZW50ID0gdGVtcEN1cnJlbnRbY2hdOworICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50LCBEZWx0YSwgVGVtcCk7CisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICB0ZW1wQ3VycmVudFtjaF0gPSBDdXJyZW50OworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICBwdHJJbnN0YW5jZVtjaF0tPkN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgfQorfQorI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKaW5kZXggYjVlN2Y1Yy4uNWJmZGFkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMjcsMTAgKzI3LDEwIEBACiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKIHsKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwogICAgIExWTV9JTlQxNiAgIEluTG9vcDsKQEAgLTEwNSw2ICsxMDUsMTE5IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQorCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQQorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQ8VGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAxOTJmMTI2Li42NTk1NmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzQsMTAgKzM0LDEwIEBACiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKIHsKICAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKICAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwpAQCAtMTA2LDYgKzEwNiwxMTAgQEAKICAgICB9CiAKIH0KKworCisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+VGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2VuZGlmCisKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCBiZDVhOTI1Li5hNDY4MmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTE5LDYgKzE5LDggQEAKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCkBAIC0zMCwxMCArMzIsMjA3IEBACiAjZGVmaW5lIFRSVUUgICAgICAgICAgMQogI2RlZmluZSBGQUxTRSAgICAgICAgIDAKIAorI2RlZmluZSBBUlJBWV9TSVpFKGEpICgoc2l6ZW9mKGEpKSAvIChzaXplb2YoKihhKSkpKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQworLyogVGhpcyB0aHJlc2hvbGQgaXMgdXNlZCB0byBkZWNpZGUgb24gdGhlIHByb2Nlc3NpbmcgdG8gYmUgYXBwbGllZCBvbgorICogZnJvbnQgY2VudGVyIGFuZCBiYWNrIGNlbnRlciBjaGFubmVscworICovCisjZGVmaW5lIExWTV9WT0xfQkFMX1RIUiAoMC4wMDAwMTZmKQordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUIChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIENoTWFzaykKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfbGZlID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfY3RyID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBNaXhQcml2SW5zdFs0XSA9IHtwSW5zdGFuY2UxLCBwSW5zdGFuY2UyLCAmVGFyZ2V0X2N0ciwgJlRhcmdldF9sZmV9OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlW05yQ2hhbm5lbHNdOworCisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oQ2hNYXNrKQorICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbaV07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBOckNoYW5uZWxzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFsyXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBUT0RPOiBDb21iaW5lIHdpdGggc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL0JhbGFuY2UuY3BwCisgICAgICAgIC8vIENvbnN0YW50cyBpbiBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oCisgICAgICAgIC8vICdtaXhJbnN0SWR4JyBpcyB1c2VkIHRvIG1hcCB0aGUgYXBwcm9wcmlhdGUgbWl4ZXIgaW5zdGFuY2UgZm9yIGVhY2ggY2hhbm5lbC4KKyAgICAgICAgY29uc3QgaW50IG1peEluc3RJZHhbXSA9IHsKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgICAgICAgICAgICA9IDB4MXUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAorICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHg0dSwKKyAgICAgICAgICAgIDMsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgICAgICAgICA9IDB4OHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgICAgICAgICAgICA9IDB4MjB1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgID0gMHg0MHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKKyAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSICAgICAgICAgICA9IDB4MTAwdSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCAgICAgICAgICAgICA9IDB4MjAwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKKyAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgICAgICAgICAgICA9IDB4ODAwdSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUICAgICAgICA9IDB4MTAwMHUsCisgICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUICAgICAgID0gMHg0MDAwdSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQgICAgICAgICA9IDB4ODAwMHUsCisgICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUICAgICAgICA9IDB4MjAwMDB1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCAgICAgICAgID0gMHg0MDAwMHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdQorICAgICAgICB9OworICAgICAgICBpZiAocEluc3RhbmNlMS0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUiB8fAorICAgICAgICAgICAgcEluc3RhbmNlMi0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUikKKyAgICAgICAgeworICAgICAgICAgICAgVGFyZ2V0X2N0ci5UYXJnZXQgID0gMC4wZjsKKyAgICAgICAgICAgIFRhcmdldF9jdHIuQ3VycmVudCA9IDAuMGY7CisgICAgICAgICAgICBUYXJnZXRfY3RyLkRlbHRhICAgPSAwLjBmOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpZHhBcnJTaXplID0gQVJSQVlfU0laRShtaXhJbnN0SWR4KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIGNoYW5uZWwgPSBDaE1hc2s7IGNoYW5uZWwgIT0wIDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWR4ID0gX19idWlsdGluX2N0eihjaGFubmVsKTsKKyAgICAgICAgICAgIGlmIChpZHggPCBpZHhBcnJTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFttaXhJbnN0SWR4W2lkeF1dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWwgJj0gfigxIDw8IGlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8CisgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICAvLyBUT0RPOiBjb21iaW5lIHNpbWlsYXIgY2hlY2tzIGJlbG93LgorICAgICAgICBpZiAocEluc3RhbmNlMS0+RGVsdGEgPT0gTFZNX01BWEZMT0FUCisgICAgICAgICAgICAgICAgfHwgQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UyLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQKKyAgICAgICAgICAgICAgICAgICAgfHwgQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoSGFyZE1peGluZyA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQSAoJnBJbnN0YW5jZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpCisgICAgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoJihwSW5zdGFuY2VbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKaW5kZXggMTAxN2RlMy4uMDY3OGFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0xMDMsNiArMTAzLDEwMSBAQAogICAgICAgICB9CiAgICAgfQogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBGcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggM2M5MDA3MS4uOGE4OWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMSArMjYsMTEgQEAKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQogewogICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKQEAgLTY3LDYgKzY3LDcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIDIgc3RyZWFtIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMxICAgICAgICAgICBGaXJzdCBtdWx0aWNoYW5uZWwgc291cmNlCisgKiAgc3JjMiAgICAgICAgICAgU2Vjb25kIG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICB9Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggZjkwNDkxNS4uMTk5ZDUyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTE1NywxMCArMTU3LDE4IEBACiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTY5LDEwICsxNzcsMTggQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTgxLDExICsxOTcsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKQEAgLTIwMCwxMCArMjI0LDE4IEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKTsKKyNlbmRpZgordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCmluZGV4IGM2NzQ1NWEuLjUwN2VlZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKICAgICBMVk1fRkxPQVQgICAgICAgVGFyZ2V0R2FpbjsKICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgCisKICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAvLyBUYXJnZXRHYWluCiAgICAgcmV0dXJuIFRhcmdldEdhaW47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCBkMGQwZTFmLi40NTNhNmE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTYyLDYgKzYyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApAQCAtNzMsNiArODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCkBAIC0xMDIsNiArMTE2LDEzIEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCkBAIC0xMjIsNiArMTQzLDEzIEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggNDhmNWQ1NC4uOWQzZWU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCiB7CiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCkBAIC02MCw3ICs2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLC8qODgyMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwogI2Vsc2UKICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDlkYzdkMjEuLjBlMGFjZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKIHsKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwvKjgwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwpAQCAtNjEsNyArNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCiAjZWxzZQogICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmluZGV4IDc4NDZjYTAuLjYzMDdlNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCkBAIC01Myw3ICs1Myw5IEBACiAjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKICNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKICNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKICNlbmRpZgogY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLApAQCAtNjYsNyArNjgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzg4MjAwX2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE3NjQwMF9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKaW5kZXggZTNmYjQwZC4uMTdmZDgzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKQEAgLTUwLDExICs1MCwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZih0ZW1wPDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZE91dFZhbD0weDgwMDAwMDAwbDsKKyAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICAgICAgZE91dFZhbD0weDdGRkZGRkZGTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwppbmRleCA5YzE3YTA1Li42YzhiMmRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTExOSw2ICsxMTksODAgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluLCB5bk8sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBqaiBDSEFOTkVMCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIHluPSAoQTAgICogKHgobikgLSB4KG4tMikpKSovCisgICAgICAgICAgICAgICAgdGVtcCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKyAgICAgICAgICAgICAgICB5biA9IHRlbXAgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMiAgKiB5KG4tMikpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMSAqIHkobi0xKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjIgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bk89ICgoR2FpbiAqIHluKSkgKi8KKyAgICAgICAgICAgICAgICB5bk8gPSB5biAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgICAgICAvKiB5bk89KHluTyArIHgobikpKi8KKyAgICAgICAgICAgICAgICB5bk8gKz0gKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMyArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXTsgLyogeShuLTIpPXkobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAxICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsgLyogeChuLTIpPXgobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdID0geW47IC8qIFVwZGF0ZSB5KG4tMSkgKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSB5bk87IC8qIFdyaXRlIG91dHB1dCovCisgICAgICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAppbmRleCA4ZTBiNzM4Li44MDRmMWJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKQEAgLTE4NCw2ICsxODQsOSBAQAogewogICAgIExWRVFOQl9TVEVSRU8gICAgICAgPSAwLAogICAgIExWRVFOQl9NT05PSU5TVEVSRU8gPSAxLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVkVRTkJfTVVMVElDSEFOTkVMID0gMiwKKyNlbmRpZgogICAgIExWRVFOQl9TT1VSQ0VfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Tb3VyY2VGb3JtYXRfZW47CiAKQEAgLTIwMSw4ICsyMDQsMTAgQEAKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICA0MDk2CiAjZW5kaWYKIAogdHlwZWRlZiBlbnVtCkBAIC0yMTcsOCArMjIyLDEwIEBACiAgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKICAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWRVFOQl9GU185NjAwMCA9IDksCi0gICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWRVFOQl9GU184ODIwMCA9IDksCisgICAgTFZFUU5CX0ZTXzk2MDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzE3NjQwMCA9IDExLAorICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZzX2VuOwpAQCAtMjY3LDcgKzI3NCw5IEBACiAgICAgLyogRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCiAgICAgTFZFUU5CX0JhbmREZWZfdCAgICAgICAgICAgICpwQmFuZERlZmluaXRpb247ICAgICAgIC8qIFBvaW50ZXIgdG8gZXF1YWxpc2VyIGRlZmluaXRpb25zICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIH0gTFZFUU5CX1BhcmFtc190OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggNDJlYTQ2Zi4uNzU1MTQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTEwOSw3ICsxMDksOSBAQAogI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxMzFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDcxZgogI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNjVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzNmYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA1NmIwMmUwLi5hOWNkNWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC00Niw3ICs0NiwxMiBAQAogI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMikKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogI2RlZmluZSBMVkVRTkJfU0NSQVRDSF9BTElHTiAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAogI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwppbmRleCA2MzI4MTgxLi5kMTg4YzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIkJJUVVBRC5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjEsMTQgKzYyLDE4IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgIE5yRnJhbWVzKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCiAgICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgICA/IDIgOiBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2Vsc2UKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCisjZW5kaWYKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCiAgICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCiAgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCkBAIC04MiwxNCArODcsMTQgQEAKICAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKICAgICB9CiAKLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKyAgICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OwogCiAgICAgLyoKLSAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCiAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCiAgICAgewotICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9UT09NQU5ZU0FNUExFUzsKICAgICB9CiAKICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCkBAIC05NywxNiArMTAyLDE2IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENvcHkgaW5wdXQgZGF0YSBpbiB0byBzY3JhdGNoIGJ1ZmZlcgogICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLwogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKICAgICAgICAgICovCiAgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoTFZNX1VJTlQxNiBpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiBiYW5kIGlzIG5vbi16ZXJvIGRCIGdhaW4KQEAgLTExNiw3ICsxMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOworICAgICAgICAgICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOwogCiAKICAgICAgICAgICAgICAgICAgICAgLyoKQEAgLTEyNiwxMCArMTMxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTQxLDE5ICsxNTQsMjkgQEAKIAogCiAgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLSAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIGVsc2UgY2xhdXNlKHMpCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICAgICAgZWxzZXsKICAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtMTYzLDEyICsxODYsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQogICAgICAgICB7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiBMVkVRTkJfU1VDQ0VTUzsKIAogfQogI2Vsc2UKQEAgLTMxMiw0ICszMzUsNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwppbmRleCA1NjMxODFjLi40NTNjNDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpAQCAtNDYsNyArNDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQpAQCAtODIsNyArODQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fODgyMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xNzY0MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE5MjAwMAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0yNDksMzAgKzI1Myw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50cyAoMTAwbXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM4MDAwICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczExMDI1ICAgMzI2MzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxNjAwMCAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczIyMDUwICAgMzI3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMzMjAwMCAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ0MTAwICAgMzI3MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDgwMDAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCi0KLQotY29uc3QgTFZNX0lOVDE2IExWRVFOQl9NaXhlclRDVGFibGVbXSA9IHsKLSAgICBMVkVRTkJfTUlYX1RDX0ZzODAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUsCi0gICAgTFZFUU5CX01JWF9UQ19GczEyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxNjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAsCi0gICAgTFZFUU5CX01JWF9UQ19GczI0MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMzMjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczQ4MDAwfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAppbmRleCBmZjc0NzVlLi5jOTE1YWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCkBAIC0xMjMsNyArMTIzLDcgQEAKICNpZm5kZWYgSElHSEVSX0ZTCiAjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZWxzZQotI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLwogI2VuZGlmCiAKICNkZWZpbmUgTFZSRVZfTUFYQkxLU0laRV9MSU1JVCAgICAgICAgICAgICA2NCAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGxvdyBsaW1pdCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCmluZGV4IDU2NmQ4NGYuLjFkMTI4M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgCisKICAgICAvKgogICAgICAqICBQcm9jZXNzIGFsbCBkZWxheSBsaW5lcwogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKaW5kZXggYTcxOTA1My4uZGZlZDI4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC02NCwxMiArNjQsMjIgQEAKICAgICAgICAgKAogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCiAjZW5kaWYKICAgICAgICAgKQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgICAgICAgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICAgICAgICAgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpKQorI2Vsc2UKICAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQorI2VuZGlmCiAgICAgewogICAgICAgICByZXR1cm4gKExWUkVWX09VVE9GUkFOR0UpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKaW5kZXggYjNlZGM2MC4uMTA1ODc0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKQEAgLTUyLDcgKzUyLDkgQEAKICAgICAzMjAwMCwKICAgICA0NDEwMCwKICAgICA0ODAwMCwKKyAgICA4ODIwMCwKICAgICA5NjAwMCwKKyAgICAxNzY0MDAsCiAgICAgMTkyMDAwCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAppbmRleCBhNzUwYmIwLi5lZTA3ZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpZm5kZWYgSElHSEVSX0ZTCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6Ki8KICNlbHNlCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDExICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMyAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KICNlbmRpZgogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwppbmRleCBlYTVmNzRhLi42MTg5OWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKQEAgLTIyLDYgKzIyLDE3IEBACiAKICNkZWZpbmUgTFZNX01JTklOVF8zMiAgIDB4ODAwMDAwMDAKIAorc3RhdGljIExWTV9JTlQzMiBtdWx0MzJ4MzJpbjMyX3NoaWZ0cihMVk1fSU5UMzIgYSwgTFZNX0lOVDMyIGIsIExWTV9JTlQzMiBjKSB7CisgIExWTV9JTlQ2NCByZXN1bHQgPSAoKExWTV9JTlQ2NClhICogYikgPj4gYzsKKworICBpZiAocmVzdWx0ID49IElOVDMyX01BWCkgeworICAgIHJldHVybiBJTlQzMl9NQVg7CisgIH0gZWxzZSBpZiAocmVzdWx0IDw9IElOVDMyX01JTikgeworICAgIHJldHVybiBJTlQzMl9NSU47CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChMVk1fSU5UMzIpcmVzdWx0OworICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTIzLDEwICsxMzQsMTAgQEAKIAogICAgIGlmKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKQogICAgIHsKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKEF1ZGlvVGltZSArIChMVk1fSU5UMzIpKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50KjEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KQorICAgICAgICBBdWRpb1RpbWVJbmMgPSBtdWx0MzJ4MzJpbjMyX3NoaWZ0cigKKyAgICAgICAgICAgICAgICAoQXVkaW9UaW1lICsgKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ICogMTAwMCkpLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCk7CiAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgPSBBdWRpb1RpbWUgKyBBdWRpb1RpbWVJbmM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKaW5kZXggMTI4NzUwMy4uZjhhZjQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtNTQsNyArNTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogCkBAIC03OCw3ICs4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg2OTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjQzNDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIxNzQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEwNSw3ICsxMDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTc2NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTkyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzUyOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzg0MCAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xMjgsNyArMTM0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgIC8qIDQ0MTAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjAgICAgICAgICAgICAgICAgICAgLyogODgyMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMCAgICAgICAgICAgICAgICAgIC8qIDE3NjQwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTUzLDcgKzE2MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjM5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTk1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTA5OCAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNjksNyArMTc5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA3Mjk0NzZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzNjQ3MzhmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTM1Miw3ICszNjQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLwpAQCAtMzY4LDcgKzM4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLwpAQCAtMzgzLDcgKzM5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCmluZGV4IGU3NTY5NWUuLmU1MDdhN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC0yMDUsNiArMjA1LDkgQEAKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkNTX1BhcmFtc190OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCmluZGV4IDBjMmZlNTMuLmJhMDU1NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMTUyLDYgKzE1MiwyNCBAQAogI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBDb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM4NDZmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzI2NTdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5Mjc0N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMTU0MWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4OTU4NmYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDU4MDQ1ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzY1MzAwZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43Njk4MTZmCisjZGVmaW5lIENTX1NJREVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CisKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCiAvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLwogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgpAQCAtMTYwLDEzICsxNzgsMzMgQEAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTkzMzM0KQogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTY3MjcKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMTY3MjcpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS43OTMzNzIpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NzIzNgotI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KKyAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjI0MzI2ZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NDkzN2YpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjA3MDYxMWYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS43OTIxNjZmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTU4MzBmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM5NzNmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMzMzc4ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjM2N2YpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTgzNmYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMDc1NDRmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4xMDc3MDhmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuODc2NTcyZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuODc3NzcxZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLwogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKQEAgLTE3NSwxMyArMjEzLDE1IEBACiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTY2NjEpCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLS8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDg5OTEpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkyNTA5KQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0Ci0jZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC4xOTYwMzlmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMzExMDI3ZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTE0OTg4ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjg5MTM4MGYpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjg5MjM0NjBmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAxNAogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTksNyArMjM5LDEyIEBACiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTU3ICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFogICAgICAgICAgICAgICAgICAgMTAyNCAgICAgICAgLyogU2FtcGxlIHJhdGUgODguMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiAgICAgICAgICAgICAgICAgICAxMTE1ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFogICAgICAgICAgICAgICAgICAyMDQ4ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxNzYuNGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFogICAgICAgICAgICAgICAgICAyMjI5ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTCAgICAgICAgICAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFoKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjY3MjcxCkBAIC0yNzUsNiArMzIwLDE0IEBACiAjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNzE5MDFmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTcxOTAxZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41NTM5NDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgKDAuNTcwMjQ4ZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4CkBAIC0yODQsNiArMzM3LDE0IEBACiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAorLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDk0NzYzZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDk0NzYzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNzU4NTkzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC43NjMwOTFmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwogI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzgzNjkKQEAgLTQ0Niw2ICs1MDcsMjQgQEAKIAogCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAxLjc3MTg5OWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICgtMi45MzA3NjJmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgMS4xNzIxNzVmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNDM4MzQ5ZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgIDAuNDQyNTIwZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTAgICAgICAgICAgICAgICAgIDIuNjc1MjQxZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSAgICAgICAgICAgICAgICAgKC00LjQ2NjE1NGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyICAgICAgICAgICAgICAgICAxLjgxMDMwNWYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEgICAgICAgICAgICAgICAgICgtMC45MjUzNTBmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjA2NjYxNmYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAxMworCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy4wMDE0MzUpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS4yMjg0MjIKQEAgLTQ1OCw2ICs1MzcsMjMgQEAKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICgtMC45NzE3MTgpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDIxMjE2KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgIDEuODgzNDQwZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgKC0zLjQxNDI3MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAxLjUzNDcwMmYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICgtMS42NzQ2MTRmKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgMC42NzU4MjdmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgMy4zNTUwNjhmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAoLTYuMTEyNTc4ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyICAgICAgICAgICAgICAgIDIuNzY0MTM1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgKC0xLjI2ODUzM2YpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAwLjI3MTI3N2YKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgIDEzCiAKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuNDU2MTQwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKaW5kZXggYTk3ZTRmMC4uYWI4Y2NkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCkBAIC02MSw2ICs2MSwxNSBAQAogCiAvKiBNZW1vcnkgKi8KICNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGFwcGxpZXMgcHJvY2Vzc2luZyBvbmx5IG9uIHRoZSBmaXJzdCB0d28KKyAqIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0LiBUaGUgZGF0YSBvZiBmaXJzdCB0d28gY2hhbm5lbHMgaXMgY29waWVkCisgKiBmcm9tIHRoZSBtdWx0aWNoYW5uZWwgaW5wdXQgaW50byBzY3JhdGNoIGJ1ZmZlci4gVGhlIGJ1ZmZlcnMgYWRkZWQgaGVyZQorICogYXJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZQorICovCisjZGVmaW5lIExWQ1NfTUNfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgIDIKKyNlbmRpZgogCiAvKiBHZW5lcmFsICovCiAjZGVmaW5lIExWQ1NfSU5WQUxJRCAgICAgICAgICAgICAgICAweEZGRkYgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwppbmRleCAzOTU2ZDRkLi5lZjFkOWViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKQEAgLTc2LDYgKzc2LDIyIEBACiAgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CiAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU3RJbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKworICAgIC8qSW4gY2FzZSBvZiBtb25vIHByb2Nlc3NpbmcsIHN0ZXJlbyBpbnB1dCBpcyBjcmVhdGVkIGZyb20gbW9ubworICAgICAqYW5kIHN0b3JlZCBpbiBwSW5EYXRhIGJlZm9yZSBhcHBseWluZyBhbnkgb2YgdGhlIGVmZmVjdHMuCisgICAgICpIb3dldmVyIHdlIGRvIG5vdCB1cGRhdGUgdGhlIHZhbHVlIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMKKyAgICAgKmF0IHRoaXMgcG9pbnQuCisgICAgICpTbyB0byB0cmVhdCB0aGUgcEluRGF0YSBhcyBzdGVyZW8gd2UgYXJlIHNldHRpbmcgY2hhbm5lbHMgdG8gMgorICAgICAqLworICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogCiAgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCiAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwpAQCAtODMsNiArOTksMjUgQEAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBwcm9jZXNzaW5nIGlzIGlucGxhY2UKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyoKKyAgICAgKiBUaGUgcElucHV0IGJ1ZmZlciBob2xkcyB0aGUgZmlyc3QgMiAoTGVmdCwgUmlnaHQpIGNoYW5uZWxzIGluZm9ybWF0aW9uLgorICAgICAqIEhlbmNlIHRoZSBtZW1vcnkgcmVxdWlyZWQgYnkgdGhpcyBidWZmZXIgaXMgMiAqIE51bUZyYW1lcy4KKyAgICAgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgY2FycmllcyBvdXQgcHJvY2Vzc2luZyBvbmx5IG9uIEwsIFIuCisgICAgICovCisgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMiAqIE5yRnJhbWVzKTsKKyAgICBwU3RJbiAgPSBwU2NyYXRjaCArIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogTnJGcmFtZXMpOworICAgIC8qIFRoZSBmaXJzdCB0d28gY2hhbm5lbCBkYXRhIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBkYXRhIGFuZAorICAgICAqIGNvcGllZCBpbnRvIHBJbnB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBDb3B5X0Zsb2F0X01jX1N0ZXJlbygoTFZNX0ZMT0FUICopcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKKyAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFN0SW4sCisgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnJGcmFtZXMpKTsKKyNlbHNlCiAgICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCiAgICAgewogICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KQEAgLTk2LDE0ICsxMzEsMjEgQEAKICAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLwogICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOwogICAgIH0KLQorI2VuZGlmCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdEluLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgKi8KKyNlbHNlCiAgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgpAQCAtMTEyLDcgKzE1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwotICAgIAorCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBlcXVhbGlzZXIKICAgICAgKi8KQEAgLTIzOSw3ICsyODEsMTUgQEAKIAogICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIGNoYW5uZWxzID0gMjsKKyAgICB9CisjZW5kaWYKICAgICAvKgogICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCiAgICAgICovCkBAIC0yNjAsOCArMzEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKKworCiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbXByZXNzIHRvIHJlZHVjZSBleHBhbnNpb24gZWZmZWN0IG9mIENvbmNlcnQgU291bmQgYW5kIGNvcnJlY3Qgdm9sdW1lCiAgICAgICAgICAqIGRpZmZlcmVuY2VzIGZvciBkaWZmZXJlbmNlIHNldHRpbmdzLiBOb3QgYXBwbGllZCBpbiB0ZXN0IG1vZGVzCkBAIC0zNzYsMTcgKzQyNiwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXRfU3RlcmVvX01jKHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQogICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShjaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgIC8qIEFsbCBDaGFubmVscyovCisjZWxzZQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2OTg5MmI2Li5mOTRkNGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC02NSw3ICs2NSw3IEBACiAgICAgLyogRmlsdGVyICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwogI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwogICAgIC8qIEZpbHRlciAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCmluZGV4IGUxNTRlMjkuLmExZmI0OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKQEAgLTc0LDEwICs3NCwxOCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODgyMDBfQTEsCisgICAgIENTX01JRERMRV84ODIwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfOTYwMDBfQTEsCiAgICAgIENTX01JRERMRV85NjAwMF9CMSwKICAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTc2NDAwX0ExLAorICAgICBDU19NSURETEVfMTc2NDAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCiAgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCkBAIC0xNDQsMTIgKzE1MiwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgLAorICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODgyMDBfQTEsCisgICAgIENTX1NJREVfODgyMDBfQTIsCisgICAgIENTX1NJREVfODgyMDBfQjEsCisgICAgIENTX1NJREVfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAogICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzk2MDAwX0ExLAogICAgICBDU19TSURFXzk2MDAwX0EyLAogICAgICBDU19TSURFXzk2MDAwX0IxLAogICAgICBDU19TSURFXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTc2NDAwX0ExLAorICAgICBDU19TSURFXzE3NjQwMF9BMiwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCisgICAgIENTX1NJREVfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCiAgICAgIENTX1NJREVfMTkyMDAwX0EyLApAQCAtMjIzLDEyICsyNDMsMjQgQEAKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTI5NCwxMiArMzI2LDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTMyNiw3ICszNzAsMTIgQEAKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzkyLDEyICs0NDEsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTX1JFVkVSQl84ODIwMF9BMCwgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84ODIwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0EyLAorICAgICBDU19SRVZFUkJfODgyMDBfQjEsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAogICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCiAgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTc2NDAwX0ExLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0EyLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IxLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKQEAgLTUwOSwyMiArNTcwLDI2IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODgyMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTc2NDAwICAgIDMyNzU5ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzExXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczIyMDUwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyNDAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0ODAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE5MjAwMAorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCkBAIC01NDUsMTcgKzYxMCwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxMV0gPSB7ODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLQkJCQkJCQkJCQkJICAxMjAwMCwKLQkJCQkJCQkJCQkJICAxNjAwMCwKLQkJCQkJCQkJCQkJICAyMjA1MCwKLQkJCQkJCQkJCQkJICAyNDAwMCwKLQkJCQkJCQkJCQkJICAzMjAwMCwKLQkJCQkJCQkJCQkJICA0NDEwMCwKLQkJCQkJCQkJCQkJICA0ODAwMCwKLQkJCQkJCQkJCQkJICA5NjAwMCwKLQkJCQkJCQkJCQkJICAxOTIwMDAKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2NlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBlZmZlY3RzCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsdm10ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbImx2bXRlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAic25yIiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisKKyAgICBzcmNzOiBbInNuci5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk3YWNjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwxMzIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK21tIC1qCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CisKKyMgbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2x2bVRlc3QiCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJ0ZXN0aW5nIGx2bSIKK2FkYiBzaGVsbCBta2RpciAtcCAkdGVzdGRpcgorYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworRV9WQUw9MQoraWYgWyAteiAiJDEiIF0KK3RoZW4KKyAgICBjbWRzPSgiYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm02NC9sdm10ZXN0ICR0ZXN0ZGlyIgorICAgICAgICAgICJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybS9sdm10ZXN0ICR0ZXN0ZGlyIgorICAgICAgICAgKQorZWxpZiBbICIkMSIgPT0gIjMyIiBdCit0aGVuCisgICAgY21kcz0iYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm0vbHZtdGVzdCAkdGVzdGRpciIKK2VsaWYgWyAiJDEiID09ICI2NCIgXQordGhlbgorICAgIGNtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL2x2bXRlc3QvYXJtNjQvbHZtdGVzdCAkdGVzdGRpciIKK2Vsc2UKKyAgICBlY2hvICIiCisgICAgZWNobyAiSW52YWxpZCBcInZhbFwiIgorICAgIGVjaG8gIlVzYWdlOiIKKyAgICBlY2hvICIgICAgICAiJDAiIFt2YWxdIgorICAgIGVjaG8gIiAgICAgIHdoZXJlLCB2YWwgY2FuIGJlIGVpdGhlciAzMiBvciA2NC4iCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgICAgIElmIHZhbCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBiaW5hcmllcyIKKyAgICBlY2hvICIgICAgICBhcmUgdGVzdGVkLiIKKyAgICBleGl0ICRFX1ZBTAorZmkKKworZmxhZ3NfYXJyPSgKKyAgICAiLWNzRSIKKyAgICAiLWVxRSIKKyAgICAiLXRFIgorICAgICItY3NFIC10RSAtZXFFIgorICAgICItYkUgLU0iCisgICAgIi1jc0UgLXRFIgorICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKKyAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCisgICAgIi10RSAtZXFFIC12Y0JhbDo5NiAtTSIKKyAgICAiLXRFIC1lcUUgLXZjQmFsOi05NiAtTSIKKyAgICAiLXRFIC1lcUUgLXZjQmFsOjAgLU0iCisgICAgIi10RSAtZXFFIC1iRSAtdmNCYWw6MzAgLU0iCispCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2Vycm9yX2NvdW50PTAKK2ZvciBjbWQgaW4gIiR7Y21kc1tAXX0iCitkbworICAgICRjbWQKKyAgICBmb3IgZmxhZ3MgaW4gIiR7ZmxhZ3NfYXJyW0BdfSIKKyAgICBkbworICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi4yMn0KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC1vOiR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyAtY2hNYXNrOiRjaE1hc2sgLWZzOiRmcyAkZmxhZ3MKKworICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisKKworICAgICAgICAgICAgICAgICMgdHdvIGNoYW5uZWwgZmlsZXMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBoaWdoZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgICAgICMgRG8gbm90IGNvbXBhcmUgY2FzZXMgd2hlcmUgLWJFIGlzIGluIGZsYWdzIChkdWUgdG8gbW9ubyBjb21wdXRhdGlvbikKKyAgICAgICAgICAgICAgICBpZiBbWyAkZmxhZ3MgIT0gKiItYkUiKiBdXSAmJiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgZWxpZiBbWyAkZmxhZ3MgPT0gKiItYkUiKiBdXSAmJiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9zbnIgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IC10aHI6OTAuMzA4OTk4CisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgYm90aCBjbXAgYW5kIHNuciByZXR1cm4gRVhJVF9GQUlMVVJFIG9uIG1pc21hdGNoLgorICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgIGRvbmUKKyAgICBkb25lCitkb25lCisKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgorZWNobyAiJGVycm9yX2NvdW50IGVycm9ycyIKK2V4aXQgJGVycm9yX2NvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNThkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcApAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICBkbyB7ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFwKK30KKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RydWN0IGx2bUNvbmZpZ1BhcmFtc190IHsKKyAgaW50ICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgICAgPSA0NDEwMDsKKyAgaW50ICAgICAgICAgICAgICBuckNoYW5uZWxzICAgICAgPSAyOworICBpbnQgICAgICAgICAgICAgIGNoTWFzayAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgaW50ICAgICAgICAgICAgICB2Y0JhbCAgICAgICAgICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZDaGFubmVscyAgICAgICA9IDI7CisgIGJvb2wgICAgICAgICAgICAgbW9ub01vZGUgICAgICAgID0gZmFsc2U7CisgIGludCAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsID0gMDsKKyAgaW50ICAgICAgICAgICAgICBlcVByZXNldExldmVsICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICAgICA9IDI1NjsKKyAgTFZNX0JFX01vZGVfZW4gICBiYXNzRW5hYmxlICAgICAgPSBMVk1fQkVfT0ZGOworICBMVk1fVEVfTW9kZV9lbiAgIHRyZWJsZUVuYWJsZSAgICA9IExWTV9URV9PRkY7CisgIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgICAgICAgID0gTFZNX0VRTkJfT0ZGOworICBMVk1fTW9kZV9lbiAgICAgIGNzRW5hYmxlICAgICAgICA9IExWTV9NT0RFX09GRjsKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBsdm1Db25maWdDaE1hc2tbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICgxIDw8IDQpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgKDEgPDwgNSkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICgxIDw8IDYpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICgxIDw8IDcpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgKDEgPDwgOCkgLSAxLAorfTsKKworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgIHByaW50ZigiXG5Vc2FnZTogIik7CisgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8aW5wdXRmaWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaE1hc2s6PGNoYW5uZWxfbWFzaz5cbiIpOworICBwcmludGYoIlxuICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX09VVF9NT05PIik7CisgIHByaW50ZigiXG4gICAgICAgICAxICAtIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIpOworICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDQgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCIpOworICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EIik7CisgIHByaW50ZigiXG4gICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAxMCAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDEyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNSBjaDogKDEgPDwgNSkgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxMyAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgMTUgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE2IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgMTggLSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxOSAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDcgY2g6ICgxIDw8IDcpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAyMSAtIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDIyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgOCBjaDogKDEgPDwgOCkgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLXZjQmFsOjxMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiBbLTk2IHRvIDk2IGRCXT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgIC12ZSB2YWx1ZXMgcmVkdWNlIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtTSIpOworICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgIHByaW50ZigiXG4gICAgIC1iYXNzbHZsOjxlZmZlY3RfbGV2ZWw+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEEgdmFsdWUgdGhhdCByYW5nZXMgYmV0d2VlbiAlZCAtICVkIGRlZmF1bHQgMCIsIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwsCisgICAgTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCk7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7CisgIGNvbnN0IHNpemVfdCBudW1QcmVzZXRMdmxzICA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgJXp1IC0gJXMiLCBpLCBnRXF1YWxpemVyUHJlc2V0c1tpXS5uYW1lKTsKKyAgfQorICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gMCIpOworICBwcmludGYoIlxuICAgICAtYkUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtdEUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY3NFICIpOworICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZnJlZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX01lbVRhYl90IE1lbVRhYjsKKworICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190ICpwYXJhbXMpIHsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgeworICAgIEFMT0dWKAorICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgfQorCisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOworICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCisgICAqIHRoYXQgd2VyZQorICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAqLworICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgIC8qIEluaXRpYWxpc2UgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIHBhcmFtcy0+Q2hNYXNrICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICBwYXJhbXMtPkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOworCisgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09OOworICBwYXJhbXMtPkVRTkJfTkJhbmRzID0gRklWRUJBTkRfTlVNQkFORFM7CisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKworICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT047CisgIHBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgIHBhcmFtcy0+QkVfSFBGID0gTFZNX0JFX0hQRl9PTjsKKworICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisKKyAgLyogVEUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgQUxPR1YoCisgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgIgorICAgICAgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgLyogU2V0IHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggPSA0OTk5OworICBIZWFkcm9vbUJhbmREZWZbMF0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoID0gMjQwMDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gJkhlYWRyb29tQmFuZERlZlswXTsKKyAgSGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IExWTV9IRUFEUk9PTV9PTjsKKyAgSGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOworCisgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSGVhZHJvb21QYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgQUxPR1YoCisgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgIgorICAgICAgIkxWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IEVuZCIpOworICByZXR1cm4gMDsKK30gLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCisKK2ludCBsdm1DcmVhdGUoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgKnBhcmFtcykgeworICBpbnQgcmV0ID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSAoQnVuZGxlZEVmZmVjdENvbnRleHQgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBCdW5kbGVkRWZmZWN0Q29udGV4dCkpOworICBpZiAoTlVMTCA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KSB7CisgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgPSBMVk1fVFJVRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lID0gMDsKKworICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUKKyAgICogc2V0IHRvIHRoZSBnZXQKKyAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsCisgICAqIGF2b2lkCisgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IC0xOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9IDA7CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgIWRlZmluZWQoTkFUSVZFX0ZMT0FUX0JVRkZFUikKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9IE5VTEw7CisjZW5kaWYKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgfQorICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOworICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCwgcGFyYW1zKTsKKworICBpZiAocmV0IDwgMCkgeworICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IGx2bUNyZWF0ZSgpIEJ1bmRsZSBpbml0IGZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1Db250cm9sKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgKnBhcmFtcykgeworICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisKKyAgcGFyYW1zLT5DaE1hc2sgICAgID0gcGx2bUNvbmZpZ1BhcmFtcy0+Y2hNYXNrOworICBwYXJhbXMtPk5yQ2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDEpIHsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICB9IGVsc2UgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA9PSAyKSB7CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICB9IGVsc2UgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA+IDIgJiYgcGFyYW1zLT5OckNoYW5uZWxzIDw9IDgpIHsgLy8gRkNDXzIgRkNDXzgKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIExWTV9Gc19lbiBzYW1wbGVSYXRlOworICBzd2l0Y2ggKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwMjU6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjQwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg4MjAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0KKyAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgIH0KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcUVuYWJsZTsKKyAvLyBDYXV0aW9uOiByYXcgcG9pbnRlciB0byBzdGFjayBkYXRhLCBzdG9yZWQgaW4gaW5zdGFuY2UgYnkgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzLgorICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IHBsdm1Db25maWdQYXJhbXMtPnZjQmFsOworCisgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPnRyZWJsZUVuYWJsZTsKKworICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT047CisKKyAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmJhc3NFbmFibGU7CisKKyAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgTHZtU3RhdHVzID0KKyAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBMdm1TdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOworCisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIHJldHVybiAwOworfQorCitpbnQgbHZtRXhlY3V0ZShmbG9hdCAqZmxvYXRJbiwgZmxvYXQgKmZsb2F0T3V0LCBzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcykgeworICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKKyAgcmV0dXJuCisgICAgICBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgZmxvYXRJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIGZsb2F0T3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVMZW5ndGgsIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCit9CisKK2ludCBsdm1NYWluUHJvY2VzcyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICpwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZpbnAsCisgICAgICAgICAgICAgICAgICAgRklMRSAqZm91dCkgeworICBpbnQgZXJyQ29kZSA9IGx2bUNvbnRyb2wocENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMsIHBQYXJhbXMpOworICBpZiAoZXJyQ29kZSkgeworICAgIEFMT0dFKCJFcnJvcjogbHZtQ29udHJvbCByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQorCisgIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKKyAgY29uc3QgaW50IGZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7ICAvLyBwcm9jZXNzaW5nIHNpemUKKyAgY29uc3QgaW50IGlvQ2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZkNoYW5uZWxzOworICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7IC8vIGZpbGUgbG9hZCBzaXplCisgIGNvbnN0IGludCBtYXhDaGFubmVsQ291bnQgPSBzdGQ6Om1heChjaGFubmVsQ291bnQsIGlvQ2hhbm5lbENvdW50KTsKKyAgLyoKKyAgICogTW9ubyBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0byAyIGNoYW5uZWxzIGludGVybmFsbHkgaW4gdGhlIHByb2Nlc3MgY2FsbAorICAgKiBieSBjb3B5aW5nIHRoZSBzYW1lIGRhdGEgaW50byB0aGUgc2Vjb25kIGNoYW5uZWwuCisgICAqIEhlbmNlIHdoZW4gY2hhbm5lbENvdW50IGlzIDEsIG91dHB1dCBidWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IKKyAgICogMiBjaGFubmVscy4gVGhlIG1lbUFsbG9jQ2hDb3VudCB0YWtlcyBjYXJlIG9mIGFsbG9jYXRpb24gb2Ygc3VmZmljaWVudAorICAgKiBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgKi8KKyAgY29uc3QgaW50IG1lbUFsbG9jQ2hDb3VudCA9IChjaGFubmVsQ291bnQgPT0gMSA/IDIgOiBjaGFubmVsQ291bnQpOworCisgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXQoZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdE91dChmcmFtZUxlbmd0aCAqIG1lbUFsbG9jQ2hDb3VudCk7CisKKyAgaW50IGZyYW1lQ291bnRlciA9IDA7CisgIHdoaWxlIChmcmVhZChpbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZmlucCkgPT0gKHNpemVfdClmcmFtZUxlbmd0aCkgeworICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKGluLmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIGluLmRhdGEoKSwgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdEluLmRhdGEoKSwgaW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAvLyBCYXNzIEJvb3N0LCB3aGljaCBleHRyYWN0cyBhIG1vbm8gc2lnbmFsIGZvciBwcm9jZXNzaW5nLgorICAgIGlmIChwbHZtQ29uZmlnUGFyYW1zLT5tb25vTW9kZSAmJiBjaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXV0byAqZnAgPSAmZmxvYXRJbltpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAvLyByZXBsaWNhdGUgY2ggMAorICAgICAgICB9CisgICAgfQorI2lmbmRlZiBCWVBBU1NfRVhFQworICAgIGVyckNvZGUgPSBsdm1FeGVjdXRlKGZsb2F0SW4uZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zKTsKKyAgICBpZiAoZXJyQ29kZSkgeworICAgICAgcHJpbnRmKCJcbkVycm9yOiBsdm1FeGVjdXRlIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgfQorCisgICAgKHZvaWQpZnJhbWVTaXplOyAvLyBlbGltaW5hdGUgd2FybmluZworI2Vsc2UKKyAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgIH0KKyAgICAodm9pZCkgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZm91dCk7CisgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGx2bUNvbmZpZ1BhcmFtc190IGx2bUNvbmZpZ1BhcmFtc3t9OyAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgY29uc3QgY2hhciAqaW5maWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqb3V0ZmlsZSA9IG51bGxwdHI7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWk6IiwgMykpIHsKKyAgICAgIGluZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1vOiIsIDMpKSB7CisgICAgICBvdXRmaWxlID0gYXJndltpXSArIDM7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZzOiIsIDQpKSB7CisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZFxuIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2hNYXNrOiIsIDgpKSB7CisgICAgICBjb25zdCBpbnQgY2hNYXNrQ29uZmlnSWR4ID0gYXRvaShhcmd2W2ldICsgOCk7CisgICAgICBpZiAoY2hNYXNrQ29uZmlnSWR4IDwgMCB8fCAoc2l6ZV90KWNoTWFza0NvbmZpZ0lkeCA+PSBzdGQ6OnNpemUobHZtQ29uZmlnQ2hNYXNrKSkgeworICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgQ2hhbm5lbCBNYXNrIDogJWRcbiIsIGNoTWFza0NvbmZpZ0lkeCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IGx2bUNvbmZpZ0NoTWFza1tjaE1hc2tDb25maWdJZHhdOworICAgICAgbHZtQ29uZmlnUGFyYW1zLmNoTWFzayA9IGNoTWFzazsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXZjQmFsOiIsIDcpKSB7CisgICAgICBjb25zdCBpbnQgdmNCYWxhbmNlID0gYXRvaShhcmd2W2ldICsgNyk7CisgICAgICBpZiAodmNCYWxhbmNlID4gOTYgfHwgdmNCYWxhbmNlIDwgLTk2KSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCB2b2x1bWUgYmFsYW5jZSB2YWx1ZTogJWRcbiIsIHZjQmFsYW5jZSk7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMudmNCYWwgPSB2Y0JhbGFuY2U7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgeworICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOworICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgeworICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBmaWxlIGNoYW5uZWxzIDogJWRcbiIsIGZDaGFubmVscyk7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICB9CisgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBmQ2hhbm5lbHM7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIi1NIikpIHsKKyAgICAgICAgICBsdm1Db25maWdQYXJhbXMubW9ub01vZGUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1iYXNzbHZsOiIsIDkpKSB7CisgICAgICBjb25zdCBpbnQgYmFzc0VmZmVjdExldmVsID0gYXRvaShhcmd2W2ldICsgOSk7CisgICAgICBpZiAoYmFzc0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCB8fCBiYXNzRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsCisgICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgeworICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7CisgICAgICBjb25zdCBpbnQgbnVtUHJlc2V0THZscyA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+PSBudW1QcmVzZXRMdmxzIHx8IGVxUHJlc2V0TGV2ZWwgPCAwKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWJFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRW5hYmxlID0gTFZNX0JFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWNzRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuY3NFbmFibGUgPSBMVk1fTU9ERV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChpbmZpbGUgPT0gbnVsbHB0ciB8fCBvdXRmaWxlID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkVycm9yOiBtaXNzaW5nIGlucHV0L291dHB1dCBmaWxlc1xuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEZJTEUgKmZpbnAgPSBmb3BlbihpbmZpbGUsICJyYiIpOworICBpZiAoZmlucCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzIiwgaW5maWxlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7CisgIGlmIChmb3V0ID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzIiwgb3V0ZmlsZSk7CisgICAgZmNsb3NlKGZpbnApOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEVmZmVjdENvbnRleHQgY29udGV4dDsKKyAgTFZNX0NvbnRyb2xQYXJhbXNfdCBwYXJhbXM7CisgIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCAmbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgaWYgKGVyckNvZGUgPT0gMCkgeworICAgIGVyckNvZGUgPSBsdm1NYWluUHJvY2VzcygmY29udGV4dCwgJnBhcmFtcywgJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7CisgICAgaWYgKGVyckNvZGUgIT0gMCkgeworICAgICAgcHJpbnRmKCJFcnJvcjogbHZtTWFpblByb2Nlc3MgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIixlcnJDb2RlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJFcnJvcjogbHZtQ3JlYXRlIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsIGVyckNvZGUpOworICB9CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZvdXQpOworICAvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyAqLworICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQgIT0gbnVsbHB0cikgeworICAgIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IG51bGxwdHIpIHsKKyAgICAgIEx2bUVmZmVjdF9mcmVlKCZjb250ZXh0KTsKKyAgICB9CisgICAgZnJlZShjb250ZXh0LnBCdW5kbGVkQ29udGV4dCk7CisgIH0KKworICBpZiAoZXJyQ29kZSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTk5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEEgPSBmbG9hdD4KK3N0ZDo6cGFpcjxBLCBBPiBnZXRTaWduYWxOb2lzZShGSUxFICpmaW5wLCBGSUxFICpmcmVmKSB7CisgIGNvbnN0ZXhwciBzaXplX3QgZnJhbWVzaXplID0gMjU2OworICBzdGQ6OnZlY3RvcjxUPiBpbihmcmFtZXNpemUpOworICBzdGQ6OnZlY3RvcjxUPiByZWYoZnJhbWVzaXplKTsKKyAgQSBzaWduYWx7fTsKKyAgQSBub2lzZXt9OworCisgIGZvciAoOzspIHsKKyAgICBzaXplX3QgcmVhZF9zYW1wbGVzX2luID0gZnJlYWQoJmluWzBdLCBzaXplb2YoVCksIGZyYW1lc2l6ZSwgZmlucCk7CisgICAgY29uc3Qgc2l6ZV90IHJlYWRfc2FtcGxlc19yZWYgPSBmcmVhZCgmcmVmWzBdLCBzaXplb2YoVCksIGZyYW1lc2l6ZSwgZnJlZik7CisgICAgaWYgKHJlYWRfc2FtcGxlc19pbiAhPSByZWFkX3NhbXBsZXNfcmVmKSB7CisgICAgICBwcmludGYoImZpbGUgc2l6ZXMgZG8gbm90IG1hdGNoIChsYXN0ICV6dSAlenUpIiwgcmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICAgIHJlYWRfc2FtcGxlc19pbiA9IHN0ZDo6bWluKHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgfQorICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gPT0gMCkgeworICAgICAgICByZXR1cm4geyBzaWduYWwsIG5vaXNlIH07CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZF9zYW1wbGVzX2luOyArK2kpIHsKKyAgICAgICBjb25zdCBBIHZhbHVlKHJlZltpXSk7CisgICAgICAgY29uc3QgQSBkaWZmKEEoaW5baV0pIC0gdmFsdWUpOworICAgICAgIHNpZ25hbCArPSB2YWx1ZSAqIHZhbHVlOworICAgICAgIG5vaXNlICs9IGRpZmYgKiBkaWZmOworICAgIH0KKyAgfQorfQorCit2b2lkIHByaW50VXNhZ2UoKSB7CisgIHByaW50ZigiXG5Vc2FnZTogIik7CisgIHByaW50ZigiXG4gICAgIHNuciA8cmVmX2ZpbGU+IDx0ZXN0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxyZWZfZmlsZT4gIGlzIHRoZSByZWZlcmVuY2UgZmlsZSBuYW1lIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCB3aWxsIGJlIHRha2VuIGFzIHB1cmUgc2lnbmFsIik7CisgIHByaW50ZigiXG4gICAgIDx0ZXN0X2ZpbGU+IGlzIHRlc3QgZmlsZSBmb3Igc25yIGNhbGN1bGF0aW9uIik7CisgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtcGNtX2Zvcm1hdDo8cGNtIGZvcm1hdCBvZiBpbnB1dCBmaWxlcz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAtIDE2IGJpdCBwY20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIDMyIGJpdCBmbG9hdCIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLXRocjo8dGhyZXNob2xkIHZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gbmVnYXRpdmUgaW5maW5pdHlcblxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPCAzKSB7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgcGNtX2Zvcm1hdCA9IDA7CisgIGZsb2F0IHRociA9IC0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgIEZJTEUgKmZyZWYgPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKKyAgRklMRSAqZmlucCA9IGZvcGVuKGFyZ3ZbMl0sICJyYiIpOworICBmb3IgKGludCBpID0gMzsgaSA8IGFyZ2M7IGkrKykgeworICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXBjbV9mb3JtYXQ6IiwgMTIpKSB7CisgICAgICBwY21fZm9ybWF0ID0gYXRvaShhcmd2W2ldICsgMTIpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi10aHI6IiwgNSkpIHsKKyAgICAgIHRociA9IGF0b2YoYXJndltpXSArIDUpOworICAgIH0KKyAgfQorICBpZiAoZmlucCA9PSBudWxscHRyIHx8IGZyZWYgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiXG5FcnJvcjogbWlzc2luZyBpbnB1dC9yZWZlcmVuY2UgZmlsZXNcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworICBhdXRvIHNuID0gcGNtX2Zvcm1hdCA9PSAwCisgICAgICA/IGdldFNpZ25hbE5vaXNlPHNob3J0PihmaW5wLCBmcmVmKQorICAgICAgOiBnZXRTaWduYWxOb2lzZTxmbG9hdD4oZmlucCwgZnJlZik7CisgIGlmIChzbi5maXJzdCA+IDAuZiAmJiBzbi5zZWNvbmQgPiAwLmYpIHsKKyAgICBmbG9hdCBzbnIgPSAxMC5mICogbG9nKHNuLmZpcnN0IC8gc24uc2Vjb25kKTsKKyAgICAvLyBjb21wYXJlIHRoZSBtZWFzdXJlZCBzbnIgdmFsdWUgd2l0aCB0aHJlc2hvbGQKKyAgICBpZiAoc25yIDwgdGhyKSB7CisgICAgICBwcmludGYoIiUuNmYgbGVzcyB0aGFuIHRocmVzaG9sZCAlLjZmXG4iLCBzbnIsIHRocik7CisgICAgICByZXQgPSBFWElUX0ZBSUxVUkU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiJS42ZlxuIiwgc25yKTsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZnJlZik7CisKKyAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZhMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODkgQEAKKy8vIFRoZSB3cmFwcGVyIC1EQlVJTERfRkxPQVQgbmVlZHMgdG8gbWF0Y2gKKy8vIHRoZSBsdm0gbGlicmFyeSAtREJVSUxEX0ZMT0FULgorCisvLyBtdXNpYyBidW5kbGUgd3JhcHBlcgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJidW5kbGV3cmFwcGVyIiwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJCdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibXVzaWNidW5kbGUiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiQnVuZGxlIl0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCit9CisKKy8vIHJldmVyYiB3cmFwcGVyCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnJldmVyYndyYXBwZXIiLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIlJldmVyYi9FZmZlY3RSZXZlcmIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnJldmVyYiJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJSZXZlcmIiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZGJjMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBUaGUgd3JhcHBlciAtREJVSUxEX0ZMT0FUIG5lZWRzIHRvIG1hdGNoCi0jIHRoZSBsdm0gbGlicmFyeSAtREJVSUxEX0ZMT0FULgotCi0jIG11c2ljIGJ1bmRsZSB3cmFwcGVyCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9BUk1fTU9ERSA6PSBhcm0KLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGliYnVuZGxld3JhcHBlcgotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlibXVzaWNidW5kbGUKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgICBsaWJjdXRpbHMgXAotICAgICBsaWJkbCBcCi0gICAgIGxpYmxvZyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCSQoTE9DQUxfUEFUSCkvQnVuZGxlIFwKLQkkKExPQ0FMX1BBVEgpLy4uL2xpYi9Db21tb24vbGliLyBcCi0JJChMT0NBTF9QQVRIKS8uLi9saWIvQnVuZGxlL2xpYi8gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLSMgcmV2ZXJiIHdyYXBwZXIKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9BUk1fTU9ERSA6PSBhcm0KLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLURCVUlMRF9GTE9BVCAtREhJR0hFUl9GUwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJid3JhcHBlcgotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlicmV2ZXJiCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICBsaWJhdWRpb3V0aWxzIFwKLSAgICAgbGliY3V0aWxzIFwKLSAgICAgbGliZGwgXAotICAgICBsaWJsb2cgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKExPQ0FMX1BBVEgpL1JldmVyYiBcCi0gICAgJChMT0NBTF9QQVRIKS8uLi9saWIvQ29tbW9uL2xpYi8gXAotICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL1JldmVyYi9saWIvIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKLQotTE9DQUxfU0FOSVRJWkUgOj0gaW50ZWdlcl9vdmVyZmxvdwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCAwNGMyNjkyLi4zZmJiYzA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKICAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKICAgICB7Ci0gICAgICAgICNpZmRlZiBMVk1fUENNCisjaWZkZWYgTFZNX1BDTQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgICNlbmRpZgorI2VuZGlmCiAKIAogICAgICAgICAvLyBDbGVhciB0aGUgU2Vzc2lvbkluZGV4CkBAIC02NTAsNiArNjUwLDkgQEAKICAgICBwYXJhbXMuU3BlYWtlclR5cGUgICAgICAgICAgICA9IExWTV9IRUFEUEhPTkVTOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KICAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7CkBAIC02OTUsNiArNjk4LDExIEBACiAgICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOwogICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwYXJhbXMuTnJDaGFubmVscyAgICAgICAgICAgICA9CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHBhcmFtcy5DaE1hc2sgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworI2VuZGlmCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKQEAgLTc1MSwxOSArNzU5LDIxIEBACiAKICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICAgICAqcE91dFRtcDsKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fApAQCAtNzg0LDcgKzc5NCw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03OTgsMTMgKzgwOCwxNSBAQAogCiAjaWZkZWYgTFZNX1BDTQogICAgIGZ3cml0ZShwSW4sCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAjZW5kaWYKIAogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBOckNoYW5uZWxzKTsKIAogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwpAQCAtODE0LDcgKzgyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCiAKICAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICNlbHNlCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwpAQCAtODI5LDEyICs4NDEsMTQgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocE91dFRtcCwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscywKKyAgICAgICAgICAgMSwKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogTnJDaGFubmVsczsgaSsrKSB7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CiAjZWxzZQpAQCAtMTE5OCwxMyArMTIxMiw3IEBACiAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIKICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKQEAgLTEyMzgsNDUgKzEyNDYsNTggQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworI2Vsc2UKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyNlbmRpZgogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CisgICAgY29uc3QgTFZNX0lOVDE2IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjIwNTA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDQxMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4ODIwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTkyMDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAgKiBOckNoYW5uZWxzOwogICAgICAgICBicmVhazsKICNlbmRpZgogICAgIGRlZmF1bHQ6CkBAIC0xMjg0LDcgKzEzMDUsMTIgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUgfHwKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrICE9IHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKSB7CisjZWxzZQogICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSl7CisjZW5kaWYKIAogICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7CiAgICAgICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOwpAQCAtMTMwMCwxMSArMTMyNiwxOSBAQAogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQWN0aXZlUGFyYW1zLk5yQ2hhbm5lbHMgPSBOckNoYW5uZWxzOworICAgICAgICBBY3RpdmVQYXJhbXMuQ2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7CisjZW5kaWYKKwogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVmZmVjdF9zZXRDb25maWciKQogICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkNoTWFzayA9IHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwogCkBAIC0xNTA0LDYgKzE1MzgsNyBAQAogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgIC8vIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOiAgLy8gRm9yIFVTQiB0ZXN0aW5nIG9mIHRoZSB2aXJ0dWFsaXplciBvbmx5LgogICAgICAgICByZXR1cm4gMDsKICAgICBkZWZhdWx0IDoKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTI2LDEwICsxNTYxLDkgQEAKIGludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ18yKSB7IC8vIFRPRE86IHVwZGF0ZSB0byA4IGNoYW5uZWxzIHdoZW4gc3VwcG9ydGVkLgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0KICAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKIH0KIApAQCAtMzIyMiw2ICszMjU2LDcgQEAKICAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwogICAgIGludCAgICBzdGF0dXMgPSAwOwogICAgIGludCAgICBwcm9jZXNzU3RhdHVzID0gMDsKKyAgICBjb25zdCBpbnQgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IEVuYWJsZWQgPSAlZCAgICAgQ2FsbGVkID0gJWQgKCU4ZCAlOGQgJThkKSIsCiAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCkBAIC0zMjUyLDcgKzMyODcsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBCQVNTX0JPT1NULCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIpOwogICAgICAgICB9CkBAIC0zMjcyLDcgKzMzMDcsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgRVFVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOwogICAgICAgICB9CkBAIC0zMjg2LDcgKzMzMjEsOCBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0KKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0KTsKICAgICAgICAgfQpAQCAtMzMzNyw3ICszMzczLDcgQEAKICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAKICAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBGQ0NfMjsgKytpKXsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsgKytpKSB7CiAjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCA2YmYwNDVkLi42YWY0NTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0QnVmZmVyOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmZXI7CiAjZW5kaWYKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2s7CisjZW5kaWYKIH07CiAKIC8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IGUxYzAzZjkuLjYwMmY2MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtNjEyLDEzICs2MTIsNyBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0KICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGZyZWUoKSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJSIgUFJJdTMyICIgYnl0ZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCkBAIC02ODEsOSArNjc1LDE1IEBACiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwogICAgICAgICBicmVhazsKQEAgLTE3NTcsMTUgKzE3NTcsMTQgQEAKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6Ci0gICAgICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gMDsKICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOwogICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFTlNJVFkgVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICoodWludDMyX3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgogICAgICAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMDsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgogICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDA7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3NjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIGF1ZGlvIHByZXByb2Nlc3Npbmcgd3JhcHBlcgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorCisgICAgdmVuZG9yOiB0cnVlLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmcuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL3dlYnJ0YyIsCisgICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvYXVkaW9fcHJvY2Vzc2luZy9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYnNwZWV4cmVzYW1wbGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURXRUJSVENfUE9TSVgiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4ZGE4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIGF1ZGlvIHByZXByb2Nlc3Npbmcgd3JhcHBlcgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wcmVwcm9jZXNzaW5nCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBQcmVQcm9jZXNzaW5nLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBleHRlcm5hbC93ZWJydGMgXAotICAgIGV4dGVybmFsL3dlYnJ0Yy93ZWJydGMvbW9kdWxlcy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC93ZWJydGMvd2VicnRjL21vZHVsZXMvYXVkaW9fcHJvY2Vzc2luZy9pbmNsdWRlIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlid2VicnRjX2F1ZGlvX3ByZXByb2Nlc3NpbmcgXAotICAgIGxpYnNwZWV4cmVzYW1wbGVyIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLSAgICAtRFdFQlJUQ19QT1NJWAotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggZjI4NDRlZC4uNWZhYjViZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtNjk4LDYgKzY5OCw3IEBACiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgogICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmRpc2FibGUoZWZmZWN0KTsKICAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgogICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6CiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKQEAgLTg4OSw3ICs4OTAsNyBAQAogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cHJvY0ZyYW1lOwogICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUgPSBOVUxMOwogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+YXBtOwotICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOworICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOyAvLyBOT0xJTlQoY2xhbmctYW5hbHl6ZXItY3BsdXNwbHVzLk5ld0RlbGV0ZSkKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTkyNSw3ICs5MjYsNyBAQAogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cmV2QnVmOwogICAgICAgICBzZXNzaW9uLT5yZXZCdWYgPSBOVUxMOwogCi0gICAgICAgIHNlc3Npb24tPmlvID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+aWQgPSAwOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTE1NCw3ICsxMTU1LDcgQEAKIHsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fU0VTU0lPTlM7IGkrKykgewotICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlvID09IGlvSWQpIHsKKyAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pZCA9PSBzZXNzaW9uSWQpIHsKICAgICAgICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uY3JlYXRlZE1zayAmICgxIDw8IHByb2NJZCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTExNjIsNyArMTE2Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX1NFU1NJT05TOyBpKyspIHsKLSAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pbyA9PSAwKSB7CisgICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uaWQgPT0gMCkgewogICAgICAgICAgICAgc1Nlc3Npb25zW2ldLmlkID0gc2Vzc2lvbklkOwogICAgICAgICAgICAgc1Nlc3Npb25zW2ldLmlvID0gaW9JZDsKICAgICAgICAgICAgIHJldHVybiAmc1Nlc3Npb25zW2ldOwpAQCAtMTkxNCw3ICsxOTE1LDcgQEAKICAgICBzdGF0dXMgPSBTZXNzaW9uX0NyZWF0ZUVmZmVjdChzZXNzaW9uLCBwcm9jSWQsIHBJbnRlcmZhY2UpOwogCiAgICAgaWYgKHN0YXR1cyA8IDAgJiYgc2Vzc2lvbi0+Y3JlYXRlZE1zayA9PSAwKSB7Ci0gICAgICAgIHNlc3Npb24tPmlvID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+aWQgPSAwOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMTkyOCw3ICsxOTI5LDcgQEAKIAogICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4ID0gKHByZXByb2NfZWZmZWN0X3QgKilpbnRlcmZhY2U7CiAKLSAgICBpZiAoZngtPnNlc3Npb24tPmlvID09IDApIHsKKyAgICBpZiAoZngtPnNlc3Npb24tPmlkID09IDApIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHJldHVybiBTZXNzaW9uX1JlbGVhc2VFZmZlY3QoZngtPnNlc3Npb24sIGZ4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFiYjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZWZmZWN0cHJveHkiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsiRWZmZWN0UHJveHkuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeSJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW9lZmZlY3RzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZWZmZWN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkZTMwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEU6PSBsaWJlZmZlY3Rwcm94eQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgICAgICBFZmZlY3RQcm94eS5jcHAKLQotTE9DQUxfQ0ZMQUdTKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmRsIGxpYmVmZmVjdHMKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgICAgIHN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggNzA0MDlkZS4uMzVlMmYzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTksNiArOSw3IEBACiAKIExPQ0FMX0NGTEFHUys9IC1PMiAtZnZpc2liaWxpdHk9aGlkZGVuCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfRkxPQVQgLURTVVBQT1JUX01DCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCkBAIC0xOSw3ICsyMCw4IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDgwN2YyNGQuLmY4Mzg4OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTI0LDExICsyNCwyMyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gbWF4CiAjaW5jbHVkZSA8bmV3PgogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiBleHRlcm4gIkMiIHsKIApAQCAtMTQzLDEwICsxNTUsMTUgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzgpIHJldHVybiAtRUlOVkFMOworI2Vsc2UKKyAgICBpZiAoY2hhbm5lbENvdW50ICE9IEZDQ18yKSByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBrUHJvY2Vzc0Zvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAKICAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC0xOTIsNyArMjA5LDcgQEAKIHsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjAwLDcgKzIxNyw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMzAxLDE1ICszMTgsOCBAQAogLy8tLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogaW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQorICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQogewogICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilzZWxmOwogCkBAIC0zMjQsNzEgKzMzNCwxMTggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZUxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQ7CisKICAgICAvLyBwZXJmb3JtIG1lYXN1cmVtZW50cyBpZiBuZWVkZWQKICAgICBpZiAocENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgJiBNRUFTVVJFTUVOVF9NT0RFX1BFQUtfUk1TKSB7CiAgICAgICAgIC8vIGZpbmQgdGhlIHBlYWsgYW5kIFJNUyBzcXVhcmVkIGZvciB0aGUgbmV3IGJ1ZmZlcgotICAgICAgICB1aW50MzJfdCBpbklkeDsKLSAgICAgICAgaW50MTZfdCBtYXhTYW1wbGUgPSAwOwogICAgICAgICBmbG9hdCBybXNTcUFjYyA9IDA7Ci0gICAgICAgIGZvciAoaW5JZHggPSAwIDsgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50IDsgaW5JZHgrKykgewotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gaW5CdWZmZXItPnMxNltpbklkeF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKC1pbkJ1ZmZlci0+czE2W2luSWR4XSA+IG1heFNhbXBsZSkgewotICAgICAgICAgICAgICAgIG1heFNhbXBsZSA9IC1pbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJtc1NxQWNjICs9IChpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdKTsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoaW5CdWZmZXItPmYzMltpbklkeF0pKTsKKyAgICAgICAgICAgIHJtc1NxQWNjICs9IGluQnVmZmVyLT5mMzJbaW5JZHhdICogaW5CdWZmZXItPmYzMltpbklkeF07CiAgICAgICAgIH0KKyAgICAgICAgbWF4U2FtcGxlICo9IDEgPDwgMTU7IC8vIHNjYWxlIHRvIGludDE2X3QsIHdpdGggZXhhY3RseSAxIDw8IDE1IHJlcHJlc2VudGluZyBwb3NpdGl2ZSBudW0uCisgICAgICAgIHJtc1NxQWNjICo9IDEgPDwgMzA7IC8vIHNjYWxlIHRvIGludDE2X3QgKiAyCisjZWxzZQorICAgICAgICBpbnQgbWF4U2FtcGxlID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gc3RkOjptYXgobWF4U2FtcGxlLCBzdGQ6OmFicyhpbnQzMl90KGluQnVmZmVyLT5zMTZbaW5JZHhdKSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPnMxNltpbklkeF0gKiBpbkJ1ZmZlci0+czE2W2luSWR4XTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIC8vIHN0b3JlIHRoZSBtZWFzdXJlbWVudAogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVBlYWtVMTYgPSAodWludDE2X3QpbWF4U2FtcGxlOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVJtc1NxdWFyZWQgPQotICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gKGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gc2FtcGxlTGVuOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubUlzVmFsaWQgPSB0cnVlOwogICAgICAgICBpZiAoKytwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID49IHBDb250ZXh0LT5tTWVhc3VyZW1lbnRXaW5kb3dTaXplSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGFsbCBjb2RlIGJlbG93IGFzc3VtZXMgc3RlcmVvIDE2IGJpdCBQQ00gb3V0cHV0IGFuZCBpbnB1dAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZmxvYXQgZnNjYWxlOyAvLyBtdWx0aXBsaWNhdGl2ZSBzY2FsZQorI2Vsc2UKICAgICBpbnQzMl90IHNoaWZ0OworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKICAgICBpZiAocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9OT1JNQUxJWkVEKSB7CiAgICAgICAgIC8vIGRlcml2ZSBjYXB0dXJlIHNjYWxpbmcgZmFjdG9yIGZyb20gcGVhayB2YWx1ZSBpbiBjdXJyZW50IGJ1ZmZlcgogICAgICAgICAvLyB0aGlzIGdpdmVzIG1vcmUgaW50ZXJlc3RpbmcgY2FwdHVyZXMgZm9yIGRpc3BsYXkuCi0gICAgICAgIHNoaWZ0ID0gMzI7Ci0gICAgICAgIGludCBsZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKSB7CisgICAgICAgICAgICAvLyB3ZSByZWNvbnN0cnVjdCB0aGUgYWN0dWFsIHN1bW1lZCB2YWx1ZSB0byBlbnN1cmUgcHJvcGVyIG5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGZvciBtdWx0aWNoYW5uZWwgb3V0cHV0cyAoY2hhbm5lbHMgPiAyIG1heSBvZnRlbiBiZSAwKS4KKyAgICAgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoc21wKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFNhbXBsZSA+IDAuZikgeworICAgICAgICAgICAgZnNjYWxlID0gMC45OWYgLyBtYXhTYW1wbGU7CisgICAgICAgICAgICBpbnQgZXhwOyAvLyB1bnVzZWQKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNpZ25pZmljYW5kID0gZnJleHAoZnNjYWxlLCAmZXhwKTsKKyAgICAgICAgICAgIGlmIChzaWduaWZpY2FuZCA9PSAwLjVmKSB7CisgICAgICAgICAgICAgICAgZnNjYWxlICo9IDI1NS5mIC8gMjU2LmY7IC8vIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2NhbGUgZG9lc24ndCBtYXR0ZXIsIHRoZSB2YWx1ZXMgYXJlIGFsbCAwLgorICAgICAgICAgICAgZnNjYWxlID0gMS5mOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpbnQzMl90IG9yQWNjdW0gPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbaV07CiAgICAgICAgICAgICBpZiAoc21wIDwgMCkgc21wID0gLXNtcCAtIDE7IC8vIHRha2UgY2FyZSB0byBrZWVwIHRoZSBtYXggbmVnYXRpdmUgaW4gcmFuZ2UKLSAgICAgICAgICAgIGludDMyX3QgY2x6ID0gX19idWlsdGluX2NseihzbXApOwotICAgICAgICAgICAgaWYgKHNoaWZ0ID4gY2x6KSBzaGlmdCA9IGNsejsKKyAgICAgICAgICAgIG9yQWNjdW0gfD0gc21wOwogICAgICAgICB9CisKICAgICAgICAgLy8gQSBtYXhpbXVtIGFtcGxpdHVkZSBzaWduYWwgd2lsbCBoYXZlIDE3IGxlYWRpbmcgemVyb3MsIHdoaWNoIHdlIHdhbnQgdG8KICAgICAgICAgLy8gdHJhbnNsYXRlIHRvIGEgc2hpZnQgb2YgOCAoZm9yIGNvbnZlcnRpbmcgMTYgYml0IHRvIDggYml0KQotICAgICAgICBzaGlmdCA9IDI1IC0gc2hpZnQ7CisgICAgICAgIHNoaWZ0ID0gMjUgLSBfX2J1aWx0aW5fY2x6KG9yQWNjdW0pOworCiAgICAgICAgIC8vIE5ldmVyIHNjYWxlIGJ5IGxlc3MgdGhhbiA4IHRvIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbC4KICAgICAgICAgaWYgKHNoaWZ0IDwgMykgewogICAgICAgICAgICAgc2hpZnQgPSAzOwogICAgICAgICB9CiAgICAgICAgIC8vIGFkZCBvbmUgdG8gY29tYmluZSB0aGUgZGl2aXNpb24gYnkgMiBuZWVkZWQgYWZ0ZXIgc3VtbWluZyBsZWZ0IGFuZCByaWdodCBjaGFubmVscyBiZWxvdwogICAgICAgICBzaGlmdCsrOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfSBlbHNlIHsKICAgICAgICAgYXNzZXJ0KHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfQVNfUExBWUVEKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAvLyBOb3RlOiBpZiBjaGFubmVscyBhcmUgdW5jb3JyZWxhdGVkLCAxL3NxcnQoTikgY291bGQgYmUgdXNlZCBhdCB0aGUgcmlzayBvZiBjbGlwcGluZy4KKyAgICAgICAgZnNjYWxlID0gMS5mIC8gcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICAvLyBhY2NvdW50IGZvciBzdW1taW5nIGFsbCB0aGUgY2hhbm5lbHMgdG9nZXRoZXIuCisjZWxzZQogICAgICAgICBzaGlmdCA9IDk7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICB1aW50MzJfdCBjYXB0SWR4OwogICAgIHVpbnQzMl90IGluSWR4OwogICAgIHVpbnQ4X3QgKmJ1ZiA9IHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZjsKICAgICBmb3IgKGluSWR4ID0gMCwgY2FwdElkeCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeDsKLSAgICAgICAgIGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICBpbklkeCsrLCBjYXB0SWR4KyspIHsKLSAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgewotICAgICAgICAgICAgLy8gd3JhcCBhcm91bmQKLSAgICAgICAgICAgIGNhcHRJZHggPSAwOworICAgICAgICAgaW5JZHggPCBzYW1wbGVMZW47CisgICAgICAgICBjYXB0SWR4KyspIHsKKyAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgY2FwdElkeCA9IDA7IC8vIHdyYXAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOwogICAgICAgICB9Ci0gICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNlsyICogaW5JZHhdICsgaW5CdWZmZXItPnMxNlsyICogaW5JZHggKyAxXTsKLSAgICAgICAgc21wID0gc21wID4+IHNoaWZ0OworICAgICAgICBidWZbY2FwdElkeF0gPSBjbGFtcDhfZnJvbV9mbG9hdChzbXAgKiBmc2NhbGUpOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBzbXAgPSAoaW5CdWZmZXItPnMxNltpbklkeF0gKyBpbkJ1ZmZlci0+czE2W2luSWR4ICsgMV0pID4+IHNoaWZ0OworICAgICAgICBpbklkeCArPSBGQ0NfMjsgIC8vIGludGVnZXIgc3VwcG9ydHMgc3RlcmVvIG9ubHkuCiAgICAgICAgIGJ1ZltjYXB0SWR4XSA9ICgodWludDhfdClzbXApXjB4ODA7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICAvLyBYWFggdGhlIGZvbGxvd2luZyB0d28gc2hvdWxkIHJlYWxseSBiZSBhdG9taWMsIHRob3VnaCBpdCBwcm9iYWJseSBkb2Vzbid0CkBAIC00MDAsNiArNDU3LDE1IEBACiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVMZW47ICsraSkgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIHNhbXBsZUxlbiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9CisjZWxzZQogICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KG91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CkBAIC00MDcsNiArNDczLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKaW5kZXggMDFmMDE0Zi4uYTk3NzMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtODYsNyArODYsNyBAQAogICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEhlaWZTdHJlYW0+IG1TdHJlYW07CiAgICAgYm9vbCBtRU9TOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtQ2FjaGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUNhY2hlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CiAgICAgc2l6ZV90IG1DYWNoZUJ1ZmZlclNpemU7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgLy8gaXQncyByZWFjaGluZyBtYXggY2FjaGUgYnVmZmVyIHNpemUsIG5lZWQgdG8gcm9sbCB3aW5kb3csIGFuZCBwb3NzaWJseQogICAgICAgICAvLyBleHBhbmQgdGhlIGNhY2hlIGJ1ZmZlci4KICAgICAgICAgc2l6ZV90IG5ld0NhY2hlQnVmZmVyU2l6ZSA9IG1DYWNoZUJ1ZmZlclNpemU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBuZXdDYWNoZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbmV3Q2FjaGU7CiAgICAgICAgIHVpbnQ4X3QqIGRzdCA9IG1DYWNoZS5nZXQoKTsKICAgICAgICAgaWYgKG5ld0NhY2hlQnVmZmVyU2l6ZSA8IGtNYXhDYWNoZUJ1ZmZlclNpemUpIHsKICAgICAgICAgICAgIG5ld0NhY2hlQnVmZmVyU2l6ZSA9IGtNYXhDYWNoZUJ1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCmluZGV4IDUxODNjMzkuLmFhMTBmMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCisrKyBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKICAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBmb3Igb25lIHBpeGVsCiAgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbUljY0RhdGEKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggMWExZDZiMy4uMWQzMzU5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0xLDggKzEsMTYgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibWVkaWFfZGVmYXVsdHMiLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiYmlvbmljL2xpYmMvcHJpdmF0ZSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczpbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibGliZ3VpX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCkBAIC0yMCw3ICsyOCw4IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0gICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiLCAiVGltZUNoZWNrLmNwcCJdLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKQEAgLTMyLDYgKzQxLDkgQEAKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKICAgICBjbGFuZzogdHJ1ZSwKIH0KIApAQCAtNDEsNiArNTMsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgImFpZGwvYW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5haWRsIiwKQEAgLTUyLDcgKzY1LDYgQEAKICAgICAgICAgIk1lZGlhQ29kZWNJbmZvLmNwcCIsCiAgICAgICAgICJPTVhCdWZmZXIuY3BwIiwKICAgICAgICAgIm9teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKLSAgICAgICAgIm9teC8xLjAvV09teC5jcHAiLAogICAgICAgICAib214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dPbXhOb2RlLmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAiLApAQCAtNjIsMTMgKzc0LDE2IEBACiAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCiAgICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCiAgICAgfSwKKyAgICAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtODUsMTUgKzEwMCwxOCBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwogICAgICAgICAiYWlkbCIsCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xMDgsOSArMTI2LDY3IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKKyAgICB9LAorfQorCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfb214X2NsaWVudCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJvbXgvMS4wL1dPbXguY3BwIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQogCkBAIC0xMjMsNiArMTk5LDEwIEBACiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMTM1LDI0ICsyMTUsMTUgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsIiwKLSAgICBdLAotfQotCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWEiLAogCisgICAgZGVmYXVsdHM6IFsgImxpYm1lZGlhX2RlZmF1bHRzIiBdLAorCiAgICAgc3JjczogWwotICAgICAgICAiOm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKICAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIuY3BwIiwKQEAgLTE4Nyw2ICsyNTgsOCBAQAogICAgICAgICAiTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAiLAogICAgICAgICAiVmlzdWFsaXplci5jcHAiLAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0UHJpdi5jcHAiLAorICAgICAgICAiTmRrTWVkaWFFcnJvclByaXYuY3BwIiwKICAgICBdLAogCiAgICAgYWlkbDogewpAQCAtMTk2LDI1ICsyNjksMjYgQEAKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJzb25pdm94IiwKLSAgICAgICAgImxpYmljdXVjIiwKLSAgICAgICAgImxpYmljdWkxOG4iLAorICAgICAgICAibGliYW5kcm9pZGljdSIsCiAgICAgICAgICJsaWJleHBhdCIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLApAQCAtMjI1LDggKzI5OSw3IEBACiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmljdXVjIiwKLSAgICAgICAgImxpYmljdWkxOG4iLAorICAgICAgICAibGliYW5kcm9pZGljdSIsCiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKQEAgLTI1NCwyNCArMzI3LDE5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKIAorICAgIGRlZmF1bHRzOiBbICJsaWJtZWRpYV9kZWZhdWx0cyIgXSwKKwogICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGFyYW1ldGVyLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZURlc2MuY3BwIiwKLSAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJJTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0J1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFVdGlscy5jcHAiLAogICAgICAgICAiTWV0YWRhdGEuY3BwIiwKICAgICAgICAgIk5ka1dyYXBwZXIuY3BwIiwKICAgICBdLApAQCAtMjgwLDkgKzM0OCw5IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yOTcsNiArMzY1LDEwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLApAQCAtMzE4LDggKzM5MCw1IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCmluZGV4IDAzNGY3YzIuLjFjOTVlMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0tFWV9BVURJT19MQU5HVUFHRV9QUkVGRVJSRUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQgPSBBVURJT19QQVJBTUVURVJfTU9OT19PVVRQVVQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0ID0gQVVESU9fUEFSQU1FVEVSX0RFVklDRV9DT05ORUNUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCmluZGV4IDI3MWEyMzguLjFjYzMwYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKQEAgLTI3LDI2ICsyNyw2IEBACiAgICAgICAgIDogbUluaXRpYWxNYXJrTXMoa05vTWFyayksCiAgICAgICAgICAgbVJlc3VtZVBsYXliYWNrTWFya01zKGtOb01hcmspIHsgfQogCi1zdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUluaXRpYWxNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZXN1bWVQbGF5YmFja01hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbE1hcmtNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZXN1bWVQbGF5YmFja01hcmtNcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIFN0cmluZzggQnVmZmVyaW5nU2V0dGluZ3M6OnRvU3RyaW5nKCkgY29uc3QgewogICAgIFN0cmluZzggczsKICAgICBzLmFwcGVuZEZvcm1hdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKaW5kZXggOTkwZDI2MC4uNWM2Yjk4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDx1bmljb2RlL3Vjc2RldC5oPgogI2luY2x1ZGUgPHVuaWNvZGUvdXN0cmluZy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCkgewpAQCAtMzgsNiArNDAsMjYgQEAKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKICAgICAgICAgbVV0ZjhDb252ID0gTlVMTDsKICAgICB9CisKKyAgICAvLyBSZWFkIHN5c3RlbSBsb2NhbGUgc2V0dGluZyBmcm9tIHN5c3RlbSBwcm9wZXJ0eSBhbmQgbWFwIHRvIElDVSBlbmNvZGluZyBuYW1lcy4KKyAgICBtTG9jYWxlRW5jID0gTlVMTDsKKyAgICBjaGFyIGxvY2FsZV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIiI7CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubG9jYWxlIiwgbG9jYWxlX3ZhbHVlLCBOVUxMKSA+IDApIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IHN0cm5sZW4obG9jYWxlX3ZhbHVlLCBzaXplb2YobG9jYWxlX3ZhbHVlKSk7CisKKyAgICAgICAgaWYgKGxlbiA9PSAzICYmICFzdHJuY21wKGxvY2FsZV92YWx1ZSwgInVuZCIsIDMpKSB7CisgICAgICAgICAgICAvLyBVbmRldGVybWluZWQKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChsb2NhbGVfdmFsdWUsICJ0aCIsIDIpKSB7IC8vIFRoYWkKKyAgICAgICAgICAgIG1Mb2NhbGVFbmMgPSAid2luZG93cy04NzQtMjAwMCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2NhbGVFbmMgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoIlN5c3RlbSBsb2NhbGUgZW5jb2RpbmcgPSAlcyIsIG1Mb2NhbGVFbmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIkRpZG4ndCByZWNvZ25pemUgc3lzdGVtIGxvY2FsZSBzZXR0aW5nLCBkZWZhdWx0aW5nIHRvIGVuX1VTIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQ291bGRuJ3QgcmVhZCBzeXN0ZW0gbG9jYWxlIHNldHRpbmcsIGFzc3VtaW5nIGVuX1VTIik7CisgICAgfQogfQogCiBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjp+Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKQEAgLTE1Nyw3ICsxNzksMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChiZXN0Q29tYmluZWRNYXRjaCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUxvY2FsZUVuYyAhPSBOVUxMICYmICFnb29kbWF0Y2ggJiYgaGlnaGVzdCA8IDUwKSB7CisgICAgICAgICAgICAgICAgY29tYmluZWRlbmMgPSBtTG9jYWxlRW5jOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb25maWRlbmNlIGlzIGxvdyBidXQgd2UgaGF2ZSByZWNvZ25pemVkIHByZWRlZmluZWQgZW5jb2RpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzbyB0cnkgdGhpcyAoJXMpIGluc3RlYWQiLCBtTG9jYWxlRW5jKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdENvbWJpbmVkTWF0Y2ggIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gdWNzZGV0X2dldE5hbWUoYmVzdENvbWJpbmVkTWF0Y2gsICZzdGF0dXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb21iaW5lZGVuYyA9ICJJU08tODg1OS0xIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGU5YTYyMzAuLmZiNmQzYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC0yMTksMTAgKzIyMCwxNiBAQAogICAgIFZlY3Rvcjx3cDxJTWVkaWFTb3VyY2U+PiB0cmFja3M7CiAgICAgVmVjdG9yPFN0cmluZzg+IHRyYWNrRGVzY3JpcHRpb25zOwogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB0aW1lX3Qgd2hlbjsKIH0gRXh0cmFjdG9ySW5zdGFuY2U7CiAKIFN0cmluZzggRXh0cmFjdG9ySW5zdGFuY2U6OnRvU3RyaW5nKCkgY29uc3QgewotICAgIFN0cmluZzggc3RyID0gbmFtZTsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBjaGFyIHRpbWVTdHJpbmdbMzJdOworICAgIHN0cmZ0aW1lKHRpbWVTdHJpbmcsIHNpemVvZih0aW1lU3RyaW5nKSwgIiVtLSVkICVUIiwgbG9jYWx0aW1lKCZ3aGVuKSk7CisgICAgc3RyLmFwcGVuZCh0aW1lU3RyaW5nKTsKKyAgICBzdHIuYXBwZW5kKCI6ICIpOworICAgIHN0ci5hcHBlbmQobmFtZSk7CiAgICAgc3RyLmFwcGVuZCgiIGZvciBtaW1lICIpOwogICAgIHN0ci5hcHBlbmQobWltZSk7CiAgICAgc3RyLmFwcGVuZCgiLCBzb3VyY2UgIik7CkBAIC0yODcsNiArMjk0LDcgQEAKICAgICBleC5zb3VyY2VEZXNjcmlwdGlvbiA9IHNvdXJjZS0+dG9TdHJpbmcoKTsKICAgICBleC5vd25lciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBleC5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgZXgud2hlbiA9IHRpbWUoTlVMTCk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNFeHRyYWN0b3JzTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGQ3NTMzY2EuLjI0M2IwOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMywxMyArMjMsMTMgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgTUFLRV9FWFRSQUNUT1IgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIE1BS0VfSURBVEFfU09VUkNFX0ZELAorICAgIEdFVF9TVVBQT1JURURfVFlQRVMsCiB9OwogCiBjbGFzcyBCcE1lZGlhRXh0cmFjdG9yU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpAQCAtNjksNiArNjksMjQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXM7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1VQUE9SVEVEX1RZUEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIHJlcGx5CisgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXh0ID0gcmVwbHkucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXMuaW5zZXJ0KHN0ZDo6c3RyaW5nKGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRUeXBlczsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIik7CkBAIC0xMTQsNiArMTMyLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9TVVBQT1JURURfVFlQRVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzID0gZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHN1cHBvcnRlZFR5cGVzLmJlZ2luKCk7IGl0ICE9IHN1cHBvcnRlZFR5cGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlQ1N0cmluZygoKml0KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNTkwYmExYS4uZjlmYTg2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgorI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggNzdlYTAzYy4uYmExYzgzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0yMDUsNyArMjA1LDggQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgYnVmZmVyaW5nLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTIyMCw3ICsyMjEsOCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IGJ1ZmZlcmluZy0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bVJlc3VtZVBsYXliYWNrTWFya01zID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC03MjIsNyArNzI0LDggQEAKICAgICAgICAgY2FzZSBTRVRfQlVGRkVSSU5HX1NFVFRJTkdTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7Ci0gICAgICAgICAgICBidWZmZXJpbmcucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC03MzIsNyArNzM1LDggQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYWNhN2FkOS4uYmQxOGE0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGIyYzkxYzQuLmEzNTRjZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTY1LDcgKzY1LDkgQEAKICAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKICAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAogICAgIEdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMsCi0KKyAgICBHRVRfUE9SVF9JRCwKKyAgICBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OLAorICAgIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04KIH07CiAKIGNsYXNzIEJwTWVkaWFSZWNvcmRlcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyPgpAQCAtNDA3LDYgKzQwOSw0MSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICAgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSA6IHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHpvb20pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSA6IHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgICAgICBpZiAocG9ydElkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUE9SVF9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSworICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC02NjEsNiArNjk4LDM0IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9QT1JUX0lEOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1BPUlRfSUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQb3J0SWQoJnBvcnRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OOiB7CisgICAgICAgICAgICBBTE9HVigiU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT046IHsKKyAgICAgICAgICAgIEFMT0dWKCJTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04iKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgem9vbSA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGYxODVmZDQuLjUwODI2YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VURk9STUFULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgICAgICAgICAgbU1ldGFEYXRhID0gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIG1NZXRhRGF0YTsKICAgICAgICAgfQpAQCAtMTg2LDYgKzE4Nyw5IEBACiAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCiAgICAgICAgICAgICAgICAgcmV0LCBidWZmZXJDb3VudCwgbUJ1ZmZlcnNTaW5jZVN0b3ApOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgJiYgcmV0ID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtMjE5LDYgKzIyMyw4IEBACiAgICAgLy8gTnVQbGF5ZXIgcGFzc2VzIHBvaW50ZXJzLXRvLW1ldGFkYXRhIGFyb3VuZCwgc28gd2UgdXNlIHRoaXMgdG8ga2VlcCB0aGUgbWV0YWRhdGEgYWxpdmUKICAgICAvLyBYWFg6IGNvdWxkIHdlIHVzZSB0aGlzIGZvciBjYWNoaW5nLCBvciBkb2VzIG1ldGFkYXRhIGNoYW5nZSBvbiB0aGUgZmx5PwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YURhdGE7CisgICAgLy8gZW5zdXJlIHN5bmNocm9uaXplIGFjY2VzcyB0byBtTWV0YURhdGEKKyAgICBNdXRleCBtTG9jazsKIAogICAgIC8vIENhY2hlIGFsbCBJTWVtb3J5IG9iamVjdHMgcmVjZWl2ZWQgZnJvbSBNZWRpYUV4dHJhY3Rvci4KICAgICAvLyBXZSBnYyBJTWVtb3J5IG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSAocmVmZXJlbmNlZCBieSBhIE1lZGlhQnVmZmVyKS4KQEAgLTM2MiwxMyArMzY4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVXNlIHNoYXJlZCBtZW1vcnk6ICV6dSIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckJ1ZiA9IGJ1ZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJMYXJnZSBidWZmZXIgJXp1IHdpdGhvdXQgSU1lbW9yeSEiLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkxhcmdlIGJ1ZmZlciAlenUgd2l0aG91dCBJTWVtb3J5ISIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFCdWZmZXJCYXNlICoqKSZ0cmFuc2ZlckJ1ZiwgZmFsc2UgLyogbm9uQmxvY2tpbmcgKi8sIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYW5zZmVyQnVmID09IG51bGxwdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhbnNmZXJCdWYtPm1NZW1vcnkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWNxdWlyZSBzaGFyZWQgbWVtb3J5LCBzaXplICV6dSwgcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIGFjcXVpcmUgc2hhcmVkIG1lbW9yeSwgc2l6ZSAlenUsIHJldCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyQnVmICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJCdWYtPnJlbGVhc2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggYTA3MzA4MS4uYmMwYzJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgpAQCAtNjIsNzkgKzYxLDYgQEAKICAgICBTRVRfUVVJUktTLAogfTsKIAotY2xhc3MgQnBPTVggOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWD4gewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwT01YKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElPTVg+KGltcGwpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3ROb2RlcyhMaXN0PENvbXBvbmVudEluZm8+ICpsaXN0KSB7Ci0gICAgICAgIGxpc3QtPmNsZWFyKCk7Ci0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTk9ERVMsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgaW50MzJfdCBuID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgbGlzdC0+cHVzaF9iYWNrKENvbXBvbmVudEluZm8oKSk7Ci0gICAgICAgICAgICBDb21wb25lbnRJbmZvICZpbmZvID0gKi0tbGlzdC0+ZW5kKCk7Ci0KLSAgICAgICAgICAgIGluZm8ubU5hbWUgPSByZXBseS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgaW50MzJfdCBudW1Sb2xlcyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtUm9sZXM7ICsraikgewotICAgICAgICAgICAgICAgIGluZm8ubVJvbGVzLnB1c2hfYmFjayhyZXBseS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlTm9kZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLAotICAgICAgICAgICAgc3A8SU9NWE5vZGU+ICpvbXhOb2RlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ0FURV9OT0RFLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAqb214Tm9kZSA9IElPTVhOb2RlOjphc0ludGVyZmFjZShyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb214Tm9kZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclNvdXJjZT4gKmJ1ZmZlclNvdXJjZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfSU5QVVRfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgICpidWZmZXJQcm9kdWNlciA9IElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmFzSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICpidWZmZXJTb3VyY2UgPSBJR3JhcGhpY0J1ZmZlclNvdXJjZTo6YXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLX07Ci0KIGNsYXNzIEJwT01YTm9kZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YTm9kZT4gewogcHVibGljOgogICAgIGV4cGxpY2l0IEJwT01YTm9kZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKQEAgLTU1MSw4ICs0NzcsNyBAQAogICAgIH0KIH07CiAKLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPTVgsICJhbmRyb2lkLmhhcmR3YXJlLklPTVgiKTsKLUlNUExFTUVOVF9IWUJSSURfTUVUQV9JTlRFUkZBQ0UoT01YTm9kZSwgSU9teE5vZGUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhOb2RlIik7CitJTVBMRU1FTlRfSFlCUklEX01FVEFfSU5URVJGQUNFKE9NWE5vZGUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhOb2RlIik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTU2Miw4MiArNDg3LDYgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsgXAogICAgICAgICB9IH0gd2hpbGUgKDApCiAKLXN0YXR1c190IEJuT01YOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX05PREVTOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgTGlzdDxDb21wb25lbnRJbmZvPiBsaXN0OwotICAgICAgICAgICAgbGlzdE5vZGVzKCZsaXN0KTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChMaXN0PENvbXBvbmVudEluZm8+OjppdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgaXQgIT0gbGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudEluZm8gJmN1ciA9ICppdDsKLQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoY3VyLm1OYW1lKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjdXIubVJvbGVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChMaXN0PFN0cmluZzg+OjppdGVyYXRvciByb2xlX2l0ID0gY3VyLm1Sb2xlcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgcm9sZV9pdCAhPSBjdXIubVJvbGVzLmVuZCgpOyArK3JvbGVfaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOCgqcm9sZV9pdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFMTE9DQVRFX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwotCi0gICAgICAgICAgICBzcDxJT01YT2JzZXJ2ZXI+IG9ic2VydmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJT01YT2JzZXJ2ZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCBvYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzOTI3MDAiKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYWxsb2NhdGVOb2RlKG5hbWUsIG9ic2VydmVyLCAmb214Tm9kZSk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teE5vZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBDUkVBVEVfSU5QVVRfU1VSRkFDRToKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJTb3VyY2U+IGJ1ZmZlclNvdXJjZTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNyZWF0ZUlucHV0U3VyZmFjZSgmYnVmZmVyUHJvZHVjZXIsICZidWZmZXJTb3VyY2UpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclNvdXJjZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEJuT01YTm9kZTo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3dpdGNoIChjb2RlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggNTMwOGUxYy4uODZhZDk5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMjgsNiArMjgsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvKiogVGhpcyByZWR1bmRhbnQgcmVkZWNsYXJhdGlvbiBpcyBuZWVkZWQgZm9yIEMrKyBwcmUgMTQgKi8KK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9JTlRSQV9SRUZSRVNIW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX01VTFRJUExFX0ZSQU1FU1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9TRUNVUkVfUExBWUJBQ0tbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXTsKKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAogICAgICAgICBWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3QgewogICAgIHByb2ZpbGVMZXZlbHMtPmNsZWFyKCk7CkBAIC00MCwxNiArNDksMTEgQEAKICAgICBjb2xvckZvcm1hdHMtPmFwcGVuZFZlY3RvcihtQ29sb3JGb3JtYXRzKTsKIH0KIAotdWludDMyX3QgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GbGFnczsKLX0KLQogY29uc3Qgc3A8QU1lc3NhZ2U+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldERldGFpbHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EZXRhaWxzOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKQotICA6IG1GbGFncygwKSB7CitNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpDYXBhYmlsaXRpZXMoKSB7CiAgICAgbURldGFpbHMgPSBuZXcgQU1lc3NhZ2U7CiB9CiAKQEAgLTczLDEyICs3NywxMCBAQAogICAgICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY29sb3IpOwogICAgICAgICB9CiAgICAgfQotICAgIHVpbnQzMl90IGZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBBTWVzc2FnZTo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGlmIChkZXRhaWxzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChjYXBzICE9IE5VTEwpIHsKLSAgICAgICAgY2Fwcy0+bUZsYWdzID0gZmxhZ3M7CiAgICAgICAgIGNhcHMtPm1EZXRhaWxzID0gZGV0YWlsczsKICAgICB9CiAgICAgcmV0dXJuIGNhcHM7CkBAIC05Niw3ICs5OCw2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CiAgICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOwogICAgIG1EZXRhaWxzLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTExLDYgKzExMiwxNCBAQAogICAgIG1DYXAtPm1EZXRhaWxzLT5zZXRJbnQzMihrZXksIHZhbHVlKTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpyZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KSB7CisgICAgaWYgKG1DYXAtPm1EZXRhaWxzLT5yZW1vdmVFbnRyeUF0KG1DYXAtPm1EZXRhaWxzLT5maW5kRW50cnlCeU5hbWUoa2V5KSkgPT0gT0spIHsKKyAgICAgICAgQUxPR0QoInN1Y2Nlc3NmdWxseSByZW1vdmVkIGRldGFpbCAlcyIsIGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImRldGFpbCAlcyB3YXNuJ3QgcHJlc2VudCB0byByZW1vdmUiLCBrZXkpOworICAgIH0KK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRQcm9maWxlTGV2ZWwoCiAgICAgICAgIHVpbnQzMl90IHByb2ZpbGUsIHVpbnQzMl90IGxldmVsKSB7CiAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKQEAgLTEyOSwzMiArMTM4LDMyIEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbUNhcC0+bUZsYWdzIHw9IGZsYWdzOwotfQotCiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMqIGNhcCkgOiBtQ2FwKGNhcCkgewogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0VuY29kZXI7CitNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcyBNZWRpYUNvZGVjSW5mbzo6Z2V0QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUF0dHJpYnV0ZXM7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpyYW5rKCkgY29uc3QgewordWludDMyX3QgTWVkaWFDb2RlY0luZm86OmdldFJhbmsoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1SYW5rOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7Ci0gICAgbWltZXMtPmNsZWFyKCk7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRBbGlhc2VzKFZlY3RvcjxBU3RyaW5nPiAqYWxpYXNlcykgY29uc3QgeworICAgICphbGlhc2VzID0gbUFsaWFzZXM7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdCB7CisgICAgbWVkaWFUeXBlcy0+Y2xlYXIoKTsKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgIG1pbWVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKKyAgICAgICAgbWVkaWFUeXBlcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CiAgICAgfQogfQogCiBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPgotTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdCB7CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBtQ2Fwcy52YWx1ZUF0KGl4KTsKICAgICB9CkBAIC0xNzMsMjEgKzE4MiwyNiBAQAogc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIEFTdHJpbmcgb3duZXIgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IHN0YXRpY19jYXN0PEF0dHJpYnV0ZXM+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgdWludDMyX3QgcmFuayA9IHBhcmNlbC5yZWFkVWludDMyKCk7CiAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CiAgICAgaW5mby0+bU5hbWUgPSBuYW1lOwogICAgIGluZm8tPm1Pd25lciA9IG93bmVyOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgaW5mby0+bUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwogICAgIGluZm8tPm1SYW5rID0gcmFuazsKKyAgICBzaXplX3QgbnVtQWxpYXNlcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUFsaWFzZXM7IGkrKykgeworICAgICAgICBBU3RyaW5nIGFsaWFzID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpbmZvLT5tQWxpYXNlcy5hZGQoYWxpYXMpOworICAgIH0KICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBBU3RyaW5nIG1pbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKGNhcHMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWltZSwgY2Fwcyk7CisgICAgICAgICAgICBpbmZvLT5tQ2Fwcy5hZGQobWVkaWFUeXBlLCBjYXBzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gaW5mbzsKQEAgLTE5Niw4ICsyMTAsMTIgQEAKIHN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CiAgICAgbU5hbWUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIG1Pd25lci53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQXR0cmlidXRlcyk7CiAgICAgcGFyY2VsLT53cml0ZVVpbnQzMihtUmFuayk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1BbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IG1BbGlhc2VzKSB7CisgICAgICAgIGFsaWFzLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgewogICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CkBAIC0yMDYsMTAgKzIyNCwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBpZiAobWltZSkgeworc3NpemVfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIGlmIChtZWRpYVR5cGUpIHsKICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWVkaWFUeXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBpeDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE3LDE5ICsyMzUsMjYgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLU1lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpIDogbVJhbmsoMHgxMDApIHsKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpCisgICAgOiBtQXR0cmlidXRlcygoTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMpMCksCisgICAgICBtUmFuaygweDEwMCkgewogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICBtSW5mby0+bU5hbWUgPSBuYW1lOwogfQogCit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgbUluZm8tPm1BbGlhc2VzLmFkZChuYW1lKTsKK30KKwogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpIHsKICAgICBtSW5mby0+bU93bmVyID0gb3duZXI7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIpIHsKLSAgICBtSW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKK3ZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEF0dHJpYnV0ZXMoCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRyaWJ1dGVzKSB7CisgICAgbUluZm8tPm1BdHRyaWJ1dGVzID0gKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKWF0dHJpYnV0ZXM7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldFJhbmsodWludDMyX3QgcmFuaykgewpAQCAtMjM3LDIxICsyNjIsMjEgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+Ci0gICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoCiAgICAgICAgICAgICAgICAgbUluZm8tPm1DYXBzLnZhbHVlQXQoaXgpLmdldCgpKSk7CiAgICAgfQogICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcygpOwotICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtaW1lKSwgY2Fwcyk7CisgICAgbUluZm8tPm1DYXBzLmFkZChBU3RyaW5nKG1lZGlhVHlwZSksIGNhcHMpOwogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4oCiAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcihjYXBzLmdldCgpKSk7CiB9CiAKLWJvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgewotICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1lZGlhVHlwZSk7CiAgICAgaWYgKGl4ID49IDApIHsKICAgICAgICAgbUluZm8tPm1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggYWFkZTY5YS4uOThjNTQ5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTQ4LDcgKzQ4LDggQEAKICAgICB7ImFtcndiIiwgIEFVRElPX0VOQ09ERVJfQU1SX1dCfSwKICAgICB7ImFhYyIsICAgIEFVRElPX0VOQ09ERVJfQUFDfSwKICAgICB7ImhlYWFjIiwgIEFVRElPX0VOQ09ERVJfSEVfQUFDfSwKLSAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0KKyAgICB7ImFhY2VsZCIsIEFVRElPX0VOQ09ERVJfQUFDX0VMRH0sIAorICAgIHsib3B1cyIsICAgQVVESU9fRU5DT0RFUl9PUFVTfQogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNGaWxlRm9ybWF0TWFwW10gPSB7CkBAIC05MSw2ICs5MiwxOSBAQAogICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCiAgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAogICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKKworICAgIC8vIFZlbmRvci1zcGVjaWZpYyBwcm9maWxlcworICAgIHsidmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVkdBfSwKKyAgICB7IjRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0l9LAorICAgIHsidGltZWxhcHNldmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0F9LAorICAgIHsidGltZWxhcHNlNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJfSwKKyAgICB7ImhpZ2hzcGVlZGNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfQ0lGfSwKKyAgICB7ImhpZ2hzcGVlZHZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfVkdBfSwKKyAgICB7ImhpZ2hzcGVlZDRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80S0RDSX0sCisgICAgeyJxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9RSER9LAorICAgIHsiMmsiLCBDQU1DT1JERVJfUVVBTElUWV8ya30sCisgICAgeyJ0aW1lbGFwc2VxaGQiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FIRH0sCisgICAgeyJ0aW1lbGFwc2UyayIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMmt9LAogfTsKIAogI2lmIExPR19OREVCVUcKQEAgLTU0Niw4ICs1NjAsOCBAQAogCiAgICAgICAgICAgICBpZiAoaW5mby0+bUhhc1JlZlByb2ZpbGUpIHsKIAotICAgICAgICAgICAgICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtY29yZGVyUHJvZmlsZT4gcHJvZmlsZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q2FtY29yZGVyUHJvZmlsZT4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1DYW1jb3JkZXJQcm9maWxlc1tpbmZvLT5tUmVmUHJvZmlsZUluZGV4XSk7CiAKICAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHF1YWxpdHkKQEAgLTU4MSw3ICs1OTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWNvcmRlclByb2ZpbGVzW2luZm8tPm1SZWZQcm9maWxlSW5kZXhdLT5tUXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1RdWFsaXR5LCBjYW1lcmFJZCk7CiAKLSAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlcy5hZGQocHJvZmlsZS5yZWxlYXNlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmNwcAppbmRleCBiY2RjM2JkLi4zMTk3MmZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmNwcApAQCAtMjIsMjIgKzIyLDE2IEBACiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxiaW9uaWNfbWFsbG9jLmg+CisKICNpbmNsdWRlICJNZWRpYVV0aWxzLmgiCiAKLWV4dGVybiAiQyIgc2l6ZV90IF9fY2ZpX3NoYWRvd19zaXplKCk7CitleHRlcm4gIkMiIHZvaWQgX19zY3Vkb19zZXRfcnNzX2xpbWl0KHNpemVfdCwgaW50KSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdm9pZCBsaW1pdFByb2Nlc3NNZW1vcnkoCi0gICAgY29uc3QgY2hhciAqcHJvcGVydHksCi0gICAgc2l6ZV90IG51bWJlck9mQnl0ZXMsCi0gICAgc2l6ZV90IHBlcmNlbnRhZ2VPZlRvdGFsTWVtKSB7Ci0KLSAgICBpZiAocnVubmluZ193aXRoX2FzYW4oKSkgewotICAgICAgICBBTE9HVygiUnVubmluZyB3aXRoIEFTYW4sIHNraXAgZW5mb3JjaW5nIG1lbW9yeSBsaW1pdGF0aW9ucy4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQordm9pZCBsaW1pdFByb2Nlc3NNZW1vcnkoY29uc3QgY2hhciAqcHJvcGVydHksIHNpemVfdCBudW1iZXJPZkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlcmNlbnRhZ2VPZlRvdGFsTWVtKSB7CiAgICAgbG9uZyBwYWdlU2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKICAgICBsb25nIG51bVBhZ2VzID0gc3lzY29uZihfU0NfUEhZU19QQUdFUyk7CiAgICAgc2l6ZV90IG1heE1lbSA9IFNJWkVfTUFYOwpAQCAtNjUsMzAgKzU5LDE3IEBACiAgICAgICAgIG1heE1lbSA9IHByb3BWYWw7CiAgICAgfQogCi0gICAgLy8gSW5jcmVhc2UgYnkgdGhlIHNpemUgb2YgdGhlIENGSSBzaGFkb3cgbWFwcGluZy4gTW9zdCBvZiB0aGUgc2hhZG93IGlzIG5vdAotICAgIC8vIGJhY2tlZCB3aXRoIHBoeXNpY2FsIHBhZ2VzLCBhbmQgaXQgaXMgcG9zc2libGUgZm9yIHRoZSByZXN1bHQgdG8gYmUKLSAgICAvLyBoaWdoZXIgdGhhbiB0b3RhbCBwaHlzaWNhbCBtZW1vcnkuIFRoaXMgaXMgZmluZSBmb3IgUkxJTUlUX0FTLgotICAgIHNpemVfdCBjZmlfc2l6ZSA9IF9fY2ZpX3NoYWRvd19zaXplKCk7Ci0gICAgaWYgKGNmaV9zaXplKSB7Ci0gICAgICBBTE9HVigiY2ZpIHNoYWRvdyBzaXplOiAlenUiLCBjZmlfc2l6ZSk7Ci0gICAgICBpZiAobWF4TWVtIDw9IFNJWkVfTUFYIC0gY2ZpX3NpemUpIHsKLSAgICAgICAgbWF4TWVtICs9IGNmaV9zaXplOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF4TWVtID0gU0laRV9NQVg7Ci0gICAgICB9CisgICAgLy8gSWYgU2N1ZG8gaXMgaW4gdXNlLCBlbmZvcmNlIHRoZSBoYXJkIFJTUyBsaW1pdCAoaW4gTUIpLgorICAgIGlmIChtYXhNZW0gIT0gU0laRV9NQVggJiYgJl9fc2N1ZG9fc2V0X3Jzc19saW1pdCAhPSAwKSB7CisgICAgICBfX3NjdWRvX3NldF9yc3NfbGltaXQobWF4TWVtID4+IDIwLCAxKTsKKyAgICAgIEFMT0dWKCJTY3VkbyBoYXJkIFJTUyBsaW1pdCBzZXQgdG8gJXp1IE1CIiwgbWF4TWVtID4+IDIwKTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQUxPR1YoImFjdHVhbCBsaW1pdDogJXp1IiwgbWF4TWVtKTsKIAotICAgIHN0cnVjdCBybGltaXQgbGltaXQ7Ci0gICAgZ2V0cmxpbWl0KFJMSU1JVF9BUywgJmxpbWl0KTsKLSAgICBBTE9HVigib3JpZ2luYWwgbGltaXRzOiAlbGxkLyVsbGQiLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fY3VyLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fbWF4KTsKLSAgICBsaW1pdC5ybGltX2N1ciA9IG1heE1lbTsKLSAgICBzZXRybGltaXQoUkxJTUlUX0FTLCAmbGltaXQpOwotICAgIGxpbWl0LnJsaW1fY3VyID0gLTE7Ci0gICAgbGltaXQucmxpbV9tYXggPSAtMTsKLSAgICBnZXRybGltaXQoUkxJTUlUX0FTLCAmbGltaXQpOwotICAgIEFMT0dWKCJuZXcgbGltaXRzOiAlbGxkLyVsbGQiLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fY3VyLCAobG9uZyBsb25nKWxpbWl0LnJsaW1fbWF4KTsKLQorICAgIGlmICghYW5kcm9pZF9tYWxsb3B0KE1fU0VUX0FMTE9DQVRJT05fTElNSVRfQllURVMsICZtYXhNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1heE1lbSkpKSB7CisgICAgICBBTE9HVygiY291bGRuJ3Qgc2V0IGFsbG9jYXRpb24gbGltaXQiKTsKKyAgICB9CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuaCBiL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuaAppbmRleCBhNjc4YmNjLi5mODBkZDMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5oCkBAIC0xOSwxMiArMTksNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWV4dGVybiAiQyIgdm9pZCBfX2FzYW5faW5pdCh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ1bm5pbmdfd2l0aF9hc2FuKCkgewotICAgIHJldHVybiAmX19hc2FuX2luaXQgIT0gMDsKLX0KLQogLyoqCiAgICBMaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSBhIHByb2Nlc3MgY2FuIGFsbG9jYXRlIHVzaW5nIHNldHJsaW1pdChSTElNSVRfQVMpLgogICAgVGhlIHZhbHVlIHRvIHVzZSB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHN5c3RlbSBwcm9wZXJ0eSwgb3IgaWYgdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDVjYTNiNDguLmQ4ZWY5Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KIAogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogCiBzdGF0aWMgaW50IHJlYWRBdCh2b2lkICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgaW50IHBvcywgaW50IHNpemUpIHsKICAgICByZXR1cm4gKChhbmRyb2lkOjpNaWRpSW9XcmFwcGVyKiloYW5kbGUpLT5yZWFkQXQoYnVmZmVyLCBwb3MsIHNpemUpOwpAQCAtNDksMTAgKzUwLDQ3IEBACiAgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOwogfQogCi1NaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIHsKLSAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihEYXRhU291cmNlKSIpOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VVbndyYXBwZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBPSzsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG1Tb3VyY2UtPmhhbmRsZSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKG1Tb3VyY2UtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1Tb3VyY2U7Cit9OworCitNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UpIik7CiAgICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbUJhc2UgPSAwOworICAgIG1EYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2VVbndyYXBwZXIoY3NvdXJjZSk7CiAgICAgb2ZmNjRfdCBsOwogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmbCkgPT0gT0spIHsKICAgICAgICAgbUxlbmd0aCA9IGw7CkBAIC02Niw2ICsxMDQsNyBAQAogICAgIGlmIChtRmQgPj0gMCkgewogICAgICAgICBjbG9zZShtRmQpOwogICAgIH0KKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIGludCBNaWRpSW9XcmFwcGVyOjpyZWFkQXQodm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2I5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK21lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfSU8pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1VOS05PV04pIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQUxPR0UoIm5kayBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlmYjhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUZvcm1hdCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coc3A8QU1lc3NhZ2U+ICpkYXRhKSB7CisgICAgQUxPR1YoInByaXZhdGUgY3RvciIpOworICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7CisgICAgbURhdGEtPm1Gb3JtYXQgPSAqZGF0YTsKKyAgICBpZiAobURhdGEtPm1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZ290IE5VTEwgZm9ybWF0Iik7CisgICAgICAgIG1EYXRhLT5tRm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpIHsKKyAgICAqZGVzdCA9IG1EYXRhLT5tRm9ybWF0OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAppbmRleCAyNzJiYzMwLi5jMTUwNDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApAQCAtMzEsMTcgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLS8vIFRPRE86IHJlbW92ZSBmb3J3YXJkIGRlY2xhcmF0aW9uIHdoZW4gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QgaXMgb2ZmY2lhbGx5IGFkZGVkIHRvIE5ESwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02Nyw5ICs1NywxNSBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFksCisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLAogICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5ULAogICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULAogICAgIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTLApAQCAtMTAxLDYgKzk3LDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwSW50NjRbXSA9IHsKICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsCiB9OwpAQCAtMTEyLDYgKzEwOSw4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCiAgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8sCiAgICAgQU1FRElBRk9STUFUX0tFWV9TRUksCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwKQEAgLTEzMCw2ICsxMjksNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwRmxvYXRJbnQzMltdID0gewogICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwKICAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVIsCiAgICAgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwKIH07CiAKQEAgLTEwODAsMTQgKzEwODAsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KG1BTWVkaWFFeHRyYWN0b3IpOwotICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Ci0gICAgfQotICAgIHJldHVybiBERUFEX09CSkVDVDsKLX0KLQogQU1lZGlhRXh0cmFjdG9yICpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1BTWVkaWFFeHRyYWN0b3I7CiB9CkBAIC0xMjYxLDQwICsxMjUzLDI4IEBACiAgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpKTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOwotICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKLX0KLQotdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBzb3VyY2UtPmNsb3NlKCk7CisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpjcnlwdG9JbmZvID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8obUFNZWRpYUV4dHJhY3Rvcik7CisgICAgaWYgKGNyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKGNyeXB0b0luZm8pOwogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1BTWVkaWFEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1BTWVkaWFEYXRhU291cmNlLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKTsKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKGRhdGFTb3VyY2UpKSB7Cit9CisKK0FNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlICphRGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKE5VTEwpLAorICAgICAgbUFNZWRpYURhdGFTb3VyY2UoYURhdGFTb3VyY2UpIHsKIH0KIAogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6On5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpIHsKICAgICBpZiAobUFNZWRpYURhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKG1BTWVkaWFEYXRhU291cmNlKTsKICAgICBtQU1lZGlhRGF0YVNvdXJjZSA9IE5VTEw7CiB9CkBAIC0xMzAzLDQgKzEyODMsOCBAQAogICAgIHJldHVybiBtQU1lZGlhRGF0YVNvdXJjZTsKIH0KIAordm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6Y2xvc2UoKSB7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9PTVhCdWZmZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvT01YQnVmZmVyLmNwcAppbmRleCA2ZDU0YTEzLi4zMGRjMjJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9PTVhCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL09NWEJ1ZmZlci5jcHAKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotT01YQnVmZmVyJiBPTVhCdWZmZXI6Om9wZXJhdG9yPShPTVhCdWZmZXImJiBzb3VyY2UpIHsKK09NWEJ1ZmZlciYgT01YQnVmZmVyOjpvcGVyYXRvcj0oT01YQnVmZmVyJiYgc291cmNlKSBub2V4Y2VwdCB7CiAgICAgbUJ1ZmZlclR5cGUgPSBzdGQ6Om1vdmUoc291cmNlLm1CdWZmZXJUeXBlKTsKICAgICBtUmFuZ2VPZmZzZXQgPSBzdGQ6Om1vdmUoc291cmNlLm1SYW5nZU9mZnNldCk7CiAgICAgbVJhbmdlTGVuZ3RoID0gc3RkOjptb3ZlKHNvdXJjZS5tUmFuZ2VMZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7Ci0gICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQotICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKLXsKLX0KLQotVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgewotICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1uc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOwotICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOwotICAgIG1Db25kLnNpZ25hbCgpOwotICAgIHJldHVybiBlbmRUaW1lTnM7Ci19Ci0KLXZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWJvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKLSAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLQotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IGEzZGI3NTQuLjViZTc4ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC03NCw2ICs3NCw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSV9BUkMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLApAQCAtOTMsNiArOTQsOCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVTKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1BST1hZKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCkBAIC0xMzIsNiArMTM1LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIwNSw2ICsyMDksMTUgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0xDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQVRNX0hFX1YyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0NFTFQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9BREFQVElWRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIRENfTEwpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9UV1NQKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMTYsNiArMjI5LDkgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfVFJJKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfVFJJX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKQEAgLTIzMiw2ICsyNDgsMTIgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0FCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0FCKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yNzgsNiArMzAwLDcgQEAKIAogdGVtcGxhdGUgPD4KIGNvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fREVGQVVMVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1NZU1RFTSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SSU5HKSwKQEAgLTM0OSwxMSArMzcyLDMxIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRk1fVFVORVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfSE9UV09SRCksCiAgICAgVEVSTUlOQVRPUgogfTsKIAordGVtcGxhdGUgPD4KK2NvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TRUNVUkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX1NDTyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQkVBQ09OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19IT1RXT1JEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX01VVEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0xPV19MQVRFTkNZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19ERUVQX0JVRkZFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkUpLAorICAgIFRFUk1JTkFUT1IKK307CisKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKQEAgLTM2NywyMCArNDEwLDEzIEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAogYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewogICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8CiAgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKIH0KIAotYm9vbCBkZXZpY2VUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSkgewotICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoZGV2aWNlLCBsaXRlcmFsRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gT3V0cHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0KLX0KLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxYmM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICogU2VydmljZSB0byByZWxvYWQgZXh0cmFjdG9yIHBsdWdpbnMgd2hlbiB1cGRhdGUgcGFja2FnZSBpcyBpbnN0YWxsZWQvdW5pbnN0YWxsZWQuCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSB7Ci0gICAgdm9pZCBsb2FkUGx1Z2lucyhAdXRmOEluQ3BwIFN0cmluZyBhcGtQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlibWVkaWEvZXhwb3J0cy5sZHMKaW5kZXggYjA5ZmJjZS4uOTA0YTdmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvZXhwb3J0cy5sZHMKKysrIGIvbWVkaWEvbGlibWVkaWEvZXhwb3J0cy5sZHMKQEAgLTMsNSArMyw1IEBACiAgICAgICAgICo7CiAgICAgbG9jYWw6CiAgICAgICAgIF9aTjdhbmRyb2lkMTNNaWRpSW9XcmFwcGVyKjsKLSAgICAgICAgX1pUVk43YW5kcm9pZDEzTWlkaUlvV3JhcHBlckU7CisgICAgICAgIF9aVFZON2FuZHJvaWQxM01pZGlJb1dyYXBwZXJFKjsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCBkNmE5Y2ZiLi5iMDM4ODU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCkBAIC0xODYsNiArMTg3LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogCkBAIC0yMTYsNiArMjE4LDQxIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQ7IC8vIGZsYWcgZm9yIGN1cnJlbnQgcGFyYW1ldGVycyB2YWxpZGl0eQogfTsKIAorLy8gQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIGFkanVzdCBzYW1wbGUgZGF0YS4KKy8vIEV4cGFuZHMgb3IgY29udHJhY3RzIHNhbXBsZSBkYXRhIGZyb20gb25lIGludGVybGVhdmVkIGNoYW5uZWwgZm9ybWF0IHRvIGFub3RoZXIuCisvLyBFeHRyYSBleHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kIG9mIGVhY2ggYXVkaW8gZnJhbWUuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGFyZSBjb3BpZWQgdG8gdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcihzdG9yYWdlIHNob3VsZCBiZQorLy8gYWxsb2NhdGVkIGFwcHJvcHJpYXRlbHkpLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIuCitjbGFzcyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50KSA6IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgQVVESU9fRk9STUFUX0lOVkFMSUQsIG51bGxwdHIpIHsgfQorICAgIC8vIENvbnRyYWN0ZWQgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gY29udHJhY3RlZEZvcm1hdCBhbmQgcHV0IGludG8gY29udHJhY3RlZEJ1ZmZlci4KKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQsIGF1ZGlvX2Zvcm1hdF90IGNvbnRyYWN0ZWRGb3JtYXQsCisgICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyKTsKKyAgICAvL092ZXJyaWRlcworICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBwQnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY2xlYXJDb250cmFjdGVkRnJhbWVzKCkgeyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtQ29udHJhY3RlZEZvcm1hdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICptQ29udHJhY3RlZEJ1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXM7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemU7Cit9OwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKaW5kZXggZDJhM2U0MC4uZDk3Y2MwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaApAQCAtMTcsMTEgKzE3LDExIEBACiAjaWZuZGVmIEFORFJPSURfQlVGRkVSSU5HX1NFVFRJTkdTX0gKICNkZWZpbmUgQU5EUk9JRF9CVUZGRVJJTkdfU0VUVElOR1NfSAogCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzIDogcHVibGljIFBhcmNlbGFibGUgeworc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzIHsKICAgICBzdGF0aWMgY29uc3QgaW50IGtOb01hcmsgPSAtMTsKIAogICAgIGludCBtSW5pdGlhbE1hcmtNczsKQEAgLTMyLDkgKzMyLDYgQEAKIAogICAgIEJ1ZmZlcmluZ1NldHRpbmdzKCk7CiAKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCmluZGV4IGRlYWEzNzcuLjYyNTY0YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCkBAIC01NCw2ICs1NCw3IEBACiAgICAgICAgIFN0cmluZ0FycmF5ICAgICBtVmFsdWVzOwogCiAgICAgICAgIFVDb252ZXJ0ZXIqICAgICBtVXRmOENvbnY7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICBtTG9jYWxlRW5jOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0by5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4NDEzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0by5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ1JZUFRPX0hfCi0KLSNkZWZpbmUgQ1JZUFRPX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLSNpbmNsdWRlICJTaGFyZWRMaWJyYXJ5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IENyeXB0b0ZhY3Rvcnk7Ci1zdHJ1Y3QgQ3J5cHRvUGx1Z2luOwotCi1zdHJ1Y3QgQ3J5cHRvIDogcHVibGljIEJuQ3J5cHRvIHsKLSAgICBDcnlwdG8oKTsKLSAgICB2aXJ0dWFsIH5DcnlwdG8oKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpOwotCi0gICAgdmlydHVhbCBib29sIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAotICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiAmcGF0dGVybiwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2UsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICBjb25zdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCi0gICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciAmZGVzdGluYXRpb24sIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRIZWFwKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChjb25zdCBzcDxJTWVtb3J5SGVhcD4mKSB7fQotCi1wcml2YXRlOgotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0KLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIENyeXB0b0ZhY3RvcnkgKm1GYWN0b3J5OwotICAgIENyeXB0b1BsdWdpbiAqbVBsdWdpbjsKLQotICAgIHN0YXRpYyBLZXllZFZlY3RvcjxWZWN0b3I8dWludDhfdD4sIFN0cmluZzg+IG1VVUlEVG9MaWJyYXJ5UGF0aE1hcDsKLSAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotICAgIHN0YXRpYyBNdXRleCBtTWFwTG9jazsKLQotICAgIHZvaWQgZmluZEZhY3RvcnlGb3JTY2hlbWUoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7Ci0gICAgYm9vbCBsb2FkTGlicmFyeUZvclNjaGVtZShjb25zdCBTdHJpbmc4ICZwYXRoLCBjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ1JZUFRPX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAppbmRleCBmZjg3ODlkLi43M2MwMjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvUGx1Z2luLmg+CiAKICNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTcyLDYgKzczLDcgQEAKIAogICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4+IG1QbHVnaW5WMV8yOwogCiAgICAgLyoqCiAgICAgICogbUluaXRDaGVjayBpczoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAppbmRleCBjMTkwMjYxLi40MzM2NzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCkBAIC0zMCw2ICszMCwxMSBAQAogLy8gQSBiaW5kZXIgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgYSBzdGFnZWZyaWdodCBEYXRhU291cmNlIHJlbW90ZWx5Lgogc3RydWN0IERhdGFTb3VyY2VEZXNjIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgorICAgIC8vIGludGVudGlvbmFsbHkgbGVzcyB0aGFuIElOVDY0X01BWAorICAgIC8vIGtlZXAgY29uc2lzdGVudCB3aXRoIEpBVkEgY29kZQorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lTXMgPSAweDdmZmZmZmZmZmZmZmZmZmxsIC8gMTAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4VGltZVVzID0ga01heFRpbWVNcyAqIDEwMDA7CisKICAgICBlbnVtIHsKICAgICAgICAgLyogTm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHlldCAqLwogICAgICAgICBUWVBFX05PTkUgICAgID0gMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg2OWNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFJNX0hfCi0KLSNkZWZpbmUgRFJNX0hfCi0KLSNpbmNsdWRlICJTaGFyZWRMaWJyYXJ5LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURybUNsaWVudC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEcm1GYWN0b3J5OwotY2xhc3MgRHJtUGx1Z2luOwotc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7Ci0KLXN0cnVjdCBEcm0gOiBwdWJsaWMgQm5Ecm0sCi0gICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgIHB1YmxpYyBEcm1QbHVnaW5MaXN0ZW5lciB7Ci0gICAgRHJtKCk7Ci0gICAgdmlydHVhbCB+RHJtKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJmFwcFBhY2thZ2VOYW1lKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190Ci0gICAgICAgIGdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZtaW1lVHlwZSwgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBbGxTZWN1cmVTdG9wcygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOwotCi0gICAgdmlydHVhbCB2b2lkIHNlbmRFdmVudChEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpkYXRhKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZW5kRXhwaXJhdGlvblVwZGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2VuZEtleXNDaGFuZ2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxEcm1QbHVnaW46OktleVN0YXR1cz4gY29uc3QgKmtleVN0YXR1c0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBtTG9jazsKLQotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBtRHJtU2Vzc2lvbkNsaWVudDsKLQotICAgIHNwPElEcm1DbGllbnQ+IG1MaXN0ZW5lcjsKLSAgICBtdXRhYmxlIE11dGV4IG1FdmVudExvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtTm90aWZ5TG9jazsKLQotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIERybUZhY3RvcnkgKm1GYWN0b3J5OwotICAgIERybVBsdWdpbiAqbVBsdWdpbjsKLQotICAgIHN0YXRpYyBLZXllZFZlY3RvcjxWZWN0b3I8dWludDhfdD4sIFN0cmluZzg+IG1VVUlEVG9MaWJyYXJ5UGF0aE1hcDsKLSAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotICAgIHN0YXRpYyBNdXRleCBtTWFwTG9jazsKLQotICAgIHZvaWQgZmluZEZhY3RvcnlGb3JTY2hlbWUoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7Ci0gICAgYm9vbCBsb2FkTGlicmFyeUZvclNjaGVtZShjb25zdCBTdHJpbmc4ICZwYXRoLCBjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqYXJyYXkpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ1JZUFRPX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAppbmRleCBmMjY3Zjc2Li5iZGYxYjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKQEAgLTIwLDkgKzIwLDExIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgpAQCAtMzUsMTEgKzM3LDE2IEBACiB1c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwogdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwogdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCit0eXBlZGVmIGRybTo6VjFfMjo6SURybVBsdWdpbkxpc3RlbmVyIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yOwordHlwZWRlZiBkcm06OlYxXzA6OktleVN0YXR1cyBLZXlTdGF0dXNfVjFfMDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZTsKQEAgLTUwLDE0ICs1NywxNyBAQAogfQogCiBzdHJ1Y3QgRHJtSGFsIDogcHVibGljIEJuRHJtLAotICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCisgICAgICAgICAgICAgICAgcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lcl9WMV8yIHsKICAgICBEcm1IYWwoKTsKICAgICB2aXJ0dWFsIH5Ecm1IYWwoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CkBAIC0xMTMsNiArMTIzLDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKQEAgLTE2Niw4ICsxODEsMTMgQEAKICAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOwogCiAgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKIAorICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwogCiBwcml2YXRlOgpAQCAtMTgyLDYgKzIwMiw3IEBACiAgICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7CisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKICAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKIAogICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KQEAgLTIxMCw2ICsyMzEsMTEgQEAKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCmluZGV4IDI2MTk5OGYuLjZmMTMyYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9Db3VudGVyTWV0cmljLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KQEAgLTUwLDcgKzUxLDcgQEAKICAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXI7CiAKICAgLy8gQ291bnQgb2Yga2V5IHN0YXR1cyBldmVudHMgYnJva2VuIG91dCBieSBzdGF0dXMgdHlwZS4KLSAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU+CisgIENvdW50ZXJNZXRyaWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlPgogICAgICAgbUtleVN0YXR1c0NoYW5nZUNvdW50ZXI7CiAgIC8vIENvdW50IG9mIGV2ZW50cyBicm9rZW4gb3V0IGJ5IGV2ZW50IHR5cGUKICAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZT4gbUV2ZW50Q291bnRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggOGU5ZWIzYS4uZmJlODBjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTM0LDcgKzM0LDEwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpyZXN1bHQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpID0gMDsKQEAgLTc1LDggKzc4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpID0gMDsKQEAgLTkxLDYgKzk0LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJmtleVNldElkcykgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0ID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCmluZGV4IDQ1ZTk2MjAuLjVjZTJjZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfSU1FRElBRVhUUkFDVE9SU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfSU1FRElBRVhUUkFDVE9SU0VSVklDRV9ICiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTMzLDYgKzM1LDggQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYUV4dHJhY3Rvcj4gbWFrZUV4dHJhY3Rvcihjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gZ2V0U3VwcG9ydGVkVHlwZXMoKSA9IDA7CiB9OwogCiBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDIxN2RlMTQuLmYyZTIwNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0yNiwxMSArMjYsMTEgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSU1lZGlhUGxheWVyOwogY2xhc3MgSU1lZGlhQ29kZWNMaXN0Owogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggMzc5MDAwZS4uZjljNTU3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtNzMsNyArNzMsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpID0gMDsKLQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCmluZGV4IDdhNGIxYjkuLjM4MWRmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaApAQCAtMTI0LDEwICsxMjQsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JpbmRlck1lZGlhQnVmZmVycyA9IDQ7IC8vIGJ1ZmZlcnMgbWFuYWdlZCBieSBCbk1lZGlhU291cmNlCisgICAgLy8gYWxpZ24gYnVmZmVyIGNvdW50IHdpdGggdmlkZW8gcmVxdWVzdCBzaXplIGluIE51TWVkaWFFeHRyYWN0b3I6OnNlbGVjdFRyYWNrKCkKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaW5kZXJNZWRpYUJ1ZmZlcnMgPSA4OyAvLyBidWZmZXJzIG1hbmFnZWQgYnkgQm5NZWRpYVNvdXJjZQogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RyYW5zZmVyU2hhcmVkQXNTaGFyZWRUaHJlc2hvbGQgPSA0ICogMTAyNDsgIC8vIGlmID49IHNoYXJlZCwgZWxzZSBpbmxpbmUKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUcmFuc2ZlcklubGluZUFzU2hhcmVkVGhyZXNob2xkID0gNjQgKiAxMDI0OyAvLyBpZiA+PSBzaGFyZWQsIGVsc2UgaW5saW5lCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSW5saW5lTWF4VHJhbnNmZXIgPSAyNTYgKiAxMDI0OyAvLyBCaW5kZXIgc2l6ZSBsaW1pdGVkIHRvIEJJTkRFUl9WTV9TSVpFLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RyYW5zZmVySW5saW5lQXNTaGFyZWRUaHJlc2hvbGQgPSA4ICogMTAyNDsgLy8gaWYgPj0gc2hhcmVkLCBlbHNlIGlubGluZQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0lubGluZU1heFRyYW5zZmVyID0gNjQgKiAxMDI0OyAvLyBCaW5kZXIgc2l6ZSBsaW1pdGVkIHRvIEJJTkRFUl9WTV9TSVpFLgogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+Qm5NZWRpYVNvdXJjZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCBlNjljMDJkLi43ZTdjMmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtNDcsOSArNDcsOCBAQAogCiB1c2luZyBoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SU9teE5vZGU7CiAKLWNsYXNzIElPTVggOiBwdWJsaWMgSUludGVyZmFjZSB7CitjbGFzcyBJT01YIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoT01YKTsKIAogICAgIHR5cGVkZWYgdWludDMyX3QgYnVmZmVyX2lkOwogCkBAIC0yMjQsMTQgKzIyMyw2IEBACiB9OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1jbGFzcyBCbk9NWCA6IHB1YmxpYyBCbkludGVyZmFjZTxJT01YPiB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KIGNsYXNzIEJuT01YTm9kZSA6IHB1YmxpYyBCbkludGVyZmFjZTxJT01YTm9kZT4gewogcHVibGljOgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBiMzc3N2QzLi41NGY1NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTEsMjEgKzUzLDQ3IEBACiAKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOwogCisgICAgZW51bSBBdHRyaWJ1dGVzIDogaW50MzJfdCB7CisgICAgICAgIC8vIGF0dHJpYnV0ZSBmbGFncworICAgICAgICBrRmxhZ0lzRW5jb2RlciA9IDEgPDwgMCwKKyAgICAgICAga0ZsYWdJc1ZlbmRvciA9IDEgPDwgMSwKKyAgICAgICAga0ZsYWdJc1NvZnR3YXJlT25seSA9IDEgPDwgMiwKKyAgICAgICAga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQgPSAxIDw8IDMsCisgICAgfTsKKwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgLy8gZGVjb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sgPSAxIDw8IDAsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzU2VjdXJlUGxheWJhY2sgPSAxIDw8IDEsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayA9IDEgPDwgMiwKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLWFkYXB0aXZlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXSA9ICJmZWF0dXJlLWR5bmFtaWMtdGltZXN0YW1wIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0lOVFJBX1JFRlJFU0hbXSA9ICJmZWF0dXJlLWZyYW1lLXBhcnNpbmciOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXSA9ICJmZWF0dXJlLW11bHRpcGxlLWZyYW1lcyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX1NFQ1VSRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIjsKIAotICAgICAgICAgICAgLy8gZW5jb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCA9IDEgPDwgMCwKLQotICAgICAgICB9OwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbGV2ZWxzIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9maWxlIGluIGEgdGFyZ2V0IGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZUxldmVscyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBwcm9maWxlIGxldmVscy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscyhWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjb2xvciBmb3JtYXRzIGluIGEgdGFyZ2V0IGFycmF5LiBPbmx5IHVzZWQgZm9yIHZpZGVvL2ltYWdlCisgICAgICAgICAqIGNvbXBvbmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xvckZvcm1hdHMgdGFyZ2V0IGFycmF5IGZvciB0aGUgY29sb3IgZm9ybWF0cy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cykgY29uc3Q7Ci0gICAgICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZWMgY2FwYWJpbGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBjb250YWluczoKKyAgICAgICAgICogLSBmZWF0dXJlcywKKyAgICAgICAgICogLSBwZXJmb3JtYW5jZSBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBleHBvc2UgdGhpcyBhcyBzZXBhcmF0ZSBBUEktcyBhbmQgd3JhcCBoZXJlLgorICAgICAgICAgKi8KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKIAogICAgIHByb3RlY3RlZDoKQEAgLTczLDcgKzEwMSw2IEBACiAgICAgICAgIFNvcnRlZFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzU29ydGVkOwogICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CiAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0c1NvcnRlZDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwogICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CiAKICAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CkBAIC05Myw4ICsxMjAsNyBAQAogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGluZm9ybWF0aW9uIGluc2lkZSBhIGBDYXBhYmlsaXRpZXNgCiAgICAgICogb2JqZWN0LiBBbiBvYmplY3Qgb2YgdHlwZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZwotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZSgpYCBvcgotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6dXBkYXRlTWltZSgpYC4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZSgpYC4KICAgICAgKi8KICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyIHsKICAgICAgICAgLyoqCkBAIC0xMjIsNiArMTQ4LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZERldGFpbChjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpOwogICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBpcyBub3QKKyAgICAgICAgICogcHJlc2VudCwgdGhpcyBjYWxsIGRvZXMgbm90aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KTsKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHByb2ZpbGUtbGV2ZWwgcGFpci4gSWYgdGhpcyBwcm9maWxlLWxldmVsIHBhaXIgYWxyZWFkeSBleGlzdHMsCiAgICAgICAgICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICoKQEAgLTEzNiwxMyArMTY5LDcgQEAKICAgICAgICAgICogQHBhcmFtIGZvcm1hdCBUaGUgY29sb3IgZm9ybWF0LgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRDb2xvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGZsYWdzLiBUaGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgYml0d2lzZS1vci4gSW4gb3RoZXIgd29yZHMsCi0gICAgICAgICAqIGJpdHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGFkZGl0aW9uYWwgZmxhZ3MuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCkBAIC0xNTgsMTkgKzE4NSw0MiBAQAogICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAotICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKLSAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBpbmxpbmUgYm9vbCBpc0VuY29kZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkgJiBrRmxhZ0lzRW5jb2RlcjsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBjb250YWluaW5nIGFsdGVybmF0ZSBuYW1lcyBmb3IgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogXHBhcmFtIGFsaWFzZXMgdGhlIGRlc3RpbmF0aW9uIGFycmF5IGZvciB0aGUgYWxpYXNlcy4gVGhpcyBpcyBjbGVhcmVkLgorICAgICAqCisgICAgICogTXVsdGlwbGUgY29kZWNzIG1heSBzaGFyZSBhbHRlcm5hdGUgbmFtZXMgYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlCisgICAgICogZGlzdGluY3Q7IGhvd2V2ZXIsIHRoZXNlIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBhbGlhc2VzIGZvciB0aGUgTWVkaWFDb2RlYyB1c2VyIGFzCisgICAgICogdGhlIGNhbm9uaWNhbCBjb2RlYyBoYXMgdG8gYmUgcmVzb2x2ZWQgd2l0aG91dCBrbm93aW5nIHRoZSBtZWRpYSB0eXBlIGluCisgICAgICogTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lLgorICAgICAqLworICAgIHZvaWQgZ2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAogICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCiAgICAgICoKICAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IHJhbmsoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhbmsgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRlY2huaWNhbGx5IHRoaXMgaXMgZGVmaW5lZCB0byBiZSBwZXIgbWVkaWEgdHlwZSwgYnV0IHRoYXQgbWFrZXMgb3JkZXJpbmcgdGhlIE1lZGlhQ29kZWNMaXN0CisgICAgICogaW1wb3NzaWJsZSBhcyBNZWRpYUNvZGVjTGlzdCBpcyBvcmRlcmVkIGJ5IGNvZGVjIG5hbWUuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgpAQCAtMTgxLDExICsyMzEsMTIgQEAKIHByaXZhdGU6CiAgICAgQVN0cmluZyBtTmFtZTsKICAgICBBU3RyaW5nIG1Pd25lcjsKLSAgICBib29sIG1Jc0VuY29kZXI7CisgICAgQXR0cmlidXRlcyBtQXR0cmlidXRlczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CisgICAgVmVjdG9yPEFTdHJpbmc+IG1BbGlhc2VzOwogICAgIHVpbnQzMl90IG1SYW5rOwogCi0gICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4gQWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiwgaXRzCkBAIC0yMTksNiArMjcwLDEzIEBACiAgICAgICovCiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwogICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWxpYXMgKGFsdGVybmF0ZSBuYW1lKSBmb3IgdGhlIGNvZGVjLiBNdWx0aXBsZSBjb2RlY3MgY2FuIHNoYXJlIGFuIGFsdGVybmF0ZSBuYW1lCisgICAgICogYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlIGRpc3RpbmN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYW4gYWx0ZXJuYXRlIG5hbWUuCisgICAgICovCisgICAgdm9pZCBhZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIG93bmVyIG5hbWUgb2YgdGhlIGNvZGVjLgogICAgICAqCiAgICAgICogVGhpcyAib3duZXIgbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGBJT214YCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoaXMKQEAgLTIyOCwzMiArMjg2LDMyIEBACiAgICAgICovCiAgICAgdm9pZCBzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcik7CiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBTZXRzIGNvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaXNFbmNvZGVyIFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBDb2RlYyBhdHRyaWJ1dGVzLgogICAgICAqLwotICAgIHZvaWQgc2V0RW5jb2Rlcihib29sIGlzRW5jb2RlciA9IHRydWUpOworICAgIHZvaWQgc2V0QXR0cmlidXRlcyh0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcyk7CiAgICAgLyoqCi0gICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIEFkZCBhIG1lZGlhIHR5cGUgdG8gYW4gaW5kZXhlZCBsaXN0IGFuZCByZXR1cm4gYSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QKICAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RpZnlpbmcgdGhlIGFzc29jaWF0ZWQgYENhcGFiaWxpdGllc2AuCiAgICAgICoKLSAgICAgKiBJZiB0aGUgbWltZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuCisgICAgICogSWYgdGhlIG1lZGlhIHR5cGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCisgICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtW2luXSBtaW1lIFRoZSBuYW1lIG9mIGEgbmV3IG1pbWUgdG8gYWRkLgorICAgICAqIEBwYXJhbVtpbl0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIGEgbmV3IG1lZGlhIHR5cGUgdG8gYWRkLgogICAgICAqIEByZXR1cm4gd3JpdGVyIFRoZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QgZm9yIG1vZGlmeWluZyB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1pbWVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KKyAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1lZGlhVHlwZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgogICAgICAqLwotICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBhZGRNaW1lKAotICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1lZGlhVHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGEgbWltZS4KKyAgICAgKiBSZW1vdmUgYSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgdHlwZSB0byByZW1vdmUuCisgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1lZGlhVHlwZWAgaXMgcmVtb3ZlZDsgYGZhbHNlYCBpZiBgbWVkaWFUeXBlYCBpcyBub3QgZm91bmQuCiAgICAgICovCi0gICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIGJvb2wgcmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCiAgICAgICogU2V0IHJhbmsgb2YgdGhlIGNvZGVjLiBNZWRpYUNvZGVjTGlzdCB3aWxsIHN0YWJsZS1zb3J0IHRoZSBsaXN0IGFjY29yZGluZwogICAgICAqIHRvIHJhbmsgaW4gbm9uLWRlc2NlbmRpbmcgb3JkZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDBmZWI0ZjMuLjNlOGU3YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0zNCw3ICszNCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZXzEwODBQID0gNiwKICAgICBDQU1DT1JERVJfUVVBTElUWV9RVkdBID0gNywKICAgICBDQU1DT1JERVJfUVVBTElUWV8yMTYwUCA9IDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1ZHQSA9IDksCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0kgPSAxMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9RSEQgPSAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8yayA9IDEyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gMTIsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00Niw3ICs1MCwxMSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQSA9IDEwMDcsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yMTYwUCA9IDEwMDgsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0EgPSAxMDA5LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0kgPSAxMDEwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEID0gMTAxMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrID0gMTAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAxMiwKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKQEAgLTU1LDcgKzYzLDEwIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRiA9IDIwMDYsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9WR0EgPSAyMDA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0kgPSAyMDA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA4LAogfTsKIAogZW51bSB2aWRlb19kZWNvZGVyIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1MzQwZGRlLi5hMmRmZjMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC03Miw2ICs3Miw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0ID0gMDsKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKaW5kZXggYjVlNTY1ZS4uYjE5ZDQ5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmgKQEAgLTIzLDExICsyMywxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VVbndyYXBwZXI7CisKIGNsYXNzIE1pZGlJb1dyYXBwZXIgewogcHVibGljOgogICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpOwotICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSk7CiAKICAgICB+TWlkaUlvV3JhcHBlcigpOwogCkBAIC00MCw3ICs0Myw3IEBACiAgICAgaW50IG1GZDsKICAgICBvZmY2NF90IG1CYXNlOwogICAgIGludDY0X3QgIG1MZW5ndGg7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VVbndyYXBwZXIgKm1EYXRhU291cmNlOwogICAgIEVBU19GSUxFIG1FYXNGaWxlOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAppbmRleCBjOTdkMTcxLi44YTQxN2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaApAQCAtMjc4LDYgKzI3OCwyNSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjV3JhcHBlcik7CiB9OwogCitzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiYpOworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UqKTsKKworICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Cit9OworCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKIAogICAgIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yICphTWVkaWFFeHRyYWN0b3IpOwpAQCAtMjg3LDggKzMwNiw2IEBACiAKICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CiAKLSAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7Ci0KICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pOwpAQCAtMzM5LDMxICszNTYsNiBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUV4dHJhY3RvcldyYXBwZXIpOwogfTsKIAotc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewotCi0gICAgc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Ci19OwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE5ES19XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaAppbmRleCA5YzlmNWU3Li40YWJlOWU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgIGhpZGxfbWVtb3J5IG1IaWRsTWVtb3J5OwogCiAgICAgLy8gTW92ZSBhc3NpZ25tZW50Ci0gICAgT01YQnVmZmVyICZvcGVyYXRvcj0oT01YQnVmZmVyJiYpOworICAgIE9NWEJ1ZmZlciAmb3BlcmF0b3I9KE9NWEJ1ZmZlciYmKSBub2V4Y2VwdDsKIAogICAgIC8vIERlbGV0ZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudC4KICAgICBPTVhCdWZmZXIoY29uc3QgT01YQnVmZmVyJikgPSBkZWxldGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcyMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworLy8gVGhpcyBpcyBhIGhlYWRlci1vbmx5IHV0aWxpdHkuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUGF0Y2hCdWlsZGVyIHsKKyAgcHVibGljOgorICAgIHVzaW5nIG1peF91c2VjYXNlX3QgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKKworICAgIFBhdGNoQnVpbGRlcigpID0gZGVmYXVsdDsKKworICAgIC8vIEFsbCBleGlzdGluZyBtZXRob2RzIG9wZXJhdGluZyBvbiBhdWRpbyBwYXRjaGVzIHRha2UgYSBwb2ludGVyIHRvIGNvbnN0LgorICAgIC8vIEl0J3MgT0sgdG8gY29uc3RydWN0IGEgdGVtcG9yYXJ5IFBhdGNoQnVpbGRlciB3aGlsZSBwcmVwYXJpbmcgYSBwYXJhbWV0ZXIKKyAgICAvLyB0byBzdWNoIGEgZnVuY3Rpb24gYmVjYXVzZSB0aGUgQnVpbGRlciB3aWxsIGJlIGtlcHQgYWxpdmUgdW50aWwgdGhlIGNvZGUKKyAgICAvLyBleGVjdXRpb24gcmVhY2hlcyB0aGUgZnVuY3Rpb24gY2FsbCBzdGF0ZW1lbnQgc2VtaWNvbG9uLgorICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2goKSBjb25zdCB7IHJldHVybiAmbVBhdGNoOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IFBvcnRDZmdzIHsKKyAgICAgICAgUG9ydENmZ3ModW5zaWduZWQgaW50ICpjb3VudFB0ciwgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpwb3J0Q2ZncykKKyAgICAgICAgICAgICAgICA6IG1Db3VudFB0cihjb3VudFB0ciksIG1Qb3J0Q2Zncyhwb3J0Q2Zncykge30KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydENmZykgeworICAgICAgICAgICAgcmV0dXJuICphZHZhbmNlKCkgPSBwb3J0Q2ZnOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSkgeworICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcqIGFkZGVkID0gYWR2YW5jZSgpOworICAgICAgICAgICAgZW50aXR5LT50b0F1ZGlvUG9ydENvbmZpZyhhZGRlZCk7CisgICAgICAgICAgICByZXR1cm4gKmFkZGVkOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksIGNvbnN0IG1peF91c2VjYXNlX3QmIHVzZWNhc2VVcGRhdGUpIHsKKyAgICAgICAgICAgIGFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZSA9IHVzZWNhc2VVcGRhdGU7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPG1peF91c2VjYXNlX3QoY29uc3QgbWl4X3VzZWNhc2VfdCYpPiB1c2VjYXNlVXBkYXRlcikgeworICAgICAgICAgICAgbWl4X3VzZWNhc2VfdCogdXNlY2FzZSA9ICZhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2U7CisgICAgICAgICAgICAqdXNlY2FzZSA9IHVzZWNhc2VVcGRhdGVyKCp1c2VjYXNlKTsKKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGFkdmFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gJm1Qb3J0Q2Znc1soKm1Db3VudFB0cikrK107CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgaW50ICptQ291bnRQdHI7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqbVBvcnRDZmdzOworICAgIH07CisKKyAgICBQb3J0Q2ZncyBzaW5rcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NpbmtzLCBtUGF0Y2guc2lua3MpOyB9CisgICAgUG9ydENmZ3Mgc291cmNlcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaCA9IHt9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1BBVENIX0JVSUxERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaAppbmRleCBkNDIzOTYyLi5jMjc2MWNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaApAQCAtOTksNiArOTksMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tQWNrIC0gc2VxdWVuY2UgPj0gMDsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbiAob3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzaGFyZWQgYnVmZmVyIGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIC8vIGlmIG5vIHZhbHVlIHdhcyB3cml0dGVuKS4KKyAgICAgICAgVCBsYXN0KCkgY29uc3QKKyAgICAgICAgeyAgIC8vIGFzc3VtZSBubyBzZXF1ZW5jZSBjaGVjayByZXF1aXJlZCAtIHdlIGFyZSB0aGUgd3JpdGVyLgorICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1WYWx1ZTsKKyAgICAgICAgfQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgaW50MzJfdCAgICAgbVNlcXVlbmNlOwogICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA4NmYwZDRjLi4yZjhjMjA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTMwLDc3ICszMSw1NSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBTYW1wbGVSYXRlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IERldmljZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZGV2aWNlc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgT3V0cHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Ci1zdHJ1Y3QgT3V0cHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBJbnB1dEZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2lucHV0X2ZsYWdzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBGb3JtYXRUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2Zvcm1hdF90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQ2hhbm5lbFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY2hhbm5lbF9tYXNrX3QgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgSW5wdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgQ2hhbm5lbEluZGV4VHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Ci1zdHJ1Y3QgR2Fpbk1vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2dhaW5fbW9kZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgU3RyZWFtVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19zdHJlYW1fdHlwZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQXVkaW9Nb2RlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb0NvbnRlbnRUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2NvbnRlbnRfdHlwZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgVXNhZ2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3VzYWdlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTb3VyY2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3NvdXJjZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBEZWZhdWx0VHJhaXRzCiB7CiAgICAgdHlwZWRlZiBUIFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgfQogfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFZlY3RvclRyYWl0cworeworICAgIHR5cGVkZWYgVCBUeXBlOworICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgfQorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNvcnRlZFZlY3RvclRyYWl0cworeworICAgIHR5cGVkZWYgVCBUeXBlOworICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgc3RhdGljIHZvaWQgYWRkKENvbGxlY3Rpb24gJmNvbGxlY3Rpb24sIFR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgfQorfTsKKwordXNpbmcgU2FtcGxlUmF0ZVRyYWl0cyA9IFNvcnRlZFZlY3RvclRyYWl0czx1aW50MzJfdD47Cit1c2luZyBEZXZpY2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2RldmljZXNfdD47CitzdHJ1Y3QgT3V0cHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Cit1c2luZyBDaGFubmVsVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPGF1ZGlvX2NoYW5uZWxfbWFza190PjsKK3N0cnVjdCBPdXRwdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307CitzdHJ1Y3QgSW5wdXRDaGFubmVsVHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307CitzdHJ1Y3QgQ2hhbm5lbEluZGV4VHJhaXRzIDogcHVibGljIENoYW5uZWxUcmFpdHMge307Cit1c2luZyBJbnB1dEZsYWdUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OwordXNpbmcgT3V0cHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+OwordXNpbmcgRm9ybWF0VHJhaXRzID0gVmVjdG9yVHJhaXRzPGF1ZGlvX2Zvcm1hdF90PjsKK3VzaW5nIEdhaW5Nb2RlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19nYWluX21vZGVfdD47Cit1c2luZyBTdHJlYW1UcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OwordXNpbmcgQXVkaW9Nb2RlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19tb2RlX3Q+OwordXNpbmcgQXVkaW9Db250ZW50VHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19jb250ZW50X3R5cGVfdD47Cit1c2luZyBVc2FnZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fdXNhZ2VfdD47Cit1c2luZyBTb3VyY2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3NvdXJjZV90PjsKK3N0cnVjdCBBdWRpb0ZsYWdUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czxhdWRpb19mbGFnc19tYXNrX3Q+IHt9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgogc3RhdGljIHZvaWQgY29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLApAQCAtMTEwLDcgKzg5LDcgQEAKICAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwogICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSA+KGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0xODEsNyArMTYwLDcgQEAKICAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwogICAgICAgICBpZiAoZnJvbVN0cmluZyhjc3RyLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIFRyYWl0czo6YWRkKGNvbGxlY3Rpb24sIHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KICAgICBmcmVlKGxpdGVyYWwpOwpAQCAtMjM0LDYgKzIxMyw3IEBACiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9Db250ZW50VHJhaXRzPiBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPiBVc2FnZVR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPiBTb3VyY2VUeXBlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz4gQXVkaW9GbGFnQ29udmVydGVyOwogCiB0ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgSW5wdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIElucHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXTsKQEAgLTI0OSwxMSArMjI5LDEwIEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwogCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKTsKLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCkBAIC0yNzQsNiArMjUzLDY1IEBACiBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKKy8vIGNvdW50aW5nIGVudW1lcmF0aW9ucwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGF1ZGlvX2NvbnRlbnRfdHlwZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19tb2RlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3NvdXJjZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zdHJlYW1fdHlwZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb191c2FnZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXR1cm4gVHlwZUNvbnZlcnRlcjxEZWZhdWx0VHJhaXRzPFQ+Pjo6dG9TdHJpbmcodmFsdWUsIHJlc3VsdCkKKyAgICAgICAgICAgID8gcmVzdWx0IDogc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpOworCit9CisKKy8vIGZsYWcgZW51bWVyYXRpb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX291dHB1dF9mbGFnc190Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBUeXBlQ29udmVydGVyPERlZmF1bHRUcmFpdHM8VD4+OjptYXNrVG9TdHJpbmcodmFsdWUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19kZXZpY2VzX3QmIGRldmljZXMpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGlmICgoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFRPRE86IFJlbW92ZSB3aGVuIEZvcm1hdFRyYWl0cyB1c2VzIERlZmF1bHRUcmFpdHMuCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHJldHVybiBUeXBlQ29udmVydGVyPFZlY3RvclRyYWl0czxhdWRpb19mb3JtYXRfdD4+Ojp0b1N0cmluZyhmb3JtYXQsIHJlc3VsdCkKKyAgICAgICAgICAgID8gcmVzdWx0IDogc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50Pihmb3JtYXQpKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgInsgQ29udGVudCB0eXBlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuY29udGVudF90eXBlKQorICAgICAgICAgICA8PCAiIFVzYWdlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMudXNhZ2UpCisgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCAiIEZsYWdzOiAweCIgPDwgYXR0cmlidXRlcy5mbGFncworICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiIFRhZ3M6ICIgPDwgYXR0cmlidXRlcy50YWdzCisgICAgICAgICAgIDw8ICIgfSI7CisKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8qQU5EUk9JRF9UWVBFX0NPTlZFUlRFUl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCmluZGV4IGNkZWY2MzcuLmQyOWU5N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCkBAIC02OCw2ICs2OCwxMSBAQAogICAgIE1FVEFEQVRBX0tFWV9WSURFT19GUkFNRV9DT1VOVCAgPSAzMiwKICAgICBNRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQgICAgID0gMzMsCiAgICAgTUVUQURBVEFfS0VZX0VYSUZfTEVOR1RIICAgICA9IDM0LAorICAgIE1FVEFEQVRBX0tFWV9DT0xPUl9TVEFOREFSRCAgPSAzNSwKKyAgICBNRVRBREFUQV9LRVlfQ09MT1JfVFJBTlNGRVIgID0gMzYsCisgICAgTUVUQURBVEFfS0VZX0NPTE9SX1JBTkdFICAgICA9IDM3LAorICAgIE1FVEFEQVRBX0tFWV9TQU1QTEVSQVRFICAgICAgPSAzOCwKKyAgICBNRVRBREFUQV9LRVlfQklUU19QRVJfU0FNUExFID0gMzksCiAKICAgICAvLyBBZGQgbW9yZSBoZXJlLi4uCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li4yZGQ0YjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpAQCAtMTExLDkgKzExNSw2IEBACiAgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKLSAgICAvLyBFcnJvciBzdGF0ZS4KLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCi0KICAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKIApAQCAtMTI4LDYgKzEyOSw5IEBACiAKICAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAorCisgICAgLy8gRXJyb3Igc3RhdGUuCisgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gMSA8PCA1LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCkBAIC0yNjAsNiArMjY0LDEwIEBACiAgICAgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpOwogICAgIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdHVzX3QgICAgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZG9DbGVhblVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaAppbmRleCAzNzAwYTIzLi42ZGM0NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE0LDggKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAorI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSAogCiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGxpc3Q+CkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogCisjaW5jbHVkZSA8dWkvQnVmZmVyUXVldWVEZWZzLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KQEAgLTI1OCw3ICsyNTgsMTIgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAodC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKTsKKyAgICB9IGVsc2UgaWYgKHQuaXNEZWFkT2JqZWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCkBAIC0yODIsOCArMjg3LDggQEAKICAgICBjYXNlIFRJTUVEX09VVDoKICAgICBjYXNlIEVSUk9SX1VOU1VQUE9SVEVEOgogICAgIGNhc2UgVU5LTk9XTl9FUlJPUjoKLSAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlJFTEVBU0VfQUxMX0JVRkZFUlM6Ci0gICAgY2FzZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgorICAgIGNhc2UgQnVmZmVyUXVldWVEZWZzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgorICAgIGNhc2UgQnVmZmVyUXVldWVEZWZzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihsKTsKICAgICBjYXNlIE5PVF9FTk9VR0hfREFUQToKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjsKQEAgLTYyMCw4ICs2MjUsMTggQEAKIC8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCiAvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KIGlubGluZSBib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IHQubmF0aXZlSGFuZGxlID09IG51bGxwdHIgPwotICAgICAgICAgICAgbnVsbHB0ciA6IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5uYXRpdmVIYW5kbGUpOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKworICAgIGlmICh0Lm5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5uYXRpdmVIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY2xvbmUgaGFuZGxlOiBudW1GZHM9JWQsIGRhdGFbMF09JWQsIGRhdGFbMV09JWQiLAorICAgICAgICAgICAgICAgICAgICB0Lm5hdGl2ZUhhbmRsZS0+bnVtRmRzLAorICAgICAgICAgICAgICAgICAgICAodC5uYXRpdmVIYW5kbGUtPm51bUZkcyA+IDApID8gdC5uYXRpdmVIYW5kbGUtPmRhdGFbMF0gOiAtMSwKKyAgICAgICAgICAgICAgICAgICAgKHQubmF0aXZlSGFuZGxlLT5udW1GZHMgPiAxKSA/IHQubmF0aXZlSGFuZGxlLT5kYXRhWzFdIDogLTEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogCiAgICAgc2l6ZV90IGNvbnN0IG51bUludHMgPSAxMiArIChoYW5kbGUgPyBoYW5kbGUtPm51bUludHMgOiAwKTsKICAgICBpbnQzMl90KiBpbnRzID0gbmV3IGludDMyX3RbbnVtSW50c107CkBAIC03NTEsNyArNzY2LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBbndCdWZmZXIgYW53QnVmZmVyOwotICAgICAgICAgICAgYW53QnVmZmVyLm5hdGl2ZUhhbmRsZSA9IHQubmF0aXZlSGFuZGxlOworICAgICAgICAgICAgLy8gRXhwbGljaXRseSBnZXQgdGhlIG5hdGl2ZV9oYW5kbGVfdCogKGluIHN0ZWFkIG9mIGFzc2lnbmluZyB0Lm5hdGl2ZUhhbmRsZSkKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgZG8gYW4gZXh0cmEgbmF0aXZlX2hhbmRsZV9jbG9uZSgpIGluIHRoaXMgc3RlcCwgYXMgdGhlCisgICAgICAgICAgICAvLyBjb252ZXJ0aW9uIHRvIEdyYXBoaWNCdWZmZXIgYmVsb3cgd2lsbCBkbyBhIGNsb25lIHJlZ2FyZGxlc3MuCisgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gaW52YWxpZCBoYW5kbGUsIHRoZSBjb252ZXJ0VG8oKSBiZWxvdyB3b3VsZCBmYWlsICh3aGlsZQorICAgICAgICAgICAgLy8gdGhlIGFzc2lnbmluZyBvZiBoaWRsX2hhbmRsZSB3b3VsZCBhYm9ydCBhbmQgY2F1c2UgYSBjcmFzaCkuCisgICAgICAgICAgICBhbndCdWZmZXIubmF0aXZlSGFuZGxlID0gdC5uYXRpdmVIYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CiAgICAgICAgICAgICBhbndCdWZmZXIuYXR0ciA9IHQuYXR0ci5hbndCdWZmZXI7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKICAgICAgICAgICAgIGlmICghY29udmVydFRvKGdyYXBoaWNCdWZmZXIuZ2V0KCksIGFud0J1ZmZlcikpIHsKQEAgLTkzOCw0ICs5NTgsNCBAQAogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAorI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKaW5kZXggZjEzNTQ2ZS4uMDY4MGVlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCkBAIC00Nyw3ICs0Nyw2IEBACiAKIHVzaW5nIDo6YW5kcm9pZDo6TGlzdDsKIHVzaW5nIDo6YW5kcm9pZDo6SU9NWDsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5PTVg7CiAKIC8qKgogICogV3JhcHBlciBjbGFzc2VzIGZvciBjb252ZXJzaW9uCkBAIC01OCw3ICs1Nyw3IEBACiAgKiAtIFRXID0gVHJlYmxlIFdyYXBwZXIgLS0tIEl0IHdyYXBzIGEgbGVnYWN5IG9iamVjdCBpbnNpZGUgYSBUcmVibGUgb2JqZWN0LgogICovCiAKLXN0cnVjdCBMV09teCA6IHB1YmxpYyBCbk9NWCB7CitzdHJ1Y3QgTFdPbXggOiBwdWJsaWMgSU9NWCB7CiAgICAgc3A8SU9teD4gbUJhc2U7CiAgICAgTFdPbXgoc3A8SU9teD4gY29uc3QmIGJhc2UpOwogICAgIHN0YXR1c190IGxpc3ROb2RlcyhMaXN0PElPTVg6OkNvbXBvbmVudEluZm8+KiBsaXN0KSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKaW5kZXggZWViYzhjNi4uMWRiNDI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKQEAgLTU5LDcgKzU5LDcgQEAKICAqIC0gVFcgPSBUcmVibGUgV3JhcHBlciAtLS0gSXQgd3JhcHMgYSBsZWdhY3kgb2JqZWN0IGluc2lkZSBhIFRyZWJsZSBvYmplY3QuCiAgKi8KIAotc3RydWN0IExXT214Tm9kZSA6IHB1YmxpYyBIMkJDb252ZXJ0ZXI8SU9teE5vZGUsIElPTVhOb2RlLCBCbk9NWE5vZGU+IHsKK3N0cnVjdCBMV09teE5vZGUgOiBwdWJsaWMgSDJCQ29udmVydGVyPElPbXhOb2RlLCBCbk9NWE5vZGU+IHsKICAgICBMV09teE5vZGUoc3A8SU9teE5vZGU+IGNvbnN0JiBiYXNlKSA6IENCYXNlKGJhc2UpIHt9CiAgICAgc3RhdHVzX3QgZnJlZU5vZGUoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggNzIxYTA0My4uNDU3MGFmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTU5Nyw3ICs1OTgsOCBAQAogICAgICAgICAgICAgaWYgKE9LICE9IHJldCkgewogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAvLyBObyBuZWVkIHRvIGNvbnRpbnVlCiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gIC8vIEludGVudGlvbmFsIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBNRURJQV9SRUNPUkRFUl9JTklUSUFMSVpFRDoKICAgICAgICAgICAgIHJldCA9IGNsb3NlKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTg0MCw0ICs4NDIsMjUgQEAKICAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QKK3sKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggMzFkMWRmOS4uMWVkMWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKIAogQm5TdGF0dXMgTFdHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIHsKLSAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKKyAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CiAgICAgcmV0dXJuIHRvQmluZGVyU3RhdHVzKG1CYXNlLT5jb25maWd1cmUoCiAgICAgICAgICAgICBoT214Tm9kZSA9PSBudWxscHRyID8gbmV3IFRXT214Tm9kZShvbXhOb2RlKSA6IGhPbXhOb2RlLAogICAgICAgICAgICAgdG9IYXJkd2FyZURhdGFzcGFjZShkYXRhU3BhY2UpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3hzZC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzVmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCit4c2RfY29uZmlnIHsKKyAgICBuYW1lOiAibWVkaWFfcHJvZmlsZXMiLAorICAgIHNyY3M6IFsibWVkaWFfcHJvZmlsZXMueHNkIl0sCisgICAgcGFja2FnZV9uYW1lOiAibWVkaWEucHJvZmlsZXMiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9jdXJyZW50LnR4dCBiL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvY3VycmVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvY3VycmVudC50eHQKQEAgLTAsMCArMSwxNDcgQEAKKy8vIFNpZ25hdHVyZSBmb3JtYXQ6IDIuMAorcGFja2FnZSBtZWRpYS5wcm9maWxlcyB7CisKKyAgcHVibGljIGNsYXNzIEF1ZGlvIHsKKyAgICBjdG9yIHB1YmxpYyBBdWRpbygpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEJpdFJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRDaGFubmVscygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldENvZGVjKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0U2FtcGxlUmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRCaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENoYW5uZWxzKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvZGVjKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFNhbXBsZVJhdGUoaW50KTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBBdWRpb0RlY29kZXJDYXAgeworICAgIGN0b3IgcHVibGljIEF1ZGlvRGVjb2RlckNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgQXVkaW9FbmNvZGVyQ2FwIHsKKyAgICBjdG9yIHB1YmxpYyBBdWRpb0VuY29kZXJDYXAoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heEJpdFJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhDaGFubmVscygpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heFNhbXBsZVJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5CaXRSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWluQ2hhbm5lbHMoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5TYW1wbGVSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhCaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heENoYW5uZWxzKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heFNhbXBsZVJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWluQml0UmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNaW5DaGFubmVscyhpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNaW5TYW1wbGVSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlcyB7CisgICAgY3RvciBwdWJsaWMgQ2FtY29yZGVyUHJvZmlsZXMoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRDYW1lcmFJZCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuRW5jb2RlclByb2ZpbGU+IGdldEVuY29kZXJQcm9maWxlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5DYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nT3B0aW9uYWw+IGdldEltYWdlRGVjb2Rpbmdfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkNhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmdPcHRpb25hbD4gZ2V0SW1hZ2VFbmNvZGluZ19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDYW1lcmFJZChpbnQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nT3B0aW9uYWwgeworICAgIGN0b3IgcHVibGljIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRGVjb2RpbmdPcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1lbUNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNZW1DYXAoaW50KTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VFbmNvZGluZ09wdGlvbmFsIHsKKyAgICBjdG9yIHB1YmxpYyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZUVuY29kaW5nT3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRRdWFsaXR5KCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFF1YWxpdHkoaW50KTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBFbmNvZGVyUHJvZmlsZSB7CisgICAgY3RvciBwdWJsaWMgRW5jb2RlclByb2ZpbGUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkF1ZGlvPiBnZXRBdWRpbygpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldER1cmF0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZUZvcm1hdCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFF1YWxpdHkoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLlZpZGVvPiBnZXRWaWRlbygpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRGaWxlRm9ybWF0KFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFF1YWxpdHkoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBNZWRpYVNldHRpbmdzIHsKKyAgICBjdG9yIHB1YmxpYyBNZWRpYVNldHRpbmdzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5BdWRpb0RlY29kZXJDYXA+IGdldEF1ZGlvRGVjb2RlckNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQXVkaW9FbmNvZGVyQ2FwPiBnZXRBdWRpb0VuY29kZXJDYXAoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkNhbWNvcmRlclByb2ZpbGVzPiBnZXRDYW1jb3JkZXJQcm9maWxlcygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuTWVkaWFTZXR0aW5ncy5FbmNvZGVyT3V0cHV0RmlsZUZvcm1hdD4gZ2V0RW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLlZpZGVvRGVjb2RlckNhcD4gZ2V0VmlkZW9EZWNvZGVyQ2FwKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5WaWRlb0VuY29kZXJDYXA+IGdldFZpZGVvRW5jb2RlckNhcCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNZWRpYVNldHRpbmdzLkVuY29kZXJPdXRwdXRGaWxlRm9ybWF0IHsKKyAgICBjdG9yIHB1YmxpYyBNZWRpYVNldHRpbmdzLkVuY29kZXJPdXRwdXRGaWxlRm9ybWF0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgVmlkZW8geworICAgIGN0b3IgcHVibGljIFZpZGVvKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Qml0UmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldENvZGVjKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0RnJhbWVSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Qml0UmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb2RlYyhTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRGcmFtZVJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFdpZHRoKGludCk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgVmlkZW9EZWNvZGVyQ2FwIHsKKyAgICBjdG9yIHB1YmxpYyBWaWRlb0RlY29kZXJDYXAoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIFZpZGVvRW5jb2RlckNhcCB7CisgICAgY3RvciBwdWJsaWMgVmlkZW9FbmNvZGVyQ2FwKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhCaXRSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWF4RnJhbWVIZWlnaHQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhGcmFtZVJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhGcmFtZVdpZHRoKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWluQml0UmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1pbkZyYW1lSGVpZ2h0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWluRnJhbWVSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWluRnJhbWVXaWR0aCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWF4Qml0UmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhGcmFtZUhlaWdodChpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhGcmFtZVJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWF4RnJhbWVXaWR0aChpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNaW5CaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbkZyYW1lSGVpZ2h0KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbkZyYW1lUmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNaW5GcmFtZVdpZHRoKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBYbWxQYXJzZXIgeworICAgIGN0b3IgcHVibGljIFhtbFBhcnNlcigpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG1lZGlhLnByb2ZpbGVzLk1lZGlhU2V0dGluZ3MgcmVhZChqYXZhLmlvLklucHV0U3RyZWFtKSB0aHJvd3MgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFRleHQob3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvbGFzdF9jdXJyZW50LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9saWJtZWRpYS94c2QvYXBpL2xhc3RfY3VycmVudC50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJtZWRpYS94c2QvYXBpL2xhc3RfcmVtb3ZlZC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvbGlibWVkaWEveHNkL2FwaS9sYXN0X3JlbW92ZWQudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvYXBpL3JlbW92ZWQudHh0IGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9yZW1vdmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODAyMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9yZW1vdmVkLnR4dApAQCAtMCwwICsxIEBACisvLyBTaWduYXR1cmUgZm9ybWF0OiAyLjAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC9tZWRpYV9wcm9maWxlcy54c2QgYi9tZWRpYS9saWJtZWRpYS94c2QvbWVkaWFfcHJvZmlsZXMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjQ0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvbWVkaWFfcHJvZmlsZXMueHNkCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBUT0RPOiBkZWZpbmUgYSB0YXJnZXROYW1lc3BhY2UuIE5vdGUgdGhhdCBpdCB3aWxsIGJyZWFrIHJldHJvY29tcGF0aWJpbGl0eSAtLT4KKzx4czpzY2hlbWEgdmVyc2lvbj0iMi4wIgorICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorICAgIDx4czplbGVtZW50IG5hbWU9Ik1lZGlhU2V0dGluZ3MiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FtY29yZGVyUHJvZmlsZXMiIHR5cGU9IkNhbWNvcmRlclByb2ZpbGVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWaWRlb0VuY29kZXJDYXAiIHR5cGU9IlZpZGVvRW5jb2RlckNhcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1ZGlvRW5jb2RlckNhcCIgdHlwZT0iQXVkaW9FbmNvZGVyQ2FwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmlkZW9EZWNvZGVyQ2FwIiB0eXBlPSJWaWRlb0RlY29kZXJDYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdWRpb0RlY29kZXJDYXAiIHR5cGU9IkF1ZGlvRGVjb2RlckNhcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNhbWNvcmRlclByb2ZpbGVzIj4KKyAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuY29kZXJQcm9maWxlIiB0eXBlPSJFbmNvZGVyUHJvZmlsZSIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW1hZ2VFbmNvZGluZyI+CisgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpdHkiIHR5cGU9InhzOmludCIvPgorICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbWFnZURlY29kaW5nIj4KKyAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVtQ2FwIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjYW1lcmFJZCIgdHlwZT0ieHM6aW50Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW5jb2RlclByb2ZpbGUiPgorICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWaWRlbyIgdHlwZT0iVmlkZW8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1ZGlvIiB0eXBlPSJBdWRpbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpdHkiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbGVGb3JtYXQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJWaWRlbyI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29kZWMiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJpdFJhdGUiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndpZHRoIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJoZWlnaHQiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZyYW1lUmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXVkaW8iPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvZGVjIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaXRSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzYW1wbGVSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjaGFubmVscyIgdHlwZT0ieHM6aW50Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVmlkZW9FbmNvZGVyQ2FwIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiB0eXBlPSJ4czpib29sZWFuIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluQml0UmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4Qml0UmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluRnJhbWVXaWR0aCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4RnJhbWVXaWR0aCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluRnJhbWVIZWlnaHQiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heEZyYW1lSGVpZ2h0IiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5GcmFtZVJhdGUiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heEZyYW1lUmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXVkaW9FbmNvZGVyQ2FwIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiB0eXBlPSJ4czpib29sZWFuIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluQml0UmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4Qml0UmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluU2FtcGxlUmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4U2FtcGxlUmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluQ2hhbm5lbHMiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heENoYW5uZWxzIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJWaWRlb0RlY29kZXJDYXAiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBdWRpb0RlY29kZXJDYXAiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczOTUwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM0IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAidnRzX21lZGlhUHJvZmlsZXNfdmFsaWRhdGVfdGVzdCIsCisgICAgc3JjczogWworICAgICAgICAiVmFsaWRhdGVNZWRpYVByb2ZpbGVzLmNwcCIKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi50ZXN0LnV0aWxpdHkiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzM3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcworaW5jbHVkZSB0ZXN0L3Z0cy90b29scy9idWlsZC9BbmRyb2lkLmhvc3RfY29uZmlnLm1rCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODcyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgVlRTIFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcy4iPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX3Byb2ZpbGVzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX3Byb2ZpbGVzLnhzZCIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5WdHNNdWx0aURldmljZVRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtbW9kdWxlLW5hbWUiIHZhbHVlPSJWdHNWYWxpZGF0ZU1lZGlhUHJvZmlsZXMiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3Qtc291cmNlIiB2YWx1ZT0iXzY0Yml0OjpEQVRBL25hdGl2ZXRlc3Q2NC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9WYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9WYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjlkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL1ZhbGlkYXRlTWVkaWFQcm9maWxlcy5jcHAKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSAidXRpbGl0eS9WYWxpZGF0ZVhtbC5oIgorCitURVNUKENoZWNrQ29uZmlnLCBtZWRpYVByb2ZpbGVzVmFsaWRhdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIlZlcmlmeSB0aGF0IHRoZSBtZWRpYSBwcm9maWxlcyBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAiaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWEiKTsKKworICAgIHN0ZDo6c3RyaW5nIG1lZGlhU2V0dGluZ3NQYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoIm1lZGlhLnNldHRpbmdzLnhtbCIsICIiKTsKKyAgICBpZiAobWVkaWFTZXR0aW5nc1BhdGguZW1wdHkoKSkgeworICAgICAgICBtZWRpYVNldHRpbmdzUGF0aC5hc3NpZ24oIi92ZW5kb3IvZXRjL21lZGlhX3Byb2ZpbGVzX1YxXzAueG1sIik7CisgICAgfQorCisgICAgRVhQRUNUX09ORV9WQUxJRF9YTUxfTVVMVElQTEVfTE9DQVRJT05TKGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG1lZGlhU2V0dGluZ3NQYXRoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YW5kcm9pZDo6YmFzZTo6RGlybmFtZShtZWRpYVNldHRpbmdzUGF0aCkuY19zdHIoKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvbWVkaWFfcHJvZmlsZXMueHNkIik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliNDdjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYm1lZGlhZXh0cmFjdG9yIiwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAotICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YS5jcHAiLAotICAgICAgICAiTWV0YURhdGFCYXNlLmNwcCIsCi0gICAgICAgICJWb3JiaXNDb21tZW50LmNwcCIsCi0gICAgXSwKLQotICAgIGNsYW5nOiB0cnVlLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDdlZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlQmFzZSIKLQotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDhfdCBieXRlWzJdOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDhfdCBieXRlWzNdOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDMyX3QgdG1wOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IG50b2hsKHRtcCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgewotICAgICp4ID0gMDsKLQotICAgIHVpbnQ2NF90IHRtcDsKLSAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnggPSBudG9oNjQodG1wKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIHVpbnQ4X3QgdG1wOwotICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgewotICAgICAgICAgICAgKnggPSB0bXA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZUJhc2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPT0gNCkgewotICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7Ci0gICAgfQotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgdWludDE2X3QgdG1wOwotICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgICp4ID0gdG1wOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDgpIHsKLSAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSA0KSB7Ci0gICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgaWYgKGdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICAqeCA9IHRtcDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgRGF0YVNvdXJjZUJhc2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICpzaXplID0gMDsKLQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VXJpKGNoYXIgKnVyaVN0cmluZyBfX3VudXNlZCwgc2l6ZV90IGJ1ZmZlclNpemUgX191bnVzZWQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjhkNmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+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+JiBvcGVyYXRpb24pID0gMDsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKaW5kZXggNjQ1YmI3YS4uMjNhMTllNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTU0LDEzICs1NCw4IEBACiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIiLAogCi0gICAgdGFnczogWyJlbmciXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCAyM2Q2NmJiLi40NjUzNzExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC02OCw3ICs2OCw3IEBACiAgICAgICBtVmlkZW9EYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCiAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbigwKSwKLSAgICAgIG1EdXJhdGlvblVzKC0xbGwpLAorICAgICAgbUR1cmF0aW9uVXMoLTFMTCksCiAgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCiAgICAgICBtSXNTZWN1cmUoZmFsc2UpLAogICAgICAgbUlzU3RyZWFtaW5nKGZhbHNlKSwKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgIG1VSUQodWlkKSwKICAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAogICAgICAgbUZkKC0xKSwKLSAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbUJpdHJhdGUoLTFMTCksCiAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CiAgICAgQUxPR1YoIkdlbmVyaWNTb3VyY2UiKTsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwpAQCAtOTAsMTAgKzkwLDE0IEBACiAgICAgQUxPR1YoInJlc2V0RGF0YVNvdXJjZSIpOwogCiAgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKLSAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2xfZChtRGlzY29ubmVjdExvY2spOworICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgfQogICAgIG1VcmkuY2xlYXIoKTsKICAgICBtVXJpSGVhZGVycy5jbGVhcigpOworICAgIG1Tb3VyY2VzLmNsZWFyKCk7CiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgICAgIG1GZCA9IC0xOwpAQCAtMTUxLDcgKzE1NSwxMCBAQAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIHNvdXJjZS5nZXQoKSk7CiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbF9kKG1EaXNjb25uZWN0TG9jayk7CisgICAgICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2Miw4ICsxNjksMTIgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcjsKLSAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbF9kKG1EaXNjb25uZWN0TG9jayk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICB9CisgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgZGF0YSBzb3VyY2UgaXMgbm90IHJlbGlhYmxlLgpAQCAtMTcxLDYgKzE4Miw3IEBACiAKICAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgY2Fubm90IGNyZWF0ZSBleHRyYWN0b3IhIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCkBAIC0xNzksNiArMTkxLDcgQEAKICAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGlmIChudW10cmFja3MgPT0gMCkgewogICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBzb3VyY2UgaGFzIG5vIHRyYWNrISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApAQCAtMzU2LDYgKzM2OSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUHJlcGFyZUFzeW5jKCkgeworICAgIG1EaXNjb25uZWN0TG9jay5sb2NrKCk7CiAgICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jOiBtRGF0YVNvdXJjZTogJWQiLCAobURhdGFTb3VyY2UgIT0gTlVMTCkpOwogCiAgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgpAQCAtMzY5LDE5ICszODMsMjggQEAKICAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7CiAKICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBodHRwU291cmNlOworICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0TG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBodHRwU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOworICAgICAgICAgICAgICAgIGlmIChodHRwU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGlzY29ubmVjdExvY2subG9jaygpOworCisgICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1IdHRwU291cmNlID0gaHR0cFNvdXJjZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgbURpc2Nvbm5lY3RMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBjb25uZWN0aW9uIGhhcyBzb21lIGlzc3VlLgogICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKAogICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZjb250ZW50VHlwZSwKICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOworICAgICAgICAgICAgbURpc2Nvbm5lY3RMb2NrLmxvY2soKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKQEAgLTQyNSw2ICs0NDgsNyBAQAogCiAgICAgICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgICAgIG1EaXNjb25uZWN0TG9jay51bmxvY2soKTsKICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNDM0LDYgKzQ1OCw4IEBACiAgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwogICAgIH0KIAorICAgIG1EaXNjb25uZWN0TG9jay51bmxvY2soKTsKKwogICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAogICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgogICAgIG1Jc1N0cmVhbWluZyA9IChtQ2FjaGVkU291cmNlICE9IE5VTEwpOwpAQCAtNTAwLDkgKzUyNiwxMyBAQAogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKSB7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2xfZChtRGlzY29ubmVjdExvY2spOworICAgICAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgICAgIH0KKwogICAgICAgICBtQ2FjaGVkU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CiAKICAgICAgICAgbUJpdHJhdGUgPSAtMTsKICAgICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7CkBAIC01NDQsNyArNTc0LDcgQEAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbF9kKG1EaXNjb25uZWN0TG9jayk7CiAgICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKICAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOwogICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKQEAgLTcyNyw3ICs3NTcsNyBAQAogICAgIH0KIAogICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgIHN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICAgICAgc3ViVGltZVVzIC09IDEwMDAwMDBMTDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgogICAgIH0KICAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgdGhpcyk7CiAgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKQEAgLTc2NCw3ICs3OTQsNyBAQAogICAgICAgICBub3RpZnktPnBvc3QoKTsKIAogICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTZW5kU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgICAgICBuZXh0U3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgorICAgICAgICAgICAgbmV4dFN1YlRpbWVVcyAtPSAxMDAwMDAwTEw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKICAgICAgICAgfQogICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBuZXh0U3ViVGltZVVzKTsKICAgICB9CkBAIC04NTUsNyArODg1LDcgQEAKICAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrTXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KICAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcwogICAgICAgICBpbnQ2NF90IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMgPQotICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGwgLyAyOworICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwTEwgLyAyOwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgcmVzdGFydEJ1ZmZlcmluZ01hcmtVcykgewogICAgICAgICAgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CkBAIC0xNDQ2LDcgKzE0NzYsNyBAQAogICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgogICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCiAgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKLSAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgICAgICA6IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMExMOwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgewogICAgICAgICAgICAgaWYgKG1QcmVwYXJpbmcgfHwgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CiAgICAgICAgICAgICAgICAgVHJhY2sgKmNvdW50ZXJUcmFjayA9CkBAIC0xNTE0LDEyICsxNTQ0LDEyIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwogICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblBvbGxCdWZmZXJpbmcoKSB7CiAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7CisgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFMTDsKICAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAogICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKQEAgLTE1MjcsMTUgKzE1NTcsMTUgQEAKIAogICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKKyAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBMTDsKICAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgICAgICAvLyB8Yml0cmF0ZXwgdXNlcyBiaXRzL3NlY29uZCB1bml0LCB3aGlsZSBzaXplIGlzIG51bWJlciBvZiBieXRlcy4KLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMExMIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgewogICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBMTCAvIGJpdHJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTQ3LDExICsxNTc3LDIxIEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSA/IE9LIDogZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChjYWNoZWREdXJhdGlvblVzID49IDBsbCkgewotICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwTEwpIHsKKyAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMExMKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZFBvc1VzID0gZ2V0TGFzdFJlYWRQb3NpdGlvbigpICsgY2FjaGVkRHVyYXRpb25VczsKICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWRQb3NVcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDA2NWNhYzEuLjRkMTkwNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtMTcwLDYgKzE3MCw3IEBACiAgICAgc3A8QUJ1ZmZlcj4gbUdsb2JhbFRpbWVkVGV4dDsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7IC8vIFByb3RlY3RzIG1EYXRhU291cmNlLCBtSHR0cFNvdXJjZSBhbmQgbURpc2Nvbm5lY3RlZAogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKaW5kZXggMTFmMWJmZC4uNzdlNzg4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0yNzEsMTAgKzI3MSwxMCBAQAogCiAgICAgICAgIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gMGxsID8gZGVsYXlVcyA6IDBsbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBMTCA/IGRlbGF5VXMgOiAwTEwpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgewotICAgICAgICAgICAgaWYgKGRlbGF5VXMgPCAtMTAwMDAwMGxsKSB7IC8vIDEgc2Vjb25kCisgICAgICAgICAgICBpZiAoZGVsYXlVcyA8IC0xMDAwMDAwTEwpIHsgLy8gMSBzZWNvbmQKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAgICAgfQogCiAgICAgLy8gdHJ5IGFnYWluIGluIDEgc2Vjb25kCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggMDc4NDkzOS4uMzM4ODA5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC02NTksMjAgKzY1OSwzMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCkBAIC03NTAsNyArNzYxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAgLy8gcG9sbCBhZ2FpbiBpbiBhIHNlY29uZC4KKyAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOyAgLy8gcG9sbCBhZ2FpbiBpbiBhIHNlY29uZC4KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEwMzgsNyArMTA0OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChyZXNjYW4pIHsKLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwbGwpOworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDBMTCk7CiAgICAgICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTE4MTgsMTEgKzE4MjksMjEgQEAKICAgICBjbG9zZUF1ZGlvU2luaygpOwogICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOwogICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVJlbmRlcmVyLT5mbHVzaChmYWxzZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9OT05FIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CisgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKGN1cnJlbnRQb3NpdGlvblVzLAorICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKSk7CisgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKKyAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUmVzdW1lRGVjb2RlckFjdGlvbihmYWxzZSkpOworICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGVyZm9ybVNlZWsoY3VycmVudFBvc2l0aW9uVXMsIE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKTsKICAgICB9CiAKLSAgICBwZXJmb3JtU2VlayhjdXJyZW50UG9zaXRpb25VcywgTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8pOwotCiAgICAgaWYgKGZvcmNlTm9uT2ZmbG9hZCkgewogICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMjY1OSw3ICsyNjgwLDcgQEAKICAgICAgICAgICAgIGludCBwb3NNczsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKICAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7Ci0gICAgICAgICAgICBwb3NVcyA9IChpbnQ2NF90KSBwb3NNcyAqIDEwMDBsbDsKKyAgICAgICAgICAgIHBvc1VzID0gKGludDY0X3QpIHBvc01zICogMTAwMExMOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBpZiAocG9zVXMgPCB0aW1lVXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCmluZGV4IDdiMmI2ZmIuLmEyY2MxM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcApAQCAtMjAwLDYgKzIwMCwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICBDQ1RyYWNrIHRyYWNrID0gbVRyYWNrc1ttU2VsZWN0ZWRUcmFja107CisgICAgICAgIGlmICh0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDggfHwgdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4KSB7CisgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1VOS05PV04gPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKIGJvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKIH0KQEAgLTU2NCw3ICs1NzYsNyBAQAogCiAgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKCJ0cmFjay1pbmRleCIsIG1TZWxlY3RlZFRyYWNrKTsKICAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCAwTEwpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAppbmRleCBmMzEwZjM3Li4zN2I4MjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CiAgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwogICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OwogICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKICAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCA2OWNkODJlLi4yZjBkYTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtNzEsMTAgKzcxLDEwIEBACiAgICAgICBtQ0NEZWNvZGVyKGNjRGVjb2RlciksCiAgICAgICBtUGlkKHBpZCksCiAgICAgICBtVWlkKHVpZCksCi0gICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCi0gICAgICBtTnVtRnJhbWVzVG90YWwoMGxsKSwKLSAgICAgIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQoMGxsKSwKLSAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMoLTFMTCksCisgICAgICBtTnVtRnJhbWVzVG90YWwoMExMKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQoMExMKSwKKyAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKDBMTCksCiAgICAgICBtVmlkZW9XaWR0aCgwKSwKICAgICAgIG1WaWRlb0hlaWdodCgwKSwKICAgICAgIG1Jc0F1ZGlvKHRydWUpLApAQCAtMTA3LDEwICsxMDcsMTYgQEAKIH0KIAogc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpEZWNvZGVyOjpnZXRTdGF0cygpIGNvbnN0IHsKKwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7Ci0gICAgcmV0dXJuIG1TdGF0czsKKyAgICBtU3RhdHMtPnNldEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgbUZyYW1lUmF0ZVRvdGFsKTsKKworICAgIC8vIGknbSBtdXRleGVkIHJpZ2h0IG5vdy4KKyAgICAvLyBtYWtlIG91ciBvd24gY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gY29waWVkU3RhdHMgPSBtU3RhdHMtPmR1cCgpOworICAgIHJldHVybiBjb3BpZWRTdGF0czsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkRlY29kZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewpAQCAtNDA4LDEwICs0MTQsMTAgQEAKICAgICAgICAgLy8gVE9ETzogRm9yIG5vdywgbGF5ZXIgZnBzIGlzIGNhbGN1bGF0ZWQgZm9yIHNvbWUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlcy4KICAgICAgICAgLy8gQnV0IGl0IHJlYWxseSBzaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1swXSA9Ci0gICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFsbCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMSkpOworICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxTEwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIDEpKTsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsOyArK2kpIHsKICAgICAgICAgICAgIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbaV0gPQotICAgICAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMWxsIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSBpKSkKKyAgICAgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFMTCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gaSkpCiAgICAgICAgICAgICAgICAgKyBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2kgLSAxXTsKICAgICAgICAgfQogICAgIH0KQEAgLTY3Nyw3ICs2ODMsNyBAQAogICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKLSAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwogICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOwogICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKQEAgLTc0OCw3ICs3NTQsNyBAQAogICAgIHJlcGx5LT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CiAKICAgICBpZiAoZW9zKSB7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIEFMT0dWKCJbJXNdIHNhdyBvdXRwdXQgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKQEAgLTkzMyw3ICs5MzksNyBAQAogCiAgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSAwOwogICAgICAgICAgICAgYm9vbCBoYXZlTGF5ZXJJZCA9IGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsICZsYXllcklkKTsKLSAgICAgICAgICAgIGlmIChtUmVuZGVyZXItPmdldFZpZGVvTGF0ZUJ5VXMoKSA+IDEwMDAwMGxsCisgICAgICAgICAgICBpZiAobVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBMTAogICAgICAgICAgICAgICAgICAgICAmJiBtSXNWaWRlb0FWQwogICAgICAgICAgICAgICAgICAgICAmJiAhSXNBVkNSZWZlcmVuY2VGcmFtZShhY2Nlc3NVbml0KSkgewogICAgICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKQEAgLTEwMjgsNyArMTAzNCw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bWUtYXQtbWVkaWFUaW1lVXMiLCAmcmVzdW1lQXRNZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylyZXN1bWVBdE1lZGlhVGltZVVzKTsKICAgICAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgfQpAQCAtMTA2OSw2ICsxMDc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcAppbmRleCBkMGRlN2IwLi4zZTk2ZDI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuY3BwCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gdHJ1ZTsKIAogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElucHV0QnVmZmVycywgdGhpcyk7Ci0gICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBsbCk7CisgICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBMTCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAppbmRleCA2YjA1YjUzLi4wOTk3ZTdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICA6IERlY29kZXJCYXNlKG5vdGlmeSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtUmVuZGVyZXIocmVuZGVyZXIpLAotICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xTEwpLAogICAgICAgbVJlYWNoZWRFT1ModHJ1ZSksCiAgICAgICBtUGVuZGluZ0F1ZGlvRXJyKE9LKSwKICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4oMCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBmYzhkMmNhLi4wMDA4ODFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXJEcml2ZXIiCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIApAQCAtNTIsNiArNTMsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZwcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKQEAgLTk1LDcgKzk3LDcgQEAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCiAgICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7CisgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UGxheWVyKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwpAQCAtMzMwLDcgKzMzMiw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdGFydCgpIHsKLSAgICBBTE9HRCgic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOworICAgIEFMT0dWKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gc3RhcnRfbCgpOwogfQpAQCAtMzQ3LDcgKzM0OSw3IEBACiAKICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUFJFUEFSRUQpOwogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CkBAIC0zNTYsNyArMzU4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKQEAgLTM4NSw3ICszODcsNyBAQAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKQEAgLTQ3MiwxMCArNDc0LDEwIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSkgewotICAgIEFMT0dEKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKKyAgICBBTE9HVigic2Vla1RvKCVwKSAoJWQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIG1zZWMsIG1vZGUsIG1TdGF0ZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwbGw7CisgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBMTDsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CkBAIC01MzIsNyArNTM0LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgKm1zZWMgPSAobUR1cmF0aW9uVXMgKyA1MDBsbCkgLyAxMDAwOworICAgICptc2VjID0gKG1EdXJhdGlvblVzICsgNTAwTEwpIC8gMTAwMDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTU2OSwxOSArNTcxLDE4IEBACiAKICAgICAvLyBmaW5pc2ggdGhlIHJlc3Qgb2YgdGhlIGdhdGhlcmluZyBob2xkaW5nIG1Mb2NrOwogICAgIC8vIHNvbWUgb2YgdGhlIGZpZWxkcyB3ZSByZWFkIGFyZSB1cGRhdGVkIHVuZGVyIG1Mb2NrLgotICAgIC8vIHdlIGFsc28gYXZvaWQgYW55IHJhY2VzIHdpdGhpbiBtTWV0cmljc0l0ZW0gbWFjaGluZXJ5CisgICAgLy8gd2UgYWxzbyBhdm9pZCBhbnkgcmFjZXMgd2l0aGluIG1BbmFseXRpY3NJdGVtIG1hY2hpbmVyeQogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTWV0cmljc0xvY2spOwogCiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOwogCi0gICAgLy8gdGhlc2UgdXBkYXRlIHVuZGVyIG1Mb2NrLCB3ZSdsbCByZWFkIHRoZW0gdW5kZXIgbUxvY2sKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclBsYXlpbmcsIChwbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwogCi0gICAgaWYgKHJlYnVmZmVyaW5nRXZlbnRzICE9IDApIHsKKyAgICBpZiAobVJlYnVmZmVyaW5nRXZlbnRzICE9IDApIHsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJSZWJ1ZmZlcmluZywgKHJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIHJlYnVmZmVyaW5nRXZlbnRzKTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgcmVidWZmZXJpbmdBdEV4aXQpOwotICAgIH0KKyAgICAgfQogCiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckRhdGFTb3VyY2VUeXBlLCBtUGxheWVyLT5nZXREYXRhU291cmNlVHlwZSgpKTsKIApAQCAtNjE2LDYgKzYxNywxMCBAQAogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXNEcm9wcGVkLCBudW1GcmFtZXNEcm9wcGVkKTsKIAorICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kRmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RG91YmxlKGtQbGF5ZXJGcmFtZVJhdGUsIChkb3VibGUpIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQU1pbWUsIG1pbWUuY19zdHIoKSk7CkBAIC02MjUsNyArNjMwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQogfQogCiAKQEAgLTY1Myw3ICs2NTcsNyBAQAogCiAgICAgICAgIC8vIHJlLWluaXQgaW4gY2FzZSB3ZSBwcmVwYXJlKCkgYW5kIHN0YXJ0KCkgYWdhaW4uCiAgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbSA7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UGxheWVyKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOwogICAgICAgICB9CkBAIC03NjIsNyArNzY2LDcgQEAKICAgICAgICAgICAgIGludCBtc2VjID0gMDsKICAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwogICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBsbCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgdHJ1ZSAvKiBzZWxlY3QgKi8sIG1zZWMgKiAxMDAwTEwpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBJTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CkBAIC04MDEsOSArODA1LDExIEBACiAgICAgICAgIC8vIGdhdGhlciBjdXJyZW50IGluZm8gYWxsIHRvZ2V0aGVyLCBwYXJjZWwgaXQsIGFuZCBzZW5kIGl0IGJhY2sKICAgICAgICAgdXBkYXRlTWV0cmljcygiYXBpIik7CiAKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0YXRzIGFyZSBzdGF0aWMgd2hpbGUgd2UncmUgd3JpdGluZyB0byB0aGUgcGFyY2VsCisgICAgICAgIC8vIGVuc3VyZSBtQW5hbHl0aWNzSXRlbSBzdGFiaWxpdHkgd2hpbGUgd3JpdGluZyB0byBwYXJjZWwKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NZXRyaWNzTG9jayk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC05ODYsNyArOTkyLDcgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Ci0gICAgQUxPR0QoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWQsICVkLCAlZCwgJWQpLCBsb29wIHNldHRpbmcoJWQsICVkKSIsCisgICAgQUxPR1YoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWQsICVkLCAlZCwgJWQpLCBsb29wIHNldHRpbmcoJWQsICVkKSIsCiAgICAgICAgICAgICB0aGlzLCBtc2csIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKQEAgLTEwMTksNyArMTAyNSw3IEBACiAgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNRURJQV9FUlJPUjoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCmluZGV4IGJkZTA4NjIuLjJkMGM5ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcApAQCAtMTU5LDggKzE1OSwxMiBAQAogICAgIGlmIChkcm0gIT0gTlVMTCkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBzc2hEUk1zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBEcm1VVUlEIHV1aWQgPSBwc3NoRFJNc1tpXTsKLSAgICAgICAgICAgIGlmIChkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIFN0cmluZzgoKSkpCisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXMgPSBkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24sICZpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGlzU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkRFJNcy5hZGQodXVpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBkcm0uY2xlYXIoKTsKQEAgLTIzOSw4ICsyNDMsMTQgQEAKICAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcykKIHsKICAgICAvLyBzaXplIG5lZWRlZCB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBkYXRhCi0gICAgc2l6ZV90IGNyeXB0b3NpemUgPSBzaXplb2YoQ3J5cHRvSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXM7CisgICAgc2l6ZV90IGNyeXB0b3NpemU7CisgICAgLy8gc2l6ZW9mKENyeXB0b0luZm8pICsgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXM7CisgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSwgbnVtU3ViU2FtcGxlcywgJmNyeXB0b3NpemUpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGNyeXB0b3NpemUsIHNpemVvZihDcnlwdG9JbmZvKSwgJmNyeXB0b3NpemUpKSB7CisgICAgICAgIEFMT0dFKCJjcnlwdG8gc2l6ZSBvdmVyZmxvdyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBDcnlwdG9JbmZvICpyZXQgPSAoQ3J5cHRvSW5mbyopIG1hbGxvYyhjcnlwdG9zaXplKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImNvdWxkbid0IGFsbG9jYXRlICV6dSBieXRlcyIsIGNyeXB0b3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDNhMjhiYmQuLjM5YmU0MGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNjgsMTMgKzcwLDE3IEBACiAKIC8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luawogLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwbGw7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMExMOwogCiAvLyBNYXhpbXVtIGFsbG93ZWQgZGVsYXkgZnJvbSBBdWRpb1NpbmssIDEuNSBzZWNvbmRzLgotc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzID0gMTUwMDAwMGxsOworc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzID0gMTUwMDAwMExMOwogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVcyA9IDIwIC8qIG1zZWMgKi8gKiAxMDAwOwogCisvLyBEZWZhdWx0IHZpZGVvIGZyYW1lIGRpc3BsYXkgZHVyYXRpb24gd2hlbiBvbmx5IHZpZGVvIGV4aXN0cy4KKy8vIFVzZWQgdG8gc2V0IG1heCBtZWRpYSB0aW1lIGluIE1lZGlhQ2xvY2suCitzdGF0aWMgY29uc3QgaW50NjRfdCBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzID0gMTAwMDAwTEw7CisKIC8vIHN0YXRpYwogY29uc3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpQY21JbmZvIE51UGxheWVyOjpSZW5kZXJlcjo6QVVESU9fUENNSU5GT19JTklUSUFMSVpFUiA9IHsKICAgICAgICAgQVVESU9fQ0hBTk5FTF9OT05FLApAQCAtODcsNiArOTMsMjAgQEAKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBsbDsKIAorc3RhdGljIGF1ZGlvX2Zvcm1hdF90IGNvbnN0ZXhwciBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhpbnQzMl90IHBjbUVuY29kaW5nKSB7CisgICAgc3dpdGNoIChwY21FbmNvZGluZykgeworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY21GbG9hdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbThiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzhfQklUOyAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcz8KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgZW5jb2Rpbmc6ICVkIiwgX19mdW5jX18sIHBjbUVuY29kaW5nKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KK30KKwogTnVQbGF5ZXI6OlJlbmRlcmVyOjpSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKQEAgLTEwOSw3ICsxMjksNyBAQAogICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAotICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKKyAgICAgIG1WaWRlb0xhdGVCeVVzKDBMTCksCiAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCkBAIC0yOTgsMTEgKzMxOCwxMSBAQAogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gfD0gbm90aWZ5Q29tcGxldGU7CiAgICAgICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKICAgICAgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzID0gLTE7CiAgICAgICAgIH0KIAogICAgICAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOwotICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSAtMTsKICAgICAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKICAgICB9CiAKQEAgLTM1OCw4ICszNzgsMTIgQEAKIAogICAgICAgICAvLyBBdWRpb1NpbmsgaGFzIHJlbmRlcmVkIHNvbWUgZnJhbWVzLgogICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgaW50NjRfdCBub3dNZWRpYVVzID0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcykKLSAgICAgICAgICAgICAgICArIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CisgICAgICAgIGludDY0X3QgcGxheWVkT3V0RHVyYXRpb25VcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpOworICAgICAgICBpZiAocGxheWVkT3V0RHVyYXRpb25VcyA9PSAwKSB7CisgICAgICAgICAgICAqbWVkaWFVcyA9IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCBub3dNZWRpYVVzID0gcGxheWVkT3V0RHVyYXRpb25VcyArIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CiAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIC0xKTsKICAgICB9CiAKQEAgLTU2MCw3ICs1ODQsNyBAQAogICAgICAgICAgICAgICAgIC8vIHBsYXkgYmFjay4KICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMExMOwogICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgewogICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTE0MSw4ICsxMTY1LDggQEAKICAgICAgICAgQUxPR0UoInNhbXBsZVJhdGUgaXMgMCBpbiAlcyBtb2RlIiwgb2ZmbG9hZGluZ0F1ZGlvKCkgPyAib2ZmbG9hZCIgOiAibm9uLW9mZmxvYWQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCi0gICAgcmV0dXJuIChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlKTsKKworICAgIHJldHVybiAoaW50NjRfdCkobnVtRnJhbWVzICogMTAwMDAwMExMIC8gc2FtcGxlUmF0ZSk7CiB9CiAKIC8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwZW5kaW5nIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgpAQCAtMTE1Miw3ICsxMTc2LDcgQEAKICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgICAgIGludDY0X3QgbWVkaWFVczsKICAgICAgICAgaWYgKG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUobm93VXMsICZtZWRpYVVzKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIDBsbDsKKyAgICAgICAgICAgIHJldHVybiAwTEw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIChtZWRpYVVzIC0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyk7CiAgICAgICAgIH0KQEAgLTEyNzksMTAgKzEzMDMsMTAgQEAKICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwogICAgICAgICB9CiAgICAgfQotICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzICsgMTAwMDAwOworICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwogICAgIGlmICghbUhhc0F1ZGlvKSB7CiAgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCi0gICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOwogICAgIH0KIAogICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgfHwgbWVkaWFUaW1lVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7CkBAIC0xMzQ5LDcgKzEzNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtZWRpYVRpbWVVcyA+IG1MYXN0QXVkaW9NZWRpYVRpbWVVcykgewogICAgICAgICAgICAgICAgIC8vIElmIGF1ZGlvIGVuZHMgYmVmb3JlIHZpZGVvLCB2aWRlbyBjb250aW51ZXMgdG8gZHJpdmUgbWVkaWEgY2xvY2suCiAgICAgICAgICAgICAgICAgLy8gQWxzbyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcy4KLSAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTM2Nyw3ICsxMzkxLDcgQEAKICAgICAgICAgdG9vTGF0ZSA9IGZhbHNlOwogICAgIH0KIAotICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlYWxUaW1lVXMgKiAxMDAwbGwpOworICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlYWxUaW1lVXMgKiAxMDAwTEwpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDMyKCJyZW5kZXIiLCAhdG9vTGF0ZSk7CiAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOwpAQCAtMTQxNiw5ICsxNDQwLDE2IEBACiAgICAgICAgIG1IYXNBdWRpbyA9IGZhbHNlOwogICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID49IDApIHsKICAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcyA9IDA7Ci0gICAgICAgICAgICBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKEFMb29wZXI6OkdldE5vd1VzKCksICZtZWRpYVVzKTsKLSAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPiBtZWRpYVVzKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtTmV4dFZpZGVvVGltZU1lZGlhVXMpOworICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmbWVkaWFVcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+IG1lZGlhVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtTmV4dFZpZGVvVGltZU1lZGlhVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcywgbm93VXMsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgKyBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE0OTksNyArMTUzMCw3IEBACiAKICAgICBBTE9HVigicXVldWVEaWZmID0gJS4yZiBzZWNzIiwgZGlmZiAvIDFFNik7CiAKLSAgICBpZiAoZGlmZiA+IDEwMDAwMGxsKSB7CisgICAgaWYgKGRpZmYgPiAxMDAwMDBMTCkgewogICAgICAgICAvLyBBdWRpbyBkYXRhIHN0YXJ0cyBNb3JlIHRoYW4gMC4xIHNlY3MgYmVmb3JlIHZpZGVvLgogICAgICAgICAvLyBEcm9wIHNvbWUgYXVkaW8uCiAKQEAgLTE1NzEsNiArMTYwMiwxNCBAQAogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVBdWRpbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvID0gZmFsc2U7CiAgICAgICAgICAgICBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMgPSAtMTsKKworICAgICAgICAgICAgbUhhc0F1ZGlvID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzLCBub3dVcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7CkBAIC0xODczLDggKzE5MTIsMTMgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKIAorICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPworICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKwogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwpAQCAtMTk3Niw3ICsyMDIwLDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTIwMTUsNyArMjA1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCkBAIC0yMDczLDQgKzIxMTcsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCBhMDQ3OTc1Li5hNTIxZjYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzICBBV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKaW5kZXggODUxMjE3Yi4uYmYxNGVjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcApAQCAtMzAsNyArMzAsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0IGludDY0X3Qga05lYXJFT1NUaW1lb3V0VXMgPSAyMDAwMDAwbGw7IC8vIDIgc2VjcworY29uc3QgaW50NjRfdCBrTmVhckVPU1RpbWVvdXRVcyA9IDIwMDAwMDBMTDsgLy8gMiBzZWNzCiAKIC8vIERlZmF1bHQgQnVmZmVyIFVuZGVyZmxvdy9QcmVwYXJlL1N0YXJ0U2VydmVyL092ZXJmbG93IE1hcmtzCiBzdGF0aWMgY29uc3QgaW50IGtVbmRlcmZsb3dNYXJrTXMgICA9ICAxMDAwOyAgLy8gMSBzZWNvbmQKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGJ1ZmZlciBhdCBsZWFzdCAyIHNlY3Mgd29ydGggZGF0YSBvbiBhbGwgdHJhY2tzIGJlZm9yZQogICAgIC8vIHN0YXJ0aW5nIHBsYXliYWNrIChib3RoIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGEgc2VlaykuCiAKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBsbDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBMTDsKIAogICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKICAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgICpkdXJhdGlvblVzID0gLTFsbDsKKyAgICAqZHVyYXRpb25VcyA9IC0xTEw7CiAKICAgICBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VczsKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTApAQCAtMzIyLDcgKzMyMiw3IEBACiAKIHZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7Ci0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7IC8vIDEgc2Vjb25kIGludGVydmFscworICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOyAvLyAxIHNlY29uZCBpbnRlcnZhbHMKIH0KIAogdm9pZCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6Y2hlY2tCdWZmZXJpbmcoCkBAIC0zNDYsMTAgKzM0NiwxMCBAQAogICAgICAgICBpbnQ2NF90IG1heFJlYnVmZmVyaW5nTWFya1VzOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7Ci0gICAgICAgICAgICBpbml0aWFsTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgaW5pdGlhbE1hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyAqIDEwMDBMTDsKICAgICAgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya1VzIGNvdWxkIGJlIGxhcmdlciB0aGFuCiAgICAgICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsLgotICAgICAgICAgICAgbWF4UmVidWZmZXJpbmdNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgbWF4UmVidWZmZXJpbmdNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMExMOwogICAgICAgICB9CiAgICAgICAgIC8vIGlzRmluaXNoZWQgd2hlbiBkdXJhdGlvbiBpcyAwIGNoZWNrcyBmb3IgRU9TIHJlc3VsdCBvbmx5CiAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBpbml0aWFsTWFya1VzCkBAIC0zNjksNyArMzY5LDcgQEAKICAgICAgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0U2VydmVyTWFya1VzID0KLSAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwgKyBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgLyAyOworICAgICAgICAgICAgICAgICAgICAoa1VuZGVyZmxvd01hcmtNcyAqIDEwMDBMTCArIG1heFJlYnVmZmVyaW5nTWFya1VzKSAvIDI7CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgc3RhcnRTZXJ2ZXJNYXJrVXMpIHsKICAgICAgICAgICAgICAgICArK3N0YXJ0Q291bnQ7CiAgICAgICAgICAgICB9CkBAIC02NDAsNyArNjQwLDcgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG5wdFVzID0KICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpaW5mby0+bVJUUFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAvIGluZm8tPm1UaW1lU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMDAwMGxsCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBMTAogICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvLT5tTm9ybWFsUGxheXRpbWVVczsKIAogICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG5wdFVzKTsKQEAgLTc0OCw3ICs3NDgsNyBAQAogICAgICAgICBUcmFja0luZm8gaW5mbzsKICAgICAgICAgaW5mby5tVGltZVNjYWxlID0gdGltZVNjYWxlOwogICAgICAgICBpbmZvLm1SVFBUaW1lID0gMDsKLSAgICAgICAgaW5mby5tTm9ybWFsUGxheXRpbWVVcyA9IDBsbDsKKyAgICAgICAgaW5mby5tTm9ybWFsUGxheXRpbWVVcyA9IDBMTDsKICAgICAgICAgaW5mby5tTlBUTWFwcGluZ1ZhbGlkID0gZmFsc2U7CiAKICAgICAgICAgaWYgKChpc0F1ZGlvICYmIG1BdWRpb1RyYWNrID09IE5VTEwpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IDg4ZmM3ODIuLmVhNjRmOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAvLyBXZSdyZSBnb2luZyB0byBidWZmZXIgYXQgbGVhc3QgMiBzZWNzIHdvcnRoIGRhdGEgb24gYWxsIHRyYWNrcyBiZWZvcmUKICAgICAvLyBzdGFydGluZyBwbGF5YmFjayAoYm90aCBhdCBzdGFydHVwIGFuZCBhZnRlciBhIHNlZWspLgogCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwbGw7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwTEw7CiAKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBhdWRpb1RyYWNrID0gZ2V0U291cmNlKHRydWUgLyphdWRpbyovKTsKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiB2aWRlb1RyYWNrID0gZ2V0U291cmNlKGZhbHNlIC8qYXVkaW8qLyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU5MzZiZGQuLmY4Yzg5ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yLDggKzIsNiBAQAogCiAgICAgbmFtZTogIkRybVNlc3Npb25NYW5hZ2VyX3Rlc3QiLAogCi0gICAgdGFnczogWyJ0ZXN0cyJdLAotCiAgICAgc3JjczogWyJEcm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTEzLDEwICsxMSw5IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKaW5kZXggNzRhYWY3Ny4uMTE4ODMyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCkBAIC0zLDkgKzMsMTMgQEAKICAgICBuYW1lOiAibGlibmJsb2ciLAogCiAgICAgc3JjczogWwotICAgICAgICAiTkJMb2cuY3BwIiwKKyAgICAgICAgIkVudHJ5LmNwcCIsCisgICAgICAgICJNZXJnZXIuY3BwIiwKICAgICAgICAgIlBlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIiwKKyAgICAgICAgIlJlYWRlci5jcHAiLAogICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKKyAgICAgICAgIlRpbWVsaW5lLmNwcCIsCisgICAgICAgICJXcml0ZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTEzLDkgKzE3LDE0IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlianNvbmNwcCIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NTYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworaW50IEVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93CisgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiBtRXZlbnQ7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gMSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsgICAvLyBGSVhNRSBpcyB0aGlzIGFuIGVycm9yPworICAgIH0KK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpICAgLy8gRHVtbXkgaW5pdGlhbGl6YXRpb24uCisgICAgOiBtUHRyKG51bGxwdHIpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCisgICAgOiBtUHRyKGVudHJ5KQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKQorICAgIDogbVB0cihvdGhlci5tUHRyKQoreworfQorCitjb25zdCBlbnRyeSYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKihlbnRyeSopIG1QdHI7Cit9CisKK2NvbnN0IGVudHJ5KiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGVudHJ5KikgbVB0cjsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpCit7CisgICAgbVB0ciArPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkKK3sKKyAgICBtUHRyIC09IG1QdHJbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuICsrYXV4OworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gLS1hdXg7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAhPSBvdGhlci5tUHRyOworfQorCitpbnQgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyIC0gb3RoZXIubVB0cjsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gbVB0clttUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCisgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdAoreworICAgIHNpemVfdCBsZW5ndGggPSBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgZHN0LT53cml0ZShtUHRyLCBsZW5ndGgpOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QKK3sKKyAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikKK3sKKyAgICBpZiAocHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOworICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CisgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOworfQorCitjb25zdCBjaGFyICpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Cit9CisKK3NpemVfdCBGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKKyAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUikgeworICAgICAgICArK2l0OworICAgIH0KKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgRm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOworfQorCitsb2dfaGFzaF90IEZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKKyAgICByZXR1cm4gaGFzaDsKK30KKworaW50IEZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQorICAgIHJldHVybiBpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SID8gaXQucGF5bG9hZDxpbnQ+KCkgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICBpdC5jb3B5VG8oZHN0KTsgICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5CisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IHRpbWVzdGFtcAorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSBoYXNoCisgICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQorICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7CisgICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9GTVRfQVVUSE9SOworICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9CisgICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KKyAgICAgICAgc2l6ZW9mKGF1dGhvcik7CisgICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOworICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7CisgICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKKyAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgaXQuY29weVRvKGRzdCk7CisgICAgfQorICAgIGl0LmNvcHlUbyhkc3QpOworICAgICsraXQ7CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKK30KKworbG9nX2hhc2hfdCBIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Cit9CisKK2ludCBIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7CisgICAgcmV0dXJuIGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikKKyAgICAgICAgICAgID8gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgSGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KKyAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9CisgICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKKyAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKKyAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKKyAgICAvLyBDb3B5IHRoZSBhdXRob3IKKyAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7CisgICAgLy8gVXBkYXRlIGxlbmd0aHMKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQorICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCisgICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK01lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCit2b2lkIE1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IHNwPFJlYWRlcj4gJnJlYWRlcikKK3sKKyAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKKyAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbVJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorICAgIG1SZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOworfQorCisvLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCisvLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQorc3RydWN0IE1lcmdlSXRlbQoreworICAgIGludDY0X3QgdHM7CisgICAgaW50IGluZGV4OworICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQorfTsKKworYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKQoreworICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKK30KKworLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQordm9pZCBNZXJnZXI6Om1lcmdlKCkKK3sKKyAgICBpZiAodHJ1ZSkgcmV0dXJuOyAvLyBNZXJnaW5nIGlzIG5vdCBuZWNlc3NhcnkgYXQgdGhlIG1vbWVudCwgc28gdGhpcyBpcyB0byBkaXNhYmxlIGl0CisgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJ5cGFzcyBjb21waWxlciB3YXJuaW5ncyBhYm91dCBtZW1iZXIgdmFyaWFibGVzIG5vdCBiZWluZyB1c2VkLgorICAgIGNvbnN0IGludCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIHN0ZDo6dmVjdG9yPEVudHJ5SXRlcmF0b3I+IG9mZnNldHM7CisgICAgb2Zmc2V0cy5yZXNlcnZlKG5Mb2dzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgICAgIG9mZnNldHMucHVzaF9iYWNrKHNuYXBzaG90c1tpXS0+YmVnaW4oKSk7CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cworICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCisgICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCisgICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBhYnN0cmFjdEVudHJ5ID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChhYnN0cmFjdEVudHJ5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZShhYnN0cmFjdEVudHJ5LT50aW1lc3RhbXAoKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgeworICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OyAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0CisgICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPgorICAgICAgICAgICAgY29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsIGluZGV4KTsKKyAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcworICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOworICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIE1lcmdlcjo6Z2V0UmVhZGVycygpIGNvbnN0Cit7CisgICAgLy9BdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtUmVhZGVyczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKKyAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUsICJNZXJnZVJlYWRlciIpLCBtUmVhZGVycyhtZXJnZXIuZ2V0UmVhZGVycygpKQoreworfQorCisvLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCisvLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgordm9pZCBNZXJnZVJlYWRlcjo6cHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwc2hvdCwgaW50IGF1dGhvcikKK3sKKyAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gbVRocmVhZFBlcmZvcm1hbmNlRGF0YVthdXRob3JdOworICAgIC8vIFdlIGRvbid0IGRvICJhdXRvIGl0IiBiZWNhdXNlIGl0IHJlZHVjZXMgcmVhZGFiaWxpdHkgaW4gdGhpcyBjYXNlLgorICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKKyAgICAgICAgICAgIGNvbnN0IEhpc3RUc0VudHJ5IHBheWxvYWQgPSBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5PigpOworICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCisgICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkocGF5bG9hZC50cyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRJbmZvID0gaW5mbzsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZFBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLmxhdGVuY3lIaXN0LmFkZChsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtb25vdG9uaWNNcyA9IG1vbm90b25pY05zICogMWUtNjsKKyAgICAgICAgICAgIGRhdGEud29ya0hpc3QuYWRkKG1vbm90b25pY01zKTsKKyAgICAgICAgICAgIGRhdGEuYWN0aXZlICs9IG1vbm90b25pY05zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBkYXRhLndhcm11cEhpc3QuYWRkKHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLnVuZGVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEub3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgQUxPR1coIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQoreworICAgIC8vIGdldCBhIHNuYXBzaG90IG9mIGVhY2ggcmVhZGVyIGFuZCBwcm9jZXNzIHRoZW0KKyAgICAvLyBUT0RPIGluc2VydCBsb2NrIGhlcmUKKyAgICBjb25zdCBzaXplX3QgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbVJlYWRlcnNbaV0tPmdldFNuYXBzaG90KCk7CisgICAgfQorICAgIC8vIFRPRE8gdW5sb2NrIGxvY2sgaGVyZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBpZiAoc25hcHNob3RzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByb2Nlc3NTbmFwc2hvdCgqKHNuYXBzaG90c1tpXSksIGkpOworICAgICAgICB9CisgICAgfQorICAgIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCkKK3sKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGF1dG8mIGl0ZW0gOiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKG5vdyAtIGRhdGEuc3RhcnQgPj0ga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCkgeworICAgICAgICAgICAgKHZvaWQpUmVwb3J0UGVyZm9ybWFuY2U6OnNlbmRUb01lZGlhTWV0cmljcyhkYXRhKTsKKyAgICAgICAgICAgIGRhdGEucmVzZXQoKTsgICAvLyBkYXRhIGlzIHBlcnNpc3RlbnQgcGVyIHRocmVhZAorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKKyAgICAvLyBPcHRpb25zIGZvciBkdW1wc3lzCisgICAgYm9vbCBwYSA9IGZhbHNlLCBqc29uID0gZmFsc2UsIHBsb3RzID0gZmFsc2UsIHJldHJvID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZhcmcgOiBhcmdzKSB7CisgICAgICAgIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGEiKSkgeworICAgICAgICAgICAgcGEgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1qc29uIikpIHsKKyAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wbG90cyIpKSB7CisgICAgICAgICAgICBwbG90cyA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXJldHJvIikpIHsKKyAgICAgICAgICAgIHJldHJvID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIDAgLyppbmRlbnQqLywgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOworICAgIH0KKyAgICBpZiAoanNvbikgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcEpzb24oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocGxvdHMpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBQbG90cyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChyZXRybykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFJldHJvKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7CisgICAgaWYgKGF1dGhvciA9PSAtMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jaworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtUmVhZGVyc1thdXRob3JdLT5uYW1lKCkuY19zdHIoKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQorICAgIDogbU1lcmdlcihtZXJnZXIpLAorICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKKyAgICAgIG1UaW1lb3V0VXMoMCkKK3sKK30KKworTWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpCit7CisgICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgorICAgIHJlcXVlc3RFeGl0KCk7CisgICAgc2V0VGltZW91dFVzKDApOworICAgIGpvaW4oKTsKK30KKworYm9vbCBNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgYm9vbCBkb01lcmdlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgorICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCBtZXJnZS4gVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gd2FraW5nIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICAgICAgLy8gaXMgaGFuZGxlZCBpbiBBdWRpb0ZsaW5nZXI6Ok1lZGlhTG9nTm90aWZpZXI6OnRocmVhZExvb3AoKS4KKyAgICAgICAgbUNvbmQud2FpdChtTXV0ZXgpOworICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7CisgICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7CisgICAgfQorICAgIGlmIChkb01lcmdlKSB7CisgICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKKyAgICAgICAgbU1lcmdlci5tZXJnZSgpOworICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisgICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCisgICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKKyAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6d2FrZXVwKCkKK3sKKyAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKK30KKwordm9pZCBNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIG1UaW1lb3V0VXMgPSB0aW1lOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcCBiL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmYTNlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxudW1lcmljPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8cXVldWU+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgTkJMb2c6OkVudHJ5Ojpjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBzbG93Ci0gICAgaWYgKG9mZnNldCA9PSAwKQotICAgICAgICByZXR1cm4gbUV2ZW50OwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAxKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qc3RhdGljKi8KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6QWJzdHJhY3RFbnRyeT4gTkJMb2c6OkFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7Ci0gICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKLSAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX0KLQotTkJMb2c6OkFic3RyYWN0RW50cnk6OkFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Ci19Ci0KLWNvbnN0IGNoYXIgKk5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKLX0KLQotc2l6ZV90IE5CTG9nOjpGb3JtYXRFbnRyeTo6Zm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIFNraXAgYXV0aG9yIGlmIHByZXNlbnQKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgICsraXQ7Ci0gICAgfQotICAgIHJldHVybiBpdDsKLX0KLQotaW50NjRfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6OkZvcm1hdEVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gdW5hbGlnbmVkIDY0LWJpdCByZWFkIG5vdCBzdXBwb3J0ZWQKLSAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgbWVtY3B5KCZoYXNoLCBpdC0+ZGF0YSwgc2l6ZW9mKGhhc2gpKTsKLSAgICByZXR1cm4gaGFzaDsKLX0KLQotaW50IE5CTG9nOjpGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBpZiB0aGVyZSBpcyBhbiBhdXRob3IgZW50cnksIHJldHVybiBpdCwgcmV0dXJuIC0xIG90aGVyd2lzZQotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50PigpOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIGNvcHkgZm10IHN0YXJ0IGVudHJ5Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgLy8gY29weSB0aW1lc3RhbXAKLSAgICAoKytpdCkuY29weVRvKGRzdCk7ICAgIC8vIGNvcHkgaGFzaAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsKLSAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5Ci0gICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKGF1dGhvcik7Ci0gICAgdWludDhfdCBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemVdOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCB0eXBlKV0gPSBFVkVOVF9BVVRIT1I7Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KLSAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0KLSAgICAgICAgc2l6ZW9mKGF1dGhvcik7Ci0gICAgKihpbnQqKSAoJmF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBkYXRhKV0pID0gYXV0aG9yOwotICAgIGRzdC0+d3JpdGUoYXV0aG9yRW50cnksIGF1dGhvckVudHJ5U2l6ZSk7Ci0gICAgLy8gY29weSByZXN0IG9mIGVudHJpZXMKLSAgICB3aGlsZSAoKCsraXQpLT50eXBlICE9IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgaXQuY29weVRvKGRzdCk7Ci0gICAgfQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgICsraXQ7Ci0gICAgcmV0dXJuIGl0OwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdCB7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICBkc3QtPndyaXRlKHB0ciwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdCB7Ci0gICAgbWVtY3B5KCh2b2lkKikgZHN0LCBwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSksIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcigpCi0gICAgOiBwdHIobnVsbHB0cikge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpCi0gICAgOiBwdHIoZW50cnkpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikKLSAgICA6IHB0cihvdGhlci5wdHIpIHt9Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gKihlbnRyeSopIHB0cjsKLX0KLQotY29uc3QgTkJMb2c6OmVudHJ5KiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0IHsKLSAgICByZXR1cm4gKGVudHJ5KikgcHRyOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gICAgcHRyICs9IHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpIHsKLSAgICBwdHIgLT0gcHRyW05CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiArK2F1eDsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OnByZXYoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOwotICAgIHJldHVybiAtLWF1eDsKLX0KLQotaW50IE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAtIG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgIT0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IHB0cltwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQ2NF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS50czsKLX0KLQotTkJMb2c6OmxvZ19oYXNoX3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QgewotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOwotfQotCi1pbnQgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOwotICAgIGlmIChpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgLy8gQ3VycmVudCBoaXN0b2dyYW0gZW50cnkgaGFzIHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeSwgbGVuZ3RofS4KLSAgICAvLyBXZSBub3cgd2FudCB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yLCBsZW5ndGh9Ci0gICAgdWludDhfdCBidWZmZXJbRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpXTsKLSAgICAvLyBDb3B5IGNvbnRlbnQgdW50aWwgdGhlIHBvaW50IHdlIHdhbnQgdG8gYWRkIHRoZSBhdXRob3IKLSAgICBtZW1jcHkoYnVmZmVyLCBtRW50cnksIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKTsKLSAgICAvLyBDb3B5IHRoZSBhdXRob3IKLSAgICAqKGludCopIChidWZmZXIgKyBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSkgPSBhdXRob3I7Ci0gICAgLy8gVXBkYXRlIGxlbmd0aHMKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBkYXRhKSArIHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpICsgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpXQotICAgICAgICA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIC8vIFdyaXRlIG5ldyBidWZmZXIgaW50byBGSUZPCi0gICAgZHN0LT53cml0ZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLm5leHQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gTkJMb2cuaAotTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQotICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQotewotICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOwotfQotCi1OQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCi17Ci0gICAgbVNoYXJlZC0+flNoYXJlZCgpOwotICAgIGlmIChtT3duKSB7Ci0gICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qc3RhdGljKi8KLXNpemVfdCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCi17Ci0gICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAotICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoKQotICAgIDogbVNoYXJlZChOVUxMKSwgbUZpZm8oTlVMTCksIG1GaWZvV3JpdGVyKE5VTEwpLCBtRW5hYmxlZChmYWxzZSksIG1QaWRUYWcoTlVMTCksIG1QaWRUYWdTaXplKDApCi17Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKLSAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCi17Ci0gICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQotICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKLSAgICBjaGFyIHByb2NOYW1lWzE2XTsKLSAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKLSAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQotICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOwotICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKLSAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOwotICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOwotICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OldyaXRlcjo6fldyaXRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvV3JpdGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLSAgICBkZWxldGVbXSBtUGlkVGFnOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCi0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYXIgYnVmZmVyW0VudHJ5OjprTWF4TGVuZ3RoICsgMSAvKk5VTCovXTsKLSAgICBpbnQgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZtdCwgYXApOwotICAgIGlmIChsZW5ndGggPj0gKGludCkgc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwotICAgICAgICAvLyBOVUwgdGVybWluYXRpb24gaXMgbm90IHJlcXVpcmVkCi0gICAgICAgIC8vIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9TVFJJTkcsIGJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50NjRfdCB0cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAodHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9JTlRFR0VSLCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfRkxPQVQsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9QSUQsIG1QaWRUYWcsIG1QaWRUYWdTaXplKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oZm10KTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVEFSVF9GTVQsIGZtdCwgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFbmQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBlbnRyeSA9IEVudHJ5KEVWRU5UX0VORF9GTVQsIE5VTEwsIDApOwotICAgIGxvZygmZW50cnksIHRydWUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGhhc2gpOwotICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotICAgIGludCBpOwotICAgIGRvdWJsZSBmOwotICAgIGNoYXIqIHM7Ci0gICAgaW50NjRfdCB0OwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotICAgIGZvciAoY29uc3QgY2hhciAqcCA9IGZtdDsgKnAgIT0gJ1wwJzsgcCsrKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgaWYgKCpwICE9ICclJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKCorK3ApIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgcyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOwotICAgICAgICAgICAgV3JpdGVyOjpsb2cocyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgaSA9IHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICAgICAgV3JpdGVyOjpsb2dJbnRlZ2VyKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBmID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cwotICAgICAgICAgICAgV3JpdGVyOjpsb2dGbG9hdCgoZmxvYXQpZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ1BJRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZwotICAgICAgICBjYXNlICdcMCc6Ci0gICAgICAgICAgICAtLXA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQotICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKLSAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50Ci0gICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOwotICAgIGxvZygmZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgTkJMb2c6OkVudHJ5ICpldHIsIGJvb2wgdHJ1c3RlZCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF0cnVzdGVkKSB7Ci0gICAgICAgIGxvZyhldHItPm1FdmVudCwgZXRyLT5tRGF0YSwgZXRyLT5tTGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbmVlZCA9IGV0ci0+bUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7ICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCA9IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEZJRk8KLQotICAgIC8vIEZJWE1FIG9wdGltaXplIHRoaXMgdXNpbmcgbWVtY3B5IGZvciB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBFbnRyeS4KLSAgICAvLyBUaGUgRW50cnkgY291bGQgaGF2ZSBhIG1ldGhvZCBjb3B5VG8ocHRyLCBvZmZzZXQsIHNpemUpIHRvIG9wdGltaXplIHRoZSBjb3B5LgotICAgIC8vIGNoZWNrcyBzaXplIG9mIGEgc2luZ2xlIGxvZyBFbnRyeTogdHlwZSwgbGVuZ3RoLCBkYXRhIHBvaW50ZXIgYW5kIGVuZGluZwotICAgIHVpbnQ4X3QgdGVtcFtFbnRyeTo6a01heExlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWRdOwotICAgIC8vIHdyaXRlIHRoaXMgZGF0YSB0byB0ZW1wIGFycmF5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZWVkOyBpKyspIHsKLSAgICAgICAgdGVtcFtpXSA9IGV0ci0+Y29weUVudHJ5RGF0YUF0KGkpOwotICAgIH0KLSAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKLSAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUVuYWJsZWQ7Ci19Ci0KLWJvb2wgTkJMb2c6OldyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgYm9vbCBvbGQgPSBtRW5hYmxlZDsKLSAgICBtRW5hYmxlZCA9IGVuYWJsZWQgJiYgbVNoYXJlZCAhPSBOVUxMOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIoKQotICAgIDogV3JpdGVyKCkKLXsKLX0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBXcml0ZXIoc2hhcmVkLCBzaXplKQotewotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZyhzdHJpbmcpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgdGhlIGNsb2NrX2dldHRpbWUoKSBzeXNjYWxsCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAodHMpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0ludGVnZXIoY29uc3QgaW50IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0ludGVnZXIoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRmxvYXQoeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nUElEKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOwotfQotCi0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OmlzRW5hYmxlZCgpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6c3RhcnRpbmdUeXBlcyB7TkJMb2c6OkV2ZW50OjpFVkVOVF9TVEFSVF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLWNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogbUZkKC0xKSwgbUluZGVudCgwKSwgbUxvc3QoMCksCi0gICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKLXsKLX0KLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6UmVhZGVyOjp+UmVhZGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9SZWFkZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotfQotCi1jb25zdCB1aW50OF90ICpOQkxvZzo6UmVhZGVyOjpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcykgewotICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgewotICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOwotICAgICAgICBpZiAocHJldiA8IGZyb250IHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrKSB7Ci0KLSAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZXMuZmluZCgoY29uc3QgRXZlbnQpIHByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSkgIT0gdHlwZXMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBwcmV2OwotICAgICAgICB9Ci0gICAgICAgIGJhY2sgPSBwcmV2OwotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKLX0KLQotLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAotLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcwotLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+IE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90KCkKLXsKLSAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotICAgIC8vIG1ha2UgYSBjb3B5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIHdpdGggd3JpdGVyCi0gICAgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7Ci0KLSAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKLSAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQotICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKLSAgICBzaXplX3QgbG9zdDsKLSAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKLSAgICBzc2l6ZV90IGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0KTsKLSAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgewotICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKLSAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKLSAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKLSAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKLSAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCi0gICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCi0gICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCi0gICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRU5EX0ZNVCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgotICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKLSAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKLQotICAgIC8vIEZpbmQgbGFzdCBFTkRfRk1ULiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCi0gICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRU5EX0ZNVC4KLSAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGJhY2ssIGVuZGluZ1R5cGVzKTsKLSAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBFTkRfRk1UIGVudHJ5Ci0gICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7Ci0gICAgICAgIC8vIGZpbmQgZmlyc3QgU1RBUlRfRk1UCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOwotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBmaXJzdFN0YXJ0VG1wLCBzdGFydGluZ1R5cGVzKSkKLSAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gU1RBUlRfRk1UIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAotICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgotICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOwotCi0gICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKLSAgICByZXR1cm4gc25hcHNob3Q7Ci0KLX0KLQotLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAotLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQotewotICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotCi0gICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7Ci0gICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSAgICAgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgICAgICBlbnRyeSA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShlbnRyeSksICZ0aW1lc3RhbXAsICZib2R5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKLSAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeSh0cyk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogewotICAgICAgICAgICAgSGlzdFRzRW50cnlXaXRoQXV0aG9yICpkYXRhID0gKEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqKSAoZW50cnktPmRhdGEpOwotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG1lbWNwaWVzIGFyZSBoZXJlIHRvIGF2b2lkIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGNyYXNoLgotICAgICAgICAgICAgLy8gVGhlcmUncyBwcm9iYWJseSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyBpdAotICAgICAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICAgICAgbWVtY3B5KCZoYXNoLCAmKGRhdGEtPmhhc2gpLCBzaXplb2YoaGFzaCkpOwotICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRzIGlmIHVudXNlZAotICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgIG1lbWNweSgmdHMsICZkYXRhLT50cywgc2l6ZW9mKHRzKSk7Ci0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9FTkRfRk1UOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IGdvdCB0byBlbmQgZm9ybWF0IGV2ZW50Iik7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGVudHJ5LT50eXBlKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgdGhlIHdhcm5pbmdzIGhlcmUgb3IgZWxzZXdoZXJlCi0gICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCi17Ci0gICAgLy8gZ2V0IGEgc25hcHNob3QsIHByb2Nlc3MgaXQKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXAgPSBnZXRTbmFwc2hvdCgpOwotICAgIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgqc25hcCk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpkdW1wKGludCBmZCwgaW50IGluZGVudCkgewotICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAotICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCBpbmRlbnQsIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKLX0KLQotLy8gV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBjb25zb2xlCi12b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzggJnRpbWVzdGFtcCwgU3RyaW5nOCAmYm9keSkKLXsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9Ci0gICAgYm9keS5jbGVhcigpOwotfQotCi1ib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKLXsKLSAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE5CTG9nOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludDY0X3QgdHM7Ci0gICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQgeCA9ICooKGludCopIGRhdGEpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVkPiIsIHgpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgZmxvYXQgZjsKLSAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmbG9hdCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHBpZF90IGlkID0gKigocGlkX3QqKSBkYXRhKTsKLSAgICBjaGFyICogbmFtZSA9ICYoKGNoYXIqKSBkYXRhKVtzaXplb2YocGlkX3QpXTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjxQSUQ6ICVkLCBuYW1lOiAlLipzPiIsIGlkLCAoaW50KSAobGVuZ3RoIC0gc2l6ZW9mKHBpZF90KSksIG5hbWUpOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgU3RyaW5nOCBzdHI7Ci0gICAgc3RyLmFwcGVuZCgiWyAiKTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKLSAgICB9Ci0gICAgc3RyLmFwcGVuZCgiXSIpOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpCi17Ci0gICAgcmV0dXJuIGJ1ZmZlckR1bXAoaXQsIGl0LT5sZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OlJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpIHsKLSAgICAvLyBsb2cgdGltZXN0YW1wCi0gICAgaW50NjRfdCB0cyA9IGZtdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgIHRpbWVzdGFtcC0+Y2xlYXIoKTsKLSAgICB0aW1lc3RhbXAtPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci0KLSAgICAvLyBsb2cgdW5pcXVlIGhhc2gKLSAgICBsb2dfaGFzaF90IGhhc2ggPSBmbXRFbnRyeS5oYXNoKCk7Ci0gICAgLy8gcHJpbnQgb25seSBsb3dlciAxNmJpdCBvZiBoYXNoIGFzIGhleCBhbmQgbGluZSBhcyBpbnQgdG8gcmVkdWNlIHNwYW0gaW4gdGhlIGxvZwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS40WC0lZCAiLCAoaW50KShoYXNoID4+IDE2KSAmIDB4RkZGRiwgKGludCkgaGFzaCAmIDB4RkZGRik7Ci0KLSAgICAvLyBsb2cgYXV0aG9yIChpZiBwcmVzZW50KQotICAgIGhhbmRsZUF1dGhvcihmbXRFbnRyeSwgYm9keSk7Ci0KLSAgICAvLyBsb2cgc3RyaW5nCi0gICAgTkJMb2c6OkVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOwotCi0gICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7Ci0gICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKLQotICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7Ci0gICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlJSIiCi0gICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJVwwIgotICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE5CTG9nOjpFdmVudCBldmVudCA9IChOQkxvZzo6RXZlbnQpIGFyZy0+dHlwZTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGFyZy0+bGVuZ3RoOwotCi0gICAgICAgIC8vIFRPRE8gY2hlY2sgbGVuZ3RoIGZvciBldmVudCB0eXBlIGlzIGNvcnJlY3QKLQotICAgICAgICBpZiAoZXZlbnQgPT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdHVtID0gYXJnLT5kYXRhOyAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGV2ZW50IGFyZ3MKLSAgICAgICAgc3dpdGNoKGZtdFtmbXRfb2Zmc2V0XSkKLSAgICAgICAgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9USU1FU1RBTVAsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9JTlRFR0VSLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBpbnRlZ2VyIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRJbnQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0Ci0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTE9BVCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1BJRCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7Ci0gICAgICAgIH0KLSAgICAgICAgKythcmc7Ci0gICAgfQotICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9FTkRfRk1ULCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKLSAgICArK2FyZzsKLSAgICByZXR1cm4gYXJnOwotfQotCi1OQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6Ci0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCi0gICAgICB7fQotCi12b2lkIE5CTG9nOjpNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBOQkxvZzo6TmFtZWRSZWFkZXIgJnJlYWRlcikgewotCi0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIG1OYW1lZFJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Ci19Ci0KLS8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKLS8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCi1zdHJ1Y3QgTWVyZ2VJdGVtCi17Ci0gICAgaW50NjRfdCB0czsKLSAgICBpbnQgaW5kZXg7Ci0gICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Ci19OwotCi0vLyBvcGVyYXRvcnMgbmVlZGVkIGZvciBwcmlvcml0eSBxdWV1ZSBpbiBtZXJnZQotLy8gYm9vbCBvcGVyYXRvcj4oY29uc3QgaW50NjRfdCAmdDEsIGNvbnN0IGludDY0X3QgJnQyKSB7Ci0vLyAgICAgcmV0dXJuIHQxLnR2X3NlYyA+IHQyLnR2X3NlYyB8fCAodDEudHZfc2VjID09IHQyLnR2X3NlYyAmJiB0MS50dl9uc2VjID4gdDIudHZfbnNlYyk7Ci0vLyB9Ci0KLWJvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikgewotICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKLX0KLQotLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wLCBhbmQgd3JpdGUgZGF0YSB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeQotdm9pZCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBtZXJnZSB0aHJlYWQKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgaW50IG5Mb2dzID0gbU5hbWVkUmVhZGVycy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKLSAgICBzdGQ6OnZlY3RvcjxOQkxvZzo6RW50cnlJdGVyYXRvcj4gb2Zmc2V0cyhuTG9ncyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7Ci0gICAgICAgIHNuYXBzaG90c1tpXSA9IG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmdldFNuYXBzaG90KCk7Ci0gICAgICAgIG9mZnNldHNbaV0gPSBzbmFwc2hvdHNbaV0tPmJlZ2luKCk7Ci0gICAgfQotICAgIC8vIGluaXRpYWxpemUgb2Zmc2V0cwotICAgIC8vIFRPRE8gY3VzdG9tIGhlYXAgaW1wbGVtZW50YXRpb24gY291bGQgYWxsb3cgdG8gdXBkYXRlIHRvcCwgaW1wcm92aW5nIHBlcmZvcm1hbmNlCi0gICAgLy8gZm9yIGJ1cnN0eSBidWZmZXJzCi0gICAgc3RkOjpwcmlvcml0eV9xdWV1ZTxNZXJnZUl0ZW0sIHN0ZDo6dmVjdG9yPE1lcmdlSXRlbT4sIHN0ZDo6Z3JlYXRlcjxNZXJnZUl0ZW0+PiB0aW1lc3RhbXBzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXRzW2ldICE9IHNuYXBzaG90c1tpXS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoIXRpbWVzdGFtcHMuZW1wdHkoKSkgewotICAgICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCi0gICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7Ci0gICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKLSAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+Y29weVdpdGhBdXRob3IobUZpZm9Xcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICAgICAgLy8gdXBkYXRlIGRhdGEgc3RydWN0dXJlcwotICAgICAgICB0aW1lc3RhbXBzLnBvcCgpOwotICAgICAgICBpZiAob2Zmc2V0c1tpbmRleF0gIT0gc25hcHNob3RzW2luZGV4XS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIGludDY0X3QgdHMgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3Qgc3RkOjp2ZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiYgTkJMb2c6Ok1lcmdlcjo6Z2V0TmFtZWRSZWFkZXJzKCkgY29uc3QgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCi0gICAgcmV0dXJuIG1OYW1lZFJlYWRlcnM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQotICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSksIG1OYW1lZFJlYWRlcnMobWVyZ2VyLmdldE5hbWVkUmVhZGVycygpKSB7fQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IE5CTG9nOjpBYnN0cmFjdEVudHJ5ICZlbnRyeSwgU3RyaW5nOCAqYm9keSkgewotICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKLSAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gbU5hbWVkUmVhZGVyc1thdXRob3JdLm5hbWUoKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzOiAiLCBuYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTkJMb2c6Ok1lcmdlciAmbWVyZ2VyLCBOQkxvZzo6TWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKQotICAgIDogbU1lcmdlcihtZXJnZXIpLAotICAgICAgbU1lcmdlUmVhZGVyKG1lcmdlUmVhZGVyKSwKLSAgICAgIG1UaW1lb3V0VXMoMCkge30KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKSB7Ci0gICAgLy8gc2V0IGV4aXQgZmxhZywgc2V0IHRpbWVvdXQgdG8gMCB0byBmb3JjZSB0aHJlYWRMb29wIHRvIGV4aXQgYW5kIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gam9pbgotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgc2V0VGltZW91dFVzKDApOwotICAgIGpvaW4oKTsKLX0KLQotYm9vbCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgYm9vbCBkb01lcmdlOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgICAgIC8vIElmIG1UaW1lb3V0VXMgaXMgbmVnYXRpdmUsIHdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSB1bnRpbCBpdCdzIHBvc2l0aXZlLgotICAgICAgICAvLyBJZiBpdCdzIHBvc2l0aXZlLCB3YWl0IGtUaHJlYWRTbGVlcFBlcmlvZFVzIGFuZCB0aGVuIG1lcmdlCi0gICAgICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBtVGltZW91dFVzID4gMCA/IGtUaHJlYWRTbGVlcFBlcmlvZFVzICogMTAwMCA6IExMT05HX01BWDsKLSAgICAgICAgbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWUpOwotICAgICAgICBkb01lcmdlID0gbVRpbWVvdXRVcyA+IDA7Ci0gICAgICAgIG1UaW1lb3V0VXMgLT0ga1RocmVhZFNsZWVwUGVyaW9kVXM7Ci0gICAgfQotICAgIGlmIChkb01lcmdlKSB7Ci0gICAgICAgIC8vIE1lcmdlIGRhdGEgZnJvbSBhbGwgdGhlIHJlYWRlcnMKLSAgICAgICAgbU1lcmdlci5tZXJnZSgpOwotICAgICAgICAvLyBQcm9jZXNzIHRoZSBkYXRhIGNvbGxlY3RlZCBieSBtTWVyZ2VyIGFuZCB3cml0ZSBpdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCi0gICAgICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBjYWxsIGdldEFuZFByb2Nlc3NTbmFwc2hvdCBldmVyeSB0aW1lCi0gICAgICAgIC8vIG9yIHdoZXRoZXIgdG8gaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbGxzIGl0IHdpdGggYSBsb3dlciBmcmVxdWVuY3kKLSAgICAgICAgbU1lcmdlUmVhZGVyLmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6Ondha2V1cCgpIHsKLSAgICBzZXRUaW1lb3V0VXMoa1RocmVhZFdha2V1cFBlcmlvZFVzKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkgewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIG1UaW1lb3V0VXMgPSB0aW1lOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKaW5kZXggZjA5ZTkzZC4uZTkxYTUxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKQEAgLTE3LDEzICsxNywxNiBAQAogCiAjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCiAvLyAjZGVmaW5lIExPR19OREVCVUcgMAorLy8gI2RlZmluZSBXUklURV9UT19GSUxFCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTMyLDIwICszNSwxMjYgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0xvZ1Bsb3QuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CiAKK3ZvaWQgSGlzdG9ncmFtOjphZGQoZG91YmxlIHZhbHVlKQoreworICAgIGlmIChtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUT0RPIEhhbmRsZSBkb21haW4gYW5kIHJhbmdlIGVycm9yIGV4Y2VwdGlvbnM/CisgICAgY29uc3QgaW50IHVuYm91bmRlZEluZGV4ID0gbHJvdW5kKCh2YWx1ZSAtIG1Mb3cpIC8gbUJpblNpemUpICsgMTsKKyAgICAvLyBzdGQ6OmNsYW1wIGlzIGludHJvZHVjZWQgaW4gQysrMTcKKyAgICAvL2NvbnN0IGludCBpbmRleCA9IHN0ZDo6Y2xhbXAodW5ib3VuZGVkSW5kZXgsIDAsIChpbnQpKG1CaW5zLnNpemUoKSAtIDEpKTsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBzdGQ6Om1heCgwLCBzdGQ6Om1pbigoaW50KShtQmlucy5zaXplKCkgLSAxKSwgdW5ib3VuZGVkSW5kZXgpKTsKKyAgICBtQmluc1tpbmRleF0rKzsKKyAgICBtVG90YWxDb3VudCsrOworfQorCit2b2lkIEhpc3RvZ3JhbTo6Y2xlYXIoKQoreworICAgIHN0ZDo6ZmlsbChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSwgMCk7CisgICAgbVRvdGFsQ291bnQgPSAwOworfQorCit1aW50NjRfdCBIaXN0b2dyYW06OnRvdGFsQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtVG90YWxDb3VudDsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0RpdmlkZXIgPSAnfCc7CisgICAgc3MgPDwga1ZlcnNpb24gPDwgIiwiIDw8IG1CaW5TaXplIDw8ICIsIiA8PCBtTnVtQmlucyA8PCAiLCIgPDwgbUxvdyA8PCAiLHsiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1CaW5zW2ldICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBzcyA8PCAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcyA8PCBzdGF0aWNfY2FzdDxpbnQ+KGkpIC0gMSA8PCBrRGl2aWRlciA8PCBtQmluc1tpXTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgc3MgPDwgIn0iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OmFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQpIGNvbnN0IHsKKyAgICBpZiAodG90YWxDb3VudCgpID09IDAgfHwgbUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga01hcmtlciA9ICctJzsKKyAgICAvLyBPbmUgaW5jcmVtZW50IGlzIGNvbnNpZGVyZWQgb25lIHN0ZXAgb2YgYSBiaW4ncyBoZWlnaHQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlcnNQZXJJbmNyZW1lbnQgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhJbmNyZW1lbnRzID0gNjQgKyAxOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhOdW1iZXJXaWR0aCA9IDc7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtNYXJrZXJzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsIGtNYXJrZXIpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrU3BhY2VzKGtNYXJrZXJzUGVySW5jcmVtZW50ICoga01heEluY3JlbWVudHMsICcgJyk7CisgICAgLy8gZ2V0IHRoZSBsYXN0IG4gY2hhcmFjdGVycyBvZiBzLCBvciB0aGUgd2hvbGUgc3RyaW5nIGlmIGl0IGlzIHNob3J0ZXIKKyAgICBhdXRvIGdldFRhaWwgPSBbXShjb25zdCBzaXplX3QgbiwgY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKKyAgICAgICAgcmV0dXJuIHMuY19zdHIoKSArIHMuc2l6ZSgpIC0gc3RkOjptaW4obiwgcy5zaXplKCkpOworICAgIH07CisKKyAgICAvLyBTaW5jZSB0b3RhbENvdW50KCkgPiAwLCBtQmlucyBpcyBub3QgZW1wdHkgYW5kIG1heENvdW50ID4gMC4KKyAgICBjb25zdCB1bnNpZ25lZCBtYXhDb3VudCA9ICpzdGQ6Om1heF9lbGVtZW50KG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpKTsKKyAgICBjb25zdCBzaXplX3QgbWF4SW5jcmVtZW50cyA9IGxvZzIobWF4Q291bnQpICsgMTsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgLy8gTm9uLXplcm8gYmlucyBtdXN0IGV4aXN0IGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0b3RhbENvdW50KCkgPiAwLgorICAgIHNpemVfdCBmaXJzdE5vblplcm9CaW4gPSAwOworICAgIC8vIElmIGZpcnN0Tm9uWmVyb0JpbiByZWFjaGVzIG1CaW5zLnNpemUoKSAtIDEsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBmaXJzdE5vblplcm9CaW4gPCBtQmlucy5zaXplKCkgLSAxICYmIG1CaW5zW2ZpcnN0Tm9uWmVyb0Jpbl0gPT0gMDsgZmlyc3ROb25aZXJvQmluKyspIHt9CisgICAgY29uc3Qgc2l6ZV90IGZpcnN0QmluVG9QcmludCA9IGZpcnN0Tm9uWmVyb0JpbiA9PSAwID8gMCA6IGZpcnN0Tm9uWmVyb0JpbiAtIDE7CisKKyAgICBzaXplX3QgbGFzdE5vblplcm9CaW4gPSBtQmlucy5zaXplKCkgLSAxOworICAgIC8vIElmIGxhc3ROb25aZXJvQmluIHJlYWNoZXMgMCwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGxhc3ROb25aZXJvQmluID4gMCAmJiBtQmluc1tsYXN0Tm9uWmVyb0Jpbl0gPT0gMDsgbGFzdE5vblplcm9CaW4tLSkge30KKyAgICBjb25zdCBzaXplX3QgbGFzdEJpblRvUHJpbnQgPSBsYXN0Tm9uWmVyb0JpbiA9PSBtQmlucy5zaXplKCkgLSAxID8gbGFzdE5vblplcm9CaW4KKyAgICAgICAgICAgIDogbGFzdE5vblplcm9CaW4gKyAxOworCisgICAgZm9yIChzaXplX3QgYmluID0gZmlyc3RCaW5Ub1ByaW50OyBiaW4gPD0gbGFzdEJpblRvUHJpbnQ7IGJpbisrKSB7CisgICAgICAgIHNzIDw8IHN0ZDo6c2V0dyhpbmRlbnQgKyBrTWF4TnVtYmVyV2lkdGgpOworICAgICAgICBpZiAoYmluID09IDApIHsKKyAgICAgICAgICAgIHNzIDw8ICI8IjsKKyAgICAgICAgfSBlbHNlIGlmIChiaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgc3MgPDwgIj4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3MgPDwgbUxvdyArIChiaW4gLSAxKSAqIG1CaW5TaXplOworICAgICAgICB9CisgICAgICAgIHNzIDw8ICIgfCI7CisgICAgICAgIHNpemVfdCBpbmNyZW1lbnRzID0gMDsKKyAgICAgICAgY29uc3QgdWludDY0X3QgYmluQ291bnQgPSBtQmluc1tiaW5dOworICAgICAgICBpZiAoYmluQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpbmNyZW1lbnRzID0gbG9nMihiaW5Db3VudCkgKyAxOworICAgICAgICAgICAgc3MgPDwgZ2V0VGFpbChpbmNyZW1lbnRzICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtNYXJrZXJzKTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBnZXRUYWlsKChtYXhJbmNyZW1lbnRzIC0gaW5jcmVtZW50cyArIDEpICoga01hcmtlcnNQZXJJbmNyZW1lbnQsIGtTcGFjZXMpCisgICAgICAgICAgICAgICAgPDwgYmluQ291bnQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLy8gR2l2ZW4gYW4gYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wLCBidWNrZXRzIHRoZSB0aW1lIGludGVydmFsCiAvLyBzaW5jZSB0aGUgcHJldmlvdXMgdGltZXN0YW1wIGludG8gYSBoaXN0b2dyYW0sIHNlYXJjaGVzIGZvcgogLy8gb3V0bGllcnMsIGFuYWx5emVzIHRoZSBvdXRsaWVyIHNlcmllcyBmb3IgdW5leHBlY3RlZGx5CkBAIC0yMDgsMjcgKzMxNyw2IEBACiAgICAgcmV0dXJuIGlzT3V0bGllcjsKIH0KIAotc3RhdGljIGludCB3aWR0aE9mKGludCB4KSB7Ci0gICAgaW50IHdpZHRoID0gMDsKLSAgICBpZiAoeCA8IDApIHsKLSAgICAgICAgd2lkdGgrKzsKLSAgICAgICAgeCA9IHggPT0gSU5UX01JTiA/IElOVF9NQVggOiAteDsKLSAgICB9Ci0gICAgLy8gYXNzZXJ0ICh4ID49IDApCi0gICAgZG8gewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0gd2hpbGUgKHggPiAwKTsKLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLS8vIGNvbXB1dGVzIHRoZSBjb2x1bW4gd2lkdGggcmVxdWlyZWQgZm9yIGEgc3BlY2lmaWMgaGlzdG9ncmFtIHZhbHVlCi1pbmxpbmUgaW50IG51bWJlcldpZHRoKGRvdWJsZSBudW1iZXIsIGludCBsZWZ0UGFkZGluZykgewotICAgIC8vIEFkZGVkIHZhbHVlcyBhY2NvdW50IGZvciB3aGl0ZXNwYWNlcyBuZWVkZWQgYXJvdW5kIG51bWJlcnMsIGFuZCBmb3IgdGhlCi0gICAgLy8gZG90IGFuZCBkZWNpbWFsIGRpZ2l0IG5vdCBhY2NvdW50ZWQgZm9yIGJ5IHdpZHRoT2YKLSAgICByZXR1cm4gc3RkOjptYXgoc3RkOjptYXgod2lkdGhPZihzdGF0aWNfY2FzdDxpbnQ+KG51bWJlcikpICsgMywgMiksIGxlZnRQYWRkaW5nICsgMSk7Ci19Ci0KIC8vIHJvdW5kcyB2YWx1ZSB0byBwcmVjaXNpb24gYmFzZWQgb24gbG9nLWRpc3RhbmNlIGZyb20gbWVhbgogX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogaW5saW5lIGRvdWJsZSBsb2dSb3VuZChkb3VibGUgeCwgZG91YmxlIG1lYW4pIHsKQEAgLTI1NCw3ICszNDIsNyBAQAogLy8gb2YgUGVyZm9ybWFuY2VBbmFseXNpcwogdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpyZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICBpZiAobUhpc3RzLmVtcHR5KCkpIHsKKyAgICBpZiAobUhpc3RzLmVtcHR5KCkgfHwgYm9keSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTI3Myw2OSArMzYxLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDIwMDsKLSAgICBzdGQ6OnN0cmluZyB1bmRlcnNjb3JlcyhrTGVuLCAnXycpOwotICAgIHN0ZDo6c3RyaW5nIHNwYWNlcyhrTGVuLCAnICcpOwotCi0gICAgYXV0byBpdCA9IGJ1Y2tldHMuYmVnaW4oKTsKLSAgICBkb3VibGUgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgaW50IG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAvLyBDb21wdXRlIG1heGltdW0gdmFsdWVzCi0gICAgd2hpbGUgKCsraXQgIT0gYnVja2V0cy5lbmQoKSkgewotICAgICAgICBpZiAoaXQtPmZpcnN0ID4gbWF4RGVsdGEpIHsKLSAgICAgICAgICAgIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdC0+c2Vjb25kID4gbWF4Q291bnQpIHsKLSAgICAgICAgICAgIG1heENvdW50ID0gaXQtPnNlY29uZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgaGVpZ2h0ID0gbG9nMihtYXhDb3VudCkgKyAxOyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZigxIDw8IGhlaWdodCk7Ci0gICAgY29uc3QgaW50IGJ1Y2tldFdpZHRoID0gbnVtYmVyV2lkdGgobWF4RGVsdGEsIGxlZnRQYWRkaW5nKTsKLSAgICBpbnQgc2NhbGluZ0ZhY3RvciA9IDE7Ci0gICAgLy8gc2NhbGUgZGF0YSBpZiBpdCBleGNlZWRzIG1heGltdW0gaGVpZ2h0Ci0gICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewotICAgICAgICBzY2FsaW5nRmFjdG9yID0gKGhlaWdodCArIG1heEhlaWdodCkgLyBtYXhIZWlnaHQ7Ci0gICAgICAgIGhlaWdodCAvPSBzY2FsaW5nRmFjdG9yOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzICUzLjJmICVzIiwgbGVmdFBhZGRpbmcgKyAxMSwKLSAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJSpzJWQsICVsbGQsICVsbGRcbiIsIGxlZnRQYWRkaW5nICsgMTEsCisgICAgc3RhdGljIGNvbnN0IGludCBTSVpFID0gMTI4OworICAgIGNoYXIgdGl0bGVbU0laRV07CisgICAgc25wcmludGYodGl0bGUsIHNpemVvZih0aXRsZSksICJcbiVzICUzLjJmICVzXG4lcyVkLCAlbGxkLCAlbGxkXG4iLAorICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIsCiAgICAgICAgICAgICAiVGhyZWFkLCBoYXNoLCBzdGFydGluZyB0aW1lc3RhbXA6ICIsIGF1dGhvciwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihzdGFydGluZ1RzKSk7Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGxhYmVsIGxpbmUgd2l0aCBidWNrZXQgdmFsdWVzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7Ci0gICAgfQotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgewotICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLmNfc3RyKCksIHguc2Vjb25kIDwgdmFsdWUgPyAiICIgOiAifCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgfQotICAgIC8vIHByaW50IHgtYXhpcwotICAgIGNvbnN0IGludCBjb2x1bW5zID0gc3RhdGljX2Nhc3Q8aW50PihidWNrZXRzLnNpemUoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmMiLCBsZWZ0UGFkZGluZywgJyAnKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoY29sdW1ucyArIDEpICogYnVja2V0V2lkdGgsIHVuZGVyc2NvcmVzLmNfc3RyKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGhhc2gpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHN0YXJ0aW5nVHMpKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtMYWJlbCA9ICJtcyI7CiAKLSAgICAvLyB3cml0ZSBmb290ZXIgd2l0aCBidWNrZXQgbGFiZWxzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKi4qZiIsIGNvbFdpZHRoLCAxLCB4LmZpcnN0KTsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBidWNrZXRXaWR0aCwgc3BhY2VzLmNfc3RyKCksICJtc1xuIik7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlcyIsCisgICAgICAgICAgICBhdWRpb191dGlsc19wbG90X2hpc3RvZ3JhbShidWNrZXRzLCB0aXRsZSwga0xhYmVsLCBtYXhIZWlnaHQpLmNfc3RyKCkpOwogCiAgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcwogICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHM6XG4iKTsKQEAgLTM1MCw3ICszODUsOSBAQAogLy8gd3JpdGVzIHN1bW1hcnkgb2YgcGVyZm9ybWFuY2UgaW50byBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgU3RyaW5nOCBib2R5OworI2lmZGVmIFdSSVRFX1RPX0ZJTEUKICAgICBjb25zdCBjaGFyKiBjb25zdCBrRGlyZWN0b3J5ID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvIjsKKyNlbmRpZgogICAgIGZvciAoYXV0byAmIHRocmVhZCA6IHRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICAgICAgZm9yIChhdXRvICYgaGFzaDogdGhyZWFkLnNlY29uZCkgewogICAgICAgICAgICAgUGVyZm9ybWFuY2VBbmFseXNpcyYgY3VyciA9IGhhc2guc2Vjb25kOwpAQCAtMzYwLDkgKzM5NywxMSBAQAogICAgICAgICAgICAgICAgIGR1bXBMaW5lKGZkLCBpbmRlbnQsIGJvZHkpOwogICAgICAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUKKyNpZmRlZiBXUklURV9UT19GSUxFCisgICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlLiBFbmFibGUgYnkgdW5jb21tZW50aW5nIG1hY3JvIGF0IHRvcCBvZiBmaWxlLgogICAgICAgICAgICAgd3JpdGVUb0ZpbGUoY3Vyci5tSGlzdHMsIGN1cnIubU91dGxpZXJEYXRhLCBjdXJyLm1QZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgICAgICAgIGtEaXJlY3RvcnksIGZhbHNlLCB0aHJlYWQuZmlyc3QsIGhhc2guZmlyc3QpOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0zNzQsNSArNDEzLDQgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTU2ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcApAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitSZWFkZXI6OlJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplLCBuYW1lKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworUmVhZGVyOjp+UmVhZGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9SZWFkZXI7CisgICAgZGVsZXRlIG1GaWZvOworfQorCisvLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90CisvLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCisvLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KK3N0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gUmVhZGVyOjpnZXRTbmFwc2hvdChib29sIGZsdXNoKQoreworICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvdXIgb2YgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6OnJlYWQsIGJ1dCB3aXRob3V0IGluY3JlbWVudGluZyB0aGUKKyAgICAvLyByZWFkZXIgaW5kZXguIFRoZSBpbmRleCBpcyBpbmNyZW1lbnRlZCBhZnRlciBoYW5kbGluZyBjb3JydXB0aW9uLCB0byBhZnRlciB0aGUgbGFzdCBjb21wbGV0ZQorICAgIC8vIGVudHJ5IG9mIHRoZSBidWZmZXIKKyAgICBzaXplX3QgbG9zdCA9IDA7CisgICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07CisgICAgY29uc3Qgc2l6ZV90IGNhcGFjaXR5ID0gbUZpZm8tPmNhcGFjaXR5KCk7CisgICAgc3NpemVfdCBhdmFpbFRvUmVhZDsKKyAgICAvLyBBIGNhbGwgdG8gYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI6Om9idGFpbigpIHBsYWNlcyB0aGUgcmVhZCBwb2ludGVyIG9uZSBidWZmZXIgbGVuZ3RoCisgICAgLy8gYmVmb3JlIHRoZSB3cml0ZXIncyBwb2ludGVyIChzaW5jZSBtRmlmb1JlYWRlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBmbHVzaD1mYWxzZSkuIFRoZQorICAgIC8vIGRvIHdoaWxlIGxvb3AgaXMgYW4gYXR0ZW1wdCB0byByZWFkIGFsbCBvZiB0aGUgRklGTydzIGNvbnRlbnRzIHJlZ2FyZGxlc3Mgb2YgaG93IGJlaGluZAorICAgIC8vIHRoZSByZWFkZXIgaXMgd2l0aCByZXNwZWN0IHRvIHRoZSB3cml0ZXIuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgc2NoZWR1bGluZyBzZXF1ZW5jZSBpcworICAgIC8vIHBvc3NpYmxlIGFuZCBjYW4gbGVhZCB0byBhIHN0YXJ2YXRpb24gc2l0dWF0aW9uOgorICAgIC8vIC0gV3JpdGVyIFQxIHdyaXRlcywgb3ZlcnJ1biB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyIFQyCisgICAgLy8gLSBUMiBjYWxscyBvYnRhaW4oKSBhbmQgZ2V0cyBFT1ZFUkZMT1csIFQyIHB0ciBwbGFjZWQgb25lIGJ1ZmZlciBzaXplIGJlaGluZCBUMSBwdHIKKyAgICAvLyAtIFQxIHdyaXRlLCBvdmVycnVuCisgICAgLy8gLSBUMiBvYnRhaW4oKSwgRU9WRVJGTE9XIChhbmQgc28gb24uLi4pCisgICAgLy8gVG8gYWRkcmVzcyB0aGlzIGlzc3VlLCB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIHRyaWVzIGZvciB0aGUgcmVhZGVyIHRvIGNhdGNoIHVwIHdpdGgKKyAgICAvLyB0aGUgd3JpdGVyLgorICAgIGludCB0cmllcyA9IDA7CisgICAgc2l6ZV90IGxvc3RUZW1wOworICAgIGRvIHsKKyAgICAgICAgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3RUZW1wKTsKKyAgICAgICAgbG9zdCArPSBsb3N0VGVtcDsKKyAgICB9IHdoaWxlIChhdmFpbFRvUmVhZCA8IDAgfHwgKyt0cmllcyA8PSBrTWF4T2J0YWluVHJpZXMpOworCisgICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKKyAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgPCAwLCAiTkJMb2cgUmVhZGVyICVzIGZhaWxlZCB0byBjYXRjaCB1cCB3aXRoIFdyaXRlciIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gQ2hhbmdlIHRvICNpZiAxIGZvciBkZWJ1Z2dpbmcuIFRoaXMgc3RhdGVtZW50IGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgYnVmZmVyIGZ1bGxuZXNzIGxldmVscworICAgIC8vIChhcyBzZWVuIGJ5IHJlYWRlcikgYW5kIGhvdyBtdWNoIGRhdGEgd2FzIGxvc3QuIElmIHlvdSBmaW5kIHRoYXQgdGhlIGZ1bGxuZXNzIGxldmVsIGlzCisgICAgLy8gZ2V0dGluZyBjbG9zZSB0byBmdWxsLCBvciB0aGF0IGRhdGEgbG9zcyBpcyBoYXBwZW5pbmcgdG8gb2Z0ZW4sIHRoZW4geW91IHNob3VsZAorICAgIC8vIHByb2JhYmx5IHRyeSBzb21lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBsb2cgbGVzcyBkYXRhCisgICAgLy8gLSBsb2cgbGVzcyBvZnRlbgorICAgIC8vIC0gaW5jcmVhc2UgdGhlIGluaXRpYWwgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgYnVmZmVyCisjaWYgMAorICAgIEFMT0dEKCJnZXRTbmFwc2hvdCBuYW1lPSVzLCBhdmFpbFRvUmVhZD0lemQsIGNhcGFjaXR5PSV6dSwgZnVsbG5lc3M9JS4zZiwgbG9zdD0lenUiLAorICAgICAgICAgICAgbmFtZSgpLmNfc3RyKCksIGF2YWlsVG9SZWFkLCBjYXBhY2l0eSwgKGRvdWJsZSlhdmFpbFRvUmVhZCAvIChkb3VibGUpY2FwYWNpdHksIGxvc3QpOworI2VuZGlmCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdChuZXcgU25hcHNob3QoYXZhaWxUb1JlYWQpKTsKKyAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhLCAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1swXS5tT2Zmc2V0LCBpb3ZlY1swXS5tTGVuZ3RoKTsKKyAgICBpZiAoaW92ZWNbMV0ubUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSArIChpb3ZlY1swXS5tTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgorICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAorICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAorICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEZNVF9FTkQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KKyAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCisKKyAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7CisgICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7CisKKyAgICAvLyBGaW5kIGxhc3QgRk1UX0VORC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgorICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0ZNVF9FTkQuCisgICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgYmFjaywgaW52YWxpZEVuZFR5cGVzKTsKKyAgICBpZiAobGFzdEVuZCA9PSBudWxscHRyKSB7CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZnJvbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVuZCBvZiBzbmFwc2hvdCBwb2ludHMgdG8gYWZ0ZXIgbGFzdCBGTVRfRU5EIGVudHJ5CisgICAgICAgIHNuYXBzaG90LT5tRW5kID0gRW50cnlJdGVyYXRvcihsYXN0RW5kKS5uZXh0KCk7CisgICAgICAgIC8vIGZpbmQgZmlyc3QgRk1UX1NUQVJUCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnQgPSBudWxscHRyOworICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0VG1wID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIHdoaWxlICgoZmlyc3RTdGFydFRtcCA9IGZpbmRMYXN0VmFsaWRFbnRyeShmcm9udCwgZmlyc3RTdGFydFRtcCwgaW52YWxpZEJlZ2luVHlwZXMpKQorICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOworICAgICAgICB9CisgICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBGTVRfU1RBUlQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCisgICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIG1GaWZvUmVhZGVyLT5yZWxlYXNlKHNuYXBzaG90LT5tRW5kIC0gZnJvbnQpOworICAgIH0KKworICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7CisgICAgcmV0dXJuIHNuYXBzaG90OworfQorCitib29sIFJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAoreworICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKK30KKworLy8gV2UgbWFrZSBhIHNldCBvZiB0aGUgaW52YWxpZCB0eXBlcyByYXRoZXIgdGhhbiB0aGUgdmFsaWQgdHlwZXMgd2hlbiBhbGlnbmluZworLy8gU25hcHNob3QgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcyBkdXJpbmcgbG9nIGNvcnJ1cHRpb24gY2hlY2tpbmcuCisvLyBUaGlzIGlzIGRvbmUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIG1haW50ZW5hbmNlIG92ZXJoZWFkIG9mIGFkZGluZyBhIG5ldyBFdmVudAorLy8gdHlwZSB0byB0aGUgdHdvIHNldHMgYmVsb3cgd2hlbmV2ZXIgYSBuZXcgRXZlbnQgdHlwZSBpcyBjcmVhdGVkLCBhcyBpdCBpcworLy8gdmVyeSBsaWtlbHkgdGhhdCBuZXcgdHlwZXMgYWRkZWQgd2lsbCBiZSB2YWxpZCB0eXBlcy4KKy8vIEN1cnJlbnRseSwgaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNwZWNpYWwKKy8vIGNhc2Ugb2YgYSBGb3JtYXQgRW50cnksIHdoaWNoIGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcy4KKy8vIElmIGEgbmV3IEV2ZW50IGlzIGFkZGVkIHRoYXQgY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLAorLy8gdGhlbiB0aGVzZSBzZXRzIG5lZWQgdG8gYmUgdXBkYXRlZC4KKworLy8gV2Ugd2FudCB0aGUgYmVnaW5uaW5nIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhbiBGTVRfRU5ELgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRCZWdpblR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9FTkQsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworLy8gV2Ugd2FudCB0aGUgZW5kIG9mIGEgU25hcHNob3QgdG8gcG9pbnQgdG8gYW4gZW50cnkgdGhhdCBpcyBub3QgaW4KKy8vIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXR0ZWQgZW50cnkgYW5kIG5vdCBhIEZNVF9TVEFSVC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkRW5kVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0ZMT0FULAorICAgIEVWRU5UX0ZNVF9IQVNILAorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLAorICAgIEVWRU5UX0ZNVF9QSUQsCisgICAgRVZFTlRfRk1UX1NUQVJULAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKK2NvbnN0IHVpbnQ4X3QgKlJlYWRlcjo6ZmluZExhc3RWYWxpZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKSB7CisgICAgaWYgKGZyb250ID09IG51bGxwdHIgfHwgYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKKyAgICAgICAgY29uc3QgRXZlbnQgdHlwZSA9IChjb25zdCBFdmVudClwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV07CisgICAgICAgIGlmIChwcmV2IDwgZnJvbnQKKyAgICAgICAgICAgICAgICB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2sKKyAgICAgICAgICAgICAgICB8fCB0eXBlIDw9IEVWRU5UX1JFU0VSVkVEIHx8IHR5cGUgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKKyAgICAgICAgICAgIC8vIHByZXYgcG9pbnRzIHRvIGFuIG91dCBvZiBsaW1pdHMgb3IgaW5jb25zaXN0ZW50IGVudHJ5CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBpbnZhbGlkVHlwZXMgZG9lcyBub3QgY29udGFpbiB0aGUgdHlwZSwgdGhlbiB0aGUgdHlwZSBpcyB2YWxpZC4KKyAgICAgICAgaWYgKGludmFsaWRUeXBlcy5maW5kKHR5cGUpID09IGludmFsaWRUeXBlcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgYmFjayA9IHByZXY7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAorfQorCisvLyBUT0RPIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSwgd291bGQgcHJlZmVyIHRvIGhhdmUgYSBkdW1wKCkgZ28gdG8gc3RyaW5nLCBhbmQgdGhlbiBnbworLy8gdG8gZmQgb25seSB3aGVuIGludm9rZWQgdGhyb3VnaCBiaW5kZXIuCit2b2lkIER1bXBSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50KQoreworICAgIGlmIChmZCA8IDApIHJldHVybjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90ID0gZ2V0U25hcHNob3QoZmFsc2UgLypmbHVzaCovKTsKKyAgICBpZiAoc25hcHNob3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OworCisgICAgLy8gVE9ETyBhbGwgbG9nZ2VkIHR5cGVzIHNob3VsZCBoYXZlIGEgcHJpbnRhYmxlIGZvcm1hdC4KKyAgICAvLyBUT0RPIGNhbiB3ZSBtYWtlIHRoZSBwcmludGluZyBnZW5lcmljPworICAgIGZvciAoRW50cnlJdGVyYXRvciBpdCA9IHNuYXBzaG90LT5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9TVEFSVDoKKyAgICAgICAgICAgIGl0ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGl0KSwgJnRpbWVzdGFtcCwgJmJvZHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX0xBVEVOQ1ksJS4zZiIsIGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfT1ZFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9PVkVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfSU5GTywlZCwlcyIsIHN0YXRpY19jYXN0PGludD4oaW5mby5pZCksCisgICAgICAgICAgICAgICAgICAgIHRocmVhZFR5cGVUb1N0cmluZyhpbmZvLnR5cGUpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9VTkRFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dBUk1VUF9USU1FOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV0FSTVVQX1RJTUUsJS4zZiIsIHRpbWVNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dPUktfVElNRSwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtb25vdG9uaWNOcykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9USFJFQURfUEFSQU1TLCV6dSwldSIsIHBhcmFtcy5mcmFtZUNvdW50LCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX0VORDoKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJS4qcyVzICVzXG4iLCAoaW50KWluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgICAgICAgICBib2R5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIER1bXBSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCisgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSkKK3sKKyAgICBTdHJpbmc4IHRpbWVzdGFtcExvY2FsOworICAgIFN0cmluZzggYm9keUxvY2FsOworICAgIGlmICh0aW1lc3RhbXAgPT0gbnVsbHB0cikgeworICAgICAgICB0aW1lc3RhbXAgPSAmdGltZXN0YW1wTG9jYWw7CisgICAgfQorICAgIGlmIChib2R5ID09IG51bGxwdHIpIHsKKyAgICAgICAgYm9keSA9ICZib2R5TG9jYWw7CisgICAgfQorCisgICAgLy8gbG9nIHRpbWVzdGFtcAorICAgIGNvbnN0IGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKKyAgICB0aW1lc3RhbXAtPmNsZWFyKCk7CisgICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOworCisgICAgLy8gbG9nIHVuaXF1ZSBoYXNoCisgICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOworICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOworCisgICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKKyAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOworCisgICAgLy8gbG9nIHN0cmluZworICAgIEVudHJ5SXRlcmF0b3IgYXJnID0gZm10RW50cnkuYXJncygpOworCisgICAgY29uc3QgY2hhciogZm10ID0gZm10RW50cnkuZm9ybWF0U3RyaW5nKCk7CisgICAgc2l6ZV90IGZtdF9sZW5ndGggPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmdMZW5ndGgoKTsKKworICAgIGZvciAoc2l6ZV90IGZtdF9vZmZzZXQgPSAwOyBmbXRfb2Zmc2V0IDwgZm10X2xlbmd0aDsgKytmbXRfb2Zmc2V0KSB7CisgICAgICAgIGlmIChmbXRbZm10X29mZnNldF0gIT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoJmZtdFtmbXRfb2Zmc2V0XSwgMSk7IC8vIFRPRE8gb3B0aW1pemUgdG8gd3JpdGUgY29uc2VjdXRpdmUgc3RyaW5ncyBhdCBvbmNlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlJSIiCisgICAgICAgIGlmIChmbXRbKytmbXRfb2Zmc2V0XSA9PSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgiJSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJVwwIgorICAgICAgICBpZiAoZm10X29mZnNldCA9PSBmbXRfbGVuZ3RoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50IGV2ZW50ID0gKEV2ZW50KSBhcmctPnR5cGU7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKKworICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0CisKKyAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0ZNVF9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCisgICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZworICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1NUUklORywKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHRpbWVzdGFtcCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kVGltZXN0YW1wKGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0ZMT0FULAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncCc6IC8vIHBpZAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX1BJRCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgcGlkIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRQSUQoYm9keSwgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIk5CTG9nIFJlYWRlciBlbmNvdW50ZXJlZCB1bmtub3duIGNoYXJhY3RlciAlYyIsIGZtdFtmbXRfb2Zmc2V0XSk7CisgICAgICAgIH0KKyAgICAgICAgKythcmc7CisgICAgfQorICAgIEFMT0dXX0lGKGFyZy0+dHlwZSAhPSBFVkVOVF9GTVRfRU5ELCAiRXhwZWN0ZWQgZW5kIG9mIGZvcm1hdCwgZ290ICVkIiwgYXJnLT50eXBlKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9pbnQgeCA9ICooKGludCopIGRhdGEpOworICAgIGludCB4OworICAgIG1lbWNweSgmeCwgZGF0YSwgc2l6ZW9mKHgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmxvYXQgZjsKKyAgICBtZW1jcHkoJmYsIGRhdGEsIHNpemVvZihmKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7CisgICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDY0X3QgdHM7CisgICAgbWVtY3B5KCZ0cywgZGF0YSwgc2l6ZW9mKHRzKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIHN0ci5hcHBlbmQoIlsgIik7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJdIik7CisgICAgcmV0dXJuIHN0cjsKK30KKworU3RyaW5nOCBEdW1wUmVhZGVyOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQoreworICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCmluZGV4IDgyN2U3MzEuLmIwNTBiODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTE1LDkgKzE1LDExIEBACiAgKi8KIAogI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMjcsMjMgKzI5LDE5NSBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkdW1wVG9Kc29uKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6VmFsdWU+IHJvb3RQdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPEpzb246OlZhbHVlPihKc29uOjpvYmplY3RWYWx1ZSk7CisgICAgSnNvbjo6VmFsdWUmIHJvb3QgPSAqcm9vdFB0cjsKKyAgICByb290WyJpb0hhbmRsZSJdID0gZGF0YS50aHJlYWRJbmZvLmlkOworICAgIHJvb3RbInR5cGUiXSA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgIHJvb3RbImZyYW1lQ291bnQiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQ7CisgICAgcm9vdFsic2FtcGxlUmF0ZSJdID0gKEpzb246OlZhbHVlOjpJbnQpZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgICByb290WyJ3b3JrTXNIaXN0Il0gPSBkYXRhLndvcmtIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsibGF0ZW5jeU1zSGlzdCJdID0gZGF0YS5sYXRlbmN5SGlzdC50b1N0cmluZygpOworICAgIHJvb3RbIndhcm11cE1zSGlzdCJdID0gZGF0YS53YXJtdXBIaXN0LnRvU3RyaW5nKCk7CisgICAgcm9vdFsidW5kZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEudW5kZXJydW5zOworICAgIHJvb3RbIm92ZXJydW5zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KWRhdGEub3ZlcnJ1bnM7CisgICAgcm9vdFsiYWN0aXZlTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoZGF0YS5hY3RpdmUpOworICAgIHJvb3RbImR1cmF0aW9uTXMiXSA9IChKc29uOjpWYWx1ZTo6SW50NjQpbnMybXMoc3lzdGVtVGltZSgpIC0gZGF0YS5zdGFydCk7CisgICAgcmV0dXJuIHJvb3RQdHI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSkKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgIHNzIDw8ICJUaHJlYWQgdHlwZT0iIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpCisgICAgICAgICAgICA8PCAiIGhhbmRsZT0iIDw8IGRhdGEudGhyZWFkSW5mby5pZAorICAgICAgICAgICAgPDwgIiBzYW1wbGVSYXRlPSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZQorICAgICAgICAgICAgPDwgIiBmcmFtZUNvdW50PSIgPDwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCA8PCAiXG4iOworICAgIHNzIDw8ICIgIFRocmVhZCB3b3JrIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndvcmtIaXN0LmFzY2lpQXJ0U3RyaW5nKDQgLyppbmRlbnQqLyk7CisgICAgc3MgPDwgIiAgVGhyZWFkIGxhdGVuY2llcyBpbiBtczpcbiIgPDwgZGF0YS5sYXRlbmN5SGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCB3YXJtdXAgdGltZXMgaW4gbXM6XG4iIDw8IGRhdGEud2FybXVwSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKc29uOjpWYWx1ZSByb290KEpzb246OmFycmF5VmFsdWUpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICAvLyBTa2lwIHRocmVhZHMgdGhhdCBkbyBub3QgaGF2ZSBwZXJmb3JtYW5jZSBkYXRhIHJlY29yZGVkIHlldC4KKyAgICAgICAgaWYgKGRhdGEuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiBkYXRhSnNvbiA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wVG9Kc29uKGRhdGEpOworICAgICAgICBpZiAoZGF0YUpzb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKCpkYXRhSnNvbilbInRocmVhZE51bSJdID0gaXRlbS5maXJzdDsKKyAgICAgICAgcm9vdC5hcHBlbmQoKmRhdGFKc29uKTsKKyAgICB9CisgICAgSnNvbjo6U3R5bGVkV3JpdGVyIHdyaXRlcjsKKyAgICBzdGQ6OnN0cmluZyByb290U3RyID0gd3JpdGVyLndyaXRlKHJvb3QpOworICAgIHdyaXRlKGZkLCByb290U3RyLmNfc3RyKCksIHJvb3RTdHIuc2l6ZSgpKTsKK30KKwordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogdGhyZWFkRGF0YU1hcCkgeworICAgICAgICBjb25zdCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGhpc3RzID0gUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBIaXN0b2dyYW1zVG9TdHJpbmcoZGF0YSk7CisgICAgICAgIHdyaXRlKGZkLCBoaXN0cy5jX3N0cigpLCBoaXN0cy5zaXplKCkpOworICAgIH0KK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBSZXRyb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEsIGludDY0X3Qgbm93KQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpIDw8ICIsIiA8PCBkYXRhLnRocmVhZEluZm8uaWQgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiBkYXRhLnNuYXBzaG90cykgeworICAgICAgICAvLyBUT0RPIHVzZSBhbiBlbnVtIHRvIHN0cmluZyBjb252ZXJzaW9uIG1ldGhvZC4gT25lIGdvb2QgaWRlYToKKyAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIzODE1NworICAgICAgICBpZiAoaXRlbS5maXJzdCA9PSBOQkxvZzo6RVZFTlRfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9VTkRFUlJVTiwiOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX09WRVJSVU4pIHsKKyAgICAgICAgICAgIHNzIDw8ICJFVkVOVF9PVkVSUlVOLCI7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgbm93IC0gaXRlbS5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmV0cm9TdHIgPSBkdW1wUmV0cm9TdHJpbmcoZGF0YSwgbm93KTsKKyAgICAgICAgd3JpdGUoZmQsIHJldHJvU3RyLmNfc3RyKCksIHJldHJvU3RyLnNpemUoKSk7CisgICAgfQorfQorCitib29sIHNlbmRUb01lZGlhTWV0cmljcyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgLy8gU2VlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIG1ldHJpY3MgaGVyZToKKyAgICAvLyBkb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xMS0tNmR5T1hWT3BhY1lRTFppYU9ZNVFWdFFqVXlxTngyelQ5Y0N6TEtZRS9lZGl0P3VzcD1zaGFyaW5nCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC50eXBlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEZyYW1lQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmZyYW1lY291bnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuc2FtcGxlcmF0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXb3JrSGlzdFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQud29ya01zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkTGF0ZW5jeUhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmxhdGVuY3lNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFdhcm11cEhpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndhcm11cE1zLmhpc3QiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVW5kZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC51bmRlcnJ1bnMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkT3ZlcnJ1bnNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLm92ZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZEFjdGl2ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuYWN0aXZlTXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkRHVyYXRpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmR1cmF0aW9uTXMiOworCisgICAgLy8gQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IEZhc3RNaXhlciB0aHJlYWQgZGF0YSB0byBiZSBzZW50IHRvIE1lZGlhIE1ldHJpY3MuCisgICAgaWYgKGRhdGEudGhyZWFkSW5mby50eXBlICE9IE5CTG9nOjpGQVNUTUlYRVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdGhyZWFkIikpOworCisgICAgY29uc3QgSGlzdG9ncmFtICZ3b3JrSGlzdCA9IGRhdGEud29ya0hpc3Q7CisgICAgaWYgKHdvcmtIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV29ya0hpc3QsIHdvcmtIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZsYXRlbmN5SGlzdCA9IGRhdGEubGF0ZW5jeUhpc3Q7CisgICAgaWYgKGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkTGF0ZW5jeUhpc3QsIGxhdGVuY3lIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZ3YXJtdXBIaXN0ID0gZGF0YS53YXJtdXBIaXN0OworICAgIGlmICh3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV2FybXVwSGlzdCwgd2FybXVwSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChkYXRhLnVuZGVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZFVuZGVycnVucywgZGF0YS51bmRlcnJ1bnMpOworICAgIH0KKworICAgIGlmIChkYXRhLm92ZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkT3ZlcnJ1bnMsIGRhdGEub3ZlcnJ1bnMpOworICAgIH0KKworICAgIC8vIFNlbmQgdG8gTWVkaWEgTWV0cmljcyBpZiB0aGUgcmVjb3JkIGlzIG5vdCBlbXB0eS4KKyAgICAvLyBUaGUgdGhyZWFkIGFuZCB0aW1lIGluZm8gYXJlIGFkZGVkIGluc2lkZSB0aGUgaWYgc3RhdGVtZW50IGJlY2F1c2UKKyAgICAvLyB3ZSB3YW50IHRvIHNlbmQgdGhlbSBvbmx5IGlmIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRvIHNlbmQuCisgICAgaWYgKGl0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgIC8vIEFkZCB0aHJlYWQgaW5mbyBmaWVsZHMuCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlU3RyaW5nID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFR5cGUsIHR5cGVTdHJpbmcpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkRnJhbWVDb3VudCwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRTYW1wbGVSYXRlLCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQWRkIHRpbWUgaW5mbyBmaWVsZHMuCisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRBY3RpdmUsIGRhdGEuYWN0aXZlIC8gMTAwMDAwMCk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWREdXJhdGlvbiwgKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCiAvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CkBAIC0xMjgsNiArMzAyLDUgQEAKICAgICBwZnMuY2xvc2UoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjAzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gVGltZWxpbmUuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK1dyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitXcml0ZXI6On5Xcml0ZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKKyAgICBkZWxldGUgbUZpZm87CisgICAgZGVsZXRlW10gbVBpZFRhZzsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmICghY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykpIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKKyAgICByZXR1cm4gb2xkOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHIubUV2ZW50LCBldHIubURhdGEsIGV0ci5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbmVlZCA9IGV0ci5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCisKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCisgICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KKyAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKKyAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKKyAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7CisgICAgICAgIHRlbXBbaV0gPSBldHIuY29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZyhldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107CisgICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKKyAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKKyAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkgeworICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfRk1UX1NUQVJULCBmbXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBuc2Vjc190IHRzID0gc3lzdGVtVGltZSgpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICBjaGFyKiBzOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgbG9nKEVWRU5UX0ZNVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGlmICgqcCAhPSAnJScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCgqKytwKSB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9TVFJJTkcsIHMsIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0LCBzaXplb2YodCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfSU5URUdFUiwgJmksIHNpemVvZihpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGQgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBmID0gKGZsb2F0KWQ7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0ZMT0FULCAmZiwgc2l6ZW9mKGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFbnRyeSBldHIoRVZFTlRfRk1UX0VORCwgbnVsbHB0ciwgMCk7CisgICAgbG9nKGV0ciwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKK3sKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2coZW50cnksIHRydXN0ZWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorc3RydWN0IGVudHJ5IHsKKyAgICBjb25zdCB1aW50OF90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworfTsKKworLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKK3N0cnVjdCBlbmRpbmcgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgbmV4dFswXTsKK307CisKKy8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKKy8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKy8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisvLyAgLi4uCisvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorLy8gIC4uLgorLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQorLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorY2xhc3MgRW50cnkgeworcHVibGljOgorICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKyAgICB+RW50cnkoKSB7fQorCisgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KKyAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV3JpdGVyOworICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKK3B1YmxpYzoKKyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKworICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Cit9OworCisvLyBlbnRyeSBpdGVyYXRvcgorY2xhc3MgRW50cnlJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNlZCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQKKyAgICAvLyBFbnRyeUl0ZXJhdG9yIG90aGVyIHRoYW4gYXNzaWduaW5nIGl0IHRvIGFub3RoZXIgdmFsaWQgRW50cnlJdGVyYXRvcgorICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBFbnRyeUl0ZXJhdG9yKCk7CisgICAgLy8gQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGVudHJ5IGlzIG5vdCBudWxscHRyLgorICAgIC8vIFBhc3NpbmcgaW4gbnVsbHB0ciBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKKworICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgbmV4dCgpIGNvbnN0OworICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBwcmV2KCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAvLyBtZW1jcHkgcHJlZmVycmVkIHRvIHJlaW50ZXJwcmV0X2Nhc3QgdG8gYXZvaWQgcG90ZW50aWFsbHkgdW5zdXBwb3J0ZWQKKyAgICAvLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4KKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4obVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7CisgICAgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUIHBheWxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk5CTG9nOjpFbnRyeUl0ZXJhdG9yIHBheWxvYWQgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7CisgICAgICAgIFQgcGF5bG9hZDsKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgICptUHRyOyAgIC8vIFNob3VsZCBub3QgYmUgbnVsbHB0ciBleGNlcHQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWVyZ2luZyBpbnRvIHRoZSBNZXJnZXIncyBidWZmZXIuCisKK2NsYXNzIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQorCisgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwdHIuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKKyAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlciwgd2hpY2ggc2hhbGwgbm90IGJlIG51bGxwdHIuCisgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHt9CisgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5CisgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IG1FbnRyeTsKK307CisKKy8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKKworLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gICAgKiBGTVRfU1RBUlQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKy8vICAgICogVElNRVNUQU1QIGVudHJ5CisvLyAgICAqIEhBU0ggZW50cnkKKy8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisvLyAgICAqIGZvcm1hdCBhcmcxCisvLyAgICAqIGZvcm1hdCBhcmcyCisvLyAgICAqIC4uLgorLy8gICAgKiBGTVRfRU5EIGVudHJ5CitjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5Gb3JtYXRFbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZworICAgIGNvbnN0IGNoYXIqICAgZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgc2l6ZV90ICAgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZ3MoKSBjb25zdDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkhpc3RvZ3JhbUVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBUT0RPIGhhdmUgYSBjb21tZW50IHNvbWV3aGVyZSBleHBsYWluaW5nIHRoZSB3aG9sZSBwcm9jZXNzIGZvciBhZGRpbmcgYSBuZXcgRVZFTlRfCisKKy8vIE5CTG9nIEV2ZW50IHR5cGVzLiBUaGUgRXZlbnRzIGFyZSBuYW1lZCB0byBwcm92aWRlIGNvbnRleHR1YWwgbWVhbmluZyBmb3Igd2hhdCBpcyBsb2dnZWQuCisvLyBJZiBhZGRpbmcgYSBuZXcgc3RhbmRhbG9uZSBFdmVudCBoZXJlLCB1cGRhdGUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBieSBhZGRpbmcgYQorLy8gTUFQX0VWRU5UX1RPX1RZUEUgc3RhdGVtZW50IGJlbG93LgorLy8gWFhYIE5vdGUgdGhhdCBhcyBvZiB0aGUgY3VycmVudCBkZXNpZ24sIEV2ZW50cyBzaG91bGQgbm90IGJlIHJlbnVtYmVyZWQgKGkuZS4gcmVvcmRlcmVkKQorLy8gaWYgdGhleSBldmVyIGxlYXZlIG1lbW9yeSAoZm9yIGV4YW1wbGUsIHdyaXR0ZW4gdG8gZmlsZSwgdXBsb2FkZWQgdG8gY2xvdWQsIGV0Yy4pLgorLy8gVE9ETyBtYWtlIHNvbWUgc29ydCBvZiBpbnRlcmZhY2UgdG8ga2VlcCB0aGVzZSAiY29udHJhY3QiIGNvbnN0YW50cy4KK2VudW0gRXZlbnQgOiB1aW50OF90IHsKKyAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKKyAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisKKyAgICAvLyBUeXBlcyBmb3IgRm9ybWF0IEVudHJ5LCBpLmUuIGZvcm1hdHRlZCBlbnRyeQorICAgIEVWRU5UX0ZNVF9TVEFSVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgIC8vIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfQVVUSE9SLCAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICBFVkVOVF9GTVRfRkxPQVQsICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfSEFTSCwgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLCAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1BJRCwgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQorICAgIEVWRU5UX0ZNVF9TVFJJTkcsICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLCAgICAgICAgLy8gdGltZXN0YW1wIHZhbHVlIGVudHJ5CisgICAgLy8gZW5kIG9mIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfRU5ELCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAvLyBUeXBlcyBmb3Igd2FrZXVwIHRpbWVzdGFtcCBoaXN0b2dyYW1zCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCisgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorCisgICAgLy8gVHlwZXMgcmVwcmVzZW50aW5nIGF1ZGlvIHBlcmZvcm1hbmNlIG1ldHJpY3MKKyAgICBFVkVOVF9MQVRFTkNZLCAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssIGRpdmlkZWQgYnkgc2FtcGxlIHJhdGUuCisgICAgRVZFTlRfT1ZFUlJVTiwgICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgb3ZlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9USFJFQURfSU5GTywgICAgICAgICAgLy8gc2VlIHRocmVhZF9pbmZvX3QgYmVsb3cKKyAgICBFVkVOVF9VTkRFUlJVTiwgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCB1bmRlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9XQVJNVVBfVElNRSwgICAgICAgICAgLy8gdGhyZWFkIHdhcm11cCB0aW1lCisgICAgRVZFTlRfV09SS19USU1FLCAgICAgICAgICAgIC8vIHRoZSB0aW1lIGEgdGhyZWFkIHRha2VzIHRvIGRvIHdvcmssIGUuZy4gcmVhZCwgd3JpdGUsIGV0Yy4KKyAgICBFVkVOVF9USFJFQURfUEFSQU1TLCAgICAgICAgLy8gc2VlIHRocmVhZF9wYXJhbXNfdCBiZWxvdworCisgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworfTsKKworLy8gTkJMb2cgY3VzdG9tLWRlZmluZWQgc3RydWN0cy4gU29tZSBOQkxvZyBFdmVudCB0eXBlcyBtYXAgdG8gdGhlc2Ugc3RydWN0cy4KKwordXNpbmcgbG9nX2hhc2hfdCA9IHVpbnQ2NF90OworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnkgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgYXV0aG9yOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIFRocmVhZFR5cGUgeworICAgIFVOS05PV04sCisgICAgTUlYRVIsCisgICAgQ0FQVFVSRSwKKyAgICBGQVNUTUlYRVIsCisgICAgRkFTVENBUFRVUkUsCit9OworCitpbmxpbmUgY29uc3QgY2hhciAqdGhyZWFkVHlwZVRvU3RyaW5nKFRocmVhZFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJDQVBUVVJFIjsKKyAgICBjYXNlIEZBU1RNSVhFUjoKKyAgICAgICAgcmV0dXJuICJGQVNUTUlYRVIiOworICAgIGNhc2UgRkFTVENBUFRVUkU6CisgICAgICAgIHJldHVybiAiRkFTVENBUFRVUkUiOworICAgIGNhc2UgVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX0lORk8KKy8vIFRoZXNlIGZpZWxkcyBhbHdheXMgc3RheSB0aGUgc2FtZSB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBzaG91bGQgb25seSBuZWVkIHRvIGJlIGxvZ2dlZCBvbmNlIHVwb24gdGhyZWFkIGluaXRpYWxpemF0aW9uLgorLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiB0aGUgbG9nIGV2ZW50IGNvcnJlc3BvbmRpbmcKKy8vIHRvIHRoaXMgdHlwZSBpcyBsb3N0LgorLy8gVE9ETyBhZGQgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhIHJlYWRlciB0byBNZWRpYUxvZ1NlcnZpY2U/CitzdHJ1Y3QgdGhyZWFkX2luZm9fdCB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSAtMTsgICAgICAvLyBUaHJlYWQgSS9PIGhhbmRsZQorICAgIFRocmVhZFR5cGUgdHlwZSA9IFVOS05PV047ICAgICAgLy8gU2VlIGVudW0gVGhyZWFkVHlwZSBhYm92ZQorfTsKKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX1BBUkFNUworLy8gVGhlc2UgZmllbGRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gY2FuIGJlIGxvZ2dlZCB3aGVuZXZlciBhIHRocmVhZCByZWNlaXZlcyBuZXcgY29uZmlndXJhdGlvbnMgb3IgcGFyYW1ldGVycy4KK3N0cnVjdCB0aHJlYWRfcGFyYW1zX3QgeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgcmVhZCBvciB3cml0ZSBidWZmZXIKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsgICAgICAgIC8vIGluIGZyYW1lcyBwZXIgc2Vjb25kCit9OworCit0ZW1wbGF0ZSA8RXZlbnQgRT4gc3RydWN0IGdldF9tYXBwZWQ7CisjZGVmaW5lIE1BUF9FVkVOVF9UT19UWVBFKEUsIFQpIFwKK3RlbXBsYXRlPD4gc3RydWN0IGdldF9tYXBwZWQ8RT4geyBcCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUgXAorICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJOQkxvZzo6RXZlbnQgbXVzdCBtYXAgdG8gdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOyBcCisgICAgdHlwZWRlZiBUIHR5cGU7IFwKK30KKworLy8gTWFwcyBhbiBOQkxvZyBFdmVudCB0eXBlIHRvIGEgQysrIFBPRCB0eXBlLgorTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfTEFURU5DWSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX09WRVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX0lORk8sIHRocmVhZF9pbmZvX3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVU5ERVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV0FSTVVQX1RJTUUsIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XT1JLX1RJTUUsIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX1BBUkFNUywgdGhyZWFkX3BhcmFtc190KTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhODUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nMTY7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBUT0RPIHVwZGF0ZSBjb21tZW50cyB0byByZWZsZWN0IGN1cnJlbnQgZnVuY3Rpb25hbGl0aWVzCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCitjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgfk1lcmdlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+ICZyZWFkZXIpOworICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgorICAgIHZvaWQgbWVyZ2UoKTsKKworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIGdldFJlYWRlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgIHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+IG1SZWFkZXJzOworCisgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KK307CisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKy8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KK2NsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7CitwdWJsaWM6CisgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIHZvaWQgcHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwLCBpbnQgYXV0aG9yKTsKKworICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQorICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICAvLyBjaGVjayBmb3IgcGVyaW9kaWMgcHVzaCBvZiBwZXJmb3JtYW5jZSBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGFuZCBwZXJmb3JtCisgICAgLy8gdGhlIHNlbmQgaWYgaXQgaXMgdGltZSB0byBkbyBzby4KKyAgICB2b2lkIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgLy8gVGhlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWVyZ2VyIGNsYXNzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBtUmVhZGVyczsKKworICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCisgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7CisKKyAgICAvLyBjb21wcmVzc2VzIGFuZCBzdG9yZXMgYXVkaW8gcGVyZm9ybWFuY2UgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgYnVmZmVycy4KKyAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgYXV0aG9yLCBpLmUuIHRocmVhZCBpbmRleC4KKyAgICBzdGQ6Om1hcDxpbnQsIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE+IG1UaHJlYWRQZXJmb3JtYW5jZURhdGE7CisKKyAgICAvLyBob3cgb2Z0ZW4gdG8gcHVzaCBkYXRhIHRvIE1lZGlhIE1ldHJpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCA9IHMybnMoKG5zZWNzX3QpMiAqIDYwICogNjApOyAvLyAyIGhvdXJzCisKKyAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKK307CisKKy8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKy8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCisvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCisgICAgdm9pZCB3YWtldXAoKTsKKworICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOworCitwcml2YXRlOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgTWVyZ2VyJiAgICAgIG1NZXJnZXI7CisKKyAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKKyAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICBNdXRleCAgICAgICAgbU11dGV4OworCisgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCisgICAgQ29uZGl0aW9uICAgIG1Db25kOworCisgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgaW50ICAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOworCisgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZmI2ZjE3OS4uZmQ3MzUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMTksNTk1ICsxOSwxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAKLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi0gICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OwotCi0gICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLSAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBjbGFzcyBXcml0ZXI7Ci0gICAgY2xhc3MgUmVhZGVyOwotCi0gICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgICAgICBFVkVOVF9SRVNFUlZFRCwKLSAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAotICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKLSAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKLSAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAotCi0gICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLSAgICB9OwotCi1wcml2YXRlOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0gICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLSAgICAvLyAgICAqIEhBU0ggZW50cnkKLSAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQotICAgIC8vICAgICogZm9ybWF0IGFyZzEKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcyCi0gICAgLy8gICAgKiAuLi4KLSAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKLQotICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotICAgIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLSAgICBzdHJ1Y3QgZW5kaW5nIHsKLSAgICAgICAgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgaXRlcmF0b3IKLSAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOwotCi0gICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OwotICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgotICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCi0gICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7Ci0gICAgfTsKLQotICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKLQotICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci0gICAgc3RydWN0IEVudHJ5IHsKLSAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQotCi0gICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICBpbnQgYXV0aG9yOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0SW50RW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAotICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLSAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0gICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLSAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgotICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKLSAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLSAgICB9OwotCi1wdWJsaWM6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0gICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi0gICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotI2lmIDAKLSAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOwotCi0jaWYgMAotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotI2VuZGlmCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKLSAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLSAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKLQotICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAotICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKLSAgICAgICAgY2hhciAgICptUGlkVGFnOwotICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgotICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKLSAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgflJlYWRlcigpOwotCi0gICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQotICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCi0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKLSAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLQotICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KLSAgICB9OwotCi0gICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgICBjbGFzcyBOYW1lZFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQotICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KLSAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KLQotICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgICAgIHZvaWQgbWVyZ2UoKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCi0gICAgfTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKLSAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCi0gICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCi0gICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLQotICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7Ci0gICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKLSAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAotICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKLSAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCi0gICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgotICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKLQotICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOwotICAgIH07Ci0KLSAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0gICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKLSAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0gICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLSAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7Ci0gICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKLSAgICAgICAgdm9pZCB3YWtldXAoKTsKLQotICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncwotICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgotICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOwotCi0gICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKLQotICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCi0gICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87Ci0KLSAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotICAgIH07Ci0KLX07ICAvLyBjbGFzcyBOQkxvZwotCi0vLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQotc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7Ci0gICAgdGltZXNwZWMgdHM7Ci0gICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmluZGV4IGRkZmU5ZDYuLmQ3YzE2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0xOSwxNCArMTksMTc2IEBACiAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBTdHJpbmc4OworCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCisvLyBUT0RPIG1ha2UgdGhpcyBhIHRlbXBsYXRlZCBjbGFzcyBhbmQgcHV0IGl0IGluIGEgc2VwYXJhdGUgZmlsZS4KKy8vIFRoZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyB3b3VsZCBiZSBiaW4gc2l6ZSBhbmQgbG93IGxpbWl0LgorLyoKKyAqIEhpc3RvZ3JhbSBwcm92aWRlcyBhIHdheSB0byBzdG9yZSBudW1lcmljIGRhdGEgaW4gaGlzdG9ncmFtIGZvcm1hdCBhbmQgcmVhZCBpdCBhcyBhIHNlcmlhbGl6ZWQKKyAqIHN0cmluZy4gVGhlIHRlcm1zICJiaW4iIGFuZCAiYnVja2V0IiBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhpc3RvZ3JhbSB7CitwdWJsaWM6CisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiaW5TaXplOyAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgICAgICBjb25zdCBzaXplX3QgbnVtQmluczsKKyAgICAgICAgY29uc3QgZG91YmxlIGxvdzsgICAgICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgfTsKKworICAgIC8vIEhpc3RvZ3JhbXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZml4ZWQgY29uZmlndXJhdGlvbiBudW1iZXJzLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gYmFzZWQKKyAgICAvLyB0aGUgZGF0YSBpcyBwb3NzaWJsZSBidXQgY29tcGxleCBiZWNhdXNlCisgICAgLy8gLSBkYXRhIHBvaW50cyBhcmUgYWRkZWQgb25lIGJ5IG9uZSwgbm90IHByb2Nlc3NlZCBhcyBhIGJhdGNoLgorICAgIC8vIC0gSGlzdG9ncmFtcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRyaWNreSB0byBhZ2dyZWdhdGUsIGFuZCB0aGV5CisgICAgLy8gICB3aWxsIG5lZWQgdG8gYmUgYWdncmVnYXRlZCBhdCB0aGUgTWVkaWEgTWV0cmljcyBjbG91ZCBzaWRlLgorICAgIC8vIC0gbm90IHByb3ZpZGluZyBsaW1pdHMgdGhlb3JldGljYWxseSBhbGxvd3MgZm9yIGluZmluaXRlIG51bWJlciBvZiBidWNrZXRzLgorCisgICAgLyoqCisgICAgICogXGJyaWVmIENyZWF0ZXMgYSBIaXN0b2dyYW0gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGJpblNpemUgdGhlIHdpZHRoIG9mIGVhY2ggYmluIG9mIHRoZSBoaXN0b2dyYW0sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqIFxwYXJhbSBudW1CaW5zIHRoZSBudW1iZXIgb2YgYmlucyBkZXNpcmVkIGluIHRoZSBoaXN0b2dyYW0gcmFuZ2UsIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogXHBhcmFtIGxvdyAgICAgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBoaXN0b2dyYW0gYnVja2V0IHZhbHVlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB1cHBlciBib3VuZCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgICAgICAgdXBwZXIgPSBsb3dlciArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqLworICAgIEhpc3RvZ3JhbShkb3VibGUgYmluU2l6ZSwgc2l6ZV90IG51bUJpbnMsIGRvdWJsZSBsb3cgPSAwLikKKyAgICAgICAgOiBtQmluU2l6ZShiaW5TaXplKSwgbU51bUJpbnMobnVtQmlucyksIG1Mb3cobG93KSwgbUJpbnMobU51bUJpbnMgKyAyKSB7fQorCisgICAgSGlzdG9ncmFtKGNvbnN0IENvbmZpZyAmYykKKyAgICAgICAgOiBIaXN0b2dyYW0oYy5iaW5TaXplLCBjLm51bUJpbnMsIGMubG93KSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIEFkZCBhIGRhdGEgcG9pbnQgdG8gdGhlIGhpc3RvZ3JhbS4gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50CisgICAgICogICAgICAgIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplIChiZWZvcmUgYWNjb3VudGluZworICAgICAqICAgICAgICBmb3IgdGhlIGxvd2VyIGJvdW5kIG9mZnNldCwgd2hpY2ggbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSkuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50IHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChkb3VibGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlbW92ZXMgYWxsIGRhdGEgcG9pbnRzIGZyb20gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGFkZGVkIHRvIHRoZSBoaXN0b2dyYW0uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbENvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU2VyaWFsaXplcyB0aGUgaGlzdG9ncmFtIGludG8gYSBzdHJpbmcuIFRoZSBmb3JtYXQgaXMgY2hvc2VuIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqICAgICAgICB0aGUgaGlzdG9ncmFtIHJlcHJlc2VudGF0aW9uIHRvIHNlbmQgdG8gdGhlIE1lZGlhIE1ldHJpY3Mgc2VydmljZS4KKyAgICAgKgorICAgICAqICAgICAgICBUaGUgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CisgICAgICogICAgICAgICAgYmluU2l6ZSxudW1CaW5zLGxvdyx7LTF8bG93Q291bnQsLi4uLGJpbkluZGV4fGNvdW50LC4uLixudW1CaW5zfGhpZ2hDb3VudH0KKyAgICAgKgorICAgICAqICAgICAgICAtIGJpbkluZGV4IGlzIGFuIGludGVnZXIgd2l0aCAwIDw9IGJpbkluZGV4IDwgbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSAocm91bmRlZCkgdmFsdWUKKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogYnVja2V0SW5kZXguCisgICAgICogICAgICAgIC0gbG93Q291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGxlc3MgdGhhbiBsb3cuCisgICAgICogICAgICAgIC0gaGlnaENvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBhIGJpbkluZGV4IG1heSBiZSBza2lwcGVkIGlmIGl0cyBjb3VudCBpcyAwLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgaGlzdG9ncmFtIHNlcmlhbGl6ZWQgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIERyYXcgbG9nIHNjYWxlIHNpZGV3YXlzIGhpc3RvZ3JhbSBhcyBBU0NJSSBhcnQgYW5kIHN0b3JlIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgLy8gRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRvdGFsQ291bnQoKSA9PSAwLgorICAgIHN0ZDo6c3RyaW5nIGFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBIaXN0b2dyYW0gdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1ZlcnNpb24gPSAxOworCisgICAgY29uc3QgZG91YmxlIG1CaW5TaXplOyAgICAgICAgICAvLyBTaXplIG9mIGVhY2ggYnVja2V0CisgICAgY29uc3Qgc2l6ZV90IG1OdW1CaW5zOyAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVja2V0cyBpbiByYW5nZSAoZXhjbHVkZXMgbG93IGFuZCBoaWdoKQorICAgIGNvbnN0IGRvdWJsZSBtTG93OyAgICAgICAgICAgICAgLy8gTG93ZXIgYm91bmQgb2YgdmFsdWVzCisKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0dWFsIGhpc3RvZ3JhbS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMgbGVzcyB0aGFuIG1Mb3cKKyAgICAvLyBhcmUgc3RvcmVkIGluIG1CaW5zWzBdLiBCaW4gaW5kZXggaSBjb3JyZXNwb25kcyB0byBtQmluc1tpKzFdLiBDb3VudHMgb2YgYmluIHZhbHVlcworICAgIC8vID49IGhpZ2ggYXJlIHN0b3JlZCBpbiBtQmluc1ttTnVtQmlucyArIDFdLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBtQmluczsKKworICAgIHVpbnQ2NF90IG1Ub3RhbENvdW50ID0gMDsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHZhbHVlcyByZWNvcmRlZAorfTsKKworLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBidXQgUGVyZm9ybWFuY2VBbmFseXNpcworLy8gYWxzbyBkb2VzIHNvbWUgYWRkaXRpb25hbCBhbmFseXppbmcgb2YgZGF0YSwgd2hpbGUgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3QgaXMKKy8vIHRvIGhvbGQgZGF0YS4KK3N0cnVjdCBQZXJmb3JtYW5jZURhdGEgeworICAgIC8vIFRPRE8gdGhlIEhpc3RvZ3JhbTo6Q29uZmlnIG51bWJlcnMgYmVsb3cgYXJlIGZvciBGYXN0TWl4ZXIuCisgICAgLy8gU3BlY2lmeSBkaWZmZXJlbnQgbnVtYmVycyBmb3Igb3RoZXIgdGhyZWFkIHR5cGVzLgorCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIG1VbmRlcnJ1bk5zIGFuZCBtT3ZlcnJ1bk5zIGluIEZhc3RNaXhlci5jcHAgZm9yIGZyYW1lQ291bnQgPSAxOTIKKyAgICAvLyBhbmQgbVNhbXBsZVJhdGUgPSA0ODAwMCwgd2hpY2ggY29ycmVzcG9uZCB0byAyIGFuZCA3IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV29ya0NvbmZpZyA9IHsgMC4yNSwgMjAsIDIufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtMYXRlbmN5Q29uZmlnID0geyAyLiwgMTAsIDEwLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV2FybXVwQ29uZmlnID0geyA1LiwgMTAsIDEwLn07CisKKyAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCB0aHJlYWRJbmZve307CisgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCB0aHJlYWRQYXJhbXN7fTsKKworICAgIC8vIFBlcmZvcm1hbmNlIERhdGEKKyAgICBIaXN0b2dyYW0gd29ya0hpc3R7a1dvcmtDb25maWd9OworICAgIEhpc3RvZ3JhbSBsYXRlbmN5SGlzdHtrTGF0ZW5jeUNvbmZpZ307CisgICAgSGlzdG9ncmFtIHdhcm11cEhpc3R7a1dhcm11cENvbmZpZ307CisgICAgaW50NjRfdCB1bmRlcnJ1bnMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTbmFwc2hvdHNUb1N0b3JlID0gMjU2OworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPE5CTG9nOjpFdmVudCwgaW50NjRfdCAvKnRpbWVzdGFtcCovPj4gc25hcHNob3RzOworICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAwOworICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBuc2Vjc190IHN0YXJ0e3N5c3RlbVRpbWUoKX07CisKKyAgICAvLyBSZXNldCB0aGUgcGVyZm9ybWFuY2UgZGF0YS4gVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSB0aHJlYWQgc3RhdGUgY2hhbmdlLgorICAgIC8vIFRocmVhZCBpbmZvIGlzIG5vdCByZXNldCBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMgbWVhbnQgdG8gYmUgYSBjb250aW51YXRpb24gb2YgdGhlIHRocmVhZAorICAgIC8vIHRoYXQgc3RydWN0IFBlcmZvcm1hbmNlRGF0YSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd29ya0hpc3QuY2xlYXIoKTsKKyAgICAgICAgbGF0ZW5jeUhpc3QuY2xlYXIoKTsKKyAgICAgICAgd2FybXVwSGlzdC5jbGVhcigpOworICAgICAgICB1bmRlcnJ1bnMgPSAwOworICAgICAgICBvdmVycnVucyA9IDA7CisgICAgICAgIGFjdGl2ZSA9IDA7CisgICAgICAgIHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHBlcmZvcm1hbmNlIGRhdGEgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3b3JrSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiBsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPT0gMAorICAgICAgICAgICAgICAgICYmIHdhcm11cEhpc3QudG90YWxDb3VudCgpID09IDAgJiYgdW5kZXJydW5zID09IDAgJiYgb3ZlcnJ1bnMgPT0gMAorICAgICAgICAgICAgICAgICYmIGFjdGl2ZSA9PSAwOworICAgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXM7CiAKIC8vIGEgbWFwIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMgaW5zdGFuY2VzCkBAIC04MCw3ICsyNDIsNyBAQAogICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CiAKICAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+IG1IaXN0czsKIAogICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycwogICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgewpAQCAtMTE5LDggKzI4MSw3IEBACiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKIHZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFJlYWRlciBBUEkKKworY2xhc3MgU25hcHNob3Q7ICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG5lZWRlZCBmb3IgUmVhZGVyOjpnZXRTbmFwc2hvdCgpCisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICB+UmVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KGJvb2wgZmx1c2ggPSB0cnVlKTsKKyAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworcHJpdmF0ZToKKyAgICAvLyBBbW91bnQgb2YgdHJpZXMgZm9yIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoIHdyaXRlciBpbiBnZXRTbmFwc2hvdCgpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPYnRhaW5UcmllcyA9IDM7CisKKyAgICAvLyBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGFsaWduIHRoZSBTbmFwc2hvdDo6YmVnaW4oKSBhbmQKKyAgICAvLyBTbmFwc2hvdDo6ZW5kKCkgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkQmVnaW5UeXBlczsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkRW5kVHlwZXM7CisKKyAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgICAgICAgICAgICAvLyBuYW1lIG9mIHJlYWRlciAoYWN0dWFsbHkgbmFtZSBvZiB3cml0ZXIpCisgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgdmFsaWQgZW50cnkgaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKTsKK307CisKKy8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAorY2xhc3MgU25hcHNob3QgeworcHVibGljOgorICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KKworICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgIHNpemVfdCBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorCitwcml2YXRlOgorICAgIFNuYXBzaG90KCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorICAgIGZyaWVuZCBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCk7CisKKyAgICB1aW50OF90ICogY29uc3QgICAgICAgbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdCA9IDA7CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1CZWdpbjsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUVuZDsKK307CisKKy8vIFRPRE8gbW92ZSB0aGlzIHRvIE1lZGlhTG9nU2VydmljZT8KK2NsYXNzIER1bXBSZWFkZXIgOiBwdWJsaWMgTkJMb2c6OlJlYWRlciB7CitwdWJsaWM6CisgICAgRHVtcFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSB7fQorICAgIER1bXBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoaU1lbW9yeSwgc2l6ZSwgbmFtZSkge30KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIGZtdEVudHJ5IF9fdW51c2VkLCBTdHJpbmc4KiBib2R5IF9fdW51c2VkKSB7fQorICAgIEVudHJ5SXRlcmF0b3IgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KTsKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworCisgICAgLy8gVGhlIGJ1ZmZlckR1bXAgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCmluZGV4IGVjMDg0MmYuLjY0YTU3MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTIyLDE5ICsyMiwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi1jbGFzcyBTdHJpbmc4OwotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhOworCisvLyBEdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGluIGEgSlNPTiBmb3JtYXQuCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy9EdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGFzIHZpc3VhbGl6ZWQgcGxvdHMuCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIER1bXBzIHNuYXBzaG90cyBhdCBpbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBwYXN0Lgordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBTZW5kIG9uZSB0aHJlYWQncyBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGlmIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGlzIG5vbnRyaXZpYWwgKGkuZS4gbm90CisvLyBhbGwgemVybyB2YWx1ZXMpLiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIHdhcyBzZW50LCBmYWxzZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlCisvLyBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nLgorYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOwogY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CiAKIGNvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKIAogLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Ci11c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47Cit1c2luZyBIaXN0ID0gc3RkOjptYXA8aW50LCBpbnQ+OwogCiB1c2luZyBtc0ludGVydmFsID0gZG91YmxlOwogdXNpbmcgamlmZnlJbnRlcnZhbCA9IGRvdWJsZTsKQEAgLTU3LDEzICs3MSwxMiBAQAogfQogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIHBlYWtzIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHRvIGEgZmlsZS4KLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvX2luZGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5Lgorc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8ge30KKyAgICB+U2hhcmVkKCkge30KKworICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5CisgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKK307CisKKy8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KK2NsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorI2lmIDAKKyAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKKyNlbmRpZgorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKKworI2lmIDAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOworCisgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyNlbmRpZgorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworCituYW1lc3BhY2UgTkJMb2cgeworCitjbGFzcyBFbnRyeTsKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFdyaXRlciBJbnRlcmZhY2UKKworLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKy8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFdyaXRlcigpID0gZGVmYXVsdDsgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgIC8vIExvZyBkYXRhIHJlbGF0ZWQgdG8gRXZlbnQgRS4gU2VlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgZm9yIHRoZSB0eXBlIG9mIGRhdGEKKyAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWUgYSBtYXBwaW5nIHN0YXRlbWVudDoKKyAgICAvLyAgICAgTUFQX1RZUEVfVE9fRVZFTlQoRSwgVCk7CisgICAgLy8gdGhlbiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmU6CisgICAgLy8gICAgIFQgZGF0YSA9IGRvQ29tcHV0YXRpb24oKTsKKyAgICAvLyAgICAgdGxOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFPihkYXRhKTsKKyAgICB0ZW1wbGF0ZTxFdmVudCBFPgorICAgIHZvaWQgICAgbG9nKHR5cGVuYW1lIGdldF9tYXBwZWQ8RT46OnR5cGUgZGF0YSkgeworICAgICAgICBsb2coRSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgZW5hYmxlKCkgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KKyAgICBib29sICAgICAgICAgICAgZGlzYWJsZSgpIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1JTWVtb3J5OyB9CisKKyAgICAvLyBQdWJsaWMgbG9nZ2luZyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsd2F5cyB1c2Ugb25lIG9mIHRoZQorICAgIC8vIHR3byBsb2coKSBmdW5jdGlvbiBjYWxscyBiZWxvdyB0byB3cml0ZSB0byBzaGFyZWQgbWVtb3J5LgorcHJvdGVjdGVkOgorICAgIC8vIFdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTyBpZiB0aGUgd3JpdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYW5kIHZpcnR1YWwgYmVjYXVzZSBMb2NrZWRXcml0ZXIgdXNlcyBhIGxvY2sgdG8gcHJvdGVjdAorICAgIC8vIHdyaXRpbmcgdG8gdGhlIEZJRk8gYmVmb3JlIHdyaXRpbmcgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAvLyBMb2cgYSBzaW5nbGUgRW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGV2ZW50LCBkYXRhLCBhbmQgbGVuZ3RoLgorICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcgcGFydHMgb2YgYSBmb3JtYXR0ZWQgZW50cnkKKyAgICB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOworCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWR7fTsgICAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCAyZWE1ZmNkLi5lMTczOTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTg1LDcgKzg1LDcgQEAKICAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ291bnQpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1DaGFubmVsQ291bnQgPj0gMSAmJiBtQ2hhbm5lbENvdW50IDw9IDIpOworICAgIENIRUNLKG1DaGFubmVsQ291bnQgPj0gMSAmJiBtQ2hhbm5lbENvdW50IDw9IDcpOwogCiAgICAgLy8gT3B0aW9uYWxseSwgd2Ugd2FudCB0byBjaGVjayB3aGV0aGVyIEFBQ1Byb2ZpbGUgaXMgYWxzbyBzZXQuCiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDUHJvZmlsZSwgJm1BQUNQcm9maWxlKSkgewpAQCAtMTU0LDExICsxNTQsMTEgQEAKICAgICBtRG9uZSA9IHRydWU7CiAKICAgICB2b2lkICpkdW1teTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKICAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CiAgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA3ZjM5ZDEwLi4zZDY3YzkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KQEAgLTE3MSwxMSArMTcyLDcgQEAKIH0KIAogc3RydWN0IENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7Ci0gICAgQ29kZWNPYnNlcnZlcigpIHt9Ci0KLSAgICB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICAgICAgbU5vdGlmeSA9IG1zZzsKLSAgICB9CisgICAgZXhwbGljaXQgQ29kZWNPYnNlcnZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgOiBtTm90aWZ5KG1zZykge30KIAogICAgIC8vIGZyb20gSU9NWE9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKQEAgLTI1MSw3ICsyNDgsNyBAQAogICAgIHZpcnR1YWwgfkNvZGVjT2JzZXJ2ZXIoKSB7fQogCiBwcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWNPYnNlcnZlcik7CiB9OwpAQCAtNTY2LDE2ICs1NjMsMTYgQEAKICAgICAgIG1EZXF1ZXVlQ291bnRlcigwKSwKICAgICAgIG1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCgwKSwKICAgICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycygwKSwKLSAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMoLTFsbCksCi0gICAgICBtTWF4UHRzR2FwVXMoMGxsKSwKKyAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMoLTFMTCksCisgICAgICBtTWF4UHRzR2FwVXMoMExMKSwKICAgICAgIG1NYXhGcHMoLTEpLAogICAgICAgbUZwcygtMS4wKSwKICAgICAgIG1DYXB0dXJlRnBzKC0xLjApLAogICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZChmYWxzZSksCi0gICAgICBtTGF0ZW5jeSgwKSwKICAgICAgIG1UdW5uZWxlZChmYWxzZSksCiAgICAgICBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCgoT01YX0lOREVYVFlQRSkwKSwKICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCgoT01YX0lOREVYVFlQRSkwKSwKKyAgICAgIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCgoT01YX0lOREVYVFlQRSkwKSwKICAgICAgIG1TdGF0ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmVuZG9yRXh0ZW5zaW9uc1N0YXR1cyhrRXh0ZW5zaW9uc1VuY2hlY2tlZCkgewogICAgIG1lbXNldCgmbUxhc3RIRFJTdGF0aWNJbmZvLCAwLCBzaXplb2YobUxhc3RIRFJTdGF0aWNJbmZvKSk7CkBAIC03ODMsNiArNzgwLDkgQEAKICAgICAvLyBuZWVkIHRvIGVuYWJsZSBhbGxvY2F0aW9uIHdoZW4gYXR0YWNoaW5nCiAgICAgc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLT5hbGxvd0FsbG9jYXRpb24odHJ1ZSk7CiAKKyAgICAvLyBkZXF1ZXVlQnVmZmVyIGNhbm5vdCB0aW1lIG91dAorICAgIHN1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KC0xKTsKKwogICAgIC8vIGZvciBtZXRhIGRhdGEgbW9kZSwgd2UgbW92ZSBkZXF1ZXVkIGJ1ZmZlcnMgdG8gdGhlIG5ldyBzdXJmYWNlLgogICAgIC8vIGZvciBub24tbWV0YSBtb2RlLCB3ZSBtdXN0IG1vdmUgYWxsIHJlZ2lzdGVyZWQgYnVmZmVycwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy5zaXplKCk7ICsraSkgewpAQCAtMTEzOCw2ICsxMTM4LDggQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG1OYXRpdmVXaW5kb3cuZ2V0KCkpLT5zZXREZXF1ZXVlVGltZW91dCgtMSk7CisKICAgICAvLyBFeGl0cyBoZXJlIGZvciB0dW5uZWxlZCB2aWRlbyBwbGF5YmFjayBjb2RlY3MgLS0gaS5lLiBza2lwcyBuYXRpdmUgd2luZG93CiAgICAgLy8gYnVmZmVyIGFsbG9jYXRpb24gc3RlcCBhcyB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIHR1bm5lbGVkIE9NWCBvbXBvbmVudAogICAgIC8vIGl0c2VsZiBhbmQgZXhwbGljaXRseSBzZXRzIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgdG8gMC4KQEAgLTEyNDcsNiArMTI0OSw3IEBACiAgICAgICAgIGluZm8ubVJlbmRlckluZm8gPSBOVUxMOwogICAgICAgICBpbmZvLm1HcmFwaGljQnVmZmVyID0gZ3JhcGhpY0J1ZmZlcjsKICAgICAgICAgaW5mby5tTmV3R3JhcGhpY0J1ZmZlciA9IGZhbHNlOworICAgICAgICBpbmZvLm1EZXF1ZXVlZEF0ID0gbURlcXVldWVDb3VudGVyOwogCiAgICAgICAgIC8vIFRPRE86IFdlIHNob3Vsbid0IG5lZWQgdG8gY3JlYXRlIE1lZGlhQ29kZWNCdWZmZXIuIEluIG1ldGFkYXRhIG1vZGUKICAgICAgICAgLy8gICAgICAgT01YIGRvZXNuJ3QgdXNlIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciwgYnV0IHNvbWUgY29kZSBzdGlsbApAQCAtMTYxOSw3ICsxNjIyLDcgQEAKICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAodm9pZCljYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOgogICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmZyZWVCdWZmZXIocG9ydEluZGV4LCBpbmZvLT5tQnVmZmVySUQpOwpAQCAtMTc0OCwzNCArMTc1MSwzNyBAQAogICAgIH0KIAogICAgIGludDMyX3Qgc3RvcmVNZXRhOwotICAgIGlmIChlbmNvZGVyCi0gICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQotICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7Ci0gICAgICAgIElPTVg6OlBvcnRNb2RlIG1vZGU7Ci0gICAgICAgIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKLSAgICAgICAgICAgICAgICBzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY05hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBtb2RlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKLSAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKLSAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcikgeworICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgICAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IHByZXBlbmRTUFNQUFMgPSAwOwotICAgIGlmIChlbmNvZGVyCisgICAgaWYgKGVuY29kZXIgJiYgbUlzVmlkZW8KICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsICZwcmVwZW5kU1BTUFBTKQogICAgICAgICAgICAgJiYgcHJlcGVuZFNQU1BQUyAhPSAwKSB7CiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CkBAIC0xODE2LDI1ICsxODIyLDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7Ci0gICAgICAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzID0gLTFsbDsKKyAgICAgICAgICAgICAgICBLRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLCAmbVJlcGVhdEZyYW1lRGVsYXlVcykpIHsKKyAgICAgICAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMgPSAtMUxMOwogICAgICAgICB9CiAKICAgICAgICAgLy8gb25seSBhbGxvdyAzMi1iaXQgdmFsdWUsIHNpbmNlIHdlIHBhc3MgaXQgYXMgVTMyIHRvIE9NWC4KLSAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsICZtTWF4UHRzR2FwVXMpKSB7Ci0gICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwbGw7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVIsICZtTWF4UHRzR2FwVXMpKSB7CisgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwTEw7CiAgICAgICAgIH0gZWxzZSBpZiAobU1heFB0c0dhcFVzID4gSU5UMzJfTUFYIHx8IG1NYXhQdHNHYXBVcyA8IElOVDMyX01JTikgewogICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHZhbHVlIGZvciBtYXggcHRzIGdhcCAlbGxkIiwgKGxvbmcgbG9uZykgbU1heFB0c0dhcFVzKTsKLSAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IDBsbDsKKyAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IDBMTDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbXNnLT5maW5kRmxvYXQoIm1heC1mcHMtdG8tZW5jb2RlciIsICZtTWF4RnBzKSkgeworICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KEtFWV9NQVhfRlBTX1RPX0VOQ09ERVIsICZtTWF4RnBzKSkgewogICAgICAgICAgICAgbU1heEZwcyA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbm90aWZ5IEdyYXBoaWNCdWZmZXJTb3VyY2UgdG8gYWxsb3cgYmFja3dhcmQgZnJhbWVzCi0gICAgICAgIGlmIChtTWF4UHRzR2FwVXMgPCAwbGwpIHsKKyAgICAgICAgaWYgKG1NYXhQdHNHYXBVcyA8IDBMTCkgewogICAgICAgICAgICAgbU1heEZwcyA9IC0xOwogICAgICAgICB9CiAKQEAgLTE4NDMsOCArMTg0OCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgeworICAgICAgICAgICAgICAgIEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgewogICAgICAgICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjA4OCw3ICsyMDkzLDggQEAKICAgICAgICAgaWYgKHVzaW5nU3dSZW5kZXJlcikgewogICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigidXNpbmctc3ctcmVuZGVyZXIiLCAxKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpIHx8CisgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCiAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgewpAQCAtMjE3OSw3ICsyMTg1LDggQEAKICAgICAgICAgICAgIGVyciA9IHNldHVwRzcxMUNvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDAsIHNhbXBsZVJhdGUgPSAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CisgICAgICAgIC8vIG51bUNoYW5uZWxzIG5lZWRzIHRvIGJlIHNldCB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSBQQ00gdmFsdWVzLgorICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMiwgc2FtcGxlUmF0ZSA9IDQ0MTAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CiAgICAgICAgIGlmIChlbmNvZGVyICYmCiAgICAgICAgICAgICAgICAgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpKSB7CkBAIC0yMjA1LDcgKzIyMTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IHNldHVwRmxhY0NvZGVjKAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsLCBwY21FbmNvZGluZyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTIyMzQsNiArMjI0MSwxNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gc2V0dXBFQUMzQ29kZWMoZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOwogICAgICAgICB9CisgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KSkgeworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCisgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cEFDNENvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIzMDcsMTIgKzIzMjMsMTYgQEAKICAgICAgICAgICAgICh2b2lkKW1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgbUNvbnZlcnRlcltrUG9ydEluZGV4SW5wdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShwY21FbmNvZGluZywgY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltrUG9ydEluZGV4SW5wdXRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IGVuY29kZXIgJXMgaW5wdXQgZm9ybWF0IHBjbSBlbmNvZGluZyBjb252ZXJ0ZXIgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcGNtRW5jb2RpbmcsIGNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICh2b2lkKW1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKGNvZGVjUGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IGRlY29kZXIgJXMgb3V0cHV0IGZvcm1hdCBwY20gZW5jb2RpbmcgY29udmVydGVyIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGNvZGVjUGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzQ1LDYgKzIzNjUsMTcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKSB7CisgICAgT01YX0FVRElPX0NPTkZJR19BTkRST0lEX0FVRElPUFJFU0VOVEFUSU9OIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5uUHJlc2VudGF0aW9uSWQgPSAoT01YX1MzMilwcmVzZW50YXRpb25JZDsKKyAgICBjb25maWcublByb2dyYW1JZCA9IChPTVhfUzMyKXByb2dyYW1JZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQXVkaW9QcmVzZW50YXRpb24sCisgICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KSB7CiAgICAgaWYgKHByaW9yaXR5IDwgMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjU1MSw2ICsyNTgyLDggQEAKICAgICAgICAgbGF5ZXJQYXJhbXMublBMYXllckNvdW50QWN0dWFsID0gbnVtTGF5ZXJzIC0gbnVtQkxheWVyczsKICAgICAgICAgbGF5ZXJQYXJhbXMubkJMYXllckNvdW50QWN0dWFsID0gbnVtQkxheWVyczsKICAgICAgICAgbGF5ZXJQYXJhbXMuYkJpdHJhdGVSYXRpb3NTcGVjaWZpZWQgPSBPTVhfRkFMU0U7CisgICAgICAgIGxheWVyUGFyYW1zLm5MYXllckNvdW50TWF4ID0gbnVtTGF5ZXJzOworICAgICAgICBsYXllclBhcmFtcy5uQkxheWVyQ291bnRNYXggPSBudW1CTGF5ZXJzOwogCiAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nLApAQCAtMjg5MCw2ICsyOTIzLDM4IEBACiAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsICZkZWYsIHNpemVvZihkZWYpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDNENvZGVjKAorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwUmF3QXVkaW9Gb3JtYXQoCisgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIEFMT0dXKCJBQzQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBkZWYubkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisgICAgZGVmLm5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAgIHJldHVybiBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKK30KKwogc3RhdGljIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgcGlja01vZGVGcm9tQml0UmF0ZSgKICAgICAgICAgYm9vbCBpc0FNUldCLCBpbnQzMl90IGJwcykgewogICAgIGlmIChpc0FNUldCKSB7CkBAIC0yOTczLDggKzMwMzgsOCBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRmxhY0NvZGVjKAotICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKSB7Ci0KKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgQXVkaW9FbmNvZGluZyBlbmNvZGluZykgewogICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBkZWY7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CkBAIC0yOTk3LDcgKzMwNjIsOCBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsCiAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBlbmNvZGluZyk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBSYXdBdWRpb0Zvcm1hdCgKQEAgLTMwNTUsNiArMzEyMSw3IEBACiAgICAgcGNtUGFyYW1zLmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAKICAgICBpZiAoZ2V0T01YQ2hhbm5lbE1hcHBpbmcobnVtQ2hhbm5lbHMsIHBjbVBhcmFtcy5lQ2hhbm5lbE1hcHBpbmcpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5jb3JyZWN0IG51bUNoYW5uZWxzOiAlZCIsIF9fZnVuY19fLCBudW1DaGFubmVscyk7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIApAQCAtMzcxMCw4ICszNzc3LDE3IEBACiAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSU3RhdGljSW5mbyIsICZtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4ID0gKE9NWF9JTkRFWFRZUEUpMDsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1PTVhOb2RlLT5nZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIsICZtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID0gKE9NWF9JTkRFWFRZUEUpMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcykgewpAQCAtNDIyNSwyNCArNDMwMSwyNyBAQAogICAgIGludCBtYXhEaW1lbnNpb24gPSBtYXgod2lkdGgsIGhlaWdodCk7CiAKICAgICBzdGF0aWMgY29uc3QgaW50IGxpbWl0c1tdWzVdID0gewotICAgICAgICAvKiAgIE1CcHMgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLwotICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKLSAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgICAgIHsgICAgMzAwMCwgICAzOTYsICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAotICAgICAgICB7ICAgIDYwMDAsICAgMzk2LCAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKLSAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAotICAgICAgICB7ICAgMTk4MDAsICAgNzkyLCAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKLSAgICAgICAgeyAgIDIwMjUwLCAgMTYyMCwgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgICAgIHsgICA0MDUwMCwgIDE2MjAsIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAotICAgICAgICB7ICAxMDgwMDAsICAzNjAwLCAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKLSAgICAgICAgeyAgMjE2MDAwLCAgNTEyMCwgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAotICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLSAgICAgICAgeyAgNTIyMjQwLCAgODcwNCwgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCi0gICAgICAgIHsgIDU4OTgyNCwgMjIwODAsIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAotICAgICAgICB7ICA5ODMwNDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKLSAgICAgICAgeyAyMDczNjAwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIC8qICAgIE1CcHMgICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KKyAgICAgICAgeyAgICAgMTQ4NSwgICAgIDk5LCAgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgICAgIHsgICAgIDE0ODUsICAgICA5OSwgICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgICAgICB7ICAgICAzMDAwLCAgICAzOTYsICAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICAgICAgeyAgICAgNjAwMCwgICAgMzk2LCAgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgICAgIHsgICAgMTE4ODAsICAgIDM5NiwgICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgICAgICB7ICAgIDExODgwLCAgICAzOTYsICAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAgICAxOTgwMCwgICAgNzkyLCAgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgICAgIHsgICAgMjAyNTAsICAgMTYyMCwgIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgICAgICB7ICAgIDQwNTAwLCAgIDE2MjAsICAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAgIDEwODAwMCwgICAzNjAwLCAgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgICAgIHsgICAyMTYwMDAsICAgNTEyMCwgIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgICAgICB7ICAgMjQ1NzYwLCAgIDgxOTIsICAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICAgICAgeyAgIDI0NTc2MCwgICA4MTkyLCAgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgICAgIHsgICA1MjIyNDAsICAgODcwNCwgIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgICAgICB7ICAgNTg5ODI0LCAgMjIwODAsICA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICAgICAgeyAgIDk4MzA0MCwgIDM2ODY0LCAgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgICAgIHsgIDIwNzM2MDAsICAzNjg2NCwgIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICB7ICA0MTc3OTIwLCAxMzkyNjQsIDEwNTUsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNiAgfSwKKyAgICAgICAgeyAgODM1NTg0MCwgMTM5MjY0LCAxMDU1LCA0ODAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgMTY3MTE2ODAsIDEzOTI2NCwgMTA1NSwgODAwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2MiB9LAogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUobGltaXRzKTsgaSsrKSB7CkBAIC00MzUyLDEyICs0NDMxLDEzIEBACiAgICAgICAgICAgICBoMjY0dHlwZS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpIHsKICAgICAgICAgaDI2NHR5cGUublNsaWNlSGVhZGVyU3BhY2luZyA9IDA7CiAgICAgICAgIGgyNjR0eXBlLmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOwotICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMjsKLSAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSBtTGF0ZW5jeSA9PSAwID8gMSA6IHN0ZDo6bWluKDFVLCBtTGF0ZW5jeSAtIDEpOwotCi0gICAgICAgIC8vIGRpc2FibGUgQi1mcmFtZXMgdW50aWwgTVBFRzRXcml0ZXIgY2FuIGd1YXJhbnRlZSBmaW5hbGl6aW5nIGZpbGVzIHdpdGggQi1mcmFtZXMKLSAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDE7Ci0gICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gMDsKKyAgICAgICAgaW50MzJfdCBtYXhCZnJhbWVzID0gMDsKKyAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX01BWF9CX0ZSQU1FUywgJm1heEJmcmFtZXMpOworICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IHVpbnQzMl90KG1heEJmcmFtZXMpOworICAgICAgICBpZiAobUxhdGVuY3kgJiYgaDI2NHR5cGUubkJGcmFtZXMgPiAqbUxhdGVuY3kpIHsKKyAgICAgICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gKm1MYXRlbmN5OworICAgICAgICB9CisgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSBoMjY0dHlwZS5uQkZyYW1lcyA9PSAwID8gMSA6IDI7CiAKICAgICAgICAgaDI2NHR5cGUublBGcmFtZXMgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlLCBoMjY0dHlwZS5uQkZyYW1lcyk7CiAgICAgICAgIGgyNjR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0KQEAgLTUwMTksNiArNTA5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNldCB1cCBtaW1lLgorICAgICAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNTEyMyw2ICs1MjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYml0cmF0ZSIsIHBhcmFtcy5uQml0UmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNTI0MSw2ICs1MzIzLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRBQzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFIHBhcmFtczsKQEAgLTUzMjEsNiArNTQyMiw3MCBAQAogICAgIHJldHVybiBnZXRWZW5kb3JQYXJhbWV0ZXJzKHBvcnRJbmRleCwgbm90aWZ5KTsKIH0KIAorRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBBQ29kZWM6OmdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldEhEUjEwUGx1c0luZm86IGRvZXMgbm90IHN1cHBvcnQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgLSAxICsKKyAgICAgICAgICAgICgocGFyYW1TaXplVXNlZCA+IDApID8gcGFyYW1TaXplVXNlZCA6IDUxMik7CisgICAgaWYgKG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8IG5ld1NpemUgPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3U2l6ZSk7CisgICAgfQorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0KKyAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKiltSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+ZGF0YSgpOworICAgIEluaXRPTVhQYXJhbXMoY29uZmlnKTsKKyAgICBjb25maWctPm5TaXplID0gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKTsKKyAgICBjb25maWctPm5Qb3J0SW5kZXggPSAxOworICAgIHNpemVfdCBwYXJhbVNpemUgPSBjb25maWctPm5TaXplIC0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyAxOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZSA9IHBhcmFtU2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemVVc2VkID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplICE9IHBhcmFtU2l6ZSkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIGFsdGVycyBuUGFyYW1TaXplOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZSwgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChwYXJhbVNpemVVc2VkID4gMCAmJiBjb25maWctPm5QYXJhbVNpemVVc2VkICE9IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyByZXR1cm5zIHdyb25nIG5QYXJhbVNpemVVc2VkOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQsIHBhcmFtU2l6ZVVzZWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwordm9pZCBBQ29kZWM6Om9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDAKKyAgICAgICAgICAgIHx8IGNvbmZpZ0luZGV4ICE9IG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCkgeworICAgICAgICAvLyBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggaXMgdGhlIG9ubHkgdXBkYXRlIHdlIHJlY29nbml6ZSBub3cKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbygpOworICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemVVc2VkID4gY29uZmlnLT5uUGFyYW1TaXplKSB7CisgICAgICAgIC8vIHRyeSBhZ2FpbiB3aXRoIHRoZSBzaXplIHNwZWNpZmllZAorICAgICAgICBjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBhbiBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgZXZlbnQKKyAgICBtT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsCisgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY29uZmlnLT5uVmFsdWUsIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpKTsKK30KKwogdm9pZCBBQ29kZWM6Om9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cykgewogICAgIC8vIGFzcGVjdHMgYXJlIG5vcm1hbGx5IGNvbW11bmljYXRlZCBpbiBDb2xvckFzcGVjdHMKICAgICBpbnQzMl90IHJhbmdlLCBzdGFuZGFyZCwgdHJhbnNmZXI7CkBAIC01MzgzLDcgKzU1NDgsNyBAQAogICAgICAgICBBdWRpb0VuY29kaW5nIHBjbUVuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKICAgICAgICAgKHZvaWQpbUNvbmZpZ0Zvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJnBjbUVuY29kaW5nKTsKICAgICAgICAgQXVkaW9FbmNvZGluZyBjb2RlY1BjbUVuY29kaW5nID0ga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDsKLSAgICAgICAgKHZvaWQpbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJnBjbUVuY29kaW5nKTsKKyAgICAgICAgKHZvaWQpbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogCiAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKGNvZGVjUGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gIT0gTlVMTCkgewpAQCAtNTU1Niw2ICs1NzIxLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6IHsKKyAgICAgICAgICAgIEFMT0dWKCJOby1vcCBieSBkZWZhdWx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjI1Niw2ICs2NDI2LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAoYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDAKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgIG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIgPSBoZHIxMFBsdXNJbmZvOworICAgICAgICB9CisKICAgICAgICAgLy8gc2F2ZSBidWZmZXJzIHNlbnQgdG8gdGhlIHN1cmZhY2Ugc28gd2UgY2FuIGdldCByZW5kZXIgdGltZSB3aGVuIHRoZXkgcmV0dXJuCiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKQEAgLTYzNjQsOCArNjU0MywxMCBAQAogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Db2RlYy0+bU9NWE5vZGUgIT0gTlVMTCkgewotICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgICAgICAgICAgdE9teE5vZGUtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICAgICAgICAgIGlmICh0T214Tm9kZSkgeworICAgICAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KQEAgLTY0NTIsNyArNjYzMyw4IEBACiAKICAgICBDSEVDSyhtQ29kZWMtPm1PTVhOb2RlID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYyk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2VMaXN0LCBtQ29kZWMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbiArIDEpOwogCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOwpAQCAtNjQ2Nyw3ICs2NjQ5LDcgQEAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7CiAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKTsKIAotICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CisgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcihub3RpZnkpOwogICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIApAQCAtNjQ5MiwxNSArNjY3NCwxMyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwotICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICBpZiAoIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKKyAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYykpOworICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CisgICAgaWYgKHRPbXhOb2RlICYmICF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24pOwotICAgIG9ic2VydmVyLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeSk7CisgICAgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbjsKIAogICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwogICAgIG1Db2RlYy0+bVJlbmRlclRyYWNrZXIuc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsKQEAgLTY1MzYsNyArNjcxNiw3IEBACiAKICAgICBtQ29kZWMtPm1EZXF1ZXVlQ291bnRlciA9IDA7CiAgICAgbUNvZGVjLT5tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwotICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7CisgICAgbUNvZGVjLT5tUmVwZWF0RnJhbWVEZWxheVVzID0gLTFMTDsKICAgICBtQ29kZWMtPm1JbnB1dEZvcm1hdC5jbGVhcigpOwogICAgIG1Db2RlYy0+bU91dHB1dEZvcm1hdC5jbGVhcigpOwogICAgIG1Db2RlYy0+bUJhc2VPdXRwdXRGb3JtYXQuY2xlYXIoKTsKQEAgLTY2NzgsNyArNjg1OCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaWYgKG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA+IDBsbCkgeworICAgIGlmIChtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPiAwTEwpIHsKICAgICAgICAgZXJyID0gc3RhdHVzRnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1HcmFwaGljQnVmZmVyU291cmNlLT5zZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcykpOwpAQCAtNjY5MSw3ICs2ODcxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtQ29kZWMtPm1NYXhQdHNHYXBVcyAhPSAwbGwpIHsKKyAgICBpZiAobUNvZGVjLT5tTWF4UHRzR2FwVXMgIT0gMExMKSB7CiAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFIG1heFB0c0dhcFBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmbWF4UHRzR2FwUGFyYW1zKTsKICAgICAgICAgbWF4UHRzR2FwUGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CkBAIC03MjU4LDcgKzc0MzgsNyBAQAogICAgIH0KIAogICAgIGludDY0X3QgdGltZU9mZnNldFVzOwotICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCAmdGltZU9mZnNldFVzKSkgeworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmdGltZU9mZnNldFVzKSkgewogICAgICAgICBpZiAobUdyYXBoaWNCdWZmZXJTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlslc10gSW52YWxpZCB0byBzZXQgaW5wdXQgYnVmZmVyIHRpbWUgb2Zmc2V0IHdpdGhvdXQgc3VyZmFjZSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtNzI5NCw3ICs3NDc0LDcgQEAKICAgICB9CiAKICAgICBpbnQzMl90IGRyb3BJbnB1dEZyYW1lczsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgJmRyb3BJbnB1dEZyYW1lcykpIHsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCAmZHJvcElucHV0RnJhbWVzKSkgewogICAgICAgICBpZiAobUdyYXBoaWNCdWZmZXJTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlslc10gSW52YWxpZCB0byBzZXQgc3VzcGVuZCB3aXRob3V0IHN1cmZhY2UiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKQEAgLTczMDIsNyArNzQ4Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IHN1c3BlbmRTdGFydFRpbWVVcyA9IC0xOwotICAgICAgICAodm9pZCkgcGFyYW1zLT5maW5kSW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsICZzdXNwZW5kU3RhcnRUaW1lVXMpOworICAgICAgICAodm9pZCkgcGFyYW1zLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsICZzdXNwZW5kU3RhcnRUaW1lVXMpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0dXNGcm9tQmluZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgIG1HcmFwaGljQnVmZmVyU291cmNlLT5zZXRTdXNwZW5kKGRyb3BJbnB1dEZyYW1lcyAhPSAwLCBzdXNwZW5kU3RhcnRUaW1lVXMpKTsKIApAQCAtNzM4MiwxMiArNzU2Miw1NyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50MzJfdCBwcmVzZW50YXRpb25JZCA9IC0xOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCIsICZwcmVzZW50YXRpb25JZCkpIHsKKyAgICAgICAgaW50MzJfdCBwcm9ncmFtSWQgPSAtMTsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIiwgJnByb2dyYW1JZCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvUHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBmYWlsZWQgc2V0QXVkaW9QcmVzZW50YXRpb24uIEZhaWx1cmUgaXMgZmluZSBzaW5jZSB0aGlzIGtleSBpcyBvcHRpb25hbCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgKHZvaWQpc2V0SGRyMTBQbHVzSW5mbyhoZHIxMFBsdXNJbmZvKTsKKyAgICB9CisKICAgICAvLyBJZ25vcmUgZXJyb3JzIGFzIGZhaWx1cmUgaXMgZXhwZWN0ZWQgZm9yIGNvZGVjcyB0aGF0IGFyZW4ndCB2aWRlbyBlbmNvZGVycy4KICAgICAodm9pZCljb25maWd1cmVUZW1wb3JhbExheWVycyhwYXJhbXMsIGZhbHNlIC8qIGluQ29uZmlndXJlICovLCBtT3V0cHV0Rm9ybWF0KTsKIAogICAgIHJldHVybiBzZXRWZW5kb3JQYXJhbWV0ZXJzKHBhcmFtcyk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbykgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMCkgeworICAgICAgICBBTE9HRSgic2V0SGRyMTBQbHVzSW5mbzogZG9lcyBub3Qgc3VwcG9ydCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBzaXplX3QgbmV3U2l6ZSA9IHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpICsgaGRyMTBQbHVzSW5mby0+c2l6ZSgpIC0gMTsKKyAgICBpZiAobUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgbmV3U2l6ZSA+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdTaXplKTsKKyAgICB9CisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPQorICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKW1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5kYXRhKCk7CisgICAgSW5pdE9NWFBhcmFtcyhjb25maWcpOworICAgIGNvbmZpZy0+blBvcnRJbmRleCA9IDA7CisgICAgY29uZmlnLT5uU2l6ZSA9IG5ld1NpemU7CisgICAgY29uZmlnLT5uUGFyYW1TaXplID0gaGRyMTBQbHVzSW5mby0+c2l6ZSgpOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgbWVtY3B5KGNvbmZpZy0+blZhbHVlLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCksIGhkcjEwUGx1c0luZm8tPnNpemUoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKW1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgIGNvbmZpZywgY29uZmlnLT5uU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKGVyciAlZCkiLCBlcnIpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIFJlbW92ZXMgdHJhaWxpbmcgdGFncyBtYXRjaGluZyB8dGFnfCBmcm9tIHxrZXl8IChlLmcuIGEgc2V0dGluZ3MgbmFtZSkuIHxtaW5MZW5ndGh8IHNwZWNpZmllcwogLy8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8ga2VlcCBpbiB8a2V5fCAoZXZlbiBpZiBpdCBoYXMgdHJhaWxpbmcgdGFncykuCiAvLyAoVXNlZCB0byByZW1vdmUgdHJhaWxpbmcgJ3ZhbHVlJyB0YWdzIGluIHNldHRpbmdzIG5hbWVzLCBlLmcuIHRvIG5vcm1hbGl6ZQpAQCAtNzgwOSw2ICs4MDM0LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0V2ZW50Q29uZmlnVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShkYXRhMSwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CisKKyAgICAgICAgICAgIG1Db2RlYy0+b25Db25maWdVcGRhdGUoKE9NWF9JTkRFWFRZUEUpZGF0YTIpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0V2ZW50QnVmZmVyRmxhZzoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC03ODQ5LDcgKzgwODMsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKICAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CkBAIC03ODczLDYgKzgxMDcsMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBUSU1FRF9PVVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGhhbmRsZWQgPSBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTc4ODQsNiArODEzMCwxMSBAQAogdm9pZCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewogICAgIEFMT0dWKCJbJXNdIE5vdyBoYW5kbGluZyBvdXRwdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2UiLAogICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgIC8vIElmIHdlIGhhdmVuJ3QgdHJhbnNpdGlvbmVkIGFmdGVyIDMgc2Vjb25kcywgd2UncmUgcHJvYmFibHkgc3R1Y2suCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShBQ29kZWM6OmtXaGF0Q2hlY2tJZlN0dWNrLCBtQ29kZWMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKIH0KIAogYm9vbCBBQ29kZWM6Ok91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZTo6b25PTVhGcmFtZVJlbmRlcmVkKApAQCAtNzkxOSw2ICs4MTcwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBrUG9ydEluZGV4T3V0cHV0KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgUmVuZGVyUXVldWUgaW4gd2hpY2ggcXVldWVkIEdyYXBoaWNCdWZmZXJzIGhvbGQgdGhlCisgICAgICAgICAgICAgICAgLy8gYWN0dWFsIGJ1ZmZlciByZWZlcmVuY2VzIGluIG9yZGVyIHRvIGZyZWUgdGhlbSBlYXJseS4KKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLmNsZWFyKHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSk7CisKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+YWxsb2NhdGVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhPdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICBBTE9HRV9JRihlcnIgIT0gT0ssICJGYWlsZWQgdG8gYWxsb2NhdGUgb3V0cHV0IHBvcnQgYnVmZmVycyBhZnRlciBwb3J0ICIKQEAgLTgxNDYsNiArODQwMSwxMSBAQAogICAgIEFMT0dWKCJbJXNdIE5vdyBGbHVzaGluZyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdID0gbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleE91dHB1dF0gPSBmYWxzZTsKKworICAgIC8vIElmIHdlIGhhdmVuJ3QgdHJhbnNpdGlvbmVkIGFmdGVyIDMgc2Vjb25kcywgd2UncmUgcHJvYmFibHkgc3R1Y2suCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShBQ29kZWM6OmtXaGF0Q2hlY2tJZlN0dWNrLCBtQ29kZWMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKIH0KIAogYm9vbCBBQ29kZWM6OkZsdXNoaW5nU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC04MTYwLDYgKzg0MjAsNyBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtODE4MCw2ICs4NDQxLDE4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVElNRURfT1VUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYW5kbGVkID0gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04MzA2LDcgKzg1NzksNyBAQAogICAgIH0KIAogICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLSAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXIobmV3IEFNZXNzYWdlKTsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIAogICAgIGVyciA9IG9teC0+YWxsb2NhdGVOb2RlKG5hbWUsIG9ic2VydmVyLCAmb214Tm9kZSk7CkBAIC04NDIyLDE0ICs4Njk1LDE3IEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIDAsICZzaWRlYmFuZEhhbmRsZSkgPT0gT0spIHsKICAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGluY2x1ZGVzIGFkYXB0aXZlIHBsYXliYWNrCi0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjawotICAgICAgICAgICAgICAgICAgICB8IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNUdW5uZWxlZFBsYXliYWNrKTsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhOb2RlLT5zZXRQb3J0TW9kZSgKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSA9PSBPSyB8fAotICAgICAgICAgICAgICAgIG9teE5vZGUtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAotICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAotICAgICAgICAgICAgICAgIDEyODAgLyogd2lkdGggKi8sIDcyMCAvKiBoZWlnaHQgKi8pID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9UVU5ORUxFRF9QTEFZQkFDSyk7CisgICAgICAgICAgICBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCisgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXIpICE9IE9LICYmCisgICAgICAgICAgICAgICAgICAgIG9teE5vZGUtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIGFkYXB0aXZlIHBsYXliYWNrIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9BREFQVElWRV9QTEFZQkFDSyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg0MzcsMTEgKzg3MTMsMjAgQEAKICAgICAgICAgT01YX1ZJREVPX0NPTkZJR19BTkRST0lEX0lOVFJBUkVGUkVTSFRZUEUgcGFyYW1zOwogICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7Ci0gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSB2ZXJpZnkgaWYgZmFsbGJhY2sgaXMgc3VwcG9ydGVkPworCisgICAgICAgIE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIGZhbGxiYWNrUGFyYW1zOworICAgICAgICBJbml0T01YUGFyYW1zKCZmYWxsYmFja1BhcmFtcyk7CisgICAgICAgIGZhbGxiYWNrUGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBmYWxsYmFja1BhcmFtcy5lUmVmcmVzaE1vZGUgPSBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljOworCiAgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKLSAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgJmZhbGxiYWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmFsbGJhY2tQYXJhbXMpKSAhPSBPSykgeworICAgICAgICAgICAgLy8gaW50cmEgcmVmcmVzaCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBjYXBzLT5yZW1vdmVEZXRhaWwoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9JTlRSQV9SRUZSRVNIKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCA3MTBhZTY4Li4yNjZhMjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CiAgICAgICAgIGlmIChzZWN1cmUpIHsKQEAgLTE4MCw5ICsxODEsMTYgQEAKIAogICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKICAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CiAKICAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAotICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBzY3RybCwKICAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgMCwKQEAgLTIwMiw2ICsyMTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CiAKICAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKQEAgLTIxMCw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKKyAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CiAKICAgICAvLyBDb3B5IG1ldGFkYXRhIGZyb20gY2xpZW50IHRvIGNvZGVjIGJ1ZmZlci4KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQorICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Cit9CisKK0FTdGF0ZTo6fkFTdGF0ZSgpIHsKK30KKworc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgeworICAgIHJldHVybiBtUGFyZW50U3RhdGU7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKK30KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKKworICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOworICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7CisgICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKKyAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KKyAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOworCisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKKyAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKK30KKwordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgeworICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKKyAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEEucHVzaChjdXIpOworICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7CisgICAgY3VyID0gc3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBCLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KKyAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKKyAgICAgICAgQS5wb3AoKTsKKyAgICAgICAgQi5wb3AoKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBzdGF0ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgeworICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOworICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCmluZGV4IDQxMTA2YTEuLjI0ZjZmMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcApAQCAtMTQ5LDExICsxNDksMTEgQEAKICAgICBtRG9uZSA9IHRydWU7CiAKICAgICB2b2lkICpkdW1teTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKICAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CiAgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCA0OGUzNTFiLi43ZWFiMjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTE4LDkgKzE4LDYgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLApAQCAtNDAsMTIgKzM3LDkgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIiwgImxpYm1lZGlhbmRrIl0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTgwLDIyICs3NCw1NCBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorCisgICAgc3JjczogWworICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQUNXcml0ZXIuY3BwIiwKICAgICAgICAgIkFDb2RlYy5jcHAiLAogICAgICAgICAiQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAotICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCisgICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCi0gICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCiAgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKQEAgLTEwNSw2ICsxMzEsNyBAQAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTE5LDEyICsxNDYsMTcgQEAKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY1NvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk1lZGlhU3luYy5jcHAiLAorICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAorICAgICAgICAiaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAiLAogICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKICAgICAgICAgIk1lZGlhTXV4ZXIuY3BwIiwKICAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAogICAgICAgICAiTnVNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiT2dnV3JpdGVyLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKICAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLApAQCAtMTM3LDQzICsxNjksNDAgQEAKICAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKICAgICAgICAgIlRocm90dGxlZFNvdXJjZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKICAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZGxfYW5kcm9pZCIsCiAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYmlvbiIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhX29teF9jbGllbnQiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgICAgICAibGlibmV0ZF9jbGllbnQiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGliUlNjcHAiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliemlwYXJjaGl2ZSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTE4MiwxNCArMjExLDIyIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZWRpYWZpbHRlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCi0gICAgICAgICJsaWJ2cHgiLAorICAgICAgICAibGlib2dnIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYm5hdGl2ZWxvYWRlci1kdW1teS1oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcl9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgIF0sCkBAIC0yMjAsNjQgKzI1NywzOCBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAotICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAotICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiSFRUUEJhc2UuY3BwIiwKICAgICAgICAgIkhldmNVdGlscy5jcHAiLAotICAgICAgICAiSW50ZXJmYWNlVXRpbHMuY3BwIiwKICAgICAgICAgIk1lZGlhQ2xvY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk5ka1V0aWxzLmNwcCIsCi0gICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtMzA0LDI3ICszMTUsNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKLXN1YmRpcnMgPSBbCi0gICAgImNvZGVjMiIsCi0gICAgImNvZGVjcy8qIiwKLSAgICAiY29sb3Jjb252ZXJzaW9uIiwKLSAgICAiZmlsdGVycyIsCi0gICAgImZsYWMvZGVjIiwKLSAgICAiZm91bmRhdGlvbiIsCi0gICAgImh0dHAiLAotICAgICJodHRwbGl2ZSIsCi0gICAgImlkMyIsCi0gICAgIm1wZWcydHMiLAotICAgICJvbXgiLAotICAgICJydHNwIiwKLSAgICAidGVzdHMiLAotICAgICJ0aW1lZHRleHQiLAotICAgICJ3ZWJtIiwKLSAgICAieG1scGFyc2VyIiwKLV0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBhNmYwYTBiLi4xOTliNTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xMTgsNiArMTE4LDEzIEBACiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJObyBtZXRhZGF0YSBiLzExODYyMDg3MSIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExODYyMDg3MSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUxODU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjpBdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7Ci19Ci0KLUF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6fkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLSAgICBtUHJlc2VudGF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pIHsKLSAgICBtUHJlc2VudGF0aW9ucy5wdXNoKHByZXNlbnRhdGlvbik7Ci19Ci0KLXNpemVfdCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnMuc2l6ZSgpOwotfQotCi0vLyBSZXR1cm5zIGFuIEF1ZGlvUHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKLS8vIGluZGV4IG11c3QgYmUgPj0wIGFuZCA8IGNvdW50UHJlc2VudGF0aW9ucygpCi1jb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25JbmZvOjpnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmVzZW50YXRpb25zW2luZGV4XTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCAyYWUzMjE4Li5kNzhkNzI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01Miw3ICs1Miw5IEBACiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLCBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCB1aW50MzJfdCBvdXRTYW1wbGVSYXRlLAotICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKQogICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICBtT3V0U2FtcGxlUmF0ZShvdXRTYW1wbGVSYXRlID4gMCA/IG91dFNhbXBsZVJhdGUgOiBzYW1wbGVSYXRlKSwKQEAgLTEwMyw3ICsxMDUsOSBAQAogICAgICAgICAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICAgICAgICAgIHBpZCwKICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKnBBdHRyaWJ1dGVzKi8sCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgICAgIG1SZWNvcmQuY2xlYXIoKTsKQEAgLTMzNyw3ICszNDEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gbm9ybWFsIGNhc2UuCiAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZ2V0IGF1ZGlvIHRpbWVzdGFtcCwgZmFsbGJhY2sgdG8gdXNlIHN5c3RlbWNsb2NrIik7Ci0gICAgICAgIHRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDBsbDsKKyAgICAgICAgdGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMExMOwogICAgICAgICAvLyBFc3RpbWF0ZSB0aGUgcmVhbCBzYW1wbGluZyB0aW1lIG9mIHRoZSAxc3Qgc2FtcGxlIGluIHRoaXMgYnVmZmVyCiAgICAgICAgIC8vIGZyb20gQXVkaW9SZWNvcmQncyBsYXRlbmN5LiAoQXBwbHkgdGhpcyBhZGp1c3RtZW50IGZpcnN0IHNvIHRoYXQKICAgICAgICAgLy8gdGhlIHN0YXJ0IHRpbWUgbG9naWMgaXMgbm90IGFmZmVjdGVkLikKQEAgLTM4MSwxMSArMzg1LDExIEBACiAgICAgfQogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVVczsKIAotICAgIHNpemVfdCBudW1Mb3N0Qnl0ZXMgPSAwOworICAgIHVpbnQ2NF90IG51bUxvc3RCeXRlcyA9IDA7IC8vIEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSByZXR1cm5zIHVpbnQzMl90CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDApIHsgIC8vIElnbm9yZSBlYXJsaWVyIGZyYW1lIGxvc3QKICAgICAgICAgLy8gZ2V0SW5wdXRGcmFtZXNMb3N0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxvc3QgZnJhbWVzLgogICAgICAgICAvLyBDb252ZXJ0IG51bWJlciBvZiBmcmFtZXMgbG9zdCB0byBudW1iZXIgb2YgYnl0ZXMgbG9zdC4KLSAgICAgICAgbnVtTG9zdEJ5dGVzID0gbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCkgKiBtUmVjb3JkLT5mcmFtZVNpemUoKTsKKyAgICAgICAgbnVtTG9zdEJ5dGVzID0gKHVpbnQ2NF90KW1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpICogbVJlY29yZC0+ZnJhbWVTaXplKCk7CiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobnVtTG9zdEJ5dGVzICYgMSwgMHUpOwpAQCAtMzkzLDExICszOTcsMTEgQEAKICAgICBpZiAobnVtTG9zdEJ5dGVzID4gMCkgewogICAgICAgICAvLyBMb3NzIG9mIGF1ZGlvIGZyYW1lcyBzaG91bGQgaGFwcGVuIHJhcmVseTsgdGh1cyB0aGUgTE9HVyBzaG91bGQKICAgICAgICAgLy8gbm90IGNhdXNlIGEgbG9nZ2luZyBzcGFtCi0gICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlenUgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOworICAgICAgICBBTE9HVygiTG9zdCBhdWRpbyByZWNvcmQgZGF0YTogJSIgUFJJdTY0ICIgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOwogICAgIH0KIAogICAgIHdoaWxlIChudW1Mb3N0Qnl0ZXMgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBidWZmZXJTaXplID0gbnVtTG9zdEJ5dGVzOworICAgICAgICB1aW50NjRfdCBidWZmZXJTaXplID0gbnVtTG9zdEJ5dGVzOwogICAgICAgICBpZiAobnVtTG9zdEJ5dGVzID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgICAgIG51bUxvc3RCeXRlcyAtPSBrTWF4QnVmZmVyU2l6ZTsKICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBrTWF4QnVmZmVyU2l6ZTsKQEAgLTQyNywxOSArNDMxLDE3IEBACiB2b2lkIEF1ZGlvU291cmNlOjpxdWV1ZUlucHV0QnVmZmVyX2woTWVkaWFCdWZmZXIgKmJ1ZmZlciwgaW50NjRfdCB0aW1lVXMpIHsKICAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9IG1SZWNvcmQtPmZyYW1lU2l6ZSgpOwotICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wVXMgPQotICAgICAgICAgICAgICAgIG1QcmV2U2FtcGxlVGltZVVzICsKLSAgICAgICAgICAgICAgICAgICAgKCgxMDAwMDAwTEwgKiAoYnVmZmVyU2l6ZSAvIGZyYW1lU2l6ZSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA+PiAxKSkgLyBtU2FtcGxlUmF0ZTsKLQogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgewogICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlBbmNob3JUaW1lLCBtU3RhcnRUaW1lVXMpOwogICAgIH0KLQorICAgIG1OdW1GcmFtZXNSZWNlaXZlZCArPSBidWZmZXJTaXplIC8gZnJhbWVTaXplOworICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcyArCisgICAgICAgICAgICAgICAgICAgICgoMTAwMDAwMExMICogbU51bUZyYW1lc1JlY2VpdmVkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAobVNhbXBsZVJhdGUgPj4gMSkpIC8gbVNhbXBsZVJhdGU7CiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbVByZXZTYW1wbGVUaW1lVXMpOwogICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleURyaWZ0VGltZSwgdGltZVVzIC0gbUluaXRpYWxSZWFkVGltZVVzKTsKICAgICBtUHJldlNhbXBsZVRpbWVVcyA9IHRpbWVzdGFtcFVzOwotICAgIG1OdW1GcmFtZXNSZWNlaXZlZCArPSBidWZmZXJTaXplIC8gZnJhbWVTaXplOwogICAgIG1CdWZmZXJzUmVjZWl2ZWQucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogfQpAQCAtNTA2LDQgKzUwOCwyNyBAQAogICAgIHJldHVybiBOT19JTklUOwogfQogCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgKnBvcnRJZCA9IG1SZWNvcmQtPmdldFBvcnRJZCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IDNhZDgyZDkuLjJhODE5YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMTksNiArMTksNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UiCiAKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC0xNzIsOCArMTczLDE2IEBACiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKICAgICBpZiAobVF1aWNrU3RvcCAmJiAoYnVmZmVyID09IG1MYXN0UmVhZEJ1ZmZlckNvcHkpKSB7CisgICAgICAgIGlmIChtZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCkgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSAoCisgICAgICAgICAgICAgICAgKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShtTGFzdFJlYWRCdWZmZXJDb3B5LT5kYXRhKCkpKS0+cEhhbmRsZTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgICAgIH0KICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHkgPSBOVUxMOworICAgICAgICBtRm9yY2VSZWFkID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQ2FtZXJhU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChidWZmZXIpOwogICAgIH0KQEAgLTE4Miw3ICsxOTEsOCBAQAogdm9pZCBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoCiAgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyLAogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZSwKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqbmV3QnVmZmVyKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm5ld0J1ZmZlciwKKyAgICAgICAgaW50MzJfdCB2aWRlb0J1ZmZlck1vZGUpIHsKIAogICAgIEFMT0dWKCJjcmVhdGVNZWRpYUJ1ZmZlckNvcHkiKTsKICAgICBzaXplX3Qgc291cmNlU2l6ZSA9IHNvdXJjZUJ1ZmZlci5zaXplKCk7CkBAIC0xOTIsMTMgKzIwMiwyMCBAQAogICAgIG1lbWNweSgoKm5ld0J1ZmZlciktPmRhdGEoKSwgc291cmNlUG9pbnRlciwgc291cmNlU2l6ZSk7CiAKICAgICAoKm5ld0J1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworCisgICAgaWYgKHZpZGVvQnVmZmVyTW9kZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICgoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKCgqbmV3QnVmZmVyKS0+ZGF0YSgpKSktPnBIYW5kbGUgPQorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAoKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShzb3VyY2VCdWZmZXIuZGF0YSgpKSktPnBIYW5kbGUpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkoTWVkaWFCdWZmZXJCYXNlJiBzb3VyY2VCdWZmZXIpIHsKICAgICBBTE9HVigiZmlsbExhc3RSZWFkQnVmZmVyQ29weSIpOwogICAgIGludDY0X3QgZnJhbWVUaW1lOwogICAgIENIRUNLKHNvdXJjZUJ1ZmZlci5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZmcmFtZVRpbWUpKTsKLSAgICBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoc291cmNlQnVmZmVyLCBmcmFtZVRpbWUsICZtTGFzdFJlYWRCdWZmZXJDb3B5KTsKKyAgICBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoc291cmNlQnVmZmVyLCBmcmFtZVRpbWUsICZtTGFzdFJlYWRCdWZmZXJDb3B5LAorICAgICAgICBtZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCkpOwogICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHktPmFkZF9yZWYoKTsKICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5zZXRPYnNlcnZlcih0aGlzKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTJjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhckZpbGVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZkKC0xKSwKKyAgICAgIG1PZmZzZXQoMCksCisgICAgICBtTGVuZ3RoKC0xKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisKKyAgICBpZiAoZmlsZW5hbWUpIHsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkZpbGVTb3VyY2UoJXMpIiwgZmlsZW5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXMiLCBmaWxlbmFtZSk7CisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19MQVJHRUZJTEUgfCBPX1JET05MWSk7CisKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX0VORCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4gKCVzKSIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KK30KKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCisgICAgOiBtRmQoZmQpLAorICAgICAgbU9mZnNldChvZmZzZXQpLAorICAgICAgbUxlbmd0aChsZW5ndGgpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKyAgICBBTE9HVigiZmQ9JWQgKCVzKSwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwKKyAgICAgICAgICAgIGZkLCBuYW1lRm9yRmQoZmQpLmNfc3RyKCksIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoKTsKKworICAgIGlmIChtT2Zmc2V0IDwgMCkgeworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPCAwKSB7CisgICAgICAgIG1MZW5ndGggPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA+IElOVDY0X01BWCAtIG1PZmZzZXQpIHsKKyAgICAgICAgbUxlbmd0aCA9IElOVDY0X01BWCAtIG1PZmZzZXQ7CisgICAgfQorICAgIHN0cnVjdCBzdGF0IHM7CisgICAgaWYgKGZzdGF0KGZkLCAmcykgPT0gMCkgeworICAgICAgICBpZiAobU9mZnNldCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbU9mZnNldCA9IHMuc3Rfc2l6ZTsKKyAgICAgICAgICAgIG1MZW5ndGggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtT2Zmc2V0ICsgbUxlbmd0aCA+IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgbUxlbmd0aCA9IHMuc3Rfc2l6ZSAtIG1PZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PZmZzZXQgIT0gb2Zmc2V0IHx8IG1MZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgIEFMT0dXKCJvZmZzZXQvbGVuZ3RoIGFkanVzdGVkIGZyb20gJWxsZC8lbGxkIHRvICVsbGQvJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisgICAgfQorCisgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiRmlsZVNvdXJjZShmZCglcyksICVsbGQsICVsbGQpIiwKKyAgICAgICAgICAgIG5hbWVGb3JGZChmZCkuY19zdHIoKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsCisgICAgICAgICAgICAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKworfQorCitDbGVhckZpbGVTb3VyY2U6On5DbGVhckZpbGVTb3VyY2UoKSB7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUxlbmd0aCA+PSAwKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyByZWFkIGJleW9uZCBFT0YuCisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3QgbnVtQXZhaWxhYmxlID0gbUxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgaWYgKCh1aW50NjRfdClzaXplID4gbnVtQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzaXplID0gbnVtQXZhaWxhYmxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgKnNpemUgPSBtTGVuZ3RoOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcAppbmRleCAzZGMzNDVmLi5iOTc1YjM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcApAQCAtMTMsNyArMTMsNiBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtMzksMTUgKzM4LDI3IEBACiAgICAgQVN0cmluZyB0bXAoJnVyaVs1XSwgY29tbWFQb3MgLSAmdXJpWzVdKTsKIAogICAgIGlmICh0bXAuZW5kc1dpdGgoIjtiYXNlNjQiKSkgewotICAgICAgICBBU3RyaW5nIGVuY29kZWQoY29tbWFQb3MgKyAxKTsKIAotICAgICAgICAvLyBTdHJpcCBDUiBhbmQgTEYuLi4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IGVuY29kZWQuc2l6ZSgpOyBpID4gMDspIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIGlmIChlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xyJyB8fCBlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGVuY29kZWQuZXJhc2UoaSwgMSk7CisgICAgICAgIC8vIHN0cmlwIGFsbCBDUiBhbmQgTEYgY2hhcmFjdGVycy4KKyAgICAgICAgY29uc3QgY2hhciAqc3JjID0gY29tbWFQb3MrMTsKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciAqY2xlYW5zZWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKKyAgICAgICAgaWYgKGNsZWFuc2VkID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgICBjaGFyICprZWVwaW5nID0gY2xlYW5zZWQ7CisgICAgICAgIGludCBsZWZ0ID0gbGVuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbiA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciBjID0gKnNyYysrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICprZWVwaW5nKysgPSBjOworICAgICAgICAgICAgbGVmdC0tOwogICAgICAgICB9CisgICAgICAgIG1lbXNldChrZWVwaW5nLCAwLCBsZWZ0KTsKKworICAgICAgICBBU3RyaW5nIGVuY29kZWQoY2xlYW5zZWQpOworICAgICAgICBmcmVlKGNsZWFuc2VkKTsKIAogICAgICAgICBidWZmZXIgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggZWVmNTMxNC4uYWVlN2ZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTIyLDkwICsyMiwyOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmaWxlbmFtZSksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKXsKLQotICAgIGlmIChmaWxlbmFtZSkgewotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKLQotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQogfQogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotICAgIDogbUZkKGZkKSwKLSAgICAgIG1PZmZzZXQob2Zmc2V0KSwKLSAgICAgIG1MZW5ndGgobGVuZ3RoKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCkgewotICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOwotCi0gICAgaWYgKG1PZmZzZXQgPCAwKSB7Ci0gICAgICAgIG1PZmZzZXQgPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA8IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgewotICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOwotICAgICAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAotICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOwotCiB9CiAKIEZpbGVTb3VyY2U6On5GaWxlU291cmNlKCkgewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLQogICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKICAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKICAgICAgICAgbURybUJ1ZiA9IE5VTEw7CkBAIC0xMjQsMTAgKzYyLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KIHNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtRmQgPCAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ3LDMwICs4MSwxMiBAQAogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwgJiYgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAogICAgICAgICAgICAgPT0gbURlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKSB7Ci0gICAgICAgIHJldHVybiByZWFkQXREUk0ob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdERSTV9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICB9IGVsc2UgewotICAgICAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgICpzaXplID0gbUxlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3A8RGVjcnlwdEhhbmRsZT4gRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewogICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHJldHVybiBudWxscHRyOyAvLyBubyBEUk0gaW4gbWVkaWEgZXh0cmFjdG9yCiAgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKQEAgLTE5NCw3ICsxMTAsNyBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Citzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CiAgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgewogICAgICAgICBtRHJtQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbRFJNX0NBQ0hFX1NJWkVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNmU5NDUxNy4uMThhNmJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IGludDY0X3Qga0J1ZmZlclRpbWVPdXRVcyA9IDEwMDAwbGw7IC8vIDEwIG1zZWMKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAxMDAwMExMOyAvLyAxMCBtc2VjCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gNTA7IC8vIG11c3QgYmUgPjAKIAogc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLApAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgc2l6ZV90IHJldHJpZXNMZWZ0ID0ga1JldHJ5Q291bnQ7CiAgICAgZG8gewogICAgICAgICBzaXplX3QgaW5kZXg7Ci0gICAgICAgIGludDY0X3QgcHRzVXMgPSAwbGw7CisgICAgICAgIGludDY0X3QgcHRzVXMgPSAwTEw7CiAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKIAogICAgICAgICAvLyBRdWV1ZSBhcyBtYW55IGlucHV0cyBhcyB3ZSBwb3NzaWJseSBjYW4sIHRoZW4gYmxvY2sgb24gZGVxdWV1aW5nCkBAIC00MDYsNyArNDA2LDcgQEAKICAgICA6IEZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSksCiAgICAgICBtSXNBdmNPckhldmMoZmFsc2UpLAogICAgICAgbVNlZWtNb2RlKE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSwKLSAgICAgIG1UYXJnZXRUaW1lVXMoLTFsbCksCisgICAgICBtVGFyZ2V0VGltZVVzKC0xTEwpLAogICAgICAgbU51bUZyYW1lcygwKSwKICAgICAgIG1OdW1GcmFtZXNEZWNvZGVkKDApIHsKIH0KQEAgLTQzMSw3ICs0MzEsNyBAQAogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAKICAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7Ci0gICAgICAgIGludDY0X3QgdGh1bWJOYWlsVGltZTsKKyAgICAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lID0gLTFsbDsKICAgICAgICAgaWYgKCF0cmFja01ldGEoKS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmdGh1bWJOYWlsVGltZSkKICAgICAgICAgICAgICAgICB8fCB0aHVtYk5haWxUaW1lIDwgMCkgewogICAgICAgICAgICAgdGh1bWJOYWlsVGltZSA9IDA7CkBAIC00ODcsNyArNDg3LDcgQEAKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJnZpZGVvRnJhbWVCdWZmZXIsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAogICAgICAgICBpbnQ2NF90IHRpbWVVcywgYm9vbCAqZG9uZSkgewotICAgIGJvb2wgc2hvdWxkT3V0cHV0ID0gKG1UYXJnZXRUaW1lVXMgPCAwbGwpIHx8ICh0aW1lVXMgPj0gbVRhcmdldFRpbWVVcyk7CisgICAgYm9vbCBzaG91bGRPdXRwdXQgPSAobVRhcmdldFRpbWVVcyA8IDBMTCkgfHwgKHRpbWVVcyA+PSBtVGFyZ2V0VGltZVVzKTsKIAogICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSB0YXJnZXQgZnJhbWUsIHNraXAgY29sb3IgY29udmVydC4KICAgICBpZiAoIXNob3VsZE91dHB1dCkgewpAQCAtNTAxLDkgKzUwMSwxNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzcmNGb3JtYXQ7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJmb3JtYXQgbWlzc2luZyBkaW1lbnNpb24gb3IgY29sb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CkBAIC01MjIsMTkgKzUyOCwyNyBAQAogICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKICAgICBWaWRlb0ZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbS0+cG9pbnRlcigpKTsKIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCwgZnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC02ODEsOSArNjk1LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpKTsKIAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKQEAgLTY5OCw2ICs3MTMsMTggQEAKIAogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207CiAgICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiB3aWR0aDsKICAgICBkc3RUb3AgPSBtVGlsZXNEZWNvZGVkIC8gbUdyaWRDb2xzICogaGVpZ2h0OwpAQCAtNzI3LDExICs3NTQsMTAgQEAKICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewogICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBtRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsIG1GcmFtZS0+bUhlaWdodCwgbUZyYW1lLT5tUm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAppbmRleCAwZjI0MzI5Li5kMTE4ZThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogCi0jaW5jbHVkZSA8TmV0ZENsaWVudC5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEhUVFBCYXNlOjpIVFRQQmFzZSgpCkBAIC0xMTQsMzAgKzExMiw0IEBACiAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcyA9IG51bUhpc3RvcnlJdGVtczsKIH0KIAotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7Ci0gICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0YWdnaW5nIHNvY2tldCAlZCBmb3IgdWlkICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCB1aWQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKSB7Ci0gICAgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhzb2NrZmQsIGdldGV1aWQoKSk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAppbmRleCBmMTUyYTM4Li40ODJhMWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKQEAgLTMxMiwxNCArMzEyLDIzIEBACiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbnVtUGljczsgKytqKSB7CiAgICAgICAgICAgICAgICAgc2tpcFVFKCZyZWFkZXIpOyAvLyBkZWx0YV9wb2NfczB8MV9taW51czFbaV0KICAgICAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoMSk7IC8vIHVzZWRfYnlfY3Vycl9waWNfczB8MV9mbGFnW2ldCisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5vdmVyUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChyZWFkZXIub3ZlclJlYWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAocmVhZGVyLmdldEJpdHNXaXRoRmFsbGJhY2soMSwgMCkpIHsgLy8gbG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZwogICAgICAgICB1aW50MzJfdCBudW1Mb25nVGVybVJlZlBpY1NwcyA9IHBhcnNlVUVXaXRoRmFsbGJhY2soJnJlYWRlciwgMCk7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1Mb25nVGVybVJlZlBpY1NwczsgKytpKSB7CiAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMobG9nMk1heFBpY09yZGVyQ250THNiKTsgLy8gbHRfcmVmX3BpY19wb2NfbHNiX3Nwc1tpXQogICAgICAgICAgICAgcmVhZGVyLnNraXBCaXRzKDEpOyAvLyB1c2VkX2J5X2N1cnJfcGljX2x0X3Nwc19mbGFnW2ldCisgICAgICAgICAgICBpZiAocmVhZGVyLm92ZXJSZWFkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJlYWRlci5za2lwQml0cygxKTsgLy8gc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcKQEAgLTQ1Nyw4ICs0NjYsOCBAQAogICAgICAgICBpZiAobnVtTmFsdXMgPT0gMCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgLy8gYXJyYXlfY29tcGxldGVuZXNzIHNldCB0byAwLgotICAgICAgICBoZWFkZXJbMF0gPSB0eXBlOworICAgICAgICAvLyBhcnJheV9jb21wbGV0ZW5lc3Mgc2V0IHRvIDEuCisgICAgICAgIGhlYWRlclswXSA9IHR5cGUgfCAweDgwOwogICAgICAgICBoZWFkZXJbMV0gPSAobnVtTmFsdXMgPj4gOCkgJiAweGZmOwogICAgICAgICBoZWFkZXJbMl0gPSBudW1OYWx1cyAmIDB4ZmY7CiAgICAgICAgIGhlYWRlciArPSAzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCA3NzA1MzVjLi5hOTcxNWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICAgIHNpemUgLT0gbGVuZ3RoOwogICAgIH0KIAotICAgIG91dC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKKyAgICBvdXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDBMTCk7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtOb3RpZnlCdWZmZXIpOwpAQCAtODQyLDcgKzg0Miw3IEBACiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAotICAgIHVpbnQzMl90IFBUUyA9ICh0aW1lVXMgKiA5bGwpIC8gMTAwbGw7CisgICAgdWludDMyX3QgUFRTID0gKHRpbWVVcyAqIDlMTCkgLyAxMDBMTDsKIAogICAgIHNpemVfdCBQRVNfcGFja2V0X2xlbmd0aCA9IGFjY2Vzc1VuaXQtPnNpemUoKSArIDg7CiAgICAgYm9vbCBwYWRkaW5nID0gKGFjY2Vzc1VuaXQtPnNpemUoKSA8ICgxODggLSAxOCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCmluZGV4IDZmZjNkNzguLjJmMTNkYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKQEAgLTcxLDYgKzcxLDggQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtJbml0aWFsRGVsYXlUaW1lVXMgICAgID0gNzAwMDAwTEw7CiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4TWV0YWRhdGFTaXplID0gMHg0MDAwMDAwTEw7ICAgLy8gNjRNQiBtYXggcGVyLWZyYW1lIG1ldGFkYXRhIHNpemUKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhDdHRzT2Zmc2V0VGltZVVzID0gMzAgKiA2MCAqIDEwMDAwMDBMTDsgIC8vIDMwIG1pbnV0ZXMKK3N0YXRpYyBjb25zdCBzaXplX3Qga0VTRFNTY3JhdGNoQnVmZmVyU2l6ZSA9IDEwOyAgLy8ga01heEF0b21TaXplIGluIE1wZWc0RXh0cmFjdG9yIDY0TUIKIAogc3RhdGljIGNvbnN0IGNoYXIga01ldGFLZXlfVmVyc2lvbltdICAgID0gImNvbS5hbmRyb2lkLnZlcnNpb24iOwogc3RhdGljIGNvbnN0IGNoYXIga01ldGFLZXlfTWFudWZhY3R1cmVyW10gICAgICA9ICJjb20uYW5kcm9pZC5tYW51ZmFjdHVyZXIiOwpAQCAtODUsNyArODcsNyBAQAogc3RhdGljIGNvbnN0IGludCBrVGltZXN0YW1wRGVidWdDb3VudCA9IDEwOwogc3RhdGljIGNvbnN0IGludCBrSXRlbUlkQmFzZSA9IDEwMDAwOwogc3RhdGljIGNvbnN0IGNoYXIga0V4aWZIZWFkZXJbXSA9IHsnRScsICd4JywgJ2knLCAnZicsICdcMCcsICdcMCd9Owotc3RhdGljIGNvbnN0IGludDMyX3Qga1RpZmZIZWFkZXJPZmZzZXQgPSBodG9ubChzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtFeGlmQXBwMU1hcmtlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgMHhmZiwgMHhlMX07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYW5kYXRvcnlIZXZjTmFsVW5pdFR5cGVzWzNdID0gewogICAgIGtIZXZjTmFsVW5pdFR5cGVWcHMsCkBAIC0xMjUsNyArMTI3LDcgQEAKICAgICBib29sIGlzQXVkaW8oKSBjb25zdCB7IHJldHVybiBtSXNBdWRpbzsgfQogICAgIGJvb2wgaXNNUEVHNCgpIGNvbnN0IHsgcmV0dXJuIG1Jc01QRUc0OyB9CiAgICAgYm9vbCB1c2VQcmVmaXgoKSBjb25zdCB7IHJldHVybiBtSXNBdmMgfHwgbUlzSGV2YyB8fCBtSXNIZWljOyB9Ci0gICAgYm9vbCBpc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKyAgICBib29sIGlzRXhpZkRhdGEoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdDsKICAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKICAgICB2b2lkIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBpc0V4aWYpOwogICAgIHZvaWQgZmx1c2hJdGVtUmVmcygpOwpAQCAtMTM2LDExICsxMzgsNiBAQAogICAgIHZvaWQgcmVzZXRJbnRlcm5hbCgpOwogCiBwcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrTWF4Q3R0c09mZnNldFRpbWVVcyA9IDEwMDAwMDBMTCwgIC8vIDEgc2Vjb25kCi0gICAgICAgIGtTYW1wbGVBcnJheVNpemUgPSAxMDAwLAotICAgIH07Ci0KICAgICAvLyBBIGhlbHBlciBjbGFzcyB0byBoYW5kbGUgZmFzdGVyIHdyaXRlIGJveCB3aXRoIHRhYmxlIGVudHJpZXMKICAgICB0ZW1wbGF0ZTxjbGFzcyBUWVBFLCB1bnNpZ25lZCBFTlRSWV9TSVpFPgogICAgIC8vIEVOVFJZX1NJWkU6ICMgb2YgdmFsdWVzIGluIGVhY2ggZW50cnkKQEAgLTMxNyw2ICszMTQsNyBAQAogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+ICptU3Rzc1RhYmxlRW50cmllczsKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPiAqbVN0dHNUYWJsZUVudHJpZXM7CiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4gKm1DdHRzVGFibGVFbnRyaWVzOworICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+ICptRWxzdFRhYmxlRW50cmllczsgLy8gM2NvbHVtbnM6IHNlZ0R1cmF0aW9uLCBtZWRpYVRpbWUsIG1lZGlhUmF0ZQogCiAgICAgaW50NjRfdCBtTWluQ3R0c09mZnNldFRpbWVVczsKICAgICBpbnQ2NF90IG1NaW5DdHRzT2Zmc2V0VGlja3M7CkBAIC0zNjEsNyArMzU5LDcgQEAKIAogICAgIFZlY3Rvcjx1aW50MTZfdD4gbVByb3BlcnRpZXM7CiAgICAgSXRlbVJlZnMgbURpbWdSZWZzOwotICAgIEl0ZW1SZWZzIG1DZHNjUmVmczsKKyAgICBWZWN0b3I8dWludDE2X3Q+IG1FeGlmTGlzdDsKICAgICB1aW50MTZfdCBtSW1hZ2VJdGVtSWQ7CiAgICAgaW50MzJfdCBtSXNQcmltYXJ5OwogICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OwpAQCAtNDE2LDYgKzQxNCw4IEBACiAgICAgLy8gRHVyYXRpb24gaXMgdGltZSBzY2FsZSBiYXNlZAogICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOwogICAgIHZvaWQgYWRkT25lQ3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOworICAgIHZvaWQgYWRkT25lRWxzdFRhYmxlRW50cnkodWludDMyX3Qgc2VnbWVudER1cmF0aW9uLCBpbnQzMl90IG1lZGlhVGltZSwKKyAgICAgICAgaW50MTZfdCBtZWRpYVJhdGUsIGludDE2X3QgbWVkaWFSYXRlRnJhY3Rpb24pOwogCiAgICAgYm9vbCBpc1RyYWNrTWFsRm9ybWVkKCkgY29uc3Q7CiAgICAgdm9pZCBzZW5kVHJhY2tTdW1tYXJ5KGJvb2wgaGFzTXVsdGlwbGVUcmFja3MpOwpAQCAtNDQ4LDEzICs0NDgsMTQgQEAKICAgICB2b2lkIHdyaXRlVmlkZW9Gb3VyQ0NCb3goKTsKICAgICB2b2lkIHdyaXRlTWV0YWRhdGFGb3VyQ0NCb3goKTsKICAgICB2b2lkIHdyaXRlU3RibEJveChib29sIHVzZTMyQml0T2Zmc2V0KTsKKyAgICB2b2lkIHdyaXRlRWR0c0JveCgpOwogCiAgICAgVHJhY2soY29uc3QgVHJhY2sgJik7CiAgICAgVHJhY2sgJm9wZXJhdG9yPShjb25zdCBUcmFjayAmKTsKIH07CiAKIE1QRUc0V3JpdGVyOjpNUEVHNFdyaXRlcihpbnQgZmQpIHsKLSAgICBpbml0SW50ZXJuYWwoZmQsIHRydWUgLyppc0ZpcnN0U2Vzc2lvbiovKTsKKyAgICBpbml0SW50ZXJuYWwoZHVwKGZkKSwgdHJ1ZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogfQogCiBNUEVHNFdyaXRlcjo6fk1QRUc0V3JpdGVyKCkgewpAQCAtNDc1LDE0ICs0NzYsMTUgQEAKIAogdm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbikgewogICAgIEFMT0dWKCJpbml0SW50ZXJuYWwiKTsKLSAgICBtRmQgPSBkdXAoZmQpOworICAgIG1GZCA9IGZkOwogICAgIG1OZXh0RmQgPSAtMTsKICAgICBtSW5pdENoZWNrID0gbUZkIDwgMD8gTk9fSU5JVDogT0s7CiAKICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPSAxMDAwMDAwOwogCi0gICAgbVN0YXJ0VGltZXN0YW1wVXMgPSAtMWxsOworICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTFMTDsKICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAtMTsKKyAgICBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzID0gMDsKICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZCA9IGZhbHNlOwpAQCAtMTAzNyw2ICsxMDM5LDEwIEBACiB2b2lkIE1QRUc0V3JpdGVyOjpyZWxlYXNlKCkgewogICAgIGNsb3NlKG1GZCk7CiAgICAgbUZkID0gLTE7CisgICAgaWYgKG1OZXh0RmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobU5leHRGZCk7CisgICAgICAgIG1OZXh0RmQgPSAtMTsKKyAgICB9CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBmcmVlKG1Jbk1lbW9yeUNhY2hlKTsKQEAgLTEyNzIsNiArMTI3OCwxMCBAQAogICAgIC8vIEFkanVzdCB0aGUgZ2xvYmFsIHN0YXJ0IHRpbWUuCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgKz0gbWluQ3R0c09mZnNldFRpbWVVcyAtIGtNYXhDdHRzT2Zmc2V0VGltZVVzOwogCisgICAgLy8gQWRkIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoLXZlIG9yIHplcm8pIHRvIHRoZSBkdXJhdGlvbiBvZiBmaXJzdCBlbnRyeSBpbiBTVFRTLgorICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CisgICAgQUxPR1YoIm1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgOiUiIFBSSWQzMiwgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyk7CisKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICghKCppdCktPmlzSGVpYygpKSB7CkBAIC0xMzU3LDE0ICsxMzY3LDE2IEBACiB9CiAKIG9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgYm9vbCBpc0V4aWYsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LAorICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0LCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgewogICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7CiAKICAgICBpZiAodXNlUHJlZml4KSB7CiAgICAgICAgIGFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woYnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICA6OndyaXRlKG1GZCwgJmtUaWZmSGVhZGVyT2Zmc2V0LCA0KTsgLy8gZXhpZl90aWZmX2hlYWRlcl9vZmZzZXQgZmllbGQKKyAgICAgICAgaWYgKHRpZmZIZHJPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gaHRvbmwodGlmZkhkck9mZnNldCk7CisgICAgICAgICAgICA6OndyaXRlKG1GZCwgJnRpZmZIZHJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAogICAgICAgICAgICAgbU9mZnNldCArPSA0OwogICAgICAgICB9CiAKQEAgLTE3MzQsNyArMTc0Niw3IEBACiAKIHZvaWQgTVBFRzRXcml0ZXI6OnNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpIHsKICAgICBBTE9HSSgic2V0U3RhcnRUaW1lc3RhbXBVczogJSIgUFJJZDY0LCB0aW1lVXMpOwotICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICBDSEVDS19HRSh0aW1lVXMsIDBMTCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgPCAwIHx8IG1TdGFydFRpbWVzdGFtcFVzID4gdGltZVVzKSB7CiAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZVVzOwpAQCAtMTc0Nyw2ICsxNzU5LDExIEBACiAgICAgcmV0dXJuIG1TdGFydFRpbWVzdGFtcFVzOwogfQogCitpbnQzMl90IE1QRUc0V3JpdGVyOjpnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVczsKK30KKwogc2l6ZV90IE1QRUc0V3JpdGVyOjpudW1UcmFja3MoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC0xNzc2LDYgKzE3OTMsNyBAQAogICAgICAgbVN0c3NUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApKSwKICAgICAgIG1TdHRzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKSksCiAgICAgICBtQ3R0c1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCkpLAorICAgICAgbUVsc3RUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDMpKSwgLy8gUmVzZXJ2ZSAzIHJvd3MsIGEgcm93IGhhcyAzIGl0ZW1zCiAgICAgICBtTWluQ3R0c09mZnNldFRpbWVVcygwKSwKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGlja3MoMCksCiAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzKDApLApAQCAtMTc4Niw3ICsxODA0LDYgQEAKICAgICAgIG1TdGFydFRpbWVzdGFtcFVzKC0xKSwKICAgICAgIG1Sb3RhdGlvbigwKSwKICAgICAgIG1EaW1nUmVmcygiZGltZyIpLAotICAgICAgbUNkc2NSZWZzKCJjZHNjIiksCiAgICAgICBtSW1hZ2VJdGVtSWQoMCksCiAgICAgICBtSXNQcmltYXJ5KDApLAogICAgICAgbVdpZHRoKDApLApAQCAtMTg0Miw0NiArMTg1OSw0OCBAQAogCiAvLyBDbGVhciBhbGwgdGhlIGludGVybmFsIHN0YXRlcyBleGNlcHQgdGhlIENTRCBkYXRhLgogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnJlc2V0SW50ZXJuYWwoKSB7Ci0gICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKLSAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICBtR290U3RhcnRLZXlGcmFtZSA9IGZhbHNlOwotICAgICAgbUlzTWFsZm9ybWVkID0gZmFsc2U7Ci0gICAgICBtVHJhY2tEdXJhdGlvblVzID0gMDsKLSAgICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyA9IDA7Ci0gICAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IDA7Ci0gICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHN6VGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtU3Rjb1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0Y29UYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtQ282NFRhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbUNvNjRUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtQ282NFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPG9mZjY0X3QsIDE+KDEwMDApOwotICAgICAgfQotCi0gICAgICBpZiAobVN0c2NUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHNjVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobVN0c3NUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobVN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobUN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOwotICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1Eb25lID0gZmFsc2U7CisgICAgbVBhdXNlZCA9IGZhbHNlOworICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtR290U3RhcnRLZXlGcmFtZSA9IGZhbHNlOworICAgIG1Jc01hbGZvcm1lZCA9IGZhbHNlOworICAgIG1UcmFja0R1cmF0aW9uVXMgPSAwOworICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyA9IDA7CisgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSAwOworICAgIGlmIChtU3RzelRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3RzelRhYmxlRW50cmllczsKKyAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3Rjb1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3Rjb1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtQ282NFRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ282NFRhYmxlRW50cmllczsKKyAgICAgICAgbUNvNjRUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczxvZmY2NF90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHNjVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHNjVGFibGVFbnRyaWVzOworICAgICAgICBtU3RzY1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHNzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOworICAgICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOworICAgICAgICBtU3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1DdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOworICAgICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1FbHN0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1FbHN0VGFibGVFbnRyaWVzOworICAgICAgICBtRWxzdFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigzKTsKKyAgICB9CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCkgewpAQCAtMTkwMCw2ICsxOTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzLT5jb3VudCgpICogNCArICAgLy8gc3RzcyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA4ICsgICAvLyBzdHRzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDggKyAgIC8vIGN0dHMgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzLT5jb3VudCgpICogMTIgKyAgIC8vIGVsc3QgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y29Cb3hTaXplQnl0ZXMgKyAgICAgICAgICAgLy8gc3RjbyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RzekJveFNpemVCeXRlczsgICAgICAgICAgICAvLyBzdHN6IGJveCBzaXplCiAgICAgfQpAQCAtMTkzNiw2ICsxOTU2LDE2IEBACiAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChkdXJhdGlvbikpOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lRWxzdFRhYmxlRW50cnkoCisgICAgdWludDMyX3Qgc2VnbWVudER1cmF0aW9uLCBpbnQzMl90IG1lZGlhVGltZSwgaW50MTZfdCBtZWRpYVJhdGUsIGludDE2X3QgbWVkaWFSYXRlRnJhY3Rpb24pIHsKKyAgICBBTE9HVigic2VnbWVudER1cmF0aW9uOiV1LCBtZWRpYVRpbWU6JWQiLCBzZWdtZW50RHVyYXRpb24sIG1lZGlhVGltZSk7CisgICAgQUxPR1YoIm1lZGlhUmF0ZSA6JSIgUFJJZDE2ICIsIG1lZGlhUmF0ZUZyYWN0aW9uIDolIiBQUklkMTYgIiwgT3JlZCAldSIsIG1lZGlhUmF0ZSwKKyAgICAgICAgbWVkaWFSYXRlRnJhY3Rpb24sICgoKCh1aW50MzJfdCltZWRpYVJhdGUpIDw8IDE2KSB8ICgodWludDMyX3QpbWVkaWFSYXRlRnJhY3Rpb24pKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubChzZWdtZW50RHVyYXRpb24pKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKG1lZGlhVGltZSkpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoKCgodWludDMyX3QpbWVkaWFSYXRlKSA8PCAxNikgfCAodWludDMyX3QpbWVkaWFSYXRlRnJhY3Rpb24pKTsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnNldE5leHRGZChpbnQgZmQpIHsKICAgICBBTE9HVigiYWRkTmV4dEZkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTk1MCwxNSArMTk4MCwzOCBAQAogICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBhIG5ldyBGRCB5ZXQuCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgbU5leHRGZCA9IGZkOworICAgIG1OZXh0RmQgPSBkdXAoZmQpOwogICAgIHJldHVybiBPSzsKIH0KIAotYm9vbCBNUEVHNFdyaXRlcjo6VHJhY2s6OmlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzSGVpYwotICAgICAgICAgICAgJiYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiBzaXplb2Yoa0V4aWZIZWFkZXIpKQotICAgICAgICAgICAgJiYgIW1lbWNtcCgodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpOworYm9vbCBNUEVHNFdyaXRlcjo6VHJhY2s6OmlzRXhpZkRhdGEoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50MzJfdCAqdGlmZkhkck9mZnNldCkgY29uc3QgeworICAgIGlmICghbUlzSGVpYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRXhpZiBibG9jayBzdGFydGluZyB3aXRoICdFeGlmXDBcMCcKKyAgICBzaXplX3QgbGVuZ3RoID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgaWYgKChsZW5ndGggPiBzaXplb2Yoa0V4aWZIZWFkZXIpKQorICAgICAgICAmJiAhbWVtY21wKGRhdGEsIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKSkgeworICAgICAgICAqdGlmZkhkck9mZnNldCA9IHNpemVvZihrRXhpZkhlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEV4aWYgYmxvY2sgc3RhcnRpbmcgd2l0aCBmb3VyY2MgJ0V4aWYnIGZvbGxvd2VkIGJ5IEFQUDEgbWFya2VyCisgICAgaWYgKChsZW5ndGggPiBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIDIgKyBzaXplb2Yoa0V4aWZIZWFkZXIpKQorICAgICAgICAgICAgJiYgIW1lbWNtcChkYXRhLCBrRXhpZkFwcDFNYXJrZXIsIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpKQorICAgICAgICAgICAgJiYgIW1lbWNtcChkYXRhICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyAyLCBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSkpIHsKKyAgICAgICAgLy8gc2tpcCAnRXhpZicgZm91cmNjCisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDQsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKKworICAgICAgICAvLyAyLWJ5dGUgQVBQMSArIDItYnl0ZSBzaXplIGZvbGxvd2VkIGJ5IGtFeGlmSGVhZGVyCisgICAgICAgICp0aWZmSGRyT2Zmc2V0ID0gMiArIDIgKyBzaXplb2Yoa0V4aWZIZWFkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCkgewpAQCAtMTk4NCw3ICsyMDM3LDcgQEAKICAgICB9CiAKICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICBtQ2RzY1JlZnMudmFsdWUucHVzaF9iYWNrKG1Pd25lci0+YWRkSXRlbV9sKHsKKyAgICAgICAgIG1FeGlmTGlzdC5wdXNoX2JhY2sobU93bmVyLT5hZGRJdGVtX2woewogICAgICAgICAgICAgLml0ZW1UeXBlID0gIkV4aWYiLAogICAgICAgICAgICAgLmlzUHJpbWFyeSA9IGZhbHNlLAogICAgICAgICAgICAgLmlzSGlkZGVuID0gZmFsc2UsCkBAIC0yMDg3LDcgKzIxNDAsMTYgQEAKIAogICAgIGlmIChtSW1hZ2VJdGVtSWQgPiAwKSB7CiAgICAgICAgIG1Pd25lci0+YWRkUmVmc19sKG1JbWFnZUl0ZW1JZCwgbURpbWdSZWZzKTsKLSAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtQ2RzY1JlZnMpOworCisgICAgICAgIGlmICghbUV4aWZMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSAiY2RzYyIgcmVmIGlzIGZyb20gdGhlIG1ldGFkYXRhL2V4aWYgaXRlbSB0byB0aGUgaW1hZ2UgaXRlbS4KKyAgICAgICAgICAgIC8vIFNvIHRoZSByZWZzIGFsbCBjb250YWluIHRoZSBpbWFnZSBpdGVtLgorICAgICAgICAgICAgSXRlbVJlZnMgY2RzY1JlZnMoImNkc2MiKTsKKyAgICAgICAgICAgIGNkc2NSZWZzLnZhbHVlLnB1c2hfYmFjayhtSW1hZ2VJdGVtSWQpOworICAgICAgICAgICAgZm9yICh1aW50MTZfdCBleGlmSXRlbSA6IG1FeGlmTGlzdCkgeworICAgICAgICAgICAgICAgIG1Pd25lci0+YWRkUmVmc19sKGV4aWZJdGVtLCBjZHNjUmVmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTIxMTcsMTEgKzIxNzksMTEgQEAKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTd2l0Y2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRTZXNzaW9uKCk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICBpbnQgZmQgPSBtTmV4dEZkOwogICAgICAgICAgICAgbU5leHRGZCA9IC0xOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBmaW5pc2hDdXJyZW50U2Vzc2lvbigpOwogICAgICAgICAgICAgaW5pdEludGVybmFsKGZkLCBmYWxzZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogICAgICAgICAgICAgc3RhcnQobVN0YXJ0TWV0YS5nZXQoKSk7CiAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOwpAQCAtMjE3Myw2ICsyMjM1LDcgQEAKICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOwogICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CiAKICAgICBtU3RzelRhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBOVUxMOwpAQCAtMjE4MSw2ICsyMjQ0LDcgQEAKICAgICBtU3R0c1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1DdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKKyAgICBtRWxzdFRhYmxlRW50cmllcyA9IE5VTEw7CiAKICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhICE9IE5VTEwpIHsKICAgICAgICAgZnJlZShtQ29kZWNTcGVjaWZpY0RhdGEpOwpAQCAtMjIzNywxNCArMjMwMSwxNiBAQAogICAgIHdoaWxlICghY2h1bmstPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPjo6aXRlcmF0b3IgaXQgPSBjaHVuay0+bVNhbXBsZXMuYmVnaW4oKTsKIAotICAgICAgICBpbnQzMl90IGlzRXhpZjsKLSAgICAgICAgaWYgKCEoKml0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0V4aWYsICZpc0V4aWYpKSB7Ci0gICAgICAgICAgICBpc0V4aWYgPSAwOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0OworICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoCisgICAgICAgICAgICAgICAga0tleUV4aWZUaWZmT2Zmc2V0LCAoaW50MzJfdCopJnRpZmZIZHJPZmZzZXQpKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgfQorICAgICAgICBib29sIGlzRXhpZiA9ICh0aWZmSGRyT2Zmc2V0ID4gMCk7CiAgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gY2h1bmstPm1UcmFjay0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKIAogICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOwotICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCB0aWZmSGRyT2Zmc2V0LCAmYnl0ZXNXcml0dGVuKTsKIAogICAgICAgICBpZiAoY2h1bmstPm1UcmFjay0+aXNIZWljKCkpIHsKICAgICAgICAgICAgIGNodW5rLT5tVHJhY2stPmFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuLCBpc0V4aWYpOwpAQCAtMjg0OSwxNCArMjkxNSwxOCBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6ZHVtcFRpbWVTdGFtcHMoKSB7Ci0gICAgQUxPR0UoIkR1bXBpbmcgJXMgdHJhY2sncyBsYXN0IDEwIGZyYW1lcyB0aW1lc3RhbXAgYW5kIGZyYW1lIHR5cGUgIiwgZ2V0VHJhY2tUeXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIHRpbWVTdGFtcFN0cmluZzsKLSAgICBmb3IgKHN0ZDo6bGlzdDxUaW1lc3RhbXBEZWJ1Z0hlbHBlckVudHJ5Pjo6aXRlcmF0b3IgZW50cnkgPSBtVGltZXN0YW1wRGVidWdIZWxwZXIuYmVnaW4oKTsKLSAgICAgICAgICAgIGVudHJ5ICE9IG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5lbmQoKTsgKytlbnRyeSkgewotICAgICAgICB0aW1lU3RhbXBTdHJpbmcgKz0gIigiICsgc3RkOjp0b19zdHJpbmcoZW50cnktPnB0cykrCi0gICAgICAgICAgICAgICAgInVzLCAiICsgc3RkOjp0b19zdHJpbmcoZW50cnktPmR0cykgKyAidXMgIiArIGVudHJ5LT5mcmFtZVR5cGUgKyAiKSAiOworICAgIGlmICghbVRpbWVzdGFtcERlYnVnSGVscGVyLmVtcHR5KCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGltZVN0YW1wU3RyaW5nID0gIkR1bXBpbmcgIiArIHN0ZDo6c3RyaW5nKGdldFRyYWNrVHlwZSgpKSArICIgdHJhY2sncyBsYXN0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhtVGltZXN0YW1wRGVidWdIZWxwZXIuc2l6ZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJhbWVzJyB0aW1lc3RhbXBzKHB0cywgZHRzKSBhbmQgZnJhbWUgdHlwZSA6ICI7CisgICAgICAgIGZvciAoY29uc3QgVGltZXN0YW1wRGVidWdIZWxwZXJFbnRyeSYgZW50cnkgOiBtVGltZXN0YW1wRGVidWdIZWxwZXIpIHsKKyAgICAgICAgICAgIHRpbWVTdGFtcFN0cmluZyArPSAiXG4oIiArIHN0ZDo6dG9fc3RyaW5nKGVudHJ5LnB0cykgKyAidXMsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGVudHJ5LmR0cykgKyAidXMgIiArIGVudHJ5LmZyYW1lVHlwZSArICIpICI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoIiVzIiwgdGltZVN0YW1wU3RyaW5nLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIwIGZyYW1lcyB0byBkdW1wIHRpbWVTdGFtcHMgaW4gJXMgdHJhY2sgIiwgZ2V0VHJhY2tUeXBlKCkpOwogICAgIH0KLSAgICBBTE9HRSgiJXMiLCB0aW1lU3RhbXBTdHJpbmcuY19zdHIoKSk7CiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6dGhyZWFkRW50cnkoKSB7CkBAIC0yOTcwLDEwICszMDQwLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBib29sIGlzRXhpZiA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgaW50MzJfdCBpc011eGVyRGF0YTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc011eGVyRGF0YSwgJmlzTXV4ZXJEYXRhKSAmJiBpc011eGVyRGF0YSkgewogICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG9uZSB0eXBlIG9mIG11eGVyIGRhdGEsIHdoaWNoIGlzIEV4aWYgZGF0YSBibG9jay4KLSAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIGlzRXhpZiA9IGlzRXhpZkRhdGEoYnVmZmVyLCAmdGlmZkhkck9mZnNldCk7CiAgICAgICAgICAgICBpZiAoIWlzRXhpZikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBiYWQgRXhpZiBkYXRhIGJsb2NrIik7CiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yOTk1LDcgKzMwNjYsNyBAQAogICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0V4aWYsIDEpOworICAgICAgICAgICAgY29weS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUV4aWZUaWZmT2Zmc2V0LCB0aWZmSGRyT2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBib29sIHVzZVByZWZpeCA9IHRoaXMtPnVzZVByZWZpeCgpICYmICFpc0V4aWY7CiAKQEAgLTMwNjAsMTQgKzMxMzEsMTQgQEAKICAgICAgICAgaWYgKCFtSXNIZWljKSB7CiAgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVSZWFsVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyh0aW1lc3RhbXBVcyk7CiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKLSAgICAgICAgICAgICAgICBtT3duZXItPnNldFN0YXJ0VGltZXN0YW1wVXMobVN0YXJ0VGltZXN0YW1wVXMpOwogICAgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IG1TdGFydFRpbWVzdGFtcFVzOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVJlc3VtZWQpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMExMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKQEAgLTMwODgsNyArMzE1OSw3IEBACiAgICAgICAgICAgICBUaW1lc3RhbXBEZWJ1Z0hlbHBlckVudHJ5IHRpbWVzdGFtcERlYnVnRW50cnk7CiAgICAgICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CiAgICAgICAgICAgICB0aW1lc3RhbXBEZWJ1Z0VudHJ5LnB0cyA9IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CiAgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwpAQCAtMzEyNyw3ICszMTk4LDcgQEAKIAogICAgICAgICAgICAgICAgIGN0dHNPZmZzZXRUaW1lVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgKyBrTWF4Q3R0c09mZnNldFRpbWVVcyAtIGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdHRzT2Zmc2V0VGltZVVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3R0c09mZnNldFRpbWVVcyA+PSAwTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwpAQCAtMzE4NSw3ICszMjU2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMExMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgewogICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKQEAgLTMyMDYsNyArMzI3Nyw3IEBACiAgICAgICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9CiAgICAgICAgICAgICAgICAgKCh0aW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwgLQogICAgICAgICAgICAgICAgICAgICAobGFzdFRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7Ci0gICAgICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKKyAgICAgICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJkbyBub3Qgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgZnJhbWVzICh0aW1lc3RhbXA6ICVsbGQgPCBsYXN0OiAlbGxkIGZvciAlcyB0cmFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcFVzLCAobG9uZyBsb25nKWxhc3RUaW1lc3RhbXBVcywgdHJhY2tOYW1lKTsKICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CkBAIC0zMjY4LDcgKzMzMzksOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghaGFzTXVsdGlwbGVUcmFja3MpIHsKICAgICAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtT3duZXItPmFkZFNhbXBsZV9sKAorICAgICAgICAgICAgICAgICAgICBjb3B5LCB1c2VQcmVmaXgsIHRpZmZIZHJPZmZzZXQsICZieXRlc1dyaXR0ZW4pOwogCiAgICAgICAgICAgICBpZiAobUlzSGVpYykgewogICAgICAgICAgICAgICAgIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuLCBpc0V4aWYpOwpAQCAtMzUyNiw3ICszNTk4LDcgQEAKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldER1cmF0aW9uVXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1UcmFja0R1cmF0aW9uVXMgKyBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKTsKKyAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsgbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldEVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzKCkgY29uc3QgewpAQCAtMzYxMiw2ICszNjg0LDcgQEAKICAgICB1aW50MzJfdCBub3cgPSBnZXRNcGVnNFRpbWUoKTsKICAgICBtT3duZXItPmJlZ2luQm94KCJ0cmFrIik7CiAgICAgICAgIHdyaXRlVGtoZEJveChub3cpOworICAgICAgICB3cml0ZUVkdHNCb3goKTsKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWRpYSIpOwogICAgICAgICAgICAgd3JpdGVNZGhkQm94KG5vdyk7CiAgICAgICAgICAgICB3cml0ZUhkbHJCb3goKTsKQEAgLTM2NzQsNiArMzc0NywyOSBAQAogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KICAgICBtT3duZXItPmJlZ2luQm94KGZvdXJjYyk7ICAgIC8vIFRleHRNZXRhRGF0YVNhbXBsZUVudHJ5CisKKyAgICAvLyAgSEFDSyB0byBtYWtlIHRoZSBtZXRhZGF0YSB0cmFjayBjb21wbGlhbnQgd2l0aCB0aGUgSVNPIHN0YW5kYXJkLgorICAgIC8vCisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGlzIGFkZGVkIGZyb20gQVBJIDI2IGFuZCB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZG9lcyBub3QKKyAgICAvLyAgZnVsbHkgZm9sbG93ZWQgdGhlIFRleHRNZXRhRGF0YVNhbXBsZUVudHJ5IHNwZWNpZmllZCBpbiBJU08vSUVDIDE0NDk2LTEyLTIwMTUKKyAgICAvLyAgaW4gdGhhdCBvbmx5IHRoZSBtaW1lX2Zvcm1hdCBpcyB3cml0dGVuIG91dC4gY29udGVudF9lbmNvZGluZyBhbmQKKyAgICAvLyAgZGF0YV9yZWZlcmVuY2VfaW5kZXggaGF2ZSBub3QgYmVlbiB3cml0dGVuIG91dC4gVGhpcyBsZWFkcyB0byB0aGUgZmFpbHVyZQorICAgIC8vICB3aGVuIHNvbWUgTVA0IHBhcnNlciB0cmllcyB0byBwYXJzZSB0aGUgbWV0YWRhdGEgdHJhY2sgYWNjb3JkaW5nIHRvIHRoZQorICAgIC8vICBzdGFuZGFyZC4gVGhlIGhhY2sgaGVyZSB3aWxsIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZQorICAgIC8vICBzdGFuZGFyZCB3aGlsZSBzdGlsbCBtYWludGFpbmluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyB3b3VsZCBlbmFibGUKKyAgICAvLyAgQW5kcm9pZCB2ZXJzaW9ucyBiZWZvcmUgQVBJIDI5IHRvIGJlIGFibGUgdG8gcmVhZCBvdXQgdGhlIHN0YW5kYXJkIGNvbXBsaWFudAorICAgIC8vICBNZXRhZGF0YSB0cmFjayBnZW5lcmF0ZWQgd2l0aCBBbmRyb2lkIEFQSSAyOSBhbmQgdXB3YXJkLiBUaGUgdHJpY2sgaXMgYmFzZWQKKyAgICAvLyAgb24gdGhlIGZhY3QgdGhhdCB0aGUgTWV0YWRhdGEgdHJhY2sgbXVzdCBzdGFydCB3aXRoIHByZWZpeCDigJxhcHBsaWNhdGlvbi/igJ0gYW5kCisgICAgLy8gIHRob3NlIG1pc3NpbmcgZmllbGRzIGFyZSBub3QgdXNlZCBpbiBBbmRyb2lkJ3MgTWV0YWRhdGEgdHJhY2suIEJ5IHdyaXR0aW5nCisgICAgLy8gIG91dCB0aGUgbWltZV9mb3JtYXQgdHdpY2UsIHRoZSBmaXJzdCBtaW1lX2Zvcm1hdCB3aWxsIGJlIHVzZWQgdG8gZmlsbCBvdXQgdGhlCisgICAgLy8gIG1pc3NpbmcgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGZpZWxkcy4gT24gdGhlCisgICAgLy8gIHBhcnNlciBzaWRlLCB0aGUgZXh0cmFjdGVyIGJlZm9yZSBBUEkgMjkgIHdpbGwgcmVhZCBvdXQgdGhlIGZpcnN0IG1pbWVfZm9ybWF0CisgICAgLy8gIGNvcnJlY3RseSBhbmQgZHJvcCB0aGUgc2Vjb25kIG1pbWVfZm9ybWF0LiBUaGUgZXh0cmFjdG9yIGZyb20gQVBJIDI5IHdpbGwKKyAgICAvLyAgY2hlY2sgaWYgdGhlIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCBhbmQgY29udGVudCBlbmNvZGluZyBhcmUgZmlsbGVkCisgICAgLy8gIHdpdGgg4oCcYXBwbGljYXRpb27igJ0gdG8gZGV0ZWN0IGlmIHRoaXMgaXMgYSBzdGFuZGFyZCBjb21wbGlhbnQgbWV0YWRhdGEgdHJhY2sKKyAgICAvLyAgYW5kIHJlYWQgb3V0IHRoZSBkYXRhIGFjY29yZGluZ2x5LgorICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKG1pbWUpOworCiAgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7ICAvLyBtZXRhZGF0YSBtaW1lX2Zvcm1hdAogICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIG1ldHQKIH0KQEAgLTM3ODcsMjIgKzM4ODMsNTIgQEAKICAgICBtT3duZXItPmVuZEJveCgpOwogfQogCitzdGF0aWMgdm9pZCBnZW5lcmF0ZUVzZHNTaXplKHNpemVfdCBkYXRhTGVuZ3RoLCBzaXplX3QqIHNpemVHZW5lcmF0ZWQsIHVpbnQ4X3QqIGJ1ZmZlcikgeworICAgIHNpemVfdCBvZmZzZXQgPSAwLCBjdXIgPSAwOworICAgIHNpemVfdCBtb3JlID0gMHgwMDsKKyAgICAqc2l6ZUdlbmVyYXRlZCA9IDA7CisgICAgLyogU3RhcnQgd2l0aCB0aGUgTFNCKDcgYml0cykgb2YgZGF0YUxlbmd0aCBhbmQgYnVpbGQgdGhlIGJ5dGUgc2VxdWVuY2UgdXB0byBNU0IuCisgICAgICogQ29udGludWF0aW9uIGZsYWcobW9zdCBzaWduaWZpY2FudCBiaXQpIHdpbGwgYmUgc2V0IG9uIHRoZSBmaXJzdCBOLTEgYnl0ZXMuCisgICAgICovCisgICAgZG8geworICAgICAgICBidWZmZXJbY3VyKytdID0gKGRhdGFMZW5ndGggJiAweDdmKSB8IG1vcmU7CisgICAgICAgIGRhdGFMZW5ndGggPj49IDc7CisgICAgICAgIG1vcmUgPSAweDgwOworICAgICAgICArKygqc2l6ZUdlbmVyYXRlZCk7CisgICAgfSB3aGlsZSAoZGF0YUxlbmd0aCA+IDB1KTsKKyAgICAtLWN1cjsKKyAgICAvLyBSZXZlcnNlIHRoZSBuZXdseSBmb3JtZWQgYnl0ZSBzZXF1ZW5jZS4KKyAgICB3aGlsZSAoY3VyID4gb2Zmc2V0KSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gYnVmZmVyW2N1cl07CisgICAgICAgIGJ1ZmZlcltjdXItLV0gPSBidWZmZXJbb2Zmc2V0XTsKKyAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHRtcDsKKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1wNGFFc2RzQm94KCkgewotICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOwogICAgIENIRUNLX0dUKG1Db2RlY1NwZWNpZmljRGF0YVNpemUsIDB1KTsKIAotICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCi0gICAgQ0hFQ0tfTFQobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIDIzLCAxMjh1KTsKKyAgICB1aW50OF90IHNpemVFU0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRENEQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHVpbnQ4X3Qgc2l6ZURTSUJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICBzaXplX3Qgc2l6ZUVTRCA9IDA7CisgICAgc2l6ZV90IHNpemVEQ0QgPSAwOworICAgIHNpemVfdCBzaXplRFNJID0gMDsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUsICZzaXplRFNJLCBzaXplRFNJQnVmZmVyKTsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKyBzaXplRFNJICsgMTQsICZzaXplRENELCBzaXplRENEQnVmZmVyKTsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKyBzaXplRFNJICsgc2l6ZURDRCArIDIxLCAmc2l6ZUVTRCwgc2l6ZUVTREJ1ZmZlcik7CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJlc2RzIik7CiAKICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKICAgICBtT3duZXItPndyaXRlSW50OCgweDAzKTsgICAvLyBFU19EZXNjclRhZwotICAgIG1Pd25lci0+d3JpdGVJbnQ4KDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgbU93bmVyLT53cml0ZShzaXplRVNEQnVmZmVyLCBzaXplRVNEKTsKICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsvLyBFU19JRAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOwogCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEQ0RCdWZmZXIsIHNpemVEQ0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4NDApOyAgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTUpOyAgIC8vIHN0cmVhbVR5cGUgQXVkaW9TdHJlYW0KIApAQCAtMzgxNyw3ICszOTQzLDcgQEAKICAgICBtT3duZXItPndyaXRlSW50MzIoYXZnQml0cmF0ZSk7CiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDA1KTsgICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgbU93bmVyLT53cml0ZShzaXplRFNJQnVmZmVyLCBzaXplRFNJKTsKICAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKQEAgLTM4MzQsMjAgKzM5NjAsMjcgQEAKICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOwogICAgIENIRUNLX0dUKG1Db2RlY1NwZWNpZmljRGF0YVNpemUsIDB1KTsKIAotICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCi0gICAgQ0hFQ0tfTFQoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplLCAxMjh1KTsKKyAgICB1aW50OF90IHNpemVFU0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRENEQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHVpbnQ4X3Qgc2l6ZURTSUJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICBzaXplX3Qgc2l6ZUVTRCA9IDA7CisgICAgc2l6ZV90IHNpemVEQ0QgPSAwOworICAgIHNpemVfdCBzaXplRFNJID0gMDsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUsICZzaXplRFNJLCBzaXplRFNJQnVmZmVyKTsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKyBzaXplRFNJICsgMTQsICZzaXplRENELCBzaXplRENEQnVmZmVyKTsKKyAgICBnZW5lcmF0ZUVzZHNTaXplKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKyBzaXplRFNJICsgc2l6ZURDRCArIDIxLCAmc2l6ZUVTRCwgc2l6ZUVTREJ1ZmZlcik7CiAKICAgICBtT3duZXItPmJlZ2luQm94KCJlc2RzIik7CiAKICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAogCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMyk7ICAvLyBFU19EZXNjclRhZwotICAgIG1Pd25lci0+d3JpdGVJbnQ4KDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgbU93bmVyLT53cml0ZShzaXplRVNEQnVmZmVyLCBzaXplRVNEKTsKICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsgIC8vIEVTX0lECiAgICAgbU93bmVyLT53cml0ZUludDgoMHgxZik7CiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDA0KTsgIC8vIERlY29kZXJDb25maWdEZXNjclRhZwotICAgIG1Pd25lci0+d3JpdGVJbnQ4KDE1ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgbU93bmVyLT53cml0ZShzaXplRENEQnVmZmVyLCBzaXplRENEKTsKICAgICBtT3duZXItPndyaXRlSW50OCgweDIwKTsgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTEpOyAgLy8gc3RyZWFtVHlwZSBWaXN1YWxTdHJlYW0KIApAQCAtMzg2NSw3ICszOTk4LDcgQEAKIAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgLy8gRGVjb2RlclNwZWNpZmljSW5mb1RhZwogCi0gICAgbU93bmVyLT53cml0ZUludDgobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisgICAgbU93bmVyLT53cml0ZShzaXplRFNJQnVmZmVyLCBzaXplRFNJKTsKICAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKQEAgLTM5NTksNiArNDA5MiwzMyBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUVkdHNCb3goKXsKKyAgICBBTE9HVigiJXMgOiBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMgb2YgdHJhY2s6JSIgUFJJZDY0ICIgdXMiLCBnZXRUcmFja1R5cGUoKSwKKyAgICAgICAgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkpOworCisgICAgLy8gUHJlcG9uZSB2aWRlbyBwbGF5YmFjay4KKyAgICBpZiAobU1pbkN0dHNPZmZzZXRUaWNrcyAhPSBtTWF4Q3R0c09mZnNldFRpY2tzKSB7CisgICAgICAgIGludDMyX3QgbXZoZFRpbWVTY2FsZSA9IG1Pd25lci0+Z2V0VGltZVNjYWxlKCk7CisgICAgICAgIHVpbnQzMl90IHRraGREdXJhdGlvbiA9IChnZXREdXJhdGlvblVzKCkgKiBtdmhkVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWUgPSAoKGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZ2V0TWluQ3R0c09mZnNldFRpbWVVcygpKQorICAgICAgICAgICAgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgaWYgKHRraGREdXJhdGlvbiA+IDAgJiYgbWVkaWFUaW1lID4gMCkgeworICAgICAgICAgICAgYWRkT25lRWxzdFRhYmxlRW50cnkodGtoZER1cmF0aW9uLCBtZWRpYVRpbWUsIDEsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1FbHN0VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Pd25lci0+YmVnaW5Cb3goImVkdHMiKTsKKyAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZWxzdCIpOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICAgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzLT53cml0ZShtT3duZXIpOworICAgICAgICBtT3duZXItPmVuZEJveCgpOyAvLyBlbHN0OworICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVkdHMKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTWRoZEJveCh1aW50MzJfdCBub3cpIHsKICAgICBpbnQ2NF90IHRyYWtEdXJhdGlvblVzID0gZ2V0RHVyYXRpb25VcygpOwogICAgIGludDY0X3QgbWRoZER1cmF0aW9uID0gKHRyYWtEdXJhdGlvblVzICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CkBAIC00MDk1LDcgKzQyNTUsOSBAQAogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKICAgICAgICAgQ0hFQ0sobVN0dHNUYWJsZUVudHJpZXMtPmdldChkdXJhdGlvbiwgMSkpOwogICAgICAgICBkdXJhdGlvbiA9IGh0b25sKGR1cmF0aW9uKTsgIC8vIEJhY2sgdG8gaG9zdCBieXRlIG9yZGVyCi0gICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoZHVyYXRpb24gKyBnZXRTdGFydFRpbWVPZmZzZXRTY2FsZWRUaW1lKCkpLCAxKTsKKyAgICAgICAgaW50MzJfdCBzdGFydFRpbWVPZmZzZXRTY2FsZWQgPSAoKChnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSArCisgICAgICAgICAgICBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpKSAqIG1UaW1lU2NhbGUpICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+c2V0KGh0b25sKChpbnQzMl90KWR1cmF0aW9uICsgc3RhcnRUaW1lT2Zmc2V0U2NhbGVkKSwgMSk7CiAgICAgfQogICAgIG1TdHRzVGFibGVFbnRyaWVzLT53cml0ZShtT3duZXIpOwogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCmluZGV4IDQxZGJmZDQuLjRmOWJjNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCkBAIC0yOCw3ICsyOCw3IEBACiAKIC8vIE1heGltdW0gYWxsb3dlZCB0aW1lIGJhY2t3YXJkcyBmcm9tIGFuY2hvciBjaGFuZ2UuCiAvLyBJZiBsYXJnZXIgdGhhbiB0aGlzIHRocmVzaG9sZCwgaXQncyB0cmVhdGVkIGFzIGRpc2NvbnRpbnVpdHkuCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMgPSAxMDAwMGxsOworc3RhdGljIGNvbnN0IGludDY0X3Qga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzID0gMTAwMDBMTDsKIAogTWVkaWFDbG9jazo6VGltZXI6OlRpbWVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IGFkanVzdFJlYWxVcykKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyAhPSAtMSkgewogICAgICAgICBpbnQ2NF90IG9sZE5vd01lZGlhVXMgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMKKyAgICAgICAgaWYgKG5vd01lZGlhVXMgPCBvbGROb3dNZWRpYVVzICsga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzCiAgICAgICAgICAgICAgICAgJiYgbm93TWVkaWFVcyA+IG9sZE5vd01lZGlhVXMgLSBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCAzNTNlNDA3Li5mNTc5ZTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtNTUwLDcgKzU1MCw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7CiAgICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtDb2RlY0tleU5hbWUpOwogICAgIH0KIAogICAgIG1MYXRlbmN5SGlzdC5zZXR1cChrTGF0ZW5jeUhpc3RCdWNrZXRzLCBrTGF0ZW5jeUhpc3RXaWR0aCwga0xhdGVuY3lIaXN0Rmxvb3IpOwpAQCAtODYyLDkgKzg2Miw5IEBACiAvL3N0YXRpYwogc3A8Q29kZWNCYXNlPiBNZWRpYUNvZGVjOjpHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpIHsKICAgICBpZiAob3duZXIpIHsKLSAgICAgICAgaWYgKHN0cm5jbXAob3duZXIsICJkZWZhdWx0IiwgOCkgPT0gMCkgeworICAgICAgICBpZiAoc3RyY21wKG93bmVyLCAiZGVmYXVsdCIpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQUNvZGVjOwotICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3duZXIsICJjb2RlYzIiLCA3KSA9PSAwKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDYpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDQ29kZWMoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkxMSwxMCArOTExLDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOwotICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7Ci0gICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMDUyLDggKzEwNTIsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93IGluIGRvd25zdHJlYW0gY29kZS4KLSAgICAgICAgaWYgKCh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHNpemUgaXMgdG9vIGJpZywgd2lkdGg9JWQsIGhlaWdodD0lZCIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDAgfHwKKyAgICAgICAgICAgICAgICh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQpAQCAtMTExMiw2ICsxMTEzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTY1OCwxMCArMTY2MCwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGludDMyX3QgY29sb3JGb3JtYXQ7Ci0gICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTAotICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpCisgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKQogICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpCi0gICAgICAgICAgICAmJiAoY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSkgeworICAgICAgICAgICAgLy8gY2hlY2sgZm9ybWF0IGZvciBPTVggb25seSwgZm9yIEMyIHRoZSBmb3JtYXQgaXMgYWx3YXlzIG9wYXF1ZSBzaW5jZSB0aGUKKyAgICAgICAgICAgIC8vIHNvZnR3YXJlIHJlbmRlcmluZyBkb2Vzbid0IGdvIHRocm91Z2ggY2xpZW50CisgICAgICAgICAgICAmJiAoKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCAmJiBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpCisgICAgICAgICAgICAgICAgICAgIHx8IG1Pd25lck5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY29kZWMyOjpzb2Z0d2FyZSIpKSkgewogICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgd2lkdGgsIGhlaWdodDsKICAgICAgICAgaW50NjRfdCB0b3RhbFBpeGVsID0gMDsKICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKQEAgLTE4MjksOCArMTgzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4gSWYgd2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCwgd2UnbGwgdGltZW91dCBhbmQgZm9yY2UgcmVsZWFzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUT1BQSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CkBAIC0xOTMzLDYgKzE5MzcsMTMgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDb21wb25lbnRBbGxvY2F0ZWQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3Igb3Iga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhbGxvY2F0ZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWklORyk7CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0xOTUwLDYgKzE5NjEsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Pd25lck5hbWUgPSBvd25lcjsKIAogICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlIHJlc291cmNlVHlwZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db21wb25lbnROYW1lLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKQEAgLTE5NzMsMTAgKzE5ODUsMTEgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDb21wb25lbnRDb25maWd1cmVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3IgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkIHdpdGggZXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3Igb3Iga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3IsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ3VyZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKQEAgLTE5ODYsNiArMTk5OSwxMyBAQAogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsICZtSW5wdXRGb3JtYXQpKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsICZtT3V0cHV0Rm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gY29uZmlybWluZyB0aGUgb3B0LWluIGJlaGF2aW9yIHRvIG1pbmltaXplIGFueSBiZWhhdmlvcmFsIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UgIT0gbnVsbHB0ciAmJiAhbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIGZyYW1lIGRyb3BwaW5nIG1vZGUgaW4gdGhlIGlucHV0IGZvcm1hdCBhcyB0aGlzIG1heSBhbHNvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFuaW5nZnVsIGFuZCBjb25mdXNpbmcgZm9yIGFuIGVuY29kZXIgaW4gYSB0cmFuc2NvZGVyIHNjZW5hcmlvCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJhbGxvdy1mcmFtZS1kcm9wIiwgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY29uZmlndXJlZCBhcyBpbnB1dCBmb3JtYXQ6ICVzLCBvdXRwdXQgZm9ybWF0OiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDQpLmNfc3RyKCksCkBAIC0yMDY3LDYgKzIwODcsMTMgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTdGFydENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydCBpbnRlcnJ1cHRlZCBieSByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFSVElORyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2UoCkBAIC0yMTk3LDcgKzIyMjQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1TdXJmYWNlLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNDAzLDYgKzI0MzgsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiYWxsb3ctZnJhbWUtZHJvcCIsICZtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmcmFtZSBkcm9wcGluZyBieSBzdXJmYWNlIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBvYmopOwogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGhhbmRsZVNldFN1cmZhY2Uoc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yNDEwLDYgKzI0NTAsOSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBub3QgdXNpbmcgc3VyZmFjZSBzbyB0aGlzIHZhcmlhYmxlIGlzIG5vdCB1c2VkLCBidXQgaW5pdGlhbGl6ZSBzZW5zaWJseSBhbnl3YXkKKyAgICAgICAgICAgICAgICBtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlID0gZmFsc2U7CisKICAgICAgICAgICAgICAgICBoYW5kbGVTZXRTdXJmYWNlKE5VTEwpOwogICAgICAgICAgICAgfQogCkBAIC0yNDg1LDYgKzI1MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUZsYWdzICYga0ZsYWdQdXNoQmxhbmtCdWZmZXJzT25TaHV0ZG93bikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3cobVN1cmZhY2UuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKHN1cmZhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYyNSwxMSArMjY2OSwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgb3Igd2UncmUgc3RvcHBpbmcgYnV0IHJlY2VpdmVkIGEgcmVsZWFzZQotICAgICAgICAgICAgLy8gcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkgZm9yIHRoZSBwZW5kaW5nIGNhbGwgZmlyc3QsIGFuZCBjb25zaWRlcgotICAgICAgICAgICAgLy8gaXQgZG9uZS4gVGhlIHJlcGx5IHRva2VuIHdpbGwgYmUgcmVwbGFjZWQgYWZ0ZXIgdGhpcywgYW5kIHdlJ2xsCi0gICAgICAgICAgICAvLyBubyBsb25nZXIgYmUgYWJsZSB0byByZXBseS4KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hJTkcgfHwgbVN0YXRlID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgc3RvcHBpbmcsIGNvbmZpZ3VyaW5nIG9yIHN0YXJ0aW5nICBidXQKKyAgICAgICAgICAgIC8vIHJlY2VpdmVkIGEgcmVsZWFzZSByZXF1ZXN0LCBwb3N0IHRoZSByZXBseSBmb3IgdGhlIHBlbmRpbmcgY2FsbAorICAgICAgICAgICAgLy8gZmlyc3QsIGFuZCBjb25zaWRlciBpdCBkb25lLiBUaGUgcmVwbHkgdG9rZW4gd2lsbCBiZSByZXBsYWNlZAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcywgYW5kIHdlJ2xsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHJlcGx5LgorICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORyB8fCBtU3RhdGUgPT0gU1RPUFBJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IENPTkZJR1VSSU5HIHx8IG1TdGF0ZSA9PSBTVEFSVElORykgewogICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgfQogCkBAIC0yNjc0LDcgKzI3MTksNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVJbnB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjY5Miw3ICsyNzM3LDcgQEAKICAgICAgICAgICAgIGludDY0X3QgdGltZW91dFVzOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVvdXRVcyIsICZ0aW1lb3V0VXMpKTsKIAotICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA9PSAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMExMKSB7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIC1FQUdBSU4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjcwMCw3ICsyNzQ1LDcgQEAKICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IHJlcGx5SUQ7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwTEwpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dE1zZyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVJbnB1dFRpbWVkT3V0LCB0aGlzKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0TXNnLT5zZXRJbnQzMigKQEAgLTI3NjYsNyArMjgxMSw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXRVczsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7CisgICAgICAgICAgICBpZiAodGltZW91dFVzID09IDBMTCkgewogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCAtRUFHQUlOKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI3NzQsNyArMjgxOSw3IEBACiAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZzsKICAgICAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IHJlcGx5SUQ7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwTEwpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dE1zZyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVPdXRwdXRUaW1lZE91dCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgdGltZW91dE1zZy0+c2V0SW50MzIoCkBAIC0zMDM1LDcgKzMwODAsNyBAQAogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBidWZmZXJJbmRleCk7CiAgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCAwKTsKICAgICBtc2ctPnNldFNpemUoInNpemUiLCBjc2QtPnNpemUoKSk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCAwTEwpOwogICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCAmZXJyb3JEZXRhaWxNc2cpOwogCkBAIC0zNDAwLDYgKzM0NDUsMTAgQEAKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgibmF0aXZlV2luZG93Q29ubmVjdCByZXR1cm5lZCBhbiBlcnJvcjogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgZGlzYWJsZUxlZ2FjeUJ1ZmZlckRyb3BQb3N0UShzdXJmYWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICAvLyBkbyBub3QgcmV0dXJuIEFMUkVBRFlfRVhJU1RTIHVubGVzcyBzdXJmYWNlcyBhcmUgdGhlIHNhbWUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBlYWZmMjgzLi4zZDU4ZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgcmV0dXJuIHByb2ZpbGluZ05lZWRlZDsKIH0KIAotT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVyOworT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVye3RydWUgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OworT214SW5mb0J1aWxkZXIgc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcntmYWxzZSAvKiBhbGxvd1N1cmZhY2VFbmNvZGVycyAqL307CiAKIE11dGV4IHNDb2RlYzJJbmZvQnVpbGRlck11dGV4Owogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U+IHNDb2RlYzJJbmZvQnVpbGRlcjsKQEAgLTk4LDcgKzk5LDExIEBACiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2VUZXN0ID0KICAgICAgICAgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOwogICAgIGlmIChzdXJmYWNlVGVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBhbGwgT01YIGNvZGVjcyIpOwogICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhJbmZvQnVpbGRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkFsbG93aW5nIG9ubHkgbm9uLXN1cmZhY2UtZW5jb2RlciBPTVggY29kZWNzIik7CisgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcik7CiAgICAgfQogICAgIGJ1aWxkZXJzLnB1c2hfYmFjayhHZXRDb2RlYzJJbmZvQnVpbGRlcigpKTsKICAgICByZXR1cm4gYnVpbGRlcnM7CkBAIC0yMTUsMTQgKzIyMCwyNSBAQAogICAgICAgICAgICAgbUNvZGVjSW5mb3MuYmVnaW4oKSwKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmVuZCgpLAogICAgICAgICAgICAgW10oY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMSwgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvMikgewotICAgICAgICAgICAgICAgIGlmIChpbmZvMiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8xID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm8xLT5yYW5rKCkgPCBpbmZvMi0+cmFuaygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBudWxsIGlzIGxvd2VzdAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5mbzIgIT0gbnVsbHB0ciAmJiBpbmZvMS0+Z2V0UmFuaygpIDwgaW5mbzItPmdldFJhbmsoKSk7CiAgICAgICAgICAgICB9KTsKKworICAgIC8vIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcworICAgIGJvb2wgZGVkdXBlID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmRlZHVwZS1jb2RlY3MiLCB0cnVlKTsKKyAgICBpZiAoZGVkdXBlKSB7CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb2RlY3NTZWVuOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ29kZWNJbmZvcy5iZWdpbigpOyBpdCAhPSBtQ29kZWNJbmZvcy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb2RlY05hbWUgPSAoKml0KS0+Z2V0Q29kZWNOYW1lKCk7CisgICAgICAgICAgICBpZiAoY29kZWNzU2Vlbi5jb3VudChjb2RlY05hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY3NTZWVuLmVtcGxhY2UoY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1Db2RlY0luZm9zLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTI3MiwxMCArMjg4LDE3IEBACiB9CiAKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgVmVjdG9yPEFTdHJpbmc+IGFsaWFzZXM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAoc3RyY21wKG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KKyAgICAgICAgbUNvZGVjSW5mb3NbaV0tPmdldEFsaWFzZXMoJmFsaWFzZXMpOworICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGFsaWFzID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAtRU5PRU5UOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IGNhYzUzZjQuLmRkN2MzZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTIyOCwxOCArMjI4LDE4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKCFmb3JjZVRvTWVhc3VyZSAmJgogICAgICAgICAgICAgICAgIChjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpIHx8CiAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1jb25jdXJyZW50LWluc3RhbmNlcyIpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtaW1lc1tpXSwgY2Fwcyk7CisgICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtZWRpYVR5cGVzW2ldLCBjYXBzKTsKICAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CiAgICAgICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKICAgICAgICAgICAgICAgICBjaGFyIG1heFN0clszMl07CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKICAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAga2V5LmFwcGVuZChtaW1lc1tpXSk7CisgICAgICAgICAgICAgICAga2V5LmFwcGVuZChtZWRpYVR5cGVzW2ldKTsKIAogICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcAppbmRleCBiMzJlNDcwLi5jNGZiMTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0zNyw2ICszNywxNiBAQAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPgorICAgICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6ZmluZE1lZGlhQ29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IG1Db2RlY0luZm9zKSB7CisgICAgICAgIGlmICghc3RyY21wKGluZm8tPmdldENvZGVjTmFtZSgpLCBuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4obmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6d3JpdGVHbG9iYWxTZXR0aW5ncygKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZnbG9iYWxTZXR0aW5ncykgY29uc3QgewogICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmt2IDogbUdsb2JhbFNldHRpbmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IDIwODgxYTQuLjUwZTQ1NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtMzYyLDcgKzM2Myw3IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnNldElucHV0QnVmZmVyVGltZU9mZnNldChpbnQ2NF90IHRpbWVPZmZzZXRVcykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQsIG1SZWZsZWN0b3IpOwotICAgIG1zZy0+c2V0SW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgdGltZU9mZnNldFVzKTsKKyAgICBtc2ctPnNldEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsIHRpbWVPZmZzZXRVcyk7CiAgICAgcmV0dXJuIHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKIH0KIApAQCAtMzcyLDcgKzM3Myw3IEBACiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogICAgIGludDY0X3QgdGltZVVzOwogICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQ2NCgidGltZS11cyIsICZ0aW1lVXMpKSB7Ci0gICAgICAgIHRpbWVVcyA9IC0xbGw7CisgICAgICAgIHRpbWVVcyA9IC0xTEw7CiAgICAgfQogICAgIHJldHVybiB0aW1lVXM7CiB9CkBAIC00NTIsOSArNDUzLDkgQEAKICAgICAgIG1FbmNvZGVyRGF0YVNwYWNlKDApLAogICAgICAgbVBlcnNpc3RlbnRTdXJmYWNlKHBlcnNpc3RlbnRTdXJmYWNlKSwKICAgICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcygwKSwKLSAgICAgIG1GaXJzdFNhbXBsZVN5c3RlbVRpbWVVcygtMWxsKSwKKyAgICAgIG1GaXJzdFNhbXBsZVN5c3RlbVRpbWVVcygtMUxMKSwKICAgICAgIG1QYXVzZVBlbmRpbmcoZmFsc2UpLAotICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xbGwpLAorICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xTEwpLAogICAgICAgbUdlbmVyYXRpb24oMCkgewogICAgIENIRUNLKG1Mb29wZXIgIT0gTlVMTCk7CiAKQEAgLTQ5MCw3ICs0OTEsNyBAQAogICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoKTsKIAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7Ci0gICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLCAxKTsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwgMSk7CiAgICAgfQogCiAgICAgQVN0cmluZyBvdXRwdXRNSU1FOwpAQCAtNjQzLDYgKzY0NCwxMCBAQAogICAgICAgICAgICAgb3V0cHV0LT5tQnVmZmVyUXVldWUuY2xlYXIoKTsKICAgICAgICAgICAgIG91dHB1dC0+bUVuY29kZXJSZWFjaGVkRU9TID0gdHJ1ZTsKICAgICAgICAgICAgIG91dHB1dC0+bUVycm9yQ29kZSA9IGVycjsKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7CisgICAgICAgICAgICAgICAgbVN0b3BwaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtUHVsbGVyLT5zdG9wKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRwdXQtPm1Db25kLnNpZ25hbCgpOwogCiAgICAgICAgICAgICByZWFjaGVkRU9TID0gdHJ1ZTsKQEAgLTY3Myw5ICs2NzgsOSBAQAogICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOwogICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgZmFsc2UpOwogICAgICAgICBpZiAocmVzdW1lU3RhcnRUaW1lVXMgPiAwKSB7Ci0gICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCByZXN1bWVTdGFydFRpbWVVcyk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCByZXN1bWVTdGFydFRpbWVVcyk7CiAgICAgICAgIH0KICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICB9CkBAIC02ODcsMTMgKzY5MiwxMyBAQAogICAgICAgICBzaXplX3QgYnVmZmVySW5kZXggPSAqbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpOwogICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVyYXNlKG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKSk7CiAKLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwbGw7CisgICAgICAgIGludDY0X3QgdGltZVVzID0gMExMOwogICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgICAgIHNpemVfdCBzaXplID0gMDsKIAogICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwTEwpIHsKICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICAgICAgICAgICAgIGlmIChtUGF1c2VQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QYXVzZVBlbmRpbmcgPSBmYWxzZTsKQEAgLTc2MSwxMyArNzY2LDEzIEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6Om9uU3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIGlmIChtU3RvcHBpbmcpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCB3aGlsZSB3ZSdyZSBzdG9wcGluZyIpOworICAgIGlmIChtU3RvcHBpbmcgfHwgbU91dHB1dC5sb2NrKCktPm1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHdoaWxlIHdlJ3JlIHN0b3BwaW5nIG9yIGVuY29kZXIgYWxyZWFkeSBzdG9wcGVkIGR1ZSB0byBFT1MgZXJyb3IiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwogICAgIGlmIChwYXJhbXMgPT0gTlVMTCB8fCAhcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKLSAgICAgICAgc3RhcnRUaW1lVXMgPSAtMWxsOworICAgICAgICBzdGFydFRpbWVVcyA9IC0xTEw7CiAgICAgfQogCiAgICAgaWYgKG1TdGFydGVkKSB7CkBAIC03OTUsNyArODAwLDcgQEAKICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICBpZiAobUVuY29kZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgc3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfQpAQCAtODI2LDEwICs4MzEsMTIgQEAKIH0KIAogdm9pZCBNZWRpYUNvZGVjU291cmNlOjpvblBhdXNlKGludDY0X3QgcGF1c2VTdGFydFRpbWVVcykgewotICAgIGlmICgobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgJiYgKG1FbmNvZGVyICE9IE5VTEwpKSB7CisgICAgaWYgKG1TdG9wcGluZyB8fCBtT3V0cHV0LmxvY2soKS0+bUVuY29kZXJSZWFjaGVkRU9TKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICB9IGVsc2UgaWYgKChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSAmJiAobUVuY29kZXIgIT0gTlVMTCkpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCB0cnVlKTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgcGF1c2VTdGFydFRpbWVVcyk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCB0cnVlKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgcGF1c2VTdGFydFRpbWVVcyk7CiAgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKQEAgLTkxNCw3ICs5MjEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOwogICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFNhbXBsZVN5c3RlbVRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFNhbXBsZVN5c3RlbVRpbWVVcyA8IDBMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZVN5c3RlbVRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXVzZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdXNlUGVuZGluZyA9IGZhbHNlOwpAQCAtOTI2LDcgKzkzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2Zmc2V0IGlzIGFscmVhZHkgYWRqdXN0ZWQgaW4gR3JhcGhpY0J1ZmZlclNvdXJjZS4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyYXBoaWNCdWZmZXJTb3VyY2UgaXMgc3VwcG9zZWQgdG8gZGlzY2FyZCBzYW1wbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVmb3JlIHN0YXJ0LCBhbmQgb2Zmc2V0IHRpbWVVcyBieSBzdGFydCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RpbmcgdGltZSBmb3Igc3VyZmFjZSBzb3VyY2UgaXMgdW5hdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcHJlc2VudGF0aW9uIHRpbWUgZm9yIG5vdy4gTWF5IG5lZWQgdG8gbW92ZQpAQCAtOTU0LDcgKzk2MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgMGxsKTsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgMExMKTsKICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKQEAgLTEwODEsNyArMTA4OCw3IEBACiAgICAgICAgICAgICBNZXRhRGF0YSAqcGFyYW1zID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIGludDY0X3QgcGF1c2VTdGFydFRpbWVVcyA9IC0xOwogICAgICAgICAgICAgaWYgKHBhcmFtcyA9PSBOVUxMIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnBhdXNlU3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgcGF1c2VTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgICAgICAgICAgcGF1c2VTdGFydFRpbWVVcyA9IC0xTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvblBhdXNlKHBhdXNlU3RhcnRUaW1lVXMpOwogICAgICAgICB9CkBAIC0xMDkyLDEyICsxMDk5LDEyIEBACiAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCAmbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKSk7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpKTsKIAogICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIHRpbWVzdGFtcCBvZmZzZXQgdG8gR3JhcGhpY0J1ZmZlclNvdXJjZS4KICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJ0aW1lLW9mZnNldC11cyIsIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyk7CiAgICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQzMzgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKKyAgICBpZiAoIUxPR19OREVCVUcpIHsKKyAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7CisgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKyAgICAgICAgQUxPR1YoImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7CisgICAgfQorfQorCitNZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkge30KKwordWludDMyX3QgTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fUEFVU0UgfCBDQU5fU0VFSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKENNZWRpYUV4dHJhY3RvciAqcGx1Z2luKSB7CisgICAgdGhpcy0+cGx1Z2luID0gcGx1Z2luOworfQorCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6On5NZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoKSB7CisgICAgcGx1Z2luLT5mcmVlKHBsdWdpbi0+ZGF0YSk7CisgICAgZnJlZShwbHVnaW4pOworfQorCitzaXplX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5jb3VudFRyYWNrcyhwbHVnaW4tPmRhdGEpOworfQorCitNZWRpYVRyYWNrICpNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIHJldHVybiBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Y3JlYXRlKHBsdWdpbi0+Z2V0VHJhY2socGx1Z2luLT5kYXRhLCBpbmRleCkpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBwbHVnaW4tPmdldFRyYWNrTWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQsIGluZGV4LCBmbGFncyk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgZm9ybWF0OworICAgIG1ldGEgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRNZXRhRGF0YShwbHVnaW4tPmRhdGEsIGZvcm1hdCk7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEobXNnLCBuZXdNZXRhKTsKKyAgICBkZWxldGUgZm9ybWF0OworICAgIG1ldGEgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworY29uc3QgY2hhciAqIE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6bmFtZSgpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5uYW1lKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHBsdWdpbi0+ZmxhZ3MocGx1Z2luLT5kYXRhKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5zZXRNZWRpYUNhcyhwbHVnaW4tPmRhdGEsIGNhc1Rva2VuLCBzaXplKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCmluZGV4IGY2YzYxYTAuLjRjOGJlMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtMTgsMTggKzE4LDIxIEBACiAjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvZGxleHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bmF0aXZlbG9hZGVyL2RsZXh0X25hbWVzcGFjZXMuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CiAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpAQCAtNjgsNDkgKzcxLDQ2IEBACiAKICAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSAlcyIsIG1pbWUpOwogCi0gICAgVXBkYXRlRXh0cmFjdG9ycyhudWxscHRyKTsKLQogICAgIC8vIGluaXRpYWxpemUgc291cmNlIGRlY3J5cHRpb24gaWYgbmVlZGVkCiAgICAgc291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihudWxscHRyIC8qIG1pbWUgKi8pOwogCiAgICAgdm9pZCAqbWV0YSA9IG51bGxwdHI7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGNyZWF0b3IgPSBOVUxMOwotICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOworICAgIHZvaWQgKmNyZWF0b3IgPSBOVUxMOworICAgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgY29uZmlkZW5jZTsKICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+IHBsdWdpbjsKLSAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLmdldCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luKTsKKyAgICB1aW50MzJfdCBjcmVhdG9yVmVyc2lvbiA9IDA7CisgICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbiwgJmNyZWF0b3JWZXJzaW9uKTsKICAgICBpZiAoIWNyZWF0b3IpIHsKICAgICAgICAgQUxPR1YoIkZBSUxFRCB0byBhdXRvZGV0ZWN0IG1lZGlhIGNvbnRlbnQuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpyZXQgPSBjcmVhdG9yKHNvdXJjZS5nZXQoKSwgbWV0YSk7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgIE1lZGlhRXh0cmFjdG9yICpleCA9IG51bGxwdHI7CisgICAgaWYgKGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSB8fAorICAgICAgICAgICAgY3JlYXRvclZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgIENNZWRpYUV4dHJhY3RvciAqcmV0ID0gKChDcmVhdG9yRnVuYyljcmVhdG9yKShzb3VyY2UtPndyYXAoKSwgbWV0YSk7CisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXggPSByZXQgIT0gbnVsbHB0ciA/IG5ldyBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIocmV0KSA6IG51bGxwdHI7CiAgICAgfQogCiAgICAgQUxPR1YoIkNyZWF0ZWQgYW4gZXh0cmFjdG9yICclcycgd2l0aCBjb25maWRlbmNlICUuMmYiLAotICAgICAgICAgcmV0ICE9IG51bGxwdHIgPyByZXQtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKKyAgICAgICAgIGV4ICE9IG51bGxwdHIgPyBleC0+bmFtZSgpIDogIjxudWxsPiIsIGNvbmZpZGVuY2UpOwogCi0gICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihyZXQsIHNvdXJjZSwgcGx1Z2luKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgLy8gVE9ETzogVmVyaWZ5IGFwayBwYXRoIHdpdGggcGFja2FnZSBtYW5hZ2VyIGluIGV4dHJhY3RvciBwcm9jZXNzLgotICAgIEFMT0dWKCJMb2FkIHBsdWdpbnMgZnJvbTogJXMiLCBhcGtQYXRoLmNfc3RyKCkpOwotICAgIFVwZGF0ZUV4dHJhY3RvcnMoYXBrUGF0aC5lbXB0eSgpID8gbnVsbHB0ciA6IGFwa1BhdGguY19zdHIoKSk7CisgICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihleCwgc291cmNlLCBwbHVnaW4pOwogfQogCiBzdHJ1Y3QgRXh0cmFjdG9yUGx1Z2luIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmOworICAgIEV4dHJhY3RvckRlZiBkZWY7CiAgICAgdm9pZCAqbGliSGFuZGxlOwogICAgIFN0cmluZzggbGliUGF0aDsKICAgICBTdHJpbmc4IHV1aWRTdHJpbmc7CiAKLSAgICBFeHRyYWN0b3JQbHVnaW4oTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCisgICAgRXh0cmFjdG9yUGx1Z2luKEV4dHJhY3RvckRlZiBkZWZpbml0aW9uLCB2b2lkICpoYW5kbGUsIFN0cmluZzggJnBhdGgpCiAgICAgICAgIDogZGVmKGRlZmluaXRpb24pLCBsaWJIYW5kbGUoaGFuZGxlKSwgbGliUGF0aChwYXRoKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWY6OmV4dHJhY3Rvcl91dWlkOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YgRXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CiAgICAgICAgICAgICB1dWlkU3RyaW5nLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGRlZi5leHRyYWN0b3JfdXVpZC5iW2ldKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyMywxNyArMTIzLDE4IEBACiB9OwogCiBNdXRleCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5NdXRleDsKLXN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOworc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKIGJvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luc1JlZ2lzdGVyZWQgPSBmYWxzZTsKK2Jvb2wgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnSWdub3JlVmVyc2lvbiA9IGZhbHNlOwogCiAvLyBzdGF0aWMKLU1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pIHsKK3ZvaWQgKk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pIHsKICAgICAqY29uZmlkZW5jZSA9IDAuMGY7CiAgICAgKm1ldGEgPSBudWxscHRyOwogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gcGx1Z2luczsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgICAgICBpZiAoIWdQbHVnaW5zUmVnaXN0ZXJlZCkgewpAQCAtMTQyLDEzICsxNDMsMjMgQEAKICAgICAgICAgcGx1Z2lucyA9IGdQbHVnaW5zOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjdXJDcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgYmVzdENyZWF0b3IgPSBOVUxMOworICAgIHZvaWQgKmJlc3RDcmVhdG9yID0gTlVMTDsKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBBTE9HVigic25pZmZpbmcgJXMiLCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lKTsKICAgICAgICAgZmxvYXQgbmV3Q29uZmlkZW5jZTsKICAgICAgICAgdm9pZCAqbmV3TWV0YSA9IG51bGxwdHI7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOwotICAgICAgICBpZiAoKGN1ckNyZWF0b3IgPSAoKml0KS0+ZGVmLnNuaWZmKHNvdXJjZSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpKSkgeworICAgICAgICBGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOworCisgICAgICAgIHZvaWQgKmN1ckNyZWF0b3IgPSBOVUxMOworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52Mi5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgY3VyQ3JlYXRvciA9ICh2b2lkKikgKCppdCktPmRlZi51LnYzLnNuaWZmKAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPndyYXAoKSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckNyZWF0b3IpIHsKICAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKICAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgICAgICAgICAgaWYgKCptZXRhICE9IG51bGxwdHIgJiYgKmZyZWVNZXRhICE9IG51bGxwdHIpIHsKQEAgLTE1OCw2ICsxNjksNyBAQAogICAgICAgICAgICAgICAgICpmcmVlTWV0YSA9IG5ld0ZyZWVNZXRhOwogICAgICAgICAgICAgICAgIHBsdWdpbiA9ICppdDsKICAgICAgICAgICAgICAgICBiZXN0Q3JlYXRvciA9IGN1ckNyZWF0b3I7CisgICAgICAgICAgICAgICAgKmNyZWF0b3JWZXJzaW9uID0gKCppdCktPmRlZi5kZWZfdmVyc2lvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGEgIT0gbnVsbHB0ciAmJiBuZXdGcmVlTWV0YSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIG5ld0ZyZWVNZXRhKG5ld01ldGEpOwpAQCAtMTcxLDEwICsxODMsMTAgQEAKIAogLy8gc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3IoY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLAotICAgICAgICBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewogICAgIC8vIHNhbml0eSBjaGVjayBjaGVjayBzdHJ1Y3QgdmVyc2lvbiwgdXVpZCwgbmFtZQotICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA9PSAwCi0gICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTikgeworICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgJiYKKyAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uICE9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgewogICAgICAgICBBTE9HRSgiZG9uJ3QgdW5kZXJzdGFuZCBleHRyYWN0b3IgZm9ybWF0ICV1LCBpZ25vcmluZy4iLCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xOTAsNyArMjAyLDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5MaXN0LmJlZ2luKCk7IGl0ICE9IHBsdWdpbkxpc3QuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKG1lbWNtcCgmKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3V1aWQpLCAmcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3V1aWQsIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAvLyB0aGVyZSdzIGFscmVhZHkgYW4gZXh0cmFjdG9yIHdpdGggdGhlIHNhbWUgdXVpZAotICAgICAgICAgICAgaWYgKCgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgeworICAgICAgICAgICAgaWYgKGdJZ25vcmVWZXJzaW9uIHx8ICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24gPCBwbHVnaW4tPmRlZi5leHRyYWN0b3JfdmVyc2lvbikgewogICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lIGlzIG5ld2VyLCByZXBsYWNlIHRoZSBvbGQgb25lCiAgICAgICAgICAgICAgICAgQUxPR1coInJlcGxhY2luZyBleHRyYWN0b3IgJyVzJyB2ZXJzaW9uICV1IHdpdGggdmVyc2lvbiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSwKQEAgLTIxMiwxMzEgKzIyNCwxNTQgQEAKIH0KIAogLy9zdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewotICAgIEFMT0dWKCJzZWFyY2ggZm9yIHBsdWdpbnMgYXQgJXMiLCBhcGtQYXRoKTsKLSAgICBaaXBBcmNoaXZlSGFuZGxlIHppcEhhbmRsZTsKLSAgICBpbnQzMl90IHJldCA9IE9wZW5BcmNoaXZlKGFwa1BhdGgsICZ6aXBIYW5kbGUpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBjaGFyIGFiaVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBwcm9wZXJ0eV9nZXQoInJvLnByb2R1Y3QuY3B1LmFiaSIsIGFiaSwgImFybTY0LXY4YSIpOwotICAgICAgICBTdHJpbmc4IHByZWZpeDggPSBTdHJpbmc4Ojpmb3JtYXQoImxpYi8lcy8iLCBhYmkpOwotICAgICAgICBaaXBTdHJpbmcgcHJlZml4KHByZWZpeDguY19zdHIoKSk7Ci0gICAgICAgIFppcFN0cmluZyBzdWZmaXgoImV4dHJhY3Rvci5zbyIpOwotICAgICAgICB2b2lkKiBjb29raWU7Ci0gICAgICAgIHJldCA9IFN0YXJ0SXRlcmF0aW9uKHppcEhhbmRsZSwgJmNvb2tpZSwgJnByZWZpeCwgJnN1ZmZpeCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICBaaXBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHdoaWxlIChOZXh0KGNvb2tpZSwgJmVudHJ5LCAmbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgoYXBrUGF0aCkgKyAiIS8iICsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihuYW1lLm5hbWUpLCBuYW1lLm5hbWVfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBPcGVuIHdpdGggYSBsaW5rZXIgbmFtZXNwYWNlIHNvIHRoYXQgaXQgY2FuIGJlIGxpbmtlZCB3aXRoIHN1Yi1saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAvLyB3aXRoaW4gdGhlIGFwayBpbnN0ZWFkIG9mIHN5c3RlbSBsaWJyYXJpZXMgYWxyZWFkeSBsb2FkZWQuCi0gICAgICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXREZWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRyYWN0b3JQbHVnaW4oZ2V0RGVmKCksIGxpYkhhbmRsZSwgbGliUGF0aCksIHBsdWdpbkxpc3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciIsIGxpYlBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IGRsb3BlbiglcykgJXMiLCBsaWJQYXRoLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuZEl0ZXJhdGlvbihjb29raWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IGZpbmQgcGx1Z2lucyBmcm9tICVzLCAlZCIsIGFwa1BhdGgsIHJldCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xvc2VBcmNoaXZlKHppcEhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImNvdWxkbid0IG9wZW4oJXMpICVkIiwgYXBrUGF0aCwgcmV0KTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oCi0gICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnMoCisgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvKiBkbGV4dGluZm8sCisgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewogICAgIEFMT0dWKCJzZWFyY2ggZm9yIHBsdWdpbnMgYXQgJXMiLCBsaWJEaXJQYXRoKTsKKwogICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoKTsKICAgICBpZiAobGliRGlyKSB7CiAgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OwogICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgewotICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7Ci0gICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9Ci0gICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGlmIChsaWJFbnRyeS0+ZF9uYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGxpYkRpclBhdGgpICsgIi8iICsgbGliRW50cnktPmRfbmFtZTsKKyAgICAgICAgICAgIGlmICghbGliUGF0aC5jb250YWlucygiZXh0cmFjdG9yLnNvIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCBkbGV4dGluZm8pOworICAgICAgICAgICAgQ0hFQ0sobGliSGFuZGxlICE9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb3VsZG4ndCBkbG9wZW4oIiA8PCBsaWJQYXRoLnN0cmluZygpIDw8ICIpICIgPDwgc3RyZXJyb3IoZXJybm8pOwogCisgICAgICAgICAgICBHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KKyAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgIENIRUNLKGdldERlZiAhPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCBsaWJQYXRoLnN0cmluZygpIDw8ICIgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIjsKKworICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7CisgICAgICAgIH0KICAgICAgICAgY2xvc2VkaXIobGliRGlyKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbmRpciglcykiLCBsaWJEaXJQYXRoKTsKICAgICB9CiB9CiAKK3N0YXRpYyBib29sIGNvbXBhcmVGdW5jKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIGZpcnN0LCBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBzZWNvbmQpIHsKKyAgICByZXR1cm4gc3RyY21wKGZpcnN0LT5kZWYuZXh0cmFjdG9yX25hbWUsIHNlY29uZC0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOworCiAvLyBzdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpIHsKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkRXh0cmFjdG9ycygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKLSAgICBpZiAobmV3VXBkYXRlQXBrUGF0aCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgIH0KKwogICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+KCkpOworICAgIGdJZ25vcmVWZXJzaW9uID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLmV4dHJhY3Rvci5pZ25vcmVfdmVyc2lvbiIsIGZhbHNlKTsKIAotICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisKKyAgICBhbmRyb2lkX25hbWVzcGFjZV90ICptZWRpYU5zID0gYW5kcm9pZF9nZXRfZXhwb3J0ZWRfbmFtZXNwYWNlKCJtZWRpYSIpOworICAgIGlmIChtZWRpYU5zICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8gZGxleHRpbmZvID0geworICAgICAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAgICAgLmxpYnJhcnlfbmFtZXNwYWNlID0gbWVkaWFOcywKKyAgICAgICAgfTsKKyAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzKCIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9saWIiCiAjaWZkZWYgX19MUDY0X18KLSAgICAgICAgICAgICI2NCIKKyAgICAgICAgICAgICAgICAiNjQiCiAjZW5kaWYKLSAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICpuZXdMaXN0KTsKKyAgICAgICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAmZGxleHRpbmZvLCAqbmV3TGlzdCk7CiAKLSAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3ZlbmRvci9saWIiCi0jaWZkZWYgX19MUDY0X18KLSAgICAgICAgICAgICI2NCIKLSNlbmRpZgotICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgKm5ld0xpc3QpOwotCi0gICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgewotICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwayhuZXdVcGRhdGVBcGtQYXRoLCAqbmV3TGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgbWVkaWEgbmFtZXNwYWNlLiIpOwogICAgIH0KIAorICAgIFJlZ2lzdGVyRXh0cmFjdG9ycygiL3N5c3RlbS9saWIiCisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgTlVMTCwgKm5ld0xpc3QpOworCisgICAgbmV3TGlzdC0+c29ydChjb21wYXJlRnVuYyk7CiAgICAgZ1BsdWdpbnMgPSBuZXdMaXN0OworCisgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdTdXBwb3J0ZWRFeHRlbnNpb25zLmluc2VydChzdGQ6OnN0cmluZyhleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IHRydWU7CiB9CiAKKy8vIHN0YXRpYworc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCkgeworICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHsKKyAgICAgICAgcmV0dXJuIGdTdXBwb3J0ZWRFeHRlbnNpb25zOworICAgIH0KKyAgICBBTE9HVigiZ2V0IHNlcnZpY2UgbWFuYWdlciIpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CisKKyAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4gbWVkaWFFeFNlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4oYmluZGVyKSk7CisgICAgICAgIHJldHVybiBtZWRpYUV4U2VydmljZS0+Z2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4oKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICBTdHJpbmc4IG91dDsKLSAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOwotICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAotICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAoKml0KS0+dXVpZFN0cmluZy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAoKml0KS0+bGliUGF0aC5jX3N0cigpKTsKLSAgICAgICAgfQorCisgICAgY29uc3QgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCB1aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLCBwaWQsIHVpZCkpIHsKKyAgICAgICAgLy8gZHVtcEV4dHJhY3RvcnMoKSB3aWxsIGFwcGVuZCB0aGUgZm9sbG93aW5nIHN0cmluZy4KKyAgICAgICAgLy8gb3V0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgLy8gICAgICAgICJjYW4ndCBkdW1wIE1lZGlhRXh0cmFjdG9yIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsIHBpZCwgdWlkKTsKKyAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIE1lZGlhRXh0cmFjdG9yIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0LmFwcGVuZCgiICAobm8gcGx1Z2lucyByZWdpc3RlcmVkKVxuIik7CisgICAgICAgIG91dC5hcHBlbmQoIkF2YWlsYWJsZSBleHRyYWN0b3JzOlxuIik7CisgICAgICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIgICUyNXM6IHBsdWdpbl92ZXJzaW9uKCVkKSwgdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+bGliUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCBzdXBwb3J0czogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiVzICIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LmFwcGVuZCgiICAobm8gcGx1Z2lucyByZWdpc3RlcmVkKVxuIik7CisgICAgICAgIH0KICAgICB9CiAgICAgd3JpdGUoZmQsIG91dC5zdHJpbmcoKSwgb3V0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAppbmRleCA5OGY1OWI1Li45YmEyYWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUyLDYgKzUzLDggQEAKICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIoZmQpOwogICAgIH0KIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKQEAgLTU5LDYgKzYyLDggQEAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0hFSUYpIHsKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUga2V5IHVzZXMgcmVjb3JkZXIgZmlsZSB0eXBlcy4KICAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX09HRykgeworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfT0dHKTsKICAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhU291cmNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcAppbmRleCBiYTE0ZTVkLi5hM2Y1NWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIAogLy8gTWF4aW11bSBsYXRlIHRpbWUgYWxsb3dlZCBmb3IgYSB2aWRlbyBmcmFtZSB0byBiZSByZW5kZXJlZC4gV2hlbiBhIHZpZGVvCiAvLyBmcmFtZSBhcnJpdmVzIGxhdGVyIHRoYW4gdGhpcyBudW1iZXIsIGl0IHdpbGwgYmUgZGlzY2FyZGVkIHdpdGhvdXQgcmVuZGVyaW5nLgotc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRWaWRlb0xhdGVUaW1lVXMgPSA0MDAwMGxsOworc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRWaWRlb0xhdGVUaW1lVXMgPSA0MDAwMExMOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljOWIyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQorCitNZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLSB1bndyYXBwZXIgLS0tLS0tLS0tLS0tLS0tICovCisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjpNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICB3cmFwcGVyID0gY21lZGlhdHJhY2s7CisgICAgYnVmZmVyR3JvdXAgPSBudWxscHRyOworfQorCitNZWRpYVRyYWNrQ1Vud3JhcHBlciAqTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICBpZiAoY21lZGlhdHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNZWRpYVRyYWNrQ1Vud3JhcHBlcihjbWVkaWF0cmFjayk7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjp+TWVkaWFUcmFja0NVbndyYXBwZXIoKSB7CisgICAgd3JhcHBlci0+ZnJlZSh3cmFwcGVyLT5kYXRhKTsKKyAgICBmcmVlKHdyYXBwZXIpOworICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0YXJ0KCkgeworICAgIGlmIChidWZmZXJHcm91cCA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0YXJ0KHdyYXBwZXItPmRhdGEsIGJ1ZmZlckdyb3VwLT53cmFwKCkpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0b3Aod3JhcHBlci0+ZGF0YSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqdG1wRm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPmdldEZvcm1hdCh3cmFwcGVyLT5kYXRhLCB0bXBGb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIHRtcEZvcm1hdDsKKyAgICBmb3JtYXQgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgdWludDMyX3Qgb3B0cyA9IDA7CisKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpKSB7CisgICAgICAgIG9wdHMgfD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgfQorCisgICAgaW50NjRfdCBzZWVrUG9zaXRpb24gPSAwOworICAgIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtQb3NpdGlvbiwgJnNlZWtNb2RlKSkgeworICAgICAgICBvcHRzIHw9IFNFRUs7CisgICAgICAgIG9wdHMgfD0gKHVpbnQzMl90KSBzZWVrTW9kZTsKKyAgICB9CisgICAgQ01lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPnJlYWQod3JhcHBlci0+ZGF0YSwgJmJ1Ziwgb3B0cywgc2Vla1Bvc2l0aW9uKTsKKyAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAqYnVmZmVyID0gKE1lZGlhQnVmZmVyQmFzZSopYnVmLT5oYW5kbGU7CisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9ICgqYnVmZmVyKS0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gYnVmLT5tZXRhX2RhdGEoYnVmLT5oYW5kbGUpOworICAgICAgICAvLyBvbmx5IGNvbnZlcnQgdGhlIGtleXMgd2UncmUgYWN0dWFsbHkgZXhwZWN0aW5nLCBhcyBkb2luZworICAgICAgICAvLyB0aGUgZnVsbCBjb252ZXJ0TWVzc2FnZVRvTWV0YWRhdGEoKSBmb3IgZXZlcnkgYnVmZmVyIGlzCisgICAgICAgIC8vIHRvbyBleHBlbnNpdmUKKyAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRhcmdldC10aW1lIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiaXMtc3luYy1mcmFtZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tbW9kZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInZhbGlkLXNhbXBsZXMiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiB2YWxidWY7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1wbGFpbi1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWtleSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWl2IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoInNlaSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVNFSSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2Jvb2wgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgcmV0dXJuIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKHdyYXBwZXItPmRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAppbmRleCAwNGY2YWRlLi4zZjBiYzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApAQCAtMTYsMTUgKzE2LDI1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBpbnQzMl90IHdpZHRoOwogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3Qgc2FyV2lkdGg7CkBAIC00NiwyMSArNTYsODYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtZXRhID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhcldpZHRoOworICAgIGludDMyX3Qgc2FySGVpZ2h0OworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigodm9pZCopZGF0YSwgIHNpemUpOworICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmd2lkdGgsICZoZWlnaHQsICZzYXJXaWR0aCwgJnNhckhlaWdodCk7CisgICAgaWYgKGNzZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaGVpZ2h0KTsKKyAgICBpZiAoc2FyV2lkdGggPiAwICYmIHNhckhlaWdodCA+IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCBzYXJXaWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsIHNhckhlaWdodCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplIDwgNykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBiaXRzKGRhdGEsIHNpemUpOworCisgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgIGlmIChiaXRzLmdldEJpdHMoMTIpICE9IDB4ZmZmdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgYXRkc19maXhlZF9oZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoNCk7ICAvLyBJRCwgbGF5ZXIsIHByb3RlY3Rpb25fYWJzZW50CisKKyAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChwcm9maWxlID09IDN1KSB7CisgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7CisgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7CisgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgeworICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIG1ldGEsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1ldGEuc2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpjc2QsIC8qIG91dCAqLworICAgICAgICBzaXplX3QgKmVzZHNfc2l6ZSwgLyogaW4vb3V0ICovCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgLyogaW4gKi8KKyAgICAgICAgaW50MzJfdCAqc2FtcGxpbmdfcmF0ZSAvKiBvdXQgKi8KKykgewogICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gewogICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCiAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKICAgICB9OwotICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwotICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKyAgICAqc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewogICAgICAgICAweDAzLCAyMiwKQEAgLTgzLDcgKzE1OCw5IEBACiAgICAgfTsKIAogICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDI7Ci0gICAgdWludDhfdCAqY3NkID0gbmV3IHVpbnQ4X3RbY3NkU2l6ZV07CisgICAgaWYgKGNzZFNpemUgPiAqZXNkc19zaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgbWVtY3B5KGNzZCwga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOwogCiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUyldID0KQEAgLTkyLDE0ICsxNjksMTk3IEBACiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUykgKyAxXSA9CiAgICAgICAgICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKIAorICAgICplc2RzX3NpemUgPSBjc2RTaXplOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBjc2RbMl07CisgICAgY3NkWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoc2FtcGxpbmdfZnJlcV9pbmRleCA+PiAxKTsKKyAgICBjc2RbMV0gPSAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY3NkLCBzaXplb2YoY3NkKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICB1aW50OF90IGNzZFsyNF07CisgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2YoY3NkKTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjc2QsICZjc2RTaXplLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICAgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAKICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0KKyAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAgICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QsIGNzZFNpemUpOwotICAgIGRlbGV0ZSBbXSBjc2Q7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKworc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNpemVfdCBpbkxlbiA9IHN0cm5sZW4oKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICBzaXplX3QgZmxhY1NpemUgPSBpbkxlbiAvIDQgKiAzOworICAgIHVpbnQ4X3QgKmZsYWMgPSBuZXcgdWludDhfdFtmbGFjU2l6ZV07CisgICAgaWYgKCFkZWNvZGVCYXNlNjQoZmxhYywgJmZsYWNTaXplLCAoY29uc3QgY2hhciopZGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOworCisgICAgdWludDMyX3QgcGljVHlwZTsKKyAgICB1aW50MzJfdCB0eXBlTGVuOworICAgIHVpbnQzMl90IGRlc2NMZW47CisgICAgdWludDMyX3QgZGF0YUxlbjsKKyAgICBjaGFyIHR5cGVbMTI4XTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7CisKKyAgICBpZiAocGljVHlwZSAhPSAzKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKKyAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKKyAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKKyAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKKworICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7CisKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOworCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAorICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCisgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKKworICAgIGRlbGV0ZVtdIGZsYWM7Cit9CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkgeworICAgIC8vIEhhcHRpYyB0YWcgaXMgb25seSBrZXB0IGhlcmUgYXMgaXQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gZXh0cmFjdG9yIHRvIGdlbmVyYXRlIGNoYW5uZWwgbWFzay4KKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOworICAgICAgICBjb25zdCBjaGFyICptS2V5OworICAgIH0ga01hcFtdID0geworICAgICAgICB7ICJUSVRMRSIsIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgfSwKKyAgICAgICAgeyAiQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQ09NUElMQVRJT04iLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIH0sCisgICAgICAgIHsgIkFMQlVNIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTSB9LAorICAgICAgICB7ICJDT01QT1NFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgfSwKKyAgICAgICAgeyAiR0VOUkUiLCBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIH0sCisgICAgICAgIHsgIkFVVEhPUiIsIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIH0sCisgICAgICAgIHsgIlRSQUNLTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIH0sCisgICAgICAgIHsgIkRJU0NOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgfSwKKyAgICAgICAgeyAiREFURSIsIEFNRURJQUZPUk1BVF9LRVlfREFURSB9LAorICAgICAgICB7ICJZRUFSIiwgQU1FRElBRk9STUFUX0tFWV9ZRUFSIH0sCisgICAgICAgIHsgIkxZUklDSVNUIiwgQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCB9LAorICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCB9LAorICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9IQVBUSUMiLCBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5UIH0sCisgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7CisgICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7CisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUKSB7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICplbmQ7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhcHRpY0NoYW5uZWxDb3VudCA9IHN0cnRvbCgmY29tbWVudFt0YWdMZW4gKyAxXSwgJmVuZCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBrTWFwW2pdLm1LZXksIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IoJWQpIHdoZW4gcGFyc2luZyBoYXB0aWMgY2hhbm5lbCBjb3VudCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAxOGY0YjEyLi41MjJjODFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI1Niw2ICsyNTYsMTAgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpkaXNjb25uZWN0KCkgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEFMT0dWKCJkaXNjb25uZWN0aW5nIEhUVFBCYXNlZFNvdXJjZSIpOwpAQCAtNDM2LDEyICs0NDAsMTIgQEAKICAgICBpZiAobUZldGNoaW5nKSB7CiAgICAgICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0sgJiYgbU51bVJldHJpZXNMZWZ0ID4gMCkgewogICAgICAgICAgICAgLy8gV2UgZmFpbGVkIHRoaXMgdGltZSBhbmQgd2lsbCB0cnkgYWdhaW4gaW4gMyBzZWNvbmRzLgotICAgICAgICAgICAgZGVsYXlVcyA9IDMwMDAwMDBsbDsKKyAgICAgICAgICAgIGRlbGF5VXMgPSAzMDAwMDAwTEw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZWxheVVzID0gMDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGF5VXMgPSAxMDAwMDBsbDsKKyAgICAgICAgZGVsYXlVcyA9IDEwMDAwMExMOwogICAgIH0KIAogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3IpKS0+cG9zdChkZWxheVVzKTsKQEAgLTU2NywxMiArNTcxLDE5IEBACiAgICAgcmV0dXJuIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBhcHByb3hEYXRhUmVtYWluaW5nX2woZmluYWxTdGF0dXMpOworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAqc2l6ZSA9IGFwcHJveERhdGFSZW1haW5pbmdfbChvZmZzZXQsICZmaW5hbFN0YXR1cyk7CisgICAgcmV0dXJuIGZpbmFsU3RhdHVzOwogfQogCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChtTGFzdEFjY2Vzc1BvcywgZmluYWxTdGF0dXMpOworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2wob2ZmNjRfdCBvZmZzZXQsIHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3QgewogICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKIAogICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0sgJiYgbU51bVJldHJpZXNMZWZ0ID4gMCkgewpAQCAtNTgwLDkgKzU5MSwxMCBAQAogICAgICAgICAqZmluYWxTdGF0dXMgPSBPSzsKICAgICB9CiAKKyAgICBvZmZzZXQgPSBvZmZzZXQgPj0gMCA/IG9mZnNldCA6IG1MYXN0QWNjZXNzUG9zOwogICAgIG9mZjY0X3QgbGFzdEJ5dGVQb3NDYWNoZWQgPSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwotICAgIGlmIChtTGFzdEFjY2Vzc1BvcyA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7Ci0gICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG1MYXN0QWNjZXNzUG9zOworICAgIGlmIChvZmZzZXQgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgeworICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBvZmZzZXQ7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNzI4LDcgKzc0MCw3IEBACiAgICAgfQogCiAgICAgaWYgKGtlZXBBbGl2ZVNlY3MgPj0gMCkgewotICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtlZXBBbGl2ZVNlY3MgKiAxMDAwMDAwbGw7CisgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga2VlcEFsaXZlU2VjcyAqIDEwMDAwMDBMTDsKICAgICB9IGVsc2UgewogICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtEZWZhdWx0S2VlcEFsaXZlSW50ZXJ2YWxVczsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDRhN2Q2Y2EuLjY4MGQ0MjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwxMCArMjEsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNDIsNyArNDEsNyBAQAogCiBOdU1lZGlhRXh0cmFjdG9yOjpTYW1wbGU6OlNhbXBsZSgpCiAgICAgOiBtQnVmZmVyKE5VTEwpLAotICAgICAgbVNhbXBsZVRpbWVVcygtMWxsKSB7CisgICAgICBtU2FtcGxlVGltZVVzKC0xTEwpIHsKIH0KIAogTnVNZWRpYUV4dHJhY3Rvcjo6U2FtcGxlOjpTYW1wbGUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIGludDY0X3QgdGltZVVzKQpAQCAtNTEsOCArNTAsOCBAQAogfQogCiBOdU1lZGlhRXh0cmFjdG9yOjpOdU1lZGlhRXh0cmFjdG9yKCkKLSAgICA6IG1Ub3RhbEJpdHJhdGUoLTFsbCksCi0gICAgICBtRHVyYXRpb25VcygtMWxsKSB7CisgICAgOiBtVG90YWxCaXRyYXRlKC0xTEwpLAorICAgICAgbUR1cmF0aW9uVXMoLTFMTCkgewogfQogCiBOdU1lZGlhRXh0cmFjdG9yOjp+TnVNZWRpYUV4dHJhY3RvcigpIHsKQEAgLTIwNSwyMiArMjA0LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51TWVkaWFFeHRyYWN0b3I6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjp1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKSB7CiAgICAgaWYgKG1JbXBsLT5jb3VudFRyYWNrcygpID4ga01heFRyYWNrQ291bnQpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIG1Ub3RhbEJpdHJhdGUgPSAwbGw7Ci0gICAgbUR1cmF0aW9uVXMgPSAtMWxsOworICAgIG1Ub3RhbEJpdHJhdGUgPSAwTEw7CisgICAgbUR1cmF0aW9uVXMgPSAtMUxMOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW1wbC0+Y291bnRUcmFja3MoKTsgKytpKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUltcGwtPmdldFRyYWNrTWV0YURhdGEoaSk7CkBAIC0yMzUsOCArMjI1LDggQEAKICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAKLSAgICAgICAgICAgIG1Ub3RhbEJpdHJhdGUgPSAtMWxsOwotICAgICAgICB9IGVsc2UgaWYgKG1Ub3RhbEJpdHJhdGUgPj0gMGxsKSB7CisgICAgICAgICAgICBtVG90YWxCaXRyYXRlID0gLTFMTDsKKyAgICAgICAgfSBlbHNlIGlmIChtVG90YWxCaXRyYXRlID49IDBMTCkgewogICAgICAgICAgICAgbVRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOwogICAgICAgICB9CiAKQEAgLTQ0MCwxOCArNDMwLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZU9uZVNhbXBsZShUcmFja0luZm8gKmluZm8pIHsKLSAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gaXQgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpOwotICAgIGlmIChpdC0+bUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGl0LT5tQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGluZm8tPm1TYW1wbGVzLmVyYXNlKGl0KTsKLX0KLQogdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpyZWxlYXNlVHJhY2tTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbykgewogICAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDgyLDcgKzQ2MCw3IEBACiAgICAgICAgIGZldGNoVHJhY2tTYW1wbGVzKGluZm8sIHNlZWtUaW1lVXMsIG1vZGUpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1GaW5hbFJlc3VsdDsKLSAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNICYmIGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIApAQCAtNTEzLDcgKzQ5MSw3IEBACiAgICAgfQogCiAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgaWYgKHNlZWtUaW1lVXMgPj0gMGxsKSB7CisgICAgaWYgKHNlZWtUaW1lVXMgPj0gMExMKSB7CiAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOwogICAgICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBPSzsKICAgICAgICAgcmVsZWFzZVRyYWNrU2FtcGxlcyhpbmZvKTsKQEAgLTUzNywxNCArNTE1LDYgQEAKICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBlcnI7CiAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICBBTE9HVygicmVhZCBvbiB0cmFjayAlenUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBpbmZvLT5tVHJhY2tJbmRleCwgZXJyKTsKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gbWVkaWFCdWZmZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGNvdW50OyArK2lkKSB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBtZWRpYUJ1ZmZlcnNbaWRdOwotICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc2l6ZV90IGNvdW50ID0gbWVkaWFCdWZmZXJzLnNpemUoKTsKQEAgLTU5NCw4ICs1NjQsMjYgQEAKIAogICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChtaW5JbmRleCk7CiAKLSAgICByZWxlYXNlT25lU2FtcGxlKGluZm8pOworICAgIGlmIChpbmZvID09IE5VTEwgfHwgaW5mby0+bVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CiAKKyAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICBpZiAoaXQtPm1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpdC0+bUJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0KKyAgICBpbmZvLT5tU2FtcGxlcy5lcmFzZShpdCk7CisKKyAgICBpZiAoaW5mby0+bVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CisgICAgICAgIGlmIChtaW5JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgIGluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOworICAgICAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzY2LDYgKzc1NCw5IEBACiB9CiAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldE1ldHJpY3MoUGFyY2VsICpyZXBseSkgeworICAgIGlmIChtSW1wbCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSW1wbC0+Z2V0TWV0cmljcyhyZXBseSk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTc3OCw3ICs3NjksNyBAQAogCiAgICAgb2ZmNjRfdCBzaXplOwogICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICpiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOyAgLy8gaW4gYml0cy9zZWMKKyAgICAgICAgKmJpdHJhdGUgPSBzaXplICogODAwMDAwMExMIC8gbUR1cmF0aW9uVXM7ICAvLyBpbiBiaXRzL3NlYwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTc5MCwxNiArNzgxLDEyIEBACiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBvZmY2NF90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKC0xLCAmY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgaWYgKChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQorICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKICAgICAgICAgICAgICYmIGdldFRvdGFsQml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQotICAgICAgICAgICAgY2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KICAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKICAgICAgICAgKmVvcyA9IChmaW5hbFN0YXR1cyAhPSBPSyk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODA4LDQgKzc5NSwzNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gUmV0dXJuIE9LIGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gYXVkaW8gcHJlc2VudGF0aW9uIGluZm8uCisvLyBSZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTSBpZiBubyB0cmFja3MgYXJlIGF2YWlsYWJsZS4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CisgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2VsZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tVHJhY2tJbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YShpbmZvLT5tU2FtcGxlcy5iZWdpbigpLT5tQnVmZmVyLT5tZXRhX2RhdGEoKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucygmaW5TdHJlYW0sIHByZXNlbnRhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlRyYWNrICV6dSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiU291cmNlIGRvZXMgbm90IGNvbnRhaW4gYW55IGF1ZGlvIHByZXNlbnRhdGlvbiIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzhmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPZ2dXcml0ZXIiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9nZy9vZ2cuaD4KK30KKworLy8gc3RvcmUgdGhlIGludDMyIHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVpbnQoY2hhciAqYnVmLCBpbnQgYmFzZSwgaW50MzJfdCB2YWwpIHsKKyAgICBidWZbYmFzZSArIDNdID0gKCh2YWwpID4+IDI0KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAyXSA9ICgodmFsKSA+PiAxNikgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMV0gPSAoKHZhbCkgPj4gOCkgJiAweGZmOworICAgIGJ1ZltiYXNlXSA9ICh2YWwpJjB4ZmY7Cit9CisKKy8vIGxpbmthZ2UgYmV0d2VlbiBvdXIgaGVhZGVyIE9nZ1N0cmVhbVN0YXRlIGFuZCB0aGUgdW5kZXJseWluZyBvZ2dfc3RyZWFtX3N0YXRlCisvLyBzbyB0aGF0IGNvbnN1bWVycyBvZiBvdXIgaW50ZXJmYWNlIGRvIG5vdCByZXF1aXJlIHRoZSBvZ2cgaGVhZGVycyB0aGVtc2VsdmVzLgorc3RydWN0IE9nZ1N0cmVhbVN0YXRlIDogcHVibGljIG9nZ19zdHJlYW1fc3RhdGUge307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworT2dnV3JpdGVyOjpPZ2dXcml0ZXIoaW50IGZkKQorICAgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICAgIG1IYXZlQWxsQ29kZWNTcGVjaWZpY0RhdGEoZmFsc2UpLAorICAgICAgICBtSW5pdENoZWNrKG1GZCA8IDAgPyBOT19JTklUIDogT0spIHsKKyAgICAvLyBlbXB0eQorfQorCitPZ2dXcml0ZXI6On5PZ2dXcml0ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKG1GZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CisKKyAgICBmcmVlKG1Pcyk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gU3VwcG9ydCBpcyBsaW1pdGVkIHRvIHNpbmdsZSB0cmFjayBvZiBPcHVzIGF1ZGlvLgorICAgIGNvbnN0IGNoYXIqIG1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CisgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsIG9wdXMsIHN0cmxlbihvcHVzKSkpIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcyBpcyBub3Qgc3VwcG9ydGVkIiwgbWltZSwgb3B1cyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtT3MgPSAoT2dnU3RyZWFtU3RhdGUqKSBtYWxsb2Moc2l6ZW9mKG9nZ19zdHJlYW1fc3RhdGUpKTsKKyAgICBpZiAob2dnX3N0cmVhbV9pbml0KChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsIHJhbmQoKSkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIm9nZyBzdHJlYW0gaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gV3JpdGUgT2dnIGhlYWRlcnMuCisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleSBmb3Igc2FtcGxlIHJhdGUiKTsKKyAgICAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmhlYWRlcl9kYXRhID0gTlVMTDsKKyAgICBzaXplX3QgcGFja2V0X3NpemUgPSAwOworCisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZoZWFkZXJfZGF0YSwgJnBhY2tldF9zaXplKSkgeworICAgICAgICBBTE9HVigib3B1cyBoZWFkZXIgbm90IGZvdW5kIGluIGZvcm1hdCIpOworICAgIH0gZWxzZSBpZiAoaGVhZGVyX2RhdGEgJiYgcGFja2V0X3NpemUpIHsKKyAgICAgICAgd3JpdGVPZ2dIZWFkZXJQYWNrZXRzKCh1bnNpZ25lZCBjaGFyICopaGVhZGVyX2RhdGEsIHBhY2tldF9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiaWdub3JpbmcgaW5jb21wbGV0ZSBvcHVzIGhlYWRlciBkYXRhIGluIGZvcm1hdCIpOworICAgIH0KKworICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OndyaXRlT2dnSGVhZGVyUGFja2V0cyh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBzaXplKSB7CisgICAgb2dnX3BhY2tldCBvcDsKKyAgICBvZ2dfcGFnZSBvZzsKKyAgICBvcC5wYWNrZXQgPSBidWY7CisgICAgb3AuYnl0ZXMgPSBzaXplOworICAgIG9wLmJfb19zID0gMTsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAwOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIGludCByZXQ7CisgICAgd2hpbGUgKChyZXQgPSBvZ2dfc3RyZWFtX2ZsdXNoKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvZykpKSB7CisgICAgICAgIGlmICghcmV0KSBicmVhazsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5oZWFkZXIsIG9nLmhlYWRlcl9sZW4pOworICAgICAgICB3cml0ZShtRmQsIG9nLmJvZHksIG9nLmJvZHlfbGVuKTsKKyAgICB9CisKKworICAgIGNvbnN0IGNoYXIqIHZlbmRvcl9zdHJpbmcgPSAibGlib3B1cyI7CisgICAgY29uc3QgaW50IHZlbmRvcl9sZW5ndGggPSBzdHJsZW4odmVuZG9yX3N0cmluZyk7CisgICAgaW50IHVzZXJfY29tbWVudF9saXN0X2xlbmd0aCA9IDA7CisKKyAgICBjb25zdCBpbnQgY29tbWVudHNfbGVuZ3RoID0gOCArIDQgKyB2ZW5kb3JfbGVuZ3RoICsgNCArIHVzZXJfY29tbWVudF9saXN0X2xlbmd0aDsKKyAgICBjaGFyKiBjb21tZW50cyA9IChjaGFyKiltYWxsb2MoY29tbWVudHNfbGVuZ3RoKTsKKyAgICBpZiAoY29tbWVudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIG9nZyBjb21tZW50IGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWVtY3B5KGNvbW1lbnRzLCAiT3B1c1RhZ3MiLCA4KTsKKyAgICB3cml0ZWludChjb21tZW50cywgOCwgdmVuZG9yX2xlbmd0aCk7CisgICAgbWVtY3B5KGNvbW1lbnRzICsgMTIsIHZlbmRvcl9zdHJpbmcsIHZlbmRvcl9sZW5ndGgpOworICAgIHdyaXRlaW50KGNvbW1lbnRzLCAxMiArIHZlbmRvcl9sZW5ndGgsIHVzZXJfY29tbWVudF9saXN0X2xlbmd0aCk7CisKKyAgICBvcC5wYWNrZXQgPSAodW5zaWduZWQgY2hhciopY29tbWVudHM7CisgICAgb3AuYnl0ZXMgPSBjb21tZW50c19sZW5ndGg7CisgICAgb3AuYl9vX3MgPSAwOworICAgIG9wLmVfb19zID0gMDsKKyAgICBvcC5ncmFudWxlcG9zID0gMDsKKyAgICBvcC5wYWNrZXRubyA9IDE7CisgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworCisgICAgd2hpbGUgKChyZXQgPSBvZ2dfc3RyZWFtX2ZsdXNoKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvZykpKSB7CisgICAgICAgIGlmICghcmV0KSBicmVhazsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5oZWFkZXIsIG9nLmhlYWRlcl9sZW4pOworICAgICAgICB3cml0ZShtRmQsIG9nLmJvZHksIG9nLmJvZHlfbGVuKTsKKyAgICB9CisKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICBtSGF2ZUFsbENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGlzQ29kZWNTcGVjaWZpYzsKKyAgICAgICAgaWYgKChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmlzQ29kZWNTcGVjaWZpYykKKyAgICAgICAgICAgICAmJiBpc0NvZGVjU3BlY2lmaWMpCisgICAgICAgICAgICB8fCBJc09wdXNIZWFkZXIoKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgeworICAgICAgICAgICAgaWYgKG1IYXZlQWxsQ29kZWNTcGVjaWZpY0RhdGEgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksICZvcHVzSGVhZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICAgICAgICAgICAgICB3cml0ZU9nZ0hlYWRlclBhY2tldHMoKHVuc2lnbmVkIGNoYXIgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImlnbm9yaW5nIGxhdGVyIGNvcHkgb2YgQ1NEIGNvbnRhaW5lZCBpbiBpbmZvIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUhhdmVBbGxDb2RlY1NwZWNpZmljRGF0YSA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR0UoIkRpZCBub3QgZ2V0IHZhbGlkIG9wdXMgaGVhZGVyIGJlZm9yZSBmaXJzdCBzYW1wbGUgZGF0YSIpOworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1Fc3RpbWF0ZWREdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIGlmIChtUmVzdW1lZCkgeworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9ICh0aW1lc3RhbXBVcyAtIG1heFRpbWVzdGFtcFVzIC0gMjAwMDApOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKworICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJSIgUFJJZDY0ICIsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJSIgUFJJZDY0LCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgZHVyYXRpb24oJSIgUFJJZDY0ICIgdXMpIGV4Y2VlZHMgbGltaXQoJSIgUFJJZDY0ICIgdXMpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG9nZ19wYWNrZXQgb3A7CisgICAgICAgIG9nZ19wYWdlIG9nOworICAgICAgICBvcC5wYWNrZXQgPSAodWludDhfdCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICBvcC5ieXRlcyA9IChsb25nKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIG9wLmJfb19zID0gMDsKKyAgICAgICAgb3AuZV9vX3MgPSBtUmVhY2hlZEVPUyA/IDEgOiAwOworICAgICAgICAvLyBncmFudWxlcG9zIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgUENNIGF1ZGlvIHNhbXBsZXMgQCA0OCBrSHosIHVwIHRvIGFuZAorICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgcGFja2V0LgorICAgICAgICBvZ2dfaW50NjRfdCBncmFudWxlcG9zID0gKDQ4MDAwICogbUVzdGltYXRlZER1cmF0aW9uVXMpIC8gMTAwMDAwMDsKKyAgICAgICAgb3AuZ3JhbnVsZXBvcyA9IGdyYW51bGVwb3M7CisKKyAgICAgICAgLy8gSGVhZGVycyBhcmUgYXQgcGFja2V0cyAwIGFuZCAxLgorICAgICAgICBvcC5wYWNrZXRubyA9IDIgKyAob2dnX2ludDMyX3QpbUN1cnJlbnRQYWNrZXRJZCsrOworICAgICAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisgICAgICAgIHNpemVfdCBuID0gMDsKKworICAgICAgICB3aGlsZSAob2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpID4gMCkgeworICAgICAgICAgICAgd3JpdGUobUZkLCBvZy5oZWFkZXIsIG9nLmhlYWRlcl9sZW4pOworICAgICAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgICAgICAgICBuID0gbiArIG9nLmhlYWRlcl9sZW4gKyBvZy5ib2R5X2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuIDwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gRVJST1JfSU87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RvcHBlZFByZW1hdHVyZWx5ID0gZmFsc2U7CisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gZW5kIG9mIHN0cmVhbSBpcyBhbiBvayB0aGluZworICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LICYmIHN0b3BwZWRQcmVtYXR1cmVseSkgeworICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gbVJlYWNoZWRFT1M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKaW5kZXggOTZiODk2Yi4uNzlmZmRlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcApAQCAtMjEsOCArMjEsOCBAQAogI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUwogI2VuZGlmCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmg+CkBAIC01MywxOCArNTMsMTMgQEAKIG5hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKIAogYm9vbCBoYXNQcmVmaXgoY29uc3QgaGlkbF9zdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHByZWZpeCkgewotICAgIHJldHVybiBzdHJuY21wKHMuY19zdHIoKSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSkgPT0gMDsKKyAgICByZXR1cm4gc3RybmNhc2VjbXAocy5jX3N0cigpLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOwogfQogCiBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUsIGNvbnN0IGNoYXIqIG1lZGlhVHlwZSwgYm9vbCBpc0VuY29kZXIsCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKICAgICBzcDxBQ29kZWM+IGNvZGVjID0gbmV3IEFDb2RlYygpOwotICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgIG5vZGUub3duZXIuY19zdHIoKSwgbm9kZS5uYW1lLmNfc3RyKCksIG1pbWUsIGlzRW5jb2RlciwgY2Fwcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgewogICAgICAgICAvLyBBbGwgZmVhdHVyZXMgaGF2ZSBhbiBpbnQzMiB2YWx1ZSBleGNlcHQKICAgICAgICAgLy8gImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIsIHdoaWNoIGhhcyBhIHN0cmluZyB2YWx1ZS4KQEAgLTgxLDEyICs3NiwxOSBAQAogICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5LmNfc3RyKCksIGF0dHJpYnV0ZS52YWx1ZS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBxdWVyeSBjYXBhYmlsaXRpZXMgbWF5IHJlbW92ZSBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgbm90IGFjdHVhbGx5IHN1cHBvcnRlZCBieSB0aGUgY29kZWMKKyAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+cXVlcnlDYXBhYmlsaXRpZXMoCisgICAgICAgICAgICBub2RlLm93bmVyLmNfc3RyKCksIG5vZGUubmFtZS5jX3N0cigpLCBtZWRpYVR5cGUsIGlzRW5jb2RlciwgY2Fwcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKIH0gIC8vIHVubmFtZWQgbmFtZXNwYWNlCiAKLU9teEluZm9CdWlsZGVyOjpPbXhJbmZvQnVpbGRlcigpIHsKK09teEluZm9CdWlsZGVyOjpPbXhJbmZvQnVpbGRlcihib29sIGFsbG93U3VyZmFjZUVuY29kZXJzKQorICAgIDogbUFsbG93U3VyZmFjZUVuY29kZXJzKGFsbG93U3VyZmFjZUVuY29kZXJzKSB7CiB9CiAKIHN0YXR1c190IE9teEluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKQEAgLTEzNCwxMDcgKzEzNiw4NyBAQAogICAgIC8vIENvbnZlcnQgcm9sZXMgdG8gbGlzdHMgb2YgY29kZWNzCiAKICAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gc3dDb2RlY3MvaHdDb2RlY3MKLSAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPj4KLSAgICAgICAgICAgIHN3Q29kZWNOYW1lMkluZm8sIGh3Q29kZWNOYW1lMkluZm87CisgICAgc3RkOjptYXA8aGlkbF9zdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4+IGNvZGVjTmFtZTJJbmZvOwogCi0gICAgY2hhciByYW5rW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgdWludDMyX3QgZGVmYXVsdFJhbmsgPSAweDEwMDsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rIiwgcmFuaywgbnVsbHB0cikpIHsKLSAgICAgICAgZGVmYXVsdFJhbmsgPSBzdGQ6OnN0cnRvdWwocmFuaywgbnVsbHB0ciwgMTApOwotICAgIH0KKyAgICB1aW50MzJfdCBkZWZhdWx0UmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rIiwgMHgxMDB1KTsKKyAgICB1aW50MzJfdCBkZWZhdWx0U3dBdWRpb1JhbmsgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuay5zdy1hdWRpbyIsIDB4MTB1KTsKKyAgICB1aW50MzJfdCBkZWZhdWx0U3dPdGhlclJhbmsgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuay5zdy1vdGhlciIsIDB4MjEwdSk7CisKICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Um9sZUluZm8mIHJvbGUgOiByb2xlcykgewogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgdHlwZU5hbWUgPSByb2xlLnR5cGU7CiAgICAgICAgIGJvb2wgaXNFbmNvZGVyID0gcm9sZS5pc0VuY29kZXI7Ci0gICAgICAgIGJvb2wgcHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlczsKLSAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCBoYXJkd2FyZSBub2RlcyBtdXN0IGJlIGFkZGVkIGFmdGVyCi0gICAgICAgIC8vIHBsYXRmb3JtIChzb2Z0d2FyZSkgbm9kZXMuIGh3Q29kZWNzIGlzIHVzZWQgdG8gaG9sZCBoYXJkd2FyZSBub2RlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgYWZ0ZXIgc29mdHdhcmUgbm9kZXMgZm9yIHRoZSBzYW1lIHJvbGUuCi0gICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8qPiBod0NvZGVjczsKLSAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlIDogcm9sZS5ub2RlcykgeworICAgICAgICBib29sIGlzQXVkaW8gPSBoYXNQcmVmaXgocm9sZS50eXBlLCAiYXVkaW8vIik7CisgICAgICAgIGJvb2wgaXNWaWRlb09ySW1hZ2UgPSBoYXNQcmVmaXgocm9sZS50eXBlLCAidmlkZW8vIikgfHwgaGFzUHJlZml4KHJvbGUudHlwZSwgImltYWdlLyIpOworCisgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyAmbm9kZSA6IHJvbGUubm9kZXMpIHsKICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBub2RlTmFtZSA9IG5vZGUubmFtZTsKKworICAgICAgICAgICAgLy8gY3VycmVudGx5IGltYWdlIGFuZCB2aWRlbyBlbmNvZGVycyB1c2Ugc3VyZmFjZSBpbnB1dAorICAgICAgICAgICAgaWYgKCFtQWxsb3dTdXJmYWNlRW5jb2RlcnMgJiYgaXNWaWRlb09ySW1hZ2UgJiYgaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImRpc2FibGluZyAlcyBmb3IgbWVkaWEgdHlwZSAlcyBiZWNhdXNlIHdlIGFyZSBub3QgdXNpbmcgT01YIGlucHV0IHN1cmZhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUuY19zdHIoKSwgcm9sZS50eXBlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBib29sIGlzU29mdHdhcmUgPSBoYXNQcmVmaXgobm9kZU5hbWUsICJPTVguZ29vZ2xlIik7Ci0gICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgIGlmIChpc1NvZnR3YXJlKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gc3dDb2RlY05hbWUySW5mby5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBod0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVmZXJQbGF0Zm9ybU5vZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgdGhpcyBub2RlIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkIGFmdGVyIGFsbCBzb2Z0d2FyZSBub2Rlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGh3Q29kZWNzLnB1c2hfYmFjaygmbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHVpbnQzMl90IHJhbmsgPSBpc1NvZnR3YXJlCisgICAgICAgICAgICAgICAgICAgID8gKGlzQXVkaW8gPyBkZWZhdWx0U3dBdWRpb1JhbmsgOiBkZWZhdWx0U3dPdGhlclJhbmspCisgICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdFJhbms7CisgICAgICAgICAgICAvLyBnZXQgcmFuayBmcm9tIElPbXhTdG9yZSB2aWEgYXR0cmlidXRlCisgICAgICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6QXR0cmlidXRlJiBhdHRyaWJ1dGUgOiBub2RlLmF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlLmtleSA9PSAicmFuayIpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkUmFuayA9IHJhbms7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoYXR0cmlidXRlLnZhbHVlLmNfc3RyKCksICIldSVjIiwgJnJhbmssICZkdW1teSkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFuayA9IG9sZFJhbms7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOworICAgICAgICAgICAgYXV0byBjMmkgPSBjb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChjMmkgPT0gY29kZWNOYW1lMkluZm8uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCisgICAgICAgICAgICAgICAgYzJpID0gY29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OworICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhyYW5rKTsKKworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisgICAgICAgICAgICAgICAgLy8gYWxsIE9NWCBjb2RlY3MgYXJlIHZlbmRvciBjb2RlY3MgKGluIHRoZSB2ZW5kb3IgcGFydGl0aW9uKSwgYnV0CisgICAgICAgICAgICAgICAgLy8gdHJlYXQgT01YLmdvb2dsZSBjb2RlY3MgYXMgbm9uLWhhcmR3YXJlLWFjY2VsZXJhdGVkIGFuZCBub24tdmVuZG9yCisgICAgICAgICAgICAgICAgaWYgKCFpc1NvZnR3YXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzVmVuZG9yOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLmJlZ2luKCksIG5vZGUuYXR0cmlidXRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBJT214U3RvcmU6OkF0dHJpYnV0ZSAmaSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmtleSA9PSAiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzRW5jb2RlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+c2V0QXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNZWRpYVR5cGUodHlwZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyIsCisgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1lZGlhIHR5cGUgJXMgdG8gY29kZWMgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0gICAgICAgIC8vIGFkZGVkIGluIHRoZSBsb29wIGFib3ZlLCBidXQgcmF0aGVyIHNhdmVkIGluIGh3Q29kZWNzLiBUaGV5IGFyZQotICAgICAgICAvLyBnb2luZyB0byBiZSBhZGRlZCBoZXJlLgotICAgICAgICBpZiAocHJlZmVyUGxhdGZvcm1Ob2RlcykgewotICAgICAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICpub2RlIDogaHdDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlciogaW5mbzsKLSAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS0+b3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAocXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAqbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWltZSAlcyB0byBjb2RlYyAlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBzb2Z0d2FyZSBjb2RlY3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5jX3N0cigpLCBub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby0+cmVtb3ZlTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjQyLDQgKzIyNCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA5ZDJjNDJiLi4yOWMzYTM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlJlbW90ZU1lZGlhRXh0cmFjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgpAQCAtNDksNyArNTAsMTIgQEAKIAogICAgIG1BbmFseXRpY3NJdGVtID0gbnVsbHB0cjsKICAgICBpZiAoTUVESUFfTE9HKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5RXh0cmFjdG9yKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5RXh0cmFjdG9yKTsKKworICAgICAgICAvLyB3ZSdyZSBpbiB0aGUgZXh0cmFjdG9yIHNlcnZpY2UsIHdlIHdhbnQgdG8gYXR0cmlidXRlIHRvIHRoZSBhcHAKKyAgICAgICAgLy8gdGhhdCBpbnZva2VkIHVzLgorICAgICAgICBpbnQgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKHVpZCk7CiAKICAgICAgICAgLy8gdHJhY2sgdGhlIGNvbnRhaW5lciBmb3JtYXQgKG1wZWcsIGFhYywgd3ZtLCBldGMpCiAgICAgICAgIHNpemVfdCBudHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGUwMTBiM2UuLmNmNGVkYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM0LDI1ICszNSwxNiBAQAogCiBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6flN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCkge30KIAotc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKLSAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAotICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIsICIubXhtZiIsCi0gICAgICAgICIuYXZpIiwgIi5tcGVnIiwgIi5tcGciLCAiLmF3YiIsICIubXBnYSIsICIubW92IiwKLSAgICAgICAgIi5tNHYiLCAiLm9nYSIKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bVZhbGlkRXh0ZW5zaW9ucyA9Ci0gICAgICAgIHNpemVvZihrVmFsaWRFeHRlbnNpb25zKSAvIHNpemVvZihrVmFsaWRFeHRlbnNpb25zWzBdKTsKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVmFsaWRFeHRlbnNpb25zOyArK2kpIHsKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKGV4dGVuc2lvbiwga1ZhbGlkRXh0ZW5zaW9uc1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CitzdGF0aWMgYm9vbCBGaWxlSGFzQWNjZXB0YWJsZUV4dGVuc2lvbihjb25zdCBjaGFyICpleHRlbnNpb24pIHsKKworICAgIGlmIChnU3VwcG9ydGVkRXh0ZW5zaW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGdldCB0aGUgbGlzdCBmcm9tIHRoZSBzZXJ2aWNlCisgICAgICAgIGdTdXBwb3J0ZWRFeHRlbnNpb25zID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gIGdTdXBwb3J0ZWRFeHRlbnNpb25zLmNvdW50KHN0ZDo6c3RyaW5nKGV4dGVuc2lvbiArIDEpKSAhPSAwOwogfQogCiBNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKApAQCAtMTMyLDYgKzEyNCwxMSBAQAogICAgICAgICB7ICJkYXRlIiwgTUVUQURBVEFfS0VZX0RBVEUgfSwKICAgICAgICAgeyAid2lkdGgiLCBNRVRBREFUQV9LRVlfVklERU9fV0lEVEggfSwKICAgICAgICAgeyAiaGVpZ2h0IiwgTUVUQURBVEFfS0VZX1ZJREVPX0hFSUdIVCB9LAorICAgICAgICB7ICJjb2xvcnN0YW5kYXJkIiwgTUVUQURBVEFfS0VZX0NPTE9SX1NUQU5EQVJEIH0sCisgICAgICAgIHsgImNvbG9ydHJhbnNmZXIiLCBNRVRBREFUQV9LRVlfQ09MT1JfVFJBTlNGRVIgfSwKKyAgICAgICAgeyAiY29sb3JyYW5nZSIsIE1FVEFEQVRBX0tFWV9DT0xPUl9SQU5HRSB9LAorICAgICAgICB7ICJzYW1wbGVyYXRlIiwgTUVUQURBVEFfS0VZX1NBTVBMRVJBVEUgfSwKKyAgICAgICAgeyAiYml0c3BlcnNhbXBsZSIsIE1FVEFEQVRBX0tFWV9CSVRTX1BFUl9TQU1QTEUgfSwKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUVudHJpZXMgPSBzaXplb2Yoa0tleU1hcCkgLyBzaXplb2Yoa0tleU1hcFswXSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZTgwZWMzYi4uZmEzZDM3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRnJhbWVEZWNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCkBAIC0zMiw4ICszMywxMCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE2Miw2ICsxNjUsOSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgIGlmICghbWV0YSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgQUxPR1YoImdldHRpbmcgdHJhY2sgJXp1IG9mICV6dSwgbWV0YT0lcyIsIGksIG4sIG1ldGEtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKQEAgLTE4Myw2ICsxODksOSBAQAogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgIGlmICghdHJhY2tNZXRhKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGlmIChtZXRhT25seSkgewogICAgICAgICByZXR1cm4gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLCBjb2xvckZvcm1hdCwgdGh1bWJuYWlsKTsKQEAgLTIwNCwxMSArMjEzLDE0IEBACiAgICAgICAgIHRyYWNrTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwogICAgIH0KIAorICAgIGJvb2wgcHJlZmVyaHcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgKKyAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC50aHVtYm5haWwucHJlZmVyX2h3X2NvZGVjcyIsIGZhbHNlKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IHByZWZlcmh3ID8gMCA6IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3M7CiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOwogICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgICAgICBtaW1lLAogICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KLSAgICAgICAgICAgIE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3MsCisgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CkBAIC0yNzAsMTYgKzI4MiwxMyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCkgewotICAgICAgICBBTE9HRSgiZnJhbWUgZ3JhYiBub3QgYWxsb3dlZC4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLQogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKyAgICAgICAgaWYgKCFtZXRhKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKQEAgLTI5Niw2ICszMDUsOSBAQAogCiAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCiAgICAgICAgICAgICBpLCBNZWRpYUV4dHJhY3Rvcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgaWYgKCF0cmFja01ldGEpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQogCiAgICAgaWYgKG1ldGFPbmx5KSB7CiAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7CkBAIC0zMjUsMjQgKzMzNywyNyBAQAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKKyAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCisgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBwcmVmZXJodyA/IDAgOiBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOwogICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICAgICAgbWltZSwKICAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCi0gICAgICAgICAgICBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzLAorICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIFZpZGVvRnJhbWVEZWNvZGVyIGRlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpZiAoZGVjb2Rlci5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICBzcDxWaWRlb0ZyYW1lRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBWaWRlb0ZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLT5pbml0KHRpbWVVcywgbnVtRnJhbWVzLCBvcHRpb24sIGNvbG9yRm9ybWF0KSA9PSBPSykgewogICAgICAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZSgpOworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXItPmV4dHJhY3RGcmFtZSgpOwogICAgICAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRGcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXIuZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgICAgICB9CkBAIC0zOTUsNiArNDEwLDI1IEBACiAgICAgcmV0dXJuIG1NZXRhRGF0YS52YWx1ZUF0KGluZGV4KS5zdHJpbmcoKTsKIH0KIAordm9pZCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpwYXJzZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzdGFuZGFyZCwgdHJhbnNmZXIsIHJhbmdlOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAmc3RhbmRhcmQpCisgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAmdHJhbnNmZXIpCisgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAmcmFuZ2UpKSB7CisgICAgICAgIEFMT0dWKCJmb3VuZCBjb2xvciBhc3BlY3RzIDogc3RhbmRhcmQ9JWQsIHRyYW5zZmVyPSVkLCByYW5nZT0lZCIsCisgICAgICAgICAgICAgICAgc3RhbmRhcmQsIHRyYW5zZmVyLCByYW5nZSk7CisKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ09MT1JfU1RBTkRBUkQsIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBzdGFuZGFyZCkpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DT0xPUl9UUkFOU0ZFUiwgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIHRyYW5zZmVyKSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NPTE9SX1JBTkdFLCBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgcmFuZ2UpKTsKKyAgICB9Cit9CisKIHZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6cGFyc2VNZXRhRGF0YSgpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CiAKQEAgLTUwNyw2ICs1NDEsOSBAQAogICAgIFN0cmluZzggdGltZWRUZXh0TGFuZzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBpZiAoIXRyYWNrTWV0YSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewpAQCAtNTIzLDYgKzU2MCwxOSBAQAogICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdWRpb0JpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQml0cmF0ZSA9IC0xOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSA9IC0xOworICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOworICAgICAgICAgICAgICAgIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCAmYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0c1BlclNhbXBsZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQklUU19QRVJfU0FNUExFLCBTdHJpbmc4KHRtcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfU0FNUExFUkFURSwgU3RyaW5nOCh0bXApKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNWaWRlbyAmJiAhc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgaGFzVmlkZW8gPSB0cnVlOwogCkBAIC01MzQsNiArNTg0LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZUNvdW50LCAmdmlkZW9GcmFtZUNvdW50KSkgewogICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhcnNlQ29sb3JBc3BlY3RzKHRyYWNrTWV0YSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaW1hZ2UvIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKICAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoCkBAIC02MzAsOCArNjgyLDkgQEAKICAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChmaWxlTUlNRSwgInZpZGVvL3gtbWF0cm9za2EiKSkgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoMCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFja01JTUU7Ci0gICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJnRyYWNrTUlNRSkpOwotCisgICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJnRyYWNrTUlNRSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgdHJhY2tNSU1FLCA2KSkgewogICAgICAgICAgICAgICAgIC8vIFRoZSBtYXRyb3NrYSBmaWxlIG9ubHkgY29udGFpbnMgYSBzaW5nbGUgYXVkaW8gdHJhY2ssCiAgICAgICAgICAgICAgICAgLy8gcmV3cml0ZSBpdHMgbWltZSB0eXBlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDUxOWU4NzAuLmZiMDNjNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgpAQCAtMjcsOSArMjgsMTcgQEAKIC8qIHN0YXRpYyAqLyBNdXRleCBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c011dGV4OwogLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKIAotU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCi0gICAgOiBtQ3JlYXRlQ29kZWMobnVsbHB0ciksCi0gICAgICBtQ3JlYXRlQnVpbGRlcihudWxscHRyKSB7CituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtDQ29kZWNQbHVnaW5QYXRoW10gPSAibGlic2ZwbHVnaW5fY2NvZGVjLnNvIjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIDEpID09IDApIHsKKyAgICAgICAgQUxPR0QoIkNDb2RlYyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CiAgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CkBAIC00Niw3ICs1NSw3IEBACiAgICAgfQogICAgIG1DcmVhdGVJbnB1dFN1cmZhY2UgPSAoQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jKWRsc3ltKAogICAgICAgICAgICAgbUxpYkhhbmRsZSwgIkNyZWF0ZUlucHV0U3VyZmFjZSIpOwotICAgIGlmIChtQ3JlYXRlQnVpbGRlciA9PSBudWxscHRyKSB7CisgICAgaWYgKG1DcmVhdGVJbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVJbnB1dFN1cmZhY2UgKCVzKSIsIGRsZXJyb3IoKSk7CiAgICAgfQogfQpAQCAtODcsNyArOTYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOwogICAgIGlmICghc0luc3RhbmNlKSB7CiAgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKLSAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcigibGlic3RhZ2VmcmlnaHRfY2NvZGVjLnNvIikpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGtDQ29kZWNQbHVnaW5QYXRoKSk7CiAgICAgfQogICAgIHJldHVybiBzSW5zdGFuY2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaAppbmRleCA5OTlkMzBjLi43OGVmZmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgIHN0YXRpYyBNdXRleCBzTXV0ZXg7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOwogCi0gICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWM7Ci0gICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXI7Ci0gICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2U7CisgICAgdm9pZCAqbUxpYkhhbmRsZXtudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWN7bnVsbHB0cn07CisgICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXJ7bnVsbHB0cn07CisgICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2V7bnVsbHB0cn07CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKaW5kZXggOWUxMWE5NC4uNGM5NGJhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCkBAIC0xOCwxMCArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZVV0aWxzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKK2V4dGVybiAiQyIgaW50IGFuZHJvaWRfZ2V0X2FwcGxpY2F0aW9uX3RhcmdldF9zZGtfdmVyc2lvbigpOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKQEAgLTI5MSw1ICsyOTQsMjggQEAKIAogICAgIHJldHVybiBlcnI7CiB9CisKK3N0YXR1c190IGRpc2FibGVMZWdhY3lCdWZmZXJEcm9wUG9zdFEoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0KKyAgICAgICAgICAgIHN1cmZhY2UgPyBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGludCB0YXJnZXRTZGsgPSBhbmRyb2lkX2dldF9hcHBsaWNhdGlvbl90YXJnZXRfc2RrX3ZlcnNpb24oKTsKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbGVyIGlzIG5vdCBhbiBhcHAgKGUuZy4gTWVkaWFQbGF5ZXIgaW4gbWVkaWFzZXJ2ZXIpCisgICAgICAgIC8vIHRhcmdldFNkayBpcyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLgorICAgICAgICBib29sIGRyb3AgPQorICAgICAgICAgICAgICAgIHRhcmdldFNkayA8IF9fQU5EUk9JRF9BUElfUV9fIHx8CisgICAgICAgICAgICAgICAgdGFyZ2V0U2RrID09IF9fQU5EUk9JRF9BUElfRlVUVVJFX187CisgICAgICAgIGlmICghZHJvcCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaWdicC0+c2V0TGVnYWN5QnVmZmVyRHJvcChmYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxlZ2FjeSBidWZmZXIgZHJvcCBkaXNhYmxlZDogdGFyZ2V0IHNkayAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTZGspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlzYWJsaW5nIGxlZ2FjeSBidWZmZXIgZHJvcCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MThlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEyIEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Rocm90dGxlZFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwCmluZGV4IDc0OTY3NTIuLjQ5Y2VhOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Rocm90dGxlZFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyb3R0bGVkU291cmNlLmNwcApAQCAtNTEsNyArNTEsNyBAQAogICAgIC8vIEhvdyBsb25nIHdvdWxkIGl0IGhhdmUgdGFrZW4gdG8gdHJhbnNmZXIgZXZlcnl0aGluZyB3ZSBldmVyCiAgICAgLy8gdHJhbnNmZXJyZWQgZ2l2ZW4gdGhlIGxpbWl0ZWQgYmFuZHdpZHRoLgogICAgIGludDY0X3QgZHVyYXRpb25VcyA9Ci0gICAgICAgIG1Ub3RhbFRyYW5zZmVycmVkICogMTAwMDAwMGxsIC8gbUJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQ7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVycmVkICogMTAwMDAwMExMIC8gbUJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQ7CiAKICAgICBpbnQ2NF90IHdoZW5VcyA9IG1TdGFydFRpbWVVcyArIGR1cmF0aW9uVXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCBjZjVlOTFlLi4xMzUxNTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0zNyw3ICszNyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtNzQsNyArNzYsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIDAgdmFsdWVzIGFyZSB1bnNwZWNpZmllZAogICAgIGludDMyX3QgcmFuZ2UgPSAwOwogICAgIGludDMyX3QgcHJpbWFyaWVzID0gMDsKQEAgLTExOSw3ICsxMjEsOCBAQAogICAgIH0KIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKLSAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKKyAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQorICAgICAgICAgICAgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIG90aGVyd2lzZSwgdmVyaWZ5IHRoYXQgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldApAQCAtMTkwLDYgKzE5Myw5IEBACiAgICAgICAgIHsgNTAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCiAgICAgICAgIHsgNTEsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCiAgICAgICAgIHsgNTIsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgNjAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgNjEsIE9NWF9WSURFT19BVkNMZXZlbDYxIH0sCisgICAgICAgIHsgNjIsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU+IHByb2ZpbGVzIHsKICAgICAgICAgeyA2NiwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSB9LApAQCAtNTY4LDggKzU3NCwyNTQgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIHBhcnNlQVYxUHJvZmlsZUxldmVsRnJvbUNzZChjb25zdCBzcDxBQnVmZmVyPiAmY3NkLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIC8vIFBhcnNlIENTRCBzdHJ1Y3R1cmUgdG8gZXh0cmFjdCBwcm9maWxlIGxldmVsIGluZm9ybWF0aW9uCisgICAgLy8gaHR0cHM6Ly9hb21lZGlhY29kZWMuZ2l0aHViLmlvL2F2MS1pc29ibWZmLyNhdjFjb2RlY2NvbmZpZ3VyYXRpb25ib3gKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gY3NkLT5kYXRhKCk7CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGNzZC0+c2l6ZSgpOworICAgIGlmIChyZW1haW5pbmcgPCA0IHx8IGRhdGFbMF0gIT0gMHg4MSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QgcHJvZmlsZURhdGEgPSAoZGF0YVsxXSAmIDB4RTApID4+IDU7CisgICAgdWludDhfdCBsZXZlbERhdGEgPSBkYXRhWzFdICYgMHgxRjsKKyAgICB1aW50OF90IGhpZ2hCaXREZXB0aCA9IChkYXRhWzJdICYgMHg0MCkgPj4gNjsKKworICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHN0ZDo6cGFpcjx1aW50OF90LCB1aW50OF90PiwgaW50MzJfdD4gcHJvZmlsZXMgeworICAgICAgICB7IHsgMCwgMCB9LCBBVjFQcm9maWxlTWFpbjggfSwKKyAgICAgICAgeyB7IDEsIDAgfSwgQVYxUHJvZmlsZU1haW4xMCB9LAorICAgIH07CisKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKHByb2ZpbGVzLm1hcChzdGQ6Om1ha2VfcGFpcihoaWdoQml0RGVwdGgsIHByb2ZpbGVEYXRhKSwgJnByb2ZpbGUpKSB7CisgICAgICAgIC8vIGJ1bXAgdG8gSERSIHByb2ZpbGUKKyAgICAgICAgaWYgKGlzSGRyKGZvcm1hdCkgJiYgcHJvZmlsZSA9PSBBVjFQcm9maWxlTWFpbjEwKSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyMTAtcGx1cy1pbmZvIikpIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZSA9IEFWMVByb2ZpbGVNYWluMTBIRFIxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgcHJvZmlsZSk7CisgICAgfQorICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIGludDMyX3Q+IGxldmVscyB7CisgICAgICAgIHsgMCwgQVYxTGV2ZWwyICAgfSwKKyAgICAgICAgeyAxLCBBVjFMZXZlbDIxICB9LAorICAgICAgICB7IDIsIEFWMUxldmVsMjIgIH0sCisgICAgICAgIHsgMywgQVYxTGV2ZWwyMyAgfSwKKyAgICAgICAgeyA0LCBBVjFMZXZlbDMgICB9LAorICAgICAgICB7IDUsIEFWMUxldmVsMzEgIH0sCisgICAgICAgIHsgNiwgQVYxTGV2ZWwzMiAgfSwKKyAgICAgICAgeyA3LCBBVjFMZXZlbDMzICB9LAorICAgICAgICB7IDgsIEFWMUxldmVsNCAgIH0sCisgICAgICAgIHsgOSwgQVYxTGV2ZWw0MSAgfSwKKyAgICAgICAgeyAxMCwgQVYxTGV2ZWw0MiAgfSwKKyAgICAgICAgeyAxMSwgQVYxTGV2ZWw0MyAgfSwKKyAgICAgICAgeyAxMiwgQVYxTGV2ZWw1ICAgfSwKKyAgICAgICAgeyAxMywgQVYxTGV2ZWw1MSAgfSwKKyAgICAgICAgeyAxNCwgQVYxTGV2ZWw1MiAgfSwKKyAgICAgICAgeyAxNSwgQVYxTGV2ZWw1MyAgfSwKKyAgICAgICAgeyAxNiwgQVYxTGV2ZWw2ICAgfSwKKyAgICAgICAgeyAxNywgQVYxTGV2ZWw2MSAgfSwKKyAgICAgICAgeyAxOCwgQVYxTGV2ZWw2MiAgfSwKKyAgICAgICAgeyAxOSwgQVYxTGV2ZWw2MyAgfSwKKyAgICAgICAgeyAyMCwgQVYxTGV2ZWw3ICAgfSwKKyAgICAgICAgeyAyMSwgQVYxTGV2ZWw3MSAgfSwKKyAgICAgICAgeyAyMiwgQVYxTGV2ZWw3MiAgfSwKKyAgICAgICAgeyAyMywgQVYxTGV2ZWw3MyAgfSwKKyAgICB9OworCisgICAgaW50MzJfdCBsZXZlbDsKKyAgICBpZiAobGV2ZWxzLm1hcChsZXZlbERhdGEsICZsZXZlbCkpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBsZXZlbCk7CisgICAgfQorfQorCisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IHN0cmluZ01hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImFsYnVtIiwga0tleUFsYnVtIH0sCisgICAgICAgIHsgImFsYnVtYXJ0aXN0Iiwga0tleUFsYnVtQXJ0aXN0IH0sCisgICAgICAgIHsgImFydGlzdCIsIGtLZXlBcnRpc3QgfSwKKyAgICAgICAgeyAiYXV0aG9yIiwga0tleUF1dGhvciB9LAorICAgICAgICB7ICJjZHRyYWNrbnVtIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKKyAgICAgICAgeyAiY29tcGlsYXRpb24iLCBrS2V5Q29tcGlsYXRpb24gfSwKKyAgICAgICAgeyAiY29tcG9zZXIiLCBrS2V5Q29tcG9zZXIgfSwKKyAgICAgICAgeyAiZGF0ZSIsIGtLZXlEYXRlIH0sCisgICAgICAgIHsgImRpc2NudW0iLCBrS2V5RGlzY051bWJlciB9LAorICAgICAgICB7ICJnZW5yZSIsIGtLZXlHZW5yZSB9LAorICAgICAgICB7ICJsb2NhdGlvbiIsIGtLZXlMb2NhdGlvbiB9LAorICAgICAgICB7ICJseXJpY2lzdCIsIGtLZXlXcml0ZXIgfSwKKyAgICAgICAgeyAibWFudWZhY3R1cmVyIiwga0tleU1hbnVmYWN0dXJlciB9LAorICAgICAgICB7ICJ0aXRsZSIsIGtLZXlUaXRsZSB9LAorICAgICAgICB7ICJ5ZWFyIiwga0tleVllYXIgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBmbG9hdE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImNhcHR1cmUtcmF0ZSIsIGtLZXlDYXB0dXJlRnJhbWVyYXRlIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50NjRNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJleGlmLW9mZnNldCIsIGtLZXlFeGlmT2Zmc2V0IH0sCisgICAgICAgIHsgImV4aWYtc2l6ZSIsIGtLZXlFeGlmU2l6ZSB9LAorICAgICAgICB7ICJ0YXJnZXQtdGltZSIsIGtLZXlUYXJnZXRUaW1lIH0sCisgICAgICAgIHsgInRodW1ibmFpbC10aW1lIiwga0tleVRodW1ibmFpbFRpbWUgfSwKKyAgICAgICAgeyAidGltZVVzIiwga0tleVRpbWUgfSwKKyAgICAgICAgeyAiZHVyYXRpb25VcyIsIGtLZXlEdXJhdGlvbiB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGludDMyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAibG9vcCIsIGtLZXlBdXRvTG9vcCB9LAorICAgICAgICB7ICJ0aW1lLXNjYWxlIiwga0tleVRpbWVTY2FsZSB9LAorICAgICAgICB7ICJjcnlwdG8tbW9kZSIsIGtLZXlDcnlwdG9Nb2RlIH0sCisgICAgICAgIHsgImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siLCBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLCBrS2V5U2tpcEJ5dGVCbG9jayB9LAorICAgICAgICB7ICJmcmFtZS1jb3VudCIsIGtLZXlGcmFtZUNvdW50IH0sCisgICAgICAgIHsgIm1heC1iaXRyYXRlIiwga0tleU1heEJpdFJhdGUgfSwKKyAgICAgICAgeyAicGNtLWJpZy1lbmRpYW4iLCBrS2V5UGNtQmlnRW5kaWFuIH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWNvdW50Iiwga0tleVRlbXBvcmFsTGF5ZXJDb3VudCB9LAorICAgICAgICB7ICJ0ZW1wb3JhbC1sYXllci1pZCIsIGtLZXlUZW1wb3JhbExheWVySWQgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXdpZHRoIiwga0tleVRodW1ibmFpbFdpZHRoIH0sCisgICAgICAgIHsgInRodW1ibmFpbC1oZWlnaHQiLCBrS2V5VGh1bWJuYWlsSGVpZ2h0IH0sCisgICAgICAgIHsgInZhbGlkLXNhbXBsZXMiLCBrS2V5VmFsaWRTYW1wbGVzIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gYnVmZmVyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW1hcnQiLCBrS2V5QWxidW1BcnQgfSwKKyAgICAgICAgeyAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvIH0sCisgICAgICAgIHsgInBzc2giLCBrS2V5UHNzaCB9LAorICAgICAgICB7ICJjcnlwdG8taXYiLCBrS2V5Q3J5cHRvSVYgfSwKKyAgICAgICAgeyAiY3J5cHRvLWtleSIsIGtLZXlDcnlwdG9LZXkgfSwKKyAgICAgICAgeyAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsIGtLZXlFbmNyeXB0ZWRTaXplcyB9LAorICAgICAgICB7ICJjcnlwdG8tcGxhaW4tc2l6ZXMiLCBrS2V5UGxhaW5TaXplcyB9LAorICAgICAgICB7ICJpY2MtcHJvZmlsZSIsIGtLZXlJY2NQcm9maWxlIH0sCisgICAgICAgIHsgInNlaSIsIGtLZXlTRUkgfSwKKyAgICAgICAgeyAidGV4dC1mb3JtYXQtZGF0YSIsIGtLZXlUZXh0Rm9ybWF0RGF0YSB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtY3NkLWhldmMiLCBrS2V5VGh1bWJuYWlsSFZDQyB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IENTRE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImNzZC0wIiwga0tleU9wYXF1ZUNTRDAgfSwKKyAgICAgICAgeyAiY3NkLTEiLCBrS2V5T3BhcXVlQ1NEMSB9LAorICAgICAgICB7ICJjc2QtMiIsIGtLZXlPcGFxdWVDU0QyIH0sCisgICAgfQorfTsKKwordm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZyhlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGVsZW0uc2Vjb25kLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogZmxvYXRNYXBwaW5ncykgeworICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEZsb2F0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEZsb2F0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDY0TWFwcGluZ3MpIHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDMyTWFwcGluZ3MpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGVsZW0uc2Vjb25kLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGJ1ZmZlck1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogQ1NETWFwcGluZ3MpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShlbGVtLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbHVlLT5kYXRhKCksIHZhbHVlLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiBmb3JtYXQpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKGVsZW0uZmlyc3QsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogZmxvYXRNYXBwaW5ncykgeworICAgICAgICBmbG9hdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRGbG9hdChlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRGbG9hdChlbGVtLmZpcnN0LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDY0TWFwcGluZ3MpIHsKKyAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NChlbGVtLmZpcnN0LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGludDMyTWFwcGluZ3MpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihlbGVtLmZpcnN0LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGJ1ZmZlck1hcHBpbmdzKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoZWxlbS5zZWNvbmQsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEJ1ZmZlcihlbGVtLmZpcnN0LCBidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBDU0RNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgYnVmLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEJ1ZmZlcihlbGVtLmZpcnN0LCBidWYpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKKyAgICByZXR1cm4gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEuZ2V0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgewogCiAgICAgZm9ybWF0LT5jbGVhcigpOwogCkBAIC01ODYsNiArODM4LDggQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOwogICAgIG1zZy0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CiAKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MobWV0YSwgbXNnKTsKKwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKQEAgLTU5OSw2ICs4NTMsMTYgQEAKICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKICAgICB9CiAKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNBUHJpdmF0ZURhdGEsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjYS1wcml2YXRlLWRhdGEiLCBidWZmZXIpOworICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgIH0KKwogICAgIGludDMyX3Qgc3lzdGVtSWQ7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgJnN5c3RlbUlkKSkgewogICAgICAgICBtc2ctPnNldEludDMyKCJjYS1zeXN0ZW0taWQiLCBzeXN0ZW1JZCk7CkBAIC03MTIsNiArOTc2LDE2IEBACiAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdCgqKEhEUlN0YXRpY0luZm8qKWRhdGEsIG1zZyk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUhkcjEwUGx1c0luZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICAgICAgJiYgc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCBidWZmZXIpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKG1ldGEsIG1zZyk7CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC03MjMsNiArOTk3LDExIEBACiAgICAgICAgIG1zZy0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBudW1DaGFubmVscyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgc2FtcGxlUmF0ZSk7CiAKKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCAmYml0c1BlclNhbXBsZSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImJpdHMtcGVyLXNhbXBsZSIsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImNoYW5uZWwtbWFzayIsIGNoYW5uZWxNYXNrKTsKQEAgLTc1MSw2ICsxMDMwLDExIEBACiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVBjbUVuY29kaW5nLCAmcGNtRW5jb2RpbmcpKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SGFwdGljQ2hhbm5lbENvdW50LCAmaGFwdGljQ2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiaGFwdGljLWNoYW5uZWwtY291bnQiLCBoYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CkBAIC04ODAsNyArMTE2NCw5IEBACiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCi0gICAgICAgIGlmIChzaXplIDwgMjMgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgaWYgKHNpemUgPCAyMyB8fCAocHRyWzBdICE9IDEgJiYgcHRyWzBdICE9IDApKSB7CisgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxIG9yIDAKKyAgICAgICAgICAgIC8vIDEgaXMgd2hhdCB0aGUgc3RhbmRhcmQgZGljdGF0ZXMsIGJ1dCBzb21lIG9sZCBtdXhlcnMgbWF5IGhhdmUgdXNlZCAwLgogICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KQEAgLTk1MCw3ICsxMjM2LDY4IEBACiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9pcy1oZHIiLCAoaW5mbyAmIGh2Y2Mua0luZm9Jc0hkcikgIT0gMCk7CiAgICAgICAgIH0KIAorICAgICAgICB1aW50MzJfdCBpc29QcmltYXJpZXMsIGlzb1RyYW5zZmVyLCBpc29NYXRyaXgsIGlzb1JhbmdlOworICAgICAgICBpZiAoaHZjYy5maW5kUGFyYW0zMihrQ29sb3VyUHJpbWFyaWVzLCAmaXNvUHJpbWFyaWVzKQorICAgICAgICAgICAgICAgICYmIGh2Y2MuZmluZFBhcmFtMzIoa1RyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzLCAmaXNvVHJhbnNmZXIpCisgICAgICAgICAgICAgICAgJiYgaHZjYy5maW5kUGFyYW0zMihrTWF0cml4Q29lZmZzLCAmaXNvTWF0cml4KQorICAgICAgICAgICAgICAgICYmIGh2Y2MuZmluZFBhcmFtMzIoa1ZpZGVvRnVsbFJhbmdlRmxhZywgJmlzb1JhbmdlKSkgeworICAgICAgICAgICAgQUxPR1YoImZvdW5kIGlzbyBjb2xvciBhc3BlY3RzIDogcHJpbWFyaXM9JWQsIHRyYW5zZmVyPSVkLCBtYXRyaXg9JWQsIHJhbmdlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4LCBpc29SYW5nZSk7CisKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgICAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgICAgICBpc29QcmltYXJpZXMsIGlzb1RyYW5zZmVyLCBpc29NYXRyaXgsIGlzb1JhbmdlLCBhc3BlY3RzKTsKKworICAgICAgICAgICAgaWYgKGFzcGVjdHMubVByaW1hcmllcyA9PSBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmltYXJpZXM7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsICZwcmltYXJpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bnNwZWNpZmllZCBwcmltYXJpZXMgZm91bmQsIHJlcGxhY2VkIHRvICVkIiwgcHJpbWFyaWVzKTsKKyAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gc3RhdGljX2Nhc3Q8Q29sb3JBc3BlY3RzOjpQcmltYXJpZXM+KHByaW1hcmllcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFzcGVjdHMubVRyYW5zZmVyID09IENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNmZXJGdW5jdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCAmdHJhbnNmZXJGdW5jdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuc3BlY2lmaWVkIHRyYW5zZmVyIGZvdW5kLCByZXBsYWNlZCB0byAlZCIsIHRyYW5zZmVyRnVuY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IHN0YXRpY19jYXN0PENvbG9yQXNwZWN0czo6VHJhbnNmZXI+KHRyYW5zZmVyRnVuY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPT0gQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY29sb3JNYXRyaXg7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JNYXRyaXgsICZjb2xvck1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuc3BlY2lmaWVkIG1hdHJpeCBmb3VuZCwgcmVwbGFjZWQgdG8gJWQiLCBjb2xvck1hdHJpeCk7CisgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IHN0YXRpY19jYXN0PENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzPihjb2xvck1hdHJpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFzcGVjdHMubVJhbmdlID09IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2U7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgJnJhbmdlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5zcGVjaWZpZWQgcmFuZ2UgZm91bmQsIHJlcGxhY2VkIHRvICVkIiwgcmFuZ2UpOworICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLm1SYW5nZSA9IHN0YXRpY19jYXN0PENvbG9yQXNwZWN0czo6UmFuZ2U+KHJhbmdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQsIHRyYW5zZmVyLCByYW5nZTsKKyAgICAgICAgICAgIGlmIChDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICAgICAgYXNwZWN0cywgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2ZlcikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci1zdGFuZGFyZCIsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci10cmFuc2ZlciIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci1yYW5nZSIsIHJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHBhcnNlSGV2Y1Byb2ZpbGVMZXZlbEZyb21IdmNjKChjb25zdCB1aW50OF90ICopZGF0YSwgZGF0YVNpemUsIG1zZyk7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVYxQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKyAgICAgICAgcGFyc2VBVjFQcm9maWxlTGV2ZWxGcm9tQ3NkKGJ1ZmZlciwgbXNnKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgaWYgKGVzZHMuSW5pdENoZWNrKCkgIT0gKHN0YXR1c190KU9LKSB7CkBAIC05OTgsMzMgKzEzNDUsOSBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1iaXRyYXRlIiwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtUeXBlRDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgIHBhcnNlSDI2M1Byb2ZpbGVMZXZlbEZyb21EMjYzKHB0ciwgc2l6ZSwgbXNnKTsKLSAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLQotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwotCi0gICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLQotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwogICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewpAQCAtMTA2MywxNiArMTM4Niw2IEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMiIsIGJ1ZmZlcik7Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RmxhY01ldGFkYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLQotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CiAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CkBAIC0xMDg1LDEzICsxMzk4LDE3IEBACiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAKICAgICAgICAgcGFyc2VWcDlQcm9maWxlTGV2ZWxGcm9tQ3NkKGJ1ZmZlciwgbXNnKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPIGV4cG9zZSAiY3J5cHRvLWtleSIva0tleUNyeXB0b0tleSB0aHJvdWdoIHB1YmxpYyBhcGkKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGFjTWFnaWNDb29raWUsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIEFMT0dWKCJjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UgZm91bmQga0tleUFsYWNNYWdpY0Nvb2tpZSBvZiBzaXplICV6dVxuIiwgc2l6ZSk7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3J5cHRvLWtleSIsIGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9CiAKICAgICAqZm9ybWF0ID0gbXNnOwpAQCAtMTI5Miw2ICsxNjA5LDIxIEBACiAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgbWltZSB0eXBlIik7CiAgICAgfQogCisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKG1zZywgbWV0YSk7CisKKyAgICBpbnQzMl90IHN5c3RlbUlkOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2Etc3lzdGVtLWlkIiwgJnN5c3RlbUlkKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgc3lzdGVtSWQpOworCisgICAgICAgIHNwPEFCdWZmZXI+IGNhU2Vzc2lvbklkLCBjYVB2dERhdGE7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXNlc3Npb24taWQiLCAmY2FTZXNzaW9uSWQpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwgY2FTZXNzaW9uSWQtPmRhdGEoKSwgY2FTZXNzaW9uSWQtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgJmNhUHZ0RGF0YSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBUHJpdmF0ZURhdGEsIDAsIGNhUHZ0RGF0YS0+ZGF0YSgpLCBjYVB2dERhdGEtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CkBAIC0xMzIzLDcgKzE2NTUsNyBAQAogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CisgICAgICAgICAgICBBTE9HVigiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKICAgICAgICAgfQogCiAgICAgICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKQEAgLTEzODYsNiArMTcxOCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAwLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5kYXRhKCksIGhkcjEwUGx1c0luZm8tPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFDb2xvckFzcGVjdHMobXNnLCBtZXRhKTsKIAogICAgICAgICBBU3RyaW5nIHRzU2NoZW1hOwpAQCAtMTQxMCw2ICsxNzQ4LDEwIEBACiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrKTsKQEAgLTE0MjgsMTAgKzE3NzAsMjAgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlJc0FEVFMsIGlzQURUUyk7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUFBQ0FPVCwgYWFjUHJvZmlsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IHBjbUVuY29kaW5nOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsICZwY21FbmNvZGluZykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiaGFwdGljLWNoYW5uZWwtY291bnQiLCAmaGFwdGljQ2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhhcHRpY0NoYW5uZWxDb3VudCwgaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwpAQCAtMTQ2OCw0MCArMTgyMCw3MSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwKKyAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0IHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgfHwKKyAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNIHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNKSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlc2RzKGNzZDBzaXplICsgMzEpOwogICAgICAgICAgICAgLy8gVGhlIHdyaXR0ZW4gRVNEUyBpcyBhY3R1YWxseSBmb3IgYW4gYXVkaW8gc3RyZWFtLCBidXQgaXQncyBlbm91Z2gKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGNzZDAtPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gY3NkMC0+ZGF0YSgpOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZlNpemUgPSBjc2QxLT5zaXplKCk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZiA9IGNzZDEtPmRhdGEoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2Vla1ByZVJvbGxCdWZTaXplID0gY3NkMi0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmID0gY3NkMi0+ZGF0YSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAvKiBFeHRyYWN0IGNvZGVjIGRlbGF5IGFuZCBzZWVrIHByZSByb2xsIGZyb20gY3NkLTAsCisgICAgICAgICAgICAgKiBpZiBjc2QtMSBhbmQgY3NkLTIgYXJlIG5vdCBwcmVzZW50ICovCisgICAgICAgICAgICBpZiAoIWNvZGVjRGVsYXlCdWYgJiYgIXNlZWtQcmVSb2xsQnVmKSB7CisgICAgICAgICAgICAgICAgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCksICZvcHVzSGVhZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIG9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUpOworICAgICAgICAgICAgaWYgKGNvZGVjRGVsYXlCdWYpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgMCwgY29kZWNEZWxheUJ1ZiwgY29kZWNEZWxheUJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlZWtQcmVSb2xsQnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBzZWVrUHJlUm9sbEJ1Ziwgc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYWNNYWdpY0Nvb2tpZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWF2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1oZXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJlc2RzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJtcGVnMi1zdHJlYW0taGVhZGVyIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImQyNjMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCkBAIC0xNTc3LDcgKzE5NjAsMTEgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywgICAgICAgIEFVRElPX0ZPUk1BVF9FX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywgICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQ30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsICAgICAgICAgQVVESU9fRk9STUFUX0FDNH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0ZMQUN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9BTEFDIH0sCiAgICAgeyAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCB9CiB9OwogCkBAIC0xNjI5LDQ2ICsyMDE2LDQ2IEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICgqaW5mbykgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwogCi0gICAgaW5mby5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CisgICAgaW5mby0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwgbWltZSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiBDb3VsZG4ndCBtYXAgbWltZSB0eXBlIFwiJXNcIiB0byBhIHZhbGlkIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgISIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8uZm9ybWF0KTsKKyAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8tPmZvcm1hdCk7CiAgICAgfQogCi0gICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8uZm9ybWF0KSB7CisgICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8tPmZvcm1hdCkgewogICAgICAgICAvLyBjYW4ndCBvZmZsb2FkIGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgc291cmNlIGZvcm1hdCBpcwogICAgICAgICBBTE9HRSgibWltZSB0eXBlIFwiJXNcIiBub3QgYSBrbm93biBhdWRpbyBmb3JtYXQiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIFJlZGVmaW5lIGFhYyBmb3JtYXQgYWNjb3JkaW5nIHRvIGl0cyBwcm9maWxlCiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CisgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNyYXRlKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggc2FtcGxlIHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgIGluZm8tPnNhbXBsZV9yYXRlID0gc3JhdGU7CiAKICAgICBpbnQzMl90IGNtYXNrID0gMDsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykpIHsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykgfHwgY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBjaGFubmVsIG1hc2siLCBtaW1lKTsKIAogICAgICAgICAvLyBUcnkgYSBjaGFubmVsIGNvdW50IGluc3RlYWQKQEAgLTE2NzksMjUgKzIwNjYsMzQgQEAKICAgICAgICAgICAgIGNtYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaW5mby5jaGFubmVsX21hc2sgPSBjbWFzazsKKyAgICBpbmZvLT5jaGFubmVsX21hc2sgPSBjbWFzazsKIAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggZHVyYXRpb24iLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOworICAgIGluZm8tPmR1cmF0aW9uX3VzID0gZHVyYXRpb247CiAKICAgICBpbnQzMl90IGJyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZicmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5iaXRfcmF0ZSA9IGJyYXRlOworICAgIGluZm8tPmJpdF9yYXRlID0gYnJhdGU7CiAKIAotICAgIGluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwotICAgIGluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87Ci0gICAgaW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICBpbmZvLT5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CisgICAgaW5mby0+aGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgaW5mby0+aXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgcmV0dXJuIE9LOworfQogCitib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwpAQCAtMTczOCw3ICsyMTM0LDcgQEAKIAogSExTVGltZTo6SExTVGltZShjb25zdCBzcDxBTWVzc2FnZT4mIG1ldGEpIDoKICAgICBtU2VxKC0xKSwKLSAgICBtVGltZVVzKC0xbGwpLAorICAgIG1UaW1lVXMoLTFMTCksCiAgICAgbU1ldGEobWV0YSkgewogICAgIGlmIChtZXRhICE9IE5VTEwpIHsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJm1TZXEpKTsKQEAgLTE3NDcsNyArMjE0Myw3IEBACiB9CiAKIGludDY0X3QgSExTVGltZTo6Z2V0U2VnbWVudFRpbWVVcygpIGNvbnN0IHsKLSAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMUxMOwogICAgIGlmIChtTWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLKG1NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZzZWdtZW50U3RhcnRUaW1lVXMpKTsKIApAQCAtMTg2Nyw0ICsyMjYzLDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA5MDIwZmMxLi40ZTViNWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE5LDggKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgpAQCAtMzIsMzIxICszMSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7Ci0gICAgaWYgKCpsaHMgPCAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYwotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCi0gICAgOiBtUGVyaW9kKC0xKSwKLSAgICAgIG1QaGFzZSgwKSwKLSAgICAgIG1QcmltZWQoZmFsc2UpLAotICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKLSAgICAgIG1MYXN0VGltZSgtMSksCi0gICAgICBtTnVtU2FtcGxlcygwKSB7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKLSAgICAvL3Rlc3QoKTsKLQotICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgIG1MYXN0VGltZSA9IC0xOwotCi0gICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAotICAgIGlmIChmcHMgPD0gMC5mKSB7Ci0gICAgICAgIG1QZXJpb2QgPSAtMTsKLSAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7Ci0gICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKLSAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmVzdGFydCgpOwotfQotCi0vLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKLSAgICBtTnVtU2FtcGxlcyA9IDA7Ci0gICAgbVBoYXNlID0gLTE7Ci19Ci0KLSNpZiAwCi0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgewotICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOwotICAgIG1UaW1lc1swXSA9IDA7Ci0gICAgbVRpbWVzWzFdID0gcGVyaW9kOwotICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7Ci0gICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKLSAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OwotICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7Ci0gICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7Ci0gICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7Ci0gICAgbU51bVNhbXBsZXMgPSA4OwotICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7Ci0gICAgLy8gYSA9IDAuOCg1KSsKLSAgICAvLyBiID0gLTAuMTQwOTcoMikrCi0gICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCi0gICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCi0gICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKLSAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7Ci0gICAgfQotCi0gICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKLSAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3Qgc3VtWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZID0gMDsKLQotICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQotICAgIG5zZWNzX3QgbGFzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgewotICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKLSAgICAgICAgfQotICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KLSAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZwotICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAotICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgotICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKLSAgICAgICAgc3VtWCArPSB4OwotICAgICAgICBzdW1ZICs9IHk7Ci0gICAgICAgIHN1bVhYICs9IHggKiB4OwotICAgICAgICBzdW1YWSArPSB4ICogeTsKLSAgICAgICAgc3VtWVkgKz0geSAqIHk7Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKLSAgICBpZiAoZGl2ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOwotICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKLSAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOwotICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7Ci0gICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50Ci0gICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKLSAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCi0gICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLSAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCi0KLSAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKLSAgICAvLyAybmQgb3JkZXIgZGVsdGFzCi0gICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKLSAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgewotICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFRpbWUgPSB0aW1lOwotICAgIH0KLSAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKLSAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKLSAgICBpZiAobnVtRGVsdGFzID4gMSkgewotICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgewotICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7Ci0gICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKLSAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKLSAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAotICAgIGludDY0X3QgYmVzdFNjb3JlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07Ci0gICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOwotI2lmIDEKLSAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKLSAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOwotICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgewotICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzY29yZSA9IG1hdGNoZXM7Ci0jaWYgMAotICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCi0gICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7Ci0gICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKLSAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOwotICAgICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKLSAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKLSAgICBpZiAobUxhc3RUaW1lID49IDAKLSAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKLSAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKLSAgICAgICAgcmVzdGFydCgpOwotICAgIH0KLQotICAgIG1MYXN0VGltZSA9IHRpbWU7Ci0gICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7Ci0gICAgKyttTnVtU2FtcGxlczsKLQotICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7Ci0gICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7Ci0gICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOwotICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0gICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICBpZiAobVBoYXNlIDwgMCkgewotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQotICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKLSAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKLSAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb0ZpdCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgewotICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KLSAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKLQotICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKLSAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLQotICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1QZXJpb2Q7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCi0KLVZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQotICAgIDogbVZzeW5jVGltZSgwKSwKLSAgICAgIG1Wc3luY1BlcmlvZCgwKSwKLSAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKLSAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKLSAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7CitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKIH0KIAogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjp1cGRhdGVWc3luYygpIHsKICAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOwotICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKIAotICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKLSAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKICAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKICAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpAQCAtMzY4LDEzNiArNjAsNiBAQAogICAgIH0KIH0KIAotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7Ci0gICAgdXBkYXRlVnN5bmMoKTsKLQotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlc3RhcnQoKSB7Ci0gICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKLSAgICBtVGltZUNvcnJlY3Rpb24gPSAwOwotCi0gICAgbVBsbC5yZXN0YXJ0KCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7Ci0gICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Ci19Ci0KLWZsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIDAuZjsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKLSAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKLQotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7Ci0gICAgICAgIHVwZGF0ZVZzeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0gICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKLSAgICB9Ci0KLSAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQotICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKLSAgICAgICAgbVZzeW5jVGltZSAtPQotICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0KLSAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCi0gICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKLSAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0KLSAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOwotICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKLSAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKLSAgICAgICAgc2l6ZV90IE4gPSAxMjsKLSAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQotICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7Ci0gICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCi0gICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCi0gICAgICAgICAgICBOID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7Ci0gICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgewotICAgICAgICAgICAgb2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOwotICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKLSAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKLSAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOwotICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7Ci0gICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKLSAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KLSAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7Ci0KLSAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQwotICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQotICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKLSAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKLSAgICAgICAgICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcwotICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7Ci0gICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKLSAgICByZXR1cm4gcmVuZGVyVGltZTsKLX0KLQogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgewogICAgIG1Db21wb3Nlci5jbGVhcigpOwogfQpAQCAtNTA3LDQgKzY5LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2NzFmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlcjIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Nob3Jlb2dyYXBoZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZzeW5jVHJhY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBWc3luY1RyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZXsKK3B1YmxpYzoKKyAgICBWc3luY1RyYWNrZXIoKTsKKyAgICB+VnN5bmNUcmFja2VyKCkge30KKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisgICAgbnNlY3NfdCBnZXRWc3luY1RpbWUobnNlY3NfdCBwZXJpb2RPZmZzZXQpOworICAgIHZvaWQgYWRkU2FtcGxlKG5zZWNzX3QgdGltZXN0YW1wKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhTYW1wbGVzID0gMzI7CisgICAgc3RhdGljIGNvbnN0IGludCBrTWluU2FtcGxlc0ZvclVwZGF0ZSA9IDY7CisgICAgaW50IG1OdW1TYW1wbGVzOworICAgIGludCBtRmlyc3RTYW1wbGU7CisgICAgbnNlY3NfdCBtUmVmZXJlbmNlVGltZTsKKyAgICBuc2Vjc190IG1QaGFzZTsKKyAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgbnNlY3NfdCBtVGltZXN0YW1wU2FtcGxlc1trTWF4U2FtcGxlc107CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICB2b2lkIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9OworCitWc3luY1RyYWNrZXI6OlZzeW5jVHJhY2tlcigpCisgICAgOiBtTnVtU2FtcGxlcygwKSwKKyAgICAgIG1GaXJzdFNhbXBsZSgwKSwKKyAgICAgIG1SZWZlcmVuY2VUaW1lKDApLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVBlcmlvZCgwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U2FtcGxlczsgaSsrKSB7CisgICAgICAgIG1UaW1lc3RhbXBTYW1wbGVzW2ldID0gMDsKKyAgICB9Cit9CisKK25zZWNzX3QgVnN5bmNUcmFja2VyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNUaW1lKG5zZWNzX3QgcGVyaW9kT2Zmc2V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IHBoYXNlID0gbVJlZmVyZW5jZVRpbWUgKyBtUGhhc2U7CisKKyAgICAvLyByZXN1bHQgPSAoKChub3cgLSBwaGFzZSkgLyBtUGVyaW9kKSArIHBlcmlvZE9mZnNldCArIDEpICogbVBlcmlvZCArIHBoYXNlCisgICAgLy8gcHJldmVudCBvdmVyZmxvdworICAgIG5zZWNzX3QgcmVzdWx0ID0gKG5vdyAtIHBoYXNlKSAvIG1QZXJpb2Q7CisgICAgaWYgKHJlc3VsdCA+IExPTkdfTE9OR19NQVggLSBwZXJpb2RPZmZzZXQgLSAxKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBwZXJpb2RPZmZzZXQgKyAxOworICAgIH0KKyAgICBpZiAocmVzdWx0ID4gTE9OR19MT05HX01BWCAvIG1QZXJpb2QpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICo9IG1QZXJpb2Q7CisgICAgfQorICAgIGlmIChyZXN1bHQgPiBMT05HX0xPTkdfTUFYIC0gcGhhc2UpIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTE9OR19NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9IHBoYXNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIG1QaGFzZSA9IDA7CisgICAgICAgIG1SZWZlcmVuY2VUaW1lID0gdGltZXN0YW1wOworICAgIH0KKyAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIG1OdW1TYW1wbGVzKSAlIGtNYXhTYW1wbGVzOworICAgIG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gPSB0aW1lc3RhbXA7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwga01heFNhbXBsZXMpIHsKKyAgICAgICAgbU51bVNhbXBsZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmlyc3RTYW1wbGUgPSAobUZpcnN0U2FtcGxlICsgMSkgJSBrTWF4U2FtcGxlczsKKyAgICB9CisgICAgdXBkYXRlTW9kZWxMb2NrZWQoKTsKK30KKwordm9pZCBWc3luY1RyYWNrZXI6OnVwZGF0ZU1vZGVsTG9ja2VkKCkgeworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNaW5TYW1wbGVzRm9yVXBkYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbnNlY3NfdCBkdXJhdGlvblN1bSA9IDA7CisgICAgbnNlY3NfdCBtaW5EdXJhdGlvbiA9IExPTkdfTUFYOworICAgIG5zZWNzX3QgbWF4RHVyYXRpb24gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgaW50IHByZXYgPSAoaWR4ICsga01heFNhbXBsZXMgLSAxKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIGR1cmF0aW9uID0gbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSAtIG1UaW1lc3RhbXBTYW1wbGVzW3ByZXZdOworICAgICAgICBkdXJhdGlvblN1bSArPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1pbkR1cmF0aW9uID4gZHVyYXRpb24pIHsgbWluRHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgICAgICBpZiAobWF4RHVyYXRpb24gPCBkdXJhdGlvbikgeyBtYXhEdXJhdGlvbiA9IGR1cmF0aW9uOyB9CisgICAgfQorCisgICAgZHVyYXRpb25TdW0gLT0gKG1pbkR1cmF0aW9uICsgbWF4RHVyYXRpb24pOworICAgIG1QZXJpb2QgPSBkdXJhdGlvblN1bSAvIChtTnVtU2FtcGxlcyAtIDMpOworCisgICAgZG91YmxlIHNhbXBsZUF2Z1ggPSAwLjA7CisgICAgZG91YmxlIHNhbXBsZUF2Z1kgPSAwLjA7CisgICAgZG91YmxlIHNjYWxlID0gMi4wICogTV9QSSAvIChkb3VibGUpIG1QZXJpb2Q7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG1OdW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBpKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIHNhbXBsZSA9IG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gLSBtUmVmZXJlbmNlVGltZTsKKyAgICAgICAgZG91YmxlIHNhbXBsZVBoYXNlID0gKGRvdWJsZSkgKHNhbXBsZSAlIG1QZXJpb2QpICogc2NhbGU7CisgICAgICAgIHNhbXBsZUF2Z1ggKz0gY29zKHNhbXBsZVBoYXNlKTsKKyAgICAgICAgc2FtcGxlQXZnWSArPSBzaW4oc2FtcGxlUGhhc2UpOworICAgIH0KKworICAgIHNhbXBsZUF2Z1ggLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgc2FtcGxlQXZnWSAvPSAoZG91YmxlKSBtTnVtU2FtcGxlcyAtIDEuMDsKKyAgICBtUGhhc2UgPSAobG9uZykgKGF0YW4yKHNhbXBsZUF2Z1ksIHNhbXBsZUF2Z1gpIC8gc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCBmcmFtZUNhbGxiYWNrKGludDY0X3QgZnJhbWVUaW1lTmFub3MsIHZvaWQqIGRhdGEpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8VnN5bmNUcmFja2VyPiB2c3luY1RyYWNrZXIoc3RhdGljX2Nhc3Q8VnN5bmNUcmFja2VyKj4oZGF0YSkpOworICAgIHZzeW5jVHJhY2tlci0+YWRkU2FtcGxlKGZyYW1lVGltZU5hbm9zKTsKKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjazY0KEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCksCisgICAgICAgICAgICBmcmFtZUNhbGxiYWNrLCBzdGF0aWNfY2FzdDx2b2lkKj4odnN5bmNUcmFja2VyLmdldCgpKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHZvaWQgZ2V0VnN5bmNPZmZzZXQobnNlY3NfdCogYXBwVnN5bmNPZmZzZXRQdHIsIG5zZWNzX3QqIHNmVnN5bmNPZmZzZXRQdHIpIHsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT25lTWlsbGlzZWNJbk5hbm9zZWMgPSAxMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtPbmVTZWNJbk5hbm9zZWMgPSBrT25lTWlsbGlzZWNJbk5hbm9zZWMgKiAxMDAwOworCisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMgPSBlbnYtPkZpbmRDbGFzcygKKyAgICAgICAgICAgICJhbmRyb2lkL2hhcmR3YXJlL2Rpc3BsYXkvRGlzcGxheU1hbmFnZXJHbG9iYWwiKTsKKyAgICBqY2xhc3MgakRpc3BsYXlDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L0Rpc3BsYXkiKTsKKworICAgIGptZXRob2RJRCBqR2V0SW5zdGFuY2UgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRJbnN0YW5jZSIsICIoKUxhbmRyb2lkL2hhcmR3YXJlL2Rpc3BsYXkvRGlzcGxheU1hbmFnZXJHbG9iYWw7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU1hbmFnZXJHbG9iYWxPYmogPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoCisgICAgICAgICAgICBqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsIGpHZXRJbnN0YW5jZSk7CisKKyAgICBqZmllbGRJRCBqREVGQVVMVF9ESVNQTEFZID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKGpEaXNwbGF5Q2xzLCAiREVGQVVMVF9ESVNQTEFZIiwgIkkiKTsKKyAgICBqaW50IERFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljSW50RmllbGQoakRpc3BsYXlDbHMsIGpERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpnZXRSZWFsRGlzcGxheSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLAorICAgICAgICAgICAgImdldFJlYWxEaXNwbGF5IiwgIihJKUxhbmRyb2lkL3ZpZXcvRGlzcGxheTsiKTsKKyAgICBqb2JqZWN0IGphdmFEaXNwbGF5T2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqLCBqZ2V0UmVhbERpc3BsYXksIERFRkFVTFRfRElTUExBWSk7CisKKyAgICBqbWV0aG9kSUQgakdldFJlZnJlc2hSYXRlID0gZW52LT5HZXRNZXRob2RJRChqRGlzcGxheUNscywgImdldFJlZnJlc2hSYXRlIiwgIigpRiIpOworICAgIGpmbG9hdCBqYXZhUmVmcmVzaFJhdGUgPSBlbnYtPkNhbGxGbG9hdE1ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldFJlZnJlc2hSYXRlKTsKKyAgICBuc2Vjc190IHZzeW5jUGVyaW9kID0gKG5zZWNzX3QpIChrT25lU2VjSW5OYW5vc2VjIC8gKGZsb2F0KSBqYXZhUmVmcmVzaFJhdGUpOworCisgICAgam1ldGhvZElEIGpHZXRBcHBWc3luY09mZnNldE5hbm9zID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpEaXNwbGF5Q2xzLCAiZ2V0QXBwVnN5bmNPZmZzZXROYW5vcyIsICIoKUoiKTsKKyAgICBqbG9uZyBqYXZhQXBwVnN5bmNPZmZzZXQgPSBlbnYtPkNhbGxMb25nTWV0aG9kKGphdmFEaXNwbGF5T2JqLCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyk7CisgICAgKmFwcFZzeW5jT2Zmc2V0UHRyID0gKG5zZWNzX3QpIGphdmFBcHBWc3luY09mZnNldDsKKworICAgIGptZXRob2RJRCBqR2V0UHJlc2VudGF0aW9uRGVhZGxpbmVOYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lID0gZW52LT5DYWxsTG9uZ01ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5T2JqLCBqR2V0UHJlc2VudGF0aW9uRGVhZGxpbmVOYW5vcyk7CisKKyAgICAqc2ZWc3luY09mZnNldFB0ciA9IHZzeW5jUGVyaW9kIC0gKChuc2Vjc190KSBqYXZhUHJlc2VudGF0aW9uRGVhZGxpbmUgLSBrT25lTWlsbGlzZWNJbk5hbm9zZWMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIENob3Jlb2dyYXBoZXIgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBDaG9yZW9ncmFwaGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgQ2hvcmVvZ3JhcGhlclRocmVhZChib29sIGNhbkNhbGxKYXZhKTsKKyAgICBzdGF0dXNfdCBpbml0KHZvaWQqIGRhdGEpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZHlUb1J1bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DaG9yZW9ncmFwaGVyVGhyZWFkKCkge30KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaG9yZW9ncmFwaGVyVGhyZWFkKTsKKyAgICB2b2lkKiBtRGF0YTsKK307CisKK0Nob3Jlb2dyYXBoZXJUaHJlYWQ6OkNob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSkgOiBUaHJlYWQoY2FuQ2FsbEphdmEpIHsKK30KKworc3RhdHVzX3QgQ2hvcmVvZ3JhcGhlclRocmVhZDo6aW5pdCh2b2lkKiBkYXRhKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbURhdGEgPSBkYXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2hvcmVvZ3JhcGhlclRocmVhZDo6cmVhZHlUb1J1bigpIHsKKyAgICBBTG9vcGVyX3ByZXBhcmUoQUxPT1BFUl9QUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1MpOworICAgIGlmIChBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFDaG9yZW9ncmFwaGVyX3Bvc3RGcmFtZUNhbGxiYWNrNjQoQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSwgZnJhbWVDYWxsYmFjaywgbURhdGEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDaG9yZW9ncmFwaGVyVGhyZWFkOjp0aHJlYWRMb29wKCkgeworICAgIEFMb29wZXJfcG9sbE9uY2UoLTEsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHJldHVybiB0cnVlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXIyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyMigpIDogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7CisKKyAgICBnZXRWc3luY09mZnNldCgmbUFwcFZzeW5jT2Zmc2V0LCAmbVNmVnN5bmNPZmZzZXQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIHRocmVhZExvY2sobUxvY2spOworICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkID0gbmV3IENob3Jlb2dyYXBoZXJUaHJlYWQodHJ1ZSk7CisKKyAgICBtVnN5bmNUcmFja2VyID0gbmV3IFZzeW5jVHJhY2tlcigpOworICAgIGlmIChtQ2hvcmVvZ3JhcGhlclRocmVhZC0+aW5pdChzdGF0aWNfY2FzdDx2b2lkKj4obVZzeW5jVHJhY2tlci5nZXQoKSkpICE9IE9LKSB7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtQ2hvcmVvZ3JhcGhlclRocmVhZCAhPSBOVUxMICYmIG1DaG9yZW9ncmFwaGVyVGhyZWFkLT5ydW4oIkNob3Jlb2dyYXBoZXIiKSAhPSBPSykgeworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6dXBkYXRlVnN5bmMoKSB7CisgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKKworICAgIGlmIChtVnN5bmNUcmFja2VyICE9IE5VTEwpIHsKKyAgICAgICAgbVZzeW5jUGVyaW9kID0gbVZzeW5jVHJhY2tlci0+Z2V0VnN5bmNQZXJpb2QoKTsKKyAgICAgICAgbVZzeW5jVGltZSA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jVGltZShtU2ZWc3luY09mZnNldCAtIG1BcHBWc3luY09mZnNldCk7CisgICAgfQorICAgIG1Wc3luY1JlZnJlc2hBdCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIGtWc3luY1JlZnJlc2hQZXJpb2Q7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnJlbGVhc2UoKSB7CisgICAgLy8gRG8gbm90IGNoYW5nZSBvcmRlcgorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIHRocmVhZExvY2sobUxvY2spOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgICAgIG1DaG9yZW9ncmFwaGVyVGhyZWFkLmNsZWFyKCk7CisgICAgfQorCisgICAgbVZzeW5jVHJhY2tlci5jbGVhcigpOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6flZpZGVvRnJhbWVTY2hlZHVsZXIyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTUxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgeworICAgIGlmICgqbGhzIDwgKnJocykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjUlCitzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSUKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7ICAgICAvLyAxIHNlYworc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6CitzdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xczsgLy8gMTAgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OlBMTCgpCisgICAgOiBtUGVyaW9kKC0xKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QcmltZWQoZmFsc2UpLAorICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKKyAgICAgIG1MYXN0VGltZSgtMSksCisgICAgICBtTnVtU2FtcGxlcygwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7CisgICAgLy90ZXN0KCk7CisKKyAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICBtTGFzdFRpbWUgPSAtMTsKKworICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKKyAgICBpZiAoZnBzIDw9IDAuZikgeworICAgICAgICBtUGVyaW9kID0gLTE7CisgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOworICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7CisgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgIH0KKworICAgIHJlc3RhcnQoKTsKK30KKworLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpyZXN0YXJ0KCkgeworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtUGhhc2UgPSAtMTsKK30KKworI2lmIDAKKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjp0ZXN0KCkgeworICAgIG5zZWNzX3QgcGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXMgLyA2MDsKKyAgICBtVGltZXNbMF0gPSAwOworICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKKyAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOworICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7CisgICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKKyAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OworICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOworICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOworICAgIG1OdW1TYW1wbGVzID0gODsKKyAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOworICAgIC8vIGEgPSAwLjgoNSkrCisgICAgLy8gYiA9IC0wLjE0MDk3KDIpKworICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKworICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Cit9CisKKyNlbmRpZgorCisvLyBJZiBvdmVyZmxvdyBoYXBwZW5zLCB0aGUgdmFsdWUgaXMgYWxyZWFkeSBpbmNvcnJlY3QsIGFuZCBubyBtYXRlciB3aGF0IHZhbHVlIHdlIGdldCBpcyBPSy4KKy8vIEFuZCB0aGlzIHBhcnQgb2YgY2FsY3VsYXRpb24gaXMgbm90IGltcG9ydGFudCwgc28gaXQncyBPSyB0byBzaW1wbHkgZGlzYWJsZSBvdmVyZmxvdyBjaGVjaworLy8gaW5zdGVhZCBvZiB1c2luZyBkb3VibGUgd2hpY2ggbWFrZXMgY29kZSBtb3JlIGNvbXBsaWNhdGVkLgorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitib29sIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmZpdCgKKyAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICBpZiAoKHBlcmlvZCA+PiBrUHJlY2lzaW9uKSA9PSAwICkgeworICAgICAgICBBTE9HVygiUGVyaW9kIGlzIDAsIG9yIGFmdGVyIGluY2x1ZGluZyBwcmVjaXNpb24gaXMgMCAtIHdvdWxkIGNhdXNlIGRpdjAsIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzdW1YID0gMDsKKyAgICBpbnQ2NF90IHN1bVhYID0gMDsKKyAgICBpbnQ2NF90IHN1bVhZID0gMDsKKyAgICBpbnQ2NF90IHN1bVlZID0gMDsKKyAgICBpbnQ2NF90IHN1bVkgPSAwOworCisgICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCisgICAgbnNlY3NfdCBsYXN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOworICAgICAgICB9CisgICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgorICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCisgICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCisgICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCisgICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOworICAgICAgICBzdW1YICs9IHg7CisgICAgICAgIHN1bVkgKz0geTsKKyAgICAgICAgc3VtWFggKz0geCAqIHg7CisgICAgICAgIHN1bVhZICs9IHggKiB5OworICAgICAgICBzdW1ZWSArPSB5ICogeTsKKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIGludDY0X3QgZGl2ICAgPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOworICAgIGlmIChkaXYgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBhX25vbSA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7CisgICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOworICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7CisgICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKKyAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKKyAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOworICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKyAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCisKKyAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKKyAgICAvLyAybmQgb3JkZXIgZGVsdGFzCisgICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKKyAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgeworICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKyAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKKyAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKKyAgICBpZiAobnVtRGVsdGFzID4gMSkgeworICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgeworICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7CisgICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKKyAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAorICAgIGludDY0X3QgYmVzdFNjb3JlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07CisgICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOworI2lmIDEKKyAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKKyAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOworICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgeworICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY29yZSA9IG1hdGNoZXM7CisjaWYgMAorICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKKyAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOworICAgICAgICB9CisjZW5kaWYKKyNlbHNlCisgICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKKyAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CisgICAgaWYgKG1MYXN0VGltZSA+PSAwCisgICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCisgICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7CisgICAgICAgIHJlc3RhcnQoKTsKKyAgICB9CisKKyAgICBtTGFzdFRpbWUgPSB0aW1lOworICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOworICAgICsrbU51bVNhbXBsZXM7CisKKyAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OworICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgeworICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKKyAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOworICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgfQorICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKKyAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7CisgICAgICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCisgICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7CisKKyAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmdldFBlcmlvZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByaW1lZCA/IG1QZXJpb2QgOiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpCisgICAgOiBtVnN5bmNUaW1lKDApLAorICAgICAgbVZzeW5jUGVyaW9kKDApLAorICAgICAgbVZzeW5jUmVmcmVzaEF0KDApLAorICAgICAgbUxhc3RWc3luY1RpbWUoLTEpLAorICAgICAgbVRpbWVDb3JyZWN0aW9uKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6aW5pdChmbG9hdCB2aWRlb0ZwcykgeworICAgIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6cmVzdGFydCgpIHsKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc3RhcnQoKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Cit9CisKK2Zsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7CisgICAgfQorICAgIHJldHVybiAwLmY7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgeworICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOworCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKKyAgICAgICAgdXBkYXRlVnN5bmMoKTsKKyAgICB9CisKKyAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKyAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgICAgIHJldHVybiByZW5kZXJUaW1lOworICAgIH0KKworICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCisgICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgeworICAgICAgICBtVnN5bmNUaW1lIC09CisgICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOworICAgIH0KKworICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKKyAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQorICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKworICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZworICAgICAgICBzaXplX3QgTiA9IDEyOworICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9CisgICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKKyAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKKyAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KKyAgICAgICAgICAgIE4gPSAyMDsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0KKyAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgfQorICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIChuc2Vjc190KU47CisgICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOworICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OworICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyAobnNlY3NfdClOIC0gbVZzeW5jUGVyaW9kIC8gMik7CisgICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKKyAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQorICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQorICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9CisgICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKKworICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lID4gMCkKKyAgICAgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPCBVTE9OR19NQVgpCisgICAgICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICogMgorICAgICAgICAgICAgICAgICAgICB8fCBtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgKiAyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3Rpb24gYmV5b25kIGxpbWl0OiAlbGxkIHZzICVsbGQgKHZzeW5jcyBmb3IgbGFzdCBmcmFtZTogJXp1LCBtaW46ICV6dSkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3RhcnRpbmcuIHJlbmRlcj0lbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVRpbWVDb3JyZWN0aW9uLCAobG9uZyBsb25nKWNvcnJlY3Rpb25MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZzeW5jc0Zvckxhc3RGcmFtZSwgbWluVnN5bmNzUGVyRnJhbWUsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUpOworICAgICAgICAgICAgICAgIHJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1JlbmRlclRpbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFUUkFDRV9JTlQoIkZSQU1FX1ZTWU5DUyIsIHZzeW5jc0Zvckxhc3RGcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RWc3luY1RpbWUgPSBuZXh0VnN5bmNUaW1lOworICAgIH0KKworICAgIC8vIGFsaWduIHJlbmRlcnRpbWUgdG8gdGhlIGNlbnRlciBiZXR3ZWVuIFZTWU5DIGVkZ2VzCisgICAgcmVuZGVyVGltZSAtPSAocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICBBTE9HVigiYWRqdXN0aW5nIHJlbmRlcjogJWxsZCA9PiAlbGxkIiwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICBBVFJBQ0VfSU5UKCJGUkFNRV9GTElQX0lOKG1zKSIsIChyZW5kZXJUaW1lIC0gbm93KSAvIDEwMDAwMDApOworICAgIHJldHVybiByZW5kZXJUaW1lOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6flZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkge30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggNGY0NmJlNy4uZGI2NzAzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCkBAIC00LDEyICs0LDEwIEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0KKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgc3JjczogWwotICAgICAgICAiQ29udmVyc2lvbi5jcHAiLAogICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCiAgICAgICAgICJHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCi0gICAgICAgICJXUHJvZHVjZXJMaXN0ZW5lci5jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC0yNSwxMCArMjMsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLApAQCAtMzgsMTQgKzM0LDI1IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKLQotICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5CisgICAgICAgIC8vIEZvbGxvd2luZyBsaWJzIGFyZSBmcm9tIGxpYmd1aV9idWZmZXJxdWV1ZV9zdGF0aWMKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJFR0wiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKKyAgICBdLAorICAgIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJndWlfYnVmZmVycXVldWVfc3RhdGljIgogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC02MSw4ICs2OCw1IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVkMDA1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNvbnZlcnNpb24gewotCi0vLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KLQotLyoqCi0gKiBcYnJpZWYgVGFrZSBhbiBmZCBhbmQgY3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGZkLgotICogVGhlIGNyZWF0ZWQgaGFuZGxlIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGgKLSAqIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqCi0gKiBccGFyYW1baW5dIGZkIFRoZSBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIChvZiB0eXBlIGBpbnRgKS4KLSAqIFxyZXR1cm4gVGhlIGNyZWF0ZSBgbmF0aXZlX2hhbmRsZV90KmAgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gXHAgZmQuIElmIHRoZQotICogc3VwcGxpZWQgXHAgZmQgaXMgbmVnYXRpdmUsIHRoZSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgd2lsbCBjb250YWluIG5vIGZpbGUKLSAqIGRlc2NyaXB0b3JzLgotICoKLSAqIElmIHRoZSBuYXRpdmUgaGFuZGxlIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKLSAqIGBudWxscHRyYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgotICovCi1uYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKSB7Ci0gICAgaWYgKGZkIDwgMikgewotICAgICAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgMCk7Ci0gICAgfQotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBpZiAobmggPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgbmgtPmRhdGFbMF0gPSBmZDsKLSAgICByZXR1cm4gbmg7Ci19Ci0KLS8qKgotICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCi0gKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgotICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKLSAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLWludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuICgobmggPT0gbnVsbHB0cikgfHwgKG5oLT5udW1GZHMgPT0gMCkgfHwKLSAgICAgICAgICAgIChuaC0+bnVtRmRzIDw9IGluZGV4KSB8fCAoaW5kZXggPCAwKSkgPwotICAgICAgICAgICAgLTEgOiBuaC0+ZGF0YVtpbmRleF07Ci19Ci0KLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMKLSAqID09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKLSAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQotICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgotICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0Ci0gKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQotICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCi0gKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCi0gKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0gKiAgIG91dHB1dCBhcmd1bWVudHMuCi0gKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKLSAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKLSAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCi0gKgotICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCi0gKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCi0gKiBzdWNjZXNzIG9yIGVycm9yLgotICoKLSAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCi0gKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCi0gKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKLSAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCi0gKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAqCi0gKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KLSAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCi0gKiBgY29udmVydFRvKClgIGRvLgotICovCi0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCi0gICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKLSAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAotICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgotICogXHJldHVybiBUaGUgYGhpZGxfaGFuZGxlYCB0aGF0IHBvaW50cyB0byBccCBuaC4KLSAqLwotLy8gd3JhcDogbmF0aXZlX2hhbmRsZV90KiAtPiBoaWRsX2hhbmRsZQotaGlkbF9oYW5kbGUgaW5IaWRsSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgpIHsKLSAgICByZXR1cm4gaGlkbF9oYW5kbGUobmgpOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBpbnQzMl90YCB0byBgRGF0YXNwYWNlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgaW50MzJfdGAuCi0gKiBccmVzdWx0IFRoZSBjb3JyZXNwb25kaW5nIGBEYXRhc3BhY2VgLgotICovCi0vLyBjb252ZXJ0OiBpbnQzMl90IC0+IERhdGFzcGFjZQotRGF0YXNwYWNlIHRvSGFyZHdhcmVEYXRhc3BhY2UoaW50MzJfdCBsKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgotICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90Ci1pbnQzMl90IHRvUmF3RGF0YXNwYWNlKERhdGFzcGFjZSBjb25zdCYgdCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pih0KTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBhbiBvcGFxdWUgYnVmZmVyIGluc2lkZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCi0gKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgcG9pbnRzIHRvIHRoZSBidWZmZXIuCi0gKi8KLS8vIHdyYXA6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KLWhpZGxfdmVjPHVpbnQ4X3Q+IGluSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdDsKLSAgICB0LnNldFRvRXh0ZXJuYWwoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGwpKSwgc2l6ZSwgZmFsc2UpOwotICAgIHJldHVybiB0OwotfQotCi0vKioKLSAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCi0gKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKi8KLS8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KLWhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdDsKLSAgICB0LnJlc2l6ZShzaXplKTsKLSAgICB1aW50OF90IGNvbnN0KiBzcmMgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4obCk7Ci0gICAgc3RkOjpjb3B5KHNyYywgc3JjICsgc2l6ZSwgdC5kYXRhKCkpOwotICAgIHJldHVybiB0OwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCi0gKi8KLS8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCi12b2lkIHdyYXBBcyhBbndCdWZmZXIqIHQsIEdyYXBoaWNCdWZmZXIgY29uc3QmIGwpIHsKLSAgICB0LT5hdHRyLndpZHRoID0gbC5nZXRXaWR0aCgpOwotICAgIHQtPmF0dHIuaGVpZ2h0ID0gbC5nZXRIZWlnaHQoKTsKLSAgICB0LT5hdHRyLnN0cmlkZSA9IGwuZ2V0U3RyaWRlKCk7Ci0gICAgdC0+YXR0ci5mb3JtYXQgPSBzdGF0aWNfY2FzdDxQaXhlbEZvcm1hdD4obC5nZXRQaXhlbEZvcm1hdCgpKTsKLSAgICB0LT5hdHRyLmxheWVyQ291bnQgPSBsLmdldExheWVyQ291bnQoKTsKLSAgICB0LT5hdHRyLnVzYWdlID0gbC5nZXRVc2FnZSgpOwotICAgIHQtPmF0dHIuaWQgPSBsLmdldElkKCk7Ci0gICAgdC0+YXR0ci5nZW5lcmF0aW9uTnVtYmVyID0gbC5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7Ci0gICAgdC0+bmF0aXZlSGFuZGxlID0gaGlkbF9oYW5kbGUobC5oYW5kbGUpOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBBbndCdWZmZXJgIHRvIGBHcmFwaGljQnVmZmVyYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgR3JhcGhpY0J1ZmZlcmAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgQW53QnVmZmVyYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KLWJvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCkgewotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gdC5uYXRpdmVIYW5kbGUgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICBudWxscHRyIDogbmF0aXZlX2hhbmRsZV9jbG9uZSh0Lm5hdGl2ZUhhbmRsZSk7Ci0KLSAgICBzaXplX3QgY29uc3QgbnVtSW50cyA9IDEyICsgKGhhbmRsZSA/IGhhbmRsZS0+bnVtSW50cyA6IDApOwotICAgIGludDMyX3QqIGludHMgPSBuZXcgaW50MzJfdFtudW1JbnRzXTsKLQotICAgIHNpemVfdCBudW1GZHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGhhbmRsZSA/IGhhbmRsZS0+bnVtRmRzIDogMCk7Ci0gICAgaW50KiBmZHMgPSBuZXcgaW50W251bUZkc107Ci0KLSAgICBpbnRzWzBdID0gJ0dCRlInOwotICAgIGludHNbMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIud2lkdGgpOwotICAgIGludHNbMl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaGVpZ2h0KTsKLSAgICBpbnRzWzNdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnN0cmlkZSk7Ci0gICAgaW50c1s0XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5mb3JtYXQpOwotICAgIGludHNbNV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIubGF5ZXJDb3VudCk7Ci0gICAgaW50c1s2XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci51c2FnZSk7Ci0gICAgaW50c1s3XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCA+PiAzMik7Ci0gICAgaW50c1s4XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCAmIDB4RkZGRkZGRkYpOwotICAgIGludHNbOV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuZ2VuZXJhdGlvbk51bWJlcik7Ci0gICAgaW50c1sxMF0gPSAwOwotICAgIGludHNbMTFdID0gMDsKLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIGludHNbMTBdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1GZHMpOwotICAgICAgICBpbnRzWzExXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbmRsZS0+bnVtSW50cyk7Ci0gICAgICAgIGludCogaW50c1N0YXJ0ID0gaGFuZGxlLT5kYXRhICsgaGFuZGxlLT5udW1GZHM7Ci0gICAgICAgIHN0ZDo6Y29weShoYW5kbGUtPmRhdGEsIGludHNTdGFydCwgZmRzKTsKLSAgICAgICAgc3RkOjpjb3B5KGludHNTdGFydCwgaW50c1N0YXJ0ICsgaGFuZGxlLT5udW1JbnRzLCAmaW50c1sxMl0pOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGludHMpOwotICAgIHNpemVfdCBzaXplID0gbnVtSW50cyAqIHNpemVvZihpbnQzMl90KTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oZmRzKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpOwotCi0gICAgZGVsZXRlIFtdIGZkczsKLSAgICBkZWxldGUgW10gaW50czsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KLSAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCi0gKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCi0gKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KLSAqCi0gKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCi0gKiBmb2xsb3dzOgotICoKLSAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCi0gKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCi0gKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKLSAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKLSAqIGJlIGNyZWF0ZWQuCi0gKgotICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKLSAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCi0gKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCi0gKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCi0gKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKLSAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQotICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAotICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgotICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKLSAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0Ci0gKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgotICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKLSAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKLSAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCi0gKgotICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKLSAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCi0gKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKLSAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKLSAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCi0gKgotICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCi0gKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgotICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQotICoKLSAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogaW5zdGVhZCBvZgotICoKLSAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKLSAqCi0gKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgotICoKLSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKLSAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCi0gKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCi0gKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCi0gKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgotICovCi0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KLSAqCi0gKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqCi0gKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgotICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKLSAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGhpZGxfaGFuZGxlIGNvbnN0JiAvKiBmZW5jZSAqLykgewotICAgIHJldHVybiA0OwotfTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gYSBmZW5jZS4KLSAqCi0gKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccmV0dXJuIGAwYCBpZiBccCBmZW5jZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBvciBgMWAKLSAqIG90aGVyd2lzZS4KLSAqLwotc2l6ZV90IGdldEZlbmNlRmRDb3VudChoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpIHsKLSAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKSA9PSAtMSA/IDAgOiAxOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZlbmNlYCB0byBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtvdXRdIGZlbmNlIFRoZSBkZXN0aW5hdGlvbiBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZS4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgcG9pbnQgdG8gYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLCB3aGljaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSogZmVuY2UsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1GZHNJbkhhbmRsZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtRmRzSW5IYW5kbGUpOwotCi0gICAgaWYgKG51bUZkc0luSGFuZGxlID4gMSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChudW1GZHMgPCBudW1GZHNJbkhhbmRsZSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGlmIChudW1GZHNJbkhhbmRsZSkgewotICAgICAgICAqbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKCpmZHMpOwotICAgICAgICBpZiAoKm5oID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgKmZlbmNlID0gKm5oOwotICAgICAgICArK2ZkczsKLSAgICAgICAgLS1udW1GZHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKm5oID0gbnVsbHB0cjsKLSAgICAgICAgKmZlbmNlID0gaGlkbF9oYW5kbGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGZlbmNlKSB8fAotICAgICAgICAgICAgbnVtRmRzIDwgZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICAvLyBDYXN0IHRvIHVpbnQzMl90IHNpbmNlIHRoZSBzaXplIG9mIGEgc2l6ZV90IGNhbiB2YXJ5IGJldHdlZW4gMzItIGFuZAotICAgIC8vIDY0LWJpdCBwcm9jZXNzZXMKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkpOwotICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChmZW5jZSk7Ci0gICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgICpmZHMgPSBmZDsKLSAgICAgICAgKytmZHM7Ci0gICAgICAgIC0tbnVtRmRzOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKLSAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKLWJvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpIHsKLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuRmVuY2UodCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKQotICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKLSAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICoKLSAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKLWJvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCkgewotICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZCh0KTsKLSAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgZmQgPSBkdXAoZmQpOwotICAgICAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChmZCk7Ci0gICAgaWYgKG5oID09IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZW5jZUZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZShuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2VUaW1lLmNwcDogRmVuY2VUaW1lOjpTbmFwc2hvdAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KSB7Ci0gICAgY29uc3RleHByIHNpemVfdCBtaW4gPSBzaXplb2YodC5zdGF0ZSk7Ci0gICAgc3dpdGNoICh0LnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKLSAgICAgICAgICAgIHJldHVybiBtaW47Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRToKLSAgICAgICAgICAgIHJldHVybiBtaW4gKyBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodC5mZW5jZSk7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKLSAgICAgICAgICAgIHJldHVybiBtaW4gKyBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6c2lnbmFsVGltZSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgc25hcHNob3QuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgewotICAgIHJldHVybiB0LnN0YXRlID09Ci0gICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFID8KLSAgICAgICAgICAgIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKSA6IDA7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KLSAqIEZFTkNFYC4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgc3dpdGNoICh0LnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFKTsKLSAgICAgICAgICAgIHJldHVybiBmbGF0dGVuRmVuY2UodC5mZW5jZSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUUpOwotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnNpZ25hbFRpbWVOcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQotICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcwotICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBzaXplb2YodC0+c3RhdGUpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgKm5oID0gbnVsbHB0cjsKLSAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlIHN0YXRlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBzdGF0ZSk7Ci0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgotICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgotICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOwotICAgICAgICAgICAgcmV0dXJuIHVuZmxhdHRlbkZlbmNlKCZ0LT5mZW5jZSwgbmgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgotICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOwotICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YodC0+c2lnbmFsVGltZU5zKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+c2lnbmFsVGltZU5zKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRzRGVsdGEKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIGEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8KLSAqIGZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotY29uc3RleHByIHNpemVfdCBtaW5GbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiAvKiB0ICovKSB7Ci0gICAgcmV0dXJuIHNpemVvZih1aW50NjRfdCkgKyAvLyBtRnJhbWVOdW1iZXIKLSAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1JbmRleAotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFBvc3RDb21wb3NpdGVDYWxsZWQKLSAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZXRpcmVDYWxsZWQKLSAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZWxlYXNlQ2FsbGVkCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtUG9zdGVkVGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbVJlcXVlc3RlZFByZXNlbnRUaW1lCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtTGF0Y2hUaW1lCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtRmlyc3RSZWZyZXNoU3RhcnRUaW1lCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCk7IC8vIG1MYXN0UmVmcmVzaFN0YXJ0VGltZQotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVByZXNlbnRGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmRpc3BsYXlSZXRpcmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnJlbGVhc2VGZW5jZSk7Ci19OwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIGdldEZkQ291bnQodC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmRDb3VudCh0LmRpc3BsYXlQcmVzZW50RmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UmV0aXJlRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5yZWxlYXNlRmVuY2UpOwotfTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgaGF2ZSBsZW5ndGggNCwgYW5kIGl0IHdpbGwgYmUKLSAqIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvciBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIEVhY2ggbm9uLW51bGwgc2xvdCBpbiBccAotICogbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmZyYW1lTnVtYmVyKTsKLQotICAgIC8vIFRoZXNlIHdlcmUgd3JpdHRlbiBhcyB1aW50OF90IGZvciBhbGlnbm1lbnQuCi0gICAgdWludDhfdCB0ZW1wID0gMDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZW1wKTsKLSAgICBpZiAoaW5kZXggPj0gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgdC0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHQtPmFkZFBvc3RDb21wb3NpdGVDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgdC0+YWRkUmV0aXJlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHQtPmFkZFJlbGVhc2VDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5wb3N0ZWRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+bGF0Y2hUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5kZXF1ZXVlUmVhZHlUaW1lKTsKLQotICAgIC8vIEZlbmNlcwotICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0U25hcHNob3RbNF07Ci0gICAgdFNuYXBzaG90WzBdID0gJnQtPmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlOwotICAgIHRTbmFwc2hvdFsxXSA9ICZ0LT5kaXNwbGF5UHJlc2VudEZlbmNlOwotICAgIHRTbmFwc2hvdFsyXSA9ICZ0LT5kaXNwbGF5UmV0aXJlRmVuY2U7Ci0gICAgdFNuYXBzaG90WzNdID0gJnQtPnJlbGVhc2VGZW5jZTsKLSAgICBuaC0+cmVzaXplKDQpOwotICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbigKLSAgICAgICAgICAgICAgICB0U25hcHNob3Rbc25hcHNob3RJbmRleF0sICYoKCpuaClbc25hcHNob3RJbmRleF0pLAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB3aGlsZSAoc25hcHNob3RJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAtLXNuYXBzaG90SW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKCgqbmgpW3NuYXBzaG90SW5kZXhdICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoKCpuaClbc25hcHNob3RJbmRleF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wLmNwcDoKLS8vICAgICAgRnJhbWVFdmVudHNEZWx0YTo6ZmxhdHRlbgotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcykgewotICAgIC8vIENoZWNrIHRoYXQgdC5pbmRleCBpcyB3aXRoaW4gYSB2YWxpZCByYW5nZS4KLSAgICBpZiAodC5pbmRleCA+PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKQotICAgICAgICAgICAgfHwgdC5pbmRleCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZyYW1lTnVtYmVyKTsKLQotICAgIC8vIFRoZXNlIGFyZSBzdGF0aWNfY2FzdCB0byB1aW50OF90IGZvciBhbGlnbm1lbnQuCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmluZGV4KSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUG9zdENvbXBvc2l0ZUNhbGxlZCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJldGlyZUNhbGxlZCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJlbGVhc2VDYWxsZWQpKTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5wb3N0ZWRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGF0Y2hUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0Lmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5kZXF1ZXVlUmVhZHlUaW1lKTsKLQotICAgIC8vIEZlbmNlcwotICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0KiB0U25hcHNob3RbNF07Ci0gICAgdFNuYXBzaG90WzBdID0gJnQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7Ci0gICAgdFNuYXBzaG90WzFdID0gJnQuZGlzcGxheVByZXNlbnRGZW5jZTsKLSAgICB0U25hcHNob3RbMl0gPSAmdC5kaXNwbGF5UmV0aXJlRmVuY2U7Ci0gICAgdFNuYXBzaG90WzNdID0gJnQucmVsZWFzZUZlbmNlOwotICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgKih0U25hcHNob3Rbc25hcHNob3RJbmRleF0pLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IHNpemUgPSA0ICsgLy8gbURlbHRhcy5zaXplKCkKLSAgICAgICAgICAgIHNpemVvZih0LmNvbXBvc2l0b3JUaW1pbmcpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc2l6ZSArPSBnZXRGbGF0dGVuZWRTaXplKHQuZGVsdGFzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKLSAgICBzaXplX3QgbnVtRmRzID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG51bUZkcyArPSBnZXRGZENvdW50KHQuZGVsdGFzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bUZkczsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBhcnJheXMgb2YgbmF0aXZlIGhhbmRsZXMuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvcgotICogbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBccCBuaCB3aWxsIGJlIDQuIEVhY2ggbm9uLW51bGwKLSAqIHNsb3QgaW4gXHAgbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5jb21wb3NpdG9yVGltaW5nKTsKLQotICAgIHVpbnQzMl90IGRlbHRhQ291bnQgPSAwOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBkZWx0YUNvdW50KTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihkZWx0YUNvdW50KSA+Ci0gICAgICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB0LT5kZWx0YXMucmVzaXplKGRlbHRhQ291bnQpOwotICAgIG5oLT5yZXNpemUoZGVsdGFDb3VudCk7Ci0gICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCBkZWx0YUNvdW50OyArK2RlbHRhSW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAotICAgICAgICAgICAgICAgICYodC0+ZGVsdGFzW2RlbHRhSW5kZXhdKSwgJigoKm5oKVtkZWx0YUluZGV4XSksCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zdGF0dXNfdCBmbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAodC5kZWx0YXMuc2l6ZSgpID4gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmNvbXBvc2l0b3JUaW1pbmcpOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5kZWx0YXMuc2l6ZSgpKSk7Ci0gICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCB0LmRlbHRhcy5zaXplKCk7ICsrZGVsdGFJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuKHQuZGVsdGFzW2RlbHRhSW5kZXhdLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEYXRhYCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5Ci0gKiBtZW1iZXJzIG9mIFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQotICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLWJvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAotICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIGwpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKHVuZmxhdHRlbih0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAgdG8KLSAqIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWJvb2wgY29udmVydFRvKAotICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCkgKyB0LnNpemUoKSAqIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKFJlZ2lvbiogdCwgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCBzaXplb2YodWludDMyX3QpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgbnVtUmVjdHMgPSAwOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBudW1SZWN0cyk7Ci0gICAgaWYgKHNpemUgPCBudW1SZWN0cyAqIHNpemVvZihSZWN0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBpZiAobnVtUmVjdHMgPiAoVUlOVDMyX01BWCAvIHNpemVvZihSZWN0KSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICB0LT5yZXNpemUobnVtUmVjdHMpOwotICAgIGZvciAoc2l6ZV90IHIgPSAwOyByIDwgbnVtUmVjdHM7ICsrcikgewotICAgICAgICA6OmFuZHJvaWQ6OlJlY3QgcmVjdCg6OmFuZHJvaWQ6OlJlY3Q6OkVNUFRZX1JFQ1QpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWN0LnVuZmxhdHRlbihidWZmZXIsIHNpemUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOwotICAgICAgICAoKnQpW3JdID0gUmVjdHsKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmxlZnQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QudG9wKSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LnJpZ2h0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmJvdHRvbSl9OwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuc2l6ZSgpKSk7Ci0gICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCB0LnNpemUoKTsgKytyKSB7Ci0gICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ubGVmdCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS50b3ApLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ucmlnaHQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0uYm90dG9tKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QuZmxhdHRlbihidWZmZXIsIHNpemUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKi8KLS8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgotYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKHVuZmxhdHRlbih0LCBjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KLWJvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpIHsKLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKGZsYXR0ZW4odCwgYnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9CR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcDoKLS8vICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gYSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWNvbnN0ZXhwciBzaXplX3QgbWluRmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgLyogdCAqLykgewotICAgIHJldHVybiBzaXplb2YoaW50NjRfdCkgKyAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gaXNBdXRvVGltZXN0YW1wCi0gICAgICAgICAgICBzaXplb2YoYW5kcm9pZF9kYXRhc3BhY2UpICsgLy8gZGF0YVNwYWNlCi0gICAgICAgICAgICBzaXplb2YoOjphbmRyb2lkOjpSZWN0KSArIC8vIGNyb3AKLSAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gc2NhbGluZ01vZGUKLSAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyB0cmFuc2Zvcm0KLSAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyBzdGlja3lUcmFuc2Zvcm0KLSAgICAgICAgICAgIHNpemVvZihib29sKTsgLy8gZ2V0RnJhbWVUaW1lc3RhbXBzCi19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKwotICAgICAgICAgICAgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5zdXJmYWNlRGFtYWdlKSArCi0gICAgICAgICAgICBzaXplb2YoSGRyTWV0YWRhdGE6OnZhbGlkVHlwZXMpOwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgY2xvbmVkIGZyb20gYHQuZmVuY2VgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAuICovCi1zdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQsCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQudGltZXN0YW1wKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5pc0F1dG9UaW1lc3RhbXApKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZV90Pih0LmRhdGFTcGFjZSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgOjphbmRyb2lkOjpSZWN0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmxlZnQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLnRvcCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AucmlnaHQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmJvdHRvbSkpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5zY2FsaW5nTW9kZSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50cmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zdGlja3lUcmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5nZXRGcmFtZVRpbWVzdGFtcHMpOwotCi0gICAgKm5oID0gdC5mZW5jZS5nZXROYXRpdmVIYW5kbGUoKSA9PSBudWxscHRyID8KLSAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQuZmVuY2UpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSgqbmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IGZsYXR0ZW4odC5zdXJmYWNlRGFtYWdlLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBkZWNsdHlwZShIZHJNZXRhZGF0YTo6dmFsaWRUeXBlcykoMCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dGltZXN0YW1wKTsKLSAgICBpbnQgbElzQXV0b1RpbWVzdGFtcDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbElzQXV0b1RpbWVzdGFtcCk7Ci0gICAgdC0+aXNBdXRvVGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obElzQXV0b1RpbWVzdGFtcCk7Ci0gICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBsRGF0YVNwYWNlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsRGF0YVNwYWNlKTsKLSAgICB0LT5kYXRhU3BhY2UgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGxEYXRhU3BhY2UpOwotICAgIFJlY3QgbENyb3A7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxDcm9wKTsKLSAgICB0LT5jcm9wID0gUmVjdHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmxlZnQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AudG9wKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnJpZ2h0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmJvdHRvbSl9OwotICAgIGludCBsU2NhbGluZ01vZGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxTY2FsaW5nTW9kZSk7Ci0gICAgdC0+c2NhbGluZ01vZGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsU2NhbGluZ01vZGUpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT50cmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zdGlja3lUcmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5nZXRGcmFtZVRpbWVzdGFtcHMpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuRmVuY2UoJih0LT5mZW5jZSksIG5oLAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBIZHJNZXRhZGF0YSBpZ25vcmVkCi0gICAgcmV0dXJuIHVuZmxhdHRlbigmKHQtPnN1cmZhY2VEYW1hZ2UpLCBidWZmZXIsIHNpemUpOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWJvb2wgd3JhcEFzKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiBgdC5mZW5jZWAgaGFzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCi0gKi8KLWJvb2wgY29udmVydFRvKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZENvdW50KHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmg7Ci0gICAgaWYgKGZsYXR0ZW4odCwgJm5oLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChuaCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5Ci0gKiBtZW1iZXJzIG9mIFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1ib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKSB7Ci0gICAgaWYgKCF3cmFwQXMoJih0LT5mcmFtZVRpbWVzdGFtcHMpLCBuaCwgbC5mcmFtZVRpbWVzdGFtcHMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdC0+d2lkdGggPSBsLndpZHRoOwotICAgIHQtPmhlaWdodCA9IGwuaGVpZ2h0OwotICAgIHQtPnRyYW5zZm9ybUhpbnQgPSBsLnRyYW5zZm9ybUhpbnQ7Ci0gICAgdC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSBsLm51bVBlbmRpbmdCdWZmZXJzOwotICAgIHQtPm5leHRGcmFtZU51bWJlciA9IGwubmV4dEZyYW1lTnVtYmVyOwotICAgIHQtPmJ1ZmZlclJlcGxhY2VkID0gbC5idWZmZXJSZXBsYWNlZDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCkgewotICAgIGlmICghY29udmVydFRvKCYobC0+ZnJhbWVUaW1lc3RhbXBzKSwgdC5mcmFtZVRpbWVzdGFtcHMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbC0+d2lkdGggPSB0LndpZHRoOwotICAgIGwtPmhlaWdodCA9IHQuaGVpZ2h0OwotICAgIGwtPnRyYW5zZm9ybUhpbnQgPSB0LnRyYW5zZm9ybUhpbnQ7Ci0gICAgbC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSB0Lm51bVBlbmRpbmdCdWZmZXJzOwotICAgIGwtPm5leHRGcmFtZU51bWJlciA9IHQubmV4dEZyYW1lTnVtYmVyOwotICAgIGwtPmJ1ZmZlclJlcGxhY2VkID0gdC5idWZmZXJSZXBsYWNlZDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLUhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvSGlkbERpc2Nvbm5lY3RNb2RlKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKSB7Ci0gICAgc3dpdGNoIChsKSB7Ci0gICAgICAgIGNhc2UgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaToKLSAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOwotICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDoKLSAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOwotICAgIH0KLSAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLUJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvR3VpRGlzY29ubmVjdE1vZGUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHQpIHsKLSAgICBzd2l0Y2ggKHQpIHsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOgotICAgICAgICAgICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFMTF9MT0NBTDoKLSAgICAgICAgICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QWxsTG9jYWw7Ci0gICAgfQotICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29udmVyc2lvbgotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKaW5kZXggZDJhMjQ3My4uMzg3YWM1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuY3BwCkBAIC0zNSw3ICszNSw3IEBACiAKIHN0YXR1c190IEZyYW1lRHJvcHBlcjo6c2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSkgewogICAgIGlmIChtYXhGcmFtZVJhdGUgPCAwKSB7Ci0gICAgICAgIG1NaW5JbnRlcnZhbFVzID0gLTFsbDsKKyAgICAgICAgbU1pbkludGVydmFsVXMgPSAtMUxMOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IGRkMDNkMzguLjU5MzE3ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgorI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8yLjAvQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMjgxLDYgKzI4NiwzOSBAQAogICAgIH0KIH07CiAKK3N0cnVjdCBHcmFwaGljQnVmZmVyU291cmNlOjpDb25zdW1lclByb3h5IDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKKyAgICBDb25zdW1lclByb3h5KGNvbnN0IHdwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZnYnMpIDogbUdicyhnYnMpIHt9CisKKyAgICB+Q29uc3VtZXJQcm94eSgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25GcmFtZUF2YWlsYWJsZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25CdWZmZXJzUmVsZWFzZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBOb3RlIHRoYXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBpcyBob2xkaW5nIGFuIHNwIHRvIHVzLCB3ZSBjYW4ndCBob2xkCisgICAgLy8gYW4gc3AgYmFjayB0byBHcmFwaGljQnVmZmVyU291cmNlIGFzIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpbGwKKyAgICAvLyBtYWtlIGJvdGggaW1tb3J0YWwuCisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbUdiczsKK307CisKIEdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoKSA6CiAgICAgbUluaXRDaGVjayhVTktOT1dOX0VSUk9SKSwKICAgICBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMoMCksCkBAIC0yOTIsMjAgKzMzMCwyMCBAQAogICAgIG1TdXNwZW5kZWQoZmFsc2UpLAogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygtMSksCiAgICAgbVN0b3BUaW1lVXMoLTEpLAotICAgIG1MYXN0QWN0aW9uVGltZVVzKC0xbGwpLAotICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMoLTFsbCksCi0gICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcygtMWxsKSwKKyAgICBtTGFzdEFjdGlvblRpbWVVcygtMUxMKSwKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xTEwpLAorICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMoLTFMTCksCiAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCiAgICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCgwKSwKICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcihmYWxzZSksCiAgICAgbUZwcygtMS4wKSwKICAgICBtQ2FwdHVyZUZwcygtMS4wKSwKLSAgICBtQmFzZUNhcHR1cmVVcygtMWxsKSwKLSAgICBtQmFzZUZyYW1lVXMoLTFsbCksCisgICAgbUJhc2VDYXB0dXJlVXMoLTFMTCksCisgICAgbUJhc2VGcmFtZVVzKC0xTEwpLAogICAgIG1GcmFtZUNvdW50KDApLAotICAgIG1QcmV2Q2FwdHVyZVVzKC0xbGwpLAotICAgIG1QcmV2RnJhbWVVcygtMWxsKSwKLSAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMoMGxsKSB7CisgICAgbVByZXZDYXB0dXJlVXMoLTFMTCksCisgICAgbVByZXZGcmFtZVVzKC0xTEwpLAorICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcygwTEwpIHsKICAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOwogCiAgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CkBAIC0zMTMsMTQgKzM1MSwxMiBAQAogICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKIAotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKLSAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKLSAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KLSAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCi0gICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7CisgICAgLy8gY3JlYXRlIHRoZSBjb25zdW1lciBsaXN0ZW5lciBpbnRlcmZhY2UsIGFuZCBob2xkIHNwIHNvIHRoYXQgdGhpcworICAgIC8vIGludGVyZmFjZSBsaXZlcyBhcyBsb25nIGFzIHRoZSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIG1Db25zdW1lclByb3h5ID0gbmV3IENvbnN1bWVyUHJveHkodGhpcyk7CisKICAgICBzcDxJQ29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobUNvbnN1bWVyUHJveHkpOwogCiAgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKQEAgLTM1Nyw2ICszOTMsMjQgQEAKICAgICB9CiB9CiAKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcm9kdWNlcjsKK30KKworc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcl9WMV8wKCkgY29uc3QgeworICAgIHVzaW5nIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjwKKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPjsKKworICAgIHJldHVybiBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKK30KKworc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6dXRpbHM6OgorICAgICAgICAgICAgICAgICAgICBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKK30KKwogU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN0YXJ0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogICAgIEFMT0dWKCItLT4gc3RhcnQ7IGF2YWlsYWJsZT0lenUsIHN1Ym1pdHRhYmxlPSV6ZCIsCkBAIC0zOTIsNyArNDQ2LDcgQEAKICAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7CiAgICAgfQogCi0gICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwgJiYgbUxvb3BlciA9PSBOVUxMKSB7CisgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwTEwgJiYgbUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4odGhpcyk7CiAKICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwpAQCAtNjU1LDcgKzcwOSw3IEBACiAKICAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCiAgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQotICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcE5zID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKKyAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBMTCB8fCBpdGVtLm1UaW1lc3RhbXBOcyA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7CiAgICAgICAgIC8vIGlmIHN0YXJ0IHRpbWUgaXMgc2V0LCBvZmZzZXQgdGltZSBzdGFtcCBieSBzdGFydCB0aW1lCiAgICAgICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zID4gMCkgewogICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wTnMgLT0gbVNraXBGcmFtZXNCZWZvcmVOczsKQEAgLTY3Nyw3ICs3MzEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERvbid0IHNldCB0aGUgbGFzdCBidWZmZXIgaWQgaWYgd2UncmUgbm90IHJlcGVhdGluZywKICAgICAgICAgLy8gd2UnbGwgYmUgaG9sZGluZyBvbiB0byB0aGUgbGFzdCBidWZmZXIgZm9yIG5vdGhpbmcuCi0gICAgICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMGxsKSB7CisgICAgICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMExMKSB7CiAgICAgICAgICAgICBzZXRMYXRlc3RCdWZmZXJfbChpdGVtKTsKICAgICAgICAgfQogICAgICAgICBBTE9HVigiYnVmZmVyIHN1Ym1pdHRlZCBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSBhY3F1aXJlZD0lZCIsCkBAIC03NTUsNyArODA5LDcgQEAKICAgICAgICAgICAgICYmIChtRnBzID4gMiAqIG1DYXB0dXJlRnBzCiAgICAgICAgICAgICB8fCBtQ2FwdHVyZUZwcyA+IDIgKiBtRnBzKSkgewogICAgICAgICAvLyBUaW1lIGxhcHNlIG9yIHNsb3cgbW90aW9uIG1vZGUKLSAgICAgICAgaWYgKG1QcmV2Q2FwdHVyZVVzIDwgMGxsKSB7CisgICAgICAgIGlmIChtUHJldkNhcHR1cmVVcyA8IDBMTCkgewogICAgICAgICAgICAgLy8gZmlyc3QgY2FwdHVyZQogICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSBtQmFzZUNhcHR1cmVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgZmlyc3Qgc2FtcGxlIHRpbWVzdGFtcC4KQEAgLTc2Nyw3ICs4MjEsNyBAQAogICAgICAgICAgICAgZG91YmxlIG5GcmFtZXMgPSAodGltZVVzIC0gbVByZXZDYXB0dXJlVXMpICogbUNhcHR1cmVGcHMgLyAxMDAwMDAwOwogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPCAwLjUgLSBrVGltZXN0YW1wRmx1Y3R1YXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQotICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgICAgIEFMT0dEKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDEuMCkgewpAQCAtMTEwNiw2ICsxMTYwLDE0IEBACiAgICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOwogICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwogCisgICAgICAgIC8vIFNldCBpbXBsLiBkZWZpbmVkIGZvcm1hdCBhcyBkZWZhdWx0LiBEZXBlbmRpbmcgb24gdGhlIHVzYWdlIGZsYWdzCisgICAgICAgIC8vIHRoZSBkZXZpY2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gd2lsbCBkZXJpdmUgdGhlIGV4YWN0IGZvcm1hdC4KKyAgICAgICAgZXJyID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIHN1cmZhY2UgZGVmYXVsdCBmb3JtYXQgcmV0OiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKICAgICAgICAgLy8gU2V0cyB0aGUgZGVmYXVsdCBidWZmZXIgZGF0YSBzcGFjZQogICAgICAgICBBTE9HRCgic2V0dGluZyBkYXRhc3BhY2U6ICUjeCwgYWNxdWlyZWQ9JWQiLCBkYXRhU3BhY2UsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRGF0YVNwYWNlKChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwpAQCAtMTExNSwxOSArMTE3NywxOSBAQAogICAgICAgICBtU3VzcGVuZGVkID0gZmFsc2U7CiAgICAgICAgIG1FbmRPZlN0cmVhbSA9IGZhbHNlOwogICAgICAgICBtRW5kT2ZTdHJlYW1TZW50ID0gZmFsc2U7Ci0gICAgICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMgPSAtMWxsOworICAgICAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0gLTFMTDsKICAgICAgICAgbUZyYW1lRHJvcHBlci5jbGVhcigpOwotICAgICAgICBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID0gLTFsbDsKKyAgICAgICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA9IC0xTEw7CiAgICAgICAgIG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uID0gMDsKICAgICAgICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCA9IDA7CiAgICAgICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci5yZXNldCgpOwogICAgICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IGZhbHNlOwogICAgICAgICBtRnBzID0gLTEuMDsKICAgICAgICAgbUNhcHR1cmVGcHMgPSAtMS4wOwotICAgICAgICBtQmFzZUNhcHR1cmVVcyA9IC0xbGw7Ci0gICAgICAgIG1CYXNlRnJhbWVVcyA9IC0xbGw7Ci0gICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gLTFsbDsKLSAgICAgICAgbVByZXZGcmFtZVVzID0gLTFsbDsKKyAgICAgICAgbUJhc2VDYXB0dXJlVXMgPSAtMUxMOworICAgICAgICBtQmFzZUZyYW1lVXMgPSAtMUxMOworICAgICAgICBtUHJldkNhcHR1cmVVcyA9IC0xTEw7CisgICAgICAgIG1QcmV2RnJhbWVVcyA9IC0xTEw7CiAgICAgICAgIG1GcmFtZUNvdW50ID0gMDsKICAgICAgICAgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzID0gMDsKICAgICAgICAgbVN0b3BUaW1lVXMgPSAtMTsKQEAgLTExOTMsNyArMTI1NSw3IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIAotICAgIGlmIChtRXhlY3V0aW5nIHx8IHJlcGVhdEFmdGVyVXMgPD0gMGxsKSB7CisgICAgaWYgKG1FeGVjdXRpbmcgfHwgcmVwZWF0QWZ0ZXJVcyA8PSAwTEwpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTIwNSw3ICsxMjY3LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIAogICAgIC8vIHRpbWVPZmZzZXRVcyBtdXN0IGJlIG5lZ2F0aXZlIGZvciBhZGp1c3RtZW50LgotICAgIGlmICh0aW1lT2Zmc2V0VXMgPj0gMGxsKSB7CisgICAgaWYgKHRpbWVPZmZzZXRVcyA+PSAwTEwpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTIzOSw3ICsxMzAxLDcgQEAKIAogICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMgPQogICAgICAgICAgICAgKHNraXBGcmFtZXNCZWZvcmVVcyA+IDAgJiYgc2tpcEZyYW1lc0JlZm9yZVVzIDw9IElOVDY0X01BWCAvIDEwMDApID8KLSAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgKiAxMDAwKSA6IC0xbGw7CisgICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMUxMOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ExM2JlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUV1Byb2R1Y2VyTGlzdGVuZXIKLVRXUHJvZHVjZXJMaXN0ZW5lcjo6VFdQcm9kdWNlckxpc3RlbmVyKAotICAgICAgICBzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOgotICAgIG1CYXNlKGJhc2UpIHsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXUHJvZHVjZXJMaXN0ZW5lcjo6b25CdWZmZXJSZWxlYXNlZCgpIHsKLSAgICBtQmFzZS0+b25CdWZmZXJSZWxlYXNlZCgpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjxib29sPiBUV1Byb2R1Y2VyTGlzdGVuZXI6Om5lZWRzUmVsZWFzZU5vdGlmeSgpIHsKLSAgICByZXR1cm4gbUJhc2UtPm5lZWRzUmVsZWFzZU5vdGlmeSgpOwotfQotCi0vLyBMV1Byb2R1Y2VyTGlzdGVuZXIKLUxXUHJvZHVjZXJMaXN0ZW5lcjo6TFdQcm9kdWNlckxpc3RlbmVyKAotICAgICAgICBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOgotICAgIG1CYXNlKGJhc2UpIHsKLX0KLQotdm9pZCBMV1Byb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7Ci0gICAgbUJhc2UtPm9uQnVmZmVyUmVsZWFzZWQoKTsKLX0KLQotYm9vbCBMV1Byb2R1Y2VyTGlzdGVuZXI6Om5lZWRzUmVsZWFzZU5vdGlmeSgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4obUJhc2UtPm5lZWRzUmVsZWFzZU5vdGlmeSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDhjMWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwotI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9CUUhFTFBFUl9DT05WRVJTSU9OX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KLSNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjb252ZXJzaW9uIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OnNwOwotdXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKLQotdXNpbmcgOjphbmRyb2lkOjpTdHJpbmc4OwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6UmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpSZWdpb247Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkRhdGFzcGFjZTsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7Ci0KLXR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotCi0vLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KLQotLyoqCi0gKiBcYnJpZWYgVGFrZSBhbiBmZCBhbmQgY3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGZkLgotICogVGhlIGNyZWF0ZWQgaGFuZGxlIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGgKLSAqIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqCi0gKiBccGFyYW1baW5dIGZkIFRoZSBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIChvZiB0eXBlIGBpbnRgKS4KLSAqIFxyZXR1cm4gVGhlIGNyZWF0ZSBgbmF0aXZlX2hhbmRsZV90KmAgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gXHAgZmQuIElmIHRoZQotICogc3VwcGxpZWQgXHAgZmQgaXMgbmVnYXRpdmUsIHRoZSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgd2lsbCBjb250YWluIG5vIGZpbGUKLSAqIGRlc2NyaXB0b3JzLgotICoKLSAqIElmIHRoZSBuYXRpdmUgaGFuZGxlIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKLSAqIGBudWxscHRyYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgotICovCi1uYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKTsKLQotLyoqCi0gKiBcYnJpZWYgRXh0cmFjdCBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgbmF0aXZlIGhhbmRsZS4KLSAqCi0gKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgotICogXHBhcmFtW2luXSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaCB0byByZWFkIGZyb20uIFRoaXMKLSAqIGlucHV0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgMGAuCi0gKiBccmV0dXJuIFRoZSBgaW5kZXhgLXRoIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaC4gSWYgXHAgbmggZG9lcyBub3QgaGF2ZQotICogZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMsIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIGAtMWAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotaW50IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oLCBpbnQgaW5kZXggPSAwKTsKLQotLyoqCi0gKiBDb252ZXJzaW9uIGZ1bmN0aW9ucwotICogPT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGVyZSBhcmUgdHdvIG1haW4gZGlyZWN0aW9ucyBvZiBjb252ZXJzaW9uOgotICogLSBgaW5UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSB3cmFwcGVyIHdob3NlIGxpZmV0aW1lIGRlcGVuZHMgb24gdGhlCi0gKiAgIGlucHV0LiBUaGUgd3JhcHBlciBoYXMgdHlwZSBgVGFyZ2V0VHlwZWAuCi0gKiAtIGB0b1RhcmdldFR5cGUoLi4uKWA6IENyZWF0ZSBhIHN0YW5kYWxvbmUgb2JqZWN0IG9mIHR5cGUgYFRhcmdldFR5cGVgIHRoYXQKLSAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGlucHV0LiBUaGUgbGlmZXRpbWUgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCi0gKiAgIGxpZmV0aW1lIG9mIHRoZSBpbnB1dC4KLSAqIC0gYHdyYXBJbihUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYGluVGFyZ2V0VHlwZSgpYCwgYnV0IGZvciBgVGFyZ2V0VHlwZWAKLSAqICAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAqICAgb3V0cHV0IGFyZ3VtZW50cy4KLSAqIC0gYGNvbnZlcnRUbyhUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYHRvVGFyZ2V0VHlwZSgpYCwgYnV0IGZvcgotICogICBgVGFyZ2V0VHlwZWAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZQotICogICBhcmUgbXVsdGlwbGUgb3V0cHV0IGFyZ3VtZW50cy4KLSAqCi0gKiBgd3JhcEluKClgIGFuZCBgY29udmVydFRvKClgIGZ1bmN0aW9ucyB3aWxsIHRha2Ugb3V0cHV0IGFyZ3VtZW50cyBiZWZvcmUKLSAqIGlucHV0IGFyZ3VtZW50cy4gU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgcmV0dXJuIGEgdmFsdWUgdG8gaW5kaWNhdGUKLSAqIHN1Y2Nlc3Mgb3IgZXJyb3IuCi0gKgotICogSW4gY29udmVydGluZyBvciB3cmFwcGluZyBzb21ldGhpbmcgYXMgYSBUcmVibGUgdHlwZSB0aGF0IGNvbnRhaW5zIGEKLSAqIGBoaWRsX2hhbmRsZWAsIGBuYXRpdmVfaGFuZGxlX3QqYCB3aWxsIG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQgYXMKLSAqIGFuIGFkZGl0aW9uYWwgb3V0cHV0IGFyZ3VtZW50LCBoZW5jZSBvbmx5IGB3cmFwSW4oKWAgb3IgYGNvbnZlcnRUbygpYCB3b3VsZAotICogYmUgYXZhaWxhYmxlLiBUaGUgY2FsbGVyIG11c3QgY2FsbCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgdG8gZGVhbGxvY2F0ZSB0aGUKLSAqIHJldHVybmVkIG5hdGl2ZSBoYW5kbGUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotICoKLSAqIEZvciB0eXBlcyB0aGF0IGNvbnRhaW4gZmlsZSBkZXNjcmlwdG9ycywgYGluVGFyZ2V0VHlwZSgpYCBhbmQgYHdyYXBBcygpYCBkbwotICogbm90IHBlcmZvcm0gZHVwbGljYXRpb24gb2YgZmlsZSBkZXNjcmlwdG9ycywgd2hpbGUgYHRvVGFyZ2V0VHlwZSgpYCBhbmQKLSAqIGBjb252ZXJ0VG8oKWAgZG8uCi0gKi8KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgYmluZGVyOjpTdGF0dXNgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cwotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cyhSZXR1cm48dm9pZD4gY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxyZXR1cm4gVGhlIGBoaWRsX2hhbmRsZWAgdGhhdCBwb2ludHMgdG8gXHAgbmguCi0gKi8KLS8vIHdyYXA6IG5hdGl2ZV9oYW5kbGVfdCogLT4gaGlkbF9oYW5kbGUKLWhpZGxfaGFuZGxlIGluSGlkbEhhbmRsZShuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgaW50MzJfdGAgdG8gYERhdGFzcGFjZWAuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYGludDMyX3RgLgotICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgRGF0YXNwYWNlYC4KLSAqLwotLy8gY29udmVydDogaW50MzJfdCAtPiBEYXRhc3BhY2UKLURhdGFzcGFjZSB0b0hhcmR3YXJlRGF0YXNwYWNlKGludDMyX3QgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgotICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90Ci1pbnQzMl90IHRvUmF3RGF0YXNwYWNlKERhdGFzcGFjZSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYW4gb3BhcXVlIGJ1ZmZlciBpbnNpZGUgYSBgaGlkbF92ZWM8dWludDhfdD5gLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGFxdWUgYnVmZmVyLgotICogXHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gKiBccmV0dXJuIEEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IHBvaW50cyB0byB0aGUgYnVmZmVyLgotICovCi0vLyB3cmFwOiB2b2lkKiwgc2l6ZV90IC0+IGhpZGxfdmVjPHVpbnQ4X3Q+Ci1oaWRsX3ZlYzx1aW50OF90PiBpbkhpZGxCeXRlcyh2b2lkIGNvbnN0KiBsLCBzaXplX3Qgc2l6ZSk7Ci0KLS8qKgotICogXGJyaWVmIENyZWF0ZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgYW4gb3BhcXVlIGJ1ZmZlci4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGlucHV0IGJ1ZmZlci4KLSAqLwotLy8gY29udmVydDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCi0gKi8KLS8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCi12b2lkIHdyYXBBcyhBbndCdWZmZXIqIHQsIEdyYXBoaWNCdWZmZXIgY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBBbndCdWZmZXJgIHRvIGBHcmFwaGljQnVmZmVyYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgR3JhcGhpY0J1ZmZlcmAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgQW53QnVmZmVyYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KLWJvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCk7Ci0KLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KLSAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCi0gKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCi0gKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KLSAqCi0gKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCi0gKiBmb2xsb3dzOgotICoKLSAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCi0gKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCi0gKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKLSAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKLSAqIGJlIGNyZWF0ZWQuCi0gKgotICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKLSAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCi0gKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCi0gKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCi0gKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKLSAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQotICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAotICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgotICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKLSAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0Ci0gKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgotICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKLSAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKLSAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCi0gKgotICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKLSAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCi0gKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKLSAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKLSAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCi0gKgotICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCi0gKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgotICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQotICoKLSAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogaW5zdGVhZCBvZgotICoKLSAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKLSAqCi0gKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgotICoKLSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKLSAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCi0gKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCi0gKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCi0gKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgotICovCi0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KLSAqCi0gKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqCi0gKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgotICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKLSAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBgMGAgaWYgXHAgZmVuY2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgb3IgYDFgCi0gKiBvdGhlcndpc2UuCi0gKi8KLXNpemVfdCBnZXRGZW5jZUZkQ291bnQoaGlkbF9oYW5kbGUgY29uc3QmIGZlbmNlKTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZWAgdG8gYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBmZW5jZSBUaGUgZGVzdGluYXRpb24gYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIHBvaW50IHRvIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZSwgd2hpY2ggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUqIGZlbmNlLCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgaGlkbF9oYW5kbGVgIGFzIGBGZW5jZWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgRmVuY2VgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBwb2ludGVkIHRvIGJ5IFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgRmVuY2VgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIFxwIG5oIHdpbGwgaG9sZCBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSwgd2hpY2ggbXVzdCBiZQotICogZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi0vLyB3cmFwOiBGZW5jZSAtPiBoaWRsX2hhbmRsZQotYm9vbCB3cmFwQXMoaGlkbF9oYW5kbGUqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLCBGZW5jZSBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGhpZGxfaGFuZGxlYCB0byBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZWAuIGBsYCBtdXN0IG5vdCBoYXZlIGJlZW4gdXNlZAotICogKGBsLT5pc1ZhbGlkKClgIG11c3QgcmV0dXJuIGBmYWxzZWApIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKgotICogSWYgXHAgdCBjb250YWlucyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi0vLyBjb252ZXJ0OiBoaWRsX2hhbmRsZSAtPiBGZW5jZQotYm9vbCBjb252ZXJ0VG8oRmVuY2UqIGwsIGhpZGxfaGFuZGxlIGNvbnN0JiB0KTsKLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0ZlbmNlVGltZS5jcHA6IEZlbmNlVGltZTo6U25hcHNob3QKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHNuYXBzaG90LgotICovCi1zaXplX3QgZ2V0RmRDb3VudChIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KLSAqIEZFTkNFYC4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQotICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcwotICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50c0RlbHRhCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGhhdmUgbGVuZ3RoIDQsIGFuZCBpdCB3aWxsIGJlCi0gKiBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IgbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBFYWNoIG5vbi1udWxsIHNsb3QgaW4gXHAKLSAqIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wLmNwcDoKLS8vICAgICAgRnJhbWVFdmVudHNEZWx0YTo6ZmxhdHRlbgotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcyk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgYXJyYXlzIG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IKLSAqIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgXHAgbmggd2lsbCBiZSA0LiBFYWNoIG5vbi1udWxsCi0gKiBzbG90IGluIFxwIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zdGF0dXNfdCBmbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGF0YWAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQotICogbWVtYmVycyBvZiBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1ib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAgdG8KLSAqIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWJvb2wgY29udmVydFRvKAotICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbihSZWdpb24qIHQsIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSk7Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKi8KLS8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgotYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJlZ2lvbmAgdG8gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpSZWdpb25gLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJlZ2lvbiAtPiA6OmFuZHJvaWQ6OlJlZ2lvbgotYm9vbCBjb252ZXJ0VG8oOjphbmRyb2lkOjpSZWdpb24qIGwsIFJlZ2lvbiBjb25zdCYgdCk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KTsKLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIGNsb25lZCBmcm9tIGB0LmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgLiAqLwotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYHRydWVgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQotICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQotICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotYm9vbCB3cmFwQXMoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogSWYgYHQuZmVuY2VgIGhhcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi0vLyB3cmFwOiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCAtPgotLy8gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLWJvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gY29udmVydDogSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLUhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvSGlkbERpc2Nvbm5lY3RNb2RlKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLUJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvR3VpRGlzY29ubmVjdE1vZGUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHQpOwotCi19ICAvLyBuYW1lc3BhY2UgY29udmVyc2lvbgotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TVEFHRUZSSUdIVF9CUUhFTFBFUl9DT05WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IGFiYzg5MTAuLmI0YzRkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0xOSw4ICsxOSw2IEBACiAjZGVmaW5lIEdSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwogCiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KQEAgLTI4LDEzICsyNiwxNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwogCiBzdHJ1Y3QgRnJhbWVEcm9wcGVyOwotCitjbGFzcyBCdWZmZXJJdGVtOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIElHcmFwaGljQnVmZmVyQ29uc3VtZXI7CiAvKgogICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZlZWQgY29kZWNzIGZyb20gYSBTdXJmYWNlIHZpYSBCdWZmZXJRdWV1ZSBvcgogICogSFcgcHJvZHVjZXIuCkBAIC02OCw3ICs3MCw3IEBACiAgKiAoZXZlbiBpZiBpdCB3YXMgZHJvcHBlZCkgdG8gcmVlbmNvZGUgaXQgYWZ0ZXIgYW4gaW50ZXJ2YWwgaWYgbm8gZnVydGhlcgogICogZnJhbWVzIGFyZSBzZW50IGJ5IHRoZSBwcm9kdWNlci4KICAqLwotY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKIApAQCAtODIsOSArODQsMTcgQEAKIAogICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCiAgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUHJvZHVjZXI7Ci0gICAgfQorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgYnVmZmVycXVldWUgSEFMIChWMV8wKSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4KKyAgICAvLyBCdWZmZXJzIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+CisgICAgICAgIGdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXJfVjFfMCgpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBidWZmZXJxdWV1ZSBIQUwgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuCisgICAgLy8gQnVmZmVycyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorICAgICAgICBnZXRIR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CiAKICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGNvbXBvbmVudCB0cmFuc2l0aW9ucyB0byBydW5uaW5nIHN0YXRlLCB3aGljaCBtZWFucwogICAgIC8vIHdlIGNhbiBzdGFydCBoYW5kaW5nIGl0IGJ1ZmZlcnMuICBJZiB3ZSBhbHJlYWR5IGhhdmUgYnVmZmVycyBvZiBkYXRhCkBAIC0xOTAsOCArMjAwLDYgQEAKICAgICBzdGF0dXNfdCBzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzUGFja2VkKTsKIAogcHJvdGVjdGVkOgotICAgIC8vIEJROjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiBhIG5ldyBmcmFtZSBvZgogICAgIC8vIGRhdGEgaXMgYXZhaWxhYmxlLiAgSWYgd2UncmUgZXhlY3V0aW5nIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcwpAQCAtMTk5LDE5ICsyMDcsMjQgQEAKICAgICAvLyBpbnRvIHRoZSBjb2RlYyBidWZmZXIsIGFuZCBjYWxsIEVtcHR5W1RoaXNdQnVmZmVyLiAgSWYgd2UncmUgbm90IHlldAogICAgIC8vIGV4ZWN1dGluZyBvciB0aGVyZSdzIG5vIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUsIHdlIGp1c3QgaW5jcmVtZW50CiAgICAgLy8gbU51bUZyYW1lc0F2YWlsYWJsZSBhbmQgcmV0dXJuLgotICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgOwogCiAgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcwogICAgIC8vIHJlbGVhc2VkIG9uZSBvciBtb3JlIEdyYXBoaWNCdWZmZXJzLiAgV2UgY2xlYXIgb3V0IHRoZSBhcHByb3ByaWF0ZQogICAgIC8vIHNldCBvZiBtQnVmZmVyU2xvdCBlbnRyaWVzLgotICAgIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgOwogCiAgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcwogICAgIC8vIGNoYW5nZWQgdGhlIHNpZGViYW5kIHN0cmVhbS4gR3JhcGhpY0J1ZmZlclNvdXJjZSBkb2Vzbid0IGhhbmRsZSBzaWRlYmFuZAogICAgIC8vIHN0cmVhbXMgc28gdGhpcyBpcyBhIG5vLW9wIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCkuCi0gICAgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSA7CiAKIHByaXZhdGU6CisgICAgLy8gQlE6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3RydWN0IENvbnN1bWVyUHJveHk7CisgICAgc3A8Q29uc3VtZXJQcm94eT4gbUNvbnN1bWVyUHJveHk7CisKICAgICAvLyBMb2NrLCBjb3ZlcnMgYWxsIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGExYzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXwotI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0hfCi0KLSNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OlYxXzA6OkFud0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgotICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6Ci0gICAgICAgIElQcm9kdWNlckxpc3RlbmVyIEhQcm9kdWNlckxpc3RlbmVyOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyIEJQcm9kdWNlckxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLQotI2lmbmRlZiBMT0cKLXN0cnVjdCBMT0dfZHVtbXkgewotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIExPR19kdW1teSYgb3BlcmF0b3I8PCAoY29uc3QgVCYpIHsgcmV0dXJuICp0aGlzOyB9Ci19OwotCi0jZGVmaW5lIExPRyh4KSAgTE9HX2R1bW15KCkKLSNlbmRpZgotCi0vLyBJbnN0YW50aWF0ZSBvbmx5IGlmIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgaXMgYmFzZSBvZiBCQVNFLgotdGVtcGxhdGUgPHR5cGVuYW1lIEJBU0UsCi0gICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8SEdyYXBoaWNCdWZmZXJQcm9kdWNlciwgQkFTRT46OnZhbHVlPjo6dHlwZT4KLXN0cnVjdCBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlciA6IHB1YmxpYyBCQVNFIHsKLSAgICBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcihzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb25zdCYgYmFzZSkgOiBtQmFzZShiYXNlKSB7fQotICAgIFJldHVybjx2b2lkPiByZXF1ZXN0QnVmZmVyKGludDMyX3Qgc2xvdCwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cmVxdWVzdEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsICZidWYpOwotICAgICAgICBBbndCdWZmZXIgYW53QnVmZmVye307Ci0gICAgICAgIGlmIChidWYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJmFud0J1ZmZlciwgKmJ1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgYW53QnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChpbnQzMl90IG1heERlcXVldWVkQnVmZmVycykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihtYXhEZXF1ZXVlZEJ1ZmZlcnMpKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldEFzeW5jTW9kZShib29sIGFzeW5jKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0QXN5bmNNb2RlKGFzeW5jKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGRlcXVldWVCdWZmZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKLSAgICAgICAgICAgIGJvb2wgZ2V0RnJhbWVUaW1lc3RhbXBzLCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIGludCBzbG90e307Ci0gICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIG91dFRpbWVzdGFtcHM7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgJnNsb3QsICZmZW5jZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLCBudWxscHRyLAotICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKLSAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNle307Ci0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgdE91dFRpbWVzdGFtcHN7fTsKLQotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChmZW5jZSA9PSBudWxscHRyKSB8fCAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRGZW5jZSwgJm5oLCAqZmVuY2UpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKLSAgICAgICAgICAgICAgICAgICAgIHRGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIHRPdXRUaW1lc3RhbXBzKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgICAgICBpZiAoZ2V0RnJhbWVUaW1lc3RhbXBzICYmICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dFRpbWVzdGFtcHMsICZuaEFBLCBvdXRUaW1lc3RhbXBzKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCB0aW1lc3RhbXBzIjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKLSAgICAgICAgICAgICAgICAgICAgIHRGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIHRPdXRUaW1lc3RhbXBzKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAotICAgICAgICAgICAgICAgIHRGZW5jZSwKLSAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgaWYgKGdldEZyYW1lVGltZXN0YW1wcykgewotICAgICAgICAgICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBuaEEpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gZGV0YWNoQnVmZmVyKGludDMyX3Qgc2xvdCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmRldGFjaEJ1ZmZlcihzbG90KSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGRldGFjaE5leHRCdWZmZXIoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBvdXRCdWZmZXI7Ci0gICAgICAgIHNwPEZlbmNlPiBvdXRGZW5jZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmRldGFjaE5leHRCdWZmZXIoJm91dEJ1ZmZlciwgJm91dEZlbmNlKTsKLSAgICAgICAgQW53QnVmZmVyIHRCdWZmZXJ7fTsKLSAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNle307Ci0KLSAgICAgICAgaWYgKG91dEJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGJ1ZmZlciI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEJ1ZmZlciwgKm91dEJ1ZmZlcik7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgICAgICBpZiAoKG91dEZlbmNlICE9IG51bGxwdHIpICYmICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEZlbmNlLCAmbmgsICpvdXRGZW5jZSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGF0dGFjaEJ1ZmZlcihjb25zdCBBbndCdWZmZXImIGJ1ZmZlciwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXR0YWNoQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIGludCBvdXRTbG90OwotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBsQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhsQnVmZmVyLmdldCgpLCBidWZmZXIpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXR0YWNoQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBuYXRpdmUgd2luZG93IGJ1ZmZlciI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5hdHRhY2hCdWZmZXIoJm91dFNsb3QsIGxCdWZmZXIpOwotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHN0YXRpY19jYXN0PGludDMyX3Q+KG91dFNsb3QpKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gcXVldWVCdWZmZXIoCi0gICAgICAgICAgICBpbnQzMl90IHNsb3QsIGNvbnN0IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dHt9OwotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGxJbnB1dCgKLSAgICAgICAgICAgICAgICAwLCBmYWxzZSwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6UmVjdCgwLCAwLCAxLCAxKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkUsCi0gICAgICAgICAgICAgICAgMCwgOjphbmRyb2lkOjpGZW5jZTo6Tk9fRkVOQ0UpOwotICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKCZsSW5wdXQsIGlucHV0KSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpLCB0T3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgbE91dHB1dDsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPnF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2xvdCksIGxJbnB1dCwgJmxPdXRwdXQpOwotCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dHB1dCwgJm5oQUEsIGxPdXRwdXQpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpLCB0T3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0cHV0KTsKLSAgICAgICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIG5oIDogbmhBKSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IGNhbmNlbEJ1ZmZlcihpbnQzMl90IHNsb3QsIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkgb3ZlcnJpZGUgewotICAgICAgICBzcDxGZW5jZT4gbEZlbmNlID0gbmV3IEZlbmNlKCk7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8obEZlbmNlLmdldCgpLCBmZW5jZSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IGZlbmNlIjsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+Y2FuY2VsQnVmZmVyKHN0YXRpY19jYXN0PGludD4oc2xvdCksIGxGZW5jZSkpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBxdWVyeShpbnQzMl90IHdoYXQsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIGludCBsVmFsdWU7Ci0gICAgICAgIGludCBsUmV0dXJuID0gbUJhc2UtPnF1ZXJ5KHN0YXRpY19jYXN0PGludD4od2hhdCksICZsVmFsdWUpOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihsUmV0dXJuKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obFZhbHVlKSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8SFByb2R1Y2VyTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgICAgIGludDMyX3QgYXBpLCBib29sIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gbExpc3RlbmVyID0gbGlzdGVuZXIgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgbnVsbHB0ciA6IG5ldyBMV1Byb2R1Y2VyTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBsT3V0cHV0OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Y29ubmVjdChsTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhcGkpLAotICAgICAgICAgICAgICAgIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAotICAgICAgICAgICAgICAgICZsT3V0cHV0KTsKLQotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCB0T3V0cHV0e307Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dHB1dCwgJm5oQUEsIGxPdXRwdXQpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdCAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gZGlzY29ubmVjdCgKLSAgICAgICAgICAgIGludDMyX3QgYXBpLAotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbW9kZSkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmRpc2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhcGkpLAotICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6dG9HdWlEaXNjb25uZWN0TW9kZShtb2RlKSkpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBzZXRTaWRlYmFuZFN0cmVhbShjb25zdCBoaWRsX2hhbmRsZSYgc3RyZWFtKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0U2lkZWJhbmRTdHJlYW0oTmF0aXZlSGFuZGxlOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgc3RyZWFtID8gbmF0aXZlX2hhbmRsZV9jbG9uZShzdHJlYW0pIDogTlVMTCwgdHJ1ZSkpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gYWxsb2NhdGVCdWZmZXJzKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKSBvdmVycmlkZSB7Ci0gICAgICAgIG1CYXNlLT5hbGxvY2F0ZUJ1ZmZlcnMoCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLAotICAgICAgICAgICAgICAgIHVzYWdlKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gYWxsb3dBbGxvY2F0aW9uKGJvb2wgYWxsb3cpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5hbGxvd0FsbG9jYXRpb24oYWxsb3cpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcih1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGdldENvbnN1bWVyTmFtZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRDb25zdW1lck5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgX2hpZGxfY2IobUJhc2UtPmdldENvbnN1bWVyTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0U2hhcmVkQnVmZmVyTW9kZShib29sIHNoYXJlZEJ1ZmZlck1vZGUpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRTaGFyZWRCdWZmZXJNb2RlKHNoYXJlZEJ1ZmZlck1vZGUpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goYm9vbCBhdXRvUmVmcmVzaCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEF1dG9SZWZyZXNoKGF1dG9SZWZyZXNoKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KGludDY0X3QgdGltZW91dE5zKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dE5zKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGdldExhc3RRdWV1ZWRCdWZmZXIoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBsT3V0QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgc3A8RmVuY2U+IGxPdXRGZW5jZSA9IG5ldyBGZW5jZSgpOwotICAgICAgICBmbG9hdCBsT3V0VHJhbnNmb3JtTWF0cml4WzE2XTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldExhc3RRdWV1ZWRCdWZmZXIoCi0gICAgICAgICAgICAgICAgJmxPdXRCdWZmZXIsICZsT3V0RmVuY2UsIGxPdXRUcmFuc2Zvcm1NYXRyaXgpOwotCi0gICAgICAgIEFud0J1ZmZlciB0T3V0QnVmZmVye307Ci0gICAgICAgIGlmIChsT3V0QnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0QnVmZmVyLCAqbE91dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaGlkbF9oYW5kbGUgdE91dEZlbmNle307Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgICAgICBpZiAoKGxPdXRGZW5jZSA9PSBudWxscHRyKSB8fCAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRGZW5jZSwgJm5oLCAqbE91dEZlbmNlKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldExhc3RRdWV1ZWRCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmZW5jZSI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICB0T3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB0T3V0RmVuY2UsCi0gICAgICAgICAgICAgICAgICAgIGhpZGxfYXJyYXk8ZmxvYXQsIDE2PigpKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGlkbF9hcnJheTxmbG9hdCwgMTY+IHRPdXRUcmFuc2Zvcm1NYXRyaXgobE91dFRyYW5zZm9ybU1hdHJpeCk7Ci0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dEJ1ZmZlciwgdE91dEZlbmNlLCB0T3V0VHJhbnNmb3JtTWF0cml4KTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBnZXRGcmFtZVRpbWVzdGFtcHMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBsRGVsdGE7Ci0gICAgICAgIG1CYXNlLT5nZXRGcmFtZVRpbWVzdGFtcHMoJmxEZWx0YSk7Ci0KLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSB0RGVsdGF7fTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0RGVsdGEsICZuaEFBLCBsRGVsdGEpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0RnJhbWVUaW1lc3RhbXBzIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZnJhbWUgdGltZXN0YW1wcyI7Ci0gICAgICAgICAgICBfaGlkbF9jYih0RGVsdGEpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHREZWx0YSk7Ci0gICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBnZXRVbmlxdWVJZChIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRVbmlxdWVJZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICB1aW50NjRfdCBvdXRJZHt9OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Z2V0VW5pcXVlSWQoJm91dElkKTsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgb3V0SWQpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtQmFzZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJiYTg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCi0jZGVmaW5lIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCi0KLSNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OnNwOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SVByb2R1Y2VyTGlzdGVuZXIKLSAgICAgICAgSFByb2R1Y2VyTGlzdGVuZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6SVByb2R1Y2VyTGlzdGVuZXIKLSAgICAgICAgQlByb2R1Y2VyTGlzdGVuZXI7Ci11c2luZyA6OmFuZHJvaWQ6OkJuUHJvZHVjZXJMaXN0ZW5lcjsKLQotc3RydWN0IFRXUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBIUHJvZHVjZXJMaXN0ZW5lciB7Ci0gICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IG1CYXNlOwotICAgIFRXUHJvZHVjZXJMaXN0ZW5lcihzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOwotICAgIFJldHVybjx2b2lkPiBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGJvb2w+IG5lZWRzUmVsZWFzZU5vdGlmeSgpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgTFdQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7Ci1wdWJsaWM6Ci0gICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IG1CYXNlOwotICAgIExXUHJvZHVjZXJMaXN0ZW5lcihzcDxIUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOwotICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlOwotICAgIGJvb2wgbmVlZHNSZWxlYXNlTm90aWZ5KCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKaW5kZXggNzM1Mjg1NC4uNDZiM2I4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icApAQCAtMSwyMiArMSwxMiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0QUFDMi5jcHAiLAogICAgICAgICAiRHJjUHJlc01vZGVXcmFwLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yNSwxOSArMTUsMTEgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYkZyYXVuaG9mZXJBQUMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IGJjMGE2OWYuLjQxYmMxNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CiAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7Ci0gICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBpbnQxNl90W21PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplXTsKICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOwogICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKQEAgLTczOCw3ICs3MzgsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSBtQnVmZmVyVGltZXN0YW1wcy50b3AoKTsKICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMIC8gbVN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmFkZChjdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk4OSw3ICs5ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0L2ludGVycG9sYXRlIG5leHQgdGltZSBzdGFtcAogICAgICAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnRCdWZMZWZ0IC09IGRlY29kZWRTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwTEwgLyBtU3RyZWFtSW5mby0+YWFjU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhZGp1c3RlZCBuZXh0VGltZVN0YW1wL3NpemUgdG8gJWxsZC8lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCmluZGV4IDczYTM5NjUuLjViZWU3MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBib29sIG1FbmRPZk91dHB1dDsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOwogICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7Ci0gICAgc2hvcnQgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgaW50MTZfdCAqbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zOwogICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAppbmRleCA5MzQyMzUxLi5iZjc4OWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCkBAIC0xLDE5ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0QUFDRW5jb2RlcjIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjIsMTggKzEyLDcgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYkZyYXVuaG9mZXJBQUMiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCA5NmU2NjhlLi42ZTQzN2NmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICBtSW5wdXRTaXplKDApLAogICAgICAgbUlucHV0RnJhbWUoTlVMTCksCiAgICAgICBtQWxsb2NhdGVkRnJhbWVTaXplKDApLAotICAgICAgbUlucHV0VGltZVVzKC0xbGwpLAorICAgICAgbUlucHV0VGltZVVzKC0xTEwpLAogICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewogICAgIGluaXRQb3J0cygpOwpAQCAtNTg3LDcgKzU4Nyw3IEBACiAgICAgICAgICAgICAvLyAiVGltZSIgb24gdGhlIGlucHV0IGJ1ZmZlciBoYXMgaW4gZWZmZWN0IGFkdmFuY2VkIGJ5IHRoZQogICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3ZSBqdXN0IGFkdmFuY2VkIG5PZmZzZXQgYnkuCiAgICAgICAgICAgICBpbkhlYWRlci0+blRpbWVTdGFtcCArPQotICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMGxsIC8gbVNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZSkKICAgICAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKIAogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKQEAgLTcyNSw3ICs3MjUsNyBAQAogICAgIG1BbGxvY2F0ZWRGcmFtZVNpemUgPSAwOwogCiAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOwotICAgIG1JbnB1dFRpbWVVcyA9IC0xbGw7CisgICAgbUlucHV0VGltZVVzID0gLTFMTDsKICAgICBtU2F3SW5wdXRFT1MgPSBmYWxzZTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAppbmRleCA1MTc3NTkzLi43NzJlYmY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAKaW5kZXggZmQxYzkwZC4uN2UwYWU5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcApAQCAtMTc2LDcgKzE3Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgRlVOQ1RJT04gQ09ERQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1Xb3JkMzIgTF9hYnMocmVnaXN0ZXIgV29yZDMyIExfdmFyMSkKK1dvcmQzMiBMX2FicyhXb3JkMzIgTF92YXIxKQogewogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKaW5kZXggZjYwOWE3My4uNDdlMWVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKQEAgLTE5MCw3ICsxOTAsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDMyIExfc2hyX3IocmVnaXN0ZXIgV29yZDMyIExfdmFyMSwgcmVnaXN0ZXIgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKK1dvcmQzMiBMX3Nocl9yKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCiB7CiAgICAgV29yZDMyIHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAKaW5kZXggMGUzZjc3Mi4uODFkOWNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwCkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAqc3QgPSBOVUxMOwogCiAgICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCi0gICAgaWYgKChzID0gKGxzcFN0YXRlICopIG1hbGxvYyhzaXplb2YobHNwU3RhdGUpKSkgPT0gTlVMTCkKKyAgICBpZiAoKHMgPSAobHNwU3RhdGUgKikgY2FsbG9jKHNpemVvZihsc3BTdGF0ZSksIDEpKSA9PSBOVUxMKQogICAgIHsKICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsICJsc3BfaW5pdDogY2FuIG5vdCBtYWxsb2Mgc3RhdGUgc3RydWN0dXJlXG4iKTsgKi8KICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTgyLDExICsxODIsMTMgQEAKICAgICAvKiBJbml0aWFsaXplIHF1YW50aXphdGlvbiBzdGF0ZSAqLwogICAgIGlmICgwICE9IFFfcGxzZl9pbml0KCZzLT5xU3QpKQogICAgIHsKKyAgICAgICAgbHNwX2V4aXQoJnMpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgaWYgKDAgIT0gbHNwX3Jlc2V0KHMpKQogICAgIHsKKyAgICAgICAgbHNwX2V4aXQoJnMpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcAppbmRleCBiZTU4ZDJiLi5hYTM2NDIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAKQEAgLTE2MSw3ICsxNjEsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDE2IG5lZ2F0ZShyZWdpc3RlciBXb3JkMTYgdmFyMSkKK1dvcmQxNiBuZWdhdGUoV29yZDE2IHZhcjEpCiB7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwCmluZGV4IDcxZDE3MDIuLjYzM2E4YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAKQEAgLTE4NCw3ICsxODQsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDE2IHB2X3JvdW5kKHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjEsIEZsYWcgKnBPdmVyZmxvdykKK1dvcmQxNiBwdl9yb3VuZChXb3JkMzIgTF92YXIxLCBGbGFnICpwT3ZlcmZsb3cpCiB7CiAgICAgV29yZDE2ICByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcAppbmRleCA2NjU2ZjkzLi5jZGNjMjQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwCkBAIC0xOTMsNyArMTkzLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVdvcmQxNiBzaHJfcihyZWdpc3RlciBXb3JkMTYgdmFyMSwgcmVnaXN0ZXIgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKK1dvcmQxNiBzaHJfcihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIsIEZsYWcgKnBPdmVyZmxvdykKIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggODgwZjE2MS4uZTE4MTE3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtNDAsNyArNDAsNiBAQAogICAgICAgICAic3JjL3dtZl90b19ldHMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTY4LDIzICs2NywxNCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLApAQCAtMTAyLDE0ICs5MiwxMCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlY190ZXN0IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IGI3ZTg0ZWMuLjM0ZGQwMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtNTA1LDcgKzUwNSw3IEBACiAKICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CiAgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBrU2FtcGxlUmF0ZU5COworICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBMTCkgLyBrU2FtcGxlUmF0ZU5COwogCiAgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lTkI7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01MTMsNyArNTEzLDcgQEAKIAogICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KICAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzCi0gICAgICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIGtTYW1wbGVSYXRlV0I7CisgICAgICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMExMKSAvIGtTYW1wbGVSYXRlV0I7CiAKICAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ICs9IGtOdW1TYW1wbGVzUGVyRnJhbWVXQjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAKaW5kZXggMjk4OWI3NC4uNDljYWZmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwCkBAIC0yNjgsMTMgKzI2OCw3IEBACiAgICAgaWYgKERlY29kZXJfYW1yX2luaXQoJnMtPmRlY29kZXJfYW1yU3RhdGUpCiAgICAgICAgICAgICB8fCBQb3N0X1Byb2Nlc3NfcmVzZXQoJnMtPnBvc3RIUF9zdGF0ZSkpCiAgICAgewotICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lU3RhdGUgKnRtcCA9IHM7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICBkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgYXZvaWQKLSAgICAgICAgICogIGJyZWFraW5nIHN0cmljdC1hbGlhc2luZyBydWxlcwotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCoqIHRlbXBWb2lkID0gKHZvaWQqKikgdG1wOwotICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQodGVtcFZvaWQpOworICAgICAgICBmcmVlKHMpOwogICAgICAgICByZXR1cm4gKC0xKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcAppbmRleCA0MWE5ZTk4Li42MjFmZGE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCkBAIC02Nyw2ICs2Nyw3IEBACiAgICAgaW50IGJ5dGVzUmVhZCA9IGZyZWFkKGhlYWRlciwgMSwga0ZpbGVIZWFkZXJTaXplLCBmcElucHV0KTsKICAgICBpZiAoYnl0ZXNSZWFkICE9IGtGaWxlSGVhZGVyU2l6ZSB8fCBtZW1jbXAoaGVhZGVyLCAiIyFBTVJcbiIsIGtGaWxlSGVhZGVyU2l6ZSkpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIEFNUi1OQiBmaWxlXG4iKTsKKyAgICAgICAgZmNsb3NlKGZwSW5wdXQpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKQEAgLTc5LDYgKzgwLDcgQEAKICAgICBTTkRGSUxFICpoYW5kbGUgPSBzZl9vcGVuKGFyZ3ZbMl0sIFNGTV9XUklURSwgJnNmSW5mbyk7CiAgICAgaWYoIWhhbmRsZSl7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSAlc1xuIiwgYXJndlsyXSk7CisgICAgICAgIGZjbG9zZShmcElucHV0KTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCkBAIC04Nyw2ICs4OSw4IEBACiAgICAgaW50IGVyciA9IEdTTUluaXREZWNvZGUoJmFtckhhbmRsZSwgKFdvcmQ4KikiQU1STkJEZWNvZGVyIik7CiAgICAgaWYoZXJyICE9IDApewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIEFNUi1OQiBkZWNvZGVyIGluc3RhbmNlXG4iKTsKKyAgICAgICAgZmNsb3NlKGZwSW5wdXQpOworICAgICAgICBzZl9jbG9zZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCAxOWZkNGE4Li40MzhlZDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICJzcmMvdG9uX3N0YWIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC04NiwyMSArODYsMTIgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Ftcm5iZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUk5CRW5jb2Rlci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTExMSwxMyArMTAyLDggQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAppbmRleCBmOTdjNDRmLi44NWFiNjRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAgIG1CaXRSYXRlKDApLAogICAgICAgbU1vZGUoTVI0NzUpLAogICAgICAgbUlucHV0U2l6ZSgwKSwKLSAgICAgIG1JbnB1dFRpbWVVcygtMWxsKSwKKyAgICAgIG1JbnB1dFRpbWVVcygtMUxMKSwKICAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKICAgICBpbml0UG9ydHMoKTsKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICAgICAgLy8gIlRpbWUiIG9uIHRoZSBpbnB1dCBidWZmZXIgaGFzIGluIGVmZmVjdCBhZHZhbmNlZCBieSB0aGUKICAgICAgICAgICAgIC8vIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd2UganVzdCBhZHZhbmNlZCBuT2Zmc2V0IGJ5LgogICAgICAgICAgICAgaW5IZWFkZXItPm5UaW1lU3RhbXAgKz0KLSAgICAgICAgICAgICAgICAoY29weSAqIDEwMDAwMDBsbCAvIGtTYW1wbGVSYXRlKSAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICAoY29weSAqIDEwMDAwMDBMTCAvIGtTYW1wbGVSYXRlKSAvIHNpemVvZihpbnQxNl90KTsKIAogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAppbmRleCA5ZmVmZDgxLi44OGNmN2YyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAic3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgInNyYyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAKaW5kZXggNDg2ODgyMi4uMzZhNzM5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApAQCAtMjM0LDYgKzIzNCw3IEBACiAgICAgICAgICAgICAgICAgZGVjXzZwXzZOXzIoTF9pbmRleCwgNCwgMCwgcG9zKTsKICAgICAgICAgICAgICAgICBhZGRfcHVsc2VzKHBvcywgNiwgaywgY29kZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwCmluZGV4IGI4MDU1NWIuLmMwZTRjNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWVtcGhhc2lzXzMyLmNwcApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgaW50MTYgbG8sIGhpOwogCiAgICAgTF90bXAgID0gKChpbnQzMil4X2hpWzBdKSA8PCAxNjsKLSAgICBMX3RtcCArPSAoKGludDMyKXhfbG9bMF0pIDw8IDQ7CisgICAgTF90bXAgKz0gKCgoaW50MzIpeF9sb1swXSkgPDwgNCkgJiAweEZGRkY7CiAgICAgTF90bXAgID0gc2hsX2ludDMyKExfdG1wLCAzKTsKIAogICAgIExfdG1wID0gZnhwX21hY18xNmJ5MTYoKm1lbSwgbXUsIExfdG1wKSwKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgIGZvciAoaSA9IDE7IGkgPCBMIC0gMTsgaSsrKQogICAgIHsKICAgICAgICAgTF90bXAgID0gKChpbnQzMiloaSkgPDwgMTY7Ci0gICAgICAgIExfdG1wICs9ICgoaW50MzIpbG8pIDw8IDQ7CisgICAgICAgIExfdG1wICs9ICgoKGludDMyKWxvKSA8PCA0KSAmIDB4RkZGRjsKICAgICAgICAgTF90bXAgID0gc2hsX2ludDMyKExfdG1wLCAzKTsKICAgICAgICAgTF90bXAgID0gZnhwX21hY18xNmJ5MTYoeVtpIC0gMV0sIG11LCBMX3RtcCksCiAgICAgICAgICAgICAgICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMSk7ICAgICAgICAgICAvKiBzYXR1cmF0aW9uIGNhbiBvY2N1ciBoZXJlICovCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgaGkgICAgID0geF9oaVtpKzFdOwogICAgIH0KICAgICBMX3RtcCAgPSAoKGludDMyKWhpKSA8PCAxNjsKLSAgICBMX3RtcCArPSAoKGludDMyKWxvKSA8PCA0OworICAgIExfdG1wICs9ICgoKGludDMyKWxvKSA8PCA0KSAmIDB4RkZGRjsKICAgICBMX3RtcCAgPSBzaGxfaW50MzIoTF90bXAsIDMpOwogICAgIExfdG1wICA9IGZ4cF9tYWNfMTZieTE2KHlbaSAtIDFdLCBtdSwgTF90bXApLAogICAgICAgICAgICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMSk7ICAgICAgICAgICAvKiBzYXR1cmF0aW9uIGNhbiBvY2N1ciBoZXJlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcAppbmRleCAwMzI1MzExLi40ZDExMjZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAKQEAgLTE3MCw2ICsxNzAsNyBAQAogICAgICAgICBjYXNlIDB4MzgwMDAwMDA6CiAgICAgICAgIGNhc2UgMHgzMDAwMDAwMDoKICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuY3BwCmluZGV4IGI4Y2ZlZmEuLmRkYzgxOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuY3BwCkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4YzJbaV9zdWJmcl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW50aDE2a1tpX3N1YmZyICo1LzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhmSXNmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEVFhTdGF0ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfY2VxdWl2YWxlbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfY2VxdWl2YWxlbnQuaAppbmRleCAzYzc1OTBjLi43YTg2ZWMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCkBAIC00NjcsNyArNDY3LDEyIEBACiAgICAgX19pbmxpbmUgIGludDMyIGZ4cF9tYWNfMTZieTE2KGludDE2IHZhcjEsICBpbnQxNiB2YXIyLCBpbnQzMiBMX2FkZCkKICAgICB7CiAKLSAgICAgICAgTF9hZGQgKz0gKGludDMyKXZhcjEgKiB2YXIyOworICAgICAgICBpbnQzMiBsX29yaWcgPSBMX2FkZDsKKyAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coIChpbnQzMil2YXIxICogdmFyMiwgbF9vcmlnLCAmTF9hZGQpKSB7CisgICAgICAgICAgICAvLyBuZWVkcyBzYXR1cmF0aW9uCisgICAgICAgICAgICBpZiAobF9vcmlnID4gMCkgTF9hZGQgPSBNQVhfMzI7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgTF9hZGQgPSBNSU5fMzI7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gTF9hZGQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCA1ZDQ3OWIzLi4wODRiZTBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtMTM1LDkgKzEzNSw2IEBACiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CkBAIC0xNDYsMjAgKzE0MywxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yd2JlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0QU1SV0JFbmNvZGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTE2NywyMyArMTU0LDEyIEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc3ViZGlycyA9IFsiU2FtcGxlQ29kZSJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYwppbmRleCA3YzA5NGYzLi43MjgyZGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKQEAgLTEzNCwxNCArMTM0LDE2IEBACiAJaWYoaGFuZGxlID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gc2FmZV9leGl0OwogCX0KIAogCXBmdW5jID0gZGxzeW0oaGFuZGxlLCAidm9HZXRBTVJXQkVuY0FQSSIpOwogCWlmKHBmdW5jID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZnVuY3Rpb24gZXJyb3IuLi4uLi4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXQgPSAtMTsKKwkJZ290byBzYWZlX2V4aXQ7CiAJfQogCiAJcEdldEFQSSA9IChWT0dFVEFVRElPRU5DQVBJKXBmdW5jOwpAQCAtMTUwLDcgKzE1Miw4IEBACiAJaWYocmV0dXJuQ29kZSkKIAl7CiAJCXByaW50ZigiZ2V0IEFQSXMgZXJyb3IuLi4uLi4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXQgPSAtMTsKKwkJZ290byBzYWZlX2V4aXQ7CiAJfQogI2Vsc2UKIAlyZXQgPSB2b0dldEFNUldCRW5jQVBJKCZBdWRpb0FQSSk7CkBAIC0yNTMsNyArMjU2LDggQEAKIAkJZmNsb3NlKGZkc3QpOwogCiAjaWZkZWYgTElOVVgKLQlkbGNsb3NlKGhhbmRsZSk7CisJaWYgKGhhbmRsZSkKKwkJZGxjbG9zZShoYW5kbGUpOwogI2VuZGlmCiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKaW5kZXggNzliMzdmZi4uOTQ0MmZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCkBAIC0yNCw4ICsyNCw1IEBACiAKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCmluZGV4IGE2NDRiNjYuLjdmYjhhNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgIG1CaXRSYXRlKDApLAogICAgICAgbU1vZGUoVk9BTVJXQl9NRDY2KSwKICAgICAgIG1JbnB1dFNpemUoMCksCi0gICAgICBtSW5wdXRUaW1lVXMoLTFsbCksCisgICAgICBtSW5wdXRUaW1lVXMoLTFMTCksCiAgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CiAgICAgaW5pdFBvcnRzKCk7CkBAIC0zODcsNyArMzg3LDcgQEAKICAgICAgICAgICAgIC8vICJUaW1lIiBvbiB0aGUgaW5wdXQgYnVmZmVyIGhhcyBpbiBlZmZlY3QgYWR2YW5jZWQgYnkgdGhlCiAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdlIGp1c3QgYWR2YW5jZWQgbk9mZnNldCBieS4KICAgICAgICAgICAgIGluSGVhZGVyLT5uVGltZVN0YW1wICs9Ci0gICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwbGwgLyBrU2FtcGxlUmF0ZSkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwTEwgLyBrU2FtcGxlUmF0ZSkgLyBzaXplb2YoaW50MTZfdCk7CiAKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAppbmRleCBjZjUwYTA0Li4wYmI2YmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCkBAIC0xLDQ0ICsxLDIyIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEFWQ0RlYy5jcHAiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IDM5MjRmYzIuLjVhNGIyZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtNTgwLDcgKzU4MCw3IEBACiAgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOwogCiAgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkUmVzb2x1dGlvbiA9Ci0gICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkUmVzb2x1dGlvbikgewpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogICAgICAgICAgICAgaWYgKGFsbG9jYXRpb25GYWlsZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CkBAIC01OTgsNyArNTk4LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY19vcC51NF9lcnJvcl9jb2RlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBFcnJvciA6IDB4JXgiLCBzX2RlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICBnZXRWVUlQYXJhbXMoKTsKIApAQCAtNjA3LDcgKzYxNCw3IEBACiAgICAgICAgICAgICB0aW1lVGFrZW4gPSBtVGltZUVuZCAtIG1UaW1lU3RhcnQ7CiAKICAgICAgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZsbGR1cyBkZWxheT0lNmxsZHVzIG51bUJ5dGVzPSU2ZCIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICh0aW1lVGFrZW4gLyAxMDAwbGwpLCAobG9uZyBsb25nKSAodGltZURlbGF5IC8gMTAwMGxsKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKHRpbWVUYWtlbiAvIDEwMDBMTCksIChsb25nIGxvbmcpICh0aW1lRGVsYXkgLyAxMDAwTEwpLAogICAgICAgICAgICAgICAgICAgIHNfZGVjX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CiAgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnICYmICFtRmx1c2hOZWVkZWQpIHsKICAgICAgICAgICAgICAgICBtRmx1c2hOZWVkZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCmluZGV4IGNlZmU3N2MuLjk4MDI2MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKQEAgLTEsNDYgKzEsMjIgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hdmNlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCiAgICAgc3JjczogWyJTb2Z0QVZDRW5jLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCiAgICAgXSwKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKLQotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCAzNzlkNDFlLi45ZGI2NDY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTIxLDggKzIxLDggQEAKIAogI2luY2x1ZGUgIk9NWF9WaWRlby5oIgogCi0jaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KQEAgLTEwNTgsOCArMTA1OCw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKSB7CitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTExMjUsNyArMTEyNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZyhpbmRleCwgX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIF9wYXJhbXMsIGZyYW1lQ29uZmlnKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKaW5kZXggYTQzY2RmMS4uNmQyZTA4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKICNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCiAjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAotI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDI0MDAwMDAwMAogI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1ggICAgMjU2CiAjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWSAgICAyNTYKICNkZWZpbmUgREVGQVVMVF9NQVhfRlJBTUVSQVRFICAgICAgIDEyMDAwMApAQCAtMjE5LDggKzIxOSw4IEBACiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEJpdHJhdGVQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0cmF0ZSk7CiAKLSAgICBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDM3MjY5MjIuLmM1YTA3NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsOSArMSw2IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsiY21uTWVtb3J5LmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvVHlwZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvVHlwZS5oCmluZGV4IGRhMjA4ZDQuLjczZjI0ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9UeXBlLmgKQEAgLTIyLDYgKzIyLDggQEAKICNpZm5kZWYgX192b1R5cGVfSF9fCiAjZGVmaW5lIF9fdm9UeXBlX0hfXwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KQEAgLTYyLDI4ICs2NCwyOCBAQAogdHlwZWRlZiB2b2lkIFZPX1ZPSUQ7CiAKIC8qKiBWT19VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZPX1U4OwordHlwZWRlZiB1aW50OF90IFZPX1U4OwogCiAvKiogVk9fQllURSBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFZPX0JZVEU7Cit0eXBlZGVmIHVpbnQ4X3QgVk9fQllURTsKIAogLyoqIFZPX1M4IGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgY2hhciBWT19TODsKK3R5cGVkZWYgaW50OF90IFZPX1M4OwogCiAvKiogVk9fQ0hBUiBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgY2hhciBWT19DSEFSOwordHlwZWRlZiBpbnQ4X3QgVk9fQ0hBUjsKIAogLyoqIFZPX1UxNiBpcyBhIDE2IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVk9fVTE2OwordHlwZWRlZiB1aW50MTZfdCBWT19VMTY7CiAKIC8qKiBWT19TMTYgaXMgYSAxNiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgc2hvcnQgVk9fUzE2OwordHlwZWRlZiBpbnQxNl90IFZPX1MxNjsKIAogLyoqIFZPX1UzMiBpcyBhIDMyIGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBWT19VMzI7Cit0eXBlZGVmIHVpbnQzMl90IFZPX1UzMjsKIAogLyoqIFZPX1MzMiBpcyBhIDMyIGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIFZPX1MzMjsKK3R5cGVkZWYgaW50MzJfdCBWT19TMzI7CiAKIC8qIFVzZXJzIHdpdGggY29tcGlsZXJzIHRoYXQgY2Fubm90IGFjY2VwdCB0aGUgImxvbmcgbG9uZyIgZGVzaWduYXRpb24gc2hvdWxkCiAgICBkZWZpbmUgdGhlIFZPX1NLSVA2NEJJVCBtYWNyby4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgbWF5IGNhdXNlCkBAIC05NCwxNCArOTYsMTQgQEAKICNpZm5kZWYgVk9fU0tJUDY0QklUCiAjaWZkZWYgX01TQ19WRVIKIC8qKiBWT19VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIFZPX1U2NDsKK3R5cGVkZWYgdWludDY0X3QgIFZPX1U2NDsKIC8qKiBWT19TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgICBfX2ludDY0ICBWT19TNjQ7Cit0eXBlZGVmIGludDY0X3QgIFZPX1M2NDsKICNlbHNlIC8vIFdJTjMyCiAvKiogVk9fVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVk9fVTY0OwordHlwZWRlZiB1aW50NjRfdCBWT19VNjQ7CiAvKiogVk9fUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBWT19TNjQ7Cit0eXBlZGVmIGludDY0X3QgVk9fUzY0OwogI2VuZGlmIC8vIFdJTjMyCiAjZW5kaWYgLy8gVk9fU0tJUDY0QklUCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggOWFmMDg2Yi4uNDA2NDc1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjMgKzEsMTEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRGbGFjRGVjb2Rlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjYsMTggKzE0LDkgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKaW5kZXggMmMwZjIyNC4uODQyYTdjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKQEAgLTg5LDEyICs4OSwxMiBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bU91dHB1dEJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gNDA5NiAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHM7CisgICAgZGVmLm5CdWZmZXJTaXplID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gMjsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0xOTUsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbVN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgICAgICAgICB9CiAKQEAgLTI4MSw2ICsyODEsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhLCBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTMwMSwxMSArMzE0LDEzIEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKwogICAgIEFMT0dWKCJvblF1ZXVlRmlsbGVkICVkLyVkOiIsIGluUXVldWUuZW1wdHkoKSwgb3V0UXVldWUuZW1wdHkoKSk7CiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1GaW5pc2hlZERlY29kZXIpIHsKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICAgICAgc2hvcnQgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgdm9pZCAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CiAgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CiAgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gMDsKIApAQCAtMzc0LDcgKzM4OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUsIG91dHB1dEZsb2F0KTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMzkzLDcgKzQwOCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVNhd0lucHV0RU9TKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZShOVUxMLCAwLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGluQnVmZmVyICovLCAwIC8qIGluQnVmZmVyTGVuICovLAorICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBtRmluaXNoZWREZWNvZGVyID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGZpbmlzaCByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CkBAIC00NTYsNyArNDczLDggQEAKICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOwogICAgICAgICAgICAgUG9ydEluZm8gKmluZm8gPSBlZGl0UG9ydEluZm8oMSAvKiBwb3J0SW5kZXggKi8pOwogICAgICAgICAgICAgaWYgKCFpbmZvLT5tRGVmLmJFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9IG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIDI7CisgICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCBiNjNmN2FkLi5iYTAyMDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC00NSwxMCArNDUsMTQgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAyMDQ4OyAvLyBhZGp1c3RlZCBiYXNlZCBvbiBzdHJlYW0uCisKICAgICBlbnVtIHsKICAgICAgICAga051bUlucHV0QnVmZmVycyAgID0gNCwKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgID0gNCwKICAgICB9OworICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgIE9NWF9VMzIgbUJpdHNQZXJTYW1wbGUgPSAxNjsKIAogICAgIEZMQUNEZWNvZGVyICptRkxBQ0RlY29kZXI7CiAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggNDZiOTc0ZC4uZDdkODcxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTEsMTUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEZsYWNFbmNvZGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0xOCwyNSArMTIsMTEgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmJhc2VfaGVhZGVycyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCi0KLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAotCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggZmRjODk3NS4uM2FkZDAwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTE2LDEwICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlNvZnRGbGFjRW5jb2RlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0RmxhY0VuY29kZXIuaCIKLQorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCkBAIC03NCw3ICs3NSw5IEBACiAgICAgfQogCiAgICAgaWYgKCFtU2lnbmFsbGVkRXJyb3IpIHsgLy8gbm8gdXNlIGFsbG9jYXRpbmcgaW5wdXQgYnVmZmVyIGlmIHdlIGhhZCBhbiBlcnJvciBhYm92ZQotICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYyhzaXplb2YoRkxBQ19faW50MzIpICogMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOworICAgICAgICAvLyAyeCB0aGUgcGNtMTYgc2FtcGxlcyBjYW4gZXhpc3Qgd2l0aCB0aGUgc2FtZSBzaXplIGFzIHBjbUZsb2F0IHNhbXBsZXMuCisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAgICAgIHNpemVvZihGTEFDX19pbnQzMikgKiBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogMik7CiAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjpTb2Z0RmxhY0VuY29kZXIobmFtZT0lcykgZXJyb3IgYWxsb2NhdGluZyBpbnRlcm5hbCBpbnB1dCBidWZmZXIiLCBuYW1lKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xMTQsMTQgKzExNywxNCBAQAogICAgIC8vIGNvbmZpZ3VyZSBpbnB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAwOwogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwotICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsvLyBUT0RPIHZlcmlmeSB0aGF0IDEgaXMgZW5vdWdoCisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwogICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhJbnB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwogICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gc2l6ZW9mKGZsb2F0KTsKIAogICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKICAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwpAQCAtMTMzLDcgKzEzNiw3IEBACiAgICAgLy8gY29uZmlndXJlIG91dHB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAxOwogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4T3V0cHV0QnVmZmVyU2l6ZTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKQEAgLTE5MiwxMCArMTk1LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IG1OdW1lcmljYWxEYXRhOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwpAQCAtMjY5LDEyICsyNzIsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IGtNYXhDaGFubmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IHBjbVBhcmFtcy0+bkNoYW5uZWxzOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigid2lsbCBlbmNvZGUgJWQgY2hhbm5lbHMgYXQgJWRIeiIsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJlRW5jb2RlcigpOwpAQCAtMzM1LDcgKzM1Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTM1NSw2ICszNzIsMTAgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gc2FtcGxlU2l6ZSAqIG1OdW1DaGFubmVsczsKKwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogCiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1TZW50T3V0cHV0RU9TKSB7CkBAIC0zODAsMTMgKzQwMSwyMSBAQAogICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOwogICAgICAgICAgICAgbUN1cnJlbnRJbnB1dFRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1MxNiAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBmcmFtZVNpemU7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gc2FtcGxlU2l6ZTsKIAotICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgaWYgKGlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlIG5iSW5wdXRTYW1wbGVzIG1heSBiZSAyeCBhcyBsYXJnZSBmb3IgcGNtMTYgZGF0YS4KKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKICAgICAgICAgICAgIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKQEAgLTUyNSwxMCArNTU0LDEyIEBACiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CiAgICAgfQogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBpbnQgY29kZWNCaXRzUGVyU2FtcGxlID0gaW5wdXRGbG9hdCA/IDI0IDogMTY7CiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtTnVtQ2hhbm5lbHMpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbVNhbXBsZVJhdGUpOwotICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIDE2KTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBjb2RlY0JpdHNQZXJTYW1wbGUpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwKICAgICAgICAgICAgICh1bnNpZ25lZCltQ29tcHJlc3Npb25MZXZlbCk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDY0YTZiMWUuLjcyMmZjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTQ1LDggKzQ1LDEwIEBACiAKIHByaXZhdGU6CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtOdW1CdWZmZXJzID0gMjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpICogMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4Q2hhbm5lbHMgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPQorICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gNjU1MzY7ICAgIC8vVE9ETyBjaGVjayBpZiB0aGlzIGNhbiBiZSByZWR1Y2VkCiAKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKQEAgLTU0LDYgKzU2LDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCAzZDk3ZDhjLi5mNTM1N2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMSwyNiArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRHNzExLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yOSw5ICsxMiw1IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IDdhNGNjYTkuLjg3N2NiNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA2ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGU8Y2xhc3MgVD4KQEAgLTE4NCw3ICsxODYsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiAyKSB7CisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCkBAIC0zNzIsNyArMzc0LDcgQEAKIAogICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7CiAKLSAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBMIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOwogCiAgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0YzI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCmluZGV4IDFjMzIwOGIuLjU2NzJkODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icApAQCAtMSwyMCArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZ3NtZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEdTTS5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJleHRlcm5hbC9saWJnc20vaW5jIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTIzLDE4ICsxMiw3IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDQ1OTIwZTYuLmVjNDM2Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtMSw0OCArMSwyNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2hldmNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEhFVkMuY3BwIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliaGV2Yy9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYmhldmMvY29tbW9uIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICAvLyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY3VycmVudCBhc20gZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgbGluayBlcnJvcjoKICAgICAvLyByZXF1aXJlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJlbG9jIFJfQVJNX1JFTDMyOyByZWNvbXBpbGUgd2l0aCAtZlBJQwogICAgIC8vIEJ1ZzogMTY4NTMyOTEKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAppbmRleCBiYjdkMzYxLi5mNmFlMWY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCkBAIC01NjksNyArNTY5LDcgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CiAKICAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWRSZXNvbHV0aW9uID0KLSAgICAgICAgICAgICAgICAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgICAgICAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAKICAgICAgICAgICAgIC8qIENoZWNrIGZvciB1bnN1cHBvcnRlZCBkaW1lbnNpb25zICovCiAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWRSZXNvbHV0aW9uKSB7CkBAIC01NzksNyArNTc5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgYWxsb2NhdGlvbkZhaWxlZCA9IChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgIGJvb2wgYWxsb2NhdGlvbkZhaWxlZCA9IAorICAgICAgICAgICAgICAgIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAgICAgICAgICAgICBpZiAoYWxsb2NhdGlvbkZhaWxlZCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCAwLCBOVUxMKTsKQEAgLTU4Nyw3ICs1ODgsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhdGFsIEVycm9yIDogMHgleCIsIHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAKICAgICAgICAgICAgIGdldFZVSVBhcmFtcygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKaW5kZXggY2E3MGNjMi4uNmI0NWVhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAic3JjL3ppZ3phZ190YWIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIKICAgICBdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLApAQCAtNjAsOSArNjAsNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNzAsNDUgKzY3LDIzIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNC5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX0VYUE9SVF9SRUY9IiwKICAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCi0KLSAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCBmZGE3MDI4Li42MDc1MGQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KIAogI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKIApAQCAtMTE4LDkgKzExNywxNCBAQAogICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwogCiAgICAgICAgICAgICAgICAgTGlzdDxCdWZmZXJJbmZvICo+OjppdGVyYXRvciBpdCA9IG91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgeworICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBvdXRRdWV1ZS5lbmQoKSAmJiAoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgKytpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGl0ID09IG91dFF1ZXVlLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIHBvcnQgYnVmZmVyICVkIGluIG91dFF1ZXVlOiBiLzEwOTg5MTcyNyIsIG1OdW1TYW1wbGVzT3V0cHV0ICYgMSk7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTA5ODkxNzI3Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKml0OwogICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKQEAgLTM4Miw2ICszODYsNyBAQAogICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgQ0hFQ0tfRVEoKGludClQVlJlc2V0VmlkZW9EZWNvZGVyKG1IYW5kbGUpLCAoaW50KVBWX1RSVUUpOwogICAgIH0KKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOwogfQogCiB2b2lkIFNvZnRNUEVHNDo6b25SZXNldCgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggYTc1NDgzYS4uM2QxMDA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTYxNyw2ICs2MTcsNyBAQAogICAgIHJldHVybjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93X2ludHJhKAogICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDhkNWQwNzEuLjljMGZjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMTA3LDYgKzEwNyw3IEBACiAjZWxzZQogICAgICAgICBpZiAoKHNpemVfdCluTGF5ZXJzID4gU0laRV9NQVggLyBzaXplb2YoVm9sICopKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlbyk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KIApAQCAtMTE1LDcgKzExNiw4IEBACiAgICAgICAgIGlmICh2aWRlby0+dm9sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwogICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gbkxheWVycyAqIHNpemVvZihWb2wgKik7CiAKLQorICAgICAgICAvKiBiZSBzdXJlIG5vdCB0byBsZWFrIGFueSBwcmV2aW91cyBzdGF0ZSAqLworICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoZGVjQ3RybCk7CiAgICAgICAgIC8qIHdlIG5lZWQgdG8gc2V0dXAgdGhpcyBwb2ludGVyIGZvciB0aGUgYXBwbGljYXRpb24gdG8gKi8KICAgICAgICAgLyogICAgcGFzcyBpdCBhcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID0gKHZvaWQgKikgdmlkZW87CkBAIC0xODQsOCArMTg2LDggQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IElNRU1fdm9sW2lkeF07CiAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihWb2wpOwotICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwogICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBzdHJlYW0gPSBJTUVNX0JpdHN0cmVhbURlY1ZpZGVvOwogI2Vsc2UKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopIG9zY2xfbWFsbG9jKHNpemVvZihWb2wpKTsKQEAgLTIxMSw2ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyIGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldChzdHJlYW0sIDAsIHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbykpOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGJ1ZmZlcl9zaXplID0gQml0c3RyZWFtT3BlbihzdHJlYW0sIGlkeCkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiSW5pdFZpZGVvRGVjb2RlcigpOiBDYW4ndCBhbGxvY2F0ZSBiaXRzdHJlYW0gYnVmZmVyLlxuIik7CkBAIC0zMzcsMjcgKzM0MCwzMyBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gSU1FTV9jdXJyVm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KIAogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IElNRU1fcHJldlZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAjZWxzZQogICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgewogICAgICAgICByZXR1cm4gUFZfRkFMU0U7CiAgICAgfQogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2VuZGlmCiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplICogMyk7CiAjZW5kaWYgICAvLyBNRU1PUllfUE9PTApAQCAtMzgxLDggKzM5MCwxMCBAQAogCiAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKDMgKiBzaXplIC8gMik7CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNDI5LDEwICs0NDAsMTIgQEAKICNlbHNlCiAgICAgdmlkZW8tPnNsaWNlTm8gPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogCiAgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+YWNQcmVkRmxhZywgMCwgblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CKTsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDU3RvcmUpKSB7CkBAIC00NDAsNiArNDUzLDcgQEAKICAgICB9CiAgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQywgMCwgblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAKICAgICBpZiAobk1CUGVyUm93ID4gSU5UMzJfTUFYIC0gMQpAQCAtNDQ4LDYgKzQ2Miw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBvc2NsX21hbGxvYygobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX2NvbCwgMCwgKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAKICAgICAvKiBlbGVtZW50IHplcm8gd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2FsIChjb2wpIEFDIGNvZWZmaWNpZW50cyAqLwpAQCAtNDU3LDkgKzQ3MiwxMSBAQAogICAgIC8qIEFsbG9jYXRpbmcgSGVhZGVySW5mbyBzdHJ1Y3R1cmUgJiBRdWFudGl6ZXIgYXJyYXkgKi8KICAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCwgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoaW50MTYpKSB7CkBAIC00NjcsNiArNDg0LDcgQEAKICAgICB9CiAgICAgdmlkZW8tPlFQTUIgPSAoaW50MTYgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPlFQTUIsIDB4MCwgblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKGludCkpOwogCiAgICAgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCkBAIC00ODcsOCArNTA1LDEwIEBACiAgICAgfQogICAgIHZpZGVvLT5tb3RYID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RYID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1vdFkgPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPm1vdFkgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKaW5kZXggNmJlNDAzNi4uMjczODE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMzIsMTAgKzMyLDYgQEAKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIApAQCAtNDQsOSArNDAsNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNTQsNDkgKzQ3LDI3IEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNEVuY29kZXIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EQlhfUkMiLAogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKICAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCiAgICAgICAgICItRE9TQ0xfRVhQT1JUX1JFRj0iLAotCi0gICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTIyLDkgKzkzLDYgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBmNmE3YjBlLi5mYTdkYjgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTIyLDggKzIyLDggQEAKICNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCiAjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCiAKLSNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAwMGYyZGQzLi43MWUxMTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2lmbmRlZiBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KICNkZWZpbmUgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCmluZGV4IDk0NTE0NzkuLmQ1YTNmZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaApAQCAtMTgsMTYgKzE4LDE3IEBACiAjaWZuZGVmIF9NUDRFTkNfQVBJX0hfCiAjZGVmaW5lIF9NUDRFTkNfQVBJX0hfCiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2lmbmRlZiBfUFZfVFlQRVNfCiAjZGVmaW5lIF9QVl9UWVBFU18KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVQ2hhcjsKLXR5cGVkZWYgY2hhciBDaGFyOwordHlwZWRlZiB1aW50OF90IFVDaGFyOwordHlwZWRlZiBpbnQ4X3QgQ2hhcjsKIHR5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7CiB0eXBlZGVmIGludCBJbnQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTaG9ydDsKLXR5cGVkZWYgc2hvcnQgU2hvcnQ7Cit0eXBlZGVmIHVpbnQxNl90IFVTaG9ydDsKK3R5cGVkZWYgaW50MTZfdCBTaG9ydDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7CiB0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCmluZGV4IDJkNDQ0ODIuLmRiZDcwZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCkBAIC01MiwxMyArNTIsMTMgQEAKIAogI2lmbmRlZiBfUFZfVFlQRVNfCiAjZGVmaW5lIF9QVl9UWVBFU18KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVQ2hhcjsKLXR5cGVkZWYgY2hhciBDaGFyOwordHlwZWRlZiB1aW50OF90IFVDaGFyOwordHlwZWRlZiBpbnQ4X3QgQ2hhcjsKIHR5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7CiB0eXBlZGVmIGludCBJbnQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTaG9ydDsKLXR5cGVkZWYgc2hvcnQgU2hvcnQ7Ci10eXBlZGVmIHNob3J0IGludCBTSW50OwordHlwZWRlZiB1aW50MTZfdCBVU2hvcnQ7Cit0eXBlZGVmIGludDE2X3QgU2hvcnQ7Cit0eXBlZGVmIGludDE2X3QgU0ludDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7CiB0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogdHlwZWRlZiB2b2lkIFZvaWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcAppbmRleCA1MzE0OWMxLi5lY2MzMjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKQEAgLTM3NywxNSArMzc3LDE1IEBACiAvKiAgSW4vb3V0ICAgOiBOciwgQiwgUnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbnB1dCBhcmd1bWVudCAidmlkZW8iIGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgYnkgY2FsbGVyICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0KIFBWX1NUQVRVUyBSQ19VcGRhdGVCdWZmZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllciwgSW50IG51bV9za2lwKQogewogICAgIHJhdGVDb250cm9sICpyYyAgPSB2aWRlby0+cmNbY3VyckxheWVyXTsKICAgICBNdWx0aVBhc3MgICAqcE1QID0gdmlkZW8tPnBNUFtjdXJyTGF5ZXJdOwogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgcmMgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCkKKyAgICBpZiAocmMgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CiAKICAgICByYy0+VkJWX2Z1bGxuZXNzICAgLT0gKEludCkocmMtPmJpdHJhdGUgLyByYy0+ZnJhbWVyYXRlICogbnVtX3NraXApOyAvL3JjW2N1cnJMYXllcl0tPlJwOwpAQCAtNTI0LDYgKzUyNCw3IEBACiAvKiAgSW4vb3V0ICAgOiByYy0+VCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbnB1dCBhcmd1bWVudCAiaW5wdXQiIGlzIGd1YXJhbnRlZWQgbm9uLW51bGwgYnkgY2FsbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogdm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbih2b2lkICppbnB1dCkKQEAgLTUzNyw3ICs1MzgsNyBAQAogICAgIEludCBkaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCwgcHJldl9jb3VudGVyX2RpZmYsIGN1cnJfY291bnRlcl9kaWZmLCBib3VuZDsKICAgICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgZm9yIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCiAKLSAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCBjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKKyAgICBpZiAoY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8qIHNvbWUgc3R1ZmYgYWJvdXQgZnJhbWUgZHJvcHBpbmcgcmVtYWluZWQgaGVyZSB0byBiZSBkb25lIGJlY2F1c2UgcE1QIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIHVwZGF0ZVJhdGVDb250cm9sKCkqLwpAQCAtNjkzLDYgKzY5NCw3IEBACiAvKiAgSW4vb3V0ICAgOiByYy0+VCBhbmQgcmMtPlFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFJldHVybiAgIDogVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5wdXQgYXJndW1lbnQgImlucHV0IiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyogTWFkIGJhc2VkIHZhcmlhYmxlIGJpdCBhbGxvY2F0aW9uICsgUVAgY2FsY3VsYXRpb24gd2l0aCBhIG5ldyBxdWFkcmF0aWMgbWV0aG9kICovCkBAIC03MDgsNyArNzEwLDcgQEAKICAgICBmbG9hdCBjdXJyX21hZCwgcHJldl9tYWQsIGN1cnJfUkQsIHByZXZfUkQsIGF2ZXJhZ2VfbWFkLCBhdmVyX1FQOwogCiAKLSAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCBjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKKyAgICBpZiAoY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAKaW5kZXggZGIyYzYxYS4uNTU1NGViZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwCkBAIC0xODMsNiArMTgzLDEwIEBACiAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZW5jb2Rlci4KICAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcigmaGFuZGxlLCAmZW5jUGFyYW1zKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyXG4iKTsKKyAgICAgICAgZmNsb3NlKGZwSW5wdXQpOworICAgICAgICBmY2xvc2UoZnBPdXRwdXQpOworICAgICAgICBmcmVlKGlucHV0QnVmKTsKKyAgICAgICAgZnJlZShvdXRwdXRCdWYpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KIApAQCAtMTkwLDYgKzE5NCwxMCBAQAogICAgIGludDMyX3QgaGVhZGVyTGVuZ3RoID0ga091dHB1dEJ1ZmZlclNpemU7CiAgICAgaWYgKCFQVkdldFZvbEhlYWRlcigmaGFuZGxlLCBvdXRwdXRCdWYsICZoZWFkZXJMZW5ndGgsIDApKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCBWT0wgaGVhZGVyXG4iKTsKKyAgICAgICAgZmNsb3NlKGZwSW5wdXQpOworICAgICAgICBmY2xvc2UoZnBPdXRwdXQpOworICAgICAgICBmcmVlKGlucHV0QnVmKTsKKyAgICAgICAgZnJlZShvdXRwdXRCdWYpOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KICAgICBmd3JpdGUob3V0cHV0QnVmLCAxLCBoZWFkZXJMZW5ndGgsIGZwT3V0cHV0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAppbmRleCA5ZmE5YTRjLi5iNjMwNTI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC01OSw5ICs1OSw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLApAQCAtODEsMjQgKzc4LDE1IEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVAzLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwogICAgICAgICAic3JjIiwKICAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMTA2LDIwICs5NCw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X21wM2RlYyJdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTQ0LDkgKzEyMSw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDIzNjQ2ODQuLjgwMDgzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBMTCkgLyBtU2FtcGxpbmdSYXRlOwogCiAgICAgICAgIGlmIChpbkhlYWRlcikgewogICAgICAgICAgICAgQ0hFQ0tfR0UoKGludDMyX3QpaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwCmluZGV4IGU1NWMyZTcuLmQ2NDQyMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwCkBAIC0xMjcsMTMgKzEyNywxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTQsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICBzaS0+bWFpbl9kYXRhX2JlZ2luID0gKHRtcCA8PCAxOCkgPj4gMjM7ICAgIC8qIDkgKi8KLSAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDIzKSA+PiAyNzsgICAgLyogNSAqLworICAgICAgICAgICAgc2ktPnByaXZhdGVfYml0cyAgICA9ICh0bXAgPDwgMjcpID4+IDI3OyAgICAvKiA1ICovCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICB0bXAgPSBnZXRiaXRzX2NyYyhpbnB1dFN0cmVhbSwgMTIsIGNyYywgaW5mby0+ZXJyb3JfcHJvdGVjdGlvbik7CiAgICAgICAgICAgICBzaS0+bWFpbl9kYXRhX2JlZ2luID0gKHRtcCA8PCAyMCkgPj4gMjM7ICAgIC8qIDkgKi8KLSAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDIzKSA+PiAyOTsgICAgLyogMyAqLworICAgICAgICAgICAgc2ktPnByaXZhdGVfYml0cyAgICA9ICh0bXAgPDwgMjkpID4+IDI5OyAgICAvKiAzICovCiAKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcAppbmRleCBlNTc5YmJkLi44ODVhYjA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAKQEAgLTE2MCw2ICsxNjAsNyBAQAogICAgICAgICBjYXNlIDB4MzgwMDAwMDA6CiAgICAgICAgIGNhc2UgMHgzMDAwMDAwMDoKICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IGZiMGRiOGYuLmU4NDk0MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDM1ICsxLDE3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCiAgICAgXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC0zNyw5ICsxOSw1IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAppbmRleCA4YTkzOTlhLi44MmJiOGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTAgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0VlBYLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCkBAIC0zMSw5ICsxNCw1IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggOGQ1ZjNlNy4uMGYyZmYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMCwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMkhEUjEwUGx1cywgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogfTsKIAogU29mdFZQWDo6U29mdFZQWCgKQEAgLTg0LDYgKzg1LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgU29mdFZQWDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgU29mdFZQWDo6aW5pdERlY29kZXIoKSB7CiAgICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CiAgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CkBAIC0xNjcsNyArMTcyLDEyIEBACiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIGJwcCAqIDMpIC8gMjsKLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIFByaXZJbmZvICpwcml2SW5mbyA9IChQcml2SW5mbyAqKW1JbWctPnVzZXJfcHJpdjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gcHJpdkluZm8tPm1UaW1lU3RhbXA7CisgICAgICAgIGlmIChwcml2SW5mby0+bUhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcXVldWVPdXRwdXRGcmFtZUNvbmZpZyhwcml2SW5mby0+bUhkcjEwUGx1c0luZm8pOworICAgICAgICB9CisKICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKQEAgLTI3NSw3ICsyODUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgaWYgKGluSW5mby0+bUZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubUhkcjEwUGx1c0luZm8gPSBkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvLmNsZWFyKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOwpAQCAtMjg1LDcgKzMwMSw3IEBACiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sICZtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLCAwKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVlBYX0NPREVDX09LKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IGI2MmI1MjYuLjBhYThlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQUJ1ZmZlcjsKKwogc3RydWN0IFNvZnRWUFggOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSwKQEAgLTQxLDYgKzQzLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpAQCAtNjAsNyArNjMsMTEgQEAKIAogICAgIHZvaWQgKm1DdHg7CiAgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KLSAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHN0cnVjdCBQcml2SW5mbyB7CisgICAgICAgIE9NWF9USUNLUyBtVGltZVN0YW1wOworICAgICAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzSW5mbzsKKyAgICB9OworICAgIFByaXZJbmZvIG1Qcml2SW5mb1trTnVtQnVmZmVyc107CiAgICAgdWludDhfdCBtVGltZVN0YW1wSWR4OwogICAgIHZweF9pbWFnZV90ICptSW1nOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAppbmRleCAzZDlmZWViLi5jZDY5ZTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsOSArMSw2IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRWUFhFbmNvZGVyLmNwcCIsCkBAIC0xMSwzMyArOCwxNyBAQAogICAgICAgICAiU29mdFZQOUVuY29kZXIuY3BwIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA4RW5jb2Rlci5oCmluZGV4IGI0OTA0YmYuLmM1YzJhYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOEVuY29kZXIuaApAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCiAjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCiAjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgogI2luY2x1ZGUgInZweC92cDhjeC5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmgKaW5kZXggODVkZjY5YS4uMzA4YTlhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5oCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KICNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKICNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCiAjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggZjYyNTdiMS4uZDBjYjA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgIlNvZnRWUDhFbmNvZGVyLmgiCiAjaW5jbHVkZSAiU29mdFZQOUVuY29kZXIuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKQEAgLTQwMCw4ICs0MDEsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpIHsKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC00NDEsNyArNDQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZyhpbmRleCwgX3BhcmFtcywgZnJhbWVDb25maWcpOwogICAgIH0KIH0KIApAQCAtNTU3LDcgKzU1OCw3IEBACiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7Ci0gICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOwpAQCAtNTY2LDE0ICs1NjcsMTQgQEAKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKLSAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOwogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmOgogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKLSAgICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCBkZDg2ZDM2Li43MjA4ZDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQogI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgogI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKICNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKQEAgLTg0LDggKzgyLDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIC8vIE9NWCBjYWxsYmFjayB3aGVuIGJ1ZmZlcnMgYXZhaWxhYmxlCiAgICAgLy8gTm90ZSB0aGF0IGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDMzMThmMi4uNzFhMmEwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTMgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE9wdXMuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlib3B1cyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMzAsOSArMTYsNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCA4MTMwMDRiLi40ZjYxYWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTQzMCw4ICs0MzAsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIDJuZCBhbmQgM3JkIGlucHV0IGJ1ZmZlciBhcmUgZXhwZWN0ZWQgdG8gY29udGFpbgorICAgICAgICAgICAgICAgIC8vICBhbiBpbnQ2NF90IChzZWUgYmVsb3cpLCBzbyBtYWtlIHN1cmUgd2UgZ2V0IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgLy8gIHRoYXQgbXVjaC4gVGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBtdXN0IGNvbnRhaW4gMTkgYnl0ZXMsCisgICAgICAgICAgICAgICAgLy8gIGJ1dCB0aGF0IGlzIGNoZWNrZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1IZWFkZXI7CiAgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOwogICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CkBAIC00NTIsNiArNDYxLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCkBAIC01NzAsNyArNTgyLDcgQEAKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci0+Y2hhbm5lbHM7CiAKICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUFuY2hvclRpbWVVcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMExMKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlOwogCiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCmluZGV4IGM4ZDdkMDAuLmZjYzdhMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKQEAgLTEsMTkgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3Jhd2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRSYXcuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjIsMTYgKzEyLDUgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCmluZGV4IDFhNTI3YjMuLjBlMzE4MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gMTkyICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CkBAIC03OCw3ICs3OCw3IEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gMTkyICogMTAyNDsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCBhOTI2NWNiLi4zZWZiOTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTMgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0Vm9yYmlzLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTMwLDUgKzE2LDQgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCmluZGV4IDg5MTJmOGEuLjc2YTQwMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0zNTcsNyArMzU3LDEwIEBACiAgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXMgPSAwOwogCiAgICAgICAgIGlmIChpbkhlYWRlcikgewotICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMikgeworICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSB2ZXJ5IGZpcnN0IDIgYnVmZmVycyBhcmUgYWx3YXlzIGNvZGVjIGNvbmZpZyAoaW4gdGhpcyBjYXNlIG1TdGF0ZSBpcyBOVUxMKQorICAgICAgICAgICAgLy8gQWZ0ZXIgZmx1c2gsIGhhbmRsZSBDU0QKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA8IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBOVUxMIHx8IChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSkgewogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKQEAgLTM4MCw3ICszODMsMjQgQEAKIAogICAgICAgICAgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgc2l6ZSAtIDcsICZidWYsICZyZWYsICZiaXRzKTsKIAotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHZlcnkgZmlyc3QgZnJhbWUgaXMgaWRlbnRpZmljYXRpb24gaGVhZGVyIC0gb3IgcmVzZXQgaWRlbnRpZmljYXRpb24KKyAgICAgICAgICAgICAgICAvLyBoZWFkZXIgYWZ0ZXIgZmx1c2gsIGJ1dCBhbGxvdyBvbmx5IHNwZWNpZnlpbmcgc2V0dXAgaGVhZGVyIGFmdGVyIGZsdXNoIGlmCisgICAgICAgICAgICAgICAgLy8gaWRlbnRpZmljYXRpb24gaGVhZGVyIHdhcyBhbHJlYWR5IHNldCB1cC4KKyAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG1WaSA9PSBOVUxMIHx8IGRhdGFbMF0gPT0gMSAvKiBpZGVudGlmaWNhdGlvbiBoZWFkZXIgKi8pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgcHJpb3Igc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNsZWFyIG1TdGF0ZSBhcyBpdCBtYXkgcmVmZXIgdG8gdGhlIG9sZCBtVmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19jbGVhcihtVmkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtVmkgPT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mbzsKICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2luZm9faW5pdChtVmkpOwpAQCAtMzkyLDggKzQxMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBwcmlvciBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtU3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwIHx8IG1TdGF0ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC00MDksNiArNDM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKQEAgLTUyNiw3ICs1NTQsNyBAQAogCiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CiAgICAgICAgICAgICBtQW5jaG9yVGltZVVzCi0gICAgICAgICAgICAgICAgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBMTCkgLyBtVmktPnJhdGU7CiAKICAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBudW1GcmFtZXM7CiAKQEAgLTU0OCw2ICs1NzYsNyBAQAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KIAorICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwogICAgICAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKaW5kZXggNzM5MmYxZS4uNTM4NWRiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwCkBAIC0xLDE4ICsxLDEyIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfeGFhY2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0WEFBQy5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLURFTkFCTEVfTVBFR19EX0RSQyIKICAgICBdLAogCkBAIC0yNSwxMiArMTksNiBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnhhYWNkZWMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICBdLAotCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAppbmRleCAwNmIxNWIzLi5kYTg2NzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCkBAIC03OSw3ICs3OSw3IEBACiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtTdXBwb3J0ZWRQcm9maWxlc1tdID0gewogICAgIE9NWF9BVURJT19BQUNPYmplY3RMQywgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLAotICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsIE9NWF9BVURJT19BQUNPYmplY3RYSEUKIH07CiAKIFNvZnRYQUFDOjpTb2Z0WEFBQyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTExMCwxNSArMTEwLDIyIEBACiAKIHsKICAgICBpbml0UG9ydHMoKTsKLSAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCBJQV9OT19FUlJPUik7CiB9CiAKIFNvZnRYQUFDOjp+U29mdFhBQUMoKSB7Ci0gICAgaW50IGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOwotICAgIGlmICgwICE9IGVyckNvZGUpIHsKLSAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOwogICAgIH0KIAorICAgIGVycl9jb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJfY29kZSk7CisgICAgfQogICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKIH0KQEAgLTE2NCwzNiArMTcxLDE2IEBACiAgICAgYWRkUG9ydChkZWYpOwogfQogCi1zdGF0dXNfdCBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0RGVjb2RlcigpIHsKICAgICBpbnQgdWlfZHJjX3ZhbDsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgbG9vcCA9IDA7CiAKICAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOwogICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgewotICAgICAgICBpZiAoTlVMTCA9PSBtWGhlYWFjQ29kZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IG1NcGVnRERyY0hhbmRsZSkgewotICAgICAgICAgICAgQUxPR0UoIk1QRUctRCBEUkMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAobG9vcCA9IDE7IGxvb3AgPCBtTWFsbG9jQ291bnQ7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtsb29wXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAlZFxuIiwgbG9vcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBGYWlsZWQiKTsKLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0pIGZyZWUobU1lbW9yeUFycmF5W2xvb3BdKTsKLSAgICAgICAgfQotICAgICAgICBtTWFsbG9jQ291bnQgPSAwOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRYQUFDRGVjb2RlcigpOworICAgICAgICByZXR1cm4gZXJyX2NvZGU7CiAgICAgfQogCiAgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKQEAgLTI3NCw3ICsyNjEsNyBAQAogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOwogCiAjZW5kaWYKLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0WEFBQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKQEAgLTU0Nyw5ICs1MzQsNiBAQAogICAgIC8qIHNhbXBsZSBjdXJyZW50bHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKLSAgICAgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJYQUFDIGFzc3VtZXMgMiBieXRlcyBwZXIgc2FtcGxlISBtUGNtV2RTeiAlZCIsIG1QY21XZFN6KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKQEAgLTU2OSw4ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKICAgICAgICAgICAgICAgICAvKiBHQSBoZWFkZXIgY29uZmlndXJhdGlvbiBzZW50IHRvIERlY29kZXIhICovCi0gICAgICAgICAgICAgICAgaW50IGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyX2NvZGUsIE5VTEwpOwpAQCAtNjY1LDcgKzY0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBpbkhlYWRlcjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IG1QcmV2VGltZXN0YW1wICsgbU91dHB1dEZyYW1lTGVuZ3RoICogMTAwMDAwMGxsIC8gbVNhbXBGcmVxOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IG1QcmV2VGltZXN0YW1wICsgbU91dHB1dEZyYW1lTGVuZ3RoICogMTAwMDAwMExMIC8gbVNhbXBGcmVxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW5CdWZmZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwpAQCAtNjgyLDggKzY2Niw4IEBACiAgICAgICAgICAgICAvKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZSAgKi8KICAgICAgICAgICAgIC8qIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTg0NSw3ICs4MjksNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdmbHVzaERlY29kZSgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOwogICAgIFVXT1JEMzIgdWlfaW5pdF9kb25lOwogICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKQEAgLTg3MSwxNiArODU1LDEzIEBACiAgICAgICAgICAgICAiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAiCiAgICAgICAgICAgICAiJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCiAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKLSAgICAgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKLSAgICAgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgewotICAgIHJldHVybiAwOworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkcmFpbkRlY29kZXIoKSB7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCiB2b2lkIFNvZnRYQUFDOjpvblJlc2V0KCkgewpAQCAtOTIxLDcgKzkwMiw3IEBACiAgICAgfQogfQogCi1pbnQgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdFhBQUNEZWNvZGVyKCkgewogICAgIExPT1BJRFggaTsKIAogICAgIC8qIEVycm9yIGNvZGUgKi8KQEAgLTkzOSwxMSArOTIwLDExIEBACiAgICAgVVdPUkQzMiB1aV9wcm9jX21lbV90YWJzX3NpemU7CiAgICAgLyogQVBJIHNpemUgKi8KICAgICBVV09SRDMyIHB1aV9hcGlfc2l6ZTsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHI7CiAKICAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKICAgICBtSW5wdXRCdWZmZXIgPSAwOwogICAgIG1PdXRwdXRCdWZmZXIgPSAwOwotICAgIG1NYWxsb2NDb3VudCA9IDA7CiAKICAgICAvKiBQcm9jZXNzIHN0cnVjdCBpbml0aW5nIGVuZCAqLwogICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk1NCwyMCArOTM1LDEzIEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKE5VTEwsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTk3OSwyMyArOTUzLDE2IEBACiAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIG1NcGVnRERyY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CiAKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIGlmIChtTXBlZ0REcmNIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBkcmMgYXBpIHN0cnVjdHVyZSBGYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtZW1zZXQobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0sIDAsIHB1aV9hcGlfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CiAKLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbU1wZWdERHJjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtZW1zZXQobU1wZWdERHJjSGFuZGxlLCAwLCBwdWlfYXBpX3NpemUpOwogCiAgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCiAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwMjEsMjMgKzk4OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KLSAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLAogICAgICAgICAgICAgICB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCi0gICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50IC0gMV0pKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLCBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CiAKICAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULApAQCAtMTA2NiwxNyArMTAyNywxMiBAQAogICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKIAotICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7Ci0gICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwgdWlfc2l6ZSArIHVpX2FsaWdubWVudCk7CiAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgbU1hbGxvY0NvdW50Kys7CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCiAgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKQEAgLTEwOTUsNyArMTA1MSw3IEBACiAgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CiAKQEAgLTExNTQsMTQgKzExMTAsNzYgQEAKIAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRNUEVHREREcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdNUEVHRERyYygpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgaV9lZmZlY3RfdHlwZTsKICAgICBpbnQgaV9sb3VkX25vcm07CiAgICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOwogICAgIHVuc2lnbmVkIGludCBpX3Nicl9tb2RlOwotICAgIGludCBuX21lbXM7CiAgICAgaW50IGk7CisgICAgaW50IHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSA9IDA7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyID0gTlVMTDsKIAogI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCiAgICAgewpAQCAtMTIxMiw4MyArMTIzMCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOwogCisgICAgICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQocHZfYWxsb2NfcHRyLCAwLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKwogICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgTlVMTCk7CiAKICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOwotICAgICAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgICAgICAvKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgZm9yIE1QRUcgRCBEcmMgc28gZmFyICovCisgICAgICAgIGRlSW5pdE1QRUdERERyYygpOwogCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotCi0gICAgICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgICAgICBlcnJfY29kZSA9IGluaXRNUEVHREREcmMoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIGRlSW5pdE1QRUdERERyYygpOworICAgICAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFdPUkQzMiB1aV9zaXplOwotICAgICAgICAgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNJbkJ1Zik7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7Ci0KLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNPdXRCdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotICAgICAgICB9CiAgICAgICAgIC8qIERSQyBidWZmZXJzCiAgICAgICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCiAgICAgICAgICAgICBidWZbMV0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCovCkBAIC0xNDIzLDEwICsxNDAyLDEwIEBACiAgICAgfQogI2VuZGlmCiAKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQotaW50IFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcykgewogICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOwpAQCAtMTUxNiwyNCArMTQ5NSwzMyBAQAogICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKICAgICB9CiAjZW5kaWYKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKICAgICBBTE9HSSgiZGVJbml0WEFBQ0RlY29kZXIiKTsKIAogICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLwogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOUFVUX09WRVIsIDAsIE5VTEwpOwotICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfSU5QVVRfT1ZFUiIpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWFsbG9jQ291bnQ7IGkrKykgewotICAgICAgICBpZiAobU1lbW9yeUFycmF5W2ldKSBmcmVlKG1NZW1vcnlBcnJheVtpXSk7CisgICAgLyogSXJyZXNwZWN0aXZlIG9mIGVycm9yIHJldHVybmVkIGluIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgZm9yICh2b2lkKiBidWYgOiBtTWVtb3J5VmVjKSB7CisgICAgICAgIGZyZWUoYnVmKTsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50ID0gMDsKLQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKICAgICByZXR1cm4gZXJyX2NvZGU7CiB9CiAKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dJKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKIElBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAKQEAgLTE1NDYsMTEgKzE1MzQsMTkgQEAKICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZtTnVtQ2hhbm5lbHMpOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBQQ00gd29yZCBzaXplICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osICZtUGNtV2RTeik7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaIik7CisgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGU6ICVkLCBFeHBlY3RlZCBpcyAyIiwgbVBjbVdkU3opOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAppbmRleCA2MTc2MDgyLi5hNjJhNzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKQEAgLTMzLDggKzMzLDYgQEAKICNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKICNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCiAKLSNkZWZpbmUgTUFYX01FTV9BTExPQ1MgMTAwCi0KIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZPSUQgcHZfdmFsdWUpOwogZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKQEAgLTgwLDE4ICs3OCwxOSBAQAogICAgIGVudW0geyBOT05FLCBBV0FJVElOR19ESVNBQkxFRCwgQVdBSVRJTkdfRU5BQkxFRCB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CiAKICAgICB2b2lkIGluaXRQb3J0cygpOwotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKLSAgICBpbnQgZHJhaW5EZWNvZGVyKCk7Ci0gICAgaW50IGluaXRYQUFDRGVjb2RlcigpOwotICAgIGludCBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkcmFpbkRlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsIGludDMyX3QqIG91dEJ5dGVzKTsKIAotICAgIGludCBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOwotICAgIGludCBjb25maWdNUEVHRERyYygpOwotICAgIGludCBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7Ci0KLSAgICBpbnQgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKICAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKICAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsIGludDMyX3QgZHJjUmVmTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbgpAQCAtMTIwLDkgKzExOSw4IEBACiAgICAgaW50OF90KiBtRHJjT3V0QnVmOwogICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKICAgICBpbnQzMl90IG1EUkNGbGFnOwotCi0gICAgdm9pZCogbU1lbW9yeUFycmF5W01BWF9NRU1fQUxMT0NTXTsKLSAgICBpbnQzMl90IG1NYWxsb2NDb3VudDsKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFhBQUMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQuYnAKaW5kZXggMTZlOWRlZC4uYmE1NzQ5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQuYnAKQEAgLTI0LDggKzI0LDUgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCAwNWY0MTA0Li5kNjg1MzIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTE2LDE0ICsxNiwxOCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNvbG9yQ29udmVydGVyIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgorI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2FyZ2IuaCIKKyNpbmNsdWRlICJsaWJ5dXYvcGxhbmFyX2Z1bmN0aW9ucy5oIgogI2luY2x1ZGUgImxpYnl1di92aWRlb19jb21tb24uaCIKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC00NCwxMCArNDgsMjggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgYm9vbCBpc1JHQihPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCkgeworICAgIHJldHVybiBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKK30KKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNCdDcwOSgpIHsKKyAgICByZXR1cm4gKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNzA5KTsKK30KKworCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0pwZWcoKSB7CisgICAgcmV0dXJuICgobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1KQorICAgICAgICAgICAgfHwgKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSkpCisgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCk7Cit9CisKIENvbG9yQ29udmVydGVyOjpDb2xvckNvbnZlcnRlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZnJvbSwgT01YX0NPTE9SX0ZPUk1BVFRZUEUgdG8pCiAgICAgOiBtU3JjRm9ybWF0KGZyb20pLAogICAgICAgbURzdEZvcm1hdCh0byksCisgICAgICBtU3JjQ29sb3JTcGFjZSh7MCwgMCwgMH0pLAogICAgICAgbUNsaXAoTlVMTCkgewogfQogCkBAIC02Miw3ICs4NCw3IEBACiAgICAgICAgICAgICBpZiAobURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0WTQxMCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbC10aHJ1CisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CiAgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKQEAgLTcwLDI0ICs5Miw0NiBAQAogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7CisjZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OworI2VuZGlmCisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzRHN0UkdCKCkgY29uc3QgewotICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAotICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICByZXR1cm4gaXNSR0IobURzdEZvcm1hdCk7CiB9CiAKK3ZvaWQgQ29sb3JDb252ZXJ0ZXI6OnNldFNyY0NvbG9yU3BhY2UoCisgICAgICAgIHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpIHsKKyAgICBpZiAoaXNSR0IobVNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR1coIkNhbid0IHNldCBjb2xvciBzcGFjZSBvbiBSR0Igc291cmNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNyY0NvbG9yU3BhY2UubVN0YW5kYXJkID0gc3RhbmRhcmQ7CisgICAgbVNyY0NvbG9yU3BhY2UubVJhbmdlID0gcmFuZ2U7CisgICAgbVNyY0NvbG9yU3BhY2UubVRyYW5zZmVyID0gdHJhbnNmZXI7Cit9CisKKy8qCisgKiBJZiBzdHJpZGUgaXMgbm9uLXplcm8sIGNsaWVudCdzIHN0cmlkZSB3aWxsIGJlIHVzZWQuIEZvciBwbGFuYXIKKyAqIG9yIHNlbWktcGxhbmFyIFlVViBmb3JtYXRzLCBzdHJpZGUgbXVzdCBiZSBldmVuIG51bWJlcnMuCisgKiBJZiBzdHJpZGUgaXMgemVybywgaXQgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoIGFuZCBicHAKKyAqIG9mIHRoZSBmb3JtYXQsIGFzc3VtaW5nIG5vIHBhZGRpbmcgb24gdGhlIHJpZ2h0IGVkZ2UuCisgKi8KIENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OkJpdG1hcFBhcmFtcygKICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCkKQEAgLTEwMSw2ICsxNDUsOCBAQAogICAgICAgbUNyb3BCb3R0b20oY3JvcEJvdHRvbSkgewogICAgIHN3aXRjaChtQ29sb3JGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIG1CcHAgPSAyOwogICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CkBAIC0xMTIsMTMgKzE1OCw3IEBACiAgICAgICAgIG1TdHJpZGUgPSA0ICogbVdpZHRoOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgotICAgICAgICBtQnBwID0gMjsKLSAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgotICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgpAQCAtMTMyLDYgKzE3MiwxMCBAQAogICAgICAgICBtU3RyaWRlID0gbVdpZHRoOwogICAgICAgICBicmVhazsKICAgICB9CisgICAgLy8gdXNlIGNsaWVudCdzIHN0cmlkZSBpZiBpdCdzIHNwZWNpZmllZC4KKyAgICBpZiAoc3RyaWRlICE9IDApIHsKKyAgICAgICAgbVN0cmlkZSA9IHN0cmlkZTsKKyAgICB9CiB9CiAKIHNpemVfdCBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpjcm9wV2lkdGgoKSBjb25zdCB7CkBAIC0xNDQsMjEgKzE4OCwyMSBAQAogCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydCgKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LAorICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgIHNpemVfdCBzcmNDcm9wUmlnaHQsIHNpemVfdCBzcmNDcm9wQm90dG9tLAogICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwgc2l6ZV90IGRzdFN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pIHsKICAgICBCaXRtYXBQYXJhbXMgc3JjKAogICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KHNyY0JpdHMpLAotICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20sIG1TcmNGb3JtYXQpOwogCiAgICAgQml0bWFwUGFyYW1zIGRzdCgKICAgICAgICAgICAgIGRzdEJpdHMsCi0gICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LAorICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwgZHN0U3RyaWRlLAogICAgICAgICAgICAgZHN0Q3JvcExlZnQsIGRzdENyb3BUb3AsIGRzdENyb3BSaWdodCwgZHN0Q3JvcEJvdHRvbSwgbURzdEZvcm1hdCk7CiAKICAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKQEAgLTIwMCw3ICsyNDQsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgVVNFX0xJQllVVgorICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoc3JjLCBkc3QpOworI2Vsc2UKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKHNyYywgZHN0KTsKKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTI3NSw2ICszMjMsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKyNkZWZpbmUgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCByZ2IpIGludCAoKmZ1bmMpKCAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgY29uc3QgdWludDgqLCBpbnQsICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCB1aW50OCosIGludCwgaW50LCBpbnQpICAgICAgIFwKKyAgICAgICAgPSBtU3JjQ29sb3JTcGFjZS5pc0J0NzA5KCkgPyBsaWJ5dXY6Okg0MjBUbyMjcmdiIFwKKyAgICAgICAgOiBtU3JjQ29sb3JTcGFjZS5pc0pwZWcoKSA/IGxpYnl1djo6SjQyMFRvIyNyZ2IgIFwKKyAgICAgICAgOiBsaWJ5dXY6Okk0MjBUbyMjcmdiCisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyVXNlTGliWVVWKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKQEAgLTI5MiwxOSArMzQ3LDI4IEBACiAKICAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKLSAgICAgICAgbGlieXV2OjpJNDIwVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBSR0I1NjUpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FCR1IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBQkdSKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQVJHQik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0zMTMsNiArMzc3LDQxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cworICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tQ3JvcFRvcCAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworCisgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIGxpYnl1djo6TlYxMlRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6CisgICAgICAgIGxpYnl1djo6TlYxMlRvQVJHQihzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb0FCR1Ioc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgfQorCisgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6ZnVuY3Rpb248dm9pZCAodm9pZCAqLCB2b2lkICosIHZvaWQgKiwgc2l6ZV90LAogICAgICAgICAgICAgICAgICAgICBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKik+CiBnZXRSZWFkRnJvbVNyYyhPTVhfQ09MT1JfRk9STUFUVFlQRSBzcmNGb3JtYXQpIHsKQEAgLTc5MiwxNSArODkxLDE1IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKikKKyAgICAgICAgICAgIGRzdC5tQml0cyArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogc3JjLm1IZWlnaHQKLSAgICAgICAgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUhlaWdodCAqIHNyYy5tU3RyaWRlICsKKyAgICAgICAgKHNyYy5tQ3JvcFRvcCAvIDIpICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgewpAQCAtODQyLDEzICs5NDEsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwogCiAgICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0X3B0ciArPSBkc3QubVdpZHRoOworICAgICAgICBkc3RfcHRyID0gKHVpbnQxNl90KikoKHVpbnQ4X3QqKWRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDY1N2EwNWIuLjM1OWRmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKICAgICAgIG1XaWR0aCgwKSwKICAgICAgIG1IZWlnaHQoMCksCisgICAgICBtU3RyaWRlKDApLAogICAgICAgbUNyb3BMZWZ0KDApLAogICAgICAgbUNyb3BUb3AoMCksCiAgICAgICBtQ3JvcFJpZ2h0KDApLApAQCAtNjcsOSArNjgsMTAgQEAKICAgICBpbnQzMl90IGNvbG9yRm9ybWF0TmV3OwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXROZXcpKTsKIAotICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldzsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJndpZHRoTmV3KSk7CisgICAgaW50MzJfdCB3aWR0aE5ldywgaGVpZ2h0TmV3LCBzdHJpZGVOZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoTmV3KSk7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZoZWlnaHROZXcpKTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZU5ldykpOwogCiAgICAgaW50MzJfdCBjcm9wTGVmdE5ldywgY3JvcFRvcE5ldywgY3JvcFJpZ2h0TmV3LCBjcm9wQm90dG9tTmV3OwogICAgIGlmICghZm9ybWF0LT5maW5kUmVjdCgKQEAgLTEwNiw2ICsxMDgsNyBAQAogICAgIG1Db2xvckZvcm1hdCA9IHN0YXRpY19jYXN0PE9NWF9DT0xPUl9GT1JNQVRUWVBFPihjb2xvckZvcm1hdE5ldyk7CiAgICAgbVdpZHRoID0gd2lkdGhOZXc7CiAgICAgbUhlaWdodCA9IGhlaWdodE5ldzsKKyAgICBtU3RyaWRlID0gc3RyaWRlTmV3OwogICAgIG1Dcm9wTGVmdCA9IGNyb3BMZWZ0TmV3OwogICAgIG1Dcm9wVG9wID0gY3JvcFRvcE5ldzsKICAgICBtQ3JvcFJpZ2h0ID0gY3JvcFJpZ2h0TmV3OwpAQCAtMjc2LDIwICsyNzksMTUgQEAKICAgICBpZiAobUNvbnZlcnRlcikgewogICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAogICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZSwKICAgICAgICAgICAgICAgICBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAwLCAwLCBtQ3JvcFdpZHRoIC0gMSwgbUNyb3BIZWlnaHQgLSAxKTsKICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOwotCi0gICAgICAgIHNyY195ICs9bUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKLSAgICAgICAgc3JjX3YgKz0obUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKS8yOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zMDUsNyArMzAzLDcgQEAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3ksIHNyY195LCBtQ3JvcFdpZHRoKTsKIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKQEAgLTMxMywxOSArMzExLDE1IEBACiAgICAgICAgICAgICBtZW1jcHkoZHN0X3UsIHNyY191LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3YsIHNyY192LCAobUNyb3BXaWR0aCArIDEpIC8gMik7CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgewotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3kgPSAoY29uc3QgdWludDE2X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3UgPSAoY29uc3QgdWludDE2X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPSBtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOwotICAgICAgICBzcmNfdiArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0ICogMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAogICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwogICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CkBAIC0zNDAsMjEgKzMzNCwyMSBAQAogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtQ3JvcFdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KShzcmNfeVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3kpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOwogICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IChtQ3JvcFdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KShzcmNfdVt4XSA+PiAyKTsKLSAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KShzcmNfdlt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3UpW3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdilbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNmI0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2IEBACitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJtZWRpYXN3Y29kZWMueG1sIiwKKyAgICBzcmM6ICJtZWRpYV9jb2RlY3Nfc3cueG1sIiwKKyAgICBmaWxlbmFtZTogIm1lZGlhX2NvZGVjcy54bWwiLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCmluZGV4IDYzMjA4OGEuLjg4OTlhZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbApAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC0xOTIwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKaW5kZXggMGI1NTRhMi4uNTA5ZjdhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCkBAIC0xNyw1MSArMTcsNjEgQEAKIDxJbmNsdWRlZD4KICAgICA8RGVjb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXAzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXAzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtMzIwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZGVjb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNzM1MCw4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC00ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIzMjAwMC01MDAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjAwMC01MTAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vcmF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtMTkyMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmZsYWMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CkBAIC02OSwyOSArNzksNDAgQEAKICAgICA8L0RlY29kZXJzPgogICAgIDxFbmNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPCEtLSBhbHNvIG1heSBzdXBwb3J0IDY0MDAwLCA4ODIwMCAgYW5kIDk2MDAwIEh6IC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmVuY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJ3Yi5lbmNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmZsYWMuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5vcHVzLmVuY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDEyMDAwLDE2MDAwLDI0MDAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI1MDAtNTEyMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTEwIiAgZGVmYXVsdD0iNSIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0VuY29kZXJzPgogPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwYjA5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdHYueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAwZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcGVnMiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnMi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbEhMIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAppbmRleCBhZGI0NWIzLi4wNDA0MWViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKQEAgLTE3LDYgKzE3LDcgQEAKIDxJbmNsdWRlZD4KICAgICA8RGVjb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTI2LDYgKzI3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMzAsIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUKICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUlTV1YyIDogTGV2ZWwzMCwgUHJvZmlsZUlTV1YyIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgpAQCAtMzQsNiArMzYsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVIaWdoIDogTGV2ZWw1MiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDgweDQwODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtNDQsNiArNDcsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA5Nng0MDk2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTU0LDYgKzU4LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC02Myw2ICs2OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNzEsMTYgKzc3LDI3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdjAxIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49Ijk2eDk2IiBtYXg9IjE5MjB4MTA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjI0IiBtYXg9IjIwNzM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTYwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0RlY29kZXJzPgogCiAgICAgPEVuY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTc2eDE0NCIgbWF4PSIxNzZ4MTQ0IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC05MCw3ICsxMDcsMjEgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNTEyeDUxMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNDA5NiIgLz4gPCEtLSBtYXggNTEyeDUxMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTIyODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTEyMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0icXVhbGl0eSIgcmFuZ2U9IjAtMTAwIiAgZGVmYXVsdD0iODAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUixDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTk5LDYgKzEzMCw3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDguZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtMTA5LDYgKzE0MSw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkM2YxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbApAQCAtMCwwICsxLDMyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxNZWRpYUNvZGVjcz4KKyAgICA8U2V0dGluZ3M+CisgICAgICAgIDwhLS0gZGlzYWJsZSBUViBhbmQgdGVsZXBob255IGRvbWFpbnMgYnkgZGVmYXVsdC4gVGhlc2UgbXVzdCBiZSBvcHRlZCBpbiBieSBPRU1zIC0tPgorICAgICAgICA8RG9tYWluIG5hbWU9InRlbGVwaG9ueSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxEb21haW4gbmFtZT0idHYiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgPC9TZXR0aW5ncz4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXAzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXAzLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtMzIwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZGVjb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNzM1MCw4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL2c3MTEtbWxhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC00ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIzMjAwMC01MDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjAwMC01MTAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vcmF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmZsYWMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIiBkb21haW49InRlbGVwaG9ueSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5nc20uZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMTMwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlU2ltcGxlIDogTGV2ZWwzIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEyLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMzAsIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUKKyAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUlTV1YyIDogTGV2ZWwzMCwgUHJvZmlsZUlTV1YyIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiIHZhcmlhbnQ9InNsb3ctY3B1LCFzbG93LWNwdSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9IiFzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwODB4NDA4MCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zMjc2OCIgLz4gPCEtLSBtYXggNDA5NngyMDQ4IGVxdWl2YWxlbnQgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xOTY2MDgwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00ODAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVIaWdoIDogTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDkxNTIwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA5Nng0MDk2IiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTk2NjA4IiAvPiA8IS0tIG1heCA0MDk2eDMwNzIgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNjU1MzYiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00OTE1MjAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTUwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4IiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxOTIiIC8+IDwhLS0gbWF4IDIwNDh4MTAyNCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwMDAwMDAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+IDwhLS0gbWF4IDEyODB4NzIwIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTA4MDAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS01MDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdjEuZGVjb2RlciIgdHlwZT0idmlkZW8vYXYwMSIgdmFyaWFudD0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxOTIweDEwODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTIwNzM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcGVnMiIgZG9tYWluPSJ0diI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnMi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbEhMIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDwhLS0gYWxzbyBtYXkgc3VwcG9ydCA2NDAwMCwgODgyMDAgIGFuZCA5NjAwMCBIeiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMjAwMCwxNjAwMCwyNDAwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNTAwLTUxMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNzZ4MTQ0IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTI4MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUNvcmUgOiBMZXZlbDIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxNzZ4MTQ0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEyLTE0ODUiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQxIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE5MiIgLz4gPCEtLSBtYXggMjA0OHgxMDI0IC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ1NzYwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxODA4eDE4MDgiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwzIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYyMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQwNTAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iaW50cmEtcmVmcmVzaCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4IiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9IiFzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CisgICAgICAgICAgICAgICAgPCEtLSAyMDE2IGRldmljZXMgY2FuIGVuY29kZSBhdCBhYm91dCAxMGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0ic2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4gPCEtLSBtYXggMTI4MHg3MjAgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2hldmMiIHZhcmlhbnQ9IiFzbG93LWNwdSI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI1MTJ4NTEyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iOHg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS00MDk2IiAvPiA8IS0tIG1heCA1MTJ4NTEyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMjI4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iZnJhbWUtcmF0ZSIgcmFuZ2U9IjEtMTIwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTEwIiAgZGVmYXVsdD0iMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJxdWFsaXR5IiByYW5nZT0iMC0xMDAiICBkZWZhdWx0PSI4MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSLENRIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA5LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDkiIHZhcmlhbnQ9IiFzbG93LWNwdSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgOGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvTWVkaWFDb2RlY3M+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2V4cG9ydHMubGRzCmluZGV4IDU5ZGZjNDkuLmFhYmMyMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2V4cG9ydHMubGRzCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2V4cG9ydHMubGRzCkBAIC05LDUxICs5LDUxIEBACiAgICAgICAgIF9aTjdhbmRyb2lkMTZTb2Z0d2FyZVJlbmRlcmVyKjsKICAgICAgICAgQUJHUlRvQVJHQjsKICAgICAgICAgQUJHUlRvSTQyMDsKLSAgICAgICAgQUJHUlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgQUJHUlRvVVZSb3dfQzsKLSAgICAgICAgQUJHUlRvVVZSb3dfTkVPTjsKLSAgICAgICAgQUJHUlRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQUJHUlRvVVZSb3dfTkVPTio7CisgICAgICAgIEFCR1JUb1lSb3dfQW55X05FT04qOwogICAgICAgICBBQkdSVG9ZUm93X0M7Ci0gICAgICAgIEFCR1JUb1lSb3dfTkVPTjsKKyAgICAgICAgQUJHUlRvWVJvd19ORU9OKjsKICAgICAgICAgQW5kcm9pZDQyMFRvSTQyMDsKICAgICAgICAgQVJHQjE1NTVUb0FSR0I7Ci0gICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBBUkdCMTU1NVRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X0M7Ci0gICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X05FT047CisgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X05FT04qOwogICAgICAgICBBUkdCMTU1NVRvSTQyMDsKLSAgICAgICAgQVJHQjE1NTVUb1VWUm93X0FueV9ORU9OOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCMTU1NVRvVVZSb3dfQzsKLSAgICAgICAgQVJHQjE1NTVUb1VWUm93X05FT047Ci0gICAgICAgIEFSR0IxNTU1VG9ZUm93X0FueV9ORU9OOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfTkVPTio7CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQjE1NTVUb1lSb3dfQzsKLSAgICAgICAgQVJHQjE1NTVUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb1lSb3dfTkVPTio7CiAgICAgICAgIEFSR0I0NDQ0VG9BUkdCOwotICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19DOwotICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19ORU9OOworICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgQVJHQjQ0NDRUb0k0MjA7Ci0gICAgICAgIEFSR0I0NDQ0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQjQ0NDRUb1VWUm93X0M7Ci0gICAgICAgIEFSR0I0NDQ0VG9VVlJvd19ORU9OOwotICAgICAgICBBUkdCNDQ0NFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1VWUm93X05FT04qOworICAgICAgICBBUkdCNDQ0NFRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0I0NDQ0VG9ZUm93X0M7Ci0gICAgICAgIEFSR0I0NDQ0VG9ZUm93X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9ZUm93X05FT04qOwogICAgICAgICBBUkdCQWRkOwotICAgICAgICBBUkdCQWRkUm93X0FueV9ORU9OOworICAgICAgICBBUkdCQWRkUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQkFkZFJvd19DOwotICAgICAgICBBUkdCQWRkUm93X05FT047CisgICAgICAgIEFSR0JBZGRSb3dfTkVPTio7CiAgICAgICAgIEFSR0JBZmZpbmVSb3dfQzsKICAgICAgICAgQVJHQkF0dGVudWF0ZTsKLSAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JBdHRlbnVhdGVSb3dfQzsKLSAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19ORU9OOworICAgICAgICBBUkdCQXR0ZW51YXRlUm93X05FT04qOwogICAgICAgICBBUkdCQmxlbmQ7CiAgICAgICAgIEFSR0JCbGVuZFJvd19DOwotICAgICAgICBBUkdCQmxlbmRSb3dfTkVPTjsKKyAgICAgICAgQVJHQkJsZW5kUm93X05FT04qOwogICAgICAgICBBUkdCQmx1cjsKICAgICAgICAgQVJHQkNvbG9yTWF0cml4OwogICAgICAgICBBUkdCQ29sb3JNYXRyaXhSb3dfQzsKLSAgICAgICAgQVJHQkNvbG9yTWF0cml4Um93X05FT047CisgICAgICAgIEFSR0JDb2xvck1hdHJpeFJvd19ORU9OKjsKICAgICAgICAgQVJHQkNvbG9yVGFibGU7CiAgICAgICAgIEFSR0JDb2xvclRhYmxlUm93X0M7CiAgICAgICAgIEFSR0JDb21wdXRlQ3VtdWxhdGl2ZVN1bTsKQEAgLTYzLDk3ICs2Myw5NyBAQAogICAgICAgICBBUkdCQ29weVlUb0FscGhhOwogICAgICAgICBBUkdCQ29weVlUb0FscGhhUm93X0M7CiAgICAgICAgIEFSR0JFeHRyYWN0QWxwaGE7Ci0gICAgICAgIEFSR0JFeHRyYWN0QWxwaGFSb3dfQW55X05FT047CisgICAgICAgIEFSR0JFeHRyYWN0QWxwaGFSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X0M7Ci0gICAgICAgIEFSR0JFeHRyYWN0QWxwaGFSb3dfTkVPTjsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19ORU9OKjsKICAgICAgICAgQVJHQkdyYXk7CiAgICAgICAgIEFSR0JHcmF5Um93X0M7Ci0gICAgICAgIEFSR0JHcmF5Um93X05FT047CisgICAgICAgIEFSR0JHcmF5Um93X05FT04qOwogICAgICAgICBBUkdCR3JheVRvOwogICAgICAgICBBUkdCSW50ZXJwb2xhdGU7CiAgICAgICAgIEFSR0JMdW1hQ29sb3JUYWJsZTsKICAgICAgICAgQVJHQkx1bWFDb2xvclRhYmxlUm93X0M7CiAgICAgICAgIEFSR0JNaXJyb3I7Ci0gICAgICAgIEFSR0JNaXJyb3JSb3dfQW55X05FT047CisgICAgICAgIEFSR0JNaXJyb3JSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCTWlycm9yUm93X0M7Ci0gICAgICAgIEFSR0JNaXJyb3JSb3dfTkVPTjsKKyAgICAgICAgQVJHQk1pcnJvclJvd19ORU9OKjsKICAgICAgICAgQVJHQk11bHRpcGx5OwotICAgICAgICBBUkdCTXVsdGlwbHlSb3dfQW55X05FT047CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JNdWx0aXBseVJvd19DOwotICAgICAgICBBUkdCTXVsdGlwbHlSb3dfTkVPTjsKKyAgICAgICAgQVJHQk11bHRpcGx5Um93X05FT04qOwogICAgICAgICBBUkdCUG9seW5vbWlhbDsKICAgICAgICAgQVJHQlBvbHlub21pYWxSb3dfQzsKICAgICAgICAgQVJHQlF1YW50aXplOwogICAgICAgICBBUkdCUXVhbnRpemVSb3dfQzsKLSAgICAgICAgQVJHQlF1YW50aXplUm93X05FT047CisgICAgICAgIEFSR0JRdWFudGl6ZVJvd19ORU9OKjsKICAgICAgICAgQVJHQlJlY3Q7CiAgICAgICAgIEFSR0JTZXBpYTsKICAgICAgICAgQVJHQlNlcGlhUm93X0M7Ci0gICAgICAgIEFSR0JTZXBpYVJvd19ORU9OOwotICAgICAgICBBUkdCU2V0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCU2VwaWFSb3dfTkVPTio7CisgICAgICAgIEFSR0JTZXRSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCU2V0Um93X0M7Ci0gICAgICAgIEFSR0JTZXRSb3dfTkVPTjsKKyAgICAgICAgQVJHQlNldFJvd19ORU9OKjsKICAgICAgICAgQVJHQlNoYWRlOwogICAgICAgICBBUkdCU2hhZGVSb3dfQzsKLSAgICAgICAgQVJHQlNoYWRlUm93X05FT047CisgICAgICAgIEFSR0JTaGFkZVJvd19ORU9OKjsKICAgICAgICAgQVJHQlNodWZmbGU7Ci0gICAgICAgIEFSR0JTaHVmZmxlUm93X0FueV9ORU9OOworICAgICAgICBBUkdCU2h1ZmZsZVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JTaHVmZmxlUm93X0M7Ci0gICAgICAgIEFSR0JTaHVmZmxlUm93X05FT047CisgICAgICAgIEFSR0JTaHVmZmxlUm93X05FT04qOwogICAgICAgICBBUkdCU29iZWw7CiAgICAgICAgIEFSR0JTb2JlbFRvUGxhbmU7CiAgICAgICAgIEFSR0JTb2JlbFhZOwogICAgICAgICBBUkdCU3VidHJhY3Q7Ci0gICAgICAgIEFSR0JTdWJ0cmFjdFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlN1YnRyYWN0Um93X0M7Ci0gICAgICAgIEFSR0JTdWJ0cmFjdFJvd19ORU9OOworICAgICAgICBBUkdCU3VidHJhY3RSb3dfTkVPTio7CiAgICAgICAgIEFSR0JUb0FCR1I7Ci0gICAgICAgIEFSR0JUb0FSR0IxNTU1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb0FSR0IxNTU1Um93X0M7Ci0gICAgICAgIEFSR0JUb0FSR0IxNTU1Um93X05FT047Ci0gICAgICAgIEFSR0JUb0FSR0I0NDQ0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19ORU9OKjsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19DOwotICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19ORU9OOworICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19ORU9OKjsKICAgICAgICAgQVJHQlRvQkdSQTsKICAgICAgICAgQVJHQlRvSTQyMDsKLSAgICAgICAgQVJHQlRvUkFXUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SQVdSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9SQVdSb3dfQzsKLSAgICAgICAgQVJHQlRvUkFXUm93X05FT047Ci0gICAgICAgIEFSR0JUb1JHQjI0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SQVdSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1JHQjI0Um93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvUkdCMjRSb3dfQzsKLSAgICAgICAgQVJHQlRvUkdCMjRSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvUkdCNTY1RGl0aGVyUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0IyNFJvd19ORU9OKjsKKyAgICAgICAgQVJHQlRvUkdCNTY1RGl0aGVyUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvUkdCNTY1RGl0aGVyUm93X0M7Ci0gICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19ORU9OOwotICAgICAgICBBUkdCVG9SR0I1NjVSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19ORU9OKjsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvUkdCNTY1Um93X0M7Ci0gICAgICAgIEFSR0JUb1JHQjU2NVJvd19ORU9OOwotICAgICAgICBBUkdCVG9VVjQ0NFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X05FT04qOworICAgICAgICBBUkdCVG9VVjQ0NFJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1VWNDQ0Um93X0M7Ci0gICAgICAgIEFSR0JUb1VWNDQ0Um93X05FT047Ci0gICAgICAgIEFSR0JUb1VWSlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvVVY0NDRSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1VWSlJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1VWSlJvd19DOwotICAgICAgICBBUkdCVG9VVkpSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWSlJvd19ORU9OKjsKKyAgICAgICAgQVJHQlRvVVZSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9VVlJvd19DOwotICAgICAgICBBUkdCVG9VVlJvd19ORU9OOwotICAgICAgICBBUkdCVG9ZSlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvVVZSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1lKUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvWUpSb3dfQzsKLSAgICAgICAgQVJHQlRvWUpSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvWUpSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1lSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9ZUm93X0M7Ci0gICAgICAgIEFSR0JUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvWVJvd19ORU9OKjsKICAgICAgICAgQVJHQlVuYXR0ZW51YXRlOwogICAgICAgICBBUkdCVW5hdHRlbnVhdGVSb3dfQzsKLSAgICAgICAgQXJtQ3B1Q2FwczsKKyAgICAgICAgQXJtQ3B1Q2Fwcyo7CiAgICAgICAgIEJHUkFUb0FSR0I7CiAgICAgICAgIEJHUkFUb0k0MjA7Ci0gICAgICAgIEJHUkFUb1VWUm93X0FueV9ORU9OOworICAgICAgICBCR1JBVG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIEJHUkFUb1VWUm93X0M7Ci0gICAgICAgIEJHUkFUb1VWUm93X05FT047Ci0gICAgICAgIEJHUkFUb1lSb3dfQW55X05FT047CisgICAgICAgIEJHUkFUb1VWUm93X05FT04qOworICAgICAgICBCR1JBVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgQkdSQVRvWVJvd19DOwotICAgICAgICBCR1JBVG9ZUm93X05FT047CisgICAgICAgIEJHUkFUb1lSb3dfTkVPTio7CiAgICAgICAgIEJsZW5kUGxhbmU7CiAgICAgICAgIEJsZW5kUGxhbmVSb3dfQzsKICAgICAgICAgQ2Fub25pY2FsRm91ckNDOwpAQCAtMTYyLDExICsxNjIsMTEgQEAKICAgICAgICAgQ29weVBsYW5lOwogICAgICAgICBDb3B5UGxhbmVfMTY7CiAgICAgICAgIENvcHlSb3dfMTZfQzsKLSAgICAgICAgQ29weVJvd19BbnlfTkVPTjsKKyAgICAgICAgQ29weVJvd19BbnlfTkVPTio7CiAgICAgICAgIENvcHlSb3dfQzsKLSAgICAgICAgQ29weVJvd19ORU9OOwotICAgICAgICBDcHVJZDsKLSAgICAgICAgY3B1X2luZm9fOworICAgICAgICBDb3B5Um93X05FT04qOworICAgICAgICBDcHVJZCo7CisgICAgICAgIGNwdV9pbmZvXyo7CiAgICAgICAgIEN1bXVsYXRpdmVTdW1Ub0F2ZXJhZ2VSb3dfQzsKICAgICAgICAgRml4ZWREaXYxX0M7CiAgICAgICAgIEZpeGVkRGl2X0M7CkBAIC0xNzYsMTggKzE3NiwxOCBAQAogICAgICAgICBINDIwVG9BUkdCOwogICAgICAgICBINDIyVG9BQkdSOwogICAgICAgICBINDIyVG9BUkdCOwotICAgICAgICBIYWxmRmxvYXQxUm93X0FueV9ORU9OOwotICAgICAgICBIYWxmRmxvYXQxUm93X05FT047CisgICAgICAgIEhhbGZGbG9hdDFSb3dfQW55X05FT04qOworICAgICAgICBIYWxmRmxvYXQxUm93X05FT04qOwogICAgICAgICBIYWxmRmxvYXRQbGFuZTsKLSAgICAgICAgSGFsZkZsb2F0Um93X0FueV9ORU9OOworICAgICAgICBIYWxmRmxvYXRSb3dfQW55X05FT04qOwogICAgICAgICBIYWxmRmxvYXRSb3dfQzsKLSAgICAgICAgSGFsZkZsb2F0Um93X05FT047CisgICAgICAgIEhhbGZGbG9hdFJvd19ORU9OKjsKICAgICAgICAgSTQwMENvcHk7CiAgICAgICAgIEk0MDBNaXJyb3I7CiAgICAgICAgIEk0MDBUb0FSR0I7Ci0gICAgICAgIEk0MDBUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEk0MDBUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBJNDAwVG9BUkdCUm93X0M7Ci0gICAgICAgIEk0MDBUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQwMFRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgSTQwMFRvSTQwMDsKICAgICAgICAgSTQwMFRvSTQyMDsKICAgICAgICAgSTQyMEFscGhhVG9BQkdSOwpAQCAtMjE2LDU5ICsyMTYsNTkgQEAKICAgICAgICAgSTQyMFRvUkdCQTsKICAgICAgICAgSTQyMFRvVVlWWTsKICAgICAgICAgSTQyMFRvWVVZMjsKLSAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDIyQWxwaGFUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyQWxwaGFUb0FSR0JSb3dfQzsKLSAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X05FT047CisgICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgSTQyMkNvcHk7CiAgICAgICAgIEk0MjJUb0FCR1I7CiAgICAgICAgIEk0MjJUb0FSR0I7Ci0gICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCMTU1NVJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X0M7Ci0gICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X05FT047Ci0gICAgICAgIEk0MjJUb0FSR0I0NDQ0Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCMTU1NVJvd19ORU9OKjsKKyAgICAgICAgSTQyMlRvQVJHQjQ0NDRSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19DOwotICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19ORU9OOwotICAgICAgICBJNDIyVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19ORU9OKjsKKyAgICAgICAgSTQyMlRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0MjJUb0FSR0JSb3dfQzsKLSAgICAgICAgSTQyMlRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDIyVG9BUkdCUm93X05FT04qOwogICAgICAgICBJNDIyVG9CR1JBOwogICAgICAgICBJNDIyVG9JNDIwOwotICAgICAgICBJNDIyVG9SR0IyNFJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvUkdCMjRSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9SR0IyNFJvd19DOwotICAgICAgICBJNDIyVG9SR0IyNFJvd19ORU9OOworICAgICAgICBJNDIyVG9SR0IyNFJvd19ORU9OKjsKICAgICAgICAgSTQyMlRvUkdCNTY1OwotICAgICAgICBJNDIyVG9SR0I1NjVSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQjU2NVJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0MjJUb1JHQjU2NVJvd19DOwotICAgICAgICBJNDIyVG9SR0I1NjVSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvUkdCNTY1Um93X05FT04qOwogICAgICAgICBJNDIyVG9SR0JBOwotICAgICAgICBJNDIyVG9SR0JBUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9SR0JBUm93X0FueV9ORU9OKjsKICAgICAgICAgSTQyMlRvUkdCQVJvd19DOwotICAgICAgICBJNDIyVG9SR0JBUm93X05FT047CisgICAgICAgIEk0MjJUb1JHQkFSb3dfTkVPTio7CiAgICAgICAgIEk0MjJUb1VZVlk7Ci0gICAgICAgIEk0MjJUb1VZVllSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1VZVllSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9VWVZZUm93X0M7Ci0gICAgICAgIEk0MjJUb1VZVllSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvVVlWWVJvd19ORU9OKjsKICAgICAgICAgSTQyMlRvWVVZMjsKLSAgICAgICAgSTQyMlRvWVVZMlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0MjJUb1lVWTJSb3dfQzsKLSAgICAgICAgSTQyMlRvWVVZMlJvd19ORU9OOworICAgICAgICBJNDIyVG9ZVVkyUm93X05FT04qOwogICAgICAgICBJNDQ0Q29weTsKICAgICAgICAgSTQ0NFRvQUJHUjsKICAgICAgICAgSTQ0NFRvQVJHQjsKLSAgICAgICAgSTQ0NFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQ0NFRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0NDRUb0FSR0JSb3dfQzsKLSAgICAgICAgSTQ0NFRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDQ0VG9BUkdCUm93X05FT04qOwogICAgICAgICBJNDQ0VG9JNDIwOwotICAgICAgICBJbml0Q3B1RmxhZ3M7CisgICAgICAgIEluaXRDcHVGbGFncyo7CiAgICAgICAgIEludGVycG9sYXRlUGxhbmU7CiAgICAgICAgIEludGVycG9sYXRlUm93XzE2X0M7Ci0gICAgICAgIEludGVycG9sYXRlUm93X0FueV9ORU9OOworICAgICAgICBJbnRlcnBvbGF0ZVJvd19BbnlfTkVPTio7CiAgICAgICAgIEludGVycG9sYXRlUm93X0M7Ci0gICAgICAgIEludGVycG9sYXRlUm93X05FT047CisgICAgICAgIEludGVycG9sYXRlUm93X05FT04qOwogICAgICAgICBKNDAwVG9BUkdCOwotICAgICAgICBKNDAwVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBKNDAwVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgSjQwMFRvQVJHQlJvd19DOwotICAgICAgICBKNDAwVG9BUkdCUm93X05FT047CisgICAgICAgIEo0MDBUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIEo0MjBUb0FCR1I7CiAgICAgICAgIEo0MjBUb0FSR0I7CiAgICAgICAgIEo0MjJUb0FCR1I7CkBAIC0yODIsMTA3ICsyODIsMTA3IEBACiAgICAgICAgIGtZdnVKUEVHQ29uc3RhbnRzOwogICAgICAgICBNNDIwVG9BUkdCOwogICAgICAgICBNNDIwVG9JNDIwOwotICAgICAgICBNYXNrQ3B1RmxhZ3M7CisgICAgICAgIE1hc2tDcHVGbGFncyo7CiAgICAgICAgIE1lcmdlVVZQbGFuZTsKLSAgICAgICAgTWVyZ2VVVlJvd19BbnlfTkVPTjsKKyAgICAgICAgTWVyZ2VVVlJvd19BbnlfTkVPTio7CiAgICAgICAgIE1lcmdlVVZSb3dfQzsKLSAgICAgICAgTWVyZ2VVVlJvd19ORU9OOwotICAgICAgICBNaXBzQ3B1Q2FwczsKKyAgICAgICAgTWVyZ2VVVlJvd19ORU9OKjsKKyAgICAgICAgTWlwc0NwdUNhcHMqOwogICAgICAgICBNaXJyb3JQbGFuZTsKLSAgICAgICAgTWlycm9yUm93X0FueV9ORU9OOworICAgICAgICBNaXJyb3JSb3dfQW55X05FT04qOwogICAgICAgICBNaXJyb3JSb3dfQzsKLSAgICAgICAgTWlycm9yUm93X05FT047CisgICAgICAgIE1pcnJvclJvd19ORU9OKjsKICAgICAgICAgTWlycm9yVVZSb3dfQzsKLSAgICAgICAgTWlycm9yVVZSb3dfTkVPTjsKLSAgICAgICAgTlYxMlRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgTWlycm9yVVZSb3dfTkVPTio7CisgICAgICAgIE5WMTJUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBOVjEyVG9BUkdCUm93X0M7Ci0gICAgICAgIE5WMTJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgTlYxMlRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgTlYxMlRvSTQyMDsKICAgICAgICAgTlYxMlRvUkdCNTY1OwotICAgICAgICBOVjEyVG9SR0I1NjVSb3dfQW55X05FT047CisgICAgICAgIE5WMTJUb1JHQjU2NVJvd19BbnlfTkVPTio7CiAgICAgICAgIE5WMTJUb1JHQjU2NVJvd19DOwotICAgICAgICBOVjEyVG9SR0I1NjVSb3dfTkVPTjsKKyAgICAgICAgTlYxMlRvUkdCNTY1Um93X05FT04qOwogICAgICAgICBOVjIxVG9BUkdCOwotICAgICAgICBOVjIxVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBOVjIxVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgTlYyMVRvQVJHQlJvd19DOwotICAgICAgICBOVjIxVG9BUkdCUm93X05FT047CisgICAgICAgIE5WMjFUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIE5WMjFUb0k0MjA7CiAgICAgICAgIFJBV1RvQVJHQjsKLSAgICAgICAgUkFXVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBSQVdUb0FSR0JSb3dfQzsKLSAgICAgICAgUkFXVG9BUkdCUm93X05FT047CisgICAgICAgIFJBV1RvQVJHQlJvd19ORU9OKjsKICAgICAgICAgUkFXVG9JNDIwOwogICAgICAgICBSQVdUb1JHQjI0OwotICAgICAgICBSQVdUb1JHQjI0Um93X0FueV9ORU9OOworICAgICAgICBSQVdUb1JHQjI0Um93X0FueV9ORU9OKjsKICAgICAgICAgUkFXVG9SR0IyNFJvd19DOwotICAgICAgICBSQVdUb1JHQjI0Um93X05FT047Ci0gICAgICAgIFJBV1RvVVZSb3dfQW55X05FT047CisgICAgICAgIFJBV1RvUkdCMjRSb3dfTkVPTio7CisgICAgICAgIFJBV1RvVVZSb3dfQW55X05FT04qOwogICAgICAgICBSQVdUb1VWUm93X0M7Ci0gICAgICAgIFJBV1RvVVZSb3dfTkVPTjsKLSAgICAgICAgUkFXVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1VWUm93X05FT04qOworICAgICAgICBSQVdUb1lSb3dfQW55X05FT04qOwogICAgICAgICBSQVdUb1lSb3dfQzsKLSAgICAgICAgUkFXVG9ZUm93X05FT047CisgICAgICAgIFJBV1RvWVJvd19ORU9OKjsKICAgICAgICAgUkdCMjRUb0FSR0I7Ci0gICAgICAgIFJHQjI0VG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBSR0IyNFRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQjI0VG9BUkdCUm93X0M7Ci0gICAgICAgIFJHQjI0VG9BUkdCUm93X05FT047CisgICAgICAgIFJHQjI0VG9BUkdCUm93X05FT04qOwogICAgICAgICBSR0IyNFRvSTQyMDsKLSAgICAgICAgUkdCMjRUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0IyNFRvVVZSb3dfQW55X05FT04qOwogICAgICAgICBSR0IyNFRvVVZSb3dfQzsKLSAgICAgICAgUkdCMjRUb1VWUm93X05FT047Ci0gICAgICAgIFJHQjI0VG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0IyNFRvVVZSb3dfTkVPTio7CisgICAgICAgIFJHQjI0VG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCMjRUb1lSb3dfQzsKLSAgICAgICAgUkdCMjRUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCMjRUb1lSb3dfTkVPTio7CiAgICAgICAgIFJHQjU2NVRvQVJHQjsKLSAgICAgICAgUkdCNTY1VG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBSR0I1NjVUb0FSR0JSb3dfQzsKLSAgICAgICAgUkdCNTY1VG9BUkdCUm93X05FT047CisgICAgICAgIFJHQjU2NVRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgUkdCNTY1VG9JNDIwOwotICAgICAgICBSR0I1NjVUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCNTY1VG9VVlJvd19DOwotICAgICAgICBSR0I1NjVUb1VWUm93X05FT047Ci0gICAgICAgIFJHQjU2NVRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9VVlJvd19ORU9OKjsKKyAgICAgICAgUkdCNTY1VG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCNTY1VG9ZUm93X0M7Ci0gICAgICAgIFJHQjU2NVRvWVJvd19ORU9OOworICAgICAgICBSR0I1NjVUb1lSb3dfTkVPTio7CiAgICAgICAgIFJHQkFUb0FSR0I7CiAgICAgICAgIFJHQkFUb0k0MjA7Ci0gICAgICAgIFJHQkFUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQkFUb1VWUm93X0M7Ci0gICAgICAgIFJHQkFUb1VWUm93X05FT047Ci0gICAgICAgIFJHQkFUb1lSb3dfQW55X05FT047CisgICAgICAgIFJHQkFUb1VWUm93X05FT04qOworICAgICAgICBSR0JBVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCQVRvWVJvd19DOwotICAgICAgICBSR0JBVG9ZUm93X05FT047CisgICAgICAgIFJHQkFUb1lSb3dfTkVPTio7CiAgICAgICAgIFJHQkNvbG9yTWF0cml4OwogICAgICAgICBSR0JDb2xvclRhYmxlOwogICAgICAgICBSR0JDb2xvclRhYmxlUm93X0M7CiAgICAgICAgIFNjYWxlOwogICAgICAgICBTY2FsZUFkZFJvd18xNl9DOwogICAgICAgICBTY2FsZUFkZFJvd19DOwotICAgICAgICBTY2FsZUFkZFJvd3NfTkVPTjsKKyAgICAgICAgU2NhbGVBZGRSb3dzX05FT04qOwogICAgICAgICBTY2FsZUFSR0JDb2xzNjRfQzsKLSAgICAgICAgU2NhbGVBUkdCQ29sc19BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlQVJHQkNvbHNfQzsKLSAgICAgICAgU2NhbGVBUkdCQ29sc19ORU9OOworICAgICAgICBTY2FsZUFSR0JDb2xzX05FT04qOwogICAgICAgICBTY2FsZUFSR0JDb2xzVXAyX0M7CiAgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHM2NF9DOwotICAgICAgICBTY2FsZUFSR0JGaWx0ZXJDb2xzX0FueV9ORU9OOworICAgICAgICBTY2FsZUFSR0JGaWx0ZXJDb2xzX0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19DOwotICAgICAgICBTY2FsZUFSR0JGaWx0ZXJDb2xzX05FT047Ci0gICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yX0FueV9ORU9OOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkJveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19ORU9OKjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJfQW55X05FT04qOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkJveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X0M7Ci0gICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X05FT04qOwogICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9DOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJMaW5lYXJfQW55X05FT04qOwogICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9DOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9ORU9OOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9ORU9OOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9BbnlfTkVPTjsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5Cb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yTGluZWFyX05FT04qOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9ORU9OKjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5fQW55X05FT04qOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbkJveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X0M7Ci0gICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X05FT04qOwogICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9DOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9ORU9OKjsKICAgICAgICAgU2NhbGVDb2xzXzE2X0M7CiAgICAgICAgIFNjYWxlQ29sc19DOwogICAgICAgICBTY2FsZUNvbHNVcDJfMTZfQzsKQEAgLTM5MCwxMSArMzkwLDExIEBACiAgICAgICAgIFNjYWxlRmlsdGVyQ29sc18xNl9DOwogICAgICAgICBTY2FsZUZpbHRlckNvbHM2NF8xNl9DOwogICAgICAgICBTY2FsZUZpbHRlckNvbHM2NF9DOwotICAgICAgICBTY2FsZUZpbHRlckNvbHNfQW55X05FT047CisgICAgICAgIFNjYWxlRmlsdGVyQ29sc19BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlRmlsdGVyQ29sc19DOwotICAgICAgICBTY2FsZUZpbHRlckNvbHNfTkVPTjsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX05FT04qOwogICAgICAgICBTY2FsZUZpbHRlclJlZHVjZTsKLSAgICAgICAgU2NhbGVGaWx0ZXJSb3dzX05FT047CisgICAgICAgIFNjYWxlRmlsdGVyUm93c19ORU9OKjsKICAgICAgICAgU2NhbGVPZmZzZXQ7CiAgICAgICAgIFNjYWxlUGxhbmU7CiAgICAgICAgIFNjYWxlUGxhbmVfMTY7CkBAIC00MDUsMTA0ICs0MDUsMTA0IEBACiAgICAgICAgIFNjYWxlUGxhbmVWZXJ0aWNhbDsKICAgICAgICAgU2NhbGVQbGFuZVZlcnRpY2FsXzE2OwogICAgICAgICBTY2FsZVJvd0Rvd24yXzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjJfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24yQm94XzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjJCb3hfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJCb3hfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjJCb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjJfQzsKICAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24yTGluZWFyX0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yTGluZWFyX0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24yTGluZWFyX05FT047Ci0gICAgICAgIFNjYWxlUm93RG93bjJfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9ORU9OKjsKKyAgICAgICAgU2NhbGVSb3dEb3duMl9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzRfMF9Cb3hfMTZfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzRfMF9Cb3hfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzRfMF9Cb3hfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzRfMF9Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMF9Cb3hfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM0XzE2X0M7CiAgICAgICAgIFNjYWxlUm93RG93bjM0XzFfQm94XzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM0XzFfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM0XzFfQm94X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM0XzFfQm94X05FT047Ci0gICAgICAgIFNjYWxlUm93RG93bjM0X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9ORU9OKjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zNF9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zNF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzhfMTZfQzsKICAgICAgICAgU2NhbGVSb3dEb3duMzhfMl9Cb3hfMTZfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzhfMl9Cb3hfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzhfMl9Cb3hfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzhfMl9Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfMl9Cb3hfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM4XzNfQm94XzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM4XzNfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM4XzNfQm94X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM4XzNfQm94X05FT047Ci0gICAgICAgIFNjYWxlUm93RG93bjM4X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9ORU9OKjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zOF9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zOF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duNF8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd240X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duNEJveF8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duNEJveF9DOwotICAgICAgICBTY2FsZVJvd0Rvd240Qm94X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjRCb3hfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjRfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duNF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240X05FT04qOwogICAgICAgICBTY2FsZVNsb3BlOwogICAgICAgICBTZXRQbGFuZTsKLSAgICAgICAgU2V0Um93X0FueV9ORU9OOworICAgICAgICBTZXRSb3dfQW55X05FT04qOwogICAgICAgICBTZXRSb3dfQzsKLSAgICAgICAgU2V0Um93X05FT047Ci0gICAgICAgIFNvYmVsUm93X0FueV9ORU9OOworICAgICAgICBTZXRSb3dfTkVPTio7CisgICAgICAgIFNvYmVsUm93X0FueV9ORU9OKjsKICAgICAgICAgU29iZWxSb3dfQzsKLSAgICAgICAgU29iZWxSb3dfTkVPTjsKLSAgICAgICAgU29iZWxUb1BsYW5lUm93X0FueV9ORU9OOworICAgICAgICBTb2JlbFJvd19ORU9OKjsKKyAgICAgICAgU29iZWxUb1BsYW5lUm93X0FueV9ORU9OKjsKICAgICAgICAgU29iZWxUb1BsYW5lUm93X0M7Ci0gICAgICAgIFNvYmVsVG9QbGFuZVJvd19ORU9OOworICAgICAgICBTb2JlbFRvUGxhbmVSb3dfTkVPTio7CiAgICAgICAgIFNvYmVsWFJvd19DOwotICAgICAgICBTb2JlbFhSb3dfTkVPTjsKLSAgICAgICAgU29iZWxYWVJvd19BbnlfTkVPTjsKKyAgICAgICAgU29iZWxYUm93X05FT04qOworICAgICAgICBTb2JlbFhZUm93X0FueV9ORU9OKjsKICAgICAgICAgU29iZWxYWVJvd19DOwotICAgICAgICBTb2JlbFhZUm93X05FT047CisgICAgICAgIFNvYmVsWFlSb3dfTkVPTio7CiAgICAgICAgIFNvYmVsWVJvd19DOwotICAgICAgICBTb2JlbFlSb3dfTkVPTjsKKyAgICAgICAgU29iZWxZUm93X05FT04qOwogICAgICAgICBTcGxpdFVWUGxhbmU7Ci0gICAgICAgIFNwbGl0VVZSb3dfQW55X05FT047CisgICAgICAgIFNwbGl0VVZSb3dfQW55X05FT04qOwogICAgICAgICBTcGxpdFVWUm93X0M7Ci0gICAgICAgIFNwbGl0VVZSb3dfTkVPTjsKKyAgICAgICAgU3BsaXRVVlJvd19ORU9OKjsKICAgICAgICAgVVlWWVRvQVJHQjsKLSAgICAgICAgVVlWWVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIFVZVllUb0FSR0JSb3dfQzsKLSAgICAgICAgVVlWWVRvQVJHQlJvd19ORU9OOworICAgICAgICBVWVZZVG9BUkdCUm93X05FT04qOwogICAgICAgICBVWVZZVG9JNDIwOwogICAgICAgICBVWVZZVG9JNDIyOwogICAgICAgICBVWVZZVG9OVjEyOwotICAgICAgICBVWVZZVG9VVjQyMlJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfQW55X05FT04qOwogICAgICAgICBVWVZZVG9VVjQyMlJvd19DOwotICAgICAgICBVWVZZVG9VVjQyMlJvd19ORU9OOwotICAgICAgICBVWVZZVG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfTkVPTio7CisgICAgICAgIFVZVllUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgVVlWWVRvVVZSb3dfQzsKLSAgICAgICAgVVlWWVRvVVZSb3dfTkVPTjsKLSAgICAgICAgVVlWWVRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvVVZSb3dfTkVPTio7CisgICAgICAgIFVZVllUb1lSb3dfQW55X05FT04qOwogICAgICAgICBVWVZZVG9ZUm93X0M7Ci0gICAgICAgIFVZVllUb1lSb3dfTkVPTjsKKyAgICAgICAgVVlWWVRvWVJvd19ORU9OKjsKICAgICAgICAgWVVZMlRvQVJHQjsKLSAgICAgICAgWVVZMlRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgWVVZMlRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIFlVWTJUb0FSR0JSb3dfQzsKLSAgICAgICAgWVVZMlRvQVJHQlJvd19ORU9OOworICAgICAgICBZVVkyVG9BUkdCUm93X05FT04qOwogICAgICAgICBZVVkyVG9JNDIwOwogICAgICAgICBZVVkyVG9JNDIyOwogICAgICAgICBZVVkyVG9OVjEyOwotICAgICAgICBZVVkyVG9VVjQyMlJvd19BbnlfTkVPTjsKKyAgICAgICAgWVVZMlRvVVY0MjJSb3dfQW55X05FT04qOwogICAgICAgICBZVVkyVG9VVjQyMlJvd19DOwotICAgICAgICBZVVkyVG9VVjQyMlJvd19ORU9OOwotICAgICAgICBZVVkyVG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgWVVZMlRvVVY0MjJSb3dfTkVPTio7CisgICAgICAgIFlVWTJUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgWVVZMlRvVVZSb3dfQzsKLSAgICAgICAgWVVZMlRvVVZSb3dfTkVPTjsKKyAgICAgICAgWVVZMlRvVVZSb3dfTkVPTio7CiAgICAgICAgIFlVWTJUb1k7Ci0gICAgICAgIFlVWTJUb1lSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb1lSb3dfQW55X05FT04qOwogICAgICAgICBZVVkyVG9ZUm93X0M7Ci0gICAgICAgIFlVWTJUb1lSb3dfTkVPTjsKKyAgICAgICAgWVVZMlRvWVJvd19ORU9OKjsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKaW5kZXggZTk0NDIyNC4uN2E2N2U1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icApAQCAtMzEsOCArMzEsNSBAQAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDhkNDg2Y2YuLmI0OTRlMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMSw5ICsxLDYgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiRkxBQ0RlY29kZXIuY3BwIiwKQEAgLTExLDExICs4LDYgQEAKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsgIi4iIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgIF0sCi0KICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTI0LDIzICsxNiwzMSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc3RhdGljOiB7Ci0gICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkOiB7Ci0gICAgICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKKyAgICAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGlibWVkaWFfaGVhZGVycyJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliRkxBQy1oZWFkZXJzIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGEyYjZhYjcuLmNlZjBiYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+IC8vIGZsb2F0X2Zyb21faTMyCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTExNywxMDQgKzExOCw0MyBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4gIFNlZSBzaW1pbGFyIGNvZGUgYXQgRkxBQ0V4dHJhY3Rvci5jcHAKIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotc3RhdGljIHZvaWQgY29weU1vbm84KAorc3RhdGljIHZvaWQgY29weVRvMTZTaWduZWQoCiAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2g4KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gxNigKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMzgsOCArMTc4LDcgQEAKICAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAogICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKICAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCi0gICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpLAotICAgICAgbUNvcHkobnVsbHB0cikgeworICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSB7CiAgICAgQUxPR1YoImN0b3I6Iik7CiAgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CiAgICAgbWVtc2V0KCZtV3JpdGVIZWFkZXIsIDAsIHNpemVvZihtV3JpdGVIZWFkZXIpKTsKQEAgLTM3OSw2ICszMTgsNyBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSByYXJlLCBidXQgaXMgc3VwcG9ydGVkIGluIHRoZSBmcmFtZXdvcmsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zODcsMzEgKzMyNyw2IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICB2b2lkICgqbUNvcHkpKHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgICB9LAotICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgIH0sCi0gICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgICB9LAotICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgIH0sCi0gICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgICB9LAotICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgIH0sCi0gICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICB9OwotICAgIGZvciAoY29uc3QgYXV0byAmZW50cnkgOiB0YWJsZSkgewotICAgICAgICBpZiAoZW50cnkubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgIG1Db3B5ID0gZW50cnkubUNvcHk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBtZXRhZGF0YSBibG9ja3MuCiAgICAgbUJ1ZmZlclBvcyA9IDA7CiAgICAgbUJ1ZmZlckRhdGFTaXplID0gMDsKQEAgLTQyMCw3ICszMzUsNyBAQAogfQogCiBzdGF0dXNfdCBGTEFDRGVjb2Rlcjo6ZGVjb2RlT25lRnJhbWUoY29uc3QgdWludDhfdCAqaW5CdWZmZXIsIHNpemVfdCBpbkJ1ZmZlckxlbiwKLSAgICAgICAgc2hvcnQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4pIHsKKyAgICAgICAgdm9pZCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbiwgYm9vbCBvdXRwdXRGbG9hdCkgewogICAgIEFMT0dWKCJkZWNvZGVPbmVGcmFtZTogaW5wdXQgc2l6ZSglenUpIiwgaW5CdWZmZXJMZW4pOwogCiAgICAgaWYgKCFtU3RyZWFtSW5mb1ZhbGlkKSB7CkBAIC00NjksMjEgKzM4NCwzMyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhbm5lbHMgPSBnZXRDaGFubmVscygpOworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gb3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVscyAqIHNhbXBsZVNpemU7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBmcmFtZVNpemU7CiAgICAgaWYgKGJ1ZmZlclNpemUgPiAqb3V0QnVmZmVyTGVuKSB7CiAgICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogb3V0cHV0IGJ1ZmZlciBob2xkcyBvbmx5IHBhcnRpYWwgZnJhbWUgJXp1OiV6dSIsCiAgICAgICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJsb2Nrc2l6ZSA9ICpvdXRCdWZmZXJMZW4gLyAoZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCkpOwotICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCk7CisgICAgICAgIGJsb2Nrc2l6ZSA9ICpvdXRCdWZmZXJMZW4gLyBmcmFtZVNpemU7CisgICAgICAgIGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBmcmFtZVNpemU7CiAgICAgfQogCi0gICAgaWYgKG1Db3B5ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImRlY29kZU9uZUZyYW1lOiBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZDogY2hhbm5lbHMoJWQpLCBCaXRzUGVyU2FtcGxlKCVkKSIsCi0gICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KICAgICAvLyBjb3B5IFBDTSBmcm9tIEZMQUMgd3JpdGUgYnVmZmVyIHRvIG91dHB1dCBidWZmZXIsIHdpdGggaW50ZXJsZWF2aW5nCi0gICAgKCptQ29weSkob3V0QnVmZmVyLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlID0gZ2V0Qml0c1BlclNhbXBsZSgpOworICAgIGlmIChvdXRwdXRGbG9hdCkgeworICAgICAgICBjb3B5VG9GbG9hdChyZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0QnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb3B5VG8xNlNpZ25lZChyZWludGVycHJldF9jYXN0PHNob3J0Kj4ob3V0QnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9CiAgICAgKm91dEJ1ZmZlckxlbiA9IGJ1ZmZlclNpemU7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKaW5kZXggMWEzM2NhZS4uNjk0ZmNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCkBAIC00MSw3ICs0MSw3IEBACiAKICAgICBzdGF0dXNfdCBwYXJzZU1ldGFkYXRhKGNvbnN0IHVpbnQ4X3QgKmluQnVmZmVyLCBzaXplX3QgaW5CdWZmZXJMZW4pOwogICAgIHN0YXR1c190IGRlY29kZU9uZUZyYW1lKGNvbnN0IHVpbnQ4X3QgKmluQnVmZmVyLCBzaXplX3QgaW5CdWZmZXJMZW4sCi0gICAgICAgICAgICBzaG9ydCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CisgICAgICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0ID0gZmFsc2UpOwogICAgIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIH5GTEFDRGVjb2RlcigpOwogCkBAIC04OSw4ICs4OSw2IEBACiAgICAgLy8gbW9zdCByZWNlbnQgZXJyb3IgcmVwb3J0ZWQgYnkgbGliRkxBQyBkZWNvZGVyCiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAotICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0KICAgICBzdGF0dXNfdCBpbml0KCk7CiAKICAgICAvLyBGTEFDIHN0cmVhbSBkZWNvZGVyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzdmNjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKLSAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgewotfQotCi1BU3RhdGU6On5BU3RhdGUoKSB7Ci19Ci0KLXNwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKLSAgICByZXR1cm4gbVBhcmVudFN0YXRlOwotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgewotfQotCi12b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLUFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7Ci0KLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgewotICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCi0gICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKLQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgaWYgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCi0gICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKLSAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7Ci0gICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7Ci0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBBLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOwotICAgIGN1ciA9IHN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQi5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCi0gICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7Ci0gICAgICAgIEEucG9wKCk7Ci0gICAgICAgIEIucG9wKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gc3RhdGU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCA5OTIxNjM2Li5hMjc2NzIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTY2LDcgKzY2LDcgQEAKIAogLy8gc3RhdGljCiBpbnQ2NF90IEFMb29wZXI6OkdldE5vd1VzKCkgewotICAgIHJldHVybiBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgLyAxMDAwbGw7CisgICAgcmV0dXJuIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSAvIDEwMDBMTDsKIH0KIAogQUxvb3Blcjo6QUxvb3BlcigpCkBAIC0xNzAsNyArMTcwLDkgQEAKIAogICAgIGludDY0X3Qgd2hlblVzOwogICAgIGlmIChkZWxheVVzID4gMCkgewotICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpICsgZGVsYXlVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEdldE5vd1VzKCk7CisgICAgICAgIHdoZW5VcyA9IChkZWxheVVzID4gSU5UNjRfTUFYIC0gbm93VXMgPyBJTlQ2NF9NQVggOiBub3dVcyArIGRlbGF5VXMpOworCiAgICAgfSBlbHNlIHsKICAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKTsKICAgICB9CkBAIC0yMDgsNiArMjEwLDkgQEAKIAogICAgICAgICBpZiAod2hlblVzID4gbm93VXMpIHsKICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHdoZW5VcyAtIG5vd1VzOworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiBJTlQ2NF9NQVggLyAxMDAwKSB7CisgICAgICAgICAgICAgICAgZGVsYXlVcyA9IElOVDY0X01BWCAvIDEwMDA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgZGVsYXlVcyAqIDEwMDBsbCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZkYzM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrU2Vzc2lvbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFOZXR3b3JrU2Vzc2lvbi5oIgotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVRFBTaXplID0gMTUwMDsKLXN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhVRFBSZXRyaWVzID0gMjAwOwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgZXhwbGljaXQgTmV0d29ya1RocmVhZChBTmV0d29ya1Nlc3Npb24gKnNlc3Npb24pOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TmV0d29ya1RocmVhZCgpOwotCi1wcml2YXRlOgotICAgIEFOZXR3b3JrU2Vzc2lvbiAqbVNlc3Npb247Ci0KLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTmV0d29ya1RocmVhZCk7Ci19OwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIE1PREVfUlRTUCwKLSAgICAgICAgTU9ERV9EQVRBR1JBTSwKLSAgICAgICAgTU9ERV9XRUJTT0NLRVQsCi0gICAgfTsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIExJU1RFTklOR19SVFNQLAotICAgICAgICBMSVNURU5JTkdfVENQX0RHUkFNUywKLSAgICAgICAgREFUQUdSQU0sCi0gICAgfTsKLQotICAgIFNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgIGludCBzLAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgaW50MzJfdCBzZXNzaW9uSUQoKSBjb25zdDsKLSAgICBpbnQgc29ja2V0KCkgY29uc3Q7Ci0gICAgc3A8QU1lc3NhZ2U+IGdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSBjb25zdDsKLQotICAgIGJvb2wgaXNSVFNQU2VydmVyKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3Q7Ci0KLSAgICBib29sIHdhbnRzVG9SZWFkKCk7Ci0gICAgYm9vbCB3YW50c1RvV3JpdGUoKTsKLQotICAgIHN0YXR1c190IHJlYWRNb3JlKCk7Ci0gICAgc3RhdHVzX3Qgd3JpdGVNb3JlKCk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKTsKLQotICAgIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCA9IDEsCi0gICAgfTsKLSAgICBzdHJ1Y3QgRnJhZ21lbnQgewotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIGludDY0X3QgbVRpbWVVczsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICB9OwotCi0gICAgaW50MzJfdCBtU2Vzc2lvbklEOwotICAgIFN0YXRlIG1TdGF0ZTsKLSAgICBNb2RlIG1Nb2RlOwotICAgIGludCBtU29ja2V0OwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIGJvb2wgbVNhd1JlY2VpdmVGYWlsdXJlLCBtU2F3U2VuZEZhaWx1cmU7Ci0gICAgaW50MzJfdCBtVURQUmV0cmllczsKLQotICAgIExpc3Q8RnJhZ21lbnQ+IG1PdXRGcmFnbWVudHM7Ci0KLSAgICBBU3RyaW5nIG1JbkJ1ZmZlcjsKLQotICAgIGludDY0X3QgbUxhc3RTdGFsbFJlcG9ydFVzOwotCi0gICAgdm9pZCBub3RpZnlFcnJvcihib29sIHNlbmQsIHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqZGV0YWlsKTsKLSAgICB2b2lkIG5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKTsKLQotICAgIHZvaWQgZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJmZyYWcpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7Ci19OwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjpOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbikKLSAgICA6IG1TZXNzaW9uKHNlc3Npb24pIHsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjp+TmV0d29ya1RocmVhZCgpIHsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgbVNlc3Npb24tPnRocmVhZExvb3AoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246OlNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgaW50IHMsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbVNlc3Npb25JRChzZXNzaW9uSUQpLAotICAgICAgbVN0YXRlKHN0YXRlKSwKLSAgICAgIG1Nb2RlKE1PREVfREFUQUdSQU0pLAotICAgICAgbVNvY2tldChzKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZShmYWxzZSksCi0gICAgICBtU2F3U2VuZEZhaWx1cmUoZmFsc2UpLAotICAgICAgbVVEUFJldHJpZXMoa01heFVEUFJldHJpZXMpLAotICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzKC0xbGwpIHsKLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCkgewotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxBZGRyOwotICAgICAgICBzb2NrbGVuX3QgbG9jYWxBZGRyTGVuID0gc2l6ZW9mKGxvY2FsQWRkcik7Ci0KLSAgICAgICAgaW50IHJlcyA9IGdldHNvY2tuYW1lKAotICAgICAgICAgICAgICAgIG1Tb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9jYWxBZGRyLCAmbG9jYWxBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgcmVzID0gZ2V0cGVlcm5hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChsb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyBsb2NhbEFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBhZGRyID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIHJlbW90ZUFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdENsaWVudENvbm5lY3RlZCk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJzZXJ2ZXItaXAiLCBsb2NhbEFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlcnZlci1wb3J0IiwgbnRvaHMobG9jYWxBZGRyLnNpbl9wb3J0KSk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJjbGllbnQtaXAiLCByZW1vdGVBZGRyU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJjbGllbnQtcG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246On5TZXNzaW9uKCkgewotICAgIEFMT0dWKCJTZXNzaW9uICVkIGdvbmUiLCBtU2Vzc2lvbklEKTsKLQotICAgIGNsb3NlKG1Tb2NrZXQpOwotICAgIG1Tb2NrZXQgPSAtMTsKLX0KLQotaW50MzJfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNlc3Npb25JRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25JRDsKLX0KLQotaW50IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c29ja2V0KCkgY29uc3QgewotICAgIHJldHVybiBtU29ja2V0OwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2V0TW9kZShNb2RlIG1vZGUpIHsKLSAgICBtTW9kZSA9IG1vZGU7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCkgewotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEIHx8IG1Nb2RlICE9IE1PREVfUlRTUCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbU1vZGUgPSBNT0RFX1dFQlNPQ0tFVDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8QU1lc3NhZ2U+IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6Z2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vdGlmeTsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmlzUlRTUFNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19SVFNQOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNUQ1BEYXRhZ3JhbVNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19UQ1BfREdSQU1TOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d2FudHNUb1JlYWQoKSB7Ci0gICAgcmV0dXJuICFtU2F3UmVjZWl2ZUZhaWx1cmUgJiYgbVN0YXRlICE9IENPTk5FQ1RJTkc7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvV3JpdGUoKSB7Ci0gICAgcmV0dXJuICFtU2F3U2VuZEZhaWx1cmUKLSAgICAgICAgJiYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IENPTk5FQ1RFRCAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKQotICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBEQVRBR1JBTSAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKSk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6cmVhZE1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7Ci0KLSAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gcmVjdmZyb20oCi0gICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0LCBidWYtPmRhdGEoKSwgYnVmLT5jYXBhY2l0eSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBuKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGlwID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgImZyb21BZGRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1LiV1LiV1LiV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCA+PiAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwICYgMHhmZikuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmcm9tUG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGZhbHNlIC8qIHNlbmQgKi8sIGVyciwgIlJlY3Zmcm9tIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVURQUmV0cmllcy0tOwotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWN2ZnJvbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY2hhciB0bXBbNTEyXTsKLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gcmVjdihtU29ja2V0LCB0bXAsIHNpemVvZih0bXApLCAwKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuID4gMCkgewotICAgICAgICBtSW5CdWZmZXIuYXBwZW5kKHRtcCwgbik7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJpbjoiKTsKLSAgICAgICAgaGV4ZHVtcCh0bXAsIG4pOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgLy8gVENQIHN0cmVhbSBjYXJyeWluZyAxNi1iaXQgbGVuZ3RoLXByZWZpeGVkIGRhdGFncmFtcy4KLQotICAgICAgICB3aGlsZSAobUluQnVmZmVyLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICBzaXplX3QgcGFja2V0U2l6ZSA9IFUxNl9BVCgoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpKTsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCBwYWNrZXRTaXplICsgMikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBwYWNrZXQgPSBuZXcgQUJ1ZmZlcihwYWNrZXRTaXplKTsKLSAgICAgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyAyLCBwYWNrZXRTaXplKTsKLQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBwYWNrZXQtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhZ3JhbSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIHBhY2tldFNpemUgKyAyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNpemVfdCBsZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpID4gMCAmJiBtSW5CdWZmZXIuY19zdHIoKVswXSA9PSAnJCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkgKyAyKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCArIGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXRCaW5hcnlEYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsIiwgbUluQnVmZmVyLmNfc3RyKClbMV0pOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YSA9IG5ldyBBQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyA0LCBsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgNCArIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9Ci0gICAgICAgICAgICAgICAgUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5CdWZmZXIuY19zdHIoKSwgbUluQnVmZmVyLnNpemUoKSwgZXJyICE9IE9LLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKG1zZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJkYXRhIiwgbXNnKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0jaWYgMQotICAgICAgICAgICAgLy8gWFhYIFRoZSAob2xkKSBkb25nbGUgc2VuZHMgdGhlIHdyb25nIGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBvbiBhCi0gICAgICAgICAgICAvLyBTRVRfUEFSQU1FVEVSIHJlcXVlc3QgdGhhdCBzaWduYWxzIGEgIndmZF9pZHJfcmVxdWVzdCIuCi0gICAgICAgICAgICAvLyAoMTcgaW5zdGVhZCBvZiAxOSkuCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50ID0gbXNnLT5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudAotICAgICAgICAgICAgICAgICAgICAmJiAhbWVtY21wKGNvbnRlbnQsICJ3ZmRfaWRyX3JlcXVlc3RcclxuIiwgMTcpCi0gICAgICAgICAgICAgICAgICAgICYmIGxlbmd0aCA+PSAxOQotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGhdID09ICdccicKLSAgICAgICAgICAgICAgICAgICAgJiYgbUluQnVmZmVyLmNfc3RyKClbbGVuZ3RoICsgMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGxlbmd0aCArPSAyOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9XRUJTT0NLRVQpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpOwotICAgICAgICAvLyBoZXhkdW1wKGRhdGEsIG1JbkJ1ZmZlci5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAyOwotCi0gICAgICAgICAgICB1aW50NjRfdCBwYXlsb2FkTGVuID0gZGF0YVsxXSAmIDB4N2Y7Ci0gICAgICAgICAgICBpZiAocGF5bG9hZExlbiA9PSAxMjYpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFUxNl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbiA9PSAxMjcpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFU2NF9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IDA7Ci0gICAgICAgICAgICBpZiAoZGF0YVsxXSAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAvLyBNQVNLPT0xCi0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDQgPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hc2sgPSBVMzJfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID4gbUluQnVmZmVyLnNpemUoKSB8fCBvZmZzZXQgPiBtSW5CdWZmZXIuc2l6ZSgpIC0gcGF5bG9hZExlbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBmdWxsIG1lc3NhZ2UuCi0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBheWxvYWRMZW4pOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCAmZGF0YVtvZmZzZXRdLCBwYXlsb2FkTGVuKTsKLQotICAgICAgICAgICAgaWYgKG1hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF5bG9hZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZGF0YSgpW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdFdlYlNvY2tldE1lc3NhZ2UpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBwYWNrZXQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVhZGVyQnl0ZSIsIGRhdGFbMF0pOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBvZmZzZXQgKyBwYXlsb2FkTGVuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdiBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICYgLyogZnJhZyAqLykgewotI2lmIDAKLSAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpbnQ2NF90IGRlbGF5TXMgPSAobm93VXMgLSBmcmFnLm1UaW1lVXMpIC8gMTAwMGxsOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkRlbGF5TXMgPSAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhEZWxheU1zID0gMzAwOwotCi0gICAgY29uc3QgY2hhciAqa1BhdHRlcm4gPSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyI7Ci0gICAgc2l6ZV90IGtQYXR0ZXJuU2l6ZSA9IHN0cmxlbihrUGF0dGVybik7Ci0KLSAgICBpbnQgbiA9IChrUGF0dGVyblNpemUgKiAoZGVsYXlNcyAtIGtNaW5EZWxheU1zKSkKLSAgICAgICAgICAgICAgICAvIChrTWF4RGVsYXlNcyAtIGtNaW5EZWxheU1zKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBuID0gMDsKLSAgICB9IGVsc2UgaWYgKChzaXplX3QpbiA+IGtQYXR0ZXJuU2l6ZSkgewotICAgICAgICBuID0ga1BhdHRlcm5TaXplOwotICAgIH0KLQotICAgIEFMT0dJKCJbJWxsZF06ICglNGxsZCBtcykgJXNcbiIsCi0gICAgICAgICAgZnJhZy5tVGltZVVzIC8gMTAwMCwKLSAgICAgICAgICBkZWxheU1zLAotICAgICAgICAgIGtQYXR0ZXJuICsga1BhdHRlcm5TaXplIC0gbik7Ci0jZW5kaWYKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3cml0ZU1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLSAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZkYXRhZ3JhbSA9IGZyYWcubUJ1ZmZlcjsKLQotICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbiA9IHNlbmQobVNvY2tldCwgZGF0YWdyYW0tPmRhdGEoKSwgZGF0YWdyYW0tPnNpemUoKSwgMCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEZyYWdtZW50U3RhdHMoZnJhZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGlmICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiV6dSBkYXRhZ3JhbXMgcmVtYWluIHF1ZXVlZC4iLCBtT3V0RnJhZ21lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmICghbVVEUFJldHJpZXMpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZGF0YWdyYW0gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNlbmQgZGF0YWdyYW0gZmFpbGVkLCAlZC8lZCByZXRyaWVzIGxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVEUFJldHJpZXMsIGtNYXhVRFBSZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VRFBSZXRyaWVzID0ga01heFVEUFJldHJpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBzb2NrbGVuX3Qgb3B0aW9uTGVuID0gc2l6ZW9mKGVycik7Ci0gICAgICAgIENIRUNLX0VRKGdldHNvY2tvcHQobVNvY2tldCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZvcHRpb25MZW4pLCAwKTsKLSAgICAgICAgQ0hFQ0tfRVEob3B0aW9uTGVuLCAoc29ja2xlbl90KXNpemVvZihlcnIpKTsKLQotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGtXaGF0RXJyb3IsIC1lcnIsICJDb25uZWN0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIC1lcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIG5vdGlmeShrV2hhdENvbm5lY3RlZCk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09OTkVDVEVEKTsKLSAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgIHNzaXplX3QgbiA9IC0xOwotICAgIHdoaWxlICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBmcmFnLm1CdWZmZXItPmRhdGEoKSwgZnJhZy5tQnVmZmVyLT5zaXplKCksIDApOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFnLm1CdWZmZXItPnNldFJhbmdlKAotICAgICAgICAgICAgICAgIGZyYWcubUJ1ZmZlci0+b2Zmc2V0KCkgKyBuLCBmcmFnLm1CdWZmZXItPnNpemUoKSAtIG4pOwotCi0gICAgICAgIGlmIChmcmFnLm1CdWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZyYWcubUZsYWdzICYgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEKSB7Ci0gICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1PdXRGcmFnbWVudHMuZXJhc2UobU91dEZyYWdtZW50cy5iZWdpbigpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZmFpbGVkLiIpOwotICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotICAgIH0KLQotI2lmIDAKLSAgICBpbnQgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgaW50IHJlcyA9IGlvY3RsKG1Tb2NrZXQsIFNJT0NPVVRRLCAmbnVtQnl0ZXNRdWV1ZWQpOwotICAgIGlmIChyZXMgPT0gMCAmJiBudW1CeXRlc1F1ZXVlZCA+IDUwICogMTAyNCkgewotICAgICAgICBpZiAobnVtQnl0ZXNRdWV1ZWQgPiA0MDk2MDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIhISEgbnVtQnl0ZXNRdWV1ZWQgPSAlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIGlmIChtTGFzdFN0YWxsUmVwb3J0VXMgPCAwbGwKLSAgICAgICAgICAgICAgICB8fCBub3dVcyA+IG1MYXN0U3RhbGxSZXBvcnRVcyArIDEwMDAwMGxsKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0TmV0d29ya1N0YWxsKTsKLSAgICAgICAgICAgIG1zZy0+c2V0U2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCBudW1CeXRlc1F1ZXVlZCk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoKTsKLQotICAgICAgICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzID0gbm93VXM7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2VuZFJlcXVlc3QoCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgQ0hFQ0sobVN0YXRlID09IENPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gREFUQUdSQU0pOwotCi0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilkYXRhKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX0RBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0xFKHNpemUsIDY1NTM1KTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplICsgMik7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gc2l6ZSA+PiA4OwotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IHNpemUgJiAweGZmOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyAyLCBkYXRhLCBzaXplKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgbU1vZGUgPT0gTU9ERV9XRUJTT0NLRVQpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wga1VzZU1hc2sgPSBmYWxzZTsgIC8vIENocm9taXVtIGRvZXNuJ3QgbGlrZSBpdC4KLQotICAgICAgICBzaXplX3QgbnVtSGVhZGVyQnl0ZXMgPSAyICsgKGtVc2VNYXNrID8gNCA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBudW1IZWFkZXJCeXRlcyArPSA4OwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihudW1IZWFkZXJCeXRlcyArIHNpemUpOwotICAgICAgICBidWZmZXItPmRhdGEoKVswXSA9IDB4ODE7ICAvLyBGSU49PTEgfCBvcGNvZGU9MSAodGV4dCkKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSBrVXNlTWFzayA/IDB4ODAgOiAweDAwOwotCi0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNzsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzRdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzVdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzZdID0gKHNpemUgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzddID0gKHNpemUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzhdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOV0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMTI1KSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSAxMjY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsyXSA9IChzaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtVc2VNYXNrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gcmFuZCgpOwotCi0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDRdID0gKG1hc2sgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gM10gPSAobWFzayA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAyXSA9IChtYXNrID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gMV0gPSBtYXNrICYgMHhmZjsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoc2l6ZV90KXNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzICsgaV0gPQotICAgICAgICAgICAgICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKilkYXRhKVtpXQotICAgICAgICAgICAgICAgICAgICAgICAgXiAoKG1hc2sgPj4gKDggKiAoMyAtIChpICUgNCkpKSkgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG51bUhlYWRlckJ5dGVzLCBkYXRhLCBzaXplKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIEZyYWdtZW50IGZyYWc7Ci0KLSAgICBmcmFnLm1GbGFncyA9IDA7Ci0gICAgaWYgKHRpbWVWYWxpZCkgewotICAgICAgICBmcmFnLm1GbGFncyA9IEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRDsKLSAgICAgICAgZnJhZy5tVGltZVVzID0gdGltZVVzOwotICAgIH0KLQotICAgIGZyYWcubUJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIG1PdXRGcmFnbWVudHMucHVzaF9iYWNrKGZyYWcpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6bm90aWZ5RXJyb3IoCi0gICAgICAgIGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXRFcnJvcik7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VuZCIsIHNlbmQpOwotICAgIG1zZy0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbXNnLT5zZXRTdHJpbmcoImRldGFpbCIsIGRldGFpbCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnkoTm90aWZpY2F0aW9uUmVhc29uIHJlYXNvbikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OkFOZXR3b3JrU2Vzc2lvbigpCi0gICAgOiBtTmV4dFNlc3Npb25JRCgxKSB7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjp+QU5ldHdvcmtTZXNzaW9uKCkgewotICAgIHN0b3AoKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzdGFydCgpIHsKLSAgICBpZiAobVRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gcGlwZShtUGlwZUZkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICBtVGhyZWFkID0gbmV3IE5ldHdvcmtUaHJlYWQodGhpcyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtVGhyZWFkLT5ydW4oIkFOZXR3b3JrU2Vzc2lvbiIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtVGhyZWFkLmNsZWFyKCk7Ci0KLSAgICAgICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0b3AoKSB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbVRocmVhZC0+cmVxdWVzdEV4aXQoKTsKLSAgICBpbnRlcnJ1cHQoKTsKLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLQotICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgIGNsb3NlKG1QaXBlRmRbMF0pOwotICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlUlRTUENsaWVudCgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUENsaWVudCwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIDAgLyogcG9ydCAqLywKLSAgICAgICAgICAgIGhvc3QsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVEUFNlc3Npb24obG9jYWxQb3J0LCBOVUxMLCAwLCBub3RpZnksIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVVRFBTZXNzaW9uLAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgbG9jYWxQb3J0LAotICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUsCi0gICAgICAgICAgICAmYWRkciwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBOVUxMIC8qIHJlbW90ZUhvc3QgKi8sCi0gICAgICAgICAgICAwIC8qIHJlbW90ZVBvcnQgKi8sCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6ZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6TWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKSB7Ci0gICAgaW50IGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCk7Ci0gICAgaWYgKGZsYWdzIDwgMCkgewotICAgICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7Ci0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmxvY2FsQWRkciwKLSAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqc2Vzc2lvbklEID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBpbnQgcywgcmVzOwotICAgIHNwPFNlc3Npb24+IHNlc3Npb247Ci0KLSAgICBzID0gc29ja2V0KAotICAgICAgICAgICAgQUZfSU5FVCwKLSAgICAgICAgICAgIChtb2RlID09IGtNb2RlQ3JlYXRlVURQU2Vzc2lvbikgPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU0sCi0gICAgICAgICAgICAwKTsKLQotICAgIGlmIChzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgIGNvbnN0IGludCB5ZXMgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSB7Ci0gICAgICAgIGludCBzaXplID0gMjU2ICogMTAyNDsKLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW50IGZsYWcgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJmZsYWcsIHNpemVvZihmbGFnKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdG9zID0gMjI0OyAgLy8gVk9JQ0UKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBJUFBST1RPX0lQLCBJUF9UT1MsICZ0b3MsIHNpemVvZih0b3MpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IE1ha2VTb2NrZXROb25CbG9ja2luZyhzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgZ290byBiYWlsMjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBtZW1zZXQoYWRkci5zaW5femVybywgMCwgc2l6ZW9mKGFkZHIuc2luX3plcm8pKTsKLSAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50Ci0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0gICAgfSBlbHNlIGlmIChsb2NhbEFkZHIgIT0gTlVMTCkgewotICAgICAgICBhZGRyLnNpbl9hZGRyID0gKmxvY2FsQWRkcjsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW5fYWRkcl90IHggPSBudG9obChhZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFMT0dJKCJjb25uZWN0aW5nIHNvY2tldCAlZCB0byAlZC4lZC4lZC4lZDolZCIsCi0gICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICh4ID4+IDI0KSwKLSAgICAgICAgICAgICAgKHggPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgKHggPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICB4ICYgMHhmZiwKLSAgICAgICAgICAgICAgbnRvaHMoYWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgIHJlcyA9IGNvbm5lY3QocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIENIRUNLX0xUKHJlcywgMCk7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGJpbmQocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQU2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gbGlzdGVuKHMsIDQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihyZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50PSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICAgICAgICAgICAgICByZXMgPSBjb25uZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVBZGRyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIFNlc3Npb246OlN0YXRlIHN0YXRlOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUENsaWVudDoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmU6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1RDUF9ER1JBTVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUFNlcnZlcjoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1JUU1A7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0tfRVEobW9kZSwga01vZGVDcmVhdGVVRFBTZXNzaW9uKTsKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6REFUQUdSQU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzZXNzaW9uID0gbmV3IFNlc3Npb24oCi0gICAgICAgICAgICBtTmV4dFNlc3Npb25JRCsrLAotICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICBzLAotICAgICAgICAgICAgbm90aWZ5KTsKLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudCkgewotICAgICAgICBzZXNzaW9uLT5zZXRNb2RlKFNlc3Npb246Ok1PREVfUlRTUCk7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgICpzZXNzaW9uSUQgPSBzZXNzaW9uLT5zZXNzaW9uSUQoKTsKLQotICAgIGdvdG8gYmFpbDsKLQotYmFpbDI6Ci0gICAgY2xvc2Uocyk7Ci0gICAgcyA9IC0xOwotCi1iYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LCB1bnNpZ25lZCByZW1vdGVQb3J0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICByZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICByZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0KLSAgICAgICAgaW50IHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKLSAgICAgICAgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+c2VuZFJlcXVlc3QoZGF0YSwgc2l6ZSwgdGltZVZhbGlkLCB0aW1lVXMpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gc2Vzc2lvbi0+c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjppbnRlcnJ1cHQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgZHVtbXkgPSAwOwotCi0gICAgc3NpemVfdCBuOwotICAgIGRvIHsKLSAgICAgICAgbiA9IHdyaXRlKG1QaXBlRmRbMV0sICZkdW1teSwgMSk7Ci0gICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciB3cml0aW5nIHRvIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6dGhyZWFkTG9vcCgpIHsKLSAgICBmZF9zZXQgcnMsIHdzOwotICAgIEZEX1pFUk8oJnJzKTsKLSAgICBGRF9aRVJPKCZ3cyk7Ci0KLSAgICBGRF9TRVQobVBpcGVGZFswXSwgJnJzKTsKLSAgICBpbnQgbWF4RmQgPSBtUGlwZUZkWzBdOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBGRF9TRVQocywgJnJzKTsKLSAgICAgICAgICAgICAgICBpZiAocyA+IG1heEZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEZkID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT53YW50c1RvV3JpdGUoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmd3MpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZXMgPSBzZWxlY3QobWF4RmQgKyAxLCAmcnMsICZ3cywgTlVMTCwgTlVMTCAvKiB0diAqLyk7Ci0KLSAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0UoInNlbGVjdCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKEZEX0lTU0VUKG1QaXBlRmRbMF0sICZycykpIHsKLSAgICAgICAgY2hhciBjOwotICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSByZWFkKG1QaXBlRmRbMF0sICZjLCAxKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgQUxPR1coIkVycm9yIHJlYWRpbmcgZnJvbSBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1yZXM7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIExpc3Q8c3A8U2Vzc2lvbj4gPiBzZXNzaW9uc1RvQWRkOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtU2Vzc2lvbnMuc2l6ZSgpOyByZXMgPiAwICYmIGkgPiAwOykgewotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgICAgICAgICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmcnMpIHx8IEZEX0lTU0VUKHMsICZ3cykpIHsKLSAgICAgICAgICAgICAgICAtLXJlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkgfHwgc2Vzc2lvbi0+aXNUQ1BEYXRhZ3JhbVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50U29ja2V0ID0gYWNjZXB0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRTb2NrZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG1ha2UgY2xpZW50IHNvY2tldCBub24gYmxvY2tpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tICVkLiVkLiVkLiVkOiVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNvY2tldCAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gY2xpZW50U2Vzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbjo6Q09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5nZXROb3RpZmljYXRpb25NZXNzYWdlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2Vzc2lvbi0+c2V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmlzUlRTUFNlcnZlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTZXNzaW9uOjpNT0RFX1JUU1AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlc3Npb246Ok1PREVfREFUQUdSQU0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5wdXNoX2JhY2soY2xpZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYWNjZXB0IHJldHVybmVkIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5yZWFkTW9yZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmVhZE1vcmUgb24gc29ja2V0ICVkIGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPndyaXRlTW9yZSgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIXNlc3Npb25zVG9BZGQuZW1wdHkoKSkgewotICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9ICpzZXNzaW9uc1RvQWRkLmJlZ2luKCk7Ci0gICAgICAgICAgICBzZXNzaW9uc1RvQWRkLmVyYXNlKHNlc3Npb25zVG9BZGQuYmVnaW4oKSk7Ci0KLSAgICAgICAgICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbi0+c2Vzc2lvbklEKCksIHNlc3Npb24pOwotCi0gICAgICAgICAgICBBTE9HSSgiYWRkZWQgY2xpZW50U2Vzc2lvbiAlZCIsIHNlc3Npb24tPnNlc3Npb25JRCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IDA0ZmFjMTkuLmZiNTFjYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMzEsNyArMzEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKLWNvbnN0IGNoYXIgKkFTdHJpbmc6OmtFbXB0eVN0cmluZyA9ICIiOworY29uc3RleHByIGNvbnN0IGNoYXIgKkFTdHJpbmc6OmtFbXB0eVN0cmluZzsKIAogQVN0cmluZzo6QVN0cmluZygpCiAgICAgOiBtRGF0YSgoY2hhciAqKWtFbXB0eVN0cmluZyksCkBAIC0xMjUsMTIgKzEyNSwxMCBAQAogfQogCiB2b2lkIEFTdHJpbmc6OmNsZWFyKCkgewotICAgIGlmIChtRGF0YSAmJiBtRGF0YSAhPSBrRW1wdHlTdHJpbmcpIHsKKyAgICBpZiAobURhdGEgIT0ga0VtcHR5U3RyaW5nKSB7CiAgICAgICAgIGZyZWUobURhdGEpOwotICAgICAgICBtRGF0YSA9IE5VTEw7CisgICAgICAgIG1EYXRhID0gKGNoYXIgKilrRW1wdHlTdHJpbmc7CiAgICAgfQotCi0gICAgbURhdGEgPSAoY2hhciAqKWtFbXB0eVN0cmluZzsKICAgICBtU2l6ZSA9IDA7CiAgICAgbUFsbG9jU2l6ZSA9IDE7CiB9CkBAIC0zNjcsNiArMzY1LDggQEAKIC8vIHN0YXRpYwogQVN0cmluZyBBU3RyaW5nOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgLy8gVGhlIHN0YXRpYyBhbmFseXplciBpbmNvcnJlY3RseSByZXBvcnRzIGEgZmFsc2UtcG9zaXRpdmUgaGVyZSBpbiBjKysxNy4KKyAgICAvLyBodHRwczovL2J1Z3MubGx2bS5vcmcvc2hvd19idWcuY2dpP2lkPTM4MTc2IC4gTk9MSU5UTkVYVExJTkUKICAgICByZXR1cm4gQVN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKSksIHNpemUpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggZjY2MzU0Mi4uNTMzY2Q3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtNCwxMiArNCwxMyBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiB9CiAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsCkBAIC0yNCw2ICsyNSw3IEBACiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCkBAIC01NSwxOCArNTcsMjIgQEAKICAgICAgICAgIkFCdWZmZXIuY3BwIiwKICAgICAgICAgIkFEZWJ1Zy5jcHAiLAogICAgICAgICAiQUhhbmRsZXIuY3BwIiwKLSAgICAgICAgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIiwKICAgICAgICAgIkFMb29wZXIuY3BwIiwKICAgICAgICAgIkFMb29wZXJSb3N0ZXIuY3BwIiwKICAgICAgICAgIkFNZXNzYWdlLmNwcCIsCi0gICAgICAgICJBTmV0d29ya1Nlc3Npb24uY3BwIiwKICAgICAgICAgIkFTdHJpbmcuY3BwIiwKICAgICAgICAgIkFTdHJpbmdVdGlscy5jcHAiLAorICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJCeXRlVXRpbHMuY3BwIiwKICAgICAgICAgIkNvbG9yVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckJhc2UuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyR3JvdXAuY3BwIiwKICAgICAgICAgIk1lZGlhRGVmcy5jcHAiLAogICAgICAgICAiTWVkaWFLZXlzLmNwcCIsCi0gICAgICAgICJQYXJzZWRNZXNzYWdlLmNwcCIsCisgICAgICAgICJNZXRhRGF0YS5jcHAiLAorICAgICAgICAiTWV0YURhdGFCYXNlLmNwcCIsCisgICAgICAgICJPcHVzSGVhZGVyLmNwcCIsCiAgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKICAgICAgICAgImJhc2U2NC5jcHAiLAogICAgICAgICAiaGV4ZHVtcC5jcHAiLApAQCAtODAsOCArODYsMjIgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItRE5PX0lNRU1PUlkiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4ZTk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJlc2VudGF0aW9uSW5mbyIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zLAorICAgICAgICBzdGQ6Om9zdHJlYW0qIHNlcmlhbGl6ZWRPdXRwdXQpIHsKKyAgICB1aW50MzJfdCBudW1QcmVzZW50YXRpb25zID0gcHJlc2VudGF0aW9ucy5zaXplKCk7CisgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bVByZXNlbnRhdGlvbnMpLCBzaXplb2YobnVtUHJlc2VudGF0aW9ucykpOworICAgIGZvciAoY29uc3QgYXV0byYgYXAgOiBwcmVzZW50YXRpb25zKSB7CisgICAgICAgIGlmIChhcC5tVmVyc2lvbiA9PSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1WZXJzaW9uKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tVmVyc2lvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tUHJlc2VudGF0aW9uSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1QcmVzZW50YXRpb25JZCkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tUHJvZ3JhbUlkKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJvZ3JhbUlkKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUxhYmVscyA9IGFwLm1MYWJlbHMuc2l6ZSgpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZudW1MYWJlbHMpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bUxhYmVscykpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBsYWJlbCA6IGFwLm1MYWJlbHMpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbEtleVNpemUgPSBsYWJlbC5maXJzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFiZWxLZXlTaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxLZXlTaXplKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUobGFiZWwuZmlyc3QuY19zdHIoKSwgbGFiZWxLZXlTaXplKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsVmFsU2l6ZSA9IGxhYmVsLnNlY29uZC5zaXplKCk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFiZWxWYWxTaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUobGFiZWwuc2Vjb25kLmNfc3RyKCksIGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IGxhbmdTaXplID0gYXAubUxhbmd1YWdlLnNpemUoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbGFuZ1NpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhbmdTaXplKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShhcC5tTGFuZ3VhZ2UuY19zdHIoKSwgbGFuZ1NpemUpOworCisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoc3RkOjppc3RyZWFtKiBzZXJpYWxpemVkSW5wdXQsCisgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgeworICAgIHVpbnQzMl90IG51bVByZXNlbnRhdGlvbnM7CisgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1QcmVzZW50YXRpb25zKSwgc2l6ZW9mKG51bVByZXNlbnRhdGlvbnMpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtUHJlc2VudGF0aW9uczsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmVyc2lvbiksIHNpemVvZih2ZXJzaW9uKSk7CisgICAgICAgIGlmICh2ZXJzaW9uID09IFBSRVNFTlRBVElPTl9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQoCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tUHJlc2VudGF0aW9uSWQpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByZXNlbnRhdGlvbklkKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1Qcm9ncmFtSWQpLCBzaXplb2YoYXAubVByb2dyYW1JZCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1MYWJlbHM7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bUxhYmVscyksIHNpemVvZihudW1MYWJlbHMpKTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1MYWJlbHM7ICsraikgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsS2V5U2l6ZTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhYmVsS2V5U2l6ZSksIHNpemVvZihsYWJlbEtleVNpemUpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYWJlbEtleShsYWJlbEtleVNpemUpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYWJlbEtleS5kYXRhKCksIGxhYmVsS2V5U2l6ZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbFZhbFNpemU7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYWJlbFZhbFNpemUpLCBzaXplb2YobGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFiZWxWYWwobGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFiZWxWYWwuZGF0YSgpLCBsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgICAgIGFwLm1MYWJlbHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhYmVsS2V5LmRhdGEoKSksIGxhYmVsS2V5U2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYWJlbFZhbC5kYXRhKCkpLCBsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IGxhbmd1YWdlU2l6ZTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFuZ3VhZ2VTaXplKSwgc2l6ZW9mKGxhbmd1YWdlU2l6ZSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFuZ3VhZ2UobGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYW5ndWFnZS5kYXRhKCksIGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYW5ndWFnZS5kYXRhKCkpLCBsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubU1hc3RlcmluZ0luZGljYXRpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLT5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW8gcHJlc2VudGF0aW9uIGluZm8gdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKaW5kZXggYzRlYWEyNy4uMDcwZTMyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNDIsNiArMzQzLDE0IEBACiAgICAgYXNwZWN0cy5tUmFuZ2UgPSBmdWxsUmFuZ2UgPyBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCA6IENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkOwogfQogCit2b2lkIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaW50cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAorICAgICAgICBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKm91dHRyYW5zZmVyKSB7CisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgY29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKHByaW1hcmllcywgaW50cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOworICAgIGNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKGFzcGVjdHMsIHJhbmdlLCBzdGFuZGFyZCwgb3V0dHJhbnNmZXIpOworfQorCiAvLyBzdGF0aWMKIENvbG9yQXNwZWN0cyBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyh1aW50MzJfdCBwYWNrZWQpIHsKICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKQEAgLTY4NCw2ICs2OTMsMTMgQEAKICAgICAgICAgICAgIHRyYW5zZmVyLCBhc1N0cmluZygoQ29sb3JUcmFuc2Zlcil0cmFuc2ZlcikpOwogfQogCisKKy8vIHN0YXRpYwordm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdCgKKyAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvLCBmb3JtYXQtPm1Gb3JtYXQpOworfQorCiAvLyBzdGF0aWMKIHZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoCiAgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZWFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBNZWRpYUJ1ZmZlcjo6bVVzZVNoYXJlZE1lbW9yeSgwKTsKKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoZGF0YSksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKHNpemUpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAorICAgICAgbU93bnNEYXRhKHRydWUpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAorICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgeworI2VuZGlmCisgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOworICAgICAgICBzaXplX3QgbmV3U2l6ZSA9IDA7CisgICAgICAgIGlmICghX19idWlsdGluX2FkZF9vdmVyZmxvdyhzaXplLCBzaXplb2YoU2hhcmVkQ29udHJvbCksICZuZXdTaXplKSkgeworICAgICAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG5ld1NpemUsICJNZWRpYUJ1ZmZlciIpOworICAgICAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUobmV3U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOworICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOworICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAorICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKKyAgICAgIG1CdWZmZXIoYnVmZmVyKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgorICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBwcmV2Q291bnQgPSBtUmVmQ291bnQuZmV0Y2hfc3ViKDEpOworICAgIGlmIChwcmV2Q291bnQgPT0gMSkgeworICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKKyAgICB9CisgICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgeworICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKKyAgICBDSEVDS19FUShtUmVmQ291bnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgMSk7CisKKyAgICBtUmVmQ291bnQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7CisgICAgKHZvaWQpIG1SZWZDb3VudC5mZXRjaF9hZGQoMSk7Cit9CisKK3ZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CisgICAgfQorICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7CisKKyAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7CisgICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOworfQorCitNZXRhRGF0YUJhc2UmIE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7CisgICAgcmV0dXJuICptTWV0YURhdGE7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgeworICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKKyAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOworfQorCitNZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgeworICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKKworICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgIG1EYXRhID0gTlVMTDsKKyAgICB9CisKKyAgIGlmIChtTWVtb3J5LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPnNldERlYWRPYmplY3QoKTsKKyAgIH0KKyAgIGRlbGV0ZSBtTWV0YURhdGE7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm9ic2VydmVyKSB7CisgICAgQ0hFQ0sob2JzZXJ2ZXIgPT0gTlVMTCB8fCBtT2JzZXJ2ZXIgPT0gTlVMTCk7CisgICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmY5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckdyb3VwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGQ6Om1pbiBpcyBub3QgY29uc3RleHByIGluIEMrKzExCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3RleHByIFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPD0gYiA/IGEgOiBiOyB9CisKKy8vIE1lZGlhQnVmZmVyR3JvdXAgbWF5IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgYXQgYQorLy8gc21hbGxlciB0aHJlc2hvbGQgdGhhbiBhbiBpc29sYXRlZCBuZXcgTWVkaWFCdWZmZXIuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQgPSBNSU4oCisgICAgICAgIChzaXplX3QpTWVkaWFCdWZmZXI6OmtTaGFyZWRNZW1UaHJlc2hvbGQsIChzaXplX3QpKDQgKiAxMDI0KSk7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOjpJbnRlcm5hbERhdGEgeworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCisgICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtQnVmZmVyczsKK307CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbVdyYXBwZXIobnVsbHB0ciksIG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OworfQorCitNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgaW5pdChidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKKworICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIEFMT0dXKCJQcmVhbGxvY2F0ZWQgYnVmZmVycyAlenUgPiBncm93dGhMaW1pdCAlenUsIGluY3JlYXNpbmcgZ3Jvd3RoTGltaXQiLAorICAgICAgICAgICAgICAgIGJ1ZmZlcnMsIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KTsKKyAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBidWZmZXJzOworICAgIH0KKworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgaWYgKGJ1ZmZlcl9zaXplID49IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0aW5nIE1lbW9yeURlYWxlciIpOworICAgICAgICAvLyBVc2luZyBhIHNpbmdsZSBNZW1vcnlEZWFsZXIgaXMgZWZmaWNpZW50IGZvciBhIGdyb3VwIG9mIHNoYXJlZCBtZW1vcnkgb2JqZWN0cy4KKyAgICAgICAgLy8gVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCB3ZSB1c2Ugc2hhcmVkIG1lbW9yeSAobm8gZmFsbGJhY2sgdG8gbWFsbG9jKS4KKworICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7CisgICAgICAgIHNpemVfdCBhdWdtZW50ZWRfc2l6ZSA9IGJ1ZmZlcl9zaXplICsgc2l6ZW9mKE1lZGlhQnVmZmVyOjpTaGFyZWRDb250cm9sKTsKKyAgICAgICAgc2l6ZV90IHRvdGFsID0gKGF1Z21lbnRlZF9zaXplICsgYWxpZ25tZW50IC0gMSkgLyBhbGlnbm1lbnQgKiBhbGlnbm1lbnQgKiBidWZmZXJzOworICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWwsICJNZWRpYUJ1ZmZlckdyb3VwIik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoYXVnbWVudGVkX3NpemUpOworICAgICAgICAgICAgaWYgKG1lbS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IHNoYXJlZCBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtZW0pOworICAgICAgICAgICAgYnVmZmVyLT5nZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7CisgICAgICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpa1NoYXJlZE1lbW9yeVRocmVzaG9sZDsKKyNlbmRpZgorCisgICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCisgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgIH0KK30KKworTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7CisgICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOworICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOworCisgICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOworCisgICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCisgICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KKyAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIGRlbGV0ZSBtSW50ZXJuYWw7CisgICAgZGVsZXRlIG1XcmFwcGVyOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisKKyAgICAvLyBpZiB3ZSdyZSBhYm92ZSBvdXIgZ3Jvd3RoIGxpbWl0LCByZWxlYXNlIGJ1ZmZlcnMgaWYgd2UgY2FuCisgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwCisgICAgICAgICAgICAmJiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA+PSBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdAorICAgICAgICAgICAgJiYgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICgqaXQpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKK30KKworYm9vbCBNZWRpYUJ1ZmZlckdyb3VwOjpoYXNfYnVmZmVycygpIHsKKyAgICBpZiAobUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgY2FuIGFkZCBtb3JlIGJ1ZmZlcnMgaW50ZXJuYWxseS4KKyAgICB9CisgICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHNtYWxsZXN0ID0gcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgc2l6ZV90IGJpZ2dlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGF1dG8gZnJlZSA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAoKml0KS0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPiBiaWdnZXN0KSB7CisgICAgICAgICAgICAgICAgYmlnZ2VzdCA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaXplID49IHJlcXVlc3RlZFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBzbWFsbGVzdCkgeworICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdCA9IHNpemU7IC8vIGFsd2F5cyBmcmVlIHRoZSBzbWFsbGVzdCBidWYKKyAgICAgICAgICAgICAgICAgICAgZnJlZSA9IGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAmJiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIHx8IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpKSB7CisgICAgICAgICAgICAvLyBXZSBhbGxvYyBiZWZvcmUgd2UgZnJlZSBzbyBmYWlsdXJlIGxlYXZlcyBncm91cCB1bmNoYW5nZWQuCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA9PSAwID8gYmlnZ2VzdCA6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSB2cyBhdmFpbGFibGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLCAoKmZyZWUpLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAqZnJlZSA9IGJ1ZmZlcjsgLy8gaW4tcGxhY2UgcmVwbGFjZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSIsIHJlcXVlc3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKKyAgICAgICAgICAgICpvdXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICB9CisgICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgorICAgICAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24ud2FpdChtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICB9CisgICAgLy8gTmV2ZXIgZ2V0cyBoZXJlLgorfQorCitzaXplX3QgTWVkaWFCdWZmZXJHcm91cDo6YnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVybmFsLT5tQnVmZmVycy5zaXplKCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICopIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCmluZGV4IDE2OTVjNzUuLmEwOGZlZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxID0gInZpZGVvL2F2MDEiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgPSAidmlkZW8vbXA0di1lcyI7CkBAIC0zMSw2ICszMiwxMCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fUkFXID0gInZpZGVvL3JhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04gPSAidmlkZW8vZG9sYnktdmlzaW9uIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCA9ICJ2aWRlby9zY3JhbWJsZWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRElWWCA9ICJ2aWRlby9kaXZ4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzID0gInZpZGVvL2RpdngzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQgPSAidmlkZW8veHZpZCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRyA9ICJ2aWRlby94LW1vdGlvbi1qcGVnIjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCID0gImF1ZGlvL2Ftci13YiI7CkBAIC01MCwxMSArNTUsMTggQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNID0gImF1ZGlvL2dzbSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzMgPSAiYXVkaW8vYWMzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMgPSAiYXVkaW8vZWFjMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQyA9ICJhdWRpby9lYWMzLWpvYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQgPSAiYXVkaW8vYWM0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCA9ICJhdWRpby9zY3JhbWJsZWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQyA9ICJhdWRpby9hbGFjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQSA9ICJhdWRpby94LW1zLXdtYSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSA9ICJhdWRpby94LWFkcGNtLW1zIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00gPSAiYXVkaW8veC1hZHBjbS1kdmktaW1hIjsKKwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzZTQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9wdXNIZWFkZXIiCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZSkgeworICAgICAgICBBTE9HVigiSGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+Y2hhbm5lbHMgPSBkYXRhW2tPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXRdOworCisgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPCAxIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCBiYWQgY2hhbm5lbCBjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPnNraXBfc2FtcGxlcyA9IFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCk7CisgICAgaGVhZGVyLT5nYWluX2RiID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlckdhaW5PZmZzZXQpKTsKKyAgICBoZWFkZXItPmNoYW5uZWxfbWFwcGluZyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldF07CisgICAgaWYgKCFoZWFkZXItPmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIG1pc3Npbmcgc3RyZWFtIG1hcC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gMTsKKyAgICAgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGhlYWRlci0+Y2hhbm5lbHMgPiAxOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMF0gPSAwOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMV0gPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBzdHJlYW0gbWFwOyBpbnN1ZmZpY2llbnQgZGF0YSBmb3IgY3VycmVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgImNvdW50OiAlZCIsCisgICAgICAgICAgICAgIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSBkYXRhW2tPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldF07CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGRhdGFba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF07CisgICAgaWYgKGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXItPmNoYW5uZWxzOyArK2kpCisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFtpXSA9IGRhdGFba09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpXTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpIHsKKyAgICAvLyBTZWUgaHR0cHM6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0ga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXIuY2hhbm5lbHM7CisgICAgaWYgKG91dHB1dF9zaXplIDwgdG90YWxfc2l6ZSkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgZm9yIGhlYWRlci4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGVuc3VyZSBlbnRpcmUgaGVhZGVyIGlzIGNsZWFyZWQsIGV2ZW4gdGhvdWdoIHdlIG92ZXJ3cml0ZSBtdWNoIG9mIGl0IGJlbG93CisgICAgbWVtc2V0KG91dHB1dCwgMCwgb3V0cHV0X3NpemUpOworCisgICAgLy8gU2V0IG1hZ2ljIHNpZ25hdHVyZS4KKyAgICBtZW1jcHkob3V0cHV0ICsga09wdXNIZWFkZXJMYWJlbE9mZnNldCwgIk9wdXNIZWFkIiwgOCk7CisgICAgLy8gU2V0IE9wdXMgdmVyc2lvbi4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJWZXJzaW9uT2Zmc2V0XSA9IDE7CisgICAgLy8gU2V0IGNoYW5uZWwgY291bnQuCisgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXRdID0gKHVpbnQ4X3QpaGVhZGVyLmNoYW5uZWxzOworICAgIC8vIFNldCBwcmUtc2tpcAorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0LCAmaGVhZGVyLnNraXBfc2FtcGxlcywgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgLy8gU2V0IG9yaWdpbmFsIGlucHV0IHNhbXBsZSByYXRlIGluIEh6LgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlclNhbXBsZVJhdGVPZmZzZXQsICZpbnB1dF9zYW1wbGVfcmF0ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgLy8gU2V0IG91dHB1dCBnYWluIGluIGRCLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckdhaW5PZmZzZXQsICZoZWFkZXIuZ2Fpbl9kYiwgc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBpZiAoaGVhZGVyLmNoYW5uZWxzID4gMikgeworICAgICAgICAvLyBTZXQgY2hhbm5lbCBtYXBwaW5nCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XSA9IDE7CisgICAgICAgIC8vIEFzc3VtaW5nIG5vIGNvdXBsZWQgc3RyZWFtcy4gVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUKKyAgICAgICAgLy8gY2hhbm5lbHMoKSAtIHxjb3VwbGVkX3N0cmVhbXN8LgorICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XSA9IGhlYWRlci5jaGFubmVsczsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyTnVtQ291cGxlZFN0cmVhbXNPZmZzZXRdID0gMDsKKworICAgICAgICAvLyBTZXQgdGhlIGFjdHVhbCBzdHJlYW0gbWFwLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci5jaGFubmVsczsgKytpKSB7CisgICAgICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpXSA9IGtPcHVzQ2hhbm5lbE1hcFtoZWFkZXIuY2hhbm5lbHMgLSAxXVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXIuY2hhbm5lbHMgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XSA9IDA7CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ICsgMTsKKyAgICB9Cit9CisKK2ludCBXcml0ZU9wdXNIZWFkZXJzKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dFNpemUsIHVpbnQ2NF90IGNvZGVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWVrUHJlUm9sbCkgeworICAgIGlmIChvdXRwdXRTaXplIDwgQU9QVVNfVU5JRklFRF9DU0RfTUlOU0laRSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB1bmlmaWVkIE9QVVMgQ1NEIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IGhlYWRlckxlbiA9IDA7CisKKyAgICAvLyBBZGQgb3B1cyBoZWFkZXIKKyAgICAvKgorICAgICAgRm9sbG93aW5nIGlzIHRoZSBDU0Qgc3ludGF4IGZvciBzaWduYWxsaW5nIE9wdXNIZWFkZXIKKyAgICAgIChodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcikKKworICAgICAgTWFya2VyICg4IGJ5dGVzKSB8IExlbmd0aCAoOCBieXRlcykgfCBPcHVzSGVhZGVyCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiAtIFNpZ25hbHMgT3B1cyBIZWFkZXIKKworICAgICAgTGVuZ3RoIHNob3VsZCBiZSBhIHZhbHVlIHdpdGhpbiBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIGFuZCBBT1BVU19PUFVTSEVBRF9NQVhTSVpFLgorICAgICovCisKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX01BUktFUl9TSVpFOworCisgICAgLy8gUGxhY2UgaG9sZGVyIGZvciBvcHVzSGVhZGVyIFNpemUKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTEVOR1RIX1NJWkU7CisKKyAgICBpbnQgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcihoZWFkZXIsIGlucHV0U2FtcGxlUmF0ZSwgb3V0cHV0ICsgaGVhZGVyTGVuLAorICAgICAgICBvdXRwdXRTaXplIC0gaGVhZGVyTGVuKTsKKyAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgQUxPR0QoIiVzOiBXcml0ZU9wdXNIZWFkZXIgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGhlYWRlckxlbiArPSBoZWFkZXJTaXplOworCisgICAgLy8gVXBkYXRlIG9wdXMgaGVhZGVyU2l6ZSBhZnRlciBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSCisgICAgdWludDY0X3QgbGVuZ3RoID0gaGVhZGVyU2l6ZTsKKyAgICBtZW1jcHkob3V0cHV0ICsgQU9QVVNfTUFSS0VSX1NJWkUsICZsZW5ndGgsIEFPUFVTX0xFTkdUSF9TSVpFKTsKKworICAgIC8qCisgICAgICBGb2xsb3dpbmcgaXMgdGhlIENTRCBzeW50YXggZm9yIHNpZ25hbGxpbmcgY29kZWMgZGVsYXkgYW5kCisgICAgICBzZWVrIHByZS1yb2xsIHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIGFmdGVyIE9wdXNIZWFkZXIKKworICAgICAgTWFya2VyICg4IGJ5dGVzKSB8IExlbmd0aCAoOCBieXRlcykgfCBTYW1wbGVzIGluIG5zICg4IGJ5dGVzKQorCisgICAgICBNYXJrZXJzIHN1cHBvcnRlZDoKKyAgICAgIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIgLSBjb2RlYyBkZWxheSBhcyBzYW1wbGVzIGluIG5zLCByZXByZXNlbnRlZCBpbiA4IGJ5dGVzCisgICAgICBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiAtIHByZXJvbGwgYWRqdXN0bWVudCBhcyBzYW1wbGVzIGluIG5zLCByZXByZXNlbnRlZCBpbiA4IGJ5dGVzCisKKyAgICAqLworICAgIGxlbmd0aCA9IHNpemVvZihjb2RlY0RlbGF5KTsKKyAgICBpZiAoaGVhZGVyTGVuID4gKG91dHB1dFNpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFIC0gbGVuZ3RoKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb2RlYyBkZWxheSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIEFkZCBjb2RlYyBkZWxheQorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmY29kZWNEZWxheSwgbGVuZ3RoKTsKKyAgICBoZWFkZXJMZW4gKz0gbGVuZ3RoOworCisgICAgbGVuZ3RoID0gc2l6ZW9mKHNlZWtQcmVSb2xsKTsKKyAgICBpZiAoaGVhZGVyTGVuID4gKG91dHB1dFNpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFIC0gbGVuZ3RoKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzZWVrIHByZSByb2xsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gQWRkIHNraXAgcHJlIHJvbGwKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19NQVJLRVJfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmbGVuZ3RoLCBBT1BVU19MRU5HVEhfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX0xFTkdUSF9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZzZWVrUHJlUm9sbCwgbGVuZ3RoKTsKKyAgICBoZWFkZXJMZW4gKz0gbGVuZ3RoOworCisgICAgcmV0dXJuIGhlYWRlckxlbjsKK30KKworYm9vbCBJc09wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChkYXRhX3NpemUgPCBBT1BVU19NQVJLRVJfU0laRSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICFtZW1jbXAoZGF0YSwgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworfQorCitib29sIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKSB7CisgICAgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICpjb2RlY0RlbGF5U2l6ZSA9IDA7CisgICAgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKyAgICAqc2Vla1ByZVJvbGxTaXplID0gMDsKKyAgICAqb3B1c0hlYWRCdWYgPSBOVUxMOworICAgICpvcHVzSGVhZFNpemUgPSAwOworCisgICAgLy8gQU9QVVNfTUFSS0VSX1NJWkUgaXMgOCAiT3B1c0hlYWQiIGlzIG9mIHNpemUgOAorICAgIGlmIChkYXRhX3NpemUgPCA4KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgQ1NEIGlzIGluIGxlZ2FjeSBmb3JtYXQKKyAgICBpZiAoIW1lbWNtcCgiT3B1c0hlYWQiLCBkYXRhLCA4KSkgeworICAgICAgICBpZiAoZGF0YV9zaXplIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fCBkYXRhX3NpemUgPiBBT1BVU19PUFVTSEVBRF9NQVhTSVpFKSB7CisgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBvcHVzSGVhZFNpemUgJXp1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3B1c0hlYWRCdWYgPSAodm9pZCAqKWRhdGE7CisgICAgICAgICpvcHVzSGVhZFNpemUgPSBkYXRhX3NpemU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAobWVtY21wKEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYLCBkYXRhLCBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWF9TSVpFKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoaSA8PSBkYXRhX3NpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFKSB7CisgICAgICAgICAgICB1aW50OF90ICpjc2RCdWYgPSAodWludDhfdCAqKWRhdGEgKyBpOworICAgICAgICAgICAgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fCB2YWx1ZSA+IEFPUFVTX09QVVNIRUFEX01BWFNJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3Igb3B1c0hlYWRTaXplICUiIFBSSXU2NCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRSArIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJNYXJrZXIgc2lnbmFscyBhIGhlYWRlciB0aGF0IGlzIGxhcmdlciB0aGFuIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9wdXNIZWFkQnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRTaXplID0gdmFsdWU7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGNzZEJ1ZiwgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIGNvZGVjRGVsYXkgJSIgUFJJdTY0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFICsgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1hcmtlciBzaWduYWxzIGEgaGVhZGVyIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29kZWNEZWxheUJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKmNvZGVjRGVsYXlTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIHNlZWtQcmVSb2xsU2l6ZSAlIiBQUkl1NjQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkUgKyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWFya2VyIHNpZ25hbHMgYSBoZWFkZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBpbnB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpzZWVrUHJlUm9sbEJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsU2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGl0IGlzbid0IGluIGVpdGhlciBmb3JtYXQKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlhZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQYXJzZWRNZXNzYWdlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxQYXJzZWRNZXNzYWdlPiBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpIHsKLSAgICBzcDxQYXJzZWRNZXNzYWdlPiBtc2cgPSBuZXcgUGFyc2VkTWVzc2FnZTsKLSAgICBzc2l6ZV90IHJlcyA9IG1zZy0+cGFyc2UoZGF0YSwgc2l6ZSwgbm9Nb3JlRGF0YSk7Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAqbGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmxlbmd0aCA9IHJlczsKLSAgICByZXR1cm4gbXNnOwotfQotCi1QYXJzZWRNZXNzYWdlOjpQYXJzZWRNZXNzYWdlKCkgewotfQotCi1QYXJzZWRNZXNzYWdlOjp+UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBrZXkgPSBuYW1lOwotICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbURpY3QuaW5kZXhPZktleShrZXkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnZhbHVlID0gbURpY3QudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLQotICAgIGlmICghZmluZFN0cmluZyhuYW1lLCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyICpQYXJzZWRNZXNzYWdlOjpnZXRDb250ZW50KCkgY29uc3QgewotICAgIHJldHVybiBtQ29udGVudC5jX3N0cigpOwotfQotCi1zc2l6ZV90IFBhcnNlZE1lc3NhZ2U6OnBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpIHsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGxhc3REaWN0SW5kZXggPSAtMTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGJvb2wgaGVhZGVyc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGxpbmVFbmRPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIHdoaWxlIChsaW5lRW5kT2Zmc2V0ICsgMSA8IHNpemUKLSAgICAgICAgICAgICAgICAmJiAoZGF0YVtsaW5lRW5kT2Zmc2V0XSAhPSAnXHInCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBkYXRhW2xpbmVFbmRPZmZzZXQgKyAxXSAhPSAnXG4nKSkgewotICAgICAgICAgICAgKytsaW5lRW5kT2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgKyAxID49IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgbGluZSgmZGF0YVtvZmZzZXRdLCBsaW5lRW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSByZXF1ZXN0L3N0YXR1cyBsaW5lLgotCi0gICAgICAgICAgICBtRGljdC5hZGQoQVN0cmluZygiXyIpLCBsaW5lKTsKLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ID09IG9mZnNldCkgewotICAgICAgICAgICAgLy8gQW4gZW1wdHkgbGluZSBzZXBhcmF0ZXMgaGVhZGVycyBmcm9tIGJvZHkuCi0gICAgICAgICAgICBoZWFkZXJzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lLmNfc3RyKClbMF0gPT0gJyAnIHx8IGxpbmUuY19zdHIoKVswXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBmb2xkZWQgaGVhZGVyIHZhbHVlcy4KLQotICAgICAgICAgICAgaWYgKGxhc3REaWN0SW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIG1hbGZvcm1lZCBzaW5jZSB0aGUgZmlyc3QgaGVhZGVyIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY29udGludWUgYW55dGhpbmcuLi4KLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgJnZhbHVlID0gbURpY3QuZWRpdFZhbHVlQXQobGFzdERpY3RJbmRleCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBjb2xvblBvcyA9IGxpbmUuZmluZCgiOiIpOwotICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkgewotICAgICAgICAgICAgQVN0cmluZyBrZXkobGluZSwgMCwgY29sb25Qb3MpOwotICAgICAgICAgICAga2V5LnRyaW0oKTsKLSAgICAgICAgICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICAgICAgICAgIGxpbmUuZXJhc2UoMCwgY29sb25Qb3MgKyAxKTsKLQotICAgICAgICAgICAgbGFzdERpY3RJbmRleCA9IG1EaWN0LmFkZChrZXksIGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgfQotCi0gICAgaWYgKCFoZWFkZXJzQ29tcGxldGUgJiYgKCFub01vcmVEYXRhIHx8IG9mZnNldCA9PSAwKSkgewotICAgICAgICAvLyBXZSBlaXRoZXIgc2F3IHRoZSBlbXB0eSBsaW5lIHNlcGFyYXRpbmcgaGVhZGVycyBmcm9tIGJvZHkKLSAgICAgICAgLy8gb3Igd2Ugc2F3IGF0IGxlYXN0IHRoZSBzdGF0dXMgbGluZSBhbmQga25vdyB0aGF0IG5vIG1vcmUgZGF0YQotICAgICAgICAvLyBpcyBnb2luZyB0byBmb2xsb3cuCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1EaWN0LmVkaXRWYWx1ZUF0KGkpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGNvbnRlbnRMZW5ndGg7Ci0gICAgaWYgKCFmaW5kSW50MzIoImNvbnRlbnQtbGVuZ3RoIiwgJmNvbnRlbnRMZW5ndGgpIHx8IGNvbnRlbnRMZW5ndGggPCAwKSB7Ci0gICAgICAgIGNvbnRlbnRMZW5ndGggPSAwOwotICAgIH0KLQotICAgIHNpemVfdCB0b3RhbExlbmd0aCA9IG9mZnNldCArIGNvbnRlbnRMZW5ndGg7Ci0KLSAgICBpZiAoc2l6ZSA8IHRvdGFsTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtQ29udGVudC5zZXRUbygmZGF0YVtvZmZzZXRdLCBjb250ZW50TGVuZ3RoKTsKLQotICAgIHJldHVybiB0b3RhbExlbmd0aDsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIHNpemVfdCBwcmV2T2Zmc2V0ID0gMDsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPj0gbGluZS5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChzcGFjZVBvcyA8IDApIHsKLSAgICAgICAgICAgIHNwYWNlUG9zID0gbGluZS5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2T2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBvZmZzZXQgPSBzcGFjZVBvcyArIDE7Ci0gICAgfQotCi0gICAgZmllbGQtPnNldFRvKGxpbmUsIHByZXZPZmZzZXQsIG9mZnNldCAtIHByZXZPZmZzZXQgLSAxKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RhdHVzQ29kZVN0cmluZzsKLSAgICBpZiAoIWdldFJlcXVlc3RGaWVsZCgxLCAmc3RhdHVzQ29kZVN0cmluZykpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICpzdGF0dXNDb2RlID0gc3RydG9sKHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpCi0gICAgICAgICAgICB8fCAoKnN0YXR1c0NvZGUpIDwgMTAwIHx8ICgqc3RhdHVzQ29kZSkgPiA5OTkpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUFTdHJpbmcgUGFyc2VkTWVzc2FnZTo6ZGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSA9IG1EaWN0LmtleUF0KGkpOwotICAgICAgICBjb25zdCBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSBBU3RyaW5nKCJfIikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGluZS5hcHBlbmQoa2V5KTsKLSAgICAgICAgbGluZS5hcHBlbmQoIjogIik7Ci0gICAgICAgIGxpbmUuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgbGluZS5hcHBlbmQobUNvbnRlbnQpOwotCi0gICAgcmV0dXJuIGxpbmU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKLSAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgIHNpemVfdCBrZXlMZW4gPSBzdHJsZW4oa2V5KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnMpKSB7Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOwotCi0gICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOwotCi0gICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgewotICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPSBjb2xvblBvcyArIDE7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpIHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotICAgIGlmICghR2V0QXR0cmlidXRlKHMsIGtleSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IDhmMzI1ODIuLjgzNGI4OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTI4LDE0ICsyOCwzMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBzaXplX3QgYnVmU2l6ZSA9IG4gLyA0ICogMzsKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihidWZTaXplKTsKKworICAgIGlmIChkZWNvZGVCYXNlNjQoYnVmLT5kYXRhKCksICZidWZTaXplLCBzLmNfc3RyKCkpKSB7CisgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgYnVmU2l6ZSk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKSB7CisgICAgc2l6ZV90IG4gPSBzdHJsZW4ocyk7CisKKyAgICBpZiAoKG4gJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgcGFkZGluZyA9IDA7Ci0gICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgIGlmIChuID49IDEgJiYgc1tuIC0gMV0gPT0gJz0nKSB7CiAgICAgICAgIHBhZGRpbmcgPSAxOwogCi0gICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgaWYgKG4gPj0gMiAmJiBzW24gLSAyXSA9PSAnPScpIHsKICAgICAgICAgICAgIHBhZGRpbmcgPSAyOwogCi0gICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHNbbiAtIDNdID09ICc9JykgewogICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NSwxNSArNjIsMTMgQEAKICAgICAvLyBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IG4gJSA0ID09IDAuCiAgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKIAotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7Ci0gICAgdWludDhfdCAqb3V0ID0gYnVmZmVyLT5kYXRhKCk7Ci0gICAgaWYgKG91dCA9PSBOVUxMIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgb3V0TGVuKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvdXQgPT0gTlVMTCB8fCAqaW5PdXRCdWZTaXplIDwgb3V0TGVuKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc2l6ZV90IGogPSAwOwogICAgIHVpbnQzMl90IGFjY3VtID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIGNoYXIgYyA9IHNbaV07CiAgICAgICAgIHVuc2lnbmVkIHZhbHVlOwogICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKICAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKQEAgLTY2LDEwICs4MSwxMCBAQAogICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IDYzOwogICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhbHVlID0gMDsKQEAgLTg2LDcgKzEwMSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gYnVmZmVyOworICAgICppbk91dEJ1ZlNpemUgPSBqOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgY2hhciBlbmNvZGU2Qml0KHVuc2lnbmVkIHgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oCmluZGV4IDg1ZTQzNzguLmM2YzEyZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURhdGEuaApAQCAtNzc0LDcgKzc3NCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICAqLwotICAgICAgICBDdXN0b20mIG9wZXJhdG9yPShDdXN0b20gJiZvKSB7CisgICAgICAgIEN1c3RvbSYgb3BlcmF0b3I9KEN1c3RvbSAmJm8pIG5vZXhjZXB0IHsKICAgICAgICAgICAgIGlmICgmbyAhPSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnVzZWQoKSAmJiAhdGhpcy0+Y2xlYXIoKSkgewogICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOwpAQCAtNzk1LDcgKzc5NSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBNb3ZlIGNvbnN0cnVjdG9yLgogICAgICAgICAgKi8KLSAgICAgICAgQ3VzdG9tKEN1c3RvbSAmJm8pIDogQ3VzdG9tKCkgeworICAgICAgICBDdXN0b20oQ3VzdG9tICYmbykgbm9leGNlcHQgOiBDdXN0b20oKSB7CiAgICAgICAgICAgICAqdGhpcyA9IHN0ZDo6bW92ZShvKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCmluZGV4IGJhYzhmYTkuLmFiMTdhMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oCkBAIC01Myw5ICs1MywxMSBAQAogI2RlZmluZSBMSVRFUkFMX1RPX1NUUklOR19JTlRFUk5BTCh4KSAgICAjeAogI2RlZmluZSBMSVRFUkFMX1RPX1NUUklORyh4KSBMSVRFUkFMX1RPX1NUUklOR19JTlRFUk5BTCh4KQogCi0jaWZkZWYgQ0hFQ0sKLSN1bmRlZiBDSEVDSwotI2VuZGlmCisvLyBhbGxvdyB0byB1c2UgQ0hFQ0tfT1AgZnJvbSBhbmRyb2lkLWJhc2UvbG9nZ2luZy5oCisvLyBUT0RPOiBsb25ndGVybSByZXBsYWNlIHRoaXMgd2l0aCBhbmRyb2lkLWJhc2UvbG9nZ2luZy5oLCBidXQgdGhlcmUgYXJlIHNvbWUgbnVhbmNlcywgZS5nLgorLy8gYW5kcm9pZC1iYXNlIENIRUNLX09QIHJlcXVpcmVzIGEgY29weSBjb25zdHJ1Y3Rvciwgd2hlcmVhcyB3ZSBkb24ndC4KKyNpZm5kZWYgQ0hFQ0tfT1AKKwogI2RlZmluZSBDSEVDSyhjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICEoY29uZGl0aW9uKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjMsNTEgKzY1LDIxIEBACiAgICAgICAgICAgICBfX0ZJTEVfXyAiOiIgTElURVJBTF9UT19TVFJJTkcoX19MSU5FX18pICAgIFwKICAgICAgICAgICAgICIgQ0hFQ0soIiAjY29uZGl0aW9uICIpIGZhaWxlZC4iKQogCi0jZGVmaW5lIE1BS0VfQ09NUEFSQVRPUihzdWZmaXgsb3ApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGU8Y2xhc3MgQSwgY2xhc3MgQj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQVN0cmluZyBDb21wYXJlXyMjc3VmZml4KGNvbnN0IEEgJmEsIGNvbnN0IEIgJmIpIHsgICAgICBcCi0gICAgICAgIEFTdHJpbmcgcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghKGEgb3AgYikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByZXMuYXBwZW5kKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByZXMuYXBwZW5kKCIgdnMuICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByZXMuYXBwZW5kKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1NQUtFX0NPTVBBUkFUT1IoRVEsPT0pCi1NQUtFX0NPTVBBUkFUT1IoTkUsIT0pCi1NQUtFX0NPTVBBUkFUT1IoTEUsPD0pCi1NQUtFX0NPTVBBUkFUT1IoR0UsPj0pCi1NQUtFX0NPTVBBUkFUT1IoTFQsPCkKLU1BS0VfQ09NUEFSQVRPUihHVCw+KQotCi0jaWZkZWYgQ0hFQ0tfT1AKLSN1bmRlZiBDSEVDS19PUAotI2VuZGlmCi0KICNkZWZpbmUgQ0hFQ0tfT1AoeCx5LHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQVN0cmluZyBfX19yZXMgPSBDb21wYXJlXyMjc3VmZml4KHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKCFfX19yZXMuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgYXV0byAmYSA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgYXV0byAmYiA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoYSBvcCBiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIEFTdHJpbmcgX19fZnVsbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBfX0ZJTEVfXyAiOiIgTElURVJBTF9UT19TVFJJTkcoX19MSU5FX18pICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgIiBDSEVDS18iICNzdWZmaXggIiggIiAjeCAiLCIgI3kgIikgZmFpbGVkOiAiOyAgICAgIFwKLSAgICAgICAgICAgIF9fX2Z1bGwuYXBwZW5kKF9fX3Jlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fX2Z1bGwuYXBwZW5kKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fX2Z1bGwuYXBwZW5kKCIgdnMuICIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fX2Z1bGwuYXBwZW5kKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIiwgX19fZnVsbC5jX3N0cigpKTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlIChmYWxzZSkKIAotI2lmZGVmIENIRUNLX0VRCi0jdW5kZWYgQ0hFQ0tfRVEKLSN1bmRlZiBDSEVDS19ORQotI3VuZGVmIENIRUNLX0xFCi0jdW5kZWYgQ0hFQ0tfTFQKLSN1bmRlZiBDSEVDS19HRQotI3VuZGVmIENIRUNLX0dUCi0jZW5kaWYKLQogI2RlZmluZSBDSEVDS19FUSh4LHkpICAgQ0hFQ0tfT1AoeCx5LEVRLD09KQogI2RlZmluZSBDSEVDS19ORSh4LHkpICAgQ0hFQ0tfT1AoeCx5LE5FLCE9KQogI2RlZmluZSBDSEVDS19MRSh4LHkpICAgQ0hFQ0tfT1AoeCx5LExFLDw9KQpAQCAtMTE1LDYgKzg3LDggQEAKICNkZWZpbmUgQ0hFQ0tfR0UoeCx5KSAgIENIRUNLX09QKHgseSxHRSw+PSkKICNkZWZpbmUgQ0hFQ0tfR1QoeCx5KSAgIENIRUNLX09QKHgseSxHVCw+KQogCisjZW5kaWYKKwogI2RlZmluZSBUUkVTUEFTUyguLi4pIFwKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBfX0ZJTEVfXyAiOiIgTElURVJBTF9UT19TVFJJTkcoX19MSU5FX18pICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZWJhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNkZWZpbmUgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYSBudW1iZXIgb2YgbGl2ZSBzb2NrZXRzIChkYXRhZ3JhbSBhbmQgc3RyZWFtLWJhc2VkKQotLy8gb24gYSBzaW5nbGUgdGhyZWFkLiBDbGllbnRzIGFyZSBub3RpZmllZCBhYm91dCBhY3Rpdml0eSB0aHJvdWdoIEFNZXNzYWdlcy4KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQU5ldHdvcmtTZXNzaW9uKCk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvLyBwYXNzaXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIC8vIGFjdGl2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplID0gLTEsCi0gICAgICAgICAgICBib29sIHRpbWVWYWxpZCA9IGZhbHNlLCBpbnQ2NF90IHRpbWVVcyA9IC0xbGwpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gTm90aWZpY2F0aW9uUmVhc29uIHsKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0Q2xpZW50Q29ubmVjdGVkLAotICAgICAgICBrV2hhdERhdGEsCi0gICAgICAgIGtXaGF0RGF0YWdyYW0sCi0gICAgICAgIGtXaGF0QmluYXJ5RGF0YSwKLSAgICAgICAga1doYXRXZWJTb2NrZXRNZXNzYWdlLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU5ldHdvcmtTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IE5ldHdvcmtUaHJlYWQ7Ci0gICAgc3RydWN0IFNlc3Npb247Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBzcDxUaHJlYWQ+IG1UaHJlYWQ7Ci0KLSAgICBpbnQzMl90IG1OZXh0U2Vzc2lvbklEOwotCi0gICAgaW50IG1QaXBlRmRbMl07Ci0KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKLQotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgfTsKLSAgICBzdGF0dXNfdCBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgdm9pZCB0aHJlYWRMb29wKCk7Ci0gICAgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5ldHdvcmtTZXNzaW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQV9ORVRXT1JLX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAppbmRleCBmZjA4NmIzLi4wZjYyOTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC05Myw3ICs5Myw3IEBACiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtFbXB0eVN0cmluZzsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtFbXB0eVN0cmluZyA9ICIiOwogCiAgICAgY2hhciAqbURhdGE7CiAgICAgc2l6ZV90IG1TaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ0ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKyNkZWZpbmUgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gQXVkaW9QcmVzZW50YXRpb25WZXJzaW9uIHsKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQgPSAwLAorICAgIFBSRVNFTlRBVElPTl9WRVJTSU9OXzEsCit9OworCitlbnVtIE1hc3RlcmluZ0luZGljYXRpb24geworICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAorICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCisgICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAorICAgIE1BU1RFUkVEX0ZPUl8zRCwKKyAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAorfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIHsKKyAgICB1aW50MzJfdCBtVmVyc2lvbiA9IFBSRVNFTlRBVElPTl9WRVJTSU9OX1VOREVGSU5FRDsKKyAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZCA9IC0xOworICAgIGludDMyX3QgbVByb2dyYW1JZCA9IC0xOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbUxhYmVsczsKKyAgICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2U7CisgICAgTWFzdGVyaW5nSW5kaWNhdGlvbiBtTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUklOR19OT1RfSU5ESUNBVEVEOworICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gZmFsc2U7Cit9OworCitzdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb25WMSA6IHB1YmxpYyBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgQXVkaW9QcmVzZW50YXRpb25WMSgpIHsKKyAgICAgICAgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xOworICAgIH0KK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8QXVkaW9QcmVzZW50YXRpb24+IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbjsKKwordm9pZCBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0qIHNlcmlhbGl6ZWRPdXRwdXQpOworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoc3RkOjppc3RyZWFtKiBzZXJpYWxpemVkSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCmluZGV4IGQ2Yzc2OGQuLmNkMGFmMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDb2xvclV0aWxzIHsKQEAgLTEzNSw2ICsxMzcsOSBAQAogICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKICAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IHRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCiAgICAgICAgICAgICBDb2xvckFzcGVjdHMgJmFzcGVjdHMpOworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaXNvdHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICp0cmFuc2Zlcik7CiAKICAgICAvLyB1bnBhY2sgYSB1aW50MzJfdCB0byBhIGZ1bGwgQ29sb3JBc3BlY3RzIHN0cnVjdAogICAgIHN0YXRpYyBDb2xvckFzcGVjdHMgdW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKTsKQEAgLTE4MCw2ICsxODUsOCBAQAogCiAgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KKyAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKGFuZHJvaWQ6OkNvbG9yVXRpbHM6OkNvbG9yU3RhbmRhcmQgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAppbmRleCAyNWJlODlmLi4xZjllNjM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CkBAIC0zMyw2ICszNCwxMCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT047CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlg7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fWFZJRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRzsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CkBAIC01Miw3ICs1NywxNCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUE7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ007CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTTsKKwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmgKaW5kZXggMTQzYjE0MC4uMDM3MjBmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgY2xhc3MgTG9ja2VkIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGlubGluZSBMb2NrZWQoTXV0ZXhlZDxUPiAmbVBhcmVudCk7Ci0gICAgICAgIGlubGluZSBMb2NrZWQoTG9ja2VkICYmZnJvbSkgOgorICAgICAgICBpbmxpbmUgTG9ja2VkKExvY2tlZCAmJmZyb20pIG5vZXhjZXB0IDoKICAgICAgICAgICAgIG1Mb2NrKGZyb20ubUxvY2spLAogICAgICAgICAgICAgbVRyZWFzdXJlKGZyb20ubVRyZWFzdXJlKSwKICAgICAgICAgICAgIG1Mb2NrZWQoZnJvbS5tTG9ja2VkKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDM3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIE9QVVNfSEVBREVSX0hfCisjZGVmaW5lIE9QVVNfSEVBREVSX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQ29uc3RhbnRzIHVzZWQgZm9yIGRlbGltaXRpbmcgT3B1cyBDU0QgKi8KKyNkZWZpbmUgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVggIkFPUFVTIgorI2RlZmluZSBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWF9TSVpFIChzaXplb2YoQU9QVVNfQ1NEX01BUktFUl9QUkVGSVgpIC0gMSkKKyNkZWZpbmUgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiSERSIgorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJETFkiCisjZGVmaW5lIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJQUkwiCisjZGVmaW5lIEFPUFVTX01BUktFUl9TSVpFIDgKKyNkZWZpbmUgQU9QVVNfTEVOR1RIX1NJWkUgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfU0laRSBcCisgICAgIChBT1BVU19NQVJLRVJfU0laRSkgKyAoQU9QVVNfTEVOR1RIX1NJWkUpICsgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfU0VFS19QUkVST0xMX1NJWkUgXAorICAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIHNpemVvZih1aW50NjRfdCkKKworLyogT3B1c0hlYWQgY3NkIG1pbmltdW0gc2l6ZSBpcyAxOSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIDE5CisjZGVmaW5lIEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFIFwKKyAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIChBT1BVU19PUFVTSEVBRF9NSU5TSVpFKQorCisjZGVmaW5lIEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUgXAorICAgICgoQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX0NPREVDX0RFTEFZX1NJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9TSVpFKSkKKworLyogT3B1c0hlYWQgY3NkIGF0IG1heCBjYW4gYmUgQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUgKyAyICsgbWF4IG51bWJlciBvZiBjaGFubmVscyAoMjU1KSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NQVhTSVpFICgoQU9QVVNfT1BVU0hFQURfTUlOU0laRSkgKyAyICsgMjU1KQorI2RlZmluZSBBT1BVU19DU0RfT1BVU0hFQURfTUFYU0laRSBcCisgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyAoQU9QVVNfT1BVU0hFQURfTUFYU0laRSkKKworI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NQVhTSVpFIFwKKyAgICAoKEFPUFVTX0NTRF9PUFVTSEVBRF9NQVhTSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfU0laRSkpCisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IG51bV9jb3VwbGVkOworICAgIGludDE2X3QgZ2Fpbl9kYjsKKyAgICBpbnQgc2tpcF9zYW1wbGVzOworICAgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcik7CitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLCB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSk7Citib29sIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKTsKK2ludCBXcml0ZU9wdXNIZWFkZXJzKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dFNpemUsIHVpbnQ2NF90IGNvZGVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWVrUHJlUm9sbCk7Citib29sIElzT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT1BVU19IRUFERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0M2E5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEVuY2Fwc3VsYXRlcyBhbiAiSFRUUC9SVFNQIHN0eWxlIiByZXNwb25zZSwgaS5lLiBhIHN0YXR1cyBsaW5lLAotLy8ga2V5L3ZhbHVlIHBhaXJzIG1ha2luZyB1cCB0aGUgaGVhZGVycyBhbmQgYW4gb3B0aW9uYWwgYm9keS9jb250ZW50Lgotc3RydWN0IFBhcnNlZE1lc3NhZ2UgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpOwotCi0gICAgYm9vbCBmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7Ci0KLSAgICBjb25zdCBjaGFyICpnZXRDb250ZW50KCkgY29uc3Q7Ci0KLSAgICBib29sIGdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdDsKLSAgICBib29sIGdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3Q7Ci0KLSAgICBBU3RyaW5nIGRlYnVnU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSk7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpOwotCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJzZWRNZXNzYWdlKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbURpY3Q7Ci0gICAgQVN0cmluZyBtQ29udGVudDsKLQotICAgIFBhcnNlZE1lc3NhZ2UoKTsKLQotICAgIHNzaXplX3QgcGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZWRNZXNzYWdlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCmluZGV4IGFiYzk1ZTAuLjYwZmI5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCkBAIC0yNiw2ICsyNiw5IEBACiBzdHJ1Y3QgQVN0cmluZzsKIAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOworCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKTsKKwogdm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CiAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCmluZGV4IDJlNDlmYzQuLjg2NTVjYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKQEAgLTI5LDkgKzI5LDYgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU3YzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhck1lZGlhSFRUUDo6Q2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCisgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSB7Cit9CisKK0NsZWFyTWVkaWFIVFRQOjp+Q2xlYXJNZWRpYUhUVFAoKSB7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICBtTGFzdFVSSSA9IHVyaTsKKyAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKKyAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCisgICAgdXJpID0gTlVMTDsKKworICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7CisKKyAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOworCisgICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOworCisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJDbGVhck1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBtTmFtZSA9IFN0cmluZzgoIkNsZWFyTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3NpemVfdCBDbGVhck1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQorICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KKworICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgeworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOworCisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKK30KKwordWludDMyX3QgQ2xlYXJNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKK30KKworCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgfQorCisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcAppbmRleCA3Nzg0NWUyLi5iODk1ZjAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAKQEAgLTQyLDExICs0MiwxMSBAQAogICAgICAgICAgICAgZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIikpOwogICAgIENIRUNLKGNsYXp6LmdldCgpICE9IE5VTEwpOwogCi0gICAgam1ldGhvZElEIGNvbnN0cnVjdElEID0gZW52LT5HZXRNZXRob2RJRChjbGF6ei5nZXQoKSwgIjxpbml0PiIsICIoKVYiKTsKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0SUQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiPGluaXQ+IiwgIihMamF2YS91dGlsL0xpc3Q7KVYiKTsKICAgICBDSEVDSyhjb25zdHJ1Y3RJRCAhPSBOVUxMKTsKIAogICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+IGh0dHBTZXJ2aWNlT2JqKAotICAgICAgICAgICAgZW52LCBlbnYtPk5ld09iamVjdChjbGF6ei5nZXQoKSwgY29uc3RydWN0SUQpKTsKKyAgICAgICAgICAgIGVudiwgZW52LT5OZXdPYmplY3QoY2xhenouZ2V0KCksIGNvbnN0cnVjdElELCBOVUxMKSk7CiAKICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CiAgICAgaWYgKGh0dHBTZXJ2aWNlT2JqLmdldCgpICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA3YzkyNDdlLi4wZmJhM2RjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0zMCwxMCArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAotICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAotICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCi0gICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgIDogQ2xlYXJNZWRpYUhUVFAoY29ubiksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CiAKQEAgLTQxLDExNyArMzgsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9Ci0KLSAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOwotICAgIH0KLQotICAgIG1MYXN0VVJJID0gdXJpOwotICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAotICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KLSAgICB1cmkgPSBOVUxMOwotCi0gICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKLQotICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7Ci0KLSAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7Ci0KLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgewotICAgIG1OYW1lID0gU3RyaW5nOCgiTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXNzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKLSAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KLSAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKLQotICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQotICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KLQotICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgewotICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOwotICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOwotCi0gICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKLX0KLQotdWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOwotfQotCiAvLyBEUk0uLi4KIAogc3A8RGVjcnlwdEhhbmRsZT4gTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7CkBAIC0xNzYsMzMgKzYyLDYgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLVN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCB1cmk7Ci0gICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVUeXBlOwotfQotCiB2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgewogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDhhNzc0MDEuLmMwZWUxNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMjUsMjUgKzI1LDI2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAppbmRleCA2YzM0OTYzLi5jN2U5MmNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CkBAIC0zOCw3ICszOCw3IEBACiBIVFRQRG93bmxvYWRlcjo6SFRUUERvd25sb2FkZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpIDoKLSAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICBtSFRUUERhdGFTb3VyY2UobmV3IENsZWFyTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAogICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCiAgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpIHsKIH0KQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGlmIChyZWNvbm5lY3QpIHsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJmaWxlOi8vIiwgNykpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJsICsgNyk7CisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBDbGVhckZpbGVTb3VyY2UodXJsICsgNyk7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCiAgICAgICAgICAgICAgICAgJiYgc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDdlZmY4ZWIuLjljZjk3YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTQ0LDEwICs0NCwxMCBAQAogCiAvLyBzdGF0aWMKIC8vIEJhbmR3aWR0aCBTd2l0Y2ggTWFyayBEZWZhdWx0cwotY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFya1VzID0gMTUwMDAwMDBsbDsKLWNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtEb3duU3dpdGNoTWFya1VzID0gMjAwMDAwMDBsbDsKLWNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVcFN3aXRjaE1hcmdpblVzID0gNTAwMDAwMGxsOwotY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1Jlc3VtZVRocmVzaG9sZFVzID0gMTAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJrVXMgPSAxNTAwMDAwMExMOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a0Rvd25Td2l0Y2hNYXJrVXMgPSAyMDAwMDAwMExMOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFyZ2luVXMgPSA1MDAwMDAwTEw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprUmVzdW1lVGhyZXNob2xkVXMgPSAxMDAwMDBMTDsKIAogLy9UT0RPOiByZWRlZmluZSB0aGlzIG1hcmsgdG8gYSBmYWlyIHZhbHVlCiAvLyBkZWZhdWx0IGJ1ZmZlciB1bmRlcmZsb3cgbWFyawpAQCAtNjYsOSArNjYsOSBAQAogICAgIC8vIEJhbmR3aWR0aCBlc3RpbWF0aW9uIHBhcmFtZXRlcnMKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2hvcnRUZXJtQmFuZHdpZHRoSXRlbXMgPSAzOwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtNaW5CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPSAyMDsKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluQmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gNTAwMDAwMGxsOyAvLyA1IHNlYwotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhCYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSAzMDAwMDAwMGxsOyAvLyAzMCBzZWMKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QmFuZHdpZHRoSGlzdG9yeUFnZVVzID0gNjAwMDAwMDBsbDsgLy8gNjAgc2VjCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA9IDUwMDAwMDBMTDsgLy8gNSBzZWMKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gMzAwMDAwMDBMTDsgLy8gMzAgc2VjCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heEJhbmR3aWR0aEhpc3RvcnlBZ2VVcyA9IDYwMDAwMDAwTEw7IC8vIDYwIHNlYwogCiAgICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKICAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSgtMSksCiAgICAgICBtQ3VyQmFuZHdpZHRoSW5kZXgoLTEpLAogICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCgtMSksCi0gICAgICBtTGFzdEJhbmR3aWR0aEJwcygtMWxsKSwKKyAgICAgIG1MYXN0QmFuZHdpZHRoQnBzKC0xTEwpLAogICAgICAgbUxhc3RCYW5kd2lkdGhTdGFibGUoZmFsc2UpLAogICAgICAgbUJhbmR3aWR0aEVzdGltYXRvcihuZXcgQmFuZHdpZHRoRXN0aW1hdG9yKCkpLAogICAgICAgbU1heFdpZHRoKDcyMCksCkBAIC0yOTQsOCArMjk0LDggQEAKICAgICAgIG1Td2FwTWFzaygwKSwKICAgICAgIG1Td2l0Y2hHZW5lcmF0aW9uKDApLAogICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbigwKSwKLSAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMGxsKSwKLSAgICAgIG1SZWFsVGltZUJhc2VVcygwbGwpLAorICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwTEwpLAorICAgICAgbVJlYWxUaW1lQmFzZVVzKDBMTCksCiAgICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtVXBTd2l0Y2hNYXJrKGtVcFN3aXRjaE1hcmtVcyksCkBAIC00NDUsNyArNDQ1LDcgQEAKICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwogICAgICAgICAgICAgfTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ0cmFja0luZGV4IiwgbVBsYXlsaXN0LT5nZXRTZWxlY3RlZEluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICAidHJhY2staW5kZXgiLCBtUGxheWxpc3QtPmdldFNlbGVjdGVkSW5kZXgoKSk7CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJiYXNlVXMiLCBtUmVhbFRpbWVCYXNlVXMpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX01FVEFEQVRBKSB7CiAgICAgICAgICAgICBITFNUaW1lIG1kVGltZSgoKmFjY2Vzc1VuaXQpLT5tZXRhKCkpOwpAQCAtODQ0LDcgKzg0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIChJZiB3ZSBkb24ndCBoYXZlIHRoYXQgY3VzaGlvbiB3ZSdkIHJhdGhlciBjYW5jZWwgYW5kIHRyeSBhZ2Fpbi4pCiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hVcCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwgKyAxMDAwMDAwbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwTEwgKyAxMDAwMDAwTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwogICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRSZXN1bWVVbnRpbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gc3RvcFBhcmFtcyA9IG1zZzsKQEAgLTk1NCw3ICs5NTQsNyBAQAogCiAvLyBzdGF0aWMKIGJvb2wgTGl2ZVNlc3Npb246OmlzQmFuZHdpZHRoVmFsaWQoY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSkgewotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtCbGFja2xpc3RXaW5kb3dVcyA9IDMwMCAqIDEwMDAwMDBsbDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrQmxhY2tsaXN0V2luZG93VXMgPSAzMDAgKiAxMDAwMDAwTEw7CiAgICAgcmV0dXJuIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPCAwCiAgICAgICAgICAgICB8fCBBTG9vcGVyOjpHZXROb3dVcygpIC0gaXRlbS5tTGFzdEZhaWx1cmVVcyA+IGtCbGFja2xpc3RXaW5kb3dVczsKIH0KQEAgLTEwNjAsNyArMTA2MCw3IEBACiAgICAgICAgICAgICBCYW5kd2lkdGhJdGVtIGl0ZW07CiAKICAgICAgICAgICAgIGl0ZW0ubVBsYXlsaXN0SW5kZXggPSBpOwotICAgICAgICAgICAgaXRlbS5tTGFzdEZhaWx1cmVVcyA9IC0xbGw7CisgICAgICAgICAgICBpdGVtLm1MYXN0RmFpbHVyZVVzID0gLTFMTDsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CiAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKQEAgLTExMTQsNyArMTExNCw3IEBACiAKICAgICBtUGxheWxpc3QtPnBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIDBsbCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgZmFsc2UgLyogcGlja1RyYWNrICovKTsKKyAgICAgICAgICAgIDBMTCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgZmFsc2UgLyogcGlja1RyYWNrICovKTsKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6ZmluaXNoRGlzY29ubmVjdCgpIHsKQEAgLTExNzUsNyArMTE3NSw3IEBACiAgICAgRmV0Y2hlckluZm8gaW5mbzsKICAgICBpbmZvLm1GZXRjaGVyID0gbmV3IFBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgICAgIG5vdGlmeSwgdGhpcywgdXJpLCBtQ3VyQmFuZHdpZHRoSW5kZXgsIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwotICAgIGluZm8ubUR1cmF0aW9uVXMgPSAtMWxsOworICAgIGluZm8ubUR1cmF0aW9uVXMgPSAtMUxMOwogICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7CiAgICAgaW5mby5tVG9CZVJlc3VtZWQgPSBmYWxzZTsKICAgICBtRmV0Y2hlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGluZm8ubUZldGNoZXIpOwpAQCAtMTIzNCw3ICsxMjM0LDcgQEAKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBpbnQ2NF90IHRpbWVVcywgYm9vbCBuZXdVcmkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmkuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTEzODQsNyArMTM4NCw3IEBACiAgICAgICAgIHdoaWxlIChpbmRleCA+IGxvd2VzdEJhbmR3aWR0aCkgewogICAgICAgICAgICAgLy8gYmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQogICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGRvd24gYWdhaW4uCi0gICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHMgKiA3IC8gMTA7CisgICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHMgKiAuN2Y7CiAgICAgICAgICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zW2luZGV4XTsKICAgICAgICAgICAgIGlmIChpdGVtLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMKICAgICAgICAgICAgICAgICAgICAgJiYgaXNCYW5kd2lkdGhWYWxpZChpdGVtKSkgewpAQCAtMTQ2Niw3ICsxNDY2LDcgQEAKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0IHsKLSAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAtMWxsOworICAgIGludDY0X3QgbWF4RHVyYXRpb25VcyA9IC0xTEw7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGludDY0X3QgZmV0Y2hlckR1cmF0aW9uVXMgPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUR1cmF0aW9uVXM7CiAKQEAgLTE1OTIsNyArMTU5Miw3IEBACiAgICAgICAgIC8vIERlbGF5IGZldGNoZXIgcmVtb3ZhbCBpZiBub3QgcGlja2luZyB0cmFja3MsIEFORCBvbGQgZmV0Y2hlcgogICAgICAgICAvLyBoYXMgc3RyZWFtIG1hc2sgdGhhdCBvdmVybGFwcyBuZXcgdmFyaWFudC4gKE9rYXkgdG8gZGlzY2FyZAogICAgICAgICAvLyBvbGQgZmV0Y2hlciBub3csIGlmIGNvbXBsZXRlbHkgbm8gb3ZlcmxhcC4pCi0gICAgICAgIGlmIChkaXNjYXJkRmV0Y2hlciAmJiB0aW1lVXMgPCAwbGwgJiYgIXBpY2tUcmFjaworICAgICAgICBpZiAoZGlzY2FyZEZldGNoZXIgJiYgdGltZVVzIDwgMExMICYmICFwaWNrVHJhY2sKICAgICAgICAgICAgICAgICAmJiAoZmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKSAmIHN0cmVhbU1hc2spKSB7CiAgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOwogICAgICAgICAgICAgZGVsYXlSZW1vdmFsID0gdHJ1ZTsKQEAgLTE2MDQsNyArMTYwNCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbG9hdCB0aHJlc2hvbGQgPSAwLjBmOyAvLyBkZWZhdWx0IHRvIHBhdXNlIGFmdGVyIGN1cnJlbnQgYmxvY2sgKDQ3S2J5dGVzKQogICAgICAgICAgICAgYm9vbCBkaXNjb25uZWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodGltZVVzID49IDBsbCkgeworICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwTEwpIHsKICAgICAgICAgICAgICAgICAvLyBzZWVraW5nLCBubyBuZWVkIHRvIGZpbmlzaCBmZXRjaGluZwogICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkZWxheVJlbW92YWwpIHsKQEAgLTE2MjAsNyArMTYyMCw3IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZzsKLSAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgaWYgKHRpbWVVcyA8IDBMTCkgewogICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIG5vdCBzZWVraW5nLgogICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgdGhpcyk7CiAgICAgfSBlbHNlIHsKQEAgLTE2NTQsOSArMTY1NCw5IEBACiAgICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewogICAgICAgICBpbnQzMl90IHBpY2tUcmFjayA9IDA7CiAgICAgICAgIG1zZy0+ZmluZEludDMyKCJwaWNrVHJhY2siLCAmcGlja1RyYWNrKTsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgLTEsIHBpY2tUcmFjayk7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFMTCAvKiB0aW1lVXMgKi8sIC0xLCBwaWNrVHJhY2spOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyByZXRyeSBpbiAxIHNlYworICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMExMKTsgLy8gcmV0cnkgaW4gMSBzZWMKICAgICB9CiB9CiAKQEAgLTE3ODgsNyArMTc4OCw3IEBACiAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjaykpOwogCi0gICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgIGlmICh0aW1lVXMgPCAwTEwpIHsKICAgICAgICAgaWYgKCFwaWNrVHJhY2spIHsKICAgICAgICAgICAgIC8vIG1Td2FwTWFzayBjb250YWlucyBzdHJlYW1zIHRoYXQgYXJlIGluIGJvdGggb2xkIGFuZCBuZXcgdmFyaWFudCwKICAgICAgICAgICAgIC8vIChpbiBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrKSBidXQgd2l0aCBkaWZmZXJlbnQgVVJJcwpAQCAtMjAwNSw3ICsyMDA1LDcgQEAKIAogICAgICAgICAgICAgaWYgKChtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkgJiYgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygic3dhcHBpbmcgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB1cmlEZWJ1Z1N0cmluZyhtU3RyZWFtc1tpZHhdLm1VcmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOwogICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CkBAIC0yMDMzLDcgKzIwMzMsNyBAQAogICAgICAgICBDSEVDSyhpZHggPj0gMCk7CiAgICAgICAgIGlmIChtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIGV4dHJhIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHVyaURlYnVnU3RyaW5nKG1TdHJlYW1zW2lkeF0ubVVyaSkuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOwogICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKQEAgLTIwNjIsNyArMjA2Miw3IEBACiB2b2lkIExpdmVTZXNzaW9uOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOwogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpjYW5jZWxQb2xsQnVmZmVyaW5nKCkgewpAQCAtMjEzOCw3ICsyMTM4LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyBuZXdVcmkgPSAlcyIsIG5ld1VyaS5jX3N0cigpKTsKICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobmV3VXJpKTsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCBuZXdVcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciBuZXdVcmk6ICVzIiwgdXJpRGVidWdTdHJpbmcobmV3VXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7CkBAIC0yMjA4LDEzICsyMjA4LDEzIEBACiAgICAgICAgIGludDY0X3QgcmVhZHlNYXJrVXMgPQogICAgICAgICAgICAgKG1JblByZXBhcmF0aW9uUGhhc2UgPwogICAgICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA6Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwTEw7CiAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiByZWFkeU1hcmtVcwogICAgICAgICAgICAgICAgIHx8IG1QYWNrZXRTb3VyY2VzW2ldLT5pc0ZpbmlzaGVkKDApKSB7CiAgICAgICAgICAgICArK3JlYWR5Q291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya01zICogMTAwMExMKSB7CiAgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtVXBTd2l0Y2hNYXJrKSB7CkBAIC0yMzAwLDcgKzIzMDAsNyBAQAogICAgICAgICBzc2l6ZV90IGxvd2VzdFZhbGlkID0gZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpOwogICAgICAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4ID4gbG93ZXN0VmFsaWQpIHsKICAgICAgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwotICAgICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsLCBsb3dlc3RWYWxpZCk7CisgICAgICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xTEwsIGxvd2VzdFZhbGlkKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjM3MCw3ICsyMzcwLDcgQEAKICAgICAgICAgICAgIC8vIGlmIG5vdCB5ZXQgcHJlcGFyZWQsIGp1c3QgcmVzdGFydCBhZ2FpbiB3aXRoIG5ldyBidyBpbmRleC4KICAgICAgICAgICAgIC8vIHRoaXMgaXMgZmFzdGVyIGFuZCBwbGF5YmFjayBleHBlcmllbmNlIGlzIGNsZWFuZXIuCiAgICAgICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID8gMCA6IC0xbGwsIGJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA/IDAgOiAtMUxMLCBiYW5kd2lkdGhJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IDhhYjMzZjcuLmNiOTdhM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgICBtSXNFdmVudChmYWxzZSksCiAgICAgICBtRmlyc3RTZXFOdW1iZXIoLTEpLAogICAgICAgbUxhc3RTZXFOdW1iZXIoLTEpLAotICAgICAgbVRhcmdldER1cmF0aW9uVXMoLTFsbCksCisgICAgICBtVGFyZ2V0RHVyYXRpb25VcygtMUxMKSwKICAgICAgIG1EaXNjb250aW51aXR5U2VxKDApLAogICAgICAgbURpc2NvbnRpbnVpdHlDb3VudCgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CkBAIC03MDYsNiArNzA2LDEyIEBACiAgICAgICAgICsrbGluZU5vOwogICAgIH0KIAorICAgIC8vIHBsYXlsaXN0IGhhcyBubyBpdGVtLCB3b3VsZCBjYXVzZSBleGNlcHRpb24KKyAgICBpZiAobUl0ZW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJwbGF5bGlzdCBoYXMgbm8gaXRlbSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKwogICAgIC8vIGVycm9yIGNoZWNraW5nIG9mIGFsbCBmaWVsZHMgdGhhdCdzIHJlcXVpcmVkIHRvIGFwcGVhciBvbmNlCiAgICAgLy8gKGN1cnJlbnRseSBvbmx5IGNoZWNraW5nICJ0YXJnZXQtZHVyYXRpb24iKSwgYW5kCiAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgcGxheWxpc3QgcHJvcGVydGllcyAoZWcuIG1UYXJnZXREdXJhdGlvblVzKQpAQCAtNzE2LDcgKzcyMiw3IEBACiAgICAgICAgICAgICBBTE9HRSgiTWVkaWEgcGxheWxpc3QgbWlzc2luZyAjRVhULVgtVEFSR0VURFVSQVRJT04iKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KLSAgICAgICAgbVRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisgICAgICAgIG1UYXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMExMOwogCiAgICAgICAgIG1GaXJzdFNlcU51bWJlciA9IDA7CiAgICAgICAgIGlmIChtTWV0YSAhPSBOVUxMKSB7CkBAIC0xMTk5LDggKzEyMDUsNyBAQAogICAgICAgICAgICAgaWYgKHZhbC5zaXplKCkgPCAyCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpWzBdICE9ICciJwogICAgICAgICAgICAgICAgICAgICB8fCB2YWwuY19zdHIoKVt2YWwuc2l6ZSgpIC0gMV0gIT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmcgZm9yIFVSSSwgZ290ICclcycgaW5zdGVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLiIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEzOTEsNiArMTM5NiwxOSBAQAogICAgICAgICBjYXNlICdRRE1DJzoKICAgICAgICAgY2FzZSAndWxhdyc6CiAgICAgICAgIGNhc2UgJ3ZkdmEnOgorICAgICAgICBjYXNlICdhYy00JzoKKyAgICAgICAgY2FzZSAnT3B1cyc6CisgICAgICAgIGNhc2UgJ2EzZHMnOgorICAgICAgICBjYXNlICdkdHMrJzoKKyAgICAgICAgY2FzZSAnZHRzLSc6CisgICAgICAgIGNhc2UgJ2R0c3gnOgorICAgICAgICBjYXNlICdkdHN5JzoKKyAgICAgICAgY2FzZSAnZWMrMyc6CisgICAgICAgIGNhc2UgJ21oYTEnOgorICAgICAgICBjYXNlICdtaGEyJzoKKyAgICAgICAgY2FzZSAnbWhtMSc6CisgICAgICAgIGNhc2UgJ21obTInOgorICAgICAgICBjYXNlICdzZXZzJzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJhdWRpbyIsIHR5cGUpOwogCiAgICAgICAgIGNhc2UgJ2F2YzEnOgpAQCAtMTQzOSw2ICsxNDU3LDM1IEBACiAgICAgICAgIGNhc2UgJ3RnYSAnOgogICAgICAgICBjYXNlICd0aWZmJzoKICAgICAgICAgY2FzZSAnV1JMRSc6CisgICAgICAgIGNhc2UgJ2EzZDEnOgorICAgICAgICBjYXNlICdhM2QyJzoKKyAgICAgICAgY2FzZSAnYTNkMyc6CisgICAgICAgIGNhc2UgJ2EzZDQnOgorICAgICAgICBjYXNlICdhdmMzJzoKKyAgICAgICAgY2FzZSAnYXZjNCc6CisgICAgICAgIGNhc2UgJ2R2YTEnOgorICAgICAgICBjYXNlICdkdmF2JzoKKyAgICAgICAgY2FzZSAnZHZoMSc6CisgICAgICAgIGNhc2UgJ2R2aGUnOgorICAgICAgICBjYXNlICdoZXYxJzoKKyAgICAgICAgY2FzZSAnaGV2Mic6CisgICAgICAgIGNhc2UgJ2h2YzEnOgorICAgICAgICBjYXNlICdodmMyJzoKKyAgICAgICAgY2FzZSAnaHZ0MSc6CisgICAgICAgIGNhc2UgJ2xoZTEnOgorICAgICAgICBjYXNlICdsaHQxJzoKKyAgICAgICAgY2FzZSAnbGh2MSc6CisgICAgICAgIGNhc2UgJ21qcGcnOgorICAgICAgICBjYXNlICdtdmMzJzoKKyAgICAgICAgY2FzZSAnbXZjNCc6CisgICAgICAgIGNhc2UgJ212ZDEnOgorICAgICAgICBjYXNlICdtdmQyJzoKKyAgICAgICAgY2FzZSAnbXZkMyc6CisgICAgICAgIGNhc2UgJ212ZDQnOgorICAgICAgICBjYXNlICdydjYwJzoKKyAgICAgICAgY2FzZSAnc3ZjMic6CisgICAgICAgIGNhc2UgJ3ZwMDgnOgorICAgICAgICBjYXNlICd2cDA5JzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJ2aWRlbyIsIHR5cGUpOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCA5ZjM5YjVlLi42MzVlY2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJQbGF5bGlzdEZldGNoZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIApAQCAtNDksOCArNTAsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKLWNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWluQnVmZmVyZWREdXJhdGlvblVzID0gMzAwMDAwMDBsbDsKLWNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWF4TW9uaXRvckRlbGF5VXMgPSAzMDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcyA9IDMwMDAwMDAwTEw7Citjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01heE1vbml0b3JEZWxheVVzID0gMzAwMDAwMExMOwogLy8gTENNIG9mIDE4OCAoc2l6ZSBvZiBhIFRTIHBhY2tldCkgJiAxayB3b3JrcyB3ZWxsCiBjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gNDcgKiAxMDI0OwogCkBAIC0xNTEsMjUgKzE1MiwyNiBAQAogICAgICAgbVVSSSh1cmkpLAogICAgICAgbUZldGNoZXJJRChpZCksCiAgICAgICBtU3RyZWFtVHlwZU1hc2soMCksCi0gICAgICBtU3RhcnRUaW1lVXMoLTFsbCksCi0gICAgICBtU2VnbWVudFN0YXJ0VGltZVVzKC0xbGwpLAotICAgICAgbURpc2NvbnRpbnVpdHlTZXEoLTFsbCksCisgICAgICBtU3RhcnRUaW1lVXMoLTFMTCksCisgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzKC0xTEwpLAorICAgICAgbURpc2NvbnRpbnVpdHlTZXEoLTFMTCksCiAgICAgICBtU3RhcnRUaW1lVXNSZWxhdGl2ZShmYWxzZSksCi0gICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMoLTFsbCksCi0gICAgICBtUGxheWxpc3RUaW1lVXMoLTFsbCksCisgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMoLTFMTCksCisgICAgICBtUGxheWxpc3RUaW1lVXMoLTFMTCksCiAgICAgICBtU2VxTnVtYmVyKC0xKSwKICAgICAgIG1OdW1SZXRyaWVzKDApLAorICAgICAgbU51bVJldHJpZXNGb3JNb25pdG9yUXVldWUoMCksCiAgICAgICBtU3RhcnR1cCh0cnVlKSwKICAgICAgIG1JRFJGb3VuZChmYWxzZSksCiAgICAgICBtU2Vla01vZGUoTGl2ZVNlc3Npb246OmtTZWVrTW9kZUV4YWN0UG9zaXRpb24pLAogICAgICAgbVRpbWVDaGFuZ2VTaWduYWxlZChmYWxzZSksCi0gICAgICBtTmV4dFBUU1RpbWVVcygtMWxsKSwKKyAgICAgIG1OZXh0UFRTVGltZVVzKC0xTEwpLAogICAgICAgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb24oMCksCiAgICAgICBtU3VidGl0bGVHZW5lcmF0aW9uKHN1YnRpdGxlR2VuZXJhdGlvbiksCi0gICAgICBtTGFzdERpc2NvbnRpbnVpdHlTZXEoLTFsbCksCisgICAgICBtTGFzdERpc2NvbnRpbnVpdHlTZXEoLTFMTCksCiAgICAgICBtUmVmcmVzaFN0YXRlKElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVkpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAotICAgICAgbUZpcnN0VGltZVVzKC0xbGwpLAorICAgICAgbUZpcnN0VGltZVVzKC0xTEwpLAogICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSwKICAgICAgIG1TYW1wbGVBZXNLZXlJdGVtQ2hhbmdlZChmYWxzZSksCiAgICAgICBtVGhyZXNob2xkUmF0aW8oLTEuMGYpLApAQCAtMTk5LDcgKzIwMSw3IEBACiAgICAgQ0hFQ0tfR0Uoc2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgIENIRUNLX0xFKHNlcU51bWJlciwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCi0gICAgaW50NjRfdCBzZWdtZW50U3RhcnRVcyA9IDBsbDsKKyAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFVzID0gMExMOwogICAgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7CiAgICAgICAgICAgICBpbmRleCA8IHNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsgKytpbmRleCkgewogICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CkBAIC0yMzksMTMgKzI0MSwxMyBAQAogaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmRlbGF5VXNUb1JlZnJlc2hQbGF5bGlzdCgpIGNvbnN0IHsKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCB8fCBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMgPCAwbGwpIHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwgfHwgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzIDwgMExMKSB7CiAgICAgICAgIENIRUNLX0VRKChpbnQpbVJlZnJlc2hTdGF0ZSwgKGludClJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKTsKLSAgICAgICAgcmV0dXJuIDBsbDsKKyAgICAgICAgcmV0dXJuIDBMTDsKICAgICB9CiAKICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgcmV0dXJuICh+MGxsdSA+PiAxKTsKKyAgICAgICAgcmV0dXJuICh+MExMVSA+PiAxKTsKICAgICB9CiAKICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CkBAIC0yNjcsNyArMjY5LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRklSU1RfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBUOgpAQCAtMjk0LDcgKzI5Niw3IEBACiAgICAgfQogCiAgICAgaW50NjRfdCBkZWxheVVzID0gbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzICsgbWluUGxheWxpc3RBZ2VVcyAtIG5vd1VzOwotICAgIHJldHVybiBkZWxheVVzID4gMGxsID8gZGVsYXlVcyA6IDBsbDsKKyAgICByZXR1cm4gZGVsYXlVcyA+IDBMTCA/IGRlbGF5VXMgOiAwTEw7CiB9CiAKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZGVjcnlwdEJ1ZmZlcigKQEAgLTM2NCwxMCArMzY2LDEwIEBACiAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9UX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCBjaXBoZXIga2V5IGZyb20gJyVzJy4iLCBrZXlVUkkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSBpZiAoa2V5LT5zaXplKCkgIT0gMTYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKQEAgLTg0OCw3ICs4NTAsMTcgQEAKICAgICAvLyBpbiB0aGUgbWlkZGxlIG9mIGFuIHVuZmluaXNoZWQgZG93bmxvYWQsIGRlbGF5CiAgICAgLy8gcGxheWxpc3QgcmVmcmVzaCBhcyBpdCdsbCBjaGFuZ2Ugc2VxIG51bWJlcnMKICAgICBpZiAoIW1Eb3dubG9hZFN0YXRlLT5oYXNTYXZlZFN0YXRlKCkpIHsKLSAgICAgICAgcmVmcmVzaFBsYXlsaXN0KCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlZnJlc2hQbGF5bGlzdCgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAobU51bVJldHJpZXNGb3JNb25pdG9yUXVldWUgPCBrTWF4TnVtUmV0cmllcykgeworICAgICAgICAgICAgICAgICsrbU51bVJldHJpZXNGb3JNb25pdG9yUXVldWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTnVtUmV0cmllc0Zvck1vbml0b3JRdWV1ZSA9IDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOwpAQCAtODU2LDcgKzg2OCw3IEBACiAgICAgICAgIHRhcmdldER1cmF0aW9uVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CiAgICAgfQogCi0gICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSAwbGw7CisgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSAwTEw7CiAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQgPSBPSzsKICAgICBpZiAobVN0cmVhbVR5cGVNYXNrID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgewogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPQpAQCAtODY5LDcgKzg4MSw3IEBACiAgICAgICAgIC8vIGVucXVldWVkIHRvIHByZXZlbnQgdXMgZnJvbSB3YWl0aW5nIG9uIGEgbm9uLWV4aXN0ZW50IHN0cmVhbTsKICAgICAgICAgLy8gd2hlbiB3ZSBjYW5ub3QgbWFrZSBvdXQgZnJvbSB0aGUgbWFuaWZlc3Qgd2hhdCBzdHJlYW1zIGFyZSBpbmNsdWRlZCBpbgogICAgICAgICAvLyBhIHBsYXlsaXN0IHdlIG1pZ2h0IGFzc3VtZSBleHRyYSBzdHJlYW1zLgotICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAtMWxsOworICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAtMUxMOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwCiAgICAgICAgICAgICAgICAgICAgIHx8IG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKSA9PSBOVUxMKSB7CkBAIC04ODEsMTMgKzg5MywxMyBAQAogCiAgICAgICAgICAgICBGU0xPR1YobVBhY2tldFNvdXJjZXMua2V5QXQoaSksICJidWZmZXJlZCAlbGxkIiwgKGxvbmcgbG9uZylidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMpOwogCi0gICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID09IC0xbGwKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPT0gLTFMTAogICAgICAgICAgICAgICAgICB8fCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPCBidWZmZXJlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA9PSAtMWxsKSB7Ci0gICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSAwbGw7CisgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPT0gLTFMTCkgeworICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gMExMOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MDAsMTIgKzkxMiwxMiBAQAogICAgICAgICAvLyBvbkRvd25sb2FkTmV4dCgpOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RG93bmxvYWROZXh0LCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKTsKLSAgICAgICAgbXNnLT5wb3N0KDEwMDBsKTsKKyAgICAgICAgbXNnLT5wb3N0KDEwMDBMKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBXZSdkIGxpa2UgdG8gbWFpbnRhaW4gYnVmZmVyaW5nIGFib3ZlIGR1cmF0aW9uVG9CdWZmZXJVcywgc28gdHJ5CiAgICAgICAgIC8vIGFnYWluIHdoZW4gYnVmZmVyIGp1c3QgYWJvdXQgdG8gZ28gYmVsb3cgZHVyYXRpb25Ub0J1ZmZlclVzCiAgICAgICAgIC8vIChvciBhZnRlciB0YXJnZXREdXJhdGlvblVzIC8gMiwgd2hpY2hldmVyIGlzIHNtYWxsZXIpLgotICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBidWZmZXJlZER1cmF0aW9uVXMgLSBrTWluQnVmZmVyZWREdXJhdGlvblVzICsgMTAwMDAwMGxsOworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBidWZmZXJlZER1cmF0aW9uVXMgLSBrTWluQnVmZmVyZWREdXJhdGlvblVzICsgMTAwMDAwMExMOwogICAgICAgICBpZiAoZGVsYXlVcyA+IHRhcmdldER1cmF0aW9uVXMgLyAyKSB7CiAgICAgICAgICAgICBkZWxheVVzID0gdGFyZ2V0RHVyYXRpb25VcyAvIDI7CiAgICAgICAgIH0KQEAgLTEwNzIsMTAgKzEwODQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1TZWdtZW50Rmlyc3RQVFMgPSAtMWxsOworICAgIG1TZWdtZW50Rmlyc3RQVFMgPSAtMUxMOwogCiAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMICYmIG1TZXFOdW1iZXIgPCAwKSB7Ci0gICAgICAgIENIRUNLX0dFKG1TdGFydFRpbWVVcywgMGxsKTsKKyAgICAgICAgQ0hFQ0tfR0UobVN0YXJ0VGltZVVzLCAwTEwpOwogCiAgICAgICAgIGlmIChtU2VnbWVudFN0YXJ0VGltZVVzIDwgMCkgewogICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QtPmlzQ29tcGxldGUoKSAmJiAhbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKQEAgLTEzNjUsNyArMTM3Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIC50cyBzZWdtZW50IGF0IHVybCAnJXMnIiwgdXJpRGVidWdTdHJpbmcodXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEzNzgsNyArMTM5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmIChMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTwogICAgICAgICAgICAgICAgICAgICAgICAgfCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTykpKSB7CiAgICAgICAgICAgICBtU2Vzc2lvbi0+YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoYnl0ZXNSZWFkLCBkZWxheVVzKTsKLSAgICAgICAgICAgIGlmIChkZWxheVVzID4gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IDIwMDAwMDBMTCkgewogICAgICAgICAgICAgICAgIEZMT0dWKCJieXRlc1JlYWQgJXpkIHRvb2sgJS4yZiBzZWNvbmRzIC0gYWJub3JtYWwgYmFuZHdpZHRoIGRpcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1JlYWQsIChkb3VibGUpZGVsYXlVcyAvIDEuMGU2KTsKICAgICAgICAgICAgIH0KQEAgLTE1NTIsNyArMTU2NCw3IEBACiAgICAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyBmZXRjaGVyIHBhdXNlZCBpbiB0aGUgbWlkZGxlIG9mIGEgc2VnbWVudCwgd2UKICAgICAgICAgLy8gd2FudCB0byBzdGFydCBhdCBhIHNlZ21lbnQgdGhhdCBvdmVybGFwcyB0aGUgbGFzdCBzYW1wbGUKICAgICAgICAgbWluRGlmZlVzID0gLW1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKTsKLSAgICAgICAgbWF4RGlmZlVzID0gMGxsOworICAgICAgICBtYXhEaWZmVXMgPSAwTEw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIGZldGNoZXIgcGF1c2VkIGF0IHRoZSBlbmQgb2YgYSBzZWdtZW50LCBpZGVhbGx5CiAgICAgICAgIC8vIHdlIHdhbnQgdG8gc3RhcnQgYXQgdGhlIHNlZ21lbnQgdGhhdCdzIHJvdWdobHkgYWxpZ25lZCB3aXRoIGl0cwpAQCAtMTcwMyw3ICsxNzE1LDcgQEAKICAgICAgICAgbVRTUGFyc2VyID0gbmV3IEFUU1BhcnNlcihBVFNQYXJzZXI6OlRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKTsKICAgICB9CiAKLSAgICBpZiAobU5leHRQVFNUaW1lVXMgPj0gMGxsKSB7CisgICAgaWYgKG1OZXh0UFRTVGltZVVzID49IDBMTCkgewogICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSB1c2luZyBhYnNvbHV0ZSB0aW1lc3RhbXBzLCBzaWduYWwgYW4gb2Zmc2V0IG9mIDAgdG8gcHJldmVudAogICAgICAgICAvLyBBVFNQYXJzZXIgZnJvbSBza2V3aW5nIHRoZSB0aW1lc3RhbXBzIG9mIGFjY2VzcyB1bml0cy4KQEAgLTE3MTgsNyArMTczMCw3IEBACiAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEpOwogCi0gICAgICAgIG1OZXh0UFRTVGltZVVzID0gLTFsbDsKKyAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMUxMOwogICAgIH0KIAogICAgIGlmIChtU2FtcGxlQWVzS2V5SXRlbUNoYW5nZWQpIHsKQEAgLTE3MzksNyArMTc1MSw3IEBACiAgICAgLy8gc2V0UmFuZ2UgdG8gaW5kaWNhdGUgY29uc3VtZWQgYnl0ZXMuCiAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgb2Zmc2V0LCBidWZmZXItPnNpemUoKSAtIG9mZnNldCk7CiAKLSAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCkgeworICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMExMKSB7CiAgICAgICAgIC8vIGdldCB0aGUgc21hbGxlc3QgZmlyc3QgUFRTIGZyb20gYWxsIHN0cmVhbXMgcHJlc2VudCBpbiB0aGlzIHBhcnNlcgogICAgICAgICBmb3IgKHNpemVfdCBpID0gbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpID4gMDspIHsKICAgICAgICAgICAgIGktLTsKQEAgLTE3NjMsMTIgKzE3NzUsMTIgQEAKICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgICAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCB8fCB0aW1lVXMgPCBtU2VnbWVudEZpcnN0UFRTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwTEwgfHwgdGltZVVzIDwgbVNlZ21lbnRGaXJzdFBUUykgewogICAgICAgICAgICAgICAgICAgICBtU2VnbWVudEZpcnN0UFRTID0gdGltZVVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCkgeworICAgICAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBMTCkgewogICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYW55IFRTIHBhY2tldCwgY2FuIHJldHVybiBlYXJseQogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CkBAIC0xOTg3LDggKzE5OTksOCBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG1OZXh0UFRTVGltZVVzID49IDBsbCkgewotICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CisgICAgaWYgKG1OZXh0UFRTVGltZVVzID49IDBMTCkgeworICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xTEw7CiAgICAgfQogCiAgICAgLy8gVGhpcyBiZXR0ZXIgYmUgYW4gSVNPIDEzODE4LTcgKEFBQykgb3IgSVNPIDEzODE4LTEgKE1QRUcpIGF1ZGlvCkBAIC0yMDg3LDE3ICsyMDk5LDE3IEBACiAgICAgICAgIHBhY2tldFNvdXJjZS0+c2V0Rm9ybWF0KG1ldGEpOwogICAgIH0KIAotICAgIGludDY0X3QgbnVtU2FtcGxlcyA9IDBsbDsKKyAgICBpbnQ2NF90IG51bVNhbXBsZXMgPSAwTEw7CiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKIAotICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMGxsKSAvIDlsbDsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IChQVFMgKiAxMDBMTCkgLyA5TEw7CiAgICAgaWYgKG1TdGFydHVwICYmICFtRmlyc3RQVFNWYWxpZCkgewogICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CiAgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKICAgICB9CiAKLSAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCkgeworICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMExMKSB7CiAgICAgICAgIG1TZWdtZW50Rmlyc3RQVFMgPSB0aW1lVXM7CiAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKICAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgbG9naWMgZnJvbSBob3cgd2UgaGFuZGxlIC50cyBwbGF5bGlzdHMuCkBAIC0yMTI0LDcgKzIxMzYsMTAgQEAKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgICAgICBDSEVDS19MVChvZmZzZXQgKyA1LCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA8PSBvZmZzZXQrNSkgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIC8vIG5vbi1jb25zdCBwb2ludGVyIGZvciBkZWNyeXB0aW9uIGlmIG5lZWRlZAogICAgICAgICB1aW50OF90ICphZHRzRnJhbWUgPSBidWZmZXItPmRhdGEoKSArIG9mZnNldDsKIApAQCAtMjE0Nyw3ICsyMTYyLDcgQEAKIAogICAgICAgICBDSEVDS19MRShvZmZzZXQgKyBhYWNfZnJhbWVfbGVuZ3RoLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgaW50NjRfdCB1bml0VGltZVVzID0gdGltZVVzICsgbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisgICAgICAgIGludDY0X3QgdW5pdFRpbWVVcyA9IHRpbWVVcyArIG51bVNhbXBsZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlOwogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKIAogICAgICAgICAvLyBFYWNoIEFBQyBmcmFtZSBlbmNvZGVzIDEwMjQgc2FtcGxlcy4KQEAgLTIyMDgsNyArMjIyMyw3IEBACiB9CiAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjp1cGRhdGVEdXJhdGlvbigpIHsKLSAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwbGw7CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMExMOwogICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtUGxheWxpc3QtPnNpemUoKTsgKytpbmRleCkgewogICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CiAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCBkN2RiNTRhLi41ZDNmOWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMTQ1LDYgKzE0NSw3IEBACiAgICAgc3A8TTNVUGFyc2VyPiBtUGxheWxpc3Q7CiAgICAgaW50MzJfdCBtU2VxTnVtYmVyOwogICAgIGludDMyX3QgbU51bVJldHJpZXM7CisgICAgaW50MzJfdCBtTnVtUmV0cmllc0Zvck1vbml0b3JRdWV1ZTsKICAgICBib29sIG1TdGFydHVwOwogICAgIGJvb2wgbUlEUkZvdW5kOwogICAgIGludDMyX3QgbVNlZWtNb2RlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCAzN2Y5ZDUwLi43MTUxZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMyw2ICszLDEwIEBACiAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCkBAIC0xMiw5ICsxNiw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQogCkBAIC00Myw5ICs0NCw2IEBACiAKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IGEwYTYyZjQuLjc5MmE2OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9JRDMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQxLDcgKzQzLDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBvZmY2NF90IGF2YWlsYWJsZSA9IChvZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpID8gMGxsIDogbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIG9mZjY0X3QgYXZhaWxhYmxlID0gKG9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkgPyAwTEwgOiBtU2l6ZSAtIG9mZnNldDsKIAogICAgICAgICBzaXplX3QgY29weSA9IChhdmFpbGFibGUgPiAob2ZmNjRfdClzaXplKSA/IHNpemUgOiBhdmFpbGFibGU7CiAgICAgICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgY29weSk7CkBAIC01Niw2ICs1OCw1NSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lbW9yeVNvdXJjZSk7CiB9OwogCitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBhOTI0MTk3Li44YjIwMTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOwotCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggN2MyMzkxZS4uNWU0MzNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgIElEM19WMl80LAogICAgIH07CiAKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZjQzOWExYy4uNTk2ZWZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CkBAIC01MSw2ICs1Myw4IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBzc2l6ZV90IHJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNlZWtJbnRlcm5hbF9sKG9mZjY0X3Qgb2Zmc2V0KTsKIAotICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwogCiAgICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCiAgICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IGY3OGUxMjUuLmM1MDY3N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBJbWFnZURlY29kZXI7CiBzdHJ1Y3QgRnJhbWVSZWN0OwogCkBAIC02Niw2ICs2NSw3IEBACiAgICAgc3A8SW1hZ2VEZWNvZGVyPiBtSW1hZ2VEZWNvZGVyOwogICAgIGludCBtTGFzdEltYWdlSW5kZXg7CiAgICAgdm9pZCBwYXJzZU1ldGFEYXRhKCk7CisgICAgdm9pZCBwYXJzZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogICAgIC8vIERlbGV0ZSBhbGJ1bSBhcnQgYW5kIGNsZWFyIG1ldGFkYXRhLgogICAgIHZvaWQgY2xlYXJNZXRhZGF0YSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5N2QxNWE3Li43ODRmZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMzcsNiArMTM3LDcgQEAKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKKyAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yMzYsNiArMjM3LDggQEAKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbUxhc3ROYXRpdmVXaW5kb3dDcm9wOwogICAgIGludDMyX3QgbUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2U7CiAgICAgSERSU3RhdGljSW5mbyBtTGFzdEhEUlN0YXRpY0luZm87CisgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RIZHIxMFBsdXNCdWZmZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWdGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKQEAgLTI4MywxMiArMjg2LDEzIEBACiAgICAgZG91YmxlIG1GcHM7CiAgICAgZG91YmxlIG1DYXB0dXJlRnBzOwogICAgIGJvb2wgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZDsKLSAgICB1aW50MzJfdCBtTGF0ZW5jeTsKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBtTGF0ZW5jeTsKIAogICAgIGJvb2wgbVR1bm5lbGVkOwogCiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDsKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleDsKKyAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleDsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxBQ29kZWNCdWZmZXJDaGFubmVsPiBtQnVmZmVyQ2hhbm5lbDsKIApAQCAtNDIzLDYgKzQyNywxMSBAQAogICAgIC8vIHVuc3BlY2lmaWVkIHZhbHVlcy4KICAgICB2b2lkIG9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CiAKKyAgICAvLyBub3RpZmllcyB0aGUgY29kZWMgdGhhdCB0aGUgY29uZmlnIHdpdGggfGNvbmZpZ0luZGV4fCBoYXMgY2hhbmdlZCwgdGhlIHZhbHVlCisgICAgLy8gY2FuIGJlIHF1ZXJpZWQgYnkgT01YIGdldENvbmZpZywgYW5kIHRoZSBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIG5leHQKKyAgICAvLyBvdXRwdXQgYnVmZmVyIG5vdGlmaWVkIGFmdGVyIHRoaXMgY2FsbGJhY2suCisgICAgdm9pZCBvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KTsKKwogICAgIC8vIGdldHMgaW5kZXggb3Igc2V0cyBpdCB0byAwIG9uIGVycm9yLiBSZXR1cm5zIGVycm9yIGZyb20gY29kZWMuCiAgICAgc3RhdHVzX3QgaW5pdERlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KCk7CiAKQEAgLTQzNCwxMiArNDQzLDIyIEBACiAgICAgLy8gc2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3Qgc2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKKyAgICAvLyBzZXRzIHxoZHIxMFBsdXNJbmZvfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCisgICAgc3RhdHVzX3Qgc2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbyk7CisKICAgICAvLyBnZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAogICAgIC8vIGdldHMgSERSIHN0YXRpYyBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpZGVvIGVuY29kZXIvZGVjb2RlciBwb3J0IGFuZCBzZXRzIHRoZW0gaW50byB8Zm9ybWF0fC4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvRm9yVmlkZW9Db2RlYyhPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCisgICAgLy8gZ2V0cyBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcGFyYW1zLiBJZiB8cGFyYW1TaXplVXNlZHwgaXMgemVybywgaXQncworICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlIHJldHVybmVkIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBvbmx5IGhhcyB0aGUKKyAgICAvLyBuUGFyYW1TaXplVXNlZCBmaWVsZCB1cGRhdGVkLCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBzdG9yYWdlIGlzIGluc3VmZmljaWVudC4KKyAgICAvLyBJbiB0aGlzIGNhc2UsIGdldEhEUjEwUGx1c0luZm8oKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluIHdpdGggfHBhcmFtU2l6ZVVzZWR8CisgICAgLy8gc3BlY2lmaWVkIHRvIHRoZSBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZS4KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQgPSAwKTsKKwogICAgIHR5cGVkZWYgc3RydWN0IGRyY1BhcmFtcyB7CiAgICAgICAgIGludDMyX3QgZHJjQ3V0OwogICAgICAgICBpbnQzMl90IGRyY0Jvb3N0OwpAQCAtNDYwLDYgKzQ3OSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXR1cEVBQzNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cEFDNENvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKKwogICAgIHN0YXR1c190IHNlbGVjdEF1ZGlvUG9ydEZvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQVVESU9fQ09ESU5HVFlQRSBkZXNpcmVkRm9ybWF0KTsKIApAQCAtNDY3LDcgKzQ4OCw4IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKIAogICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzLApAQCAtNDc2LDYgKzQ5OCw3IEBACiAgICAgc3RhdHVzX3Qgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCk7CiAgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CiAgICAgc3RhdHVzX3QgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90ICppbnRyYVJlZnJlc2hQZXJpb2QpOwogICAgIHN0YXR1c190IHNldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCBpbnRyYVJlZnJlc2hQZXJpb2QsIGJvb2wgaW5Db25maWd1cmUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCAyMDZkMzIyLi5hZjA0ZGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC00NCw3ICs0NCw5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBvdXRTYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgIHVpZF90IHVpZCA9IC0xLAogICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtNjgsNyArNzAsMTAgQEAKICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCiAgICAgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIAorICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2xlYXJGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gQ2xlYXJGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJGaWxlU291cmNlKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CisgICAgTXV0ZXggbUxvY2s7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7CisgICAgQ2xlYXJGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MDdhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBDbGVhck1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhck1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xlYXJNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9NRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNWIzNTQzZC4uNzViMGQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtMzUsMjEgKzM1LDMyIEBACiAKICAgICBib29sIGlzRHN0UkdCKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFNyY0NvbG9yU3BhY2UodWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2Zlcik7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0KAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKKyAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOworICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CisgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKKworICAgICAgICBib29sIGlzQnQ3MDkoKTsKKyAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICB9OworCiAgICAgc3RydWN0IEJpdG1hcFBhcmFtcyB7CiAgICAgICAgIEJpdG1hcFBhcmFtcygKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CkBAIC02NSw2ICs3Niw3IEBACiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CisgICAgQ29sb3JTcGFjZSBtU3JjQ29sb3JTcGFjZTsKICAgICB1aW50OF90ICptQ2xpcDsKIAogICAgIHVpbnQ4X3QgKmluaXRDbGlwKCk7CkBAIC03OCw2ICs5MCw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2E0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDdjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2UgeworcHVibGljOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKKyAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCisgICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAorICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKKyAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAorICAgIH07CisKKyAgICBEYXRhU291cmNlQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbM107CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IG50b2hsKHRtcCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9oNjQodG1wKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCisgICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDE2KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgdWludDhfdCB0bXA7CisgICAgICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICAqc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAqIC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7CisgICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA4NjA0ODkwLi5iNjEwZWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNDcgKzIwLDI5IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+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+aGFzX2J1ZmZlcnMoKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptV3JhcHBlcjsKKyAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOworICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOworCisgICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIHZvaWQgaW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggN2Y2YWFlNi4uODljY2E2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTMxMyw2ICszMTMsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKICAgICBzcDxDb2RlY0Jhc2U+IG1Db2RlYzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworICAgIEFTdHJpbmcgbU93bmVyTmFtZTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwpAQCAtMzM5LDYgKzM0MCw3IEBACiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKICAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CisgICAgaW50MzJfdCBtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlOwogCiAgICAgLy8gaW5pdGlhbCBjcmVhdGUgcGFyYW1ldGVycwogICAgIEFTdHJpbmcgbUluaXROYW1lOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAppbmRleCAzZWY0YzBlLi41MGQ3NzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtMzEsNiArMzEsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lID0gMHgxMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggICAgID0gMHg4MDAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/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+CkBAIC02NCw4ICs2NSw2IEBACiAKICAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAotICAgIHZvaWQgZGlzY29ubmVjdCgpOwotCiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCwgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKIApAQCAtOTcsNiArOTYsOCBAQAogCiAgICAgYm9vbCBnZXRDYWNoZWREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIGNvbnN0OwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9QcmVzZW50YXRpb25zKHNpemVfdCB0cmFja0lkeCwgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51TWVkaWFFeHRyYWN0b3IoKTsKIApAQCAtMTQ4LDcgKzE0OSw2IEBACiAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQogICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOwogCi0gICAgdm9pZCByZWxlYXNlT25lU2FtcGxlKFRyYWNrSW5mbyAqaW5mbyk7CiAgICAgdm9pZCByZWxlYXNlVHJhY2tTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbyk7CiAgICAgdm9pZCByZWxlYXNlQWxsVHJhY2tTYW1wbGVzKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMGExZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9HR19XUklURVJfSF8KKworI2RlZmluZSBPR0dfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT2dnV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBPZ2dXcml0ZXIoaW50IGZkKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSogcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJvdGVjdGVkOgorICAgIH5PZ2dXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIGJvb2wgbUhhdmVBbGxDb2RlY1NwZWNpZmljRGF0YTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbVNhbXBsZVJhdGU7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbUVzdGltYXRlZER1cmF0aW9uVXM7CisKKyAgICBzdGF0aWMgdm9pZCogVGhyZWFkV3JhcHBlcih2b2lkKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBpbnQzMl90IG1DdXJyZW50UGFja2V0SWQ7CisgICAgT2dnU3RyZWFtU3RhdGUqIG1PcyA9IG51bGxwdHI7CisKKyAgICBPZ2dXcml0ZXIoY29uc3QgT2dnV3JpdGVyJik7CisgICAgT2dnV3JpdGVyJiBvcGVyYXRvcj0oY29uc3QgT2dnV3JpdGVyJik7CisKKyAgICBzdGF0dXNfdCB3cml0ZU9nZ0hlYWRlclBhY2tldHModW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9HR19XUklURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAppbmRleCAyOGY2MDk0Li4xNDEwYTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0yMyw4ICsyMywxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtQWxsb3dTdXJmYWNlRW5jb2RlcnM7IC8vIGFsbG93IHN1cmZhY2UgZW5jb2RlcnMKKwogcHVibGljOgotICAgIE9teEluZm9CdWlsZGVyKCk7CisgICAgZXhwbGljaXQgT214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycyk7CiAgICAgfk9teEluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCmluZGV4IDY4OWU0NTguLmFlNTVjNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaApAQCAtMTksOCArMTksMTAgQEAKICNkZWZpbmUgU1VSRkFDRV9VVElMU19IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdzsKK2NsYXNzIFN1cmZhY2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDAsNiArNDIsMTUgQEAKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIAorLyoqCisgKiBEaXNhYmxlIGJ1ZmZlciBkcm9wcGluZyBiZWhhdmlvciBvZiBCdWZmZXJRdWV1ZSBpZiB0YXJnZXQgc2RrIG9mIGFwcGxpY2F0aW9uCisgKiBpcyBRIG9yIGxhdGVyLiBJZiB0aGUgY2FsbGVyIGlzIG5vdCBhbiBhcHAgKGUuZy4gTWVkaWFQbGF5ZXIgaW4gbWVkaWFzZXJ2ZXIpCisgKiByZXRhaW4gYnVmZmVyIGRyb3BwaW5nIGJlaGF2aW9yLgorICoKKyAqIEByZXR1cm4gTk9fRVJST1IKKyAqLworc3RhdHVzX3QgZGlzYWJsZUxlZ2FjeUJ1ZmZlckRyb3BQb3N0UShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBTVVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggNmEyOGUwYi4uZThlMGExMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtMzAsNiArMzAsOCBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKIHZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgc3A8TWV0YURhdGE+ICZtZXRhKTsKQEAgLTUwLDYgKzUyLDEwIEBACiAvLyBTZW5kIGluZm9ybWF0aW9uIGZyb20gTWV0YURhdGEgdG8gdGhlIEhBTCB2aWEgQXVkaW9TaW5rCiBzdGF0dXNfdCBzZW5kTWV0YURhdGFUb0hhbChzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4mIHNpbmssIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CiAKKy8vIFJldHVybiB8YXVkaW9fb2ZmbG9hZF9pbmZvX3R8IGZpbGxlZCBmcm9tIGdpdmVuIG1ldGFkYXRhCitzdGF0dXNfdCBnZXRBdWRpb09mZmxvYWRJbmZvKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBhdWRpb19vZmZsb2FkX2luZm9fdCAqaW5mbyk7CisKIC8vIENoZWNrIHdoZXRoZXIgdGhlIHN0cmVhbSBkZWZpbmVkIGJ5IG1ldGEgY2FuIGJlIG9mZmxvYWRlZCB0byBoYXJkd2FyZQogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaAppbmRleCA5ZDk3ZGZkLi5mY2ZjYmVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDg3ICsxNywyNCBAQAogI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KICNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCiAKLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJU3VyZmFjZUNvbXBvc2VyOwogCi1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIHsKICAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7Ci0KLSAgICAvLyAocmUpaW5pdGlhbGl6ZSBzY2hlZHVsZXIKLSAgICB2b2lkIGluaXQoZmxvYXQgdmlkZW9GcHMgPSAtMSk7Ci0gICAgLy8gdXNlIGluIGNhc2Ugb2YgdmlkZW8gcmVuZGVyLXRpbWUgZGlzY29udGludWl0eSwgZS5nLiBzZWVrCi0gICAgdm9pZCByZXN0YXJ0KCk7Ci0gICAgLy8gZ2V0IGFkanVzdGVkIG5hbm90aW1lIGZvciBhIHZpZGVvIGZyYW1lIHJlbmRlciBhdCByZW5kZXJUaW1lCi0gICAgbnNlY3NfdCBzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpOwotCi0gICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5Ci0gICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOwotCi0gICAgLy8gcmV0dXJucyB0aGUgY3VycmVudCBmcmFtZXMtcGVyLXNlY29uZCwgb3IgMC5mIGlmIG5vdCBwcmltZWQKLSAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKLQotICAgIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGlzdG9yeVNpemUgPSA4OworICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlcigpOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBQTEwgewotICAgICAgICBQTEwoKTsKLQotICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAotICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKLSAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQotICAgICAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAotICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOwotICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbnNlY3NfdCBtUGVyaW9kOwotICAgICAgICBuc2Vjc190IG1QaGFzZTsKLQotICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCi0gICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKLQotICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKLSAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAotCi0gICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQotICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOwotCi0gICAgICAgIHZvaWQgdGVzdCgpOwotICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCi0gICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOwotICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKLSAgICB9OwotCi0gICAgdm9pZCB1cGRhdGVWc3luYygpOwotCi0gICAgbnNlY3NfdCBtVnN5bmNUaW1lOyAgICAgICAgLy8gdnN5bmMgdGltaW5nIGZyb20gZGlzcGxheQotICAgIG5zZWNzX3QgbVZzeW5jUGVyaW9kOwotICAgIG5zZWNzX3QgbVZzeW5jUmVmcmVzaEF0OyAgIC8vIG5leHQgdGltZSB0byByZWZyZXNoIHRpbWluZyBpbmZvCi0KLSAgICBuc2Vjc190IG1MYXN0VnN5bmNUaW1lOyAgICAvLyBlc3RpbWF0ZWQgdnN5bmMgdGltZSBmb3IgbGFzdCBmcmFtZQotICAgIG5zZWNzX3QgbVRpbWVDb3JyZWN0aW9uOyAgIC8vIHJ1bm5pbmcgYWRqdXN0bWVudAotCi0gICAgUExMIG1QbGw7ICAgICAgICAgICAgICAgICAgLy8gUExMIGZvciB2aWRlbyBmcmFtZSByYXRlIGJhc2VkIG9uIHJlbmRlciB0aW1lCi0KKyAgICB2b2lkIHVwZGF0ZVZzeW5jKCkgb3ZlcnJpZGU7CiAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gbUNvbXBvc2VyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9GcmFtZVNjaGVkdWxlcik7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxYjlhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCisjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFZzeW5jVHJhY2tlcjsKK3N0cnVjdCBDaG9yZW9ncmFwaGVyVGhyZWFkOworCitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgeworICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyMigpOworCitwcml2YXRlOgorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKKworICAgIG5zZWNzX3QgbUFwcFZzeW5jT2Zmc2V0OworICAgIG5zZWNzX3QgbVNmVnN5bmNPZmZzZXQ7CisgICAgc3A8VnN5bmNUcmFja2VyPiBtVnN5bmNUcmFja2VyOworICAgIHNwPENob3Jlb2dyYXBoZXJUaHJlYWQ+IG1DaG9yZW9ncmFwaGVyVGhyZWFkOworICAgIE11dGV4IG1Mb2NrOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWY3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgorICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKKyAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKKyAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKKyAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7CisKKyAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisKKyAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAorICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOworCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga05hbm9zSW4xcyA9IDEwMDAwMDAwMDA7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrVnN5bmNSZWZyZXNoUGVyaW9kID0ga05hbm9zSW4xczsgICAgICAgLy8gMSBzZWMKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCk7CisKKyAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5CisgICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7CisgICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUExMIHsKKyAgICAgICAgUExMKCk7CisKKyAgICAgICAgLy8gcmVzZXQgUExMIHRvIG5ldyBQTEwKKyAgICAgICAgdm9pZCByZXNldChmbG9hdCBmcHMgPSAtMSk7CisgICAgICAgIC8vIGtlZXAgY3VycmVudCBlc3RpbWF0ZSwgYnV0IHJlc3RhcnQgcGhhc2UKKyAgICAgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgICAgIC8vIHJldHVybnMgcGVyaW9kIG9yIDAgaWYgbm90IHlldCBwcmltZWQKKyAgICAgICAgbnNlY3NfdCBhZGRTYW1wbGUobnNlY3NfdCB0aW1lKTsKKyAgICAgICAgbnNlY3NfdCBnZXRQZXJpb2QoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIG5zZWNzX3QgbVBlcmlvZDsKKyAgICAgICAgbnNlY3NfdCBtUGhhc2U7CisKKyAgICAgICAgYm9vbCAgICBtUHJpbWVkOyAgICAgICAgLy8gaGF2ZSBhbiBlc3RpbWF0ZSBmb3IgdGhlIHBlcmlvZAorICAgICAgICBzaXplX3QgIG1TYW1wbGVzVXNlZEZvclByaW1pbmc7CisKKyAgICAgICAgbnNlY3NfdCBtTGFzdFRpbWU7ICAgICAgLy8gbGFzdCBpbnB1dCB0aW1lCisgICAgICAgIG5zZWNzX3QgbVJlZml0QXQ7ICAgICAgIC8vIG5leHQgaW5wdXQgdGltZSB0byBmaXQgYXQKKworICAgICAgICBzaXplX3QgIG1OdW1TYW1wbGVzOyAgICAvLyBjYW4gZ28gcGFzdCBrSGlzdG9yeVNpemUKKyAgICAgICAgbnNlY3NfdCBtVGltZXNba0hpc3RvcnlTaXplXTsKKworICAgICAgICB2b2lkIHRlc3QoKTsKKyAgICAgICAgLy8gcmV0dXJucyB3aGV0aGVyIGZpdCB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICBib29sIGZpdChuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKTsKKyAgICAgICAgdm9pZCBwcmltZShzaXplX3QgbnVtU2FtcGxlcyk7CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVWc3luYygpID0gMDsKKworICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCisgICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50CisgICAgUExMIG1QbGw7ICAgICAgICAgICAgICAgICAgLy8gUExMIGZvciB2aWRlbyBmcmFtZSByYXRlIGJhc2VkIG9uIHJlbmRlciB0aW1lCisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggNWNjNTA5My4uMTQ4MjA3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjMsMTAgKzIzLDEwIEBACiAjaW5jbHVkZSAiRVNRdWV1ZS5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtNDYsMTIgKzQ2LDEzIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgaGFyZHdhcmU6OmZyb21IZWFwOwogdXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgaGFyZHdhcmU6OkhpZGxNZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7Cit0eXBlZGVmIGhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvciBUQWxsb2NhdG9yOwordHlwZWRlZiBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnkgVE1lbW9yeTsKIAogLy8gSSB3YW50IHRoZSBleHByZXNzaW9uICJ5IiBldmFsdWF0ZWQgZXZlbiBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgb2ZmLgogI2RlZmluZSBNWV9MT0dWKHgsIHkpIFwKQEAgLTExNywxNSArMTE4LDEyIEBACiAgICAgdm9pZCBzaWduYWxOZXdTYW1wbGVBZXNLZXkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZrZXlJdGVtKTsKIAogcHJpdmF0ZToKLSAgICBzdHJ1Y3QgU3RyZWFtSW5mbyB7Ci0gICAgICAgIHVuc2lnbmVkIG1UeXBlOwotICAgICAgICB1bnNpZ25lZCBtUElEOwotICAgICAgICBpbnQzMl90IG1DQVN5c3RlbUlkOwotICAgIH07CiAKICAgICBBVFNQYXJzZXIgKm1QYXJzZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1OdW1iZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1NYXBQSUQ7CisgICAgdWludDMyX3QgbVBNVFZlcnNpb247CisgICAgdWludDMyX3QgbVBNVF9DUkM7CiAgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFN0cmVhbT4gPiBtU3RyZWFtczsKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwogICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKQEAgLTE0MiwxNSArMTQwLDE1IEBACiB9OwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpTdHJlYW0gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgU3RyZWFtKFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKTsKKyAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwgdW5zaWduZWQgUENSX1BJRCwgY29uc3QgU3RyZWFtSW5mbyAmaW5mbyk7CiAKICAgICB1bnNpZ25lZCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICB1bnNpZ25lZCB0eXBlRXh0KCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGVFeHQ7IH0KICAgICB1bnNpZ25lZCBwaWQoKSBjb25zdCB7IHJldHVybiBtRWxlbWVudGFyeVBJRDsgfQogICAgIHZvaWQgc2V0UElEKHVuc2lnbmVkIHBpZCkgeyBtRWxlbWVudGFyeVBJRCA9IHBpZDsgfQorICAgIHZvaWQgc2V0QXVkaW9QcmVzZW50YXRpb25zKEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBhdWRpb1ByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyA9IGF1ZGlvUHJlc2VudGF0aW9uczsKKyAgICB9CiAKICAgICB2b2lkIHNldENhc0luZm8oCiAgICAgICAgICAgICBpbnQzMl90IHN5c3RlbUlkLApAQCAtMTk0LDYgKzE5Miw3IEBACiAgICAgUHJvZ3JhbSAqbVByb2dyYW07CiAgICAgdW5zaWduZWQgbUVsZW1lbnRhcnlQSUQ7CiAgICAgdW5zaWduZWQgbVN0cmVhbVR5cGU7CisgICAgdW5zaWduZWQgbVN0cmVhbVR5cGVFeHQ7CiAgICAgdW5zaWduZWQgbVBDUl9QSUQ7CiAgICAgaW50MzJfdCBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlcjsKIApAQCAtMjEwLDEzICsyMDksMTYgQEAKICAgICBib29sIG1TY3JhbWJsZWQ7CiAgICAgYm9vbCBtU2FtcGxlRW5jcnlwdGVkOwogICAgIHNwPEFNZXNzYWdlPiBtU2FtcGxlQWVzS2V5SXRlbTsKLSAgICBzcDxJTWVtb3J5PiBtTWVtOwotICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKLSAgICBzcDxIaWRsTWVtb3J5PiBtSGlkbE1lbW9yeTsKKyAgICBzcDxUTWVtb3J5PiBtSGlkbE1lbW9yeTsKKyAgICBzcDxUQWxsb2NhdG9yPiBtSGlkbEFsbG9jYXRvcjsKICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBtRGVzY3JhbWJsZXJTcmNCdWZmZXI7CiAgICAgc3A8QUJ1ZmZlcj4gbURlc2NyYW1ibGVkQnVmZmVyOwogICAgIExpc3Q8U3ViU2FtcGxlSW5mbz4gbVN1YlNhbXBsZXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CisgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisKKyAgICAvLyBTZW5kIGF1ZGlvIHByZXNlbnRhdGlvbnMgYWxvbmcgd2l0aCBhY2Nlc3MgdW5pdHMuCisgICAgdm9pZCBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICAvLyBGbHVzaCBhY2N1bXVsYXRlZCBwYXlsb2FkIGlmIG5lY2Vzc2FyeSAtLS0gaS5lLiBhdCBFT1Mgb3IgYXQgdGhlIHN0YXJ0IG9mCiAgICAgLy8gYW5vdGhlciBwYXlsb2FkLiBldmVudCBpcyBzZXQgaWYgdGhlIGZsdXNoZWQgcGF5bG9hZCBpcyBQRVMgd2l0aCBhIHN5bmMKQEAgLTI5OSw2ICszMDEsOCBAQAogICAgIDogbVBhcnNlcihwYXJzZXIpLAogICAgICAgbVByb2dyYW1OdW1iZXIocHJvZ3JhbU51bWJlciksCiAgICAgICBtUHJvZ3JhbU1hcFBJRChwcm9ncmFtTWFwUElEKSwKKyAgICAgIG1QTVRWZXJzaW9uKDB4ZmZmZmZmZmYpLAorICAgICAgbVBNVF9DUkMoMHhmZmZmZmZmZiksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCiAgICAgICBtRmlyc3RQVFMoMCksCiAgICAgICBtTGFzdFJlY292ZXJlZFBUUyhsYXN0UmVjb3ZlcmVkUFRTKSB7CkBAIC00NDcsNyArNDUxLDcgQEAKICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gaW5mb0xlbmd0aCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IDkgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9DQSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CiAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICBjYURlc2NyaXB0b3ItPm1TeXN0ZW1JRCA9IGJyLT5nZXRCaXRzKDE2KTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKQEAgLTQ4Niw3ICs0OTAsMTMgQEAKIAogICAgIE1ZX0xPR1YoIiAgcHJvZ3JhbV9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDE2KSk7CiAgICAgTVlfTE9HVigiICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMikpOwotICAgIE1ZX0xPR1YoIiAgdmVyc2lvbl9udW1iZXIgPSAldSIsIGJyLT5nZXRCaXRzKDUpKTsKKyAgICBib29sIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBwbXRWZXJzaW9uID0gYnItPmdldEJpdHMoNSk7CisgICAgaWYgKHBtdFZlcnNpb24gIT0gbVBNVFZlcnNpb24pIHsKKyAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1QTVRWZXJzaW9uID0gcG10VmVyc2lvbjsKKyAgICB9CisgICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgcG10VmVyc2lvbik7CiAgICAgTVlfTE9HVigiICBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gJXUiLCBici0+Z2V0Qml0cygxKSk7CiAgICAgTVlfTE9HVigiICBzZWN0aW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoOCkpOwogICAgIE1ZX0xPR1YoIiAgbGFzdF9zZWN0aW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoOCkpOwpAQCAtNTEzLDQzICs1MjMsMTY2IEBACiAgICAgLy8gaW5mb0J5dGVzUmVtYWluaW5nIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYWtlIHVwIHRoZQogICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBzZWN0aW9uIG9mIEVTX2luZm9zLiBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZQogICAgIC8vIGZpbmFsIENSQy4KLSAgICBzaXplX3QgaW5mb0J5dGVzUmVtYWluaW5nID0gc2VjdGlvbl9sZW5ndGggLSA5IC0gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDQ7CisgICAgaW50MzJfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKIAogICAgIHdoaWxlIChpbmZvQnl0ZXNSZW1haW5pbmcgPj0gNSkgewotCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUgPSBici0+Z2V0Qml0cyg4KTsKLSAgICAgICAgQUxPR1YoIiAgICBzdHJlYW1fdHlwZSA9IDB4JTAyeCIsIHN0cmVhbVR5cGUpOwotCisgICAgICAgIFN0cmVhbUluZm8gaW5mbzsKKyAgICAgICAgaW5mby5tVHlwZSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4IiwgaW5mby5tVHlwZSk7CiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoMykpOwogCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQgPSBici0+Z2V0Qml0cygxMyk7Ci0gICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBlbGVtZW50YXJ5UElEKTsKKyAgICAgICAgaW5mby5tUElEID0gYnItPmdldEJpdHMoMTMpOworICAgICAgICBBTE9HVigiICAgIGVsZW1lbnRhcnlfUElEID0gMHglMDR4IiwgaW5mby5tUElEKTsKIAogICAgICAgICBNWV9MT0dWKCIgICAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDQpKTsKIAogICAgICAgICB1bnNpZ25lZCBFU19pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICAgICAgQUxPR1YoIiAgICBFU19pbmZvX2xlbmd0aCA9ICV1IiwgRVNfaW5mb19sZW5ndGgpOworICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOwogCiAgICAgICAgIENBRGVzY3JpcHRvciBzdHJlYW1DQTsKLSAgICAgICAgYm9vbCBoYXNTdHJlYW1DQSA9IGZpbmRDQURlc2NyaXB0b3IoYnIsIEVTX2luZm9fbGVuZ3RoLCAmc3RyZWFtQ0EpOworICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX1JFU0VSVkVEX01BWDsKKworICAgICAgICBpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgYm9vbCBoYXNTdHJlYW1DQSA9IGZhbHNlOworICAgICAgICB3aGlsZSAoRVNfaW5mb19sZW5ndGggPiAyICYmIGluZm9CeXRlc1JlbWFpbmluZyA+PSAwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX3RhZyA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZyA9IDB4JTAyeCIsIGRlc2NyaXB0b3JfdGFnKTsKKworICAgICAgICAgICAgdW5zaWduZWQgZGVzY3JpcHRvcl9sZW5ndGggPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIEFMT0dWKCIgICAgICBsZW4gPSAldSIsIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKworICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX2xlbmd0aCA+IEVTX2luZm9fbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKKyAgICAgICAgICAgICAgICBoYXNTdHJlYW1DQSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1QSUQgPSBici0+Z2V0Qml0cygxNikgJiAweDFmZmY7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGggLT0gNDsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tUHJpdmF0ZURhdGEuYXNzaWduKGJyLT5kYXRhKCksIGJyLT5kYXRhKCkgKyBkZXNjcmlwdG9yX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8ubVR5cGUgPT0gU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICYmCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfRFZCX0VYVEVOU0lPTiAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgZGVzY1RhZ0V4dCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgICB0YWdfZXh0ID0gMHglMDJ4IiwgZGVzY1RhZ0V4dCk7CisgICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggLT0gZGVzY3JpcHRvcl9sZW5ndGg7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9sZW5ndGgtLTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgQUM0IGRlc2NyaXB0b3IgaXMgdXNlZCBpbiB0aGUgUFNJIFBNVCB0byBpZGVudGlmeSBzdHJlYW1zIHdoaWNoIGNhcnJ5IEFDNAorICAgICAgICAgICAgICAgIC8vIGF1ZGlvLgorICAgICAgICAgICAgICAgIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BQzQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tVHlwZUV4dCA9IEVYVF9ERVNDUklQVE9SX0RWQl9BQzQ7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY1RhZ0V4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQVVESU9fUFJFU0VMRUNUSU9OICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERWQiBCbHVlQm9vayBBMDM4IFRhYmxlIDExMAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fcHJlc2VsZWN0aW9ucyA9IGJyLT5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX3ByZXNlbGVjdGlvbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgICAgICAgICAgICAgYXAubVByZXNlbnRhdGlvbklkID0gYnItPmdldEJpdHMoNSk7ICAvLyBwcmVzZWxlY3Rpb25faWQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW9fcmVuZGVyaW5nX2luZGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gc3RhdGljX2Nhc3Q8TWFzdGVyaW5nSW5kaWNhdGlvbj4oYnItPmdldEJpdHMoMykpOworICAgICAgICAgICAgICAgICAgICAgICAgYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJhY3Rpdml0eV9lbmFibGVkID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgTVlfTE9HVigiICAgICAgaW50ZXJhY3Rpdml0eV9lbmFibGVkID0gJWQiLCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxhbmd1YWdlX2NvZGVfcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGV4dF9sYWJlbF9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZ1dHVyZV9leHRlbnNpb24gPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2VfY29kZV9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgMjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsYW5ndWFnZVs0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVswXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzFdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMl0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVszXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gU3RyaW5nOChsYW5ndWFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWFwcyB0aGUgcHJlc2VudGF0aW9uIGlkIHRvIHRoZSBtZXNzYWdlIGlkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRVhUX0RFU0NSSVBUT1JfRFZCX01FU1NBR0Ugc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBwcmVzZW50YXRpb24gbGFiZWwuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9sYWJlbF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtZXNzYWdlX2lkID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVlfTE9HVigiICAgICAgbWVzc2FnZV9pZCA9ICV1IiwgbWVzc2FnZV9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aV9zdHJlYW1faW5mb19wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fYXV4X2NvbXBvbmVudHMgPSBici0+Z2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoNSk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IChudW1fYXV4X2NvbXBvbmVudHMgKiA4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMobnVtX2F1eF9jb21wb25lbnRzICogOCk7ICAvLyBjb21wb25lbnRfdGFnCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnV0dXJlX2V4dGVuc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKDMpOyAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmdXR1cmVfZXh0ZW5zaW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IChmdXR1cmVfZXh0ZW5zaW9uX2xlbmd0aCAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhmdXR1cmVfZXh0ZW5zaW9uX2xlbmd0aCAqIDgpOyAgLy8gZnV0dXJlX2V4dGVuc2lvbl9ieXRlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoaGFzU3RyZWFtQ0EgJiYgIW1QYXJzZXItPm1DYXNNYW5hZ2VyLT5hZGRTdHJlYW0oCi0gICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGVsZW1lbnRhcnlQSUQsIHN0cmVhbUNBKSkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmFtTnVtYmVyLCBpbmZvLm1QSUQsIHN0cmVhbUNBKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQotICAgICAgICBTdHJlYW1JbmZvIGluZm87Ci0gICAgICAgIGluZm8ubVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICBpbmZvLm1QSUQgPSBlbGVtZW50YXJ5UElEOwotICAgICAgICBpbmZvLm1DQVN5c3RlbUlkID0gaGFzUHJvZ3JhbUNBID8gcHJvZ3JhbUNBLm1TeXN0ZW1JRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdHJlYW1DQSA/IHN0cmVhbUNBLm1TeXN0ZW1JRCAgOiAtMTsKLSAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKKyAgICAgICAgaWYgKGhhc1Byb2dyYW1DQSkgeworICAgICAgICAgICAgaW5mby5tQ0FEZXNjcmlwdG9yID0gcHJvZ3JhbUNBOworICAgICAgICB9IGVsc2UgaWYgKGhhc1N0cmVhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBzdHJlYW1DQTsKKyAgICAgICAgfQogCi0gICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CisgICAgICAgIGluZm9zLnB1c2goaW5mbyk7CiAgICAgfQogCiAgICAgaWYgKGluZm9CeXRlc1JlbWFpbmluZyAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTZWN0aW9uIGRhdGEgcmVtYWlucyB1bmNvbnN1bWVkIik7CiAgICAgfQotICAgIE1ZX0xPR1YoIiAgQ1JDID0gMHglMDh4IiwgYnItPmdldEJpdHMoMzIpKTsKKyAgICB1bnNpZ25lZCBjcmMgPSBici0+Z2V0Qml0cygzMik7CisgICAgaWYgKGNyYyAhPSBtUE1UX0NSQykgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVF9DUkMgPSBjcmM7CisgICAgfQorICAgIE1ZX0xPR1YoIiAgQ1JDID0gMHglMDh4IiwgY3JjKTsKIAogICAgIGJvb2wgUElEc0NoYW5nZWQgPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CkBAIC02MDEsMTYgKzczNCwxOSBAQAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbXMuaW5kZXhPZktleShpbmZvLm1QSUQpOwogCiAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHNwPFN0cmVhbT4gc3RyZWFtID0gbmV3IFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgaW5mby5tUElELCBpbmZvLm1UeXBlLCBQQ1JfUElELCBpbmZvLm1DQVN5c3RlbUlkKTsKKyAgICAgICAgICAgIHNwPFN0cmVhbT4gc3RyZWFtID0gbmV3IFN0cmVhbSh0aGlzLCBQQ1JfUElELCBpbmZvKTsKIAogICAgICAgICAgICAgaWYgKG1TYW1wbGVBZXNLZXlJdGVtICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBzdHJlYW0tPnNpZ25hbE5ld1NhbXBsZUFlc0tleShtU2FtcGxlQWVzS2V5SXRlbSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlzQWRkaW5nU2NyYW1ibGVkU3RyZWFtIHw9IGluZm8ubUNBU3lzdGVtSWQgPj0gMDsKKyAgICAgICAgICAgIGlzQWRkaW5nU2NyYW1ibGVkU3RyZWFtIHw9IGluZm8ubUNBRGVzY3JpcHRvci5tU3lzdGVtSUQgPj0gMDsKICAgICAgICAgICAgIG1TdHJlYW1zLmFkZChpbmZvLm1QSUQsIHN0cmVhbSk7CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaW5kZXggPj0gMCAmJiBtU3RyZWFtcy5lZGl0VmFsdWVBdChpbmRleCktPmlzQXVkaW8oKQorICAgICAgICAgICAgICAgICAmJiBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkKSB7CisgICAgICAgICAgICBtU3RyZWFtcy5lZGl0VmFsdWVBdChpbmRleCktPnNldEF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGlzQWRkaW5nU2NyYW1ibGVkU3RyZWFtKSB7CkBAIC02MjUsMjEgKzc2MSwyMSBAQAogICAgIC8vIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuIFRvIGhhbmRsZSB0aGUgd3JhcC1hcm91bmQsIHVzZSBmYW5jeSBtYXRoCiAgICAgLy8gdG8gZ2V0IGFuIGV4dGVuZGVkIFBUUyB0aGF0IGlzIHdpdGhpbiBbLTB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZdCiAgICAgLy8gb2YgdGhlIGxhdGVzdCByZWNvdmVyZWQgUFRTLgotICAgIGlmIChtTGFzdFJlY292ZXJlZFBUUyA8IDBsbCkgeworICAgIGlmIChtTGFzdFJlY292ZXJlZFBUUyA8IDBMTCkgewogICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIDMzYml0IG51bWJlciBmb3IgMXN0IGZyYW1lLCB0aGUgcmVhc29uIGlzIHRoYXQKICAgICAgICAgLy8gaWYgMXN0IGZyYW1lIHdyYXBzIHRvIG5lZ2F0aXZlIHRoYXQncyBmYXIgYXdheSBmcm9tIDAsIHdlIGNvdWxkCiAgICAgICAgIC8vIG5ldmVyIHN0YXJ0LiBPbmx5IHN0YXJ0IHdyYXBwaW5nIGFyb3VuZCBmcm9tIDJuZCBmcmFtZS4KICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihQVFNfMzNiaXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oCi0gICAgICAgICAgICAgICAgKChtTGFzdFJlY292ZXJlZFBUUyAtIHN0YXRpY19jYXN0PGludDY0X3Q+KFBUU18zM2JpdCkgKyAweDEwMDAwMDAwMGxsKQorICAgICAgICAgICAgICAgICgobUxhc3RSZWNvdmVyZWRQVFMgLSBzdGF0aWNfY2FzdDxpbnQ2NF90PihQVFNfMzNiaXQpICsgMHgxMDAwMDAwMDBMTCkKICAgICAgICAgICAgICAgICAmIDB4ZmZmZmZmZmUwMDAwMDAwMHVsbCkgfCBQVFNfMzNiaXQpOwogICAgICAgICAvLyBXZSBzdGFydCBmcm9tIDAsIGJ1dCByZWNvdmVyZWQgUFRTIGNvdWxkIGJlIHNsaWdodGx5IGJlbG93IDAuCiAgICAgICAgIC8vIENsYW1wIGl0IHRvIDAgYXMgcmVzdCBvZiB0aGUgcGlwZWxpbmUgZG9lc24ndCB0YWtlIG5lZ2F0aXZlIHB0cy4KICAgICAgICAgLy8gKGVnLiB2aWRlbyBpcyByZWFkIGZpcnN0IGFuZCBzdGFydHMgYXQgMCwgYnV0IGF1ZGlvIHN0YXJ0cyBhdCAweGZmZmZmZmYwKQotICAgICAgICBpZiAobUxhc3RSZWNvdmVyZWRQVFMgPCAwbGwpIHsKKyAgICAgICAgaWYgKG1MYXN0UmVjb3ZlcmVkUFRTIDwgMExMKSB7CiAgICAgICAgICAgICBBTE9HSSgiQ2xhbXBpbmcgbmVnYXRpdmUgcmVjb3ZlcmVkIFBUUyAoJSIgUFJJZDY0ICIpIHRvIDAiLCBtTGFzdFJlY292ZXJlZFBUUyk7Ci0gICAgICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IDBsbDsKKyAgICAgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gMExMOwogICAgICAgICB9CiAgICAgfQogCkBAIC02ODksNyArODI1LDcgQEAKIAogICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMCkgLyA5OwogCi0gICAgaWYgKG1QYXJzZXItPm1BYnNvbHV0ZVRpbWVBbmNob3JVcyA+PSAwbGwpIHsKKyAgICBpZiAobVBhcnNlci0+bUFic29sdXRlVGltZUFuY2hvclVzID49IDBMTCkgewogICAgICAgICB0aW1lVXMgKz0gbVBhcnNlci0+bUFic29sdXRlVGltZUFuY2hvclVzOwogICAgIH0KIApAQCAtNzE3LDM0ICs4NTMsMzMgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga0luaXRpYWxTdHJlYW1CdWZmZXJTaXplID0gMTkyICogMTAyNDsKIAogQVRTUGFyc2VyOjpTdHJlYW06OlN0cmVhbSgKLSAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpCisgICAgICAgIFByb2dyYW0gKnByb2dyYW0sIHVuc2lnbmVkIFBDUl9QSUQsIGNvbnN0IFN0cmVhbUluZm8gJmluZm8pCiAgICAgOiBtUHJvZ3JhbShwcm9ncmFtKSwKLSAgICAgIG1FbGVtZW50YXJ5UElEKGVsZW1lbnRhcnlQSUQpLAotICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICBtRWxlbWVudGFyeVBJRChpbmZvLm1QSUQpLAorICAgICAgbVN0cmVhbVR5cGUoaW5mby5tVHlwZSksCisgICAgICBtU3RyZWFtVHlwZUV4dChpbmZvLm1UeXBlRXh0KSwKICAgICAgIG1QQ1JfUElEKFBDUl9QSUQpLAogICAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIoLTEpLAogICAgICAgbVBheWxvYWRTdGFydGVkKGZhbHNlKSwKICAgICAgIG1FT1NSZWFjaGVkKGZhbHNlKSwKICAgICAgIG1QcmV2UFRTKDApLAogICAgICAgbVF1ZXVlKE5VTEwpLAotICAgICAgbVNjcmFtYmxlZChDQV9zeXN0ZW1fSUQgPj0gMCkgewotCisgICAgICBtU2NyYW1ibGVkKGluZm8ubUNBRGVzY3JpcHRvci5tU3lzdGVtSUQgPj0gMCksCisgICAgICBtQXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucykgewogICAgIG1TYW1wbGVFbmNyeXB0ZWQgPQogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEICB8fAogICAgICAgICAgICAgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEOwogCiAgICAgQUxPR1YoIm5ldyBzdHJlYW0gUElEIDB4JTAyeCwgdHlwZSAweCUwMngsIHNjcmFtYmxlZCAlZCwgU2FtcGxlRW5jcnlwdGVkOiAlZCIsCi0gICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlLCBtU2NyYW1ibGVkLCBtU2FtcGxlRW5jcnlwdGVkKTsKKyAgICAgICAgICAgIGluZm8ubVBJRCwgaW5mby5tVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9Ci0gICAgICAgICAgICAoaXNWaWRlbygpICYmIG1TY3JhbWJsZWQpID8gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TY3JhbWJsZWREYXRhIDoKLSAgICAgICAgICAgIChtU2FtcGxlRW5jcnlwdGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2FtcGxlRW5jcnlwdGVkRGF0YSA6Ci0gICAgICAgICAgICAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAoKChpc1ZpZGVvKCkgfHwgaXNBdWRpbygpKSAmJiBtU2NyYW1ibGVkKSkgeworICAgICAgICBmbGFncyA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YTsKKyAgICB9IGVsc2UgaWYgKG1TYW1wbGVFbmNyeXB0ZWQpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGE7CisgICAgfQogCiAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNb2RlIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OklOVkFMSUQ7CiAKQEAgLTc4MSwxMyArOTE2LDIzIEBACiAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzM7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfRUFDMzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkVBQzM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0KSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TUVUQURBVEE7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoInN0cmVhbSBQSUQgMHglMDJ4IGhhcyBpbnZhbGlkIHN0cmVhbSB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtODA3LDcgKzk1MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpc0F1ZGlvKCkgPyBNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEKTsKICAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgQ0Ffc3lzdGVtX0lEKTsKKyAgICAgICAgICAgIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvciA9IGluZm8ubUNBRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBkZXNjcmlwdG9yLm1TeXN0ZW1JRCk7CisKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBUHJpdmF0ZURhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEuc2l6ZSgpKTsKKwogICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICB9CiAgICAgfQpAQCAtODI3LDE2ICs5NzgsNDMgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPT0gTlVMTCA/IDAgOiBtQnVmZmVyLT5jYXBhY2l0eSgpLCBuZWVkZWRTaXplLCBtU2NyYW1ibGVkKTsKIAogICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciwgbmV3U2NyYW1ibGVkQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG5ld01lbTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG5ld0RlYWxlcjsKKyAgICBzcDxUTWVtb3J5PiBuZXdNZW07CiAgICAgaWYgKG1TY3JhbWJsZWQpIHsKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOwotICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyAoYWxpZ25tZW50IC0gMSkpICYgfihhbGlnbm1lbnQgLSAxKTsKLSAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwotICAgICAgICBuZXdEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG5lZWRlZFNpemUsICJBVFNQYXJzZXIiKTsKLSAgICAgICAgbmV3TWVtID0gbmV3RGVhbGVyLT5hbGxvY2F0ZShuZWVkZWRTaXplKTsKLSAgICAgICAgbmV3U2NyYW1ibGVkQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3TWVtLT5wb2ludGVyKCksIG5ld01lbS0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1IaWRsQWxsb2NhdG9yID0gVEFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgICAgICAgICBpZiAobUhpZGxBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBjYW4ndCBnZXQgaGlkbCBhbGxvY2F0b3IiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGlkbF9tZW1vcnkgaGlkbE1lbVRva2VuOworICAgICAgICBib29sIHN1Y2Nlc3M7CisgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtSGlkbEFsbG9jYXRvci0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbmVlZGVkU2l6ZSwKKyAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZoaWRsTWVtVG9rZW5dKAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQgYXQgdGhlIHRyYW5zcG9ydDogJXMiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgdHJhbnNTdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGFsbG9jYXRvciBmYWlsZWQiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWVtID0gbWFwTWVtb3J5KGhpZGxNZW1Ub2tlbik7CisgICAgICAgIGlmIChuZXdNZW0gPT0gbnVsbHB0ciB8fCBuZXdNZW0tPmdldFBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBmYWlsZWQgdG8gbWFwIG1lbW9yeSIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+Z2V0UG9pbnRlcigpLCBuZXdNZW0tPmdldFNpemUoKSk7CiAKICAgICAgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkobmV3U2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksCkBAIC04NDUsMjQgKzEwMjMsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgICAgIH0KLSAgICAgICAgbU1lbSA9IG5ld01lbTsKLSAgICAgICAgbURlYWxlciA9IG5ld0RlYWxlcjsKKyAgICAgICAgbUhpZGxNZW1vcnkgPSBuZXdNZW07CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKIAotICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gaGlkbE1lbVRva2VuOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gMFVMTDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAgKHVpbnQ2NF90KW5lZWRlZFNpemU7CiAKLSAgICAgICAgbUhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOwotCi0gICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgb2Zmc2V0ICV6ZCwgc2l6ZSAlenUiLAotICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBvZmZzZXQsIHNpemUpOworICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbmVlZGVkU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtOTg2LDkgKzExNTUsMTIgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQUNfRU5DUllQVEVEOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQToKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZUV4dCA9PSBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMzQ3LDcgKzE1MTksNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobURlc2NyYW1ibGVkQnVmZmVyID09IE5VTEwgfHwgbU1lbSA9PSBOVUxMKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1IaWRsTWVtb3J5ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJlY2VpdmVkIHNjcmFtYmxlZCBwYWNrZXRzIHdpdGhvdXQgc2hhcmVkIG1lbW9yeSEiKTsKIAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTEzOTUsNyArMTU2Nyw3IEBACiAgICAgLy8gUGVyZm9ybSB0aGUgMXN0IHBhc3MgZGVzY3JhbWJsaW5nIGlmIG5lZWRlZAogICAgIGlmIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSB7CiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwotICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CisgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IHN1YlNhbXBsZXM7CiAgICAgICAgIHN1YlNhbXBsZXMucmVzaXplKGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKQEAgLTE0MTIsMTAgKzE1ODQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdWludDY0X3Qgc3JjT2Zmc2V0ID0gMCwgZHN0T2Zmc2V0ID0gMDsKLSAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBzaG91bGQgYmUgc2tpcHBlZAorICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgogICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgc3JjT2Zmc2V0ID0gZHN0T2Zmc2V0ID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mQ2xlYXJEYXRhID0gcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3ViU2FtcGxlc1swXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSAtPSBwZXNPZmZzZXQ7CiAgICAgICAgIH0KIApAQCAtMTQzMSw5ICsxNjAyLDkgQEAKICAgICAgICAgICAgICAgICAoU2NyYW1ibGluZ0NvbnRyb2wpIHNjdHJsLAogICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLAotICAgICAgICAgICAgICAgIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qc3JjT2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAotICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAwIC8qZHN0T2Zmc2V0Ki8sCiAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZieXRlc1dyaXR0ZW4sICZkZXRhaWxlZEVycm9yXSAoCiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgX3N0YXR1cywgdWludDMyX3QgX2J5dGVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBfZGV0YWlsZWRFcnJvcikgewpAQCAtMTQ0MiwxNyArMTYxMywyOSBAQAogICAgICAgICAgICAgICAgICAgICBkZXRhaWxlZEVycm9yID0gX2RldGFpbGVkRXJyb3I7CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcyIsCi0gICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCByZXR1cm5Wb2lkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7Ci0gICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOworCisgICAgICAgIC8vIFNldCBkZXNjcmFtYmxlQnl0ZXMgdG8gdGhlIHJldHVybmVkIHJlc3VsdC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWlnaHQgYmUgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgZGF0YS4KKyAgICAgICAgLy8gKGVnLiB3aGVuIHdlJ3JlIGRlc2NyYW1ibGluZyB0aGUgUEVTIGhlYWRlciBwb3J0aW9uIG9mIGEgc2VjdXJlIHN0cmVhbSwKKyAgICAgICAgLy8gdGhlIHBsdWdpbiBtaWdodCBjdXQgaXQgb2ZmIHJpZ2h0IGFmdGVyIHRoZSBQRVMgaGVhZGVyLikKKyAgICAgICAgZGVzY3JhbWJsZUJ5dGVzID0gYnl0ZXNXcml0dGVuOwogICAgIH0KIAorICAgIC8vIHxidWZmZXJ8IHBvaW50cyB0byB0aGUgYnVmZmVyIGZyb20gd2hpY2ggd2UnZCBwYXJzZSB0aGUgUEVTIGhlYWRlci4KKyAgICAvLyBXaGVuIHRoZSBvdXRwdXQgc3RyZWFtIGlzIHNjcmFtYmxlZCwgaXQgcG9pbnRzIHRvIG1EZXNjcmFtYmxlZEJ1ZmZlcgorICAgIC8vICh1bmxlc3MgYWxsIHBhY2tldHMgaW4gdGhpcyBQRVMgYXJlIGFjdHVhbGx5IGNsZWFyLCBpbiB3aGljaCBjYXNlLAorICAgIC8vIGl0IHBvaW50cyB0byBtQnVmZmVyIHNpbmNlIHdlIG5ldmVyIGNvcGllZCBpbnRvIG1EZXNjcmFtYmxlZEJ1ZmZlcikuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBjbGVhciwgaXQgcG9pbnRzIHRvIG1CdWZmZXIsIGFuZCB3ZSdsbAorICAgIC8vIGNvcHkgYWxsIGRlc2NyYW1ibGVkIGRhdGEgYmFjayB0byBtQnVmZmVyLgorICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1CdWZmZXI7CiAgICAgaWYgKG1RdWV1ZS0+aXNTY3JhbWJsZWQoKSkgewogICAgICAgICAvLyBRdWV1ZSBzdWJTYW1wbGUgaW5mbyBmb3Igc2NyYW1ibGVkIHF1ZXVlCiAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihtU3ViU2FtcGxlcy5zaXplKCkgKiA0KTsKQEAgLTE0NjQsOCArMTY0Nyw3IEBACiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1TdWJTYW1wbGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgaXQgIT0gbVN1YlNhbXBsZXMuZW5kKCk7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKChpdC0+dHJhbnNwb3J0X3NjcmFtYmxpbmdfbW9kZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHBlc1NjcmFtYmxpbmdDb250cm9sID09IDApCi0gICAgICAgICAgICAgICAgICAgIHx8IGkgPCBkZXNjcmFtYmxlU3ViU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNsZWFyU2l6ZVB0cltpXSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgICAgIGVuY1NpemVQdHJbaV0gPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE0NzQsMTQgKzE2NTYsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzU3luYyB8PSBpdC0+cmFuZG9tX2FjY2Vzc19pbmRpY2F0b3I7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIGlzIGluIHRoZSBjbGVhcgorICAgICAgICBpZiAocGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgeworICAgICAgICAgICAgY2xlYXJTaXplUHRyWzBdID0gcGVzT2Zmc2V0OworICAgICAgICAgICAgZW5jU2l6ZVB0clswXSAtPSBwZXNPZmZzZXQ7CisgICAgICAgIH0KICAgICAgICAgLy8gUGFzcyB0aGUgb3JpZ2luYWwgVFMgc3Vic2FtcGxlIHNpemUgbm93LiBUaGUgUEVTIGhlYWRlciBhZGp1c3QKICAgICAgICAgLy8gd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIHNjcmFtYmxlZCBBVSBpcyBkZXF1ZXVlZC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IGlmIGRlc2NyYW1ibGVCeXRlcyBpcyAwLCBpdCBtZWFucyB0aGlzIFBFUyBjb250YWlucyBvbmx5CisgICAgICAgIC8vIGFsbCB0cyBwYWNrZXRzLCBsZWFkaW5nQ2xlYXJCeXRlcyBpcyBlbnRpcmUgYnVmZmVyIHNpemUuCiAgICAgICAgIG1RdWV1ZS0+YXBwZW5kU2NyYW1ibGVkRGF0YSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSwgc2N0cmwsCi0gICAgICAgICAgICAgICAgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgKGRlc2NyYW1ibGVCeXRlcyA+IDApID8gZGVzY3JhbWJsZUJ5dGVzIDogbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIHNjdHJsLCBpc1N5bmMsIGNsZWFyU2l6ZXNCdWZmZXIsIGVuY1NpemVzQnVmZmVyKTsKKworICAgICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0gbURlc2NyYW1ibGVkQnVmZmVyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSwgbURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CiAgICAgfQogCi0gICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisgICAgQUJpdFJlYWRlciBicihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZiciwgZXZlbnQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTUxNCw2ICsxNzExLDEzIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6YWRkQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0U3RyZWFtKHN0ZDo6aW9zOjpvdXQpOworICAgIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhtQXVkaW9QcmVzZW50YXRpb25zLCAmb3V0U3RyZWFtKTsKKyAgICBzcDxBQnVmZmVyPiBhcCA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShvdXRTdHJlYW0uc3RyKCkuZGF0YSgpLCBvdXRTdHJlYW0uc3RyKCkuc2l6ZSgpKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0QnVmZmVyKCJhdWRpby1wcmVzZW50YXRpb24taW5mbyIsIGFwKTsKK30KKwogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCiAgICAgICAgIHVuc2lnbmVkIFBFU19zY3JhbWJsaW5nX2NvbnRyb2wsCkBAIC0xNTI5LDcgKzE3MzMsNyBAQAogCiAgICAgQUxPR1YoIm9uUGF5bG9hZERhdGEgbVN0cmVhbVR5cGU9MHglMDJ4IHNpemU6ICV6dSIsIG1TdHJlYW1UeXBlLCBzaXplKTsKIAotICAgIGludDY0X3QgdGltZVVzID0gMGxsOyAgLy8gbm8gcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBhdmFpbGFibGUuCisgICAgaW50NjRfdCB0aW1lVXMgPSAwTEw7ICAvLyBubyBwcmVzZW50YXRpb24gdGltZXN0YW1wIGF2YWlsYWJsZS4KICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMykgewogICAgICAgICB0aW1lVXMgPSBtUHJvZ3JhbS0+Y29udmVydFBUU1RvVGltZXN0YW1wKFBUUyk7CiAgICAgfQpAQCAtMTU2NCw2ICsxNzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKQEAgLTE1NzYsNiArMTc4Myw5IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXVkaW9QcmVzZW50YXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApAQCAtMTY1OSwxMCArMTg2OSwxMCBAQAogCiBBVFNQYXJzZXI6OkFUU1BhcnNlcih1aW50MzJfdCBmbGFncykKICAgICA6IG1GbGFncyhmbGFncyksCi0gICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoLTFsbCksCisgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoLTFMTCksCiAgICAgICBtVGltZU9mZnNldFZhbGlkKGZhbHNlKSwKLSAgICAgIG1UaW1lT2Zmc2V0VXMoMGxsKSwKLSAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKC0xbGwpLAorICAgICAgbVRpbWVPZmZzZXRVcygwTEwpLAorICAgICAgbUxhc3RSZWNvdmVyZWRQVFMoLTFMTCksCiAgICAgICBtTnVtVFNQYWNrZXRzUGFyc2VkKDApLAogICAgICAgbU51bVBDUnMoMCkgewogICAgIG1QU0lTZWN0aW9ucy5hZGQoMCAvKiBQSUQgKi8sIG5ldyBQU0lTZWN0aW9uKTsKQEAgLTE3MDQsNyArMTkxNCw3IEBACiAgICAgICAgIGlmICgobUZsYWdzICYgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpCiAgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0FUU1BhcnNlcktleVJlY2VudE1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICBpZiAobUFic29sdXRlVGltZUFuY2hvclVzID49IDBsbCkgeworICAgICAgICAgICAgaWYgKG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA+PSAwTEwpIHsKICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAtPSBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVRpbWVPZmZzZXRWYWxpZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGZiZjE0OTYuLmE1MDdiOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTI1LDE3ICsyNSwxOSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCBlY2UwNjkyLi42MmUzYTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jb25zdCBpbnQ2NF90IGtOZWFyRU9TTWFya1VzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKK2NvbnN0IGludDY0X3Qga05lYXJFT1NNYXJrVXMgPSAyMDAwMDAwTEw7IC8vIDIgc2VjcwogCiBBbm90aGVyUGFja2V0U291cmNlOjpBbm90aGVyUGFja2V0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKICAgICA6IG1Jc0F1ZGlvKGZhbHNlKSwKQEAgLTIyMyw5ICsyMjMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAga0tleU1wZWdVc2VyRGF0YSwgMCwgbXBlZ1VzZXJEYXRhLT5kYXRhKCksIG1wZWdVc2VyRGF0YS0+c2l6ZSgpKTsKICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGFwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwgJmFwKSAmJiBhcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sIDAsIGFwLT5kYXRhKCksIGFwLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBjcnlwdG9Nb2RlOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3J5cHRvTW9kZSIsICZjcnlwdG9Nb2RlKSkgewogICAgICAgICAgICAgaW50MzJfdCBjcnlwdG9LZXk7CisgICAgICAgICAgICBpbnQzMl90IHBlc09mZnNldDsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyQnl0ZXNCdWZmZXIsIGVuY0J5dGVzQnVmZmVyOwogCiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9LZXkiLCAmY3J5cHRvS2V5KSk7CkBAIC0yMzMsNiArMjQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgJiYgY2xlYXJCeXRlc0J1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJlbmNCeXRlcyIsICZlbmNCeXRlc0J1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgJiYgZW5jQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJwZXNPZmZzZXQiLCAmcGVzT2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAmJiAocGVzT2Zmc2V0ID49IDApICYmIChwZXNPZmZzZXQgPCA2NTUzNikpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBjcnlwdG9Nb2RlKTsKIApAQCAtMjQwLDYgKzI0OSwxMSBAQAogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgYXJyYXksIDE2KTsKIAogICAgICAgICAgICAgYXJyYXlbMF0gPSAodWludDhfdCkgKGNyeXB0b0tleSAmIDB4ZmYpOworICAgICAgICAgICAgLy8gYXJyYXlbMV0gY29udGFpbnMgUEVTIGhlYWRlciBmbGFnLCB3aGljaCB3ZSBkb24ndCB1c2UuCisgICAgICAgICAgICAvLyBhcnJheVsyfjNdIGNvbnRhaW4gdGhlIFBFUyBvZmZzZXQuCisgICAgICAgICAgICBhcnJheVsyXSA9ICh1aW50OF90KSAocGVzT2Zmc2V0ICYgMHhmZik7CisgICAgICAgICAgICBhcnJheVszXSA9ICh1aW50OF90KSAoKHBlc09mZnNldCA+PiA4KSAmIDB4ZmYpOworCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgYXJyYXksIDE2KTsKIAogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLApAQCAtMjg1LDcgKzI5OSw3IEBACiAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpewogICAgICAgICBBTE9HVigicXVldWVpbmcgYSBkaXNjb250aW51aXR5IHdpdGggcXVldWVBY2Nlc3NVbml0Iik7CiAKLSAgICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSAwbGw7CisgICAgICAgIG1MYXN0UXVldWVkVGltZVVzID0gMExMOwogICAgICAgICBtRU9TUmVzdWx0ID0gT0s7CiAgICAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCA4NmZhMjQ1Li5lODlkM2UzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTg2LDYgKzg2LDIxIEBACiAgICAgbUNhc1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAorc3RhdGljIGludDMyX3QgcmVhZFZhcmlhYmxlQml0cyhBQml0UmVhZGVyICZiaXRzLCBpbnQzMl90IG5iaXRzKSB7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW50MzJfdCBtb3JlX2JpdHMgPSAxOworCisgICAgd2hpbGUgKG1vcmVfYml0cykgeworICAgICAgICB2YWx1ZSArPSBiaXRzLmdldEJpdHMobmJpdHMpOworICAgICAgICBtb3JlX2JpdHMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgICAgIGlmICghbW9yZV9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIHZhbHVlIDw8PSBuYml0czsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCiAvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKIHN0YXRpYyB1bnNpZ25lZCBwYXJzZUFDM1N5bmNGcmFtZSgKQEAgLTE5NSw4ICsyMTAsMTUzIEBACiAgICAgcmV0dXJuIHBheWxvYWRTaXplOwogfQogCi1zdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCBOVUxMKSA+IDA7CisvLyBQYXJzZSBFQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAorLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCisvLyBBVFNDIEEvNTI6MjAxMiBFMi4zLjEKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZUVBQzNTeW5jRnJhbWUoCisgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZTJbXSA9IHsyNDAwMCwgMjIwNTAsIDE2MDAwfTsKKworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJpdHMuZ2V0Qml0cygxNikgIT0gMHgwQjc3KSB7CisgICAgICAgIEFMT0dFKCJObyB2YWxpZCBzeW5jIHdvcmQgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgcGFyc2UgdXAgdG8gYnNpZCBzbyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCB0aGF0IG1hbnkgYml0cworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyICsgMyArIDExICsgMiArIDIgKyAzICsgMSArIDUpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RybXR5cCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoc3RybXR5cCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3Qgc3RybXR5cCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdWJzdHJlYW1pZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAvLyBvbmx5IHRoZSBmaXJzdCBpbmRlcGVuZGVudCBzdHJlYW0gaXMgc3VwcG9ydGVkCisgICAgaWYgKChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSAmJiBzdWJzdHJlYW1pZCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGZybXNpeiA9IGJpdHMuZ2V0Qml0cygxMSk7CisgICAgdW5zaWduZWQgZnNjb2QgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGUgPSAwOworICAgIGlmIChmc2NvZCA9PSAweDMpIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QyID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QyID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgZnNjb2QyIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgfQorCisgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgYnNpZCA9IGJpdHMuZ2V0Qml0cyg1KTsKKyAgICBpZiAoYnNpZCA8IDExIHx8IGJzaWQgPiAxNikgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIENvdWxkIGJlIEFDLTMgb3Igc29tZSB1bmtub3duIEVBQzMgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IGluZGVwZW5kYW50IHN0cmVhbQorICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMICYmIChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoIkVBQzMgY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HVigiRUFDMyBzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gZnJtc2l6ICsgMTsKKyAgICBwYXlsb2FkU2l6ZSA8PD0gMTsgIC8vIGNvbnZlcnQgZnJvbSAxNi1iaXQgd29yZHMgdG8gYnl0ZXMKKworICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKK30KKworLy8gUGFyc2UgQUM0IGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lCisvLyBhbmQgdXBkYXRlIGZyYW1lU2l6ZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpLCBBbm5leCBDCisgICAgLy8gVGhlIHN5bmNfd29yZCBjYW4gYmUgZWl0aGVyIDB4QUM0MCBvciAweEFDNDEuCisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQwID0gMHhBQzQwOworICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MSA9IDB4QUM0MTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0gMDsKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpbnQzMl90IHN5bmNXb3JkID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBpZiAoKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDApICYmIChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQxKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzeW5jd29yZCBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGhlYWRlclNpemUgKz0gMjsKKworICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaGVhZGVyU2l6ZSArPSAyOworICAgIGlmIChmcmFtZVNpemUgPT0gMHhGRkZGKSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygyNCk7CisgICAgICAgIGhlYWRlclNpemUgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZyYW1lU2l6ZSArPSBoZWFkZXJTaXplOworICAgIC8vIElmIHRoZSBzeW5jX3dvcmQgaXMgMHhBQzQxLCBhIGNyY193b3JkIGlzIGFsc28gdHJhbnNtaXR0ZWQuCisgICAgaWYgKHN5bmNXb3JkID09IGtTeW5jV29yZEFDNDEpIHsKKyAgICAgICAgZnJhbWVTaXplICs9IDI7IC8vIGNyY193b3JkCisgICAgfQorICAgIEFMT0dWKCJBQzQgZnJhbWVTaXplID0gJXUiLCBmcmFtZVNpemUpOworCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xIDYuMi4xLjEKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1WZXJzaW9uID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChiaXRzdHJlYW1WZXJzaW9uID09IDMpIHsKKyAgICAgICAgYml0c3RyZWFtVmVyc2lvbiArPSByZWFkVmFyaWFibGVCaXRzKGJpdHMsIDIpOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoMTApOyAvLyBTZXF1ZW5jZSBDb3VudGVyCisKKyAgICB1aW50MzJfdCBiV2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICBpZiAoYldhaXRGcmFtZXMpIHsKKyAgICAgICAgdWludDMyX3Qgd2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAgICAgaWYgKHdhaXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBicl9jb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwIFYxLjEuMSBUYWJsZSA4MgorICAgIGJvb2wgZnNJbmRleCA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBmc0luZGV4ID8gNDgwMDAgOiA0NDEwMDsKKworICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEFDNCBTZXR0aW5nIG1Gb3JtYXQiKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgLy8gW0ZJWE1FXSBBQzQgY2hhbm5lbCBjb3VudCBpcyBkZWZpbmVkIHBlciBwcmVzZW50YXRpb24uIFByb3ZpZGUgYSBkZWZhdWx0IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gYXMgc3RlcmVvIGZvciB0aGUgZW50aXJlIHN0cmVhbS4KKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSkgeworICAgIHJldHVybiBwYXJzZUFDNFN5bmNGcmFtZShwdHIsIHNpemUsIGZyYW1lU2l6ZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBRFRTSGVhZGVyKApAQCAtMjc5LDcgKzQzOSw4IEBACiAgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworCisgICAgaWYgKCFpc1NjcmFtYmxlZCgpICYmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKICAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKQEAgLTM5MCwxMiArNTUxLDE5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgQUMzOgorICAgICAgICAgICAgY2FzZSBFQUMzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQwNiw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiAoRSlBQzMgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNiArNTg0LDQzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGksIGZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDNCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplICE9IHNpemUgLSBzdGFydE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQUM0IGZyYW1lIHNpemUgaXMgJXUgYnl0ZXMsIHdoaWxlIHRoZSBidWZmZXIgc2l6ZSBpcyAlemQgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzaXplIC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNDk0LDYgKzY5OSw3IEBACiAKIHZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgc3A8QUJ1ZmZlcj4gZW5jU2l6ZXMpIHsKICAgICBpZiAoIWlzU2NyYW1ibGVkKCkpIHsKQEAgLTUyMSw2ICs3MjcsNyBAQAogCiAgICAgU2NyYW1ibGVkUmFuZ2VJbmZvIHNjcmFtYmxlZEluZm87CiAgICAgc2NyYW1ibGVkSW5mby5tTGVuZ3RoID0gc2l6ZTsKKyAgICBzY3JhbWJsZWRJbmZvLm1MZWFkaW5nQ2xlYXJCeXRlcyA9IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHNjcmFtYmxlZEluZm8ubUtleUlkID0ga2V5SWQ7CiAgICAgc2NyYW1ibGVkSW5mby5tSXNTeW5jID0gaXNTeW5jOwogICAgIHNjcmFtYmxlZEluZm8ubUNsZWFyU2l6ZXMgPSBjbGVhclNpemVzOwpAQCAtNTMzLDcgKzc0MCw2IEBACiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKSB7CiAgICAgc2l6ZV90IG5leHRTY2FuID0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIGludDMyX3QgcGVzT2Zmc2V0ID0gMCwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPSAwOwogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4sICZwZXNPZmZzZXQsICZwZXNTY3JhbWJsaW5nQ29udHJvbCk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewpAQCAtNTQ0LDYgKzc1MCw3IEBACiAgICAgLy8gcmV0dXJuIHNjcmFtYmxlZCB1bml0CiAgICAgaW50MzJfdCBrZXlJZCA9IHBlc1NjcmFtYmxpbmdDb250cm9sLCBpc1N5bmMgPSAwLCBzY3JhbWJsZWRMZW5ndGggPSAwOwogICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIGVuY1NpemVzOworICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICB3aGlsZSAobVNjcmFtYmxlZFJhbmdlSW5mb3Muc2l6ZSgpID4gbVJhbmdlSW5mb3Muc2l6ZSgpKSB7CiAgICAgICAgIGF1dG8gaXQgPSBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZmV0Y2hpbmcgc2NyYW1ibGVkIHJhbmdlOiBzaXplPSV6dSIsIG1Nb2RlLCBpdC0+bUxlbmd0aCk7CkBAIC01NjEsNiArNzY4LDcgQEAKICAgICAgICAgY2xlYXJTaXplcyA9IGl0LT5tQ2xlYXJTaXplczsKICAgICAgICAgZW5jU2l6ZXMgPSBpdC0+bUVuY1NpemVzOwogICAgICAgICBpc1N5bmMgPSBpdC0+bUlzU3luYzsKKyAgICAgICAgbGVhZGluZ0NsZWFyQnl0ZXMgPSBpdC0+bUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5lcmFzZShpdCk7CiAgICAgfQogICAgIGlmIChzY3JhbWJsZWRMZW5ndGggPT0gMCkgewpAQCAtNTY4LDI2ICs3NzYsNzQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2tpcCB0aGUgUEVTIGhlYWRlciwgYW5kIGNvcHkgdGhlIHJlc3QgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKLSAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAotICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgcGVzT2Zmc2V0LAotICAgICAgICAgICAgc2NyYW1ibGVkTGVuZ3RoIC0gcGVzT2Zmc2V0KTsKLQotICAgIC8vIGZpeCB1cCBmaXJzdCBzYW1wbGUgc2l6ZSBhZnRlciBza2lwcGluZyB0aGUgUEVTIGhlYWRlcgotICAgIGlmIChwZXNPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0Q2xlYXJTaXplID0gKihpbnQzMl90KiljbGVhclNpemVzLT5kYXRhKCk7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0RW5jU2l6ZSA9ICooaW50MzJfdCopZW5jU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgLy8gQ3V0IGF3YXkgdGhlIFBFUyBoZWFkZXIKLSAgICAgICAgaWYgKGZpcnN0Q2xlYXJTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgVFMtbGV2ZWwgc2NyYW1ibGluZywgd2UgZGVzY3JhbWJsZWQgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAob3IgaXQgd2FzIGNsZWFyIHRvIGJlZ2luIHdpdGgpCi0gICAgICAgICAgICBmaXJzdENsZWFyU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbmNTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBiZSBQRVMtbGV2ZWwgc2NyYW1ibGluZwotICAgICAgICAgICAgZmlyc3RFbmNTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluZm8sIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBjbGVhcgorICAgIC8vIHJhbmdlIG9uIG1CdWZmZXIuIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmNsdWRlcyB0aGUKKyAgICAvLyBQRVMgaGVhZGVyIHBvcnRpb24sIHdoaWxlIG1CdWZmZXIgZG9lc24ndC4KKyAgICBpZiAoKGludDMyX3QpbGVhZGluZ0NsZWFyQnl0ZXMgPiBwZXNPZmZzZXQpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbGVhZGluZ0NsZWFyQnl0ZXMgLSBwZXNPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KIAorICAgIC8vIFRyeSB0byBwYXJzZSBmb3JtYXRzLCBhbmQgaWYgdW5hdmFpbGFibGUgc2V0IHVwIGEgZHVtbXkgZm9ybWF0LgorICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBzY3JhbWJsZWQgY29udGVudCBmb3Igbm93LgorICAgIC8vICh3aWxsIGJlIGV4cGFuZGVkIGxhdGVyKS4KKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBQUMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qcHJvZmlsZSovLCA3IC8qc2FtcGxpbmdfZnJlcV9pbmRleCovLCAxIC8qY2hhbm5lbF9jb25maWcqLyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIGZvciBzY3JhbWJsZWQgY29udGVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgMCwgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIGNvcHkgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKKyAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBzY3JhbWJsZWRMZW5ndGgpOworCiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBpZiAoaXNTeW5jKSB7CiAgICAgICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwpAQCAtNjAwLDYgKzg1Niw3IEBACiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3J5cHRvS2V5Iiwga2V5SWQpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJjbGVhckJ5dGVzIiwgY2xlYXJTaXplcyk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImVuY0J5dGVzIiwgZW5jU2l6ZXMpOworICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInBlc09mZnNldCIsIHBlc09mZnNldCk7CiAKICAgICBtZW1tb3ZlKG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHNjcmFtYmxlZExlbmd0aCwKQEAgLTYxNCw3ICs4NzEsMTEgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0ICYmICFpc1NjcmFtYmxlZCgpKSB7CisgICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7CisgICAgfQorCisgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCkgewogICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTY0OCw3ICs5MDksMTAgQEAKICAgICAgICAgY2FzZSBBQUM6CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKICAgICAgICAgY2FzZSBBQzM6Ci0gICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKTsKKyAgICAgICAgY2FzZSBFQUMzOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpOwogICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKQEAgLTY2NiwzNCArOTMwLDM4IEBACiAgICAgfQogfQogCi1zcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUMzKCkgeworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKSB7CiAgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3M7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKICAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CiAKICAgICAgICAgKytzeW5jU3RhcnRQb3M7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzMiKTsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEUvQUMzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzAxLDcgKzk2OSw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0KICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKQEAgLTcxMCw3ICs5NzcsMTIgQEAKIAogICAgIC8vIE5vdCBkZWNyeXB0aW5nIGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgaWYgKG1TYW1wbGVEZWNyeXB0b3IgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIEFVIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBtQVVJbmRleCsrOwogCkBAIC03MzAsNiArMTAwMiw2OSBAQAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUM0KCkgeworICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7CisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKworICAgICAgICArK3N5bmNTdGFydFBvczsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQVVJbmRleCsrOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisKKyAgICBtZW1tb3ZlKAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUsCisgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpIHsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc3Niw3ICsxMTExLDcgQEAKICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyA0LCBwYXlsb2FkU2l6ZSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHBheWxvYWRTaXplICsgNCk7Ci0gICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgIGlmICh0aW1lVXMgPCAwTEwpIHsKICAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWVVcyIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC04MTIsNyArMTE0Nyw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChpbmZvLm1UaW1lc3RhbXBVcyA8IDBsbCkgeworICAgIGlmIChpbmZvLm1UaW1lc3RhbXBVcyA8IDBMTCkgewogICAgICAgICBBTE9HRSgiTmVnYXRpdmUgaW5mby5tVGltZXN0YW1wVXMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtODUxLDI1ICsxMTg2LDExIEBACiAgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKIAogICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gM3UpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICBiaXRzLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOwotICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCi0KICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTg4NCwxMiArMTIwNSwxMiBAQAogCiAgICAgICAgICAgICBBTE9HSSgiZm91bmQgQUFDIGNvZGVjIGNvbmZpZyAoJWQgSHosICVkIGNoYW5uZWxzKSIsCiAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCi0gICAgICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKLSAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKKyAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCisgICAgICAgIGJpdHMuc2tpcEJpdHMoMTIpOworCiAgICAgICAgIC8vIGFkdHNfdmFyaWFibGVfaGVhZGVyCiAKICAgICAgICAgLy8gY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCwgY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0CkBAIC05OTYsNyArMTMxNyw3IEBACiAKICAgICB9CiAKLSAgICBpZiAodGltZVVzID09IDBsbCkgeworICAgIGlmICh0aW1lVXMgPT0gMExMKSB7CiAgICAgICAgIEFMT0dWKCJSZXR1cm5pbmcgMCB0aW1lc3RhbXAiKTsKICAgICB9CiAKQEAgLTEwMDQsMjcgKzEzMjUsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0SDI2NCgpIHsKLSAgICBpZiAoaXNTY3JhbWJsZWQoKSkgewotICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDcmVhdGluZyBkdW1teSBBVkMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCk7CkBAIC0xMTY2LDcgKzE0NjYsNyBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gbmV4dFNjYW4pOwogCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG5leHRTY2FuKTsKLSAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xMjMyLDYgKzE1MzIsNyBAQAogICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsaW5nUmF0ZSwgJm51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtU2FtcGxlcykpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXVkaW8gZnJhbWUgc2l6ZSIpOworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xMjUxLDExICsxNTUyLDI3IEBACiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gZnJhbWVTaXplKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoZnJhbWVTaXplKTsKLSAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgaWYgKHRpbWVVcyA8IDBMTCkgewogICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIGlmIChtRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICBpZiAoKGxheWVyID09IDEpICYmIHN0cmNtcCAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBsYXllciBpcyBub3QgTVBFR19MQVlFUl9JIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChsYXllciA9PSAyKSAmJiBzdHJjbXAgKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGxheWVyIGlzIG5vdCBNUEVHX0xBWUVSX0lJIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChsYXllciA9PSAzKSAmJiBzdHJjbXAgKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGxheWVyIGlzIG5vdCBBVURJT19NUEVHIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwogCkBAIC0xMzMwLDI1ICsxNjQ3LDYgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpIHsKLSAgICBpZiAoaXNTY3JhbWJsZWQoKSkgewotICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgTVBFRyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOwotCi0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCk7CiAKQEAgLTE0NTcsNyArMTc1NSw3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2NTQsNyArMTk1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIHNpemUpOwogCiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMExMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZXVzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBmZmNiNTAyLi4zMjI3ZjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICBIMjY0LAogICAgICAgICBBQUMsCiAgICAgICAgIEFDMywKKyAgICAgICAgRUFDMywKKyAgICAgICAgQUM0LAogICAgICAgICBNUEVHX0FVRElPLAogICAgICAgICBNUEVHX1ZJREVPLAogICAgICAgICBNUEVHNF9WSURFTywKQEAgLTU5LDYgKzYxLDcgQEAKIAogICAgIHZvaWQgYXBwZW5kU2NyYW1ibGVkRGF0YSgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICAgICAgaW50MzJfdCBrZXlJZCwgYm9vbCBpc1N5bmMsCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcyk7CiAKQEAgLTg0LDggKzg3LDggQEAKICAgICB9OwogCiAgICAgc3RydWN0IFNjcmFtYmxlZFJhbmdlSW5mbyB7Ci0gICAgICAgIC8vaW50NjRfdCBtVGltZXN0YW1wVXM7CiAgICAgICAgIHNpemVfdCBtTGVuZ3RoOworICAgICAgICBzaXplX3QgbUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBpbnQzMl90IG1LZXlJZDsKICAgICAgICAgaW50MzJfdCBtSXNTeW5jOwogICAgICAgICBzcDxBQnVmZmVyPiBtQ2xlYXJTaXplczsKQEAgLTExNSw3ICsxMTgsOCBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKLSAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuY3BwCmluZGV4IGUzMmY2NzYuLjdkNDQ2YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5jcHAKQEAgLTE0OSw2ICsxNDksMTEgQEAKICAgICB9CiAKICAgICAvLyBBRFRTIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0aGUgc2l6ZQorICAgIGlmIChzaXplIDwgYWR0c0hkclNpemUpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NBQUM6IHNpemUgKCV6dSkgPCBhZHRzSGRyU2l6ZSAoJXp1KSIsIHNpemUsIGFkdHNIZHJTaXplKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjg0MzM5MzMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBzaXplX3Qgb2Zmc2V0ID0gYWR0c0hkclNpemU7CiAgICAgc2l6ZV90IHJlbWFpbmluZ0J5dGVzID0gc2l6ZSAtIGFkdHNIZHJTaXplOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggNGUyZDM5OC4uZWVmOWNlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpc3Q+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKQEAgLTI4LDcgKzI3LDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgpAQCAtNDUsNiArNDMsOCBAQAogT214OjpPbXgoKSA6CiAgICAgbU1hc3RlcihuZXcgT01YTWFzdGVyKCkpLAogICAgIG1QYXJzZXIoKSB7CisgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CisgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbFBhdGgobVBhcnNlci5kZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOwogfQogCiBPbXg6On5PbXgoKSB7CkBAIC0xMjQsMTEgKzEyNCwxMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcXVpcmsgOiBjb2RlYy0+c2Vjb25kLnF1aXJrU2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInF1aXJrOjpyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgeworICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicXVpcms6OnJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpIHsKICAgICAgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0Niw4ICsxNDYsNiBAQAogfQogCiBSZXR1cm48dm9pZD4gT214OjpjcmVhdGVJbnB1dFN1cmZhY2UoY3JlYXRlSW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSB7Ci0gICAgc3A8OjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKLQogICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdyYXBoaWNCdWZmZXJTb3VyY2UgPSBuZXcgT214R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIHN0YXR1c190IGVyciA9IGdyYXBoaWNCdWZmZXJTb3VyY2UtPmluaXRDaGVjaygpOwogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NywxMCArMTU1LDkgQEAKICAgICAgICAgX2hpZGxfY2IodG9TdGF0dXMoZXJyKSwgbnVsbHB0ciwgbnVsbHB0cik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQotICAgIGJ1ZmZlclByb2R1Y2VyID0gZ3JhcGhpY0J1ZmZlclNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwogCiAgICAgX2hpZGxfY2IodG9TdGF0dXMoT0spLAotICAgICAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGJ1ZmZlclByb2R1Y2VyKSwKKyAgICAgICAgICAgIGdyYXBoaWNCdWZmZXJTb3VyY2UtPmdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXJfVjFfMCgpLAogICAgICAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclNvdXJjZShncmFwaGljQnVmZmVyU291cmNlKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKaW5kZXggNDQ3YWY2Zi4uNjdmNDc4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxpb3M+CiAjaW5jbHVkZSA8bGlzdD4KIAorI2RlZmluZSBMT0dfVEFHICJPbXhTdG9yZSIKKwogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KQEAgLTMwLDE2ICszMiwzMyBAQAogbmFtZXNwYWNlIFYxXzAgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6SU9teDsKKwogT214U3RvcmU6Ok9teFN0b3JlKAorICAgICAgICBjb25zdCBzcDxJT214PiAmb214LAogICAgICAgICBjb25zdCBjaGFyKiBvd25lciwKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCi0gICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAotICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ4bWxOYW1lcywKICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIHsKLSAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoc2VhcmNoRGlycywKLSAgICAgICAgICAgIG1haW5YbWxOYW1lLAotICAgICAgICAgICAgcGVyZm9ybWFuY2VYbWxOYW1lLAotICAgICAgICAgICAgcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIC8vIHJldHJpZXZlIGxpc3Qgb2Ygb214IG5vZGVzCisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG5vZGVzOworICAgIGlmIChvbXggIT0gbnVsbHB0cikgeworICAgICAgICBvbXgtPmxpc3ROb2RlcyhbJm5vZGVzXShjb25zdCBTdGF0dXMgJnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SU9teDo6Q29tcG9uZW50SW5mbz4gJm5vZGVMaXN0KSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IElPbXg6OkNvbXBvbmVudEluZm8mIGluZm8gOiBub2RlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBub2Rlcy5lbXBsYWNlKGluZm8ubU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sTmFtZXMsIHNlYXJjaERpcnMpOworICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcnNlci5wYXJzZVhtbFBhdGgocHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIH0KICAgICBtUGFyc2luZ1N0YXR1cyA9IHRvU3RhdHVzKHBhcnNlci5nZXRQYXJzaW5nU3RhdHVzKCkpOwogCiAgICAgY29uc3QgYXV0byYgc2VydmljZUF0dHJpYnV0ZU1hcCA9IHBhcnNlci5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CkBAIC02MSwxNCArODAsMTggQEAKICAgICAgICAgcm9sZS5yb2xlID0gcm9sZVBhaXIuZmlyc3Q7CiAgICAgICAgIHJvbGUudHlwZSA9IHJvbGVQYWlyLnNlY29uZC50eXBlOwogICAgICAgICByb2xlLmlzRW5jb2RlciA9IHJvbGVQYWlyLnNlY29uZC5pc0VuY29kZXI7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluCi0gICAgICAgIC8vIHRoZSB4bWwgZmlsZS4gT25jZSB3ZSBoYXZlIGEgd2F5IHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiwgaXQKLSAgICAgICAgLy8gc2hvdWxkIGJlIHBhcnNlZCBwcm9wZXJseS4KLSAgICAgICAgcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZVBhaXIuZmlyc3QuY29tcGFyZSgwLCA1LCAiYXVkaW8iKSA9PSAwOworICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZCBhbmQgaWdub3JlZCwgdXNpbmcgcmFuayBpbnN0ZWFkCiAgICAgICAgIGhpZGxfdmVjPE5vZGVJbmZvPiYgbm9kZUxpc3QgPSByb2xlLm5vZGVzOwogICAgICAgICBub2RlTGlzdC5yZXNpemUocm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0LnNpemUoKSk7CiAgICAgICAgIHNpemVfdCBqID0gMDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBub2RlUGFpciA6IHJvbGVQYWlyLnNlY29uZC5ub2RlTGlzdCkgeworICAgICAgICAgICAgaWYgKCFub2Rlcy5jb3VudChub2RlUGFpci5zZWNvbmQubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgT01YIGluc3RhbmNlCisgICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChub2RlUGFpci5zZWNvbmQubmFtZS5jX3N0cigpLCAib214LiIsIDQpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAibm9kZSBbIiA8PCBub2RlUGFpci5zZWNvbmQubmFtZS5jX3N0cigpIDw8ICJdIG5vdCBmb3VuZCBpbiBJT214IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBOb2RlSW5mbyBub2RlOwogICAgICAgICAgICAgbm9kZS5uYW1lID0gbm9kZVBhaXIuc2Vjb25kLm5hbWU7CiAgICAgICAgICAgICBub2RlLm93bmVyID0gb3duZXI7CkBAIC04NSw2ICsxMDgsNyBAQAogICAgICAgICAgICAgbm9kZUxpc3Rbal0gPSBzdGQ6Om1vdmUobm9kZSk7CiAgICAgICAgICAgICArK2o7CiAgICAgICAgIH0KKyAgICAgICAgbm9kZUxpc3QucmVzaXplKGopOwogICAgICAgICBtUm9sZUxpc3RbaV0gPSBzdGQ6Om1vdmUocm9sZSk7CiAgICAgICAgICsraTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDNlNjk0MmIuLjdkMDNkOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC02LDE2ICs2LDEwIEBACiAgICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAiT01YTWFzdGVyLmNwcCIsCiAgICAgICAgICJPTVhOb2RlSW5zdGFuY2UuY3BwIiwKICAgICAgICAgIk9NWFV0aWxzLmNwcCIsCiAgICAgICAgICJPbXhHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCi0gICAgICAgICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCIsCi0gICAgICAgICJTb2Z0T01YQ29tcG9uZW50LmNwcCIsCi0gICAgICAgICJTb2Z0T01YUGx1Z2luLmNwcCIsCi0gICAgICAgICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCIsCi0gICAgICAgICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCIsCiAgICAgICAgICIxLjAvT214LmNwcCIsCiAgICAgICAgICIxLjAvT214U3RvcmUuY3BwIiwKICAgICAgICAgIjEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLApAQCAtMjksNiArMjMsNyBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCkBAIC00Myw3ICszOCw2IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCkBAIC01MiwxNCArNDYsMTIgQEAKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKICAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC03OCwxMCArNzAsMTI3IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdE9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvZnRPTVhQbHVnaW4uY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfc29mdG9teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTkwLDYgKzE5OSw3IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIHNyY3M6IFsiT01YVXRpbHMuY3BwIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwogICAgICAgICAiaW5jbHVkZSIsCkBAIC0xMTQsMTMgKzIyNCw3IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKIH0KIAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXN1YmRpcnMgPSBbInRlc3RzIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzBhNDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQldHcmFwaGljQnVmZmVyU291cmNlIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7Ci0KLXN0cnVjdCBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OkJXT214Tm9kZVdyYXBwZXIgOiBwdWJsaWMgSU9teE5vZGVXcmFwcGVyIHsKLSAgICBzcDxJT01YTm9kZT4gbU9NWE5vZGU7Ci0KLSAgICBCV09teE5vZGVXcmFwcGVyKGNvbnN0IHNwPElPTVhOb2RlPiAmb214Tm9kZSk6IG1PTVhOb2RlKG9teE5vZGUpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVtcHR5QnVmZmVyKAotICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmYnVmZmVyLAotICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtT01YTm9kZS0+ZW1wdHlCdWZmZXIoYnVmZmVySWQsIGJ1ZmZlciwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKLSAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKLSAgICAgICAgb214X21lc3NhZ2UgbXNnOwotICAgICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpFVkVOVDsKLSAgICAgICAgbXNnLmZlbmNlRmQgPSAtMTsKLSAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5ldmVudCA9IE9NWF9FdmVudERhdGFTcGFjZUNoYW5nZWQ7Ci0gICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTEgPSBkYXRhU3BhY2U7Ci0gICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTIgPSBhc3BlY3RzOwotICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGEzID0gcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIG1PTVhOb2RlLT5kaXNwYXRjaE1lc3NhZ2UobXNnKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlOjpCV09NWEJ1ZmZlclNvdXJjZSA6IHB1YmxpYyBCbk9NWEJ1ZmZlclNvdXJjZSB7Ci0gICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKLQotICAgIEJXT01YQnVmZmVyU291cmNlKGNvbnN0IHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpOiBtU291cmNlKHNvdXJjZSkgewotICAgIH0KLQotICAgIFN0YXR1cyBvbk9teEV4ZWN1dGluZygpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPm9uT214RXhlY3V0aW5nKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uT214SWRsZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPm9uT214SWRsZSgpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbk9teExvYWRlZCgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPm9uT214TG9hZGVkKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uSW5wdXRCdWZmZXJBZGRlZChpbnQgYnVmZmVySWQpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChidWZmZXJJZCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uSW5wdXRCdWZmZXJFbXB0aWVkKAotICAgICAgICAgICAgaW50IGJ1ZmZlcklkLCBjb25zdCBPTVhGZW5jZVBhcmNlbGFibGUmIGZlbmNlUGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgZmVuY2VQYXJjZWwuZ2V0KCkpOwotICAgIH0KLX07Ci0KLUJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6QldHcmFwaGljQnVmZmVyU291cmNlKAotICAgICAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCYgYmFzZSkgOgotICAgIG1CYXNlKGJhc2UpLAotICAgIG1PTVhCdWZmZXJTb3VyY2UobmV3IEJXT01YQnVmZmVyU291cmNlKGJhc2UpKSB7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCi0gICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIHsKLSAgICAvLyBEbyBzZXRJbnB1dFN1cmZhY2UoKSBmaXJzdCwgdGhlIG5vZGUgd2lsbCB0cnkgdG8gZW5hYmxlIG1ldGFkYXRhCi0gICAgLy8gbW9kZSBvbiBpbnB1dCwgYW5kIGRvZXMgbmVjZXNzYXJ5IGVycm9yIGNoZWNraW5nLiBJZiB0aGlzIGZhaWxzLAotICAgIC8vIHdlIGNhbid0IHVzZSB0aGlzIGlucHV0IHN1cmZhY2Ugb24gdGhlIG5vZGUuCi0gICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+c2V0SW5wdXRTdXJmYWNlKG1PTVhCdWZmZXJTb3VyY2UpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChlcnIpOwotICAgIH0KLQotICAgIC8vIHVzZSBjb25zdW1lciB1c2FnZSBiaXRzIHF1ZXJpZWQgZnJvbSBlbmNvZGVyLCBidXQgYWx3YXlzIGFkZAotICAgIC8vIEhXX1ZJREVPX0VOQ09ERVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAgdWludDMyX3QgY29uc3VtZXJVc2FnZTsKLSAgICBpZiAob214Tm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKLSAgICAgICAgICAgICZjb25zdW1lclVzYWdlLCBzaXplb2YoY29uc3VtZXJVc2FnZSkpICE9IE9LKSB7Ci0gICAgICAgIGNvbnN1bWVyVXNhZ2UgPSAwOwotICAgIH0KLQotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwotICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7Ci0KLSAgICBlcnIgPSBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwb3J0IGRlZmluaXRpb246ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoVU5LTk9XTl9FUlJPUik7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgICAgbmV3IEJXT214Tm9kZVdyYXBwZXIob214Tm9kZSksCi0gICAgICAgICAgICAgIGRhdGFTcGFjZSwKLSAgICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwKLSAgICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN1c3BlbmQoCi0gICAgICAgIGJvb2wgc3VzcGVuZCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3VzcGVuZChzdXNwZW5kLCB0aW1lVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKAotICAgICAgICBpbnQ2NF90IHJlcGVhdEFmdGVyVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMocmVwZWF0QWZ0ZXJVcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TWF4RnBzKGZsb2F0IG1heEZwcykgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRNYXhGcHMobWF4RnBzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VDb25maWcoCi0gICAgICAgIGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFRpbWVMYXBzZUNvbmZpZygKLSAgICAgICAgICAgIGZwcywgY2FwdHVyZUZwcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3RhcnRUaW1lVXMoCi0gICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3RhcnRUaW1lVXMoc3RhcnRUaW1lVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0b3BUaW1lVXMoCi0gICAgICAgIGludDY0X3Qgc3RvcFRpbWVVcykgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRTdG9wVGltZVVzKHN0b3BUaW1lVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFN0b3BUaW1lT2Zmc2V0VXMoCi0gICAgICAgIGludDY0X3QgKnN0b3BUaW1lT2Zmc2V0VXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+Z2V0U3RvcFRpbWVPZmZzZXRVcyhzdG9wVGltZU9mZnNldFVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRDb2xvckFzcGVjdHMoCi0gICAgICAgIGludDMyX3QgYXNwZWN0cykgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRDb2xvckFzcGVjdHMoYXNwZWN0cykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZU9mZnNldFVzKAotICAgICAgICBpbnQ2NF90IHRpbWVPZmZzZXRzVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0VGltZU9mZnNldFVzKHRpbWVPZmZzZXRzVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCmluZGV4IDA5NjdiNWYuLjhjNWNhNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCkBAIC0yOSw4ICsyOSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotT01YTWFzdGVyOjpPTVhNYXN0ZXIoKQotICAgIDogbVZlbmRvckxpYkhhbmRsZShOVUxMKSB7CitPTVhNYXN0ZXI6Ok9NWE1hc3RlcigpIHsKIAogICAgIHBpZF90IHBpZCA9IGdldHBpZCgpOwogICAgIGNoYXIgZmlsZW5hbWVbMjBdOwpAQCAtNTIsNDcgKzUxLDUyIEBACiAgICAgfQogCiAgICAgYWRkVmVuZG9yUGx1Z2luKCk7Ci0gICAgYWRkUGx1Z2luKG5ldyBTb2Z0T01YUGx1Z2luKTsKKyAgICBhZGRQbGF0Zm9ybVBsdWdpbigpOwogfQogCiBPTVhNYXN0ZXI6On5PTVhNYXN0ZXIoKSB7CiAgICAgY2xlYXJQbHVnaW5zKCk7Ci0KLSAgICBpZiAobVZlbmRvckxpYkhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRsY2xvc2UobVZlbmRvckxpYkhhbmRsZSk7Ci0gICAgICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBOVUxMOwotICAgIH0KIH0KIAogdm9pZCBPTVhNYXN0ZXI6OmFkZFZlbmRvclBsdWdpbigpIHsKICAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iKTsKIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7Ci0gICAgbVZlbmRvckxpYkhhbmRsZSA9IGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5KGxpYm5hbWUsIFJUTERfTk9XKTsKK3ZvaWQgT01YTWFzdGVyOjphZGRQbGF0Zm9ybVBsdWdpbigpIHsKKyAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXhfcGx1Z2luLnNvIik7Cit9CiAKLSAgICBpZiAobVZlbmRvckxpYkhhbmRsZSA9PSBOVUxMKSB7Cit2b2lkIE9NWE1hc3Rlcjo6YWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpIHsKKyAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShsaWJuYW1lLCBSVExEX05PVyk7CisKKyAgICBpZiAobGliSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHR5cGVkZWYgT01YUGx1Z2luQmFzZSAqKCpDcmVhdGVPTVhQbHVnaW5GdW5jKSgpOwogICAgIENyZWF0ZU9NWFBsdWdpbkZ1bmMgY3JlYXRlT01YUGx1Z2luID0KICAgICAgICAgKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgImNyZWF0ZU9NWFBsdWdpbiIpOworICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgImNyZWF0ZU9NWFBsdWdpbiIpOwogICAgIGlmICghY3JlYXRlT01YUGx1Z2luKQogICAgICAgICBjcmVhdGVPTVhQbHVnaW4gPSAoQ3JlYXRlT01YUGx1Z2luRnVuYylkbHN5bSgKLSAgICAgICAgICAgICAgICBtVmVuZG9yTGliSGFuZGxlLCAiX1pON2FuZHJvaWQxNWNyZWF0ZU9NWFBsdWdpbkV2Iik7CisgICAgICAgICAgICAgICAgbGliSGFuZGxlLCAiX1pON2FuZHJvaWQxNWNyZWF0ZU9NWFBsdWdpbkV2Iik7CiAKKyAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBudWxscHRyOwogICAgIGlmIChjcmVhdGVPTVhQbHVnaW4pIHsKLSAgICAgICAgYWRkUGx1Z2luKCgqY3JlYXRlT01YUGx1Z2luKSgpKTsKKyAgICAgICAgcGx1Z2luID0gKCpjcmVhdGVPTVhQbHVnaW4pKCk7CisgICAgfQorCisgICAgaWYgKHBsdWdpbikgeworICAgICAgICBtUGx1Z2lucy5wdXNoX2JhY2soeyBwbHVnaW4sIGxpYkhhbmRsZSB9KTsKKyAgICAgICAgYWRkUGx1Z2luKHBsdWdpbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5kcm9pZF91bmxvYWRfc3BoYWxfbGlicmFyeShsaWJIYW5kbGUpOwogICAgIH0KIH0KIAogdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgbVBsdWdpbnMucHVzaF9iYWNrKHBsdWdpbik7Ci0KICAgICBPTVhfVTMyIGluZGV4ID0gMDsKIAogICAgIGNoYXIgbmFtZVsxMjhdOwpAQCAtMTIwLDIwICsxMjQsMjAgQEAKIHZvaWQgT01YTWFzdGVyOjpjbGVhclBsdWdpbnMoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lPTVhQbHVnaW5GdW5jKShPTVhQbHVnaW5CYXNlKik7Ci0gICAgRGVzdHJveU9NWFBsdWdpbkZ1bmMgZGVzdHJveU9NWFBsdWdpbiA9Ci0gICAgICAgIChEZXN0cm95T01YUGx1Z2luRnVuYylkbHN5bSgKLSAgICAgICAgICAgICAgICBtVmVuZG9yTGliSGFuZGxlLCAiZGVzdHJveU9NWFBsdWdpbiIpOwotCiAgICAgbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5jbGVhcigpOworICAgIG1QbHVnaW5CeUluc3RhbmNlLmNsZWFyKCk7CiAKLSAgICBmb3IgKExpc3Q8T01YUGx1Z2luQmFzZSAqPjo6aXRlcmF0b3IgaXQgPSBtUGx1Z2lucy5iZWdpbigpOwotICAgICAgICAgICAgaXQgIT0gbVBsdWdpbnMuZW5kKCk7ICsraXQpIHsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95T01YUGx1Z2luRnVuYykoT01YUGx1Z2luQmFzZSopOworICAgIGZvciAoY29uc3QgUGx1Z2luICZwbHVnaW4gOiBtUGx1Z2lucykgeworICAgICAgICBEZXN0cm95T01YUGx1Z2luRnVuYyBkZXN0cm95T01YUGx1Z2luID0KKyAgICAgICAgICAgIChEZXN0cm95T01YUGx1Z2luRnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm1MaWJIYW5kbGUsICJkZXN0cm95T01YUGx1Z2luIik7CiAgICAgICAgIGlmIChkZXN0cm95T01YUGx1Z2luKQotICAgICAgICAgICAgZGVzdHJveU9NWFBsdWdpbigqaXQpOworICAgICAgICAgICAgZGVzdHJveU9NWFBsdWdpbihwbHVnaW4ubU9teCk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgICAgICppdCA9IE5VTEw7CisgICAgICAgICAgICBkZWxldGUgcGx1Z2luLm1PbXg7CisKKyAgICAgICAgYW5kcm9pZF91bmxvYWRfc3BoYWxfbGlicmFyeShwbHVnaW4ubUxpYkhhbmRsZSk7CiAgICAgfQogCiAgICAgbVBsdWdpbnMuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMzIxMTNjMi4uZGRiNGJhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhOb2RlSW5zdGFuY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTMyLDEyICszMywxMyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KQEAgLTM1NCw5ICszNTYsOSBAQAogICAgICAgbVF1aXJrcygwKSwKICAgICAgIG1CdWZmZXJJRENvdW50KDApLAogICAgICAgbVJlc3RvcmVQdHNGYWlsZWQoZmFsc2UpLAotICAgICAgbU1heFRpbWVzdGFtcEdhcFVzKDBsbCksCi0gICAgICBtUHJldk9yaWdpbmFsVGltZVVzKC0xbGwpLAotICAgICAgbVByZXZNb2RpZmllZFRpbWVVcygtMWxsKQorICAgICAgbU1heFRpbWVzdGFtcEdhcFVzKDBMTCksCisgICAgICBtUHJldk9yaWdpbmFsVGltZVVzKC0xTEwpLAorICAgICAgbVByZXZNb2RpZmllZFRpbWVVcygtMUxMKQogewogICAgIG1OYW1lID0gQURlYnVnOjpHZXREZWJ1Z05hbWUobmFtZSk7CiAgICAgREVCVUcgPSBBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tUHJvcGVydHkobmFtZSwgImRlYnVnLnN0YWdlZnJpZ2h0Lm9teC1kZWJ1ZyIpOwpAQCAtNDU5LDcgKzQ2MSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CkBAIC00ODYsNyArNDg4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgT01YX0Vycm9yTm9uZSk7CiAKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9TdGF0ZUxvYWRlZDoKQEAgLTUzNSw2ICs1MzcsOSBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFN0YXRlU2V0KSB7CiAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBjb25maWd1cmF0aW9ucyBwYXN0IGZpcnN0IFN0YXRlU2V0IGNvbW1hbmQuCkBAIC01OTksNiArNjA0LDkgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBpZiAoaXNQcm9oaWJpdGVkSW5kZXhfbChpbmRleCkpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMCIpOwpAQCAtNjE3LDYgKzYyNSwxMCBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIE9NWF9JTkRFWEVYVFRZUEUgZXh0SW5kZXggPSAoT01YX0lOREVYRVhUVFlQRSlpbmRleDsKICAgICBDTE9HX0NPTkZJRyhzZXRQYXJhbWV0ZXIsICIlcyglI3gpLCAlenVAJXApIiwgYXNTdHJpbmcoZXh0SW5kZXgpLCBpbmRleCwgc2l6ZSwgcGFyYW1zKTsKIApAQCAtNjM4LDYgKzY1MCw5IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgaWYgKGlzUHJvaGliaXRlZEluZGV4X2woaW5kZXgpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKQEAgLTY1Niw2ICs2NzEsMTAgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0Q29uZmlnKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBPTVhfSU5ERVhFWFRUWVBFIGV4dEluZGV4ID0gKE9NWF9JTkRFWEVYVFRZUEUpaW5kZXg7CiAgICAgQ0xPR19DT05GSUcoc2V0Q29uZmlnLCAiJXMoJSN4KSwgJXp1QCVwKSIsIGFzU3RyaW5nKGV4dEluZGV4KSwgaW5kZXgsIHNpemUsIHBhcmFtcyk7CiAKQEAgLTY3Miw2ICs2OTEsOSBAQAogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBpZiAocG9ydEluZGV4ID49IE5FTEVNKG1Qb3J0TW9kZSkpIHsKICAgICAgICAgQUxPR0UoImIvMzEzODU3MTMsIHBvcnRJbmRleCgldSkiLCBwb3J0SW5kZXgpOwpAQCAtODU0LDYgKzg3Niw5IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldEdyYXBoaWNCdWZmZXJVc2FnZSgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwogICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCkBAIC05NjcsNiArOTkyLDEwIEBACiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwKICAgICAgICAgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgaWYgKG1TYWlsZWQpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMDA3LDYgKzEwMzYsMTAgQEAKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLCBPTVhfVTMyIGF1ZGlvSHdTeW5jLAogICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgaWYgKG1TYWlsZWQpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMDYxLDYgKzEwOTQsMTAgQEAKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIGlmICghbVNhaWxlZCkgewogICAgICAgICBBTE9HRSgiYi8zNTQ2NzQ1OCIpOwogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM1NDY3NDU4Iik7CkBAIC0xNDc3LDYgKzE1MTQsOSBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzZXRJbnB1dFN1cmZhY2UoCiAgICAgICAgIGNvbnN0IHNwPElPTVhCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KIAogICAgIHN0YXR1c190IGVycjsKIApAQCAtMTU0Myw2ICsxNTgzLDkgQEAKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KIAogICAgIGlmICghbVNhaWxlZCkgewogICAgICAgICBBTE9HRSgiYi8zNTQ2NzQ1OCIpOwpAQCAtMTU5OSw2ICsxNjQyLDEwIEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZyZWVCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBDTE9HX0JVRkZFUihmcmVlQnVmZmVyLCAiJXM6JXUgJSN4IiwgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGJ1ZmZlcik7CiAKICAgICByZW1vdmVBY3RpdmVCdWZmZXIocG9ydEluZGV4LCBidWZmZXIpOwpAQCAtMTYyNiw2ICsxNjczLDkgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZmlsbEJ1ZmZlcigKICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWZmZXIsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOwogICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgewpAQCAtMTY3Niw2ICsxNzI2LDkgQEAKICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWZmZXIsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBzd2l0Y2ggKG9teEJ1ZmZlci5tQnVmZmVyVHlwZSkgewogICAgIGNhc2UgT01YQnVmZmVyOjprQnVmZmVyVHlwZVByZXNldDoKQEAgLTE4OTYsNyArMTk0OSw3IEBACiBpbnQ2NF90IE9NWE5vZGVJbnN0YW5jZTo6Z2V0Q29kZWNUaW1lc3RhbXAoT01YX1RJQ0tTIHRpbWVzdGFtcCkgewogICAgIGludDY0X3Qgb3JpZ2luYWxUaW1lVXMgPSB0aW1lc3RhbXA7CiAKLSAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CisgICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBMTCkgewogICAgICAgICAvKiBDYXAgdGltZXN0YW1wIGdhcCBiZXR3ZWVuIGFkamFjZW50IGZyYW1lcyB0byBzcGVjaWZpZWQgbWF4CiAgICAgICAgICAqCiAgICAgICAgICAqIEluIHRoZSBzY2VuYXJpbyBvZiBjYXN0IG1pcnJvcmluZywgZW5jb2RpbmcgY291bGQgYmUgc3VzcGVuZGVkIGZvcgpAQCAtMTkwNCw3ICsxOTU3LDcgQEAKICAgICAgICAgICogd2hlcmUgZW5jb2RlcidzIHJhdGUgY29udHJvbCBsb2dpYyBwcm9kdWNlcyBodWdlIGZyYW1lcyBhZnRlciBhCiAgICAgICAgICAqIGxvbmcgcGVyaW9kIG9mIHN1c3BlbnNpb24uCiAgICAgICAgICAqLwotICAgICAgICBpZiAobVByZXZPcmlnaW5hbFRpbWVVcyA+PSAwbGwpIHsKKyAgICAgICAgaWYgKG1QcmV2T3JpZ2luYWxUaW1lVXMgPj0gMExMKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcEdhcFVzID0gb3JpZ2luYWxUaW1lVXMgLSBtUHJldk9yaWdpbmFsVGltZVVzOwogICAgICAgICAgICAgdGltZXN0YW1wID0gKHRpbWVzdGFtcEdhcFVzIDwgbU1heFRpbWVzdGFtcEdhcFVzID8KICAgICAgICAgICAgICAgICB0aW1lc3RhbXBHYXBVcyA6IG1NYXhUaW1lc3RhbXBHYXBVcykgKyBtUHJldk1vZGlmaWVkVGltZVVzOwpAQCAtMTkxMiw3ICsxOTY1LDcgQEAKICAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG9yaWdpbmFsVGltZVVzKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZXN0YW1wKSk7Ci0gICAgfSBlbHNlIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPCAwbGwpIHsKKyAgICB9IGVsc2UgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA8IDBMTCkgewogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSBhIGZpeGVkIHRpbWVzdGFtcCBnYXAgYmV0d2VlbiBhZGphY2VudCBmcmFtZXMuCiAgICAgICAgICAqCkBAIC0xOTIwLDcgKzE5NzMsNyBAQAogICAgICAgICAgKiBvbiBmcmFtZXMgY291bGQgZ28gZm9yd2FyZCBvciBiYWNrd2FyZC4gU29tZSBlbmNvZGVycyBtYXkgc2lsZW50bHkKICAgICAgICAgICogZHJvcCBmcmFtZXMgd2hlbiBpdCBnb2VzIGJhY2t3YXJkIChvciBldmVuIHN0YXkgdW5jaGFuZ2VkKS4KICAgICAgICAgICovCi0gICAgICAgIGlmIChtUHJldk9yaWdpbmFsVGltZVVzID49IDBsbCkgeworICAgICAgICBpZiAobVByZXZPcmlnaW5hbFRpbWVVcyA+PSAwTEwpIHsKICAgICAgICAgICAgIHRpbWVzdGFtcCA9IG1QcmV2TW9kaWZpZWRUaW1lVXMgLSBtTWF4VGltZXN0YW1wR2FwVXM7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCkBAIC0xOTMxLDcgKzE5ODQsNyBAQAogICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMgPSBvcmlnaW5hbFRpbWVVczsKICAgICBtUHJldk1vZGlmaWVkVGltZVVzID0gdGltZXN0YW1wOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyAhPSAwbGwgJiYgIW1SZXN0b3JlUHRzRmFpbGVkKSB7CisgICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyAhPSAwTEwgJiYgIW1SZXN0b3JlUHRzRmFpbGVkKSB7CiAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5hZGQodGltZXN0YW1wLCBvcmlnaW5hbFRpbWVVcyk7CiAgICAgfQogCkBAIC0xOTY0LDcgKzIwMTcsNyBAQAogdm9pZCBPTVhOb2RlSW5zdGFuY2U6OmNvZGVjQnVmZmVyRmlsbGVkKG9teF9tZXNzYWdlICZtc2cpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA9PSAwbGwgfHwgbVJlc3RvcmVQdHNGYWlsZWQpIHsKKyAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzID09IDBMTCB8fCBtUmVzdG9yZVB0c0ZhaWxlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xOTkwLDYgKzIwNDMsOSBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyTmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDxjaGFyICo+KHBhcmFtZXRlck5hbWUpLCBpbmRleCk7CkBAIC0yMTk2LDggKzIyNTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBidW1wIGludGVybmFsLXN0YXRlIGRlYnVnIGxldmVsIGZvciAyIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVzCiAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVidWdMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgYnVtcERlYnVnTGV2ZWxfbCgyIC8qIG51bUlucHV0QnVmZmVycyAqLywgMiAvKiBudW1PdXRwdXRCdWZmZXJzICovKTsKKyAgICAgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGFyZzJTdHJpbmcgPSBwb3J0U3RyaW5nKGFyZzIpOwogICAgICAgICAgICAgfQpAQCAtMjIwOCw3ICsyMjY0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQ6CiAgICAgICAgICAgICBhcmcyU3RyaW5nID0gYXNTdHJpbmcoKE9NWF9JTkRFWEVYVFRZUEUpYXJnMik7Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXJnMVN0cmluZyA9IHBvcnRTdHJpbmcoYXJnMSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggZjdiNTY5ZC4uMWI4NDkzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CkBAIC0xNDksNiArMTUwLDggQEAKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLnZwOCIsICJ2aWRlb19lbmNvZGVyLnZwOCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDkiLCAidmlkZW9fZW5jb2Rlci52cDkiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLAorICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXYxIiwgInZpZGVvX2VuY29kZXIuYXYxIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnJhdyIsICJhdWRpb19lbmNvZGVyLnJhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCkBAIC0xNjMsNiArMTY2LDEwIEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzMiLCAiYXVkaW9fZW5jb2Rlci5hYzMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzMiLCAiYXVkaW9fZW5jb2Rlci5lYWMzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjM19qb2MiLCAiYXVkaW9fZW5jb2Rlci5lYWMzX2pvYyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzQiLCAiYXVkaW9fZW5jb2Rlci5hYzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAogICAgICAgICAgICAgImltYWdlX2RlY29kZXIuaGVpYyIsICJpbWFnZV9lbmNvZGVyLmhlaWMiIH0sCiAgICAgfTsKQEAgLTI3Myw2ICsyODAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggYXMgWVYxMiBpcyB1c2VkIGZvciBZVVY0MjBQbGFuYXIgYnkgc29tZSBjb2RlY3MKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggNTVhZmUwNC4uZGRiNDU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtSGFuZGxlcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8U2ltcGxlU29mdE9NWENvbXBvbmVudD4odGhpcykpLAogICAgICAgbVN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCi0gICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1GcmFtZUNvbmZpZyhmYWxzZSkgewogICAgIG1Mb29wZXItPnNldE5hbWUobmFtZSk7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKIApAQCAtMjA0LDYgKzIwNSwyMSBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgYm9vbCBmcmFtZUNvbmZpZyA9IG1GcmFtZUNvbmZpZzsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IGludGVybmFsU2V0Q29uZmlnKGluZGV4LCBwYXJhbXMsICZmcmFtZUNvbmZpZyk7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZyYW1lQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApAQCAtMzM2LDYgKzM1MiwxMCBAQAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBpZiAobUZyYW1lQ29uZmlnKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZyYW1lLWNvbmZpZyIsIG1GcmFtZUNvbmZpZyk7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZhbHNlOworICAgIH0KICAgICBtc2ctPnBvc3QoKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtMzc4LDYgKzM5OCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiaGVhZGVyIiwgKHZvaWQgKiopJmhlYWRlcikpOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvbmZpZzsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZyYW1lLWNvbmZpZyIsICZmcmFtZUNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBmcmFtZUNvbmZpZyA9IDA7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CiAKQEAgLTM5Myw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKIAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1GcmFtZUNvbmZpZyA9IChib29sKWZyYW1lQ29uZmlnOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKChtc2dUeXBlID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJJbnB1dCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAppbmRleCAxZjNlOGMxLi5hNzIwYmM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC03MSw2ICs3MSwxNiBAQAogc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtQ29tcG9uZW50cyA9CiAgICAgc2l6ZW9mKGtDb21wb25lbnRzKSAvIHNpemVvZihrQ29tcG9uZW50c1swXSk7CiAKK2V4dGVybiAiQyIgT01YUGx1Z2luQmFzZSogY3JlYXRlT01YUGx1Z2luKCkgeworICAgIEFMT0dJKCJjcmVhdGVPTVhQbHVnaW4iKTsKKyAgICByZXR1cm4gbmV3IFNvZnRPTVhQbHVnaW4oKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lPTVhQbHVnaW4oT01YUGx1Z2luQmFzZSogcGx1Z2luKSB7CisgICAgQUxPR0koImRlc3Ryb3lPTVhQbHVnaW4iKTsKKyAgICBkZWxldGUgcGx1Z2luOworfQorCiBTb2Z0T01YUGx1Z2luOjpTb2Z0T01YUGx1Z2luKCkgewogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggOTM1ZGMzNC4uZTg1M2RhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMTU0LDEyICsxNTQsMTIgQEAKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKLSAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCiAgICAgaW50MzJfdCBicHAgPSAobU91dHB1dEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpID8gMiA6IDE7CisgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogYnBwOwogICAgIG91dERlZi0+bkJ1ZmZlclNpemUgPQotICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIGJwcCAqIDMpIC8gMjsKKyAgICAgICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogMykgLyAyOwogCiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqaW5EZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgaW5EZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTUwMiw3ICs1MDIsOCBAQAogICAgICAgICAgICAgLy8gVGhlc2UgdmFsdWVzIHdlcmUgY2hvc2VuIHRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZnVydGhlciBkb3duIHRoZSBsaW5lLCBhbmQgZG8KICAgICAgICAgICAgIC8vIG5vdCBpbmRpY2F0ZSBzdXBwb3J0IGZvciAzMmt4MzJrIHZpZGVvLgogICAgICAgICAgICAgaWYgKG5ld1dpZHRoID4gMzI3NjggfHwgbmV3SGVpZ2h0ID4gMzI3NjgKLSAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgeworICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPCAtMzI3NjgKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU2xpY2VIZWlnaHQgPiAzMjc2OCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIyODg1NDIxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KQEAgLTYwMSwxMyArNjAyLDQwIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUhkcjEwUGx1c091dHB1dHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtSGRyMTBQbHVzT3V0cHV0cy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgYXV0byBpbmZvID0gKCppdCkuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIG91dFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICAgICAgb3V0UGFyYW1zLT5uUGFyYW1TaXplVXNlZCA9IGluZm8tPnNpemUoKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIGVub3VnaAorICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2UsIHJldHVybiB0aGUgc2l6ZSBvbmx5IGFuZCBkbyBub3QgcmVtb3ZlIHRoZSBwYXJhbSB5ZXQuCisgICAgICAgICAgICAgICAgaWYgKG91dFBhcmFtcy0+blBhcmFtU2l6ZSA+PSBpbmZvLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG91dFBhcmFtcy0+blZhbHVlLCBpbmZvLT5kYXRhKCksIGluZm8tPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNPdXRwdXRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZXJmbG93OworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKXsKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyl7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2Uga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXg6CiAgICAgICAgIHsKQEAgLTY1NywxMSArNjg1LDU1IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGluUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCpmcmFtZUNvbmZpZykgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IHRvIGFwcGVuZCB0byB0aGUgY3VycmVudCBmcmFtZSBjb25maWcgc2V0LgorICAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd2Ugc2ltcGx5IHJlcGxhY2Ugd2l0aCB0aGUgbGFzdCBzZXQgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNJbnB1dHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAqKC0tbUhkcjEwUGx1c0lucHV0cy5lbmQoKSkgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJhbXMtPm5WYWx1ZSwgaW5QYXJhbXMtPm5QYXJhbVNpemVVc2VkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3Jpbmcga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OiBhcHBlbmQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSBjb25maWcgd2hpbGUgbm8gZnJhbWUgY29uZmlnIGlzIHByZXNlbnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBmcmFtZSBjb25maWcsIHNldHRpbmcgKmZyYW1lQ29uZmlnIHRvIHRydWUgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoZSBjbGllbnQgbWFya3MgdGhlIG5leHQgcXVldWVkIGlucHV0IGZyYW1lIHRvIGFwcGx5IGl0LgorICAgICAgICAgICAgICAgICpmcmFtZUNvbmZpZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUhkcjEwUGx1c0lucHV0cy5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJhbXMtPm5WYWx1ZSwgaW5QYXJhbXMtPm5QYXJhbVNpemVVc2VkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKK3NwPEFCdWZmZXI+IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCkgeworICAgIGF1dG8gaXQgPSBtSGRyMTBQbHVzSW5wdXRzLmJlZ2luKCk7CisgICAgc3A8QUJ1ZmZlcj4gaW5mbyA9ICppdDsKKyAgICBtSGRyMTBQbHVzSW5wdXRzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKSB7CisgICAgbUhkcjEwUGx1c091dHB1dHMucHVzaF9iYWNrKGluZm8pOworICAgIG5vdGlmeShPTVhfRXZlbnRDb25maWdVcGRhdGUsCisgICAgICAgICAgIGtPdXRwdXRQb3J0SW5kZXgsCisgICAgICAgICAgIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgTlVMTCk7Cit9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CkBAIC02NzYsNiArNzQ4LDEwIEBACiAgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkpIHsKICAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleDsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIikKKyAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwpAQCAtNjkzLDYgKzc2OSwxMCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCkgewogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDJmYmJiNDQuLmQ3NWFjZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTU1OSw3ICs1NTksNyBAQAogICAgICAgICBpZiAobmF0aXZlTWV0YS5uRmVuY2VGZCA+PSAwKSB7CiAgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UobmF0aXZlTWV0YS5uRmVuY2VGZCk7CiAgICAgICAgICAgICBuYXRpdmVNZXRhLm5GZW5jZUZkID0gLTE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZW5jZS0+d2FpdChJT01YOjprRmVuY2VUaW1lb3V0TXMpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVuY2UtPndhaXQoa0ZlbmNlVGltZW91dE1zKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVGltZWQgb3V0IHdhaXRpbmcgb24gaW5wdXQgZmVuY2UiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggYTlmY2U1NS4uOTY2OTY3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE0LDggKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAorI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX0lNUExfQ09OVkVSU0lPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfSU1QTF9DT05WRVJTSU9OX0gKIAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxsaXN0PgpAQCAtMjksMTUgKzI5LDE1IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVpL0J1ZmZlclF1ZXVlRGVmcy5oPgogI2luY2x1ZGUgPHVpL0ZlbmNlVGltZS5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KQEAgLTk5LDE2ICs5OSw5IEBACiAKIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCiAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogCi0vLyBXZSB3YW50IHRvIHVzZSBhbGwgZnVuY3Rpb25zIGRlY2xhcmVkIGluIDo6YW5kcm9pZDo6Y29udmVyc2lvbgotdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6Y29udmVyc2lvbjsKLQotLy8gTm93IHNwZWNpZmljYWxseSBpbmplY3QgdGhlc2UgdHdvIGZ1bmN0aW9ucyBoZXJlLCBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvCi0vLyBkZWNsYXJlIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhpcyBuYW1lc3BhY2UuCi11c2luZyA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbzsKLXVzaW5nIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6dG9TdGF0dXNUOworLy8gVXNlIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmcm9tIGxpYm1lZGlhX29teCBzbyB0aGF0IHdlIGRvbid0IG5lZWQgbGliZ3VpCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM7CiAKIC8qKgogICogQ29udmVyc2lvbiBmdW5jdGlvbnMKQEAgLTE0Myw1NyArMTM2LDYgQEAKICAqLwogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBTdGF0dXNgIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFN0YXR1c2AuCi0gKiBccmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAotaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgY29uc3QmIHQpIHsKLSAgICBzd2l0Y2ggKHQpIHsKLSAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6Ci0gICAgY2FzZSBTdGF0dXM6Ok5BTUVfTk9UX0ZPVU5EOgotICAgIGNhc2UgU3RhdHVzOjpXT1VMRF9CTE9DSzoKLSAgICBjYXNlIFN0YXR1czo6Tk9fTUVNT1JZOgotICAgIGNhc2UgU3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKLSAgICBjYXNlIFN0YXR1czo6Tk9fSU5JVDoKLSAgICBjYXNlIFN0YXR1czo6QkFEX1ZBTFVFOgotICAgIGNhc2UgU3RhdHVzOjpERUFEX09CSkVDVDoKLSAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046Ci0gICAgY2FzZSBTdGF0dXM6OlRJTUVEX09VVDoKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfVU5TVVBQT1JURUQ6Ci0gICAgY2FzZSBTdGF0dXM6OlVOS05PV05fRVJST1I6Ci0gICAgY2FzZSBTdGF0dXM6OlJFTEVBU0VfQUxMX0JVRkZFUlM6Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4odCk7Ci0gICAgY2FzZSBTdGF0dXM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046Ci0gICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBzdGF0dXMgdmFsdWU6ICUiIFBSSWQzMiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odCkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOwotICAgIH0KLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPFN0YXR1cz5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIKLSAqIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48U3RhdHVzPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVjayBpZiBccCB0IGhhcyBhIHRyYW5zcG9ydCBlcnJvci4gSWYgaXQgZG9lcywgdGhlbiB0aGUKLSAqIHJldHVybiB2YWx1ZSBpcyB0aGUgdHJhbnNwb3J0IGVycm9yIGNvZGUuIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBpcwotICogY29udmVydGVkIGZyb20gYFN0YXR1c2AgY29udGFpbmVkIGluc2lkZSBccCB0LgotICoKLSAqIE5vdGU6Ci0gKiAtIFRoaXMgYFN0YXR1c2AgaXMgb214LXNwZWNpZmljLiBJdCBpcyBkZWZpbmVkIGluIGB0eXBlcy5oYWxgLgotICogLSBUaGUgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBgY29udmVydGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAotaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgogICogXGJyaWVmIENvbnZlcnQgYHN0YXR1c190YCB0byBgU3RhdHVzYC4KICAqCiAgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgc3RhdHVzX3RgLgpAQCAtMjE0LDggKzE1Niw4IEBACiAgICAgY2FzZSBUSU1FRF9PVVQ6CiAgICAgY2FzZSBFUlJPUl9VTlNVUFBPUlRFRDoKICAgICBjYXNlIFVOS05PV05fRVJST1I6Ci0gICAgY2FzZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgotICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjoKKyAgICBjYXNlIEJ1ZmZlclF1ZXVlRGVmczo6UkVMRUFTRV9BTExfQlVGRkVSUzoKKyAgICBjYXNlIEJ1ZmZlclF1ZXVlRGVmczo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjoKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7CiAgICAgY2FzZSBOT1RfRU5PVUdIX0RBVEE6CiAgICAgICAgIHJldHVybiBTdGF0dXM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT047CkBAIC01NjcsNyArNTA5LDggQEAKICAgICAgICAgICAgIGFud0J1ZmZlci5uYXRpdmVIYW5kbGUgPSB0Lm5hdGl2ZUhhbmRsZTsKICAgICAgICAgICAgIGFud0J1ZmZlci5hdHRyID0gdC5hdHRyLmFud0J1ZmZlcjsKICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOwotICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oZ3JhcGhpY0J1ZmZlci5nZXQoKSwgYW53QnVmZmVyKSkgeworICAgICAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczo6Y29udmVydFRvKAorICAgICAgICAgICAgICAgICAgICBncmFwaGljQnVmZmVyLmdldCgpLCBhbndCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKmwgPSBPTVhCdWZmZXIoZ3JhcGhpY0J1ZmZlcik7CkBAIC03NTEsNCArNjk0LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX19DT05WRVJTSU9OX0gKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9JTVBMX0NPTlZFUlNJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCmluZGV4IDAwNmQyZDkuLjE1ZDQ2OTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKQEAgLTQzLDE1ICs0NCwxNCBAQAogCiBzdHJ1Y3QgT214U3RvcmUgOiBwdWJsaWMgSU9teFN0b3JlIHsKICAgICBPbXhTdG9yZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPbXg+ICZvbXggPSBudWxscHRyLAogICAgICAgICAgICAgY29uc3QgY2hhciogb3duZXIgPSAiZGVmYXVsdCIsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycwotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzLAotICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUKLSAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUKLSAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgKLSAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0RGVmYXVsdFNlYXJjaERpcnMoKSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmeG1sRmlsZXMgPQorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXREZWZhdWx0WG1sTmFtZXMoKSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnhtbFByb2ZpbGluZ1Jlc3VsdHNQYXRoID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKIAogICAgIHZpcnR1YWwgfk9teFN0b3JlKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmE2OTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBvbXggewotbmFtZXNwYWNlIFYxXzAgewotbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKLQotdXNpbmcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPAotICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj47Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgotfSAgLy8gbmFtZXNwYWNlIFYxXzAKLX0gIC8vIG5hbWVzcGFjZSBvbXgKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV09NWEJVRkZFUlBST0RVQ0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmZmYyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBCV0dSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwotI2RlZmluZSBCV0dSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL0JuR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvQm5PTVhCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0KLSNpbmNsdWRlICJPbXhHcmFwaGljQnVmZmVyU291cmNlLmgiCi0jaW5jbHVkZSAiSU9teE5vZGVXcmFwcGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5HcmFwaGljQnVmZmVyU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpPbXhHcmFwaGljQnVmZmVyU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpJT01YTm9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXN0cnVjdCBCV0dyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQm5HcmFwaGljQnVmZmVyU291cmNlIHsKLSAgICBzdHJ1Y3QgQldPTVhCdWZmZXJTb3VyY2U7Ci0gICAgc3RydWN0IEJXT214Tm9kZVdyYXBwZXI7Ci0KLSAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKLSAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtT01YQnVmZmVyU291cmNlOwotCi0gICAgQldHcmFwaGljQnVmZmVyU291cmNlKHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0ICZiYXNlKTsKLQotICAgIFN0YXR1cyBjb25maWd1cmUoCi0gICAgICAgICAgICBjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCi0gICAgICAgICAgICBpbnQ2NF90IHJlcGVhdEFmdGVyVXMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0VGltZUxhcHNlQ29uZmlnKAotICAgICAgICAgICAgZG91YmxlIGZwcywgZG91YmxlIGNhcHR1cmVGcHMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRTdGFydFRpbWVVcyhpbnQ2NF90IHN0YXJ0VGltZVVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBnZXRTdG9wVGltZU9mZnNldFVzKGludDY0X3QqIHN0b3BUaW1lT2Zmc2V0VXMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzZXRDb2xvckFzcGVjdHMoaW50MzJfdCBhc3BlY3RzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0VGltZU9mZnNldFVzKGludDY0X3QgdGltZU9mZnNldHNVcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggODk3ZjI4Ny4uOTNlYWVmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtNTIsMTMgKzUyLDE2IEBACiBwcml2YXRlOgogICAgIGNoYXIgbVByb2Nlc3NOYW1lWzE2XTsKICAgICBNdXRleCBtTG9jazsKLSAgICBMaXN0PE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbnM7CisgICAgc3RydWN0IFBsdWdpbiB7CisgICAgICAgIE9NWFBsdWdpbkJhc2UgKm1PbXg7CisgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgfTsKKyAgICBMaXN0PFBsdWdpbj4gbVBsdWdpbnM7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgT01YUGx1Z2luQmFzZSAqPiBtUGx1Z2luQnlDb21wb25lbnROYW1lOwogICAgIEtleWVkVmVjdG9yPE9NWF9DT01QT05FTlRUWVBFICosIE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbkJ5SW5zdGFuY2U7CiAKLSAgICB2b2lkICptVmVuZG9yTGliSGFuZGxlOwotCiAgICAgdm9pZCBhZGRWZW5kb3JQbHVnaW4oKTsKKyAgICB2b2lkIGFkZFBsYXRmb3JtUGx1Z2luKCk7CiAgICAgdm9pZCBhZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSk7CiAgICAgdm9pZCBhZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKTsKICAgICB2b2lkIGNsZWFyUGx1Z2lucygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggMWQxZjJiZC4uNmJiZWRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0yOCw2ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOworc3RydWN0IEFCdWZmZXI7CiAKIHN0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbCB7CiAgICAgT01YX1UzMiBtUHJvZmlsZTsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptSGVhZGVyOwogICAgICAgICBib29sIG1Pd25lZEJ5VXM7CisgICAgICAgIGJvb2wgbUZyYW1lQ29uZmlnOwogICAgIH07CiAKICAgICBzdHJ1Y3QgUG9ydEluZm8gewpAQCAtNzYsNiArNzksOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CisKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZnZXRQb3J0UXVldWUoT01YX1UzMiBwb3J0SW5kZXgpOwogCkBAIC0xMDEsNiArMTA3LDcgQEAKICAgICBPTVhfU1RBVEVUWVBFIG1UYXJnZXRTdGF0ZTsKIAogICAgIFZlY3RvcjxQb3J0SW5mbz4gbVBvcnRzOworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUZyYW1lQ29uZmlnOwogCiAgICAgYm9vbCBpc1NldFBhcmFtZXRlckFsbG93ZWQoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3Q7CkBAIC0xMTQsNiArMTIxLDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKwogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggM2FiNmY4OC4uNzlmMGM3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCkBAIC0yMSwxMiArMjEsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0T01YQ29tcG9uZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIGVudW0geworICAgICAgICBrRmVuY2VUaW1lb3V0TXMgPSAxMDAwCisgICAgfTsKICAgICBTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCmluZGV4IDU2ZmM2OTEuLmQ3YzE2NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApAQCAtMjAsMTQgKzIwLDE5IEBACiAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlby5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvRXh0Lmg+CisKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDgsNiArNTMsNyBAQAogICAgIGVudW0gewogICAgICAgICBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMSwKICAgICAgICAga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAyLAorICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDMsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtNjgsOCArNzQsOCBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CkBAIC04MCw2ICs4Niw4IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKKwogICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIG1pbmltdW0gYnVmZmVyIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mCiAgICAgLy8gaW5wdXQgcG9ydCB0byBiZSB8bnVtSW5wdXRCdWZmZXJzfC4gSXQgd2lsbCBhbHNvIHNldCBib3RoIG1pbmltdW0gYnVmZmVyCiAgICAgLy8gY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2Ygb3V0cHV0IHBvcnQgdG8gYmUgfG51bU91dHB1dEJ1ZmZlcnN8LgpAQCAtMTY2LDYgKzE3NCw5IEBACiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAgdGhlIENvbG9yQXNwZWN0cy4KICAgICB2b2lkIGR1bXBDb2xvckFzcGVjdHMoY29uc3QgQ29sb3JBc3BlY3RzICZjb2xvckFzcGVjdHMpOwogCisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICB2b2lkIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pOworCiBwcml2YXRlOgogICAgIHVpbnQzMl90IG1NaW5JbnB1dEJ1ZmZlclNpemU7CiAgICAgdWludDMyX3QgbU1pbkNvbXByZXNzaW9uUmF0aW87CkBAIC0xNzQsNiArMTg1LDkgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtQ29kaW5nVHlwZTsKICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAqbVByb2ZpbGVMZXZlbHM7CiAgICAgc2l6ZV90IG1OdW1Qcm9maWxlTGV2ZWxzOworICAgIHR5cGVkZWYgTGlzdDxzcDxBQnVmZmVyPiA+IEhkcjEwUGx1c0luZm9MaXN0OworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNJbnB1dHM7CisgICAgSGRyMTBQbHVzSW5mb0xpc3QgbUhkcjEwUGx1c091dHB1dHM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaAppbmRleCAyZDZmMzFiLi45Y2I3MmRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTE4LDcgKzE4LDkgQEAKIAogI2RlZmluZSBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXwogCi0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlby5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvRXh0Lmg+CiAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggM2I1MjFhYi4uNTY5ZmE4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTksNyArOSw2IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKQEAgLTE5LDEyICsxOCwxMSBAQAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCA4OTVhNGNlLi5jYzhjMjM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk9NWEhhcm5lc3MiCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJPTVhIYXJuZXNzLmgiCkBAIC0yOCw3ICsyOSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQwLDkgKzQwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgotI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teC5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KIAogI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgICAgICA1MDAwMDAKQEAgLTgxLDEyICs4MCwxMyBAQAogfQogCiBzdGF0dXNfdCBIYXJuZXNzOjppbml0T01YKCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgIHNwPElPbXg+IHRPbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKHRPbXggPT0gbnVsbHB0cikgeworICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgaWYgKGNsaWVudC5jb25uZWN0KCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25uZWN0IHRvIE9NWCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlLiIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgbU9NWCA9IG5ldyB1dGlsczo6TFdPbXgodE9teCk7CisKKyAgICBtT01YID0gY2xpZW50LmludGVyZmFjZSgpOwogCiAgICAgcmV0dXJuIG1PTVggIT0gMCA/IE9LIDogTk9fSU5JVDsKIH0KQEAgLTg0NCw3ICs4NDQsNyBAQAogCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggODJhMDYzMS4uNDMwMmFlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTQyMyw2ICs0MjMsMTEgQEAKICAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIChtT3RoZXJEYXRhTGVuQml0cyAvIDgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBvZmZzZXQgKz0gbU90aGVyRGF0YUxlbkJpdHMgLyA4OwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBtTnVtU3ViRnJhbWVzICYmIG9mZnNldCA+PSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coIlNraXAgc3ViZnJhbWVzIGFmdGVyICVkLCB0b3RhbCAlZCIsIChpbnQpaSwgKGludCltTnVtU3ViRnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCBjNTYwNWI0Li4xYWE4YTIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTQxNyw3ICs0MTcsNyBAQAogICAgIGlmIChzZXNzaW9uRGVzYy0+Z2V0RHVyYXRpb25VcygmZHVyYXRpb25VcykpIHsKICAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKICAgICB9IGVsc2UgewotICAgICAgICBtRm9ybWF0LT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIC0xbGwpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIC0xTEwpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCmluZGV4IGM3YTY1YzIuLmJlZmMyMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcApAQCAtMzYsNyArMzYsNyBAQAogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSKSB7CiAgICAgICAgICAgICBpZiAobUZpcnN0RmFpbHVyZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFMb29wZXI6OkdldE5vd1VzKCkgLSBtRmlyc3RGYWlsdXJlVGltZVVzID4gMTAwMDBsbCkgeworICAgICAgICAgICAgICAgIGlmIChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUZpcnN0RmFpbHVyZVRpbWVVcyA+IDEwMDAwTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbUZpcnN0RmFpbHVyZVRpbWVVcyA9IC0xOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIExPRyhWRVJCT1NFKSA8PCAid2FpdGVkIHRvbyBsb25nIGZvciBwYWNrZXQuIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggYTg2YWI3NC4uNmE0NzA2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIH0KIAogLy8gc3RhdGljCi1jb25zdCBpbnQ2NF90IEFSVFBDb25uZWN0aW9uOjprU2VsZWN0VGltZW91dFVzID0gMTAwMGxsOworY29uc3QgaW50NjRfdCBBUlRQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBMTDsKIAogc3RydWN0IEFSVFBDb25uZWN0aW9uOjpTdHJlYW1JbmZvIHsKICAgICBpbnQgbVJUUFNvY2tldDsKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydGNwU29ja2V0KTsKIAogICAgIC8qIHJhbmQoKSAqIDEwMDAgbWF5IG92ZXJmbG93IGludCB0eXBlLCB1c2UgbG9uZyBsb25nICovCi0gICAgdW5zaWduZWQgc3RhcnQgPSAodW5zaWduZWQpKChyYW5kKCkqIDEwMDBsbCkvUkFORF9NQVgpICsgMTU1NTA7CisgICAgdW5zaWduZWQgc3RhcnQgPSAodW5zaWduZWQpKChyYW5kKCkqIDEwMDBMTCkvUkFORF9NQVgpICsgMTU1NTA7CiAgICAgc3RhcnQgJj0gfjE7CiAKICAgICBmb3IgKHVuc2lnbmVkIHBvcnQgPSBzdGFydDsgcG9ydCA8IDY1NTM2OyBwb3J0ICs9IDIpIHsKQEAgLTMwNyw3ICszMDcsNyBAQAogCiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaWYgKG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgPD0gMAotICAgICAgICAgICAgfHwgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyArIDUwMDAwMDBsbCA8PSBub3dVcykgeworICAgICAgICAgICAgfHwgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyArIDUwMDAwMDBMTCA8PSBub3dVcykgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7CiAgICAgICAgIExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKICAgICAgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAppbmRleCA0ODI3Y2QyLi40YWZhNmY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKQEAgLTE4MCw3ICsxODAsNyBAQAogICAgIH0KIAogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA+PSAwICYmIG1MYXN0RklSUmVxdWVzdFVzICsgNTAwMDAwMGxsID4gbm93VXMpIHsKKyAgICBpZiAobUxhc3RGSVJSZXF1ZXN0VXMgPj0gMCAmJiBtTGFzdEZJUlJlcXVlc3RVcyArIDUwMDAwMDBMTCA+IG5vd1VzKSB7CiAgICAgICAgIC8vIFNlbmQgRklSIHJlcXVlc3RzIGF0IG1vc3QgZXZlcnkgNSBzZWNzLgogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggMDY2N2RmMS4uNGY4Njc3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC00MDAsOCArNDAwLDEwIEBACiAgICAgICAgIHN3aXRjaCAoY291bnQpIHsKICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwogICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwogICAgICAgICB9CkBAIC00MTgsMTAgKzQyMCwxMCBAQAogdWludDY0X3QgQVJUUFdyaXRlcjo6R2V0Tm93TlRQKCkgewogICAgIHVpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAotICAgIG5vd1VzICs9ICgoNzBsbCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwbGw7CisgICAgbm93VXMgKz0gKCg3MExMICogMzY1ICsgMTcpICogMjQpICogNjAgKiA2MCAqIDEwMDAwMDBMTDsKIAotICAgIHVpbnQ2NF90IGhpID0gbm93VXMgLyAxMDAwMDAwbGw7Ci0gICAgdWludDY0X3QgbG8gPSAoKDFsbCA8PCAzMikgKiAobm93VXMgJSAxMDAwMDAwbGwpKSAvIDEwMDAwMDBsbDsKKyAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMExMOworICAgIHVpbnQ2NF90IGxvID0gKCgxTEwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMExMKSkgLyAxMDAwMDAwTEw7CiAKICAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwogfQpAQCAtNTc0LDcgKzU3Niw3IEBACiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCi0gICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMExMKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTY2OSw3ICs2NzEsNyBAQAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMGxsKTsKKyAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBMTCk7CiAKICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggNTYyMGNmOC4uNzg5ZTYyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzgsNyArMzksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKLWNvbnN0IGludDY0X3QgQVJUU1BDb25uZWN0aW9uOjprU2VsZWN0VGltZW91dFVzID0gMTAwMGxsOworY29uc3QgaW50NjRfdCBBUlRTUENvbm5lY3Rpb246OmtTZWxlY3RUaW1lb3V0VXMgPSAxMDAwTEw7CiAKIC8vIHN0YXRpYwogY29uc3QgQVN0cmluZyBBUlRTUENvbm5lY3Rpb246OnNVc2VyQWdlbnQgPQpAQCAtNTksOCArNjAsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE1LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI1NCw3ICsyNTUsNyBAQAogCiAgICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUoaG9zdC5jX3N0cigpKTsKICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gaG9zdCAlcyIsIGhvc3QuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJVbmtub3duIGhvc3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyhob3N0KS5jX3N0cigpKTsKIAogICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FTk9FTlQpOwogICAgICAgICByZXBseS0+cG9zdCgpOwpAQCAtMjY2LDkgKzI2Nyw5IEBACiAgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CiAKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFNQIik7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCwgbVVJRCk7CiAgICAgfQogCiAgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIGZhbHNlKTsKQEAgLTI5Nyw4ICsyOTgsOCBAQAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMzE1LDggKzMxNiw4IEBACiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpwZXJmb3JtRGlzY29ubmVjdCgpIHsKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgfQogICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTM4OSw4ICszOTAsOCBAQAogCiAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggMzI1MDg0Yy4uOTI2MzU2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXMiLCBsaW5lLmNfc3RyKCkpOwogCiAgICAgICAgIHN3aXRjaCAobGluZS5jX3N0cigpWzBdKSB7CiAgICAgICAgICAgICBjYXNlICd2JzoKQEAgLTI2MSw3ICsyNjEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdD0iLCA0KSkgeworICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkgJiYgc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0OiIsIDQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCBkZWJkMDdlLi45YmM5Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCkBAIC00NiwxMiArNDYsMjQgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYm5ldGRfY2xpZW50X2hlYWRlcnMiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9wbGF5ZXIyIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY190ZXN0IHsKQEAgLTg5LDggKzEwMSw1IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggYzZjMDI0NS4uNDhiYzhjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC01NCw2ICs1NSwxMCBAQAogI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKICNlbmRpZgogCisjaWZuZGVmIEZBTExUSFJPVUdIX0lOVEVOREVECisjZGVmaW5lIEZBTExUSFJPVUdIX0lOVEVOREVEIFtbY2xhbmc6OmZhbGx0aHJvdWdoXV0gIC8vIE5PTElOVAorI2VuZGlmCisKIC8vIElmIG5vIGFjY2VzcyB1bml0cyBhcmUgcmVjZWl2ZWQgd2l0aGluIDUgc2VjcywgYXNzdW1lIHRoYXQgdGhlIHJ0cAogLy8gc3RyZWFtIGhhcyBlbmRlZCBhbmQgc2lnbmFsIGVuZCBvZiBzdHJlYW0uCiBzdGF0aWMgaW50NjRfdCBrQWNjZXNzVW5pdFRpbWVvdXRVcyA9IDEwMDAwMDAwbGw7CkBAIC03MCw2ICs3NSw4IEBACiAvLyBhIG5ldyBzZXF1ZW5jZS4KIHN0YXRpYyBpbnQzMl90IGtNYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyA9IDIwOwogCitzdGF0aWMgaW50NjRfdCBrVGVhckRvd25UaW1lb3V0VXMgPSAzMDAwMDAwbGw7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKQEAgLTMwNiw4ICszMTMsMTAgQEAKICAgICAgICAgICAgIHN3aXRjaCAoY291bnQpIHsKICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOwogICAgICAgICAgICAgfQpAQCAtMzM4LDggKzM0Nyw3IEBACiAKICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9vayB1cCBhZGRyZXNzIG9mIHNlc3Npb24gaG9zdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvb2sgdXAgYWRkcmVzcyBvZiBzZXNzaW9uIGhvc3QiKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTUyNCw3ICs1MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKQEAgLTc1MSwxMCArNzU5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODgwLDEwICs4ODgsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtOTI0LDYgKzkzMiwxNCBAQAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2Ugb2YgdGVhcmRvd24gaGFzbid0IGJlZW4gcmVjZWl2ZWQgaW4gMyBzZWNvbmRzLAorICAgICAgICAgICAgICAgIC8vIHBvc3QgJ3RlYXInIG1lc3NhZ2UgdG8gYXZvaWQgQU5SLgorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoInJlY29ubmVjdCIsICZyZWNvbm5lY3QpIHx8ICFyZWNvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRlYXJkb3duID0gcmVwbHktPmR1cCgpOworICAgICAgICAgICAgICAgICAgICB0ZWFyZG93bi0+c2V0SW50MzIoInJlc3VsdCIsIC1FQ09OTkFCT1JURUQpOworICAgICAgICAgICAgICAgICAgICB0ZWFyZG93bi0+cG9zdChrVGVhckRvd25UaW1lb3V0VXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTY1OSwxMiArMTY3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKQEAgLTE5MDYsNyArMTkyMiw3IEBACiAgICAgICAgICAgICBtTGFzdE1lZGlhVGltZVVzID0gbWVkaWFUaW1lVXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCAwKSB7CisgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDAgJiYgIW1TZWVrYWJsZSkgewogICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIGVhcmx5IGFjY2Vzc1VuaXQuIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTVhZDZjNi4uNjkzNTY1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTE0LDkgKzE0LDM2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKKyAgICB9LAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQyIiwKKworICAgIHNyY3M6IFsiVGV4dERlc2NyaXB0aW9uczIuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFwbGF5ZXIyLXByb3RvcyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0MmQzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczI6OlRleHREZXNjcmlwdGlvbnMyKCkgeworfQorCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBpZiAoZmxhZ3MgJiBJTl9CQU5EX1RFWFRfM0dQUCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBHTE9CQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgcGxheWVyTXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIE9VVF9PRl9CQU5EX1RFWFRfU1JUKSB7CisgICAgICAgIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIFBhcnNlIHRoZSBTUlQgdGV4dCBzYW1wbGUsIGFuZCBzdG9yZSB0aGUgdGltaW5nIGFuZCB0ZXh0IHNhbXBsZSBpbiBhIFBsYXllck1lc3NhZ2UuCisvLyBUaGUgUGxheWVyTWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gTWVkaWFQbGF5ZXIyLmphdmEgdGhyb3VnaCBldmVudCwgYW5kIHdpbGwgYmUKKy8vIHBhcnNlZCBpbiBUaW1lZFRleHQuamF2YS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEV4dHJhY3QgdGhlIGxvY2FsIDNHUFAgZGlzcGxheSBkZXNjcmlwdGlvbnMuIDNHUFAgbG9jYWwgZGVzY3JpcHRpb25zCisvLyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2FtcGxlIGlmIGFueS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisKKyAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHNzaXplX3QgdGV4dExlbiA9ICgqZGF0YSkgPDwgOCB8ICgqKGRhdGEgKyAxKSk7CisKKyAgICBpZiAoc2l6ZSA8IHRleHRMZW4gKyAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0ZXh0IHNhbXBsZSBsZW5ndGggYW5kIHRleHQgc2FtcGxlIGl0c2VsZgorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEgKyAyLCB0ZXh0TGVuKTsKKworICAgIGlmIChzaXplID4gdGV4dExlbiArIDIpIHsKKyAgICAgICAgZGF0YSArPSAodGV4dExlbiArIDIpOworICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOyAgICAgIC8vIHNpemUgaW5jbHVkZXMgc2l6ZSBhbmQgdHlwZQorICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBjaHVua1NpemUgPiBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gY2h1bmtTaXplIC0gODsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgLy8gJ3Rib3gnIGJveCB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCB2YWx1ZXMKKyAgICAgICAgICAgIC8vIG9mIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQbGF5ZXJNZXNzYWdlCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9HTE9CQUxfU0VUVElORyk7CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSArIDQpOworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CisKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA8PSA4IHx8IHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAxOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNraXAgRElTUExBWV9GTEFHUywgU1RSVUNUX0pVU1RJRklDQVRJT04sIGFuZCBCQUNLR1JPVU5EX0NPTE9SX1JHQkEKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDE4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSByZW1haW5pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKQEAgLTAsMCArMSw4OCBAQAorIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dERlc2NyaXB0aW9uczIgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7Citwcml2YXRlOgorICAgIFRleHREZXNjcmlwdGlvbnMyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHREZXNjcmlwdGlvbnMyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IGY5Njg3ODguLjY0ZWNjMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTE0LDkgKzE0LDYgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHNyY3M6IFsKQEAgLTM0LDQgKzMxLDggQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKaW5kZXggYTUxMjBiOS4uNGQ1MDRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKQEAgLTMwNSw2ICszMDUsNyBAQAogfQogCiBzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCiAgICAgICAgIGludCBjaGFucywKICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCkBAIC0zMjIsNyArMzIzLDcgQEAKICAgICAgICAgICAgIHVpZCwKICAgICAgICAgICAgIGxhY2luZywKICAgICAgICAgICAgIGxhbmcsCi0gICAgICAgICAgICAiQV9WT1JCSVMiLAorICAgICAgICAgICAgY29kZWMsCiAgICAgICAgICAgICBrQXVkaW9UeXBlLAogICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaAppbmRleCBmZmJiYTFiLi5hOTRjMjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSA9IDEwMDAwMDAsIGRvdWJsZSBkdXIgPSAwKTsKIAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCiAgICAgICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgICAgICBkb3VibGUgcmF0ZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKaW5kZXggNGIwZDQ3Yy4uNTJjMzBlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcApAQCAtNjIsNiArNjIsMTQgQEAKICAgICAgICAgICAgIG1EYXRhKTsKIH0KIAordWludDY0X3QgV2VibUZyYW1lOjpnZXRBYnNUaW1lY29kZSgpIHsKKyAgICByZXR1cm4gbUFic1RpbWVjb2RlOworfQorCit2b2lkIFdlYm1GcmFtZTo6dXBkYXRlQWJzVGltZWNvZGUodWludDY0X3QgbmV3QWJzVGltZWNvZGUpIHsKKyAgICBtQWJzVGltZWNvZGUgPSBuZXdBYnNUaW1lY29kZTsKK30KKwogYm9vbCBXZWJtRnJhbWU6Om9wZXJhdG9yPChjb25zdCBXZWJtRnJhbWUgJm90aGVyKSBjb25zdCB7CiAgICAgaWYgKHRoaXMtPm1Fb3MpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKaW5kZXggYTQxMGE4Ny4uNDdmMjUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCkBAIC0yNSw3ICsyNSw3IEBACiBwdWJsaWM6CiAgICAgY29uc3QgaW50IG1UeXBlOwogICAgIGNvbnN0IGJvb2wgbUtleTsKLSAgICBjb25zdCB1aW50NjRfdCBtQWJzVGltZWNvZGU7CisgICAgdWludDY0X3QgbUFic1RpbWVjb2RlOwogICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1EYXRhOwogICAgIGNvbnN0IGJvb2wgbUVvczsKIApAQCAtMzMsNiArMzMsOCBAQAogICAgIFdlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlckJhc2UgKmJ1Zik7CiAgICAgfldlYm1GcmFtZSgpIHt9CiAKKyAgICB1aW50NjRfdCBnZXRBYnNUaW1lY29kZSgpOworICAgIHZvaWQgdXBkYXRlQWJzVGltZWNvZGUodWludDY0X3QgbmV3QWJzVGltZWNvZGUpOwogICAgIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0OwogCiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKaW5kZXggMjMyNjlhZi4uNjMxYTJhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcApAQCAtNzgsNiArNzgsNyBAQAogICAgICAgbVZpZGVvRnJhbWVzKHZpZGVvVGhyZWFkLT5tU2luayksCiAgICAgICBtQXVkaW9GcmFtZXMoYXVkaW9UaHJlYWQtPm1TaW5rKSwKICAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbVN0YXJ0T2Zmc2V0VGltZWNvZGUoVUlOVDY0X01BWCksCiAgICAgICBtRG9uZSh0cnVlKSB7CiB9CiAKQEAgLTkyLDYgKzkzLDcgQEAKICAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1NvdXJjZSksCiAgICAgICBtQXVkaW9GcmFtZXMoYXVkaW9Tb3VyY2UpLAogICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtU3RhcnRPZmZzZXRUaW1lY29kZShVSU5UNjRfTUFYKSwKICAgICAgIG1Eb25lKHRydWUpIHsKIH0KIApAQCAtMjEzLDYgKzIxNSwxMSBAQAogICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGF1ZGlvRnJhbWUgPSBtQXVkaW9GcmFtZXMucGVlaygpOwogICAgICAgICBBTE9HVigiYSBmcmFtZTogJXAiLCBhdWRpb0ZyYW1lLmdldCgpKTsKIAorICAgICAgICBpZiAobVN0YXJ0T2Zmc2V0VGltZWNvZGUgPT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgbVN0YXJ0T2Zmc2V0VGltZWNvZGUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihhdWRpb0ZyYW1lLT5nZXRBYnNUaW1lY29kZSgpLCB2aWRlb0ZyYW1lLT5nZXRBYnNUaW1lY29kZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tRW9zICYmIGF1ZGlvRnJhbWUtPm1Fb3MpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMjAsMTAgKzIyNywxMiBAQAogICAgICAgICBpZiAoKmF1ZGlvRnJhbWUgPCAqdmlkZW9GcmFtZSkgewogICAgICAgICAgICAgQUxPR1YoInRha2UgYSBmcmFtZSIpOwogICAgICAgICAgICAgbUF1ZGlvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIGF1ZGlvRnJhbWUtPnVwZGF0ZUFic1RpbWVjb2RlKGF1ZGlvRnJhbWUtPmdldEFic1RpbWVjb2RlKCkgLSBtU3RhcnRPZmZzZXRUaW1lY29kZSk7CiAgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2soYXVkaW9GcmFtZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigidGFrZSB2IGZyYW1lIik7CiAgICAgICAgICAgICBtVmlkZW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgdmlkZW9GcmFtZS0+dXBkYXRlQWJzVGltZWNvZGUodmlkZW9GcmFtZS0+Z2V0QWJzVGltZWNvZGUoKSAtIG1TdGFydE9mZnNldFRpbWVjb2RlKTsKICAgICAgICAgICAgIG91dHN0YW5kaW5nRnJhbWVzLnB1c2hfYmFjayh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tS2V5KQogICAgICAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzKys7CkBAIC0zNTAsNyArMzU5LDYgQEAKICAgICAgICAgaWYgKG1TdGFydFRpbWVVcyA9PSBrVW5pbml0aWFsaXplZCkgewogICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgIH0KLSAgICAgICAgdGltZXN0YW1wVXMgLT0gbVN0YXJ0VGltZVVzOwogCiAgICAgICAgIGlmIChtUGF1c2VkICYmICFtUmVzdW1lZCkgewogICAgICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKQEAgLTM2NCwxNCArMzcyLDE0IEBACiAgICAgICAgIC8vIGFkanVzdCB0aW1lLXN0YW1wcyBhZnRlciBwYXVzZS9yZXN1bWUKICAgICAgICAgaWYgKG1SZXN1bWVkKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwbGwpOworICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwTEwpOwogICAgICAgICAgICAgaW50NjRfdCBwYXVzZWREdXJhdGlvblVzID0gZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzIC0gbVRyYWNrRHVyYXRpb25VczsKICAgICAgICAgICAgIENIRUNLX0dFKHBhdXNlZER1cmF0aW9uVXMsIGxhc3REdXJhdGlvblVzKTsKICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSBwYXVzZWREdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXM7CiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7CisgICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwTEwpOwogCiAgICAgICAgIGludDMyX3QgaXNTeW5jID0gZmFsc2U7CiAgICAgICAgIG1kLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKaW5kZXggNzZjOTFmMS4uMWRkYWY5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCkBAIC04Myw2ICs4Myw3IEBACiAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1WaWRlb0ZyYW1lczsKICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbUF1ZGlvRnJhbWVzOwogICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIG1DdWVzOworICAgIHVpbnQ2NF90IG1TdGFydE9mZnNldFRpbWVjb2RlOwogCiAgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggNGQ3M2ViOC4uNWVhYWRiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKQEAgLTExMiw0NiArMTE0LDEwNyBAQAogLy8gc3RhdGljCiBzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CiAgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKLSAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCi0gICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKLSAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisgICAgY29uc3QgY2hhciogbWltZVR5cGU7CiAKICAgICBpZiAoIW1kLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKKyAgICAgICAgfHwgIW1kLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSkpIHsKICAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlID0gMDsKKyAgICBpZiAoIW1kLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICBBTE9HVigia0tleUJpdHNQZXJTYW1wbGUgbm90IGF2YWlsYWJsZSIpOworICAgIH0KIAotICAgIG9mZl90IG9mZiA9IDA7Ci0gICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOwotICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpKSB7CisgICAgICAgIC8vIE9wdXMgaW4gV2ViTSBpcyBhIHdlbGwta25vd24sIHlldCB1bmRlci1kb2N1bWVudGVkLCBmb3JtYXQuIFRoZSBjb2RlYyBwcml2YXRlIGRhdGEKKyAgICAgICAgLy8gb2YgdGhlIHRyYWNrIGlzIGFuIE9wdXMgT2dnIGhlYWRlciAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4NDUjc2VjdGlvbi01LjEpCisgICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSB0cmFjayBpc24ndCBzdGFuZGFyZGl6ZWQsIGl0cyB2YWx1ZSBzaG91bGQgYmUgIkFfT1BVUyIuCisgICAgICAgIE9wdXNIZWFkZXIgaGVhZGVyOworICAgICAgICBoZWFkZXIuY2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgICAgICAgIGhlYWRlci5udW1fc3RyZWFtcyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9jb3VwbGVkID0gMDsKKyAgICAgICAgLy8gLSBDaGFubmVsIG1hcHBpbmcgZmFtaWx5ICg4IGJpdHMgdW5zaWduZWQpCisgICAgICAgIC8vICAtLSAgMCA9IG9uZSBzdHJlYW06IG1vbm8gb3IgTCxSIHN0ZXJlbworICAgICAgICAvLyAgLS0gIDEgPSBjaGFubmVscyBpbiB2b3JiaXMgc3BlYyBvcmRlcjogbW9ubyBvciBMLFIgc3RlcmVvIG9yIC4uLiBvciBGTCxDLEZSLFJMLFJSLExGRSwgLi4uCisgICAgICAgIC8vICAtLSAgMi4uMjU0ID0gcmVzZXJ2ZWQgKHRyZWF0IGFzIDI1NSkKKyAgICAgICAgLy8gIC0tICAyNTUgPSBubyBkZWZpbmVkIGNoYW5uZWwgbWVhbmluZworICAgICAgICAvLworICAgICAgICAvLyAgb3VyIGltcGxlbWVudGF0aW9uIGVuY29kZXM6ICAwLCAxLCBvciAyNTUKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobkNoYW5uZWxzID4gOCkgPyAyNTUgOiAobkNoYW5uZWxzID4gMikpOworICAgICAgICBoZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIGhlYWRlci5za2lwX3NhbXBsZXMgPSAwOwogCi0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworICAgICAgICAvLyBoZWFkZXJzIGFyZSAyMS1ieXRlcyArIHNvbWV0aGluZyBkcml2ZW4gYnkgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBleHBlY3QgbnVtYmVycyBpbiB0aGUgbG93IDMwJ3MgaGVyZS4gV3JpdGVPcHVzSGVhZGVyKCkgd2lsbCB0ZWxsIHVzCisgICAgICAgIC8vIGlmIHRoaW5ncyBhcmUgYmFkLgorICAgICAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcl9kYXRhWzEwMF07CisgICAgICAgIGludCBoZWFkZXJTaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgc2FtcGxlcmF0ZSwgKHVpbnQ4X3QqKWhlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyX2RhdGEpKTsKIAotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBoZWFkZXJTaXplMTsKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisgICAgICAgIGlmIChoZWFkZXJTaXplIDwgMCkgeworICAgICAgICAgICAgLy8gZGlkbid0IGZpbGwgb3V0IHRoYXQgaGVhZGVyIGZvciBzb21lIHJlYXNvbgorICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZW5lcmF0ZSBPUFVTIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCi0gICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKLSAgICByZXR1cm4gZW50cnk7CisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMDsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplOworCisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90KiBjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsICh1aW50OF90KiloZWFkZXJfZGF0YSwgaGVhZGVyU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoIkFfT1BVUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICAgICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworCisgICAgICAgIGlmICghbWQtPmZpbmREYXRhKGtLZXlPcGFxdWVDU0QwLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCisgICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlPcGFxdWVDU0QxLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzc2luZyBoZWFkZXIgZm9ybWF0IGtleXMgZm9yIHZvcmJpcyB0cmFjayIpOworICAgICAgICAgICAgbWQtPmR1bXBUb0xvZygpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgICAgICBvZmZfdCBvZmYgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgICAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUxOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUyOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKworICAgICAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX1ZPUkJJUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgaXMgbm90IGEgc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIsIG1pbWVUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgewpAQCAtMzgyLDE2ICs0NDUsMTggQEAKICAgICBjb25zdCBjaGFyICp2cDggPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CiAgICAgY29uc3QgY2hhciAqdnA5ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OwogICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKIAogICAgIHNpemVfdCBzdHJlYW1JbmRleDsKICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpIHx8CiAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCB2cDksIHN0cmxlbih2cDkpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtWaWRlb0luZGV4OwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpKSB7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkgfHwKKyAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCBvcHVzLCBzdHJsZW4ob3B1cykpKSB7CiAgICAgICAgIHN0cmVhbUluZGV4ID0ga0F1ZGlvSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgIG1pbWUsIHZwOCwgdnA5LCB2b3JiaXMpOworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzLCAlcywgJXMsIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzLCBvcHVzKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAppbmRleCBhNGZhMzQyLi4zOGRlODMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApAQCAtMSwzICsxLDkgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcl9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTE0LDYgKzIwLDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliZXhwYXQiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCkBAIC0zMiwxMCArMzksMTMgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KIAoreHNkX2NvbmZpZyB7CisgICAgbmFtZTogIm1lZGlhX2NvZGVjcyIsCisgICAgc3JjczogWyJtZWRpYV9jb2RlY3MueHNkIl0sCisgICAgcGFja2FnZV9uYW1lOiAibWVkaWEuY29kZWNzIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKaW5kZXggZDk4ZTEyMy4uOTc4M2U5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCkBAIC0xOSwxOSArMTksMzQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGV4cGF0Lmg+CiAKLSNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorCisjaW5jbHVkZSA8ZXhwYXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBNQ1hQID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI7CisKIG5hbWVzcGFjZSB7CiAKK2Jvb2wgZmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworICAgIHJldHVybiBzdGF0KHBhdGguY19zdHIoKSwgJmZpbGVTdGF0KSA9PSAwICYmIFNfSVNSRUcoZmlsZVN0YXQuc3RfbW9kZSk7Cit9CisKIC8qKgogICogU2VhcmNoIGZvciBhIGZpbGUgaW4gYSBsaXN0IG9mIHNlYXJjaCBkaXJlY3Rvcmllcy4KICAqCkBAIC00Miw3ICs1Nyw3IEBACiAgKiBzZWFyY2ggY29udGludWVzIHVudGlsIHRoZSBgbnVsbHB0cmAgZWxlbWVudCBpbiBgc2VhcmNoRGlyc2AgaXMgcmVhY2hlZCwgYXQKICAqIHdoaWNoIHBvaW50IHRoZSBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAuCiAgKgotICogXHBhcmFtW2luXSBzZWFyY2hEaXJzIE51bGwtdGVybWluYXRlZCBhcnJheSBvZiBzZWFyY2ggcGF0aHMuCisgKiBccGFyYW1baW5dIHNlYXJjaERpcnMgYXJyYXkgb2Ygc2VhcmNoIHBhdGhzLgogICogXHBhcmFtW2luXSBmaWxlTmFtZSBOYW1lIG9mIHRoZSBmaWxlIHRvIHNlYXJjaC4KICAqIFxwYXJhbVtvdXRdIG91dFBhdGggRnVsbCBwYXRoIG9mIHRoZSBmaWxlLiBgb3V0UGF0aGAgd2lsbCBob2xkIGEgdmFsaWQgZmlsZQogICogbmFtZSBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgYHRydWVgLgpAQCAtNTAsMTQgKzY1LDEzIEBACiAgKiB2YWxpZCBmaWxlIG5hbWU7IGBmYWxzZWAgb3RoZXJ3aXNlLgogICovCiBib29sIGZpbmRGaWxlSW5EaXJzKAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVOYW1lLAogICAgICAgICBzdGQ6OnN0cmluZyAqb3V0UGF0aCkgewotICAgIGZvciAoOyAqc2VhcmNoRGlycyAhPSBudWxscHRyOyArK3NlYXJjaERpcnMpIHsKLSAgICAgICAgKm91dFBhdGggPSBzdGQ6OnN0cmluZygqc2VhcmNoRGlycykgKyAiLyIgKyBmaWxlTmFtZTsKLSAgICAgICAgc3RydWN0IHN0YXQgZmlsZVN0YXQ7Ci0gICAgICAgIGlmIChzdGF0KG91dFBhdGgtPmNfc3RyKCksICZmaWxlU3RhdCkgPT0gMCAmJgotICAgICAgICAgICAgICAgIFNfSVNSRUcoZmlsZVN0YXQuc3RfbW9kZSkpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZzZWFyY2hEaXIgOiBzZWFyY2hEaXJzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBzZWFyY2hEaXIgKyAiLyIgKyBmaWxlTmFtZTsKKyAgICAgICAgaWYgKGZpbGVFeGlzdHMocGF0aCkpIHsKKyAgICAgICAgICAgICpvdXRQYXRoID0gcGF0aDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtODMsMTIzICs5Nyw0MzUgQEAKIGJvb2wgcGFyc2VCb29sZWFuKGNvbnN0IGNoYXIqIHMpIHsKICAgICByZXR1cm4gc3RyaUVxKHMsICJ5IikgfHwKICAgICAgICAgICAgIHN0cmlFcShzLCAieWVzIikgfHwKKyAgICAgICAgICAgIHN0cmlFcShzLCAiZW5hYmxlZCIpIHx8CiAgICAgICAgICAgICBzdHJpRXEocywgInQiKSB8fAogICAgICAgICAgICAgc3RyaUVxKHMsICJ0cnVlIikgfHwKICAgICAgICAgICAgIHN0cmlFcShzLCAiMSIpOwogfQogCi1zdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLAotICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOwotICAgIHJldHVybiBCQURfVkFMVUU7CisKK3N0YXR1c190IGNvbWJpbmVTdGF0dXMoc3RhdHVzX3QgYSwgc3RhdHVzX3QgYikgeworICAgIGlmIChhID09IE5PX0lOSVQpIHsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfSBlbHNlIGlmICgoYSA9PSBPSyAmJiAoYiA9PSBOQU1FX05PVF9GT1VORCB8fCBiID09IEFMUkVBRFlfRVhJU1RTIHx8IGIgPT0gTk9fSU5JVCkpCisgICAgICAgICAgICB8fCAoYiA9PSBPSyAmJiAoYSA9PSBOQU1FX05PVF9GT1VORCB8fCBhID09IEFMUkVBRFlfRVhJU1RTKSkpIHsKKyAgICAgICAgLy8gaWdub3JlIE5BTUVfTk9UX0ZPVU5EIGFuZCBBTFJFQURZX0VYSVNUIGVycm9ycyBhcyBsb25nIGFzIHRoZSBvdGhlciBlcnJvciBpcyBPSworICAgICAgICAvLyBhbHNvIGhhbmRsZSBPSyArIE5PX0lOSVQgaGVyZQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcHJlZmVyIHRoZSBmaXJzdCBlcnJvciByZXN1bHQKKyAgICAgICAgcmV0dXJuIGEgPyA6IGI7CisgICAgfQogfQogCi1zdGF0dXNfdCBsaW1pdEVycm9yKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgKm1zZykgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnICVzIiwgbmFtZSwgbXNnKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOworTUNYUDo6U3RyaW5nU2V0IHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoY29uc3QgY2hhciAqcykgeworICAgIE1DWFA6OlN0cmluZ1NldCByZXN1bHQ7CisgICAgZm9yIChjb25zdCBjaGFyICpwdHIgPSBzID8gOiAiIjsgKnB0cjsgKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmVuZCA9IHN0cmNocm51bChwdHIsICcsJyk7CisgICAgICAgIGlmIChwdHIgIT0gZW5kKSB7IC8vIHNraXAgZW1wdHkgdmFsdWVzCisgICAgICAgICAgICByZXN1bHQuZW1wbGFjZShwdHIsIGVuZCAtIHB0cik7CisgICAgICAgIH0KKyAgICAgICAgcHRyID0gZW5kICsgKCdcMCcgIT0gKmVuZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYXR0ciwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUsCi0gICAgICAgICAgICBhdHRyLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KKyNkZWZpbmUgUExPR0QobXNnLCAuLi4pIFwKKyAgICAgICAgQUxPR0QobXNnICIgYXQgbGluZSAlenUgb2YgJXMiLCAjI19fVkFfQVJHU19fLCBcCisgICAgICAgICAgICAgICAgKHNpemVfdCk6OlhNTF9HZXRDdXJyZW50TGluZU51bWJlcihtUGFyc2VyLmdldCgpKSwgbVBhdGguY19zdHIoKSk7CiAKLX07IC8vIHVubmFtZWQgbmFtZXNwYWNlCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCi1jb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzW107Ci1jb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZTsKLWNvbnN0ZXhwciBjaGFyIGNvbnN0KiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZTsKK3N0cnVjdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbCB7CisgICAgLy8gc3RhdHVzICsgZXJyb3IgbWVzc2FnZQorICAgIHN0cnVjdCBSZXN1bHQgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXR1c190IG1TdGF0dXM7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1FcnJvcjsKKworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzdWx0KHN0YXR1c190IHMsIHN0ZDo6c3RyaW5nIGVycm9yID0gIiIpCisgICAgICAgICAgICA6IG1TdGF0dXMocyksCisgICAgICAgICAgICAgIG1FcnJvcihlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yLmVtcHR5KCkgJiYgcykgeworICAgICAgICAgICAgICAgIG1FcnJvciA9ICJGYWlsZWQgKCIgKyBzdGQ6OnN0cmluZyhhc1N0cmluZyhzKSkgKyAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BlcmF0b3Igc3RhdHVzX3QoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisgICAgfTsKKworCisgICAgLy8gUGFyc2VkIGRhdGEKKyAgICBzdHJ1Y3QgRGF0YSB7CisgICAgICAgIC8vIFNlcnZpY2UgYXR0cmlidXRlcworICAgICAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisgICAgICAgIENvZGVjTWFwIG1Db2RlY01hcDsKKyAgICAgICAgUmVzdWx0IGFkZEdsb2JhbChzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlLCBib29sIHVwZGF0aW5nKTsKKyAgICB9OworCisgICAgZW51bSBTZWN0aW9uIHsKKyAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKKyAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSUywKKyAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAorICAgICAgICBTRUNUSU9OX1ZBUklBTlQsCisgICAgICAgIFNFQ1RJT05fVU5LTk9XTiwKKyAgICB9OworCisgICAgLy8gWE1MIHBhcnNpbmcgc3RhdGUKKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgIHByaXZhdGU6CisgICAgICAgIERhdGEgKm1EYXRhOworCisgICAgICAgIC8vIGN1cnJlbnQgY29kZWMgYW5kL29yIHR5cGUsIHBsdXMgd2hldGhlciB3ZSBhcmUgdXBkYXRpbmcKKyAgICAgICAgc3RydWN0IENvZGVjQW5kVHlwZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICAgICAgICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ29kZWM7CisgICAgICAgICAgICBUeXBlTWFwOjppdGVyYXRvciBtVHlwZTsKKyAgICAgICAgICAgIGJvb2wgbVVwZGF0aW5nOworICAgICAgICB9OworCisgICAgICAgIC8vIHVzaW5nIHZlY3RvcnMgYXMgd2UgbmVlZCB0byByZXNldCB0aGVpciBzaXplcworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbUluY2x1ZGVTdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nU2V0PiBtVmFyaWFudHNTdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNBbmRUeXBlPiBtQ3VycmVudDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoRGF0YSAqZGF0YSk7CisKKyAgICAgICAgRGF0YSAmZGF0YSgpIHsgcmV0dXJuICptRGF0YTsgfQorCisgICAgICAgIC8vIHVzZWQgdG8gcmVzdG9yZSBwYXJzaW5nIHN0YXRlIGF0IFhNTCBpbmNsdWRlIGJvdW5kYXJpZXMsIGluIGNhc2UgcGFyc2luZyB0aGUgaW5jbHVkZWQKKyAgICAgICAgLy8gZmlsZSBmYWlscy4KKyAgICAgICAgc3RydWN0IFJlc3RvcmVQb2ludCB7CisgICAgICAgICAgICBzaXplX3QgbnVtSW5jbHVkZXM7CisgICAgICAgICAgICBzaXplX3QgbnVtU2VjdGlvbnM7CisgICAgICAgICAgICBzaXplX3QgbnVtVmFyaWFudFNldHM7CisgICAgICAgICAgICBzaXplX3QgbnVtQ29kZWNBbmRUeXBlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBtZXRob2QgbWFuaXB1bGF0aW5nIHJlc3RvcmUgcG9pbnRzIChhbGwgc3RhdGUgc3RhY2tzKQorICAgICAgICBSZXN0b3JlUG9pbnQgY3JlYXRlUmVzdG9yZVBvaW50KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICBtSW5jbHVkZVN0YWNrLnNpemUoKSwgbVNlY3Rpb25TdGFjay5zaXplKCksIG1WYXJpYW50c1N0YWNrLnNpemUoKSwgbUN1cnJlbnQuc2l6ZSgpCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXN0b3JlKFJlc3RvcmVQb2ludCBycCkgeworICAgICAgICAgICAgQ0hFQ0tfR0UobUluY2x1ZGVTdGFjay5zaXplKCksIHJwLm51bUluY2x1ZGVzKTsKKyAgICAgICAgICAgIENIRUNLX0dFKG1TZWN0aW9uU3RhY2suc2l6ZSgpLCBycC5udW1TZWN0aW9ucyk7CisgICAgICAgICAgICBDSEVDS19HRShtVmFyaWFudHNTdGFjay5zaXplKCksIHJwLm51bVZhcmlhbnRTZXRzKTsKKyAgICAgICAgICAgIENIRUNLX0dFKG1DdXJyZW50LnNpemUoKSwgcnAubnVtQ29kZWNBbmRUeXBlcyk7CisKKyAgICAgICAgICAgIG1JbmNsdWRlU3RhY2sucmVzaXplKHJwLm51bUluY2x1ZGVzKTsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucmVzaXplKHJwLm51bVNlY3Rpb25zKTsKKyAgICAgICAgICAgIG1WYXJpYW50c1N0YWNrLnJlc2l6ZShycC5udW1WYXJpYW50U2V0cyk7CisgICAgICAgICAgICBtQ3VycmVudC5yZXNpemUocnAubnVtQ29kZWNBbmRUeXBlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtZXRob2RzIG1hbmlwdWxhdGluZyB0aGUgaW5jbHVkZSBzdGFjaworICAgICAgICBSZXN1bHQgZW50ZXJJbmNsdWRlKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKKyAgICAgICAgdm9pZCBleGl0SW5jbHVkZSgpIHsKKyAgICAgICAgICAgIG1JbmNsdWRlU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ldGhvZHMgbWFuaXB1bGF0aW5nIHRoZSBjb2RlYy90eXBlIHN0YWNrL3N0YXRlCisgICAgICAgIGJvb2wgaW5Db2RlYygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhbUN1cnJlbnQuZW1wdHkoKSAmJiBtQ3VycmVudC5iYWNrKCkubUNvZGVjICE9IG1EYXRhLT5tQ29kZWNNYXAuZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGluVHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBpbkNvZGVjKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnQuYmFjaygpLm1UeXBlICE9IG1DdXJyZW50LmJhY2soKS5tQ29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0IGVudGVyTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgdXBkYXRlKTsKKyAgICAgICAgUmVzdWx0IGVudGVyVHlwZShjb25zdCBjaGFyICpuYW1lLCBib29sIHVwZGF0ZSk7CisgICAgICAgIHZvaWQgZXhpdENvZGVjT3JUeXBlKCkgeworICAgICAgICAgICAgbUN1cnJlbnQucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGluQ29kZWMoKQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZjb2RlYygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudC5iYWNrKCkubUNvZGVjLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5Db2RlYygpCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvZGVjTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudC5iYWNrKCkubU5hbWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5Db2RlYygpCisgICAgICAgIGJvb2wgdXBkYXRpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnQuYmFjaygpLm1VcGRhdGluZzsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBpblR5cGUoKQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZ0eXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50LmJhY2soKS5tVHlwZS0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyBtYW5pcHVsYXRpbmcgdGhlIHNlY3Rpb24gc3RhY2sKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1TZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICB9CisgICAgICAgIFNlY3Rpb24gbGFzdE5vbkluY2x1ZGVTZWN0aW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZW50ZXJTZWN0aW9uKFNlY3Rpb24gcykgeworICAgICAgICAgICAgbVNlY3Rpb25TdGFjay5wdXNoX2JhY2socyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBleGl0U2VjdGlvbigpIHsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgICAgIENIRUNLKCFtU2VjdGlvblN0YWNrLmVtcHR5KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyBtYW5pcHVsYXRpbmcgdGhlIHZhcmlhbnRzIHN0YWNrCisgICAgICAgIFN0cmluZ1NldCB2YXJpYW50cygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVmFyaWFudHNTdGFjay5iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlbnRlclZhcmlhbnRzKFN0cmluZ1NldCB2YXJpYW50cykgeworICAgICAgICAgICAgbVZhcmlhbnRzU3RhY2sucHVzaF9iYWNrKHZhcmlhbnRzKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGV4aXRWYXJpYW50cygpIHsKKyAgICAgICAgICAgIG1WYXJpYW50c1N0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1dGlsaXR5IG1ldGhvZHMKKworICAgICAgICAvLyB1cGRhdGVzIHJhbmssIGRvbWFpbnMsIHZhcmlhbnRzIGFuZCBlbmFibGVkbmVzcyBvbiB0aGUgY3VycmVudCBjb2RlYy90eXBlCisgICAgICAgIFJlc3VsdCB1cGRhdGVDb2RlYygKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyYW5rLCBTdHJpbmdTZXQgZG9tYWlucywgU3RyaW5nU2V0IHZhcmlhbnRzLCBjb25zdCBjaGFyICplbmFibGVkKTsKKyAgICAgICAgLy8gYWRkcyBhIGtleS12YWx1ZSBhdHRyaWJ1dGUgZGV0YWlsIHRvIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgY29kZWMKKyAgICAgICAgdm9pZCBhZGREZXRhaWwoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwgY29uc3Qgc3RkOjpzdHJpbmcgJnZhbHVlKTsKKyAgICB9OworCisgICAgLyoqIFhNTCBQYXJzZXIgKHN0YXRlKSAqLworICAgIHN0cnVjdCBQYXJzZXIgeworICAgICAgICBTdGF0ZSAqbVN0YXRlOworCisgICAgICAgIFBhcnNlcihTdGF0ZSAqc3RhdGUsIHN0ZDo6c3RyaW5nIHBhdGgpOworCisgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIHBhcnNlciBzdGF0ZQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8WE1MX1BhcnNlclN0cnVjdD4gbVBhcnNlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVBhdGg7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1IcmVmQmFzZTsKKyAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsKKworICAgICAgICB2b2lkIHBhcnNlWG1sRmlsZSgpOworCisgICAgICAgIC8vIFhNTCBwYXJzZXIgY2FsbGJhY2tzCisgICAgICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIHZvaWQgdXBkYXRlU3RhdHVzKHN0YXR1c190IHN0YXR1cyk7CisgICAgICAgIHZvaWQgbG9nQW55RXJyb3JzKGNvbnN0IFJlc3VsdCAmc3RhdHVzKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCisgICAgICAgIHN0YXR1c190IGFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICpwcmVmaXggPSBudWxscHRyKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkU2V0dGluZyhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCA9IG51bGxwdHIpOworICAgICAgICBzdGF0dXNfdCBlbnRlck1lZGlhQ29kZWMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgICAgICBzdGF0dXNfdCBlbnRlclR5cGUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgaW5jbHVkZVhtbEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgbGltaXRWYXJpYW50cyhjb25zdCBjaGFyICoqYXR0cnMpOworCisgICAgICAgIHN0YXR1c190IHVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmFuaywgY29uc3QgU3RyaW5nU2V0ICZkb21haW4sIGNvbnN0IFN0cmluZ1NldCAmdmFyaWFudHMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5hYmxlZCk7CisgICAgfTsKKworICAgIHN0YXR1c190IHBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZmlsZU5hbWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnNlYXJjaERpcnMpOworCisgICAgc3RhdHVzX3QgcGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKKworICAgIC8vIENvbXB1dGVkIGxvbmdlc3QgY29tbW9uIHByZWZpeAorICAgIERhdGEgbURhdGE7CisgICAgU3RhdGUgbVN0YXRlOworCisgICAgLy8gUm9sZSBtYXAKKyAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1Db21tb25QcmVmaXg7CisgICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKworICAgIHN0YXR1c190IG1QYXJzaW5nU3RhdHVzOworCisgICAgSW1wbCgpCisgICAgICAgIDogbVN0YXRlKCZtRGF0YSksCisgICAgICAgICAgbVBhcnNpbmdTdGF0dXMoTk9fSU5JVCkgeworICAgIH0KKworICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7CisgICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworCisgICAgY29uc3QgQXR0cmlidXRlTWFwJiBnZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOworICAgICAgICByZXR1cm4gbURhdGEubVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisgICAgfQorCisgICAgY29uc3QgQ29kZWNNYXAmIGdldENvZGVjTWFwKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOworICAgICAgICByZXR1cm4gbURhdGEubUNvZGVjTWFwOworICAgIH0KKworICAgIGNvbnN0IFJvbGVNYXAmIGdldFJvbGVNYXAoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyKiBnZXRDb21tb25QcmVmaXgoKSBjb25zdDsKKworICAgIHN0YXR1c190IGdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtTG9jayk7CisgICAgICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKKyAgICB9Cit9OworCiBjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aDsKIAotTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKLSAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIDoKLSAgICBtUGFyc2luZ1N0YXR1cyhOT19JTklUKSwKLSAgICBtVXBkYXRlKGZhbHNlKSwKLSAgICBtQ29kZWNDb3VudGVyKDApIHsKLSAgICBzdGQ6OnN0cmluZyBwYXRoOwotICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBtYWluWG1sTmFtZSwgJnBhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCAlcyIsIG1haW5YbWxOYW1lKTsKLSAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgaWYgKGZpbmRGaWxlSW5EaXJzKHNlYXJjaERpcnMsIHBlcmZvcm1hbmNlWG1sTmFtZSwgJnBhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoLCB0cnVlKTsKLSAgICB9CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6TWVkaWFDb2RlY3NYbWxQYXJzZXIoKQorICAgIDogbUltcGwobmV3IEltcGwoKSkgewogfQogCi1ib29sIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVRvcExldmVsWE1MRmlsZSgKLSAgICAgICAgY29uc3QgY2hhciAqY29kZWNzX3htbCwKLSAgICAgICAgYm9vbCBpZ25vcmVfZXJyb3JzKSB7Ci0gICAgLy8gZ2V0IGhyZWZfYmFzZQotICAgIGNvbnN0IGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7Ci0gICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gbnVsbHB0cikgewotICAgICAgICBtSHJlZkJhc2UgPSBzdGQ6OnN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmZpbGVOYW1lcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKGZpbGVOYW1lcywgc2VhcmNoRGlycyk7Cit9CiAKLSAgICBtUGFyc2luZ1N0YXR1cyA9IE9LOyAvLyBrZWVwaW5nIHRoaXMgaGVyZSBmb3Igc2FmZXR5Ci0gICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhtbFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKKyAgICByZXR1cm4gbUltcGwtPnBhcnNlWG1sUGF0aChwYXRoKTsKK30KIAotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtUGFyc2luZ1N0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVygicGFyc2VUb3BMZXZlbFhNTEZpbGUoJXMpIGZhaWxlZCIsIGNvZGVjc194bWwpOwotICAgICAgICBpZiAoaWdub3JlX2Vycm9ycykgewotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBPSzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmZpbGVOYW1lcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gTk9fSU5JVDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0lOSVQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGg7CisgICAgICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBmaWxlTmFtZSwgJnBhdGgpKSB7CisgICAgICAgICAgICBlcnIgPSBwYXJzZVhtbFBhdGgocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiQ2Fubm90IGZpbmQgJXMiLCBwYXRoLmNfc3RyKCkpOwogICAgICAgICB9Ci0gICAgICAgIG1Db2RlY01hcC5jbGVhcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJlcyA9IGNvbWJpbmVTdGF0dXMocmVzLCBlcnIpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6cGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1Mb2NrKTsKKyAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBmaW5kICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBjb21iaW5lU3RhdHVzKG1QYXJzaW5nU3RhdHVzLCBOQU1FX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAvLyBzYXZlIHN0YXRlIChldmVuIHRob3VnaCB3ZSBzaG91bGQgYWx3YXlzIGJlIGF0IHRvcGxldmVsIGhlcmUpCisgICAgU3RhdGU6OlJlc3RvcmVQb2ludCBycCA9IG1TdGF0ZS5jcmVhdGVSZXN0b3JlUG9pbnQoKTsKKyAgICBQYXJzZXIgcGFyc2VyKCZtU3RhdGUsIHBhdGgpOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGUoKTsKKyAgICBtU3RhdGUucmVzdG9yZShycCk7CisKKyAgICBpZiAocGFyc2VyLmdldFN0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJwYXJzZVhtbFBhdGgoJXMpIGZhaWxlZCB3aXRoICVzIiwgcGF0aC5jX3N0cigpLCBhc1N0cmluZyhwYXJzZXIuZ2V0U3RhdHVzKCkpKTsKKyAgICB9CisgICAgbVBhcnNpbmdTdGF0dXMgPSBjb21iaW5lU3RhdHVzKG1QYXJzaW5nU3RhdHVzLCBwYXJzZXIuZ2V0U3RhdHVzKCkpOworICAgIHJldHVybiBwYXJzZXIuZ2V0U3RhdHVzKCk7CiB9CiAKIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjp+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKSB7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U3RhdGU6OlN0YXRlKE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpEYXRhICpkYXRhKQorICAgIDogbURhdGEoZGF0YSkgeworICAgIG1TZWN0aW9uU3RhY2suZW1wbGFjZV9iYWNrKFNFQ1RJT05fVE9QTEVWRUwpOworfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U2VjdGlvbgorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjpsYXN0Tm9uSW5jbHVkZVNlY3Rpb24oKSBjb25zdCB7CisgICAgZm9yIChhdXRvIGl0ID0gbVNlY3Rpb25TdGFjay5lbmQoKTsgaXQgIT0gbVNlY3Rpb25TdGFjay5iZWdpbigpOyAtLWl0KSB7CisgICAgICAgIGlmIChpdFstMV0gIT0gU0VDVElPTl9JTkNMVURFKSB7CisgICAgICAgICAgICByZXR1cm4gaXRbLTFdOworICAgICAgICB9CisgICAgfQorICAgIFRSRVNQQVNTKCJtdXN0IGhhdmUgbm9uLWluY2x1ZGUgc2VjdGlvbiIpOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnVwZGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBtU3RhdHVzID0gY29tYmluZVN0YXR1cyhtU3RhdHVzLCBzdGF0dXMpOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmxvZ0FueUVycm9ycyhjb25zdCBSZXN1bHQgJnN0YXR1cykgY29uc3QgeworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cy5lcnJvcigpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIFBMT0dEKCJlcnJvciAlcyIsIGFzU3RyaW5nKChzdGF0dXNfdClzdGF0dXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCIlcyIsIHN0YXR1cy5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpQYXJzZXIoU3RhdGUgKnN0YXRlLCBzdGQ6OnN0cmluZyBwYXRoKQorICAgIDogbVN0YXRlKHN0YXRlKSwKKyAgICAgIG1QYXRoKHBhdGgpLAorICAgICAgbVN0YXR1cyhOT19JTklUKSB7CisgICAgLy8gZGV0ZXJtaW5lIGhyZWZfYmFzZQorICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgiLyIpOworICAgIGlmIChlbmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbUhyZWZCYXNlID0gcGF0aC5zdWJzdHIoMCwgZW5kICsgMSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnBhcnNlWG1sRmlsZSgpIHsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gbVBhdGguY19zdHIoKTsKKyAgICBBTE9HRCgicGFyc2luZyAlcy4uLiIsIHBhdGgpOwogICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwogCiAgICAgaWYgKGZpbGUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7Ci0gICAgICAgIG1QYXJzaW5nU3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIEFMT0dEKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKKyAgICAgICAgbVN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgWE1MX1BhcnNlciBwYXJzZXIgPSA6OlhNTF9QYXJzZXJDcmVhdGUobnVsbHB0cik7Ci0gICAgTE9HX0ZBVEFMX0lGKHBhcnNlciA9PSBudWxscHRyLCAiWE1MX01lZGlhQ29kZWNzWG1sUGFyc2VyQ3JlYXRlKCkgZmFpbGVkLiIpOworICAgIG1QYXJzZXIgPSBzdGQ6OnNoYXJlZF9wdHI8WE1MX1BhcnNlclN0cnVjdD4oCisgICAgICAgIDo6WE1MX1BhcnNlckNyZWF0ZShudWxscHRyKSwKKyAgICAgICAgW10oWE1MX1BhcnNlclN0cnVjdCAqcGFyc2VyKSB7IDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsgfSk7CisgICAgTE9HX0ZBVEFMX0lGKCFtUGFyc2VyLCAiWE1MX01lZGlhQ29kZWNzWG1sUGFyc2VyQ3JlYXRlKCkgZmFpbGVkLiIpOwogCi0gICAgOjpYTUxfU2V0VXNlckRhdGEocGFyc2VyLCB0aGlzKTsKLSAgICA6OlhNTF9TZXRFbGVtZW50SGFuZGxlcigKLSAgICAgICAgICAgIHBhcnNlciwgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIsIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcik7CisgICAgOjpYTUxfU2V0VXNlckRhdGEobVBhcnNlci5nZXQoKSwgdGhpcyk7CisgICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIobVBhcnNlci5nZXQoKSwgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIsIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcik7CiAKICAgICBzdGF0aWMgY29uc3RleHByIGludCBCVUZGX1NJWkUgPSA1MTI7Ci0gICAgd2hpbGUgKG1QYXJzaW5nU3RhdHVzID09IE9LKSB7Ci0gICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOworICAgIC8vIHVwZGF0ZVN0YXR1cyhPSyk7CisgICAgaWYgKG1TdGF0dXMgPT0gTk9fSU5JVCkgeworICAgICAgICBtU3RhdHVzID0gT0s7CisgICAgfQorICAgIHdoaWxlIChtU3RhdHVzID09IE9LKSB7CisgICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIobVBhcnNlci5nZXQoKSwgQlVGRl9TSVpFKTsKICAgICAgICAgaWYgKGJ1ZmYgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgbVN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGludCBieXRlc19yZWFkID0gOjpmcmVhZChidWZmLCAxLCBCVUZGX1NJWkUsIGZpbGUpOwogICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byByZWFkIik7Ci0gICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IEVSUk9SX0lPOworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCBpbiBjYWxsIHRvIHJlYWQiKTsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBFUlJPUl9JTzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIobVBhcnNlci5nZXQoKSwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBYTUxfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOwotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBQTE9HRCgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUobVBhcnNlci5nZXQoKSkpKTsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMDgsMzkgKzUzNCw0NyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworICAgIG1QYXJzZXIucmVzZXQoKTsKIAogICAgIGZjbG9zZShmaWxlKTsKICAgICBmaWxlID0gbnVsbHB0cjsKIH0KIAogLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCiAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcio+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7CisgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcio+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7CiB9CiAKIC8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIqPihtZSktPmVuZEVsZW1lbnRIYW5kbGVyKG5hbWUpOwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgeworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6aW5jbHVkZVhtbEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgY29uc3QgY2hhciAqaHJlZiA9IG51bGxwdHI7CiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgImhyZWYiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBocmVmID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jbHVkZVhNTEZpbGU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJJbmNsdWRlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaHJlZiA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiSW5jbHVkZTogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKKyAgICBpZiAoaHJlZiA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJJbmNsdWRlIHdpdGggbm8gJ2hyZWYnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCiAgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCiAgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKQEAgLTI1MCw3NCArNTg0LDExNCBAQAogICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdhJyAmJiBocmVmW2ldIDw9ICd6JykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICBQTE9HRCgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGhyZWY7CiAgICAgaWYgKGZpbGVuYW1lLmNvbXBhcmUoMCwgMTMsICJtZWRpYV9jb2RlY3NfIikgIT0gMCB8fAogICAgICAgICAgICAgZmlsZW5hbWUuY29tcGFyZShmaWxlbmFtZS5zaXplKCkgLSA0LCA0LCAiLnhtbCIpICE9IDApIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIFBMT0dEKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBmaWxlbmFtZS5pbnNlcnQoMCwgbUhyZWZCYXNlKTsKIAotICAgIHN0YXR1c190IG9sZFBhcnNpbmdTdGF0dXMgPSBtUGFyc2luZ1N0YXR1czsKKyAgICBSZXN1bHQgcmVzID0gbVN0YXRlLT5lbnRlckluY2x1ZGUoZmlsZW5hbWUpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgbG9nQW55RXJyb3JzKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0gICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotCi0gICAgc3RhdHVzX3QgbmV3UGFyc2luZ1N0YXR1cyA9IG1QYXJzaW5nU3RhdHVzOwotICAgIG1QYXJzaW5nU3RhdHVzID0gb2xkUGFyc2luZ1N0YXR1czsKLSAgICByZXR1cm4gbmV3UGFyc2luZ1N0YXR1czsKKyAgICAvLyBzYXZlIHN0YXRlIHNvIHRoYXQgd2UgY2FuIHJlc3VtZSBldmVuIGlmIFhNTCBwYXJzaW5nIG9mIHRoZSBpbmNsdWRlZCBmaWxlIGZhaWxlZCBtaWR3YXkKKyAgICBTdGF0ZTo6UmVzdG9yZVBvaW50IHJwID0gbVN0YXRlLT5jcmVhdGVSZXN0b3JlUG9pbnQoKTsKKyAgICBQYXJzZXIgcGFyc2VyKG1TdGF0ZSwgZmlsZW5hbWUpOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGUoKTsKKyAgICBtU3RhdGUtPnJlc3RvcmUocnApOworICAgIG1TdGF0ZS0+ZXhpdEluY2x1ZGUoKTsKKyAgICByZXR1cm4gcGFyc2VyLmdldFN0YXR1cygpOwogfQogCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlJlc3VsdAorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjplbnRlckluY2x1ZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVOYW1lKSB7CisgICAgaWYgKHN0ZDo6ZmluZChtSW5jbHVkZVN0YWNrLmJlZ2luKCksIG1JbmNsdWRlU3RhY2suZW5kKCksIGZpbGVOYW1lKQorICAgICAgICAgICAgIT0gbUluY2x1ZGVTdGFjay5lbmQoKSkgeworICAgICAgICByZXR1cm4geyBCQURfVkFMVUUsICJyZWN1cnNpdmUgaW5jbHVkZSBjaGFpbiIgfTsKKyAgICB9CisgICAgbUluY2x1ZGVTdGFjay5lbXBsYWNlX2JhY2soZmlsZU5hbWUpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKICAgICBib29sIGluVHlwZSA9IHRydWU7CisgICAgUmVzdWx0IGVyciA9IE5PX0lOSVQ7CiAKKyAgICBTZWN0aW9uIHNlY3Rpb24gPSBtU3RhdGUtPnNlY3Rpb24oKTsKKworICAgIC8vIGhhbmRsZSBpbmNsdWRlIGF0IGFueSBsZXZlbAogICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlWE1MRmlsZShhdHRycykgPT0gT0spIHsKLSAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7Ci0gICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oU0VDVElPTl9JTkNMVURFKTsKKyAgICAgICAgdXBkYXRlU3RhdHVzKGluY2x1ZGVYbWxGaWxlKGF0dHJzKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgeworICAgIC8vIGhhbmRsZSBpbmNsdWRlIHNlY3Rpb24gKHRvcCBsZXZlbCkKKyAgICBpZiAoc2VjdGlvbiA9PSBTRUNUSU9OX0lOQ0xVREUpIHsKKyAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJJbmNsdWRlZCIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gaW1pdGF0ZSBwcmlvciBsZXZlbAorICAgICAgICBzZWN0aW9uID0gbVN0YXRlLT5sYXN0Tm9uSW5jbHVkZVNlY3Rpb24oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgogICAgICAgICB7CisgICAgICAgICAgICBTZWN0aW9uIG5leHRTZWN0aW9uOwogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9TRVRUSU5HUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjcyIpIHx8IHN0ckVxKG5hbWUsICJJbmNsdWRlZCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24obmV4dFNlY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlNldHRpbmciKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkU2V0dGluZyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRTZXR0aW5nKGF0dHJzLCAidmFyaWFudC0iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkRvbWFpbiIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkU2V0dGluZyhhdHRycywgImRvbWFpbi0iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhlcnIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKHRydWUgLyogZW5jb2RlciAqLywgYXR0cnMpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKKyAgICAgICAgICAgICAgICBlcnIgPSBlbnRlck1lZGlhQ29kZWMoYXR0cnMsIHNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSUyk7CisgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeyAvLyBza2lwIHRoaXMgZWxlbWVudCBvbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbihTRUNUSU9OX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJWYXJpYW50cyhtU3RhdGUtPmNvZGVjKCkudmFyaWFudFNldCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSUyA/IFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMjYsMTAzICs3MDAsMTIzIEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlF1aXJrIikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRRdWlyayhhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkUXVpcmsoYXR0cnMsICJxdWlyazo6Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSkgeworICAgICAgICAgICAgICAgIGVyciA9IGFkZFF1aXJrKGF0dHJzLCAiYXR0cmlidXRlOjoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkFsaWFzIikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRBbGlhcyhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fRU5DT0RFUikpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSA6IFNFQ1RJT05fRU5DT0RFUl9UWVBFKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBlbnRlclR5cGUoYXR0cnMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsgLy8gc2tpcCB0aGlzIGVsZW1lbnQgb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oU0VDVElPTl9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVJfVFlQRSA6IFNFQ1RJT05fRU5DT0RFUl9UWVBFKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW5UeXBlID0gZmFsc2U7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fVkFSSUFOVDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gaWdub3JlIGxpbWl0cyBhbmQgZmVhdHVyZXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgdHlwZQotICAgICAgICAgICAgYm9vbCBvdXRzaWRlID0gIWluVHlwZSAmJgotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7Ci0gICAgICAgICAgICBpZiAob3V0c2lkZSAmJgotICAgICAgICAgICAgICAgICAgICAoc3RyRXEobmFtZSwgIkxpbWl0IikgfHwgc3RyRXEobmFtZSwgIkZlYXR1cmUiKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CisgICAgICAgICAgICBpZiAoIW1TdGF0ZS0+aW5UeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN0ckVxKG5hbWUsICJMaW1pdCIpIHx8IHN0ckVxKG5hbWUsICJGZWF0dXJlIikgfHwgc3RyRXEobmFtZSwgIlZhcmlhbnQiKSkpIHsKKyAgICAgICAgICAgICAgICBQTE9HRCgiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTGltaXQiKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRMaW1pdChhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRGZWF0dXJlKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRGZWF0dXJlKGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlZhcmlhbnQiKSAmJiBzZWN0aW9uICE9IFNFQ1RJT05fVkFSSUFOVCkgeworICAgICAgICAgICAgICAgIGVyciA9IGxpbWl0VmFyaWFudHMoYXR0cnMpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKGVyciA9PSBPSyA/IFNFQ1RJT05fVkFSSUFOVCA6IFNFQ1RJT05fVU5LTk9XTik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluVHlwZQorICAgICAgICAgICAgICAgICAgICAmJiAoc3RyRXEobmFtZSwgIkFsaWFzIikgfHwgc3RyRXEobmFtZSwgIkF0dHJpYnV0ZSIpIHx8IHN0ckVxKG5hbWUsICJRdWlyayIpKSkgeworICAgICAgICAgICAgICAgIFBMT0dEKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgbm90IGRpcmVjdGx5IGluIGEgTWVkaWFDb2RlYyIsIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE5PX0lOSVQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGVycik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgaWYgKHNlY3Rpb24gIT0gU0VDVElPTl9VTktOT1dOKSB7CisgICAgICAgIFBMT0dEKCJJZ25vcmluZyB1bnJlY29nbml6ZWQgdGFnIDwlcz4iLCBuYW1lKTsKKyAgICB9CisgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oU0VDVElPTl9VTktOT1dOKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7Cit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAvLyBYTUxQYXJzZXIgaGFuZGxlcyB0YWcgbWF0Y2hpbmcsIHNvIHdlIHJlYWxseSBqdXN0IG5lZWQgdG8gaGFuZGxlIHRoZSBzZWN0aW9uIHN0YXRlIGhlcmUKKyAgICBTZWN0aW9uIHNlY3Rpb24gPSBtU3RhdGUtPnNlY3Rpb24oKTsKKyAgICBzd2l0Y2ggKHNlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEluY2x1ZGVkLCBNZWRpYUNvZGVjcworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJJbmNsdWRlIikpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IERvbWFpbiwgVmFyaWFudCwgU2V0dGluZwogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgorICAgICAgICBjYXNlIFNFQ1RJT05fVU5LTk9XTjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdFNlY3Rpb24oKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKICAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBhbHNvIGJlIGFueSBvZjogQWxpYXMsIExpbWl0LCBGZWF0dXJlCiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFID8KLSAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0Q29kZWNPclR5cGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVI6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEFsaWFzLCBMaW1pdCwgUXVpcmssIFZhcmlhbnQKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0Q29kZWNPclR5cGUoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRWYXJpYW50cygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIFNFQ1RJT05fSU5DTFVERToKKyAgICAgICAgY2FzZSBTRUNUSU9OX1ZBUklBTlQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpICYmIChtU2VjdGlvblN0YWNrLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVNlY3Rpb25TdGFjay5iYWNrKCk7Ci0gICAgICAgICAgICAgICAgbVNlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBhbHNvIGJlIGFueSBvZjogQWxpYXMsIExpbWl0LCBRdWlyaworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0VmFyaWFudHMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDMwLDI0MyArODI0LDMwMiBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotCiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciAqdmFsdWUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRTZXR0aW5nKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqcHJlZml4KSB7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3ZhbHVlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3VwZGF0ZSA9IG51bGxwdHI7CisgICAgYm9vbCBpc0Jvb2xlYW4gPSBmYWxzZTsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiU2V0dGluZzogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpIHx8IHN0ckVxKGF0dHJzW2ldLCAiZW5hYmxlZCIpKSB7CisgICAgICAgICAgICBpZiAoYV92YWx1ZSkgeworICAgICAgICAgICAgICAgIFBMT0dEKCJTZXR0aW5nOiByZWR1bmRhbnQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzQm9vbGVhbiA9IHN0ckVxKGF0dHJzW2ldLCAiZW5hYmxlZCIpOworICAgICAgICAgICAgYV92YWx1ZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgeworICAgICAgICAgICAgYV91cGRhdGUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIlNldHRpbmc6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCB2YWx1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIgfHwgYV92YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJTZXR0aW5nIHdpdGggbm8gJ25hbWUnIG9yICd2YWx1ZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byAiMCIgb3IgIjEiLgotICAgIGlmIChzdHJIYXNQcmVmaXgobmFtZSwgInN1cHBvcnRzLSIpKSB7Ci0gICAgICAgIHZhbHVlID0gcGFyc2VCb29sZWFuKHZhbHVlKSA/ICIxIiA6ICIwIjsKKyAgICBpZiAoc3RySGFzUHJlZml4KGFfbmFtZSwgInN1cHBvcnRzLSIpIHx8IGlzQm9vbGVhbikgeworICAgICAgICBhX3ZhbHVlID0gcGFyc2VCb29sZWFuKGFfdmFsdWUpID8gIjEiIDogIjAiOwogICAgIH0KIAotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIGF1dG8gYXR0cmlidXRlID0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZmluZChuYW1lKTsKKyAgICBib29sIHVwZGF0ZSA9IChhX3VwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4oYV91cGRhdGUpOworICAgIFJlc3VsdCByZXMgPSBtU3RhdGUtPmRhdGEoKS5hZGRHbG9iYWwoc3RkOjpzdHJpbmcocHJlZml4ID8gOiAiIikgKyBhX25hbWUsIGFfdmFsdWUsIHVwZGF0ZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBQTE9HRCgiU2V0dGluZzogJXMiLCByZXMuZXJyb3IoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlJlc3VsdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6RGF0YTo6YWRkR2xvYmFsKAorICAgICAgICBzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlLCBib29sIHVwZGF0aW5nKSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBtU2VydmljZUF0dHJpYnV0ZU1hcC5maW5kKGtleSk7CiAgICAgaWYgKGF0dHJpYnV0ZSA9PSBtU2VydmljZUF0dHJpYnV0ZU1hcC5lbmQoKSkgeyAvLyBOZXcgYXR0cmlidXRlIG5hbWUKLSAgICAgICAgaWYgKG1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBpZiAodXBkYXRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiB7IE5BTUVfTk9UX0ZPVU5ELCAiY2Fubm90IHVwZGF0ZSBub24tZXhpc3Rpbmcgc2V0dGluZyIgfTsKICAgICAgICAgfQotICAgICAgICBtU2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7CisgICAgICAgIG1TZXJ2aWNlQXR0cmlidXRlTWFwLmluc2VydChBdHRyaWJ1dGUoa2V5LCB2YWx1ZSkpOwogICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCi0gICAgICAgIGlmICghbVVwZGF0ZSkgewotICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogYWRkaW5nIGV4aXN0aW5nIHNldHRpbmciKTsKLSAgICAgICAgfQogICAgICAgICBhdHRyaWJ1dGUtPnNlY29uZCA9IHZhbHVlOworICAgICAgICBpZiAoIXVwZGF0aW5nKSB7CisgICAgICAgICAgICByZXR1cm4geyBBTFJFQURZX0VYSVNUUywgInVwZGF0aW5nIGV4aXN0aW5nIHNldHRpbmciIH07CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoCi0gICAgICAgIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciAqdXBkYXRlID0gbnVsbHB0cjsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmVudGVyTWVkaWFDb2RlYygKKyAgICAgICAgY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdHlwZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV91cGRhdGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfcmFuayA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV9kb21haW4gPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdmFyaWFudCA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV9lbmFibGVkID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHlwZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiTWVkaWFDb2RlYzogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ0eXBlIikpIHsKKyAgICAgICAgICAgIGFfdHlwZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgeworICAgICAgICAgICAgYV91cGRhdGUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuayIpKSB7CisgICAgICAgICAgICBhX3JhbmsgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAiZG9tYWluIikpIHsKKyAgICAgICAgICAgIGFfZG9tYWluID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhcmlhbnQiKSkgeworICAgICAgICAgICAgYV92YXJpYW50ID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImVuYWJsZWQiKSkgeworICAgICAgICAgICAgYV9lbmFibGVkID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJNZWRpYUNvZGVjOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAotICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBub3QgZm91bmQiKTsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIk1lZGlhQ29kZWMgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7Ci0gICAgbUN1cnJlbnRDb2RlYyA9IG1Db2RlY01hcC5maW5kKG5hbWUpOwotICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgeyAvLyBOZXcgY29kZWMgbmFtZQotICAgICAgICBpZiAobVVwZGF0ZSkgewotICAgICAgICAgICAgQUxPR1coImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogY2Fubm90IHVwZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIGNvZGVjIFwiJXNcIi4iLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgYm9vbCB1cGRhdGUgPSAoYV91cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKGFfdXBkYXRlKTsKKyAgICBpZiAoYV9kb21haW4gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBkaXNhYmxlIGNvZGVjcyB3aXRoIGRvbWFpbiBieSBkZWZhdWx0ICh1bmxlc3MgdXBkYXRpbmcpCisgICAgICAgIGlmICghYV9lbmFibGVkICYmICF1cGRhdGUpIHsKKyAgICAgICAgICAgIGFfZW5hYmxlZCA9ICJmYWxzZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbVN0YXRlLT5lbnRlck1lZGlhQ29kZWMoZW5jb2RlciwgYV9uYW1lLCBhX3R5cGUsIHVwZGF0ZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBsb2dBbnlFcnJvcnMocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gdXBkYXRlTWVkaWFDb2RlYygKKyAgICAgICAgICAgIGFfcmFuaywgcGFyc2VDb21tYVNlcGFyYXRlZFN0cmluZ1NldChhX2RvbWFpbiksCisgICAgICAgICAgICBwYXJzZUNvbW1hU2VwYXJhdGVkU3RyaW5nU2V0KGFfdmFyaWFudCksIGFfZW5hYmxlZCk7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6ZW50ZXJNZWRpYUNvZGVjKAorICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgdXBkYXRpbmcpIHsKKyAgICAvLyBzdG9yZSBuYW1lIGV2ZW4gaW4gY2FzZSBvZiBhbiBlcnJvcgorICAgIENvZGVjTWFwOjppdGVyYXRvciBjb2RlY0l0ID0gbURhdGEtPm1Db2RlY01hcC5maW5kKG5hbWUpOworICAgIFR5cGVNYXA6Oml0ZXJhdG9yIHR5cGVJdDsKKyAgICBpZiAoY29kZWNJdCA9PSBtRGF0YS0+bUNvZGVjTWFwLmVuZCgpKSB7IC8vIE5ldyBjb2RlYyBuYW1lCisgICAgICAgIGlmICh1cGRhdGluZykgeworICAgICAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIG5vbi1leGlzdGluZyBjb2RlYyIgfTsKICAgICAgICAgfQogICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY29kZWMgaW4gbUNvZGVjTWFwCi0gICAgICAgIG1DdXJyZW50Q29kZWMgPSBtQ29kZWNNYXAuaW5zZXJ0KAotICAgICAgICAgICAgICAgIENvZGVjKG5hbWUsIENvZGVjUHJvcGVydGllcygpKSkuZmlyc3Q7CisgICAgICAgIGNvZGVjSXQgPSBtRGF0YS0+bUNvZGVjTWFwLmluc2VydChDb2RlYyhuYW1lLCBDb2RlY1Byb3BlcnRpZXMoKSkpLmZpcnN0OwogICAgICAgICBpZiAodHlwZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgICAgIFR5cGUodHlwZSwgQXR0cmlidXRlTWFwKCkpKS5maXJzdDsKKyAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmluc2VydChUeXBlKHR5cGUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmVuZCgpOwogICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5pc0VuY29kZXIgPSBlbmNvZGVyOwotICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQub3JkZXIgPSBtQ29kZWNDb3VudGVyKys7CisgICAgICAgIGNvZGVjSXQtPnNlY29uZC5pc0VuY29kZXIgPSBlbmNvZGVyOworICAgICAgICBjb2RlY0l0LT5zZWNvbmQub3JkZXIgPSBtRGF0YS0+bUNvZGVjTWFwLnNpemUoKTsKICAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBjb2RlYyBuYW1lCi0gICAgICAgIGlmICghbVVwZGF0ZSkgewotICAgICAgICAgICAgQUxPR1coImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHJ5aW5nIHRvIGFkZCAiCi0gICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgY29kZWMgXCIlc1wiIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgIGlmICghdXBkYXRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiB7IEFMUkVBRFlfRVhJU1RTLCAiTWVkaWFDb2RlYzogY2Fubm90IGFkZCBleGlzdGluZyBjb2RlYyIgfTsKICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5maW5kKHR5cGUpOwotICAgICAgICAgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IGNhbm5vdCB1cGRhdGUgIgotICAgICAgICAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgdHlwZSBcIiVzXCIgZm9yIGNvZGVjIFwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgdHlwZUl0ID0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZmluZCh0eXBlKTsKKyAgICAgICAgICAgIGlmICh0eXBlSXQgPT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgIk1lZGlhQ29kZWM6IGNhbm5vdCB1cGRhdGUgbm9uLWV4aXN0aW5nIHR5cGUgZm9yIGNvZGVjIiB9OwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgaGFwcGVuIG9ubHkgd2hlbiB0aGUgY29kZWMgaGFzIGF0IG1vc3Qgb25lIHR5cGUuCi0gICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5iZWdpbigpOwotICAgICAgICAgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IGNhbm5vdCB1cGRhdGUgIgotICAgICAgICAgICAgICAgICAgICAgICJjb2RlYyBcIiVzXCIgd2l0aG91dCB0eXBlIHNwZWNpZmllZCIsIG5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5iZWdpbigpOworICAgICAgICAgICAgaWYgKHR5cGVJdCA9PSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5lbmQoKQorICAgICAgICAgICAgICAgICAgICB8fCBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiB7IEJBRF9WQUxVRSwgIk1lZGlhQ29kZWM6IGNhbm5vdCB1cGRhdGUgY29kZWMgd2l0aG91dCB0eXBlIHNwZWNpZmllZCIgfTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIG1DdXJyZW50LmVtcGxhY2VfYmFjayhDb2RlY0FuZFR5cGV7bmFtZSwgY29kZWNJdCwgdHlwZUl0LCB1cGRhdGluZ30pOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6dXBkYXRlTWVkaWFDb2RlYygKKyAgICAgICAgY29uc3QgY2hhciAqcmFuaywgY29uc3QgU3RyaW5nU2V0ICZkb21haW5zLCBjb25zdCBTdHJpbmdTZXQgJnZhcmlhbnRzLAorICAgICAgICBjb25zdCBjaGFyICplbmFibGVkKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pbkNvZGVjKCkpOworICAgIENvZGVjUHJvcGVydGllcyAmY29kZWMgPSBtU3RhdGUtPmNvZGVjKCk7CisKKyAgICBpZiAocmFuayAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEX0lGKCFjb2RlYy5yYW5rLmVtcHR5KCkgJiYgY29kZWMucmFuayAhPSByYW5rLAorICAgICAgICAgICAgICAgICJjb2RlYyAnJXMnIHJhbmsgY2hhbmdlZCBmcm9tICclcycgdG8gJyVzJyIsCisgICAgICAgICAgICAgICAgbVN0YXRlLT5jb2RlY05hbWUoKS5jX3N0cigpLCBjb2RlYy5yYW5rLmNfc3RyKCksIHJhbmspOworICAgICAgICBjb2RlYy5yYW5rID0gcmFuazsKICAgICB9CiAKLSAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKyAgICBjb2RlYy52YXJpYW50U2V0ID0gdmFyaWFudHM7CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZkb21haW4gOiBkb21haW5zKSB7CisgICAgICAgIGlmIChkb21haW4uc2l6ZSgpICYmIGRvbWFpbi5hdCgwKSA9PSAnIScpIHsKKyAgICAgICAgICAgIGNvZGVjLmRvbWFpblNldC5lcmFzZShkb21haW4uc3Vic3RyKDEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjLmRvbWFpblNldC5lbXBsYWNlKGRvbWFpbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChwYXJzZUJvb2xlYW4oZW5hYmxlZCkpIHsKKyAgICAgICAgICAgIGNvZGVjLnF1aXJrU2V0LmVyYXNlKCJhdHRyaWJ1dGU6OmRpc2FibGVkIik7CisgICAgICAgICAgICBBTE9HRCgiZW5hYmxpbmcgJXMiLCBtU3RhdGUtPmNvZGVjTmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZWMucXVpcmtTZXQuZW1wbGFjZSgiYXR0cmlidXRlOjpkaXNhYmxlZCIpOworICAgICAgICAgICAgQUxPR0QoImRpc2FibGluZyAlcyIsIG1TdGF0ZS0+Y29kZWNOYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCkgeworICAgIENIRUNLKG1TdGF0ZS0+aW5Db2RlYygpKTsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlF1aXJrOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJRdWlyazogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKLSAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBub3QgZm91bmQiKTsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIlF1aXJrIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5xdWlya1NldC5lbXBsYWNlKG5hbWUpOworICAgIHN0ZDo6c3RyaW5nIGtleSA9IHN0ZDo6c3RyaW5nKHByZWZpeCA/IDogIiIpICsgYV9uYW1lOworICAgIG1TdGF0ZS0+Y29kZWMoKS5xdWlya1NldC5lbXBsYWNlKGtleSk7CisgICAgQUxPR1YoImFkZGluZyAlcyB0byAlcyIsIGtleS5jX3N0cigpLCBtU3RhdGUtPmNvZGVjTmFtZSgpLmNfc3RyKCkpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2RlcikgewotICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmVudGVyVHlwZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluQ29kZWMoKSk7CiAKLSAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV91cGRhdGUgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlR5cGU6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICAgICAgYV91cGRhdGUgPSBhdHRyc1srK2ldOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgUExPR0QoIlR5cGU6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKICAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgIGlmIChhX25hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiVHlwZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKLSAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5maW5kKG5hbWUpOwotICAgIGlmICghbVVwZGF0ZSkgewotICAgICAgICBpZiAobUN1cnJlbnRUeXBlICE9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB0cnlpbmcgdG8gdXBkYXRlICIKLSAgICAgICAgICAgICAgICAgICJleGlzdGluZyB0eXBlIFwiJXNcIiIsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGJvb2wgdXBkYXRlID0gKGFfdXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbihhX3VwZGF0ZSk7CisgICAgcmV0dXJuIG1TdGF0ZS0+ZW50ZXJUeXBlKGFfbmFtZSwgdXBkYXRlKTsKK30KKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlJlc3VsdAorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjplbnRlclR5cGUoY29uc3QgY2hhciAqbmFtZSwgYm9vbCB1cGRhdGUpIHsKKyAgICB1cGRhdGUgPSB1cGRhdGUgfHwgdXBkYXRpbmcoKTsgLy8gaGFuZGxlIHBhcmVudAorCisgICAgQ29kZWNNYXA6Oml0ZXJhdG9yIGNvZGVjSXQgPSBtQ3VycmVudC5iYWNrKCkubUNvZGVjOworICAgIFR5cGVNYXA6Oml0ZXJhdG9yIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKCF1cGRhdGUpIHsKKyAgICAgICAgaWYgKHR5cGVJdCAhPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHsgQUxSRUFEWV9FWElTVFMsICJ0cnlpbmcgdG8gdXBkYXRlIGV4aXN0aW5nIHR5cGUgJyIgKyBzdGQ6OnN0cmluZyhuYW1lKSArICInIiB9OwogICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKLSAgICAgICAgICAgICAgICBUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7Ci0gICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKLSAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgdHlwZUl0ID0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuaW5zZXJ0KFR5cGUobmFtZSwgQXR0cmlidXRlTWFwKCkpKS5maXJzdDsKKyAgICB9IGVsc2UgaWYgKHR5cGVJdCA9PSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgImFkZFR5cGU6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIiB9OwogICAgIH0KKyAgICBtQ3VycmVudC5wdXNoX2JhY2soeyBjb2RlY05hbWUoKSwgY29kZWNJdCwgdHlwZUl0LCB1cGRhdGUgfSk7CisgICAgQ0hFQ0soaW5UeXBlKCkpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluVHlwZSgpKTsKICAgICBjb25zdCBjaGFyKiBhX25hbWUgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIqIGFfZGVmYXVsdCA9IG51bGxwdHI7CiAgICAgY29uc3QgY2hhciogYV9pbiA9IG51bGxwdHI7CkBAIC02NzksNjkgKzExMzIsMzkgQEAKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX25hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogZGVmYXVsdCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfZGVmYXVsdCA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaW4iKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX2luID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtYXgiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWF4IGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9tYXggPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX21pbiA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2UiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX3JhbmdlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2VzIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInNjYWxlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHNjYWxlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9zY2FsZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHVucmVjb2duaXplZCBsaW1pdDogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIkxpbWl0OiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgeworICAgICAgICAgICAgYV9kZWZhdWx0ID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImluIikpIHsKKyAgICAgICAgICAgIGFfaW4gPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAibWF4IikpIHsKKyAgICAgICAgICAgIGFfbWF4ID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7CisgICAgICAgICAgICBhX21pbiA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZSIpKSB7CisgICAgICAgICAgICBhX3JhbmdlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlcyIpKSB7CisgICAgICAgICAgICBhX3JhbmdlcyA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJzY2FsZSIpKSB7CisgICAgICAgICAgICBhX3NjYWxlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIkxpbWl0OiBpZ25vcmluZyB1bnJlY29nbml6ZWQgbGltaXQ6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKICAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICBQTE9HRCgiTGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC03NDksOCArMTE3Miw1MCBAQAogICAgIC8vIG1lYXN1cmVkLWZyYW1lLXJhdGUsIG1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kOiByYW5nZQogICAgIC8vIHF1YWxpdHk6IHJhbmdlICsgZGVmYXVsdCArIFtzY2FsZV0KICAgICAvLyBjb21wbGV4aXR5OiByYW5nZSArIGRlZmF1bHQKLSAgICBzdGQ6OnN0cmluZyByYW5nZTsKLSAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikgfHwKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBhX25hbWUsIHZhbHVlOworCisgICAgLy8gZG9uJ3QgYWxsb3cgc3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIG9mIHZhbHVlLCByYW5nZSBvciBtaW4vbWF4CisgICAgaWYgKChhX3ZhbHVlICE9IG51bGxwdHIpICsgKGFfcmFuZ2UgIT0gbnVsbHB0cikgKyAoYV9yYW5nZXMgIT0gbnVsbHB0cikKKyAgICAgICAgICAgICsgKGFfbWluICE9IG51bGxwdHIgfHwgYV9tYXggIT0gbnVsbHB0cikgPiAxKSB7CisgICAgICAgIFBMT0dEKCJMaW1pdCAnJXMnIGhhcyBtdWx0aXBsZSAnbWluJy8nbWF4JywgJ3JhbmdlJywgJ3Jhbmdlcycgb3IgJ3ZhbHVlJyBhdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICAgICBhX25hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIE1pbi9tYXggbGltaXRzIChvbmx5IGNvbnRhaW5pbmcgbWluIG9yIG1heCBhdHRyaWJ1dGUpCisgICAgLy8KKyAgICAvLyBDdXJyZW50ICJtYXgiIGxpbWl0cyBhcmUgImNoYW5uZWwtY291bnQiLCAiY29uY3VycmVudC1pbnN0YW5jZXMiLgorICAgIC8vIFRoZXJlIGFyZSBubyBjdXJyZW50ICJtaW4iIGxpbWl0cworICAgIC8vCisgICAgLy8gUmFuZ2UgbGltaXRzLiAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorICAgIC8vIDEpIG1pbi1tYXgKKyAgICAvLyAyKSB2YWx1ZS12YWx1ZQorICAgIC8vIDMpIHJhbmdlCisgICAgLy8KKyAgICAvLyBDdXJyZW50IHJhbmdlIGxpbWl0cyBhcmUgImFzcGVjdC1yYXRpbyIsICJiaXRyYXRlIiwgImJsb2NrLWNvdW50IiwgImJsb2Nrcy1wZXItc2Vjb25kIiwKKyAgICAvLyAiY29tcGxleGl0eSIsICJmcmFtZS1yYXRlIiwgInF1YWxpdHkiLCAic2l6ZSIsICJtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZCIsCisgICAgLy8gInBlcmZvcm1hbmNlLXBvaW50LSoiLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0qIgorICAgIC8vCisgICAgLy8gT3RoZXIgbGltaXRzIChjb250YWluaW5nIG9ubHkgdmFsdWUgb3IgcmFuZ2VzKQorICAgIC8vCisgICAgLy8gQ3VycmVudCByYW5nZXMgbGltaXQgaXMgInNhbXBsZS1yYXRlIgorICAgIGlmICgoYV9taW4gIT0gbnVsbHB0cikgXiAoYV9tYXggIT0gbnVsbHB0cikpIHsKKyAgICAgICAgLy8gbWluL21heCBsaW1pdAorICAgICAgICBpZiAoYV9tYXggIT0gbnVsbHB0cikgeworICAgICAgICAgICAga2V5ID0gIm1heC0iICsga2V5OworICAgICAgICAgICAgdmFsdWUgPSBhX21heDsKKyAgICAgICAgfSBlbHNlIGlmIChhX21pbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBrZXkgPSAibWluLSIgKyBrZXk7CisgICAgICAgICAgICB2YWx1ZSA9IGFfbWluOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhX21pbiAhPSBudWxscHRyICYmIGFfbWF4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gbWluLW1heAorICAgICAgICBrZXkgKz0gIi1yYW5nZSI7CisgICAgICAgIHZhbHVlID0gYV9taW4gKyBzdGQ6OnN0cmluZygiLSIpICsgYV9tYXg7CisgICAgfSBlbHNlIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gdmFsdWUtdmFsdWUgb3IgdmFsdWUKKyAgICAgICAgdmFsdWUgPSBhX3ZhbHVlOworICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJpdHJhdGUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiYmxvY2stY291bnQiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiYmxvY2tzLXBlci1zZWNvbmQiKSB8fApAQCAtNzU5LDIyMiArMTIyNCwyMDEgQEAKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAic2l6ZSIpIHx8CiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZCIpIHx8CisgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAicGVyZm9ybWFuY2UtcG9pbnQtIikgfHwKICAgICAgICAgICAgIHN0ckhhc1ByZWZpeChhX25hbWUsICJtZWFzdXJlZC1mcmFtZS1yYXRlLSIpKSB7Ci0gICAgICAgIC8vICJyYW5nZSIgaXMgc3BlY2lmaWVkIGluIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0gICAgICAgIC8vIDEpIG1pbi1tYXgKLSAgICAgICAgLy8gMikgdmFsdWUtdmFsdWUKLSAgICAgICAgLy8gMykgcmFuZ2UKLSAgICAgICAgaWYgKGFfbWluICE9IG51bGxwdHIgJiYgYV9tYXggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gbWluLW1heAotICAgICAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0ciB8fCBhX3ZhbHVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgJ21pbicgYW5kICdtYXgnIGFzIHdlbGwgYXMgJ3JhbmdlJyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYW5nZSA9IGFfbWluOwotICAgICAgICAgICAgcmFuZ2UgKz0gJy0nOwotICAgICAgICAgICAgcmFuZ2UgKz0gYV9tYXg7Ci0gICAgICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0ciB8fCBhX21heCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIHZhbHVlLXZhbHVlCi0gICAgICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzIGJvdGggJ3JhbmdlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYW5nZSA9IGFfdmFsdWU7Ci0gICAgICAgICAgICByYW5nZSArPSAnLSc7Ci0gICAgICAgICAgICByYW5nZSArPSBhX3ZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKGFfcmFuZ2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJhbmdlCi0gICAgICAgICAgICByYW5nZSA9IGFfcmFuZ2U7CisgICAgICAgICAgICBrZXkgKz0gIi1yYW5nZSI7CisgICAgICAgICAgICB2YWx1ZSArPSBzdGQ6OnN0cmluZygiLSIpICsgYV92YWx1ZTsKICAgICAgICAgfQotCi0gICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQuCi0gICAgICAgIGlmIChzdHJFcShhX25hbWUsICJhc3BlY3QtcmF0aW8iKSkgewotICAgICAgICAgICAgLy8gImFzcGVjdC1yYXRpbyIgbXVzdCBoYXZlICJpbiIuCi0gICAgICAgICAgICBpZiAoYV9pbiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJpbiIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vICJpbiIgbXVzdCBiZSBlaXRoZXIgInBpeGVscyIgb3IgImJsb2NrcyIuCi0gICAgICAgICAgICBpZiAoIXN0ckVxKGFfaW4sICJwaXhlbHMiKSAmJiAhc3RyRXEoYV9pbiwgImJsb2NrcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIoYV9uYW1lLCAiaW4iLCBhX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5hbWUgd2lsbCBiZSAicGl4ZWwtYXNwZWN0LXJhdGlvLXJhbmdlIiBvcgotICAgICAgICAgICAgLy8gImJsb2NrLWFzcGVjdC1yYXRpby1yYW5nZSIuCi0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoYV9pbikuc3Vic3RyKDAsIHN0cmxlbihhX2luKSAtIDEpICsKLSAgICAgICAgICAgICAgICAgICAgIi1hc3BlY3QtcmF0aW8tcmFuZ2UiXSA9IHJhbmdlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZSAoYXBhcnQgZnJvbSAiYXNwZWN0LXJhdGlvIiksIHNpbXBseSBhcHBlbmQKLSAgICAgICAgICAgIC8vICItcmFuZ2UiIHRvIHRoZSBuYW1lIGZvciB0aGUgcmFuZ2UtdHlwZSBwcm9wZXJ0eS4KLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLXJhbmdlIl0gPSByYW5nZTsKLQotICAgICAgICAgICAgLy8gT25seSAicXVhbGl0eSIgbWF5IGhhdmUgInNjYWxlIi4KLSAgICAgICAgICAgIGlmICghc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpICYmIGFfc2NhbGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAic2NhbGUiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgInF1YWxpdHktc2NhbGUiIGlzICJsaW5lYXIiLgotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kWyJxdWFsaXR5LXNjYWxlIl0gPSBhX3NjYWxlID09IG51bGxwdHIgPwotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmVhciIgOiBhX3NjYWxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyAicXVhbGl0eSIgYW5kICJjb21wbGV4aXR5IiBtdXN0IGhhdmUgImRlZmF1bHQiLgotICAgICAgICAgICAgLy8gT3RoZXIgbGltaXRzIG11c3Qgbm90IGhhdmUgImRlZmF1bHQiLgotICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSB8fCBzdHJFcShhX25hbWUsICJjb21wbGV4aXR5IikpIHsKLSAgICAgICAgICAgICAgICBpZiAoYV9kZWZhdWx0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJkZWZhdWx0IiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInF1YWxpdHktZGVmYXVsdCIgb3IgImNvbXBsZXhpdHktZGVmYXVsdCIuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoYV9uYW1lKSArICItZGVmYXVsdCJdID0gYV9kZWZhdWx0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChhX2RlZmF1bHQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhX3JhbmdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcmFuZ2UKKyAgICAgICAga2V5ICs9ICItcmFuZ2UiOworICAgICAgICB2YWx1ZSA9IGFfcmFuZ2U7CisgICAgfSBlbHNlIGlmIChhX3JhbmdlcyAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIHJhbmdlcworICAgICAgICBrZXkgKz0gIi1yYW5nZXMiOworICAgICAgICB2YWx1ZSA9IGFfcmFuZ2VzOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhX2RlZmF1bHQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJkZWZhdWx0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFfaW4gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJpbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhX3NjYWxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFfbWluICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWluIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYV9tYXggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gIm1heCIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJjaGFubmVsLWNvdW50IiBvcgotICAgICAgICAgICAgLy8gImNvbmN1cnJlbnQtaW5zdGFuY2VzIi4KLSAgICAgICAgICAgIC8vICJtaW4iIGlzIG5vdCBuY2Vzc2FyeS4KLSAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJjaGFubmVsLWNvdW50IikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiY29uY3VycmVudC1pbnN0YW5jZXMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJtYXgtIikgKyBhX25hbWVdID0gYV9tYXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWF4IiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgImNoYW5uZWwtY291bnQiKSB8fAotICAgICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAibWF4Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYV9yYW5nZXMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gInJhbmdlcyIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJzYW1wbGUtcmF0ZSIuCi0gICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAic2FtcGxlLXJhdGUiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kWyJzYW1wbGUtcmF0ZS1yYW5nZXMiXSA9IGFfcmFuZ2VzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlcyIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJzYW1wbGUtcmF0ZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInJhbmdlcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFfdmFsdWUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gInZhbHVlIiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgImFsaWdubWVudCIgb3IKLSAgICAgICAgICAgIC8vICJibG9jay1zaXplIi4KLSAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJhbGlnbm1lbnQiKSB8fCBzdHJFcShhX25hbWUsICJibG9jay1zaXplIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFthX25hbWVdID0gYV92YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJ2YWx1ZSIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJhbGlnbm1lbnQiKSB8fCBzdHJFcShhX25hbWUsICJibG9jay1zaXplIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAidmFsdWUiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQorICAgICAgICBQTE9HRCgiTGltaXQgJyVzJyB3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIsIGFfbmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgLy8gaGFuZGxlICdpbicgYXR0cmlidXRlIC0gdGhpcyBjaGFuZ2VzIHRoZSBrZXkKKyAgICBpZiAoYV9pbiAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIEN1cnJlbnRseSAiYXNwZWN0LXJhdGlvIiB1c2VzIGluIGF0dHJpYnV0ZQorICAgICAgICBjb25zdCBzaXplX3QgYV9pbl9sZW4gPSBzdHJsZW4oYV9pbik7CisgICAgICAgIGtleSA9IHN0ZDo6c3RyaW5nKGFfaW4sIGFfaW5fbGVuIC0gYV9pblthX2luX2xlbl0gPT0gJ3MnKSArICctJyArIGtleTsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgJ3NjYWxlJyBhdHRyaWJ1dGUgLSB0aGlzIGFkZHMgYSBuZXcgZGV0YWlsCisgICAgaWYgKGFfc2NhbGUgIT0gbnVsbHB0cikgeworICAgICAgICBtU3RhdGUtPmFkZERldGFpbChhX25hbWUgKyBzdGQ6OnN0cmluZygiLXNjYWxlIiksIGFfc2NhbGUpOworICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpKSB7CisgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJxdWFsaXR5LXNjYWxlIiBpcyAibGluZWFyIiBldmVuIGlmIHVuc3BlY2lmaWVkLgorICAgICAgICBtU3RhdGUtPmFkZERldGFpbChhX25hbWUgKyBzdGQ6OnN0cmluZygiLXNjYWxlIiksICJsaW5lYXIiKTsKKyAgICB9CisKKyAgICAvLyBoYW5kbGUgJ2RlZmF1bHQnIGF0dHJpYnV0ZSAtIHRoaXMgYWRkcyBhIG5ldyBkZXRhaWwKKyAgICBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVN0YXRlLT5hZGREZXRhaWwoYV9uYW1lICsgc3RkOjpzdHJpbmcoIi1kZWZhdWx0IiksIGFfZGVmYXVsdCk7CisgICAgfQorCisgICAgbVN0YXRlLT5hZGREZXRhaWwoa2V5LCB2YWx1ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjphZGREZXRhaWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZrZXksIGNvbnN0IHN0ZDo6c3RyaW5nICZ2YWx1ZSkgeworICAgIENIRUNLKGluVHlwZSgpKTsKKyAgICBBTE9HSSgibGltaXQ6ICVzID0gJXMiLCBrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgY29uc3QgU3RyaW5nU2V0ICZ2YXJpYW50cyA9IG1WYXJpYW50c1N0YWNrLmJhY2soKTsKKyAgICBpZiAodmFyaWFudHMuZW1wdHkoKSkgeworICAgICAgICB0eXBlKClba2V5XSA9IHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJnZhcmlhbnQgOiB2YXJpYW50cykgeworICAgICAgICAgICAgdHlwZSgpW3ZhcmlhbnQgKyAiOjo6IiArIGtleV0gPSB2YWx1ZTsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpsaW1pdFZhcmlhbnRzKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIqIGFfbmFtZSA9IG51bGxwdHI7CiAKICAgICBzaXplX3QgaSA9IDA7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiVmFyaWFudDogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIlZhcmlhbnQ6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIgfHwgKmFfbmFtZSA9PSAnXDAnKSB7CisgICAgICAgIFBMT0dEKCJWYXJpYW50IHdpdGggbm8gb3IgZW1wdHkgJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFN0cmluZ1NldCB2YXJpYW50czsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZ2YXJpYW50IDogcGFyc2VDb21tYVNlcGFyYXRlZFN0cmluZ1NldChhX25hbWUpKSB7CisgICAgICAgIGlmIChtU3RhdGUtPnZhcmlhbnRzKCkuY291bnQodmFyaWFudCkpIHsKKyAgICAgICAgICAgIHZhcmlhbnRzLmVtcGxhY2UodmFyaWFudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiVmFyaWFudDogdmFyaWFudCAnJXMnIG5vdCBpbiBwYXJlbnQgdmFyaWFudHMiLCB2YXJpYW50LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU3RhdGUtPmVudGVyVmFyaWFudHModmFyaWFudHMpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluVHlwZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKICAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7CiAgICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3ZhbHVlID0gbnVsbHB0cjsKIAogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAib3B0aW9uYWwiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiBvcHRpb25hbCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wdGlvbmFsID0gcGFyc2VCb29sZWFuKGF0dHJzW2ldKSA/IDEgOiAwOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmVxdWlyZWQiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiByZXF1aXJlZCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcXVpcmVkID0gcGFyc2VCb29sZWFuKGF0dHJzW2ldKSA/IDEgOiAwOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiB2YWx1ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIkZlYXR1cmU6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAib3B0aW9uYWwiKSkgeworICAgICAgICAgICAgb3B0aW9uYWwgPSBwYXJzZUJvb2xlYW4oYXR0cnNbKytpXSkgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcGFyc2VCb29sZWFuKGF0dHJzWysraV0pID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJGZWF0dXJlOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KLSAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgIGlmIChhX25hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiRmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAoKG9wdGlvbmFsICE9IC0xKSB8fCAocmVxdWlyZWQgIT0gLTEpKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCkgewotICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgbmFtZSk7CisgICAgaWYgKGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAob3B0aW9uYWwgIT0gLTEgfHwgcmVxdWlyZWQgIT0gLTEpIHsKKyAgICAgICAgICAgIFBMT0dEKCJGZWF0dXJlICclcycgaGFzIGJvdGggdmFsdWUgYW5kIG9wdGlvbmFsL3JlcXVpcmVkIGF0dHJpYnV0ZXMiLCBhX25hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBpZiAoKG9wdGlvbmFsID09IDEpIHx8IChyZXF1aXJlZCA9PSAxKSkgewotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGNhbm5vdCBoYXZlIGV4dHJhICd2YWx1ZSciLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoImZlYXR1cmUtIikgKyBuYW1lXSA9Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsID09IDEgPyAiMCIgOiAiMSI7Ci0gICAgICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkICYmIG9wdGlvbmFsICE9IC0xKSB7CisgICAgICAgICAgICBQTE9HRCgiRmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBhX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICBhX3ZhbHVlID0gKHJlcXVpcmVkID09IDEgfHwgb3B0aW9uYWwgPT0gMCkgPyAiMSIgOiAiMCI7CiAgICAgfQotICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPSB2YWx1ZSA9PSBudWxscHRyID8KLSAgICAgICAgICAgICIwIiA6IHZhbHVlOworCisgICAgbVN0YXRlLT5hZGREZXRhaWwoc3RkOjpzdHJpbmcoImZlYXR1cmUtIikgKyBhX25hbWUsIGFfdmFsdWUgPyA6ICIwIik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRBbGlhcyhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluQ29kZWMoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJBbGlhczogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiQWxpYXM6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgLy8gRXZlcnkgZmVhdHVyZSBtdXN0IGhhdmUgYSBuYW1lLgorICAgIGlmIChhX25hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiQWxpYXMgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVN0YXRlLT5jb2RlYygpLmFsaWFzZXMuZW1wbGFjZV9iYWNrKGFfbmFtZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwJgotICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKIH0KIAogY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjTWFwJgotICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Q29kZWNNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db2RlY01hcDsKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb2RlY01hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldENvZGVjTWFwKCk7CiB9CiAKIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpSb2xlTWFwJgotICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Um9sZU1hcCgpIGNvbnN0IHsKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRSb2xlTWFwKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0Um9sZU1hcCgpOworfQorCitjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZU1hcCYKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpnZXRSb2xlTWFwKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtTG9jayk7CiAgICAgaWYgKG1Sb2xlTWFwLmVtcHR5KCkpIHsKICAgICAgICAgZ2VuZXJhdGVSb2xlTWFwKCk7CiAgICAgfQpAQCAtOTgyLDYgKzE0MjYsMTEgQEAKIH0KIAogY29uc3QgY2hhciogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldENvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldENvbW1vblByZWZpeCgpOworfQorCitjb25zdCBjaGFyKiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2V0Q29tbW9uUHJlZml4KCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtTG9jayk7CiAgICAgaWYgKG1Db21tb25QcmVmaXguZW1wdHkoKSkgewogICAgICAgICBnZW5lcmF0ZUNvbW1vblByZWZpeCgpOwogICAgIH0KQEAgLTk4OSwxNCArMTQzOCwxOCBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0UGFyc2luZ1N0YXR1cygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRQYXJzaW5nU3RhdHVzKCk7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdlbmVyYXRlUm9sZU1hcCgpIGNvbnN0IHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGNvZGVjIDogbUNvZGVjTWFwKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIGNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0Owordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2VuZXJhdGVSb2xlTWFwKCkgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byYgY29kZWMgOiBtRGF0YS5tQ29kZWNNYXApIHsKKyAgICAgICAgY29uc3QgYXV0byAmY29kZWNOYW1lID0gY29kZWMuZmlyc3Q7CisgICAgICAgIGlmIChjb2RlY05hbWUgPT0gIjxkdW1teT4iKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBib29sIGlzRW5jb2RlciA9IGNvZGVjLnNlY29uZC5pc0VuY29kZXI7CiAgICAgICAgIHNpemVfdCBvcmRlciA9IGNvZGVjLnNlY29uZC5vcmRlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmFuayA9IGNvZGVjLnNlY29uZC5yYW5rOwogICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gY29kZWMuc2Vjb25kLnR5cGVNYXA7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVNYXApIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gdHlwZS5maXJzdDsKQEAgLTEwNDAsMjUgKzE0OTMsMzUgQEAKIAogICAgICAgICAgICAgTm9kZUluZm8gbm9kZUluZm87CiAgICAgICAgICAgICBub2RlSW5mby5uYW1lID0gY29kZWNOYW1lOworICAgICAgICAgICAgLy8gTk9URTogbm8gYWxpYXNlcyBhcmUgZXhwb3NlZCBpbiByb2xlIGluZm8KKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBxdWlya3MgYXJlIGV4cG9zZWQgYXMgbm9kZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnJlc2VydmUodHlwZUF0dHJpYnV0ZU1hcC5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiB0eXBlQXR0cmlidXRlTWFwKSB7CiAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGV7YXR0cmlidXRlLmZpcnN0LCBhdHRyaWJ1dGUuc2Vjb25kfSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZxdWlyayA6IGNvZGVjLnNlY29uZC5xdWlya1NldCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJIYXNQcmVmaXgocXVpcmsuY19zdHIoKSwgImF0dHJpYnV0ZTo6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soQXR0cmlidXRle3F1aXJrLCAicHJlc2VudCJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJhbmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdCB7Ci0gICAgaWYgKG1Db2RlY01hcC5lbXB0eSgpKSB7Cit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICBpZiAobURhdGEubUNvZGVjTWFwLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBhdXRvIGkgPSBtQ29kZWNNYXAuY2JlZ2luKCk7CisgICAgYXV0byBpID0gbURhdGEubUNvZGVjTWFwLmNiZWdpbigpOwogICAgIGF1dG8gZmlyc3QgPSBpLT5maXJzdC5jYmVnaW4oKTsKICAgICBhdXRvIGxhc3QgPSBpLT5maXJzdC5jZW5kKCk7Ci0gICAgZm9yICgrK2k7IGkgIT0gbUNvZGVjTWFwLmNlbmQoKTsgKytpKSB7CisgICAgZm9yICgrK2k7IGkgIT0gbURhdGEubUNvZGVjTWFwLmNlbmQoKTsgKytpKSB7CiAgICAgICAgIGxhc3QgPSBzdGQ6Om1pc21hdGNoKAogICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCBpLT5maXJzdC5jYmVnaW4oKSwgaS0+Zmlyc3QuY2VuZCgpKS5maXJzdDsKICAgICB9CkBAIC0xMDY2LDQgKzE1MjksMyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvY3VycmVudC50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzhhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0CkBAIC0wLDAgKzEsMTU5IEBACisvLyBTaWduYXR1cmUgZm9ybWF0OiAyLjAKK3BhY2thZ2UgbWVkaWEuY29kZWNzIHsKKworICBwdWJsaWMgY2xhc3MgQWxpYXMgeworICAgIGN0b3IgcHVibGljIEFsaWFzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgRGVjb2RlcnMgeworICAgIGN0b3IgcHVibGljIERlY29kZXJzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuTWVkaWFDb2RlYz4gZ2V0TWVkaWFDb2RlYygpOworICB9CisKKyAgcHVibGljIGNsYXNzIEVuY29kZXJzIHsKKyAgICBjdG9yIHB1YmxpYyBFbmNvZGVycygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLk1lZGlhQ29kZWM+IGdldE1lZGlhQ29kZWMoKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBGZWF0dXJlIHsKKyAgICBjdG9yIHB1YmxpYyBGZWF0dXJlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE9wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWQoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgSW5jbHVkZSB7CisgICAgY3RvciBwdWJsaWMgSW5jbHVkZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIEluY2x1ZGVkIHsKKyAgICBjdG9yIHB1YmxpYyBJbmNsdWRlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkRlY29kZXJzPiBnZXREZWNvZGVyc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkVuY29kZXJzPiBnZXRFbmNvZGVyc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkluY2x1ZGU+IGdldEluY2x1ZGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5ncz4gZ2V0U2V0dGluZ3Nfb3B0aW9uYWwoKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBMaW1pdCB7CisgICAgY3RvciBwdWJsaWMgTGltaXQoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRJbigpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE1heCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE1pbigpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRSYW5nZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFJhbmdlcygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRJbihTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXgoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWluKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UmFuZ2UoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UmFuZ2VzKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFNjYWxlKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldF9kZWZhdWx0KFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgTWVkaWFDb2RlYyB7CisgICAgY3RvciBwdWJsaWMgTWVkaWFDb2RlYygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkFsaWFzPiBnZXRBbGlhc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlF1aXJrPiBnZXRBdHRyaWJ1dGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXREb21haW4oKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRFbmFibGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuRmVhdHVyZT4gZ2V0RmVhdHVyZV9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkxpbWl0PiBnZXRMaW1pdF9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5RdWlyaz4gZ2V0UXVpcmtfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRSYW5rKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlR5cGU+IGdldFR5cGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRVcGRhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRWYXJpYW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuVmFyaWFudD4gZ2V0VmFyaWFudF9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RW5hYmxlZChTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJhbmsoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VmFyaWFudChTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIE1lZGlhQ29kZWNzIHsKKyAgICBjdG9yIHB1YmxpYyBNZWRpYUNvZGVjcygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkRlY29kZXJzPiBnZXREZWNvZGVyc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkVuY29kZXJzPiBnZXRFbmNvZGVyc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkluY2x1ZGU+IGdldEluY2x1ZGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5ncz4gZ2V0U2V0dGluZ3Nfb3B0aW9uYWwoKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBRdWlyayB7CisgICAgY3RvciBwdWJsaWMgUXVpcmsoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIFNldHRpbmcgeworICAgIGN0b3IgcHVibGljIFNldHRpbmcoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRFbmFibGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBTZXR0aW5ncyB7CisgICAgY3RvciBwdWJsaWMgU2V0dGluZ3MoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5nPiBnZXREb21haW5fb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5nPiBnZXRTZXR0aW5nX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZz4gZ2V0VmFyaWFudF9vcHRpb25hbCgpOworICB9CisKKyAgcHVibGljIGNsYXNzIFR5cGUgeworICAgIGN0b3IgcHVibGljIFR5cGUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5BbGlhcz4gZ2V0QWxpYXMoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5GZWF0dXJlPiBnZXRGZWF0dXJlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuTGltaXQ+IGdldExpbWl0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFVwZGF0ZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIFZhcmlhbnQgeworICAgIGN0b3IgcHVibGljIFZhcmlhbnQoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5BbGlhcz4gZ2V0QWxpYXNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5RdWlyaz4gZ2V0QXR0cmlidXRlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuRmVhdHVyZT4gZ2V0RmVhdHVyZV9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkxpbWl0PiBnZXRMaW1pdF9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5RdWlyaz4gZ2V0UXVpcmtfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIFhtbFBhcnNlciB7CisgICAgY3RvciBwdWJsaWMgWG1sUGFyc2VyKCk7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgbWVkaWEuY29kZWNzLkluY2x1ZGVkIHJlYWRJbmNsdWRlZChqYXZhLmlvLklucHV0U3RyZWFtKSB0aHJvd3MgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBtZWRpYS5jb2RlY3MuTWVkaWFDb2RlY3MgcmVhZE1lZGlhQ29kZWNzKGphdmEuaW8uSW5wdXRTdHJlYW0pIHRocm93cyBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkVGV4dChvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIHNraXAob3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9sYXN0X2N1cnJlbnQudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvbGFzdF9jdXJyZW50LnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvbGFzdF9yZW1vdmVkLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2xhc3RfcmVtb3ZlZC50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvcmVtb3ZlZC50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL3JlbW92ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDIxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL3JlbW92ZWQudHh0CkBAIC0wLDAgKzEgQEAKKy8vIFNpZ25hdHVyZSBmb3JtYXQ6IDIuMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAppbmRleCBjYzY5ZTUyLi5iNjY2ZGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApAQCAtMTksMzQgKzE5LDMxIEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3Q7IC8vIGZyb20gZXhwYXQgbGlicmFyeQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHsKIHB1YmxpYzoKIAogICAgIC8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRTZWFyY2hEaXJzW10gPQotICAgICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvZXRjIiwgbnVsbHB0cn07Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0TWFpblhtbE5hbWUgPQotICAgICAgICAgICAgIm1lZGlhX2NvZGVjcy54bWwiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSA9Ci0gICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCI7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXREZWZhdWx0U2VhcmNoRGlycygpIHsKKyAgICAgICAgICAgIHJldHVybiB7ICIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvZXRjIiB9OworICAgIH0KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldERlZmF1bHRYbWxOYW1lcygpIHsKKyAgICAgICAgICAgIHJldHVybiB7ICJtZWRpYV9jb2RlY3MueG1sIiwgIm1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwiIH07CisgICAgfQogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoID0KICAgICAgICAgICAgICIvZGF0YS9taXNjL21lZGlhL21lZGlhX2NvZGVjc19wcm9maWxpbmdfcmVzdWx0cy54bWwiOwogCi0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycyA9IGRlZmF1bHRTZWFyY2hEaXJzLAotICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUgPSBkZWZhdWx0TWFpblhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUgPSBkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPSBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CiAgICAgfk1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CiAKICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEF0dHJpYnV0ZTsKQEAgLTU1LDcgKzUyLDcgQEAKICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgQXR0cmlidXRlTWFwPiBUeXBlOwogICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEF0dHJpYnV0ZU1hcD4gVHlwZU1hcDsKIAotICAgIHR5cGVkZWYgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFF1aXJrU2V0OworICAgIHR5cGVkZWYgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFN0cmluZ1NldDsKIAogICAgIC8qKgogICAgICAqIFByb3BlcnRpZXMgb2YgYSBjb2RlYyAobm9kZSkKQEAgLTYzLDggKzYwLDEyIEBACiAgICAgc3RydWN0IENvZGVjUHJvcGVydGllcyB7CiAgICAgICAgIGJvb2wgaXNFbmNvZGVyOyAgICAvLy88IFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2RlcgogICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCi0gICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgU3RyaW5nU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgU3RyaW5nU2V0IGRvbWFpblNldDsgLy8vPCBTZXQgb2YgZG9tYWlucyB0aGlzIGNvZGVjIGlzIGluCisgICAgICAgIFN0cmluZ1NldCB2YXJpYW50U2V0OyAvLy88IFNldCBvZiB2YXJpYW50cyB0aGlzIGNvZGVjIGlzIGVuYWJsZWQgb24KICAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGlhc2VzOyAvLy88IE5hbWUgYWxpYXNlcyBmb3IgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnN0cmluZyByYW5rOyAgLy8vPCBSYW5rIG9mIHRoaXMgY29kZWMuIFRoaXMgaXMgYSBudW1lcmljIHN0cmluZy4KICAgICB9OwogCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CkBAIC03Niw2ICs3Nyw3IEBACiAgICAgc3RydWN0IE5vZGVJbmZvIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0OworICAgICAgICAvLyBub3RlOiBhbGlhc2VzIGFyZSBub3QgZXhwb3NlZCBoZXJlIGFzIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSByb2xlIG1hcAogICAgIH07CiAKICAgICAvKioKQEAgLTExNiw2OSArMTE4LDMxIEBACiAKICAgICBzdGF0dXNfdCBnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0b3AgbGV2ZWwgWE1MIGZpbGVzIGZyb20gYSBncm91cCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sRmlsZXMgb3JkZXJlZCBsaXN0IG9mIFhNTCBmaWxlIG5hbWVzIChubyBwYXRocykKKyAgICAgKiBAcGFyYW0gc2VhcmNoRGlycyBvcmRlcmVkIGxpc3Qgb2YgcGF0aHMgdG8gY29uc2lkZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gcGFyc2luZyBzdGF0dXMKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ4bWxGaWxlcyA9IGdldERlZmF1bHRYbWxOYW1lcygpLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzID0gZ2V0RGVmYXVsdFNlYXJjaERpcnMoKSk7CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgdG9wIGxldmVsIFhNTCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggWE1MIGZpbGUgcGF0aAorICAgICAqCisgICAgICogQHJldHVybiBwYXJzaW5nIHN0YXR1cworICAgICAqLworICAgIHN0YXR1c190IHBhcnNlWG1sUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7CisKIHByaXZhdGU6Ci0gICAgZW51bSBTZWN0aW9uIHsKLSAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKLSAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSUywKLSAgICAgICAgU0VDVElPTl9FTkNPREVSLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9JTkNMVURFLAotICAgIH07Ci0KLSAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKLSAgICBzdGQ6OnN0cmluZyBtSHJlZkJhc2U7Ci0KLSAgICAvLyBTZXJ2aWNlIGF0dHJpYnV0ZXMKLSAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7Ci0KLSAgICAvLyBDb2RlYyBhdHRyaWJ1dGVzCi0gICAgc3RkOjpzdHJpbmcgbUN1cnJlbnROYW1lOwotICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQ29kZWNTZXQ7Ci0gICAgQ29kZWMgbUNvZGVjTGlzdFRlbXBbMjA0OF07Ci0gICAgQ29kZWNNYXAgbUNvZGVjTWFwOwotICAgIHNpemVfdCBtQ29kZWNDb3VudGVyOwotICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ3VycmVudENvZGVjOwotICAgIFR5cGVNYXA6Oml0ZXJhdG9yIG1DdXJyZW50VHlwZTsKLQotICAgIC8vIFJvbGUgbWFwCi0gICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOwotCi0gICAgLy8gQ29tcHV0ZWQgbG9uZ2VzdCBjb21tb24gcHJlZml4Ci0gICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtQ29tbW9uUHJlZml4OwotCi0gICAgYm9vbCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7Ci0KLSAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKLQotICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAotICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHIpOwotCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOwotICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7Ci0gICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKIAogICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7CiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXImIG9wZXJhdG9yPShjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlciYpID0gZGVsZXRlOwpAQCAtMTg3LDQgKzE1MSwzIEBACiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBNRURJQV9TVEFHRUZSSUdIVF9YTUxQQVJTRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjU2ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QKQEAgLTAsMCArMSwxMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRPRE86IGRlZmluZSBhIHRhcmdldE5hbWVzcGFjZS4gTm90ZSB0aGF0IGl0IHdpbGwgYnJlYWsgcmV0cm9jb21wYXRpYmlsaXR5IC0tPgorPHhzOnNjaGVtYSB2ZXJzaW9uPSIyLjAiCisgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWVkaWFDb2RlY3MiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkluY2x1ZGUiIHR5cGU9IkluY2x1ZGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2V0dGluZ3MiIHR5cGU9IlNldHRpbmdzIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVjb2RlcnMiIHR5cGU9IkRlY29kZXJzIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5jb2RlcnMiIHR5cGU9IkVuY29kZXJzIi8+CisgICAgICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5jbHVkZWQiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkluY2x1ZGUiIHR5cGU9IkluY2x1ZGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2V0dGluZ3MiIHR5cGU9IlNldHRpbmdzIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVjb2RlcnMiIHR5cGU9IkRlY29kZXJzIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5jb2RlcnMiIHR5cGU9IkVuY29kZXJzIi8+CisgICAgICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmVsZW1lbnQ+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRlY29kZXJzIj4KKyAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWVkaWFDb2RlYyIgdHlwZT0iTWVkaWFDb2RlYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbmNvZGVycyI+CisgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1lZGlhQ29kZWMiIHR5cGU9Ik1lZGlhQ29kZWMiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2V0dGluZ3MiPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2V0dGluZyIgdHlwZT0iU2V0dGluZyIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0iU2V0dGluZyIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRG9tYWluIiB0eXBlPSJTZXR0aW5nIi8+CisgICAgICAgIDwveHM6Y2hvaWNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1lZGlhQ29kZWMiPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVpcmsiIHR5cGU9IlF1aXJrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGUiIHR5cGU9IlF1aXJrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUeXBlIiB0eXBlPSJUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbGlhcyIgdHlwZT0iQWxpYXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkxpbWl0IiB0eXBlPSJMaW1pdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmVhdHVyZSIgdHlwZT0iRmVhdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0iVmFyaWFudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFyaWFudCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUXVpcmsiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUeXBlIj4KKyAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWxpYXMiIHR5cGU9IkFsaWFzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaW1pdCIgdHlwZT0iTGltaXQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkZlYXR1cmUiIHR5cGU9IkZlYXR1cmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFsaWFzIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaW1pdCI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaW4iIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyYW5nZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmFuZ2VzIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkZlYXR1cmUiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZhcmlhbnQiPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVpcmsiIHR5cGU9IlF1aXJrIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGUiIHR5cGU9IlF1aXJrIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbGlhcyIgdHlwZT0iQWxpYXMiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkxpbWl0IiB0eXBlPSJMaW1pdCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmVhdHVyZSIgdHlwZT0iRmVhdHVyZSIvPgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXR0aW5nIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJbmNsdWRlIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5M2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAidnRzX21lZGlhQ29kZWNzX3ZhbGlkYXRlX3Rlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZhbGlkYXRlTWVkaWFDb2RlY3MuY3BwIgorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnRlc3QudXRpbGl0eSIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjkwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MKK2luY2x1ZGUgdGVzdC92dHMvdG9vbHMvYnVpbGQvQW5kcm9pZC5ob3N0X2NvbmZpZy5tawpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2VlMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIFZUUyBWdHNWYWxpZGF0ZU1lZGlhQ29kZWNzLiI+CisgICAgPG9wdGlvbiBuYW1lPSJjb25maWctZGVzY3JpcHRvcjptZXRhZGF0YSIga2V5PSJwbGFuIiB2YWx1ZT0idnRzLXRyZWJsZSIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi50cmFkZWZlZC50YXJnZXRwcmVwLlZ0c0ZpbGVQdXNoZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImFib3J0LW9uLXB1c2gtZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1ncm91cCIgdmFsdWU9Ikhvc3REcml2ZW5UZXN0LnB1c2giLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iREFUQS9ldGMvbWVkaWFfY29kZWNzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjcy54c2QiLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuVnRzTXVsdGlEZXZpY2VUZXN0Ij4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LW1vZHVsZS1uYW1lIiB2YWx1ZT0iVnRzVmFsaWRhdGVNZWRpYUNvZGVjcyIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXNvdXJjZSIgdmFsdWU9Il8zMmJpdDo6REFUQS9uYXRpdmV0ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXNvdXJjZSIgdmFsdWU9Il82NGJpdDo6REFUQS9uYXRpdmV0ZXN0NjQvdnRzX21lZGlhQ29kZWNzX3ZhbGlkYXRlX3Rlc3QvdnRzX21lZGlhQ29kZWNzX3ZhbGlkYXRlX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9WYWxpZGF0ZU1lZGlhQ29kZWNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvVmFsaWRhdGVNZWRpYUNvZGVjcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3ODMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvVmFsaWRhdGVNZWRpYUNvZGVjcy5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInV0aWxpdHkvVmFsaWRhdGVYbWwuaCIKKworc3RhdGljIHZvaWQgZ2V0X2ZpbGVzX2luX2RpcnMoY29uc3QgY2hhciogZGlyX3BhdGgsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZmlsZXMpIHsKKyAgICBESVIqIGQ7CisgICAgc3RydWN0IGRpcmVudCogZGU7CisKKyAgICBkID0gb3BlbmRpcihkaXJfcGF0aCk7CisgICAgaWYgKGQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CisgICAgICAgIGlmIChkZS0+ZF90eXBlICE9IERUX1JFRykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goZGUtPmRfbmFtZSwgc3RkOjpyZWdleCgiKG1lZGlhX2NvZGVjcykoLiopKC54bWwpIikpKSB7CisgICAgICAgICAgICBmaWxlcy5wdXNoX2JhY2soZGUtPmRfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2VkaXIoZCk7Cit9CisKK1RFU1QoQ2hlY2tDb25maWcsIG1lZGlhQ29kZWNzVmFsaWRhdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIlZlcmlmeSB0aGF0IHRoZSBtZWRpYSBjb2RlY3MgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgImlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgc2NoZW1hIik7CisKKyAgICBjb25zdCBjaGFyKiBsb2NhdGlvbiA9ICIvdmVuZG9yL2V0YyI7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmlsZXM7CisgICAgZ2V0X2ZpbGVzX2luX2RpcnMobG9jYXRpb24sIGZpbGVzKTsKKworICAgIGZvciAoc3RkOjpzdHJpbmcgZmlsZV9uYW1lIDogZmlsZXMpIHsKKyAgICAgICAgRVhQRUNUX09ORV9WQUxJRF9YTUxfTVVMVElQTEVfTE9DQVRJT05TKGZpbGVfbmFtZS5jX3N0cigpLCB7bG9jYXRpb259LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3MueHNkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2ODg5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NyBAQAorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnJlZ2lzdGVybXNleHQiLAorICAgIHNyY3M6IFsicmVnaXN0ZXIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9tZWRpYXNlcnZlci5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmFuZHJvaWRpY3UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnJlZ2lzdGVybXNleHQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAorICAgIF0sCisKKyAgICAvLyBiYWNrIHRvIDMyLWJpdCwgYi8xMjY1MDI2MTMKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X21lZGlhX2MyX3NvZnR3YXJlLnhtbCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTk3ZGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pZm5lcSAoJChCT0FSRF9VU0VfQ1VTVE9NX01FRElBU0VSVkVSRVhURU5TSU9OUyksdHJ1ZSkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IHJlZ2lzdGVyLmNwcAotTE9DQUxfTU9EVUxFIDo9IGxpYnJlZ2lzdGVybXNleHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotZW5kaWYKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgbWFpbl9tZWRpYXNlcnZlci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYmljdXVjIFwKLSAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYmljdWFuZHJvaWRfdXRpbHMgXAotICAgICAgICBsaWJyZWdpc3Rlcm1zZXh0Ci0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAotCi1MT0NBTF9NT0RVTEU6PSBtZWRpYXNlcnZlcgotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9JTklUX1JDIDo9IG1lZGlhc2VydmVyLnJjCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCBlY2RkYzQ4Li43YjIyYjA1IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYXNlcnZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFpY3UvQUljdS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0yNSw3ICsyNiw2IEBACiAjaW5jbHVkZSAiUmVnaXN0ZXJFeHRlbnNpb25zLmgiCiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIkljdVV0aWxzLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgogCkBAIC0zOCw3ICszOCw3IEBACiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOworICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7CiAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwgYi9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NjMzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21hbmlmZXN0X21lZGlhX2MyX3NvZnR3YXJlLnhtbApAQCAtMCwwICsxLDExIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJmcmFtZXdvcmsiPgorICAgIDxoYWw+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzI8L25hbWU+CisgICAgICAgIDx0cmFuc3BvcnQ+aHdiaW5kZXI8L3RyYW5zcG9ydD4KKyAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICA8aW50ZXJmYWNlPgorICAgICAgICAgICAgPG5hbWU+SUNvbXBvbmVudFN0b3JlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPnNvZnR3YXJlPC9pbnN0YW5jZT4KKyAgICAgICAgPC9pbnRlcmZhY2U+CisgICAgPC9oYWw+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvQW5kcm9pZC5icAppbmRleCAyY2Y5YjgyLi42NmEzMTM5IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5icApAQCAtNTQsNiArNTQsMyBAQAogICAgIF0sCiB9CiAKLXN1YmRpcnMgPSBbCi0gICAgInRlc3RzIiwKLV0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaAppbmRleCAxMjQ1MDkyLi44MWZhNjBjIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvSU10cERhdGFiYXNlLmgKKysrIGIvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCkBAIC0xMTIsOCArMTEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpID0gMDsKIAogICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgYmVnaW5Db3B5T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZENvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgbmV3U3RvcmFnZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAppbmRleCA5OTJkYzlhLi41ZGJjZDA4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCkBAIC01NjEsNyArNTYxLDcgQEAKICAgICByZXR1cm4gcHJvY2Vzc2VkQnl0ZXMgPT0gbVBhY2tldFNpemUgPyBwcm9jZXNzZWRCeXRlcyA6IC0xOwogfQogCi1pbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LAoraW50NjRfdCBNdHBEYXRhUGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVXJiUGFja2V0RGl2aXNpb25Nb2RlIGRpdmlzaW9uTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAppbmRleCAxZGRiODIxLi4xMzhmN2IwIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTExNyw3ICsxMTcsOCBAQAogICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LCBVcmJQYWNrZXREaXZpc2lvbk1vZGUgZGl2aXNpb25Nb2RlKTsKICAgICAvLyBTaW1pbGFyIHRvIHByZXZpb3VzIHdyaXRlIG1ldGhvZCBidXQgaXQgcmVhZHMgdGhlIHBheWxvYWQgZnJvbSB8ZmR8LiBJZiB8c2l6ZXwgaXMgbGFyZ2VyIHRoYW4KICAgICAvLyBNVFBfQlVGRkVSX1NJWkUsIHRoZSBkYXRhIHdpbGwgYmUgc2VudCBieSBtdWx0aXBsZSBidWxrIHRyYW5zZmVyIHJlcXVlc3RzLgotICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LCBVcmJQYWNrZXREaXZpc2lvbk1vZGUgZGl2aXNpb25Nb2RlLAorICAgIC8vIFJldHVybiB0eXBlIChpbnQ2NF90KSBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHRoZSBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiAyR0IuCisgICAgaW50NjRfdCAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcXVlc3QsIFVyYlBhY2tldERpdmlzaW9uTW9kZSBkaXZpc2lvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIHNpemVfdCBzaXplKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCmluZGV4IDk5Mzc5N2EuLjk2NjVjNTggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICByZXR1cm4gKE10cE9iamVjdEhhbmRsZSktMTsKIH0KIAotYm9vbCBNdHBEZXZpY2U6OnNlbmRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IHNpemUsIGludCBzcmNGRCkgeworYm9vbCBNdHBEZXZpY2U6OnNlbmRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgdWludDMyX3Qgc2l6ZSwgaW50IHNyY0ZEKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBpZiAobUxhc3RTZW5kT2JqZWN0SW5mb1RyYW5zYWN0aW9uSUQgKyAxICE9IG1UcmFuc2FjdGlvbklEIHx8CkBAIC01MjksNyArNTI5LDcgQEAKICAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCkpIHsKICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOwogICAgICAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7Ci0gICAgICAgIGNvbnN0IGludCB3cml0ZVJlc3VsdCA9IG1EYXRhLndyaXRlKG1SZXF1ZXN0T3V0LCBtUGFja2V0RGl2aXNpb25Nb2RlLCBzcmNGRCwgc2l6ZSk7CisgICAgICAgIGNvbnN0IGludDY0X3Qgd3JpdGVSZXN1bHQgPSBtRGF0YS53cml0ZShtUmVxdWVzdE91dCwgbVBhY2tldERpdmlzaW9uTW9kZSwgc3JjRkQsIHNpemUpOwogICAgICAgICBjb25zdCBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CiAgICAgICAgIHJldHVybiByZXQgPT0gTVRQX1JFU1BPTlNFX09LICYmIHdyaXRlUmVzdWx0ID4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKaW5kZXggOGNmOWU1ZS4uMDFiYzNkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERldmljZS5oCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgTXRwT2JqZWN0SW5mbyogICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpOwogICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIHNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50IHNpemUsIGludCBzcmNGRCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCB1aW50MzJfdCBzaXplLCBpbnQgc3JjRkQpOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBnZXRQYXJlbnQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgTXRwU3RvcmFnZUlEICAgICAgICAgICAgZ2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCBmMjVmYzcxLi5iZDZhNmM2IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtNDcsNiArNDcsOSBAQAogY29uc3RleHByIHVuc2lnbmVkIE1BWF9GSUxFX0NIVU5LX1NJWkUgPSBBSU9fQlVGU19NQVggKiBBSU9fQlVGX0xFTjsKIAogY29uc3RleHByIHVpbnQzMl90IE1BWF9NVFBfRklMRV9TSVpFID0gMHhGRkZGRkZGRjsKKy8vIE5vdGU6IFBPTExfVElNRU9VVF9NUyA9IDAgbWVhbnMgcmV0dXJuIGltbWVkaWF0ZWx5IGkuZS4gbm8gc2xlZXAuCisvLyBBbmQgdGhpcyB3aWxsIGNhdXNlIGhpZ2ggQ1BVIHVzYWdlLgorY29uc3RleHByIGludDMyX3QgUE9MTF9USU1FT1VUX01TID0gNTAwOwogCiBzdHJ1Y3QgdGltZXNwZWMgWkVST19USU1FT1VUID0geyAwLCAwIH07CiAKQEAgLTIxMiw3ICsyMTUsNiBAQAogICAgIHVpbnQxNl90IHZhbHVlID0gc2V0dXAtPndWYWx1ZTsKICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CiAgICAgYnVmLnJlc2l6ZShsZW5ndGgpOwotICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKCEodHlwZSAmIFVTQl9ESVJfSU4pKSB7CiAgICAgICAgIGlmICg6OnJlYWQobUNvbnRyb2wsIGJ1Zi5kYXRhKCksIGxlbmd0aCkgIT0gbGVuZ3RoKSB7CkBAIC0yMjUsOCArMjI3LDggQEAKICAgICAgICAgY2FzZSBNVFBfUkVRX1JFU0VUOgogICAgICAgICBjYXNlIE1UUF9SRVFfQ0FOQ0VMOgogICAgICAgICAgICAgZXJybm8gPSBFQ0FOQ0VMRUQ7Ci0gICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvLyAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cykgKyA0KSB7CkBAIC0zMDYsNyArMzA4LDcgQEAKICAgICBpbnQgZXJyb3IgPSAwOwogCiAgICAgd2hpbGUgKG51bV9ldmVudHMgPCBtaW5fZXZlbnRzKSB7Ci0gICAgICAgIGlmIChwb2xsKG1Qb2xsRmRzLCAyLCAwKSA9PSAtMSkgeworICAgICAgICBpZiAocG9sbChtUG9sbEZkcywgMiwgUE9MTF9USU1FT1VUX01TKSA9PSAtMSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIk10cCBlcnJvciBkdXJpbmcgcG9sbCgpIjsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcAppbmRleCAzZGQ0MjQ4Li4zYjI5OGE5IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+ZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmJ1ZmZlcl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgcmVxdWVzdC0+YWN0dWFsX2xlbmd0aCA9IHJlc3VsdDsKICAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBjY2RkZDZlLi5jYThjYjc4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtOTksNiArOTksNyBAQAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKICAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLApAQCAtMjU5LDYgKzI2MCwxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsIGhhbmRsZSk7CiB9CiAKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEFMT0dWKCJzZW5kT2JqZWN0SW5mb0NoYW5nZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELCBoYW5kbGUpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZFN0b3JlQWRkZWQoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgQUxPR1YoInNlbmRTdG9yZUFkZGVkICUwOFhcbiIsIGlkKTsKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX0FEREVELCBpZCk7CkBAIC00NDIsNiArNDQ4LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChyZXNwb25zZSAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICBBTE9HVygiW01UUF0gZ290IHJlc3BvbnNlIDB4JVggaW4gY29tbWFuZCAlcyAoJXgpIiwgcmVzcG9uc2UsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOwpAQCAtNjUyLDggKzY2MSw4IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKLSAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCi0gICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlcyAoMHglMDRYKVxuIiwgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBwcm9wZXJ0eSk7CiAKICAgICByZXR1cm4gbURhdGFiYXNlLT5nZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKIH0KQEAgLTk0Niw3ICs5NTUsOCBAQAogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKSkgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsgICAgIC8vIGRhdGUgbW9kaWZpZWQKICAgICAvLyBrZXl3b3JkcyBmb2xsb3cKIAotICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6ICUwNFhcbiIsIChjb25zdCBjaGFyICopbmFtZSwgZm9ybWF0KTsKKyAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAweCUwNFggKCVzKVxuIiwgKGNvbnN0IGNoYXIqKW5hbWUsIGZvcm1hdCwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CiAgICAgdGltZV90IG1vZGlmaWVkVGltZTsKICAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CkBAIC05NjcsOSArOTc3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0U7CiAgICAgfQogCi0gICAgQUxPR0QoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HVigicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LAogICAgICAgICAgICAgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dEKCJoYW5kbGU6ICVkLCBwYXJlbnQ6ICVkLCBzdG9yYWdlSUQ6ICUwOFgiLCBoYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZjY5MzlkNy4uMWY4Nzk5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTE1LDYgKzExNSw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvT1dORVJTIGIvbWVkaWEvbXRwL09XTkVSUwppbmRleCAyMTkzMDdiLi4xOTI4YmE4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvT1dORVJTCisrKyBiL21lZGlhL210cC9PV05FUlMKQEAgLTEgKzEsNyBAQAotemhhbmdqZXJyeUBnb29nbGUuY29tCitzZXQgbm9wYXJlbnQKKworbWFyY29uZUBnb29nbGUuY29tCitqc2hhcmtleUBhbmRyb2lkLmNvbQoramFtZXN3ZWlAZ29vZ2xlLmNvbQorcm1vanVtZGVyQGdvb2dsZS5jb20KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcAppbmRleCBlNjdjNTY4Li43MmMwN2NjIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcAorKysgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcApAQCAtMTUsNDIgKzE1LDEwOSBAQAogICovCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIlBvc2l4QXN5bmNJTy5oIgogCiBuYW1lc3BhY2UgewogCi12b2lkIHJlYWRfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGFpb2NicC0+YWlvX2ZpbGRlcywKLSAgICAgICAgICAgICAgICBhaW9jYnAtPmFpb19idWYsIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7Ci0gICAgaWYgKGFpb2NicC0+cmV0ID09IC0xKSBhaW9jYnAtPmVycm9yID0gZXJybm87CitzdGQ6OnRocmVhZCBnV29ya2VyVGhyZWFkOworc3RkOjpkZXF1ZTxzdHJ1Y3QgYWlvY2IqPiBnV29ya1F1ZXVlOworYm9vbCBnU3VzcGVuZGVkID0gdHJ1ZTsKK2ludCBnQWlvY2JSZWZjb3VudCA9IDA7CitzdGQ6Om11dGV4IGdMb2NrOworc3RkOjpjb25kaXRpb25fdmFyaWFibGUgZ1dhaXQ7CisKK3ZvaWQgd29ya19mdW5jKHZvaWQgKikgeworICAgIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgIkFzeW5jSU8gd29yayIpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0cnVjdCBhaW9jYiAqYWlvY2JwOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKGdMb2NrKTsKKyAgICAgICAgICAgIGdXYWl0LndhaXQobGssIFtde3JldHVybiBnV29ya1F1ZXVlLnNpemUoKSA+IDAgfHwgZ1N1c3BlbmRlZDt9KTsKKyAgICAgICAgICAgIGlmIChnU3VzcGVuZGVkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFpb2NicCA9IGdXb3JrUXVldWUuYmFjaygpOworICAgICAgICAgICAgZ1dvcmtRdWV1ZS5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIENIRUNLKGFpb2NicC0+cXVldWVkKTsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaWYgKGFpb2NicC0+cmVhZCkgeworICAgICAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGFpb2NicC0+YWlvX2ZpbGRlcywKKyAgICAgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHB3cml0ZShhaW9jYnAtPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICBhaW9jYnAtPmFpb19idWYsIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhhaW9jYnAtPmxvY2spOworICAgICAgICAgICAgYWlvY2JwLT5yZXQgPSByZXQ7CisgICAgICAgICAgICBpZiAoYWlvY2JwLT5yZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhaW9jYnAtPmVycm9yID0gZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhaW9jYnAtPnF1ZXVlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGFpb2NicC0+Y3Yubm90aWZ5X2FsbCgpOworICAgIH0KIH0KIAotdm9pZCB3cml0ZV9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgYWlvY2JwLT5yZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocHdyaXRlKGFpb2NicC0+YWlvX2ZpbGRlcywKLSAgICAgICAgICAgICAgICBhaW9jYnAtPmFpb19idWYsIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7Ci0gICAgaWYgKGFpb2NicC0+cmV0ID09IC0xKSBhaW9jYnAtPmVycm9yID0gZXJybm87CitpbnQgYWlvX2FkZChzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIENIRUNLKCFhaW9jYnAtPnF1ZXVlZCk7CisgICAgYWlvY2JwLT5xdWV1ZWQgPSB0cnVlOworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhnTG9jayk7CisgICAgICAgIGdXb3JrUXVldWUucHVzaF9mcm9udChhaW9jYnApOworICAgIH0KKyAgICBnV2FpdC5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAorYWlvY2I6OmFpb2NiKCkgeworICAgIHRoaXMtPnJldCA9IDA7CisgICAgdGhpcy0+cXVldWVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKGdMb2NrKTsKKyAgICAgICAgaWYgKGdBaW9jYlJlZmNvdW50ID09IDApIHsKKyAgICAgICAgICAgIENIRUNLKGdXb3JrUXVldWUuc2l6ZSgpID09IDApOworICAgICAgICAgICAgQ0hFQ0soZ1N1c3BlbmRlZCk7CisgICAgICAgICAgICBnU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICBnV29ya2VyVGhyZWFkID0gc3RkOjp0aHJlYWQod29ya19mdW5jLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBnQWlvY2JSZWZjb3VudCsrOworICAgIH0KK30KKwogYWlvY2I6On5haW9jYigpIHsKLSAgICBDSEVDSyghdGhyZWFkLmpvaW5hYmxlKCkpOworICAgIENIRUNLKCF0aGlzLT5xdWV1ZWQpOworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhnTG9jayk7CisgICAgICAgIENIRUNLKCFnU3VzcGVuZGVkKTsKKyAgICAgICAgaWYgKGdBaW9jYlJlZmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIENIRUNLKGdXb3JrUXVldWUuc2l6ZSgpID09IDApOworICAgICAgICAgICAgZ1N1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICBsay51bmxvY2soKTsKKyAgICAgICAgICAgIGdXYWl0Lm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgIGdXb3JrZXJUaHJlYWQuam9pbigpOworICAgICAgICAgICAgbGsubG9jaygpOworICAgICAgICB9CisgICAgICAgIGdBaW9jYlJlZmNvdW50LS07CisgICAgfQogfQogCiBpbnQgYWlvX3JlYWQoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHJlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKKyAgICBhaW9jYnAtPnJlYWQgPSB0cnVlOworICAgIHJldHVybiBhaW9fYWRkKGFpb2NicCk7CiB9CiAKIGludCBhaW9fd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHdyaXRlX2Z1bmMsIGFpb2NicCk7Ci0gICAgcmV0dXJuIDA7CisgICAgYWlvY2JwLT5yZWFkID0gZmFsc2U7CisgICAgcmV0dXJuIGFpb19hZGQoYWlvY2JwKTsKIH0KIAogaW50IGFpb19lcnJvcihjb25zdCBzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewpAQCAtNjQsNyArMTMxLDEwIEBACiBpbnQgYWlvX3N1c3BlbmQoc3RydWN0IGFpb2NiICphaW9jYnBbXSwgaW50IG4sCiAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgYWlvY2JwW2ldLT50aHJlYWQuam9pbigpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKGFpb2NicFtpXS0+bG9jayk7CisgICAgICAgICAgICBhaW9jYnBbaV0tPmN2LndhaXQobGssIFthaW9jYnAsIGlde3JldHVybiAhYWlvY2JwW2ldLT5xdWV1ZWQ7fSk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmggYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmgKaW5kZXggNTkwYWFlZi4uMmJiNTczNSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5oCisrKyBiL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uaApAQCAtMTcsMTAgKzE3LDExIEBACiAjaWZuZGVmIF9QT1NJWEFTWU5DSU9fSAogI2RlZmluZSBfUE9TSVhBU1lOQ0lPX0gKIAorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAvKioKQEAgLTM1LDEwICszNiwxNSBAQAogICAgIHNpemVfdCBhaW9fbmJ5dGVzOwogCiAgICAgLy8gVXNlZCBpbnRlcm5hbGx5Ci0gICAgc3RkOjp0aHJlYWQgdGhyZWFkOworICAgIGJvb2wgcmVhZDsKKyAgICBib29sIHF1ZXVlZDsKICAgICBzc2l6ZV90IHJldDsKICAgICBpbnQgZXJyb3I7CiAKKyAgICBzdGQ6Om11dGV4IGxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3Y7CisKKyAgICBhaW9jYigpOwogICAgIH5haW9jYigpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9uZGsvQW5kcm9pZC5icAppbmRleCA0YTM2NjgxLi5hM2NhYmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9uZGsvQW5kcm9pZC5icApAQCAtMzEsNiArMzEsMTMgQEAKICAgICBsaWNlbnNlOiAiTk9USUNFIiwKIH0KIAorLy8gZm9yIHVzZSB3aXRoIGhlYWRlcl9saWJzCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXQorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKIApAQCAtNTQsOSArNjEsNyBAQAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0KICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCkBAIC02NiwzNSArNzEsMTExIEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZV9sYXp5IiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYV9qbmkiLAorICAgICAgICAibGlibWVkaWFfam5pX3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJhbmRyb2lkIiwKLSAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgXSwKKwogICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CiAgICAgICAgIHBkazogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImxpYm1lZGlhbmRrLm1hcC50eHQiLAorICAgIHN0dWJzOiB7CisgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCisgICAgICAgIHZlcnNpb25zOiBbIjI5Il0sCisgICAgfSwKKworICAgIC8vIEJ1ZzogaHR0cDovL2IvMTI0NTIyOTk1IGxpYm1lZGlhbmRrIGhhcyBsaW5rZXIgZXJyb3JzIHdoZW4gYnVpbHQgd2l0aAorICAgIC8vIGNvdmVyYWdlCisgICAgbmF0aXZlX2NvdmVyYWdlOiBmYWxzZSwKIH0KIAogbGxuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QiLAorICAgIHNyY3M6IFsidGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay8iLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAppbmRleCAyMGIxNjY3Li4xODgzZjYzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJOZGtJbWFnZVJlYWRlclByaXYuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfVXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9oYXJkd2FyZV9IYXJkd2FyZUJ1ZmZlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZC9BSGFyZHdhcmVCdWZmZXJIZWxwZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogCkBAIC0xOTAsNyArMTkwLDcgQEAKIAogICAgIGF1dG8gbG9ja2VkQnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyPigpOwogCi0gICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gYW5kcm9pZF9oYXJkd2FyZV9IYXJkd2FyZUJ1ZmZlcl9jb252ZXJ0VG9HcmFsbG9jVXNhZ2VCaXRzKG1Vc2FnZSk7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gQUhhcmR3YXJlQnVmZmVyX2NvbnZlcnRUb0dyYWxsb2NVc2FnZUJpdHMobVVzYWdlKTsKIAogICAgIHN0YXR1c190IHJldCA9CiAgICAgICAgICAgICBsb2NrSW1hZ2VGcm9tQnVmZmVyKG1CdWZmZXIsIGdyYWxsb2NVc2FnZSwgbUJ1ZmZlci0+bUZlbmNlLT5kdXAoKSwgbG9ja2VkQnVmZmVyLmdldCgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IGJlNjM1ZmYuLmJhYTRmYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtMjEsMTMgKzIxLDE1IEBACiAKICNpbmNsdWRlICJOZGtJbWFnZVByaXYuaCIKICNpbmNsdWRlICJOZGtJbWFnZVJlYWRlclByaXYuaCIKKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL05ka0ltYWdlLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9VdGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvUHVibGljRm9ybWF0Lmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkL0FIYXJkd2FyZUJ1ZmZlckhlbHBlcnMuaD4KICNpbmNsdWRlIDxncmFsbG9jdXNhZ2UvR3JhbGxvY1VzYWdlQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDMsNiArNDUsMTAgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0NvbnRleHRLZXkgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtHcmFwaGljQnVmZmVyS2V5ID0gIkdyYXBoaWNCdWZmZXIiOwogCitzdGF0aWMgY29uc3RleHByIGludCBrV2luZG93SGFsVG9rZW5TaXplTWF4ID0gMjU2OworCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pOworCiBib29sCiBBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2FnZSBoYXMgZWl0aGVyIENQVV9SRUFEX09GVEVOIG9yIENQVV9SRUFEIHNldC4gTm90ZSB0aGF0IGNoZWNrIGFnYWluc3QKQEAgLTU4LDExICs2NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9KUEVHOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfUFJJVkFURToKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEwOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0hFSUM6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgLy8gRm9yIHByaXZhdGUgZm9ybWF0LCBjcHUgdXNhZ2UgaXMgcHJvaGliaXRlZC4KQEAgLTg0LDExICs5NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkdCQV9GUDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSlBFRzoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzE2OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX1BSSVZBVEU6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMjYxLDkgKzI3NSw5IEBACiBtZWRpYV9zdGF0dXNfdAogQUltYWdlUmVhZGVyOjppbml0KCkgewogICAgIFB1YmxpY0Zvcm1hdCBwdWJsaWNGb3JtYXQgPSBzdGF0aWNfY2FzdDxQdWJsaWNGb3JtYXQ+KG1Gb3JtYXQpOwotICAgIG1IYWxGb3JtYXQgPSBhbmRyb2lkX3ZpZXdfU3VyZmFjZV9tYXBQdWJsaWNGb3JtYXRUb0hhbEZvcm1hdChwdWJsaWNGb3JtYXQpOwotICAgIG1IYWxEYXRhU3BhY2UgPSBhbmRyb2lkX3ZpZXdfU3VyZmFjZV9tYXBQdWJsaWNGb3JtYXRUb0hhbERhdGFzcGFjZShwdWJsaWNGb3JtYXQpOwotICAgIG1IYWxVc2FnZSA9IGFuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXJfY29udmVydFRvR3JhbGxvY1VzYWdlQml0cyhtVXNhZ2UpOworICAgIG1IYWxGb3JtYXQgPSBtYXBQdWJsaWNGb3JtYXRUb0hhbEZvcm1hdChwdWJsaWNGb3JtYXQpOworICAgIG1IYWxEYXRhU3BhY2UgPSBtYXBQdWJsaWNGb3JtYXRUb0hhbERhdGFzcGFjZShwdWJsaWNGb3JtYXQpOworICAgIG1IYWxVc2FnZSA9IEFIYXJkd2FyZUJ1ZmZlcl9jb252ZXJ0VG9HcmFsbG9jVXNhZ2VCaXRzKG1Vc2FnZSk7CiAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYlByb2R1Y2VyOwogICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGdiQ29uc3VtZXI7CkBAIC0zMDEsNiArMzE1LDkgQEAKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQnVmZmVySXRlbUNvbnN1bWVyIGJ1ZmZlciBkYXRhU3BhY2UiKTsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KKyAgICBpZiAobVVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1BST1RFQ1RFRF9DT05URU5UKSB7CisgICAgICAgIGdiQ29uc3VtZXItPnNldENvbnN1bWVySXNQcm90ZWN0ZWQodHJ1ZSk7CisgICAgfQogCiAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi90cnVlKTsKICAgICBpZiAobVN1cmZhY2UgPT0gbnVsbHB0cikgewpAQCAtMzUwLDggKzM2NywxMCBAQAogICAgICAgICAgICAgICBpdCAhPSBtQWNxdWlyZWRJbWFnZXMuZW5kKCk7IGl0KyspIHsKICAgICAgICAgQUltYWdlKiBpbWFnZSA9ICppdDsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGltYWdlLT5tTG9jayk7Ci0gICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEpOworICAgICAgICAvLyBEbyBub3QgYWx0ZXIgbUFjcXVpcmVkSW1hZ2VzIHdoaWxlIHdlIGFyZSBpdGVyYXRpbmcgb24gaXQKKyAgICAgICAgcmVsZWFzZUltYWdlTG9ja2VkKGltYWdlLCAvKnJlbGVhc2VGZW5jZUZkKi8tMSwgLypjbGVhckNhY2hlKi9mYWxzZSk7CiAgICAgfQorICAgIG1BY3F1aXJlZEltYWdlcy5jbGVhcigpOwogCiAgICAgLy8gRGVsZXRlIEJ1ZmZlciBJdGVtcwogICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CkBAIC0zNjMsNiArMzgyLDE1IEBACiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPmFiYW5kb24oKTsKICAgICAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihudWxscHRyKTsKICAgICB9CisKKyAgICBpZiAobVdpbmRvd0hhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGludCBzaXplID0gbVdpbmRvd0hhbmRsZS0+ZGF0YVswXTsKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1XaW5kb3dIYW5kbGUtPmRhdGFbMV0pLCBzaXplKTsKKyAgICAgICAgZGVsZXRlSGFsVG9rZW4oaGFsVG9rZW4pOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtV2luZG93SGFuZGxlKTsKKyAgICB9CiB9CiAKIG1lZGlhX3N0YXR1c190CkBAIC00ODEsNyArNTA5LDcgQEAKIH0KIAogdm9pZAotQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKSB7CitBSW1hZ2VSZWFkZXI6OnJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSkgewogICAgIEJ1ZmZlckl0ZW0qIGJ1ZmZlciA9IGltYWdlLT5tQnVmZmVyOwogICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXMgbm90IGZhdGFsCkBAIC01MDUsNiArNTMzLDEwIEBACiAgICAgaW1hZ2UtPm1Mb2NrZWRCdWZmZXIgPSBudWxscHRyOwogICAgIGltYWdlLT5tSXNDbG9zZWQgPSB0cnVlOwogCisgICAgaWYgKCFjbGVhckNhY2hlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgLy8gY2xlYW51cCBhY3F1aXJlZCBpbWFnZSBsaXN0CiAgICAgZm9yIChhdXRvIGl0ID0gbUFjcXVpcmVkSW1hZ2VzLmJlZ2luKCk7CkBAIC01MjIsNiArNTU0LDI1IEBACiAgICAgfQogfQogCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXI6OmdldFdpbmRvd05hdGl2ZUhhbmRsZShuYXRpdmVfaGFuZGxlICoqaGFuZGxlKSB7CisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFuZGxlID0gbVdpbmRvd0hhbmRsZTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIG5ldyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihtUHJvZHVjZXIpOworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGlmICghY3JlYXRlSGFsVG9rZW4oaGdicCwgJmhhbFRva2VuKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIG1XaW5kb3dIYW5kbGUgPSBjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShoYWxUb2tlbik7CisgICAgaWYgKCFtV2luZG93SGFuZGxlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwogaW50CiBBSW1hZ2VSZWFkZXI6OmdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcikgewogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIC0xOwpAQCAtNTg1LDYgKzYzNiwzMyBAQAogICAgIH0KIH0KIAorc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoCisgICAgICAgIGNvbnN0IEhhbFRva2VuICZoYWxUb2tlbikgeworICAgIC8vIFdlIGF0dGVtcHQgdG8gc3RvcmUgaGFsVG9rZW4gaW4gdGhlIGludHMgb2YgdGhlIG5hdGl2ZV9oYW5kbGVfdCBhZnRlciBpdHMKKyAgICAvLyBzaXplLiBUaGUgZmlyc3QgaW50IHN0b3JlcyB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4uIFdlIHN0b3JlIHRoaXMgaW4gYW4gaW50CisgICAgLy8gdG8gYXZvaWQgYWxpZ25tZW50IGlzc3VlcyB3aGVyZSBzaXplX3QgYW5kIGludCBkbyBub3QgaGF2ZSB0aGUgc2FtZQorICAgIC8vIGFsaWdubWVudC4KKyAgICBzaXplX3QgbmhEYXRhQnl0ZVNpemUgPSBoYWxUb2tlbi5zaXplKCk7CisgICAgaWYgKG5oRGF0YUJ5dGVTaXplID4ga1dpbmRvd0hhbFRva2VuU2l6ZU1heCkgeworICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgdG9rZW4gaXNuJ3QgcmVhc29uYWJsZS4uCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3QgbnVtSW50cyA9IGNlaWwobmhEYXRhQnl0ZVNpemUgLyBzaXplb2YoaW50KSkgKyAxOworCisgICAgLy8gV2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93LCB3aGV0aGVyIG51bUludHMgY2FuIGZpdCBpbiBhbiBpbnQsIHNpbmNlIHdlCisgICAgLy8gZXhwZWN0IGtXaW5kb3dIYWxUb2tlblNpemVNYXggdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0LgorICAgIC8vIGNyZWF0ZSBhIG5hdGl2ZV9oYW5kbGVfdCB3aXRoIDAgbnVtRmRzIGFuZCBudW1JbnRzIG51bWJlciBvZiBpbnRzLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPQorICAgICAgICBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCBudW1JbnRzKTsKKyAgICBpZiAoIW5oKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgdG9rZW4gaW4gdGhlIGZpcnN0IGludC4KKyAgICBuaC0+ZGF0YVswXSA9IG5oRGF0YUJ5dGVTaXplOworICAgIG1lbWNweSgmKG5oLT5kYXRhWzFdKSwgaGFsVG9rZW4uZGF0YSgpLCBuaERhdGFCeXRlU2l6ZSk7CisgICAgcmV0dXJuIG5oOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXcoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBtYXhJbWFnZXMsCkBAIC01OTQsNiArNjcyLDE5IEBACiAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiwgbWF4SW1hZ2VzLCByZWFkZXIpOwogfQogCitleHRlcm4gIkMiIHsKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChyZWFkZXIgPT0gbnVsbHB0ciB8fCBoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVhZGVyLT5nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworfSAvL2V4dGVybiAiQyIKKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCmluZGV4IGJlZDhhMjEuLmUzMjhjYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKQEAgLTY5LDYgKzY5LDggQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlTmV4dEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZUxhdGVzdEltYWdlKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRXaW5kb3dOYXRpdmVIYW5kbGUoLypvdXQqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKICAgICBBTmF0aXZlV2luZG93KiBnZXRXaW5kb3coKSAgICBjb25zdCB7IHJldHVybiBtV2luZG93LmdldCgpOyB9OwogICAgIGludDMyX3QgICAgICAgIGdldFdpZHRoKCkgICAgIGNvbnN0IHsgcmV0dXJuIG1XaWR0aDsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRIZWlnaHQoKSAgICBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9OwpAQCAtODYsNyArODgsNyBAQAogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVJbWFnZUxvY2tlZCgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCiAgICAgLy8gQ2FsbGVkIGJ5IEFJbWFnZS9+QUltYWdlUmVhZGVyIHRvIGNsb3NlIGltYWdlLiBDYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZ3JhYiBBSW1hZ2U6Om1Mb2NrCi0gICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKTsKKyAgICB2b2lkIHJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQsIGJvb2wgY2xlYXJDYWNoZSA9IHRydWUpOwogCiAgICAgc3RhdGljIGludCBnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpOwogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVySGVpZ2h0KEJ1ZmZlckl0ZW0qIGJ1ZmZlcik7CkBAIC0xNjAsNiArMTYyLDcgQEAKICAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+ICAgICBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgIG1XaW5kb3c7CisgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCA0MjI4NWY4Li5jMjNmMTliIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKaW5kZXggZDcxOTNjYS4uY2UyYzY2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURybVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CiAKICNpbmNsdWRlIDxqbmkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKaW5kZXggOWQwMGU1ZS4uNzk3OWMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKQEAgLTIzLDE2ICsyMywyMyBAQAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KIAogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDEsMTQgKzQ4LDIwIEBACiAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCByZWFkQXQ7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZ2V0U2l6ZTsKICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UgY2xvc2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CiB9OwogCiBOZGtEYXRhU291cmNlOjpOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgbURhdGFTb3VyY2UtPm1JbXBsID0gZGF0YVNvdXJjZS0+bUltcGw7CisgICAgbURhdGFTb3VyY2UtPm1GbGFncyA9IGRhdGFTb3VyY2UtPm1GbGFnczsKIH0KIAogTmRrRGF0YVNvdXJjZTo6fk5ka0RhdGFTb3VyY2UoKSB7CkBAIC01OSw5ICs3MiwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAordWludDMyX3QgTmRrRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIG1EYXRhU291cmNlLT5tRmxhZ3M7Cit9CisKIHNzaXplX3QgTmRrRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgeworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0ID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICByZXR1cm4gbURhdGFTb3VyY2UtPnJlYWRBdChtRGF0YVNvdXJjZS0+dXNlcmRhdGEsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CkBAIC05Miw2ICsxMDksOTUgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE5ka0RhdGFTb3VyY2U6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemVwdHIpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgIT0gTlVMTAorICAgICAgICAgICAgJiYgbURhdGFTb3VyY2UtPnVzZXJkYXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemVwdHIgIT0gTlVMTCkgeworICAgICAgICBzaXplID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQpOworICAgICAgICAqc2l6ZXB0ciA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBzaXplID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBpbnQgdmVyc2lvbikgeworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oaWJpbmRlckZvckphdmFPYmplY3QoZW52LCBvYmopKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUFNlcnZpY2UoZW52LCBvYmopOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZVRlbXBsYXRlKAorICAgICAgICBKTklFbnYgKmVudiwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBjaGFyICpjbGF6eiwKKyAgICAgICAgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICBjb25zdCBjaGFyICpzaWduYXR1cmUsCisgICAgICAgIGludCB2ZXJzaW9uKSB7CisgICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKKyAgICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImh0dHAgc2VydmljZSBtdXN0IGJlIGNyZWF0ZWQgZnJvbSBKYXZhIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcyhjbGF6eik7CisgICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWEoMilIdHRwU2VydmljZSIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLCBtZXRob2QsIHNpZ25hdHVyZSk7CisgICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpzdHJpbmcganVyaSA9IGVudi0+TmV3U3RyaW5nVVRGKHVyaSk7CisKKyAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoanVyaSk7CisKKyAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooZW52LCBzZXJ2aWNlLCB2ZXJzaW9uKTsKKyAgICByZXR1cm4gaHR0cFNlcnZpY2U7CisKK30KKworc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZShjb25zdCBjaGFyICp1cmksIGludCB2ZXJzaW9uKSB7CisKKyAgICBKTklFbnYgKmVudjsKKyAgICBjb25zdCBjaGFyICpjbGF6eiwgKm1ldGhvZCwgKnNpZ25hdHVyZTsKKworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBjbGF6eiA9ICJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiOworICAgICAgICAgICAgbWV0aG9kID0gImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiOworICAgICAgICAgICAgc2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBjbGF6eiA9ICJhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1ldGhvZCA9ICJjcmVhdGVIVFRQU2VydmljZSI7CisgICAgICAgICAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQU2VydmljZTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlTWVkaWFIdHRwU2VydmljZVRlbXBsYXRlKGVudiwgdXJpLCBjbGF6eiwgbWV0aG9kLCBzaWduYXR1cmUsIHZlcnNpb24pOworCit9CisKIGV4dGVybiAiQyIgewogCiBFWFBPUlQKQEAgLTEwNSw2ICsyMTEsMzIgQEAKIH0KIAogRVhQT1JUCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaSgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQgbnVtaGVhZGVycywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSB7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBzZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZSh1cmksIC8qIHZlcnNpb24gPSAqLyAxKTsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlfdmFsdWVzW2kgKiAyXSk7CisgICAgICAgIFN0cmluZzggdmFsdWU4KGtleV92YWx1ZXNbaSAqIDIgKyAxXSk7CisgICAgICAgIGhlYWRlcnMuYWRkKGtleTgsIHZhbHVlOCk7CisgICAgfQorCisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoc2VydmljZSwgdXJpLCAmaGVhZGVycyk7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBTWVkaWFEYXRhU291cmNlX25ld1VyaSBzb3VyY2UgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQUxPR0koIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSAlcyBmbGFncyAldSIsIHNvdXJjZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBzb3VyY2UtPmZsYWdzKCkpOworICAgIEFNZWRpYURhdGFTb3VyY2UqIGFTb3VyY2UgPSBjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShzb3VyY2UpOworICAgIGFTb3VyY2UtPm1JbXBsID0gc291cmNlOworICAgIGFTb3VyY2UtPm1GbGFncyA9IHNvdXJjZS0+ZmxhZ3MoKTsKKyAgICByZXR1cm4gYVNvdXJjZTsKK30KKworRVhQT1JUCiB2b2lkIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKICAgICBBTE9HVigiZHRvciIpOwogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKQEAgLTEzMiw1ICsyNjQsMTYgQEAKICAgICBtU291cmNlLT5jbG9zZSA9IGNsb3NlOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmNsb3NlKG1Tb3VyY2UtPnVzZXJkYXRhKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSBnZXRBdmFpbGFibGVTaXplKSB7CisgICAgbVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSA9IGdldEF2YWlsYWJsZVNpemU7Cit9CisKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTU3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcyIKKworI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgeworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSkgeworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHJldHVybiBzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSk7Cit9CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSkgeworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHNvdXJjZS0+Y2xvc2UoKTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5nZXRBdmFpbGFibGVTaXplKG9mZnNldCwgJnNpemUpOworICAgIHJldHVybiAgc2l6ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjZGVmaW5lIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3NpemVfdCBEYXRhU291cmNlX2dldFNpemUodm9pZCAqdXNlcmRhdGEpOworCitzc2l6ZV90IERhdGFTb3VyY2VfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpOworCit2b2lkIERhdGFTb3VyY2VfY2xvc2Uodm9pZCAqdXNlcmRhdGEpOworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpOworCitzdGF0aWMgaW5saW5lIEFNZWRpYURhdGFTb3VyY2UqIGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UgPSBBTWVkaWFEYXRhU291cmNlX25ldygpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobVNvdXJjZSwgc291cmNlLmdldCgpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtU291cmNlLCBEYXRhU291cmNlX3JlYWRBdCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1Tb3VyY2UsIERhdGFTb3VyY2VfZ2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtU291cmNlLCBEYXRhU291cmNlX2Nsb3NlKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKTsKKyAgICByZXR1cm4gbVNvdXJjZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaAppbmRleCBlYTljODY1Li4xNmZmOTc0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC00MywxMSArNDQsMTMgQEAKICAgICBOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKik7CiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCk7CiAgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk5ka0RhdGFTb3VyY2UoKTsKQEAgLTU5LDUgKzYyLDcgQEAKIAogfTsKIAorc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZShjb25zdCBjaGFyICp1cmksIGludCB2ZXJzaW9uKTsKKwogI2VuZGlmIC8vIF9OREtfTUVESUFfREFUQVNPVVJDRV9QUklWX0gKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggNmQxMGYxYy4uODVkYmZmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRHJtIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRHJtLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMjQsNiArMjcsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURybUNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CkBAIC00MCwxMCArNDUsMzIgQEAKIHsKIHByaXZhdGU6CiAgICAgQU1lZGlhRHJtICptT2JqOwotICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbUxpc3RlbmVyOworICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbUV2ZW50TGlzdGVuZXI7CisgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXI7CisgICAgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIG1LZXlzQ2hhbmdlTGlzdGVuZXI7CiAKIHB1YmxpYzoKLSAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksCisgICAgICAgICAgICBtRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoTlVMTCksIG1LZXlzQ2hhbmdlTGlzdGVuZXIoTlVMTCkge30KKworICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLAorICAgICAgICAgICAgbUV2ZW50TGlzdGVuZXIoTlVMTCksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCBtS2V5c0NoYW5nZUxpc3RlbmVyKE5VTEwpIHt9CisKKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwKKyAgICAgICAgICAgIG1FdmVudExpc3RlbmVyKE5VTEwpLCBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKE5VTEwpLCBtS2V5c0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorCisgICAgdm9pZCBzZXRFdmVudExpc3RlbmVyKEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUV2ZW50TGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICB2b2lkIHNldEV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZvaWQgc2V0S2V5c0NoYW5nZUxpc3RlbmVyKEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtS2V5c0NoYW5nZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCiAgICAgdm9pZCBub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKTsKIH07CiAKQEAgLTYyLDI3ICs4OSw3NSBAQAogfTsKIAogdm9pZCBEcm1MaXN0ZW5lcjo6bm90aWZ5KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCBQYXJjZWwgKm9iaikgewotICAgIGlmICghbUxpc3RlbmVyKSB7CisgICAgaWYgKCFtRXZlbnRMaXN0ZW5lciAmJiAhbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciAmJiAhbUtleXNDaGFuZ2VMaXN0ZW5lcikgeworICAgICAgICBBTE9HRSgiTm8gbGlzdGVuZXJzIGFyZSBzcGVjaWZpZWQiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIG9iai0+c2V0RGF0YVBvc2l0aW9uKDApOworCiAgICAgQU1lZGlhRHJtU2Vzc2lvbklkIHNlc3Npb25JZCA9IHtOVUxMLCAwfTsKICAgICBpbnQzMl90IHNlc3Npb25JZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOwotICAgIGlmIChzZXNzaW9uSWRTaXplKSB7Ci0gICAgICAgIHVpbnQ4X3QgKnNlc3Npb25JZERhdGEgPSBuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXTsKLSAgICAgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGE7Ci0gICAgICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOwotICAgICAgICBvYmotPnJlYWQoc2Vzc2lvbklkRGF0YSwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgaWYgKHNlc3Npb25JZFNpemUgPD0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzZXNzaW9uIGlkIHNpemUiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludDMyX3QgZGF0YVNpemUgPSBvYmotPnJlYWRJbnQzMigpOwotICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOwotICAgIGlmIChkYXRhU2l6ZSkgewotICAgICAgICBkYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOwotICAgICAgICBvYmotPnJlYWQoZGF0YSwgZGF0YVNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHNlc3Npb25JZERhdGEobmV3IHVpbnQ4X3Rbc2Vzc2lvbklkU2l6ZV0pOworICAgIHNlc3Npb25JZC5wdHIgPSBzZXNzaW9uSWREYXRhLmdldCgpOworICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOworICAgIHN0YXR1c190IGVyciA9IG9iai0+cmVhZChzZXNzaW9uSWREYXRhLmdldCgpLCBzZXNzaW9uSWQubGVuZ3RoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBzZXNzaW9uIGlkLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyB0cmFuc2xhdGUgRHJtUGx1Z2luIGV2ZW50IHR5cGVzIGludG8gdGhlaXIgTkRLIGVxdWl2YWxlbnRzCisgICAgaWYgKERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50RXhwaXJhdGlvblVwZGF0ZSA9PSBldmVudFR5cGUpIHsKKyAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyA9IG9iai0+cmVhZEludDY0KCk7CisgICAgICAgIGlmIChleHBpcnlUaW1lSW5NUyA+PSAwKSB7CisgICAgICAgICAgICAoKm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBleHBpcnkgdGltZSwgc3RhdHVzPSUiIFBSSWQ2NCAiIiwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5c0NoYW5nZSA9PSBldmVudFR5cGUpIHsKKyAgICAgICAgaW50MzJfdCBudW1LZXlzID0gMDsKKyAgICAgICAgZXJyID0gb2JqLT5yZWFkSW50MzIoJm51bUtleXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgbnVtYmVyIG9mIGtleXMgc3RhdHVzLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBWZWN0b3I8QU1lZGlhRHJtS2V5U3RhdHVzPiBrZXlzU3RhdHVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiA+IGRhdGFQb2ludGVyczsKKyAgICAgICAgQU1lZGlhRHJtS2V5U3RhdHVzIGtleVN0YXR1czsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUtleXM7ICsraSkgeworICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLnB0ciA9IG51bGxwdHI7CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQubGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgaWRTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChpZFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gZGF0YShuZXcgdWludDhfdFtpZFNpemVdKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBvYmotPnJlYWQoZGF0YS5nZXQoKSwgaWRTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBrZXkgZGF0YSwgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5wdHIgPSBkYXRhLmdldCgpOworICAgICAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5sZW5ndGggPSBpZFNpemU7CisgICAgICAgICAgICAgICAgZGF0YVBvaW50ZXJzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2V5U3RhdHVzLmtleVR5cGUgPSBzdGF0aWNfY2FzdDxBTWVkaWFEcm1LZXlTdGF0dXNUeXBlPihvYmotPnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGtleXNTdGF0dXMucHVzaChrZXlTdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkgPSBvYmotPnJlYWRJbnQzMigpOworICAgICAgICAoKm1LZXlzQ2hhbmdlTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIGtleXNTdGF0dXMuYXJyYXkoKSwgbnVtS2V5cywgaGFzTmV3VXNhYmxlS2V5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEhhbmRsZXMgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBiZWxvdzoKKyAgICAvLyAgdHJhbnNsYXRlcyBEcm1QbHVnaW4gZXZlbnQgdHlwZXMgaW50byB0aGVpciBOREsgZXF1aXZhbGVudHMKICAgICBBTWVkaWFEcm1FdmVudFR5cGUgbmRrRXZlbnRUeXBlOwogICAgIHN3aXRjaChldmVudFR5cGUpIHsKICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOgpAQCAtOTcsMTkgKzE3MiwzMCBAQAogICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDoKICAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX1ZFTkRPUl9ERUZJTkVEOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uUmVjbGFpbWVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfU0VTU0lPTl9SRUNMQUlNRUQ7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGV2ZW50IERybVBsdWdpbjo6RXZlbnRUeXBlICVkLCBpZ25vcmVkIiwgKGludClldmVudFR5cGUpOwotICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgICgqbUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7Ci0KLSBjbGVhbnVwOgotICAgIGRlbGV0ZSBbXSBzZXNzaW9uSWQucHRyOwotICAgIGRlbGV0ZSBbXSBkYXRhOworICAgIGludDMyX3QgZGF0YVNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgIGlmIChkYXRhU2l6ZSA+IDApIHsKKyAgICAgICAgZGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKKyAgICAgICAgZXJyID0gb2JqLT5yZWFkKGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgKCptRXZlbnRMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgbmRrRXZlbnRUeXBlLCBleHRyYSwgZGF0YSwgZGF0YVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGV2ZW50IGRhdGEsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgW10gZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBwYXJjZWw6IGludmFsaWQgZXZlbnQgZGF0YSBzaXplPSVkIiwgZGF0YVNpemUpOworICAgIH0KIH0KIAotCiBleHRlcm4gIkMiIHsKIAogc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKQEAgLTE0OCw2ICsyMzQsMzkgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgYm9vbCBTaG91bGRHZXRBcHBQYWNrYWdlTmFtZSh2b2lkKSB7CisgICAgLy8gQ2hlY2sgd2hhdCB0aGlzIGRldmljZSdzIGZpcnN0IEFQSSBsZXZlbCB3YXMuCisgICAgaW50MzJfdCBmaXJzdEFwaUxldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgaWYgKGZpcnN0QXBpTGV2ZWwgPT0gMCkgeworICAgICAgICAvLyBGaXJzdCBBUEkgTGV2ZWwgaXMgMCBvbiBmYWN0b3J5IFJPTXMsIGJ1dCB3ZSBjYW4gYXNzdW1lIHRoZSBjdXJyZW50IFNESworICAgICAgICAvLyB2ZXJzaW9uIGlzIHRoZSBmaXJzdCBpZiBpdCdzIGEgZmFjdG9yeSBST00uCisgICAgICAgIGZpcnN0QXBpTGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8uYnVpbGQudmVyc2lvbi5zZGsiLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGZpcnN0QXBpTGV2ZWwgPj0gMjk7ICAvLyBBbmRyb2lkIFEKK30KKworc3RhdGljIHN0YXR1c190IEdldEFwcFBhY2thZ2VOYW1lKFN0cmluZzggKnBhY2thZ2VOYW1lKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNlcnZpY2VNYW5hZ2VyLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJwZXJtaXNzaW9uIikpOworCisgICAgc3A8SVBlcm1pc3Npb25Db250cm9sbGVyPiBwZXJtaXNzaW9uQ29udG9sID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOworICAgIGlmIChwZXJtaXNzaW9uQ29udG9sID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRvbC0+Z2V0UGFja2FnZXNGb3JVaWQoZ2V0dWlkKCksIHBhY2thZ2VzKTsKKworICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBnZXQgcGFja2FnZSBuYW1lIGZvciBjdXJyZW50IFVJRCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAqcGFja2FnZU5hbWUgPSBTdHJpbmc4KHBhY2thZ2VzWzBdKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXRpYyBzcDxJRHJtPiBDcmVhdGVEcm0oKSB7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5kcm0iKSk7CkBAIC0xNzIsOCArMjkxLDE2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFN0cmluZzggbnVsbFBhY2thZ2VOYW1lOwotICAgIHN0YXR1c190IGVyciA9IGRybS0+Y3JlYXRlUGx1Z2luKHV1aWQsIG51bGxQYWNrYWdlTmFtZSk7CisgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTsKKyAgICBpZiAoU2hvdWxkR2V0QXBwUGFja2FnZU5hbWUoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBHZXRBcHBQYWNrYWdlTmFtZSgmcGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gZHJtLT5jcmVhdGVQbHVnaW4odXVpZCwgcGFja2FnZU5hbWUpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE5MSwxMyArMzE4LDE4IEBACiAgICAgfQogCiAgICAgU3RyaW5nOCBtaW1lU3RyID0gbWltZVR5cGUgPyBTdHJpbmc4KG1pbWVUeXBlKSA6IFN0cmluZzgoIiIpOwotICAgIHJldHVybiBkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVTdHIpOworICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVTdHIsCisgICAgICAgICAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93biwgJmlzU3VwcG9ydGVkKTsKKyAgICByZXR1cm4gKHN0YXR1cyA9PSBPSykgJiYgaXNTdXBwb3J0ZWQ7CiB9CiAKIEVYUE9SVAogQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgewogICAgIEFNZWRpYURybSAqbU9iaiA9IG5ldyBBTWVkaWFEcm0oKTsKICAgICBtT2JqLT5tRHJtID0gQ3JlYXRlRHJtRnJvbVVVSUQodXVpZCk7CisKKyAgICBtT2JqLT5tTGlzdGVuZXIuY2xlYXIoKTsKICAgICByZXR1cm4gbU9iajsKIH0KIApAQCAtMjE2LDExICszNDgsNDcgQEAKICAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CiAgICAgfQotICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisKKyAgICBpZiAobU9iai0+bUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lci0+c2V0RXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICB9CiAgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisKKyAgICBpZiAobU9iai0+bUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lci0+c2V0RXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIH0KKyAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uS2V5c0NoYW5nZUxpc3RlbmVyKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRLZXlzQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgfQorICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KIAogc3RhdGljIGJvb2wgZmluZElkKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtQnl0ZUFycmF5ICZpZCwgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgJml0ZXIpIHsKICAgICBmb3IgKGl0ZXIgPSBtT2JqLT5tSWRzLmJlZ2luKCk7IGl0ZXIgIT0gbU9iai0+bUlkcy5lbmQoKTsgKytpdGVyKSB7CkBAIC0zMDksNiArNDc3LDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNTc2LDcgKzc0NSw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGI1ZTYwYTQuLmM4M2IyNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zMywzMSArMzQsMjkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfT0s7Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CiAgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CiB9OwogCitzcDxBQnVmZmVyPiBVMzJBcnJheVRvU2l6ZUJ1ZihzaXplX3QgbnVtU3ViU2FtcGxlcywgdWludDMyX3QgKmRhdGEpIHsKKyAgICBpZiAobnVtU3ViU2FtcGxlcyA+ICBTSVpFX01BWCAvIHNpemVvZihzaXplX3QpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBzaXplYnVmID0gbmV3IEFCdWZmZXIobnVtU3ViU2FtcGxlcyAqIHNpemVvZihzaXplX3QpKTsKKyAgICBzaXplX3QgKnNpemVzID0gKHNpemVfdCAqKXNpemVidWYtPmRhdGEoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgc2l6ZXMgIT0gTlVMTCAmJiBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIHNpemVzW2ldID0gZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHNpemVidWY7Cit9CisKIGV4dGVybiAiQyIgewogCiBFWFBPUlQKQEAgLTgyLDQ3ICs4MSwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNyZWF0ZSBodHRwIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlzW2ldKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgodmFsdWVzW2ldKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmksIG51bWhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7Ci0gICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOwotICAgIGlmIChlbnYgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZShwYXRoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIEphdmEgdGhyZWFkIik7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpOwotICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhSHR0cFNlcnZpY2UiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLAotICAgICAgICAgICAgImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyIpOwotICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpzdHJpbmcgamxvYyA9IGVudi0+TmV3U3RyaW5nVVRGKGxvY2F0aW9uKTsKLQotICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwgamxvYyk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihqbG9jKTsKLQotICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKLSAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgc2VydmljZSk7Ci0gICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBsb2NhdGlvbiwgTlVMTCk7Ci0gICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhtRGF0YSwgbG9jYXRpb24sIDAsIE5VTEwsIE5VTEwpOwogfQogCiBFWFBPUlQKQEAgLTM2Myw3ICszNTAsNyBAQAogICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmNyeXB0ZWRkYXRhLCAmY3J5cHRlZHNpemUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CisgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CiAKICAgICBjb25zdCB2b2lkICpjbGVhcmRhdGE7CiAgICAgc2l6ZV90IGNsZWFyc2l6ZTsKQEAgLTM5Nyw2ICszODQsMTYgQEAKICAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKICAgICB9CiAKKyAgICBpZiAoc2l6ZW9mKHVpbnQzMl90KSAhPSBzaXplb2Yoc2l6ZV90KSkgeworICAgICAgICBzcDxBQnVmZmVyPiBjbGVhcmJ1ZiAgID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY2xlYXJkYXRhKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY3J5cHRlZGJ1ZiA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNyeXB0ZWRkYXRhKTsKKyAgICAgICAgY2xlYXJkYXRhICAgPSBjbGVhcmJ1ZiAgICA9PSBOVUxMID8gTlVMTCA6IGNsZWFyYnVmLT5kYXRhKCk7CisgICAgICAgIGNyeXB0ZWRkYXRhID0gY3J5cHRlZGRhdGEgPT0gTlVMTCA/IE5VTEwgOiBjcnlwdGVkYnVmLT5kYXRhKCk7CisgICAgICAgIGlmKGNyeXB0ZWRkYXRhID09IE5VTEwgfHwgY2xlYXJkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCiAgICAgICAgICAgICBudW1TdWJTYW1wbGVzLAogICAgICAgICAgICAgKHVpbnQ4X3QqKSBrZXksCkBAIC00NzIsMTIgKzQ2OSwxNiBAQAogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwgbXBlZ1VzZXJEYXRhKTsKICAgICB9CiAKLSAgICByZXR1cm4gQU1FRElBX09LOwotfQorICAgIGNvbnN0IHZvaWQgKmF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXI7CisgICAgc2l6ZV90IGF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZERhdGEoCisgICAgICAgICAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmZGF0YVR5cGUsCisgICAgICAgICAgICAmYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlciwgJmF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXVkaW9QcmVzZW50YXRpb25zRGF0YSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyLCBhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGgpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYXVkaW9QcmVzZW50YXRpb25zRGF0YSk7CisgICAgfQogCi1FWFBPUlQKLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqIGV4KSB7Ci0gICAgZXgtPm1JbXBsLT5kaXNjb25uZWN0KCk7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKaW5kZXggZjMyYjgzZS4uNTExMzhjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0yMCw0MyArMjAsMjAgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBTdHJpbmc4IG1EZWJ1ZzsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Ci19OwotCiBleHRlcm4gIkMiIHsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgQUxPR1YoInByaXZhdGUgY3RvciIpOwotICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7Ci0gICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOwotICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKLSAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgfQotICAgIHJldHVybiBtRGF0YTsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKLSAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Ci19Ci0KLQogLyoKICAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKICAqLwpAQCAtNzQsNiArNTEsMjEgQEAKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5jbGVhcigpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgeworICAgIGlmICghdG8gfHwgIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgdG8tPm1Gb3JtYXQtPmNsZWFyKCk7CisgICAgdG8tPm1Gb3JtYXQtPmV4dGVuZChmcm9tLT5tRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiAKIEVYUE9SVAogY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKQEAgLTI1Niw3ICsyNDgsNyBAQAogfQogCiBFWFBPUlQKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKICAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAogICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwpAQCAtMjc1LDY1ICsyNjcsMTI0IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UID0gImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgPSAiYWFjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFID0gImFhYy1zYnItbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSA9ICJhbGJ1bSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCA9ICJhbGJ1bWFydCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCA9ICJhbGJ1bWFydGlzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgPSAiYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPID0gImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgPQorICAgICAgICAiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCA9ICJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEID0gImF1ZGlvLXNlc3Npb24taWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SID0gImF1dGhvciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgPSAiYml0cmF0ZS1tb2RlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFID0gImJpdHMtcGVyLXNhbXBsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgPSAiY2FwdHVyZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgPSAiY2R0cmFja251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFID0gImNvbG9yLXJhbmdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEID0gImNvbG9yLXN0YW5kYXJkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSID0gImNvbG9yLXRyYW5zZmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OID0gImNvbXBpbGF0aW9uIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFkgPSAiY29tcGxleGl0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiA9ICJjb21wb3NlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLXBsYWluLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgPSAiY3NkLWF2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyA9ICJjc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzID0gImQyNjMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSA9ICJkYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgPSAiZGlzY251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgPSAiY3JvcCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCA9ICJkaXNwbGF5LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIID0gImRpc3BsYXktd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZID0gImVuY29kZXItZGVsYXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HID0gImVuY29kZXItcGFkZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTID0gImVzZHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgPSAiZXhpZi1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFID0gImV4aWYtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgPSAiZnJhbWUtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFID0gImdlbnJlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUyA9ICJncmlkLWNvbHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTID0gImdyaWQtcm93cyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCA9ICJoYXB0aWMtY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUjEwX1BMVVNfSU5GTyA9ICJoZHIxMC1wbHVzLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgPSAiaXMtc3luYy1mcmFtZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSA9ICJsYXRlbmN5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMID0gImxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgPSAibG9vcCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCA9ICJseXJpY2lzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgPSAibWFudWZhY3R1cmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSA9ICJtYXgtYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVIgPSAibWF4LWZwcy10by1lbmNvZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggPSAicHNzaCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgPSAic2FyLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggPSAic2FyLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSA9ICJzZWkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUID0gInNsaWNlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDID0gInRodW1ibmFpbC1jc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUID0gInRodW1ibmFpbC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgPSAidGh1bWJuYWlsLXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIID0gInRodW1ibmFpbC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCA9ICJ0aWxlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIID0gInRpbGUtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUyA9ICJ0aW1lVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgPSAidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggZGZmYzRkNy4uZDE5OTJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI5LDIxICszMCwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CiAKICNpbmNsdWRlIDxqbmkuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYU11eGVyIHsKICAgICBzcDxNZWRpYU11eGVyPiBtSW1wbDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL09XTkVSUyBiL21lZGlhL25kay9PV05FUlMKaW5kZXggMTFlODM0MC4uOWRjNDQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL09XTkVSUworKysgYi9tZWRpYS9uZGsvT1dORVJTCkBAIC0xLDUgKzEsMyBAQAogbWFyY29uZUBnb29nbGUuY29tCiAjIEZvciBBSW1hZ2UvQUltYWdlUmVhZGVyCi1ldGFsdmFsYUBnb29nbGUuY29tCi15aW5jaGlheWVoQGdvb2dsZS5jb20KLXpoaWp1bmhlQGdvb2dsZS5jb20KK2luY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovY2FtZXJhL09XTkVSUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggMTlkZjc2MC4uM2U2MGRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC0zNiwxMyArMzYsMTIgQEAKICNpZm5kZWYgX05ES19JTUFHRV9ICiAjZGVmaW5lIF9OREtfSU1BR0VfSAogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlX2J1ZmZlci5oPgotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCiBfX0JFR0lOX0RFQ0xTCiAKQEAgLTUwMCw3ICs0OTksNTEgQEAKICAgICAgKiA8cD5XaGVuIGFuIHtAbGluayBBSW1hZ2V9IG9mIHRoaXMgZm9ybWF0IGlzIG9idGFpbmVkIGZyb20gYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0gb3IKICAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzKCl9IG1ldGhvZCB3aWxsIHJldHVybiB6ZXJvLjwvcD4KICAgICAgKi8KLSAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMgorICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyLAorCisgICAgLyoqCisgICAgICogQW5kcm9pZCBZOCBmb3JtYXQuCisgICAgICoKKyAgICAgKiA8cD5ZOCBpcyBhIHBsYW5hciBmb3JtYXQgY29tcHJpc2VkIG9mIGEgV3hIIFkgcGxhbmUgb25seSwgd2l0aCBlYWNoIHBpeGVsCisgICAgICogYmVpbmcgcmVwcmVzZW50ZWQgYnkgOCBiaXRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZm9ybWF0IGFzc3VtZXMKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmFuIGV2ZW4gd2lkdGg8L2xpPgorICAgICAqIDxsaT5hbiBldmVuIGhlaWdodDwvbGk+CisgICAgICogPGxpPmEgaG9yaXpvbnRhbCBzdHJpZGUgbXVsdGlwbGUgb2YgMTYgcGl4ZWxzPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxwcmU+IHNpemUgPSBzdHJpZGUgKiBoZWlnaHQgPC9wcmU+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIHtAbGluayBBSW1hZ2V9IG9iamVjdCBjYW4gcHJvdmlkZSBkYXRhCisgICAgICogaW4gdGhpcyBmb3JtYXQgZnJvbSBhIHtAbGluayBBQ2FtZXJhRGV2aWNlfSAoaWYgc3VwcG9ydGVkKSB0aHJvdWdoIGEKKyAgICAgKiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvYmplY3QuIFRoZSBudW1iZXIgb2YgcGxhbmVzIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXROdW1iZXJPZlBsYW5lc30gd2lsbCBhbHdheXMgYmUgMS4gVGhlIHBpeGVsIHN0cmlkZSByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0UGxhbmVQaXhlbFN0cmlkZX0gd2lsbCBhbHdheXMgYmUgMSwgYW5kIHRoZQorICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0UGxhbmVSb3dTdHJpZGV9IGRlc2NyaWJlZCB0aGUgdmVydGljYWwgbmVpZ2hib3JpbmcgcGl4ZWwgZGlzdGFuY2UKKyAgICAgKiAoaW4gYnl0ZXMpIGJldHdlZW4gYWRqYWNlbnQgcm93cy48L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBBSU1BR0VfRk9STUFUX1k4ID0gMHgyMDIwMzg1OSwKKworICAgIC8qKgorICAgICAqIENvbXByZXNzZWQgSEVJQyBmb3JtYXQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZvcm1hdCBkZWZpbmVzIHRoZSBIRUlDIGJyYW5kIG9mIEhpZ2ggRWZmaWNpZW5jeSBJbWFnZSBGaWxlCisgICAgICogRm9ybWF0IGFzIGRlc2NyaWJlZCBpbiBJU08vSUVDIDIzMDA4LTEyLjwvcD4KKyAgICAgKi8KKyAgICBBSU1BR0VfRk9STUFUX0hFSUMgPSAweDQ4NDU0OTQ2LAorCisgICAgLyoqCisgICAgICogRGVwdGggYXVnbWVudGVkIGNvbXByZXNzZWQgSlBFRyBmb3JtYXQuCisgICAgICoKKyAgICAgKiA8cD5KUEVHIGNvbXByZXNzZWQgbWFpbiBpbWFnZSBhbG9uZyB3aXRoIFhNUCBlbWJlZGRlZCBkZXB0aCBtZXRhZGF0YQorICAgICAqIGZvbGxvd2luZyBJU08gMTY2ODQtMToyMDExKEUpLjwvcD4KKyAgICAgKi8KKyAgICBBSU1BR0VfRk9STUFUX0RFUFRIX0pQRUcgPSAweDY5NjU2OTYzLAorCiB9OwogCiAvKioKQEAgLTUyOSw3ICs1NzIsNyBAQAogICoKICAqIEBwYXJhbSBpbWFnZSBUaGUge0BsaW5rIEFJbWFnZX0gdG8gYmUgZGVsZXRlZC4KICAqLwotdm9pZCBBSW1hZ2VfZGVsZXRlKEFJbWFnZSogaW1hZ2UpOwordm9pZCBBSW1hZ2VfZGVsZXRlKEFJbWFnZSogaW1hZ2UpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCB7QGxpbmsgQUltYWdlfS4KQEAgLTU0Myw3ICs1ODYsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVH0gaWYgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGdlbmVyYXRlZCB0aGlzCiAgKiAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGJlZW4gZGVsZXRlZC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRXaWR0aChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50MzJfdCogd2lkdGgpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFdpZHRoKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiB3aWR0aCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgaGVpZ2h0IG9mIHRoZSBpbnB1dCB7QGxpbmsgQUltYWdlfS4KQEAgLTU1Nyw3ICs2MDAsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVH0gaWYgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGdlbmVyYXRlZCB0aGlzCiAgKiAgICAgICAgICAgICAgICAgaW1hZ2UgaGFzIGJlZW4gZGVsZXRlZC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRIZWlnaHQoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL2ludDMyX3QqIGhlaWdodCk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0SGVpZ2h0KGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiBoZWlnaHQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC01NzMsNyArNjE2LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0Rm9ybWF0KGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiBmb3JtYXQpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldEZvcm1hdChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50MzJfdCogZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBjcm9wcGVkIHJlY3RhbmdsZSBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC01OTAsNyArNjMzLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0Q3JvcFJlY3QoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL0FJbWFnZUNyb3BSZWN0KiByZWN0KTsKK21lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRDcm9wUmVjdChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovQUltYWdlQ3JvcFJlY3QqIHJlY3QpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC02MTQsNyArNjU3LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0VGltZXN0YW1wKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQ2NF90KiB0aW1lc3RhbXBOcyk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0VGltZXN0YW1wKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQ2NF90KiB0aW1lc3RhbXBOcykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgbnVtYmVyIG9mIHBsYW5lcyBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC02MzIsNyArNjc1LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL2ludDMyX3QqIG51bVBsYW5lcyk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL2ludDMyX3QqIG51bVBsYW5lcykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbnB1dCB7QGxpbmsgQUltYWdlfS4KQEAgLTY2MCw3ICs3MDMsNyBAQAogICogICAgICAgICAgICAgICAgIGZvciBDUFUgYWNjZXNzLjwvbGk+PC91bD4KICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFBsYW5lUGl4ZWxTdHJpZGUoCi0gICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwgLypvdXQqL2ludDMyX3QqIHBpeGVsU3RyaWRlKTsKKyAgICAgICAgY29uc3QgQUltYWdlKiBpbWFnZSwgaW50IHBsYW5lSWR4LCAvKm91dCovaW50MzJfdCogcGl4ZWxTdHJpZGUpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIHJvdyBzdHJpZGUgb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgpAQCAtNjg3LDcgKzczMCw3IEBACiAgKiAgICAgICAgICAgICAgICAgZm9yIENQVSBhY2Nlc3MuPC9saT48L3VsPgogICovCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0UGxhbmVSb3dTdHJpZGUoCi0gICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwgLypvdXQqL2ludDMyX3QqIHJvd1N0cmlkZSk7CisgICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwgLypvdXQqL2ludDMyX3QqIHJvd1N0cmlkZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBHZXQgdGhlIGRhdGEgcG9pbnRlciBvZiB0aGUgaW5wdXQgaW1hZ2UgZm9yIGRpcmVjdCBhcHBsaWNhdGlvbiBhY2Nlc3MuCkBAIC03MTIsNyArNzU1LDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFBsYW5lRGF0YSgKICAgICAgICAgY29uc3QgQUltYWdlKiBpbWFnZSwgaW50IHBsYW5lSWR4LAotICAgICAgICAvKm91dCovdWludDhfdCoqIGRhdGEsIC8qb3V0Ki9pbnQqIGRhdGFMZW5ndGgpOworICAgICAgICAvKm91dCovdWludDhfdCoqIGRhdGEsIC8qb3V0Ki9pbnQqIGRhdGFMZW5ndGgpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIApAQCAtNzMyLDcgKzc3NSw3IEBACiAgKgogICogQHNlZSBzeW5jLmgKICAqLwotdm9pZCBBSW1hZ2VfZGVsZXRlQXN5bmMoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkKTsKK3ZvaWQgQUltYWdlX2RlbGV0ZUFzeW5jKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBHZXQgdGhlIGhhcmR3YXJlIGJ1ZmZlciBoYW5kbGUgb2YgdGhlIGlucHV0IGltYWdlIGludGVuZGVkIGZvciBHUFUgYW5kL29yIGhhcmR3YXJlIGFjY2Vzcy4KQEAgLTc2MCw3ICs4MDMsNyBAQAogICoKICAqIEBzZWUgQUltYWdlUmVhZGVyX0ltYWdlQ2FsbGJhY2sKICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9BSGFyZHdhcmVCdWZmZXIqKiBidWZmZXIpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9BSGFyZHdhcmVCdWZmZXIqKiBidWZmZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNTcxNDEwYi4uZTVkODYzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIF9OREtfSU1BR0VfUkVBREVSX0gKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCkBAIC04OCw3ICs5MSw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXcoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBtYXhJbWFnZXMsCi0gICAgICAgIC8qb3V0Ki9BSW1hZ2VSZWFkZXIqKiByZWFkZXIpOworICAgICAgICAvKm91dCovQUltYWdlUmVhZGVyKiogcmVhZGVyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIERlbGV0ZSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBhbmQgcmV0dXJuIGFsbCBpbWFnZXMgZ2VuZXJhdGVkIGJ5IHRoaXMgcmVhZGVyIHRvIHN5c3RlbS4KQEAgLTEwMCw3ICsxMDMsNyBAQAogICoKICAqIEBwYXJhbSByZWFkZXIgVGhlIGltYWdlIHJlYWRlciB0byBiZSBkZWxldGVkLgogICovCi12b2lkIEFJbWFnZVJlYWRlcl9kZWxldGUoQUltYWdlUmVhZGVyKiByZWFkZXIpOwordm9pZCBBSW1hZ2VSZWFkZXJfZGVsZXRlKEFJbWFnZVJlYWRlciogcmVhZGVyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEdldCBhIHtAbGluayBBTmF0aXZlV2luZG93fSB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb2R1Y2Uge0BsaW5rIEFJbWFnZX0gZm9yIHRoaXMgaW1hZ2UgcmVhZGVyLgpAQCAtMTE0LDcgKzExNyw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlYWRlciBvciB3aW5kb3cgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3coQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BTmF0aXZlV2luZG93Kiogd2luZG93KTsKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3coQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BTmF0aXZlV2luZG93Kiogd2luZG93KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSB7QGxpbmsgQUltYWdlfSBnZW5lcmF0ZWQgYnkgdGhpcyByZWFkZXIsIGluIHBpeGVscy4KQEAgLTEzMCw3ICsxMzMsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZWFkZXIgb3Igd2lkdGggaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaWR0aChjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIHdpZHRoKTsKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaWR0aChjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIHdpZHRoKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBkZWZhdWx0IGhlaWdodCBvZiB0aGUge0BsaW5rIEFJbWFnZX0gZ2VuZXJhdGVkIGJ5IHRoaXMgcmVhZGVyLCBpbiBwaXhlbHMuCkBAIC0xNDYsNyArMTQ5LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIG9yIGhlaWdodCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldEhlaWdodChjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIGhlaWdodCk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0SGVpZ2h0KGNvbnN0IEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovaW50MzJfdCogaGVpZ2h0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBmb3JtYXQgb2YgdGhlIHtAbGluayBBSW1hZ2V9IGdlbmVyYXRlZCBieSB0aGlzIHJlYWRlci4KQEAgLTE1OSw3ICsxNjIsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZWFkZXIgb3IgZm9ybWF0IGlzIE5VTEwuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0Rm9ybWF0KGNvbnN0IEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovaW50MzJfdCogZm9ybWF0KTsKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRGb3JtYXQoY29uc3QgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9pbnQzMl90KiBmb3JtYXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnRseSBhY3F1aXJlZCB7QGxpbmsgQUltYWdlfXMgb2YgdGhpcyByZWFkZXIuCkBAIC0xNzIsNyArMTc1LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIG9yIG1heEltYWdlcyBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldE1heEltYWdlcyhjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIG1heEltYWdlcyk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0TWF4SW1hZ2VzKGNvbnN0IEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovaW50MzJfdCogbWF4SW1hZ2VzKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEFjcXVpcmUgdGhlIG5leHQge0BsaW5rIEFJbWFnZX0gZnJvbSB0aGUgaW1hZ2UgcmVhZGVyJ3MgcXVldWUuCkBAIC0yMDgsNyArMjExLDcgQEAKICAqCiAgKiBAc2VlIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2UKICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKIApAQCAtMjUyLDcgKzI1NSw3IEBACiAgKgogICogQHNlZSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZQogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlKEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZShBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAKIC8qKgpAQCAtMjk2LDcgKzI5OSw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZWFkZXIgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKAotICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIqIGxpc3RlbmVyKTsKKyAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyKiBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCkBAIC0zNjUsNyArMzY4LDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgaW50MzJfdCBtYXhJbWFnZXMsCi0gICAgICAgIC8qb3V0Ki8gQUltYWdlUmVhZGVyKiogcmVhZGVyKTsKKyAgICAgICAgLypvdXQqLyBBSW1hZ2VSZWFkZXIqKiByZWFkZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQWNxdWlyZSB0aGUgbmV4dCB7QGxpbmsgQUltYWdlfSBmcm9tIHRoZSBpbWFnZSByZWFkZXIncyBxdWV1ZSBhc3luY2hyb25vdXNseS4KQEAgLTM4NCw3ICszODcsNyBAQAogICogQHNlZSBzeW5jX2dldF9mZW5jZV9pbmZvCiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMoCi0gICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGFjcXVpcmVGZW5jZUZkKTsKKyAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogYWNxdWlyZUZlbmNlRmQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQWNxdWlyZSB0aGUgbGF0ZXN0IHtAbGluayBBSW1hZ2V9IGZyb20gdGhlIGltYWdlIHJlYWRlcidzIHF1ZXVlIGFzeW5jaHJvbm91c2x5LCBkcm9wcGluZyBvbGRlcgpAQCAtNDA0LDcgKzQwNyw3IEBACiAgKiBAc2VlIHN5bmNfZ2V0X2ZlbmNlX2luZm8KICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZUFzeW5jKAotICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBhY3F1aXJlRmVuY2VGZCk7CisgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGFjcXVpcmVGZW5jZUZkKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogLyoqCiAgKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGlzIGFib3V0IHRvIHJlbW92ZSBhIGJ1ZmZlci4KICAqCkBAIC00NTksNyArNDYyLDI0IEBACiAgKiBAc2VlIEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcgogICovCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKAotICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciogbGlzdGVuZXIpOworICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciogbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisvKgorICogR2V0IHRoZSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUgQU5hdGl2ZVdpbmRvdyBvd25lZCBieSB0aGUKKyAqIEFJbWFnZVJlYWRlciBwcm92aWRlZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gaGFuZGxlIFRoZSBvdXRwdXQgbmF0aXZlX2hhbmRsZV90LiBUaGlzIG5hdGl2ZSBoYW5kbGUgaXMgb3duZWQgYnkKKyAqICAgICAgICAgICAgICAgdGhpcyBpbWFnZSByZWFkZXIuCisgKgorICogQHJldHVybiBBTUVESUFfT0sgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICogICAgICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgcmVhZGVyIG9yIGhhbmRsZSBhcmUgTlVMTC4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gaWYgc29tZSBvdGhlciBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKyNlbmRpZgogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCBmNGE1MWQwLi5iM2VlODUzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisgKiBAYWRkdG9ncm91cCBNZWRpYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka01lZGlhQ29kZWMuaAorICovCisKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgogICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgpAQCAtMTE5LDIzICsxMjgsMjMgQEAKICAqIFdoZW4gY29uZmlndXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGUgY29kZWMgYXMgYW4KICAqIGVuY29kZXIgb3IgZGVjb2Rlci4KICAqLwotQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQ3JlYXRlIGNvZGVjIGJ5IG1pbWUgdHlwZS4gTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhpcywgc3BlY2lmeWluZyBhCiAgKiBtaW1lIHR5cGUgb2J0YWluZWQgZnJvbSBtZWRpYSBleHRyYWN0b3IuCiAgKi8KLUFNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSk7CitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQ3JlYXRlIGVuY29kZXIgYnkgbmFtZS4KICAqLwotQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKTsKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBkZWxldGUgdGhlIGNvZGVjIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZGVsZXRlKEFNZWRpYUNvZGVjKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIENvbmZpZ3VyZSB0aGUgY29kZWMuIEZvciBkZWNvZGluZyB5b3Ugd291bGQgdHlwaWNhbGx5IGdldCB0aGUgZm9ybWF0IGZyb20gYW4gZXh0cmFjdG9yLgpAQCAtMTQ1LDQzICsxNTQsNDMgQEAKICAgICAgICAgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQsCiAgICAgICAgIEFOYXRpdmVXaW5kb3cqIHN1cmZhY2UsCiAgICAgICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvLAotICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgICAgIHVpbnQzMl90IGZsYWdzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0YXJ0IHRoZSBjb2RlYy4gQSBjb2RlYyBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkLCBhbmQgbXVzdCBiZSBzdGFydGVkCiAgKiBiZWZvcmUgYnVmZmVycyBjYW4gYmUgc2VudCB0byBpdC4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMqKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0YXJ0KEFNZWRpYUNvZGVjKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTdG9wIHRoZSBjb2RlYy4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qCiAgKiBGbHVzaCB0aGUgY29kZWMncyBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgaW5kaWNlcyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gY2FsbHMgdG8KICAqIEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlciBhbmQgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlciBiZWNvbWUgaW52YWxpZC4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZmx1c2goQU1lZGlhQ29kZWMqKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBHZXQgYW4gaW5wdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KICAqIGRlcXVldWVJbnB1dEJ1ZmZlciwgYW5kIG5vdCB5ZXQgcXVldWVkLgogICovCi11aW50OF90KiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEdldCBhbiBvdXRwdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KICAqIGRlcXVldWVPdXRwdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KICAqLwotdWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7Cit1aW50OF90KiBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlci4gQW4gYXBwIHdpbGwgdHlwaWNhbGx5IHVzZSB0aGlzIHdpdGgKICAqIGdldElucHV0QnVmZmVyKCkgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLCB0aGVuIGNvcHkgdGhlIGRhdGEgdG8gYmUgZW5jb2RlZCBvciBkZWNvZGVkCiAgKiBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjLgogICovCi1zc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIGludDY0X3QgdGltZW91dFVzKTsKK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgaW50NjRfdCB0aW1lb3V0VXMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qCiAgKiBfX1VTRV9GSUxFX09GRlNFVDY0IGNoYW5nZXMgdGhlIHR5cGUgb2Ygb2ZmX3QgaW4gTFAzMiwgd2hpY2ggY2hhbmdlcyB0aGUgQUJJCkBAIC0yMTIsNyArMjIxLDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZmZfdF9jb21wYXQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KQEAgLTIyMCw3ICsyMjksNyBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vZmZfdF9jb21wYXQgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjdW5kZWYgX29mZl90X2NvbXBhdAogCkBAIC0yMjgsMjEgKzIzNywxNSBAQAogICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyIG9mIHByb2Nlc3NlZCBkYXRhLgogICovCiBzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCi0gICAgICAgIGludDY0X3QgdGltZW91dFVzKTsKLUFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjKik7Ci0KLS8qKgotICogR2V0IGZvcm1hdCBvZiB0aGUgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KLSAqIGRlcXVldWVPdXRwdXRCdWZmZXIuCi0gKi8KLUFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRm9ybWF0KEFNZWRpYUNvZGVjKiwgc2l6ZV90IGluZGV4KTsKKyAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogSWYgeW91IGFyZSBkb25lIHdpdGggYSBidWZmZXIsIHVzZSB0aGlzIGNhbGwgdG8gcmV0dXJuIHRoZSBidWZmZXIgdG8KICAqIHRoZSBjb2RlYy4gSWYgeW91IHByZXZpb3VzbHkgc3BlY2lmaWVkIGEgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMKICAqIHZpZGVvIGRlY29kZXIgeW91IGNhbiBvcHRpb25hbGx5IHJlbmRlciB0aGUgYnVmZmVyLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIER5bmFtaWNhbGx5IHNldHMgdGhlIG91dHB1dCBzdXJmYWNlIG9mIGEgY29kZWMuCkBAIC0yNTQsNyArMjU3LDcgQEAKICAqCiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5zZXRPdXRwdXRTdXJmYWNlLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlKEFNZWRpYUNvZGVjKiwgQU5hdGl2ZVdpbmRvdyogc3VyZmFjZSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlKEFNZWRpYUNvZGVjKiwgQU5hdGl2ZVdpbmRvdyogc3VyZmFjZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byB1cGRhdGUgaXRzIHN1cmZhY2UgdGltZXN0YW1wCkBAIC0yNjUsNyArMjY4LDcgQEAKICAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCi0gICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNgogCkBAIC0yODEsNyArMjg0LDcgQEAKICAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLmNyZWF0ZUlucHV0U3VyZmFjZS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIEFOYXRpdmVXaW5kb3cgKipzdXJmYWNlKTsKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBBTmF0aXZlV2luZG93ICoqc3VyZmFjZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBDcmVhdGVzIGEgcGVyc2lzdGVudCBTdXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGlucHV0IHRvIGVuY29kZXIKQEAgLTI5Nyw3ICszMDAsNyBAQAogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyAqKnN1cmZhY2UpOworICAgICAgICBBTmF0aXZlV2luZG93ICoqc3VyZmFjZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBTZXQgYSBwZXJzaXN0ZW50LXN1cmZhY2UgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgaW5wdXQgdG8gZW5jb2RlciwgaW4gcGxhY2Ugb2YgaW5wdXQgYnVmZmVycwpAQCAtMzEwLDcgKzMxMyw3IEBACiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5zZXRJbnB1dFN1cmZhY2UuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldElucHV0U3VyZmFjZSgKLSAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBBTmF0aXZlV2luZG93ICpzdXJmYWNlKTsKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBBTmF0aXZlV2luZG93ICpzdXJmYWNlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFNpZ25hbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGNvZGVjIGluc3RhbmNlLgpAQCAtMzIxLDcgKzMyNCw3IEBACiAgKiBOT1RFOiBTb21lIG9mIHRoZXNlIHBhcmFtZXRlciBjaGFuZ2VzIG1heSBzaWxlbnRseSBmYWlsIHRvIGFwcGx5LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzKAotICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIGNvbnN0IEFNZWRpYUZvcm1hdCogcGFyYW1zKTsKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBjb25zdCBBTWVkaWFGb3JtYXQqIHBhcmFtcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBTaWduYWxzIGVuZC1vZi1zdHJlYW0gb24gaW5wdXQuIEVxdWl2YWxlbnQgdG8gc3VibWl0dGluZyBhbiBlbXB0eSBidWZmZXIgd2l0aApAQCAtMzM3LDIzICszNDAsMjkgQEAKICAqCiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5zaWduYWxFbmRPZklucHV0U3RyZWFtLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zaWduYWxFbmRPZklucHV0U3RyZWFtKEFNZWRpYUNvZGVjICptRGF0YSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zaWduYWxFbmRPZklucHV0U3RyZWFtKEFNZWRpYUNvZGVjICptRGF0YSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CiAKIC8qKgorICogR2V0IGZvcm1hdCBvZiB0aGUgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVPdXRwdXRCdWZmZXIuCisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRm9ybWF0KEFNZWRpYUNvZGVjKiwgc2l6ZV90IGluZGV4KSBfX0lOVFJPRFVDRURfSU4oMjgpOworCisvKioKICAqIEdldCB0aGUgY29tcG9uZW50IG5hbWUuIElmIHRoZSBjb2RlYyB3YXMgY3JlYXRlZCBieSBjcmVhdGVEZWNvZGVyQnlUeXBlCiAgKiBvciBjcmVhdGVFbmNvZGVyQnlUeXBlLCB3aGF0IGNvbXBvbmVudCBpcyBjaG9zZW4gaXMgbm90IGtub3duIGJlZm9yZWhhbmQuCiAgKiBDYWxsZXIgc2hhbGwgY2FsbCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZSB0byBmcmVlIHRoZSByZXR1cm5lZCBwb2ludGVyLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19nZXROYW1lKEFNZWRpYUNvZGVjKiwgY2hhcioqIG91dF9uYW1lKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2dldE5hbWUoQU1lZGlhQ29kZWMqLCBjaGFyKiogb3V0X25hbWUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogRnJlZSB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgbmFtZSB3aGljaCBpcyByZXR1cm5lZCBieSBBTWVkaWFDb2RlY19nZXROYW1lLgogICovCi12b2lkIEFNZWRpYUNvZGVjX3JlbGVhc2VOYW1lKEFNZWRpYUNvZGVjKiwgY2hhciogbmFtZSk7Cit2b2lkIEFNZWRpYUNvZGVjX3JlbGVhc2VOYW1lKEFNZWRpYUNvZGVjKiwgY2hhciogbmFtZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGZvciBhY3Rpb25hYmxlIEFNZWRpYUNvZGVjIGV2ZW50cy4KQEAgLTM3NywzMiArMzg2LDMyIEBACiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrKAogICAgICAgICBBTWVkaWFDb2RlYyosCiAgICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisgICAgICAgIHZvaWQgKnVzZXJkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJlbGVhc2UgdGhlIGNyeXB0byBpZiBhcHBsaWNhYmxlLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBDYWxsIHRoaXMgYWZ0ZXIgQU1lZGlhQ29kZWNfY29uZmlndXJlKCkgcmV0dXJucyBzdWNjZXNzZnVsbHkgdG8gZ2V0IHRoZSBpbnB1dAogICogZm9ybWF0IGFjY2VwdGVkIGJ5IHRoZSBjb2RlYy4gRG8gdGhpcyB0byBkZXRlcm1pbmUgd2hhdCBvcHRpb25hbCBjb25maWd1cmF0aW9uCiAgKiBwYXJhbWV0ZXJzIHdlcmUgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYy4KICAqLwotQU1lZGlhRm9ybWF0KiBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdChBTWVkaWFDb2RlYyopOworQU1lZGlhRm9ybWF0KiBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdChBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2RlYyBjYW5ub3QgcHJvY2VlZCBmdXJ0aGVyLCBidXQgY2FuIGJlIHJlY292ZXJlZCBieSBzdG9wcGluZywKICAqIGNvbmZpZ3VyaW5nLCBhbmQgc3RhcnRpbmcgYWdhaW4uCiAgKi8KLWJvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoaW50MzJfdCBhY3Rpb25Db2RlKTsKK2Jvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoaW50MzJfdCBhY3Rpb25Db2RlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgZXJyb3IgaXMgYSB0cmFuc2llbnQgaXNzdWUsIHBlcmhhcHMgZHVlIHRvCiAgKiByZXNvdXJjZSBjb25zdHJhaW50cywgYW5kIHRoYXQgdGhlIG1ldGhvZCAob3IgZW5jb2RpbmcvZGVjb2RpbmcpIG1heSBiZQogICogcmV0cmllZCBhdCBhIGxhdGVyIHRpbWUuCiAgKi8KLWJvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGludDMyX3QgYWN0aW9uQ29kZSk7Citib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudChpbnQzMl90IGFjdGlvbkNvZGUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIApAQCAtNDM4LDU0ICs0NDcsNTYgQEAKICAgICAgICAgdWludDhfdCBpdlsxNl0sCiAgICAgICAgIGNyeXB0b2luZm9fbW9kZV90IG1vZGUsCiAgICAgICAgIHNpemVfdCAqY2xlYXJieXRlcywKLSAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcyk7CisgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogZGVsZXRlIGFuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBjcmVhdGVkIHByZXZpb3VzbHkgd2l0aCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3LCBvcgogICogb2J0YWluZWQgZnJvbSBBTWVkaWFFeHRyYWN0b3IKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZShBTWVkaWFDb2RlY0NyeXB0b0luZm8qKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZXQgdGhlIGNyeXB0byBwYXR0ZXJuIG9uIGFuIEFNZWRpYUNyeXB0b0luZm8gb2JqZWN0CiAgKi8KIHZvaWQgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX3NldFBhdHRlcm4oCiAgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqaW5mbywKLSAgICAgICAgY3J5cHRvaW5mb19wYXR0ZXJuX3QgKnBhdHRlcm4pOworICAgICAgICBjcnlwdG9pbmZvX3BhdHRlcm5fdCAqcGF0dGVybikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBUaGUgbnVtYmVyIG9mIHN1YnNhbXBsZXMgdGhhdCBtYWtlIHVwIHRoZSBidWZmZXIncyBjb250ZW50cy4KICAqLwotc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQSAxNi1ieXRlIG9wYXF1ZSBrZXkKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQSAxNi1ieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRJVihBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbiB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsCiAgKiBvbmUgb2YgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUiBvciBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIuCiAgKi8KLWNyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworY3J5cHRvaW5mb19tb2RlX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBUaGUgbnVtYmVyIG9mIGxlYWRpbmcgdW5lbmNyeXB0ZWQgYnl0ZXMgaW4gZWFjaCBzdWJzYW1wbGUuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHNpemVfdCAqZHN0KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHNpemVfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFRoZSBudW1iZXIgb2YgdHJhaWxpbmcgZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHNpemVfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSAorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCmluZGV4IGQzMWRiZGMuLmJjZGY5YTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaApAQCAtMTQsNiArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorICogQGFkZHRvZ3JvdXAgTWVkaWEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtNZWRpYUNyeXB0by5oCisgKi8KIAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCkBAIC00MSwxNiArNDksMTggQEAKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCi1ib29sIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBBTWVkaWFVVUlEIHV1aWQpOworYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi1ib29sIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciAqbWltZSk7Citib29sIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciAqbWltZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpOworQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLXZvaWQgQU1lZGlhQ3J5cHRvX2RlbGV0ZShBTWVkaWFDcnlwdG8qIGNyeXB0byk7Cit2b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IDllMmUzNTEuLjE2YjFlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC00MywxNCArNDMsOSBAQAogLyoKICAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCiAgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKLSAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5Ci0gKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSAqCi0gKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAotICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQotICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKLSAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKLSAqIGZyYW1ld29yay4KKyAqIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIHxjbG9zZXwgY2FuIGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUKKyAqIHRocmVhZCBpbnZva2luZyB8cmVhZEF0fC4gQXMgc3VjaCwgdGhlIEltcGxlbWVudGF0aW9ucyBvZiBBTWVkaWFEYXRhU291cmNlIGNhbGxiYWNrcworICogbXVzdCBiZSB0aHJlYWRzYWZlLgogICovCiAKIC8qKgpAQCAtNzQsOSArNjksMTkgQEAKIHR5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSh2b2lkICp1c2VyZGF0YSk7CiAKIC8qKgotICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB8Y2xvc2V8IGlzIGNhbGxlZAotICogbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlLgorICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZAorICogcmVzb3VyY2VzLgorICoKKyAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB0aGUgZmlyc3QgfGNsb3NlfCBpcworICogY2FsbGVkLCBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UgZXhjZXB0CisgKiBmb3IgfGNsb3NlfCBpdHNlbGYuCisgKgorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIGFsbG93cyByZWFkQXQgY2FsbHMgdGhhdCB3ZXJlIGJsb2NrZWQgd2FpdGluZworICogZm9yIEkvTyBkYXRhIHRvIHJldHVybiBwcm9tcHRseS4KKyAqCisgKiBXaGVuIHVzaW5nIEFNZWRpYURhdGFTb3VyY2UgYXMgaW5wdXQgdG8gQU1lZGlhRXh0cmFjdG9yLCBjbG9zaW5nCisgKiBoYXMgdGhlIGVmZmVjdCBvZiB1bmJsb2NraW5nIHNsb3cgcmVhZHMgaW5zaWRlIG9mIHNldERhdGFTb3VyY2UKKyAqIGFuZCByZWFkU2FtcGxlRGF0YS4KICAqLwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRGF0YVNvdXJjZUNsb3NlKSh2b2lkICp1c2VyZGF0YSk7CiAKQEAgLTg0LDE5ICs4OSw1MSBAQAogICogQ3JlYXRlIG5ldyBtZWRpYSBkYXRhIHNvdXJjZS4gUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uCiAgKiBmb3IgdGhlIG5ldyBkYXRhIHNvdXJjZSBvYmplY3QgZmFpbHMuCiAgKi8KLUFNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKKyAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBSZXR1cm4gLTEgd2hlbiBzdWNoIGFuIGVzdGltYXRlIGlzIG5vdCBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBkYXRhIHNvdXJjZS4gUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmb3IgdGhlIG5ldyBkYXRhIHNvdXJjZSBvYmplY3QgZmFpbHMuCisgKgorICogU2V0IHRoZSB8dXJpfCBmcm9tIHdoaWNoIHRoZSBkYXRhIHNvdXJjZSB3aWxsIHJlYWQsCisgKiBwbHVzIGFkZGl0aW9uYWwgaHR0cCBoZWFkZXJzIHdoZW4gaW5pdGlhdGluZyB0aGUgcmVxdWVzdC4KKyAqCisgKiBIZWFkZXJzIHdpbGwgY29udGFpbiBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gfGtleV92YWx1ZXN8CisgKiBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgKgorICoga2V5X3ZhbHVlc1swXTprZXlfdmFsdWVzWzFdCisgKiBrZXlfdmFsdWVzWzJdOmtleV92YWx1ZXNbM10KKyAqIC4uLgorICoga2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMl06a2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMiArIDFdCisgKgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaShjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KIAogLyoqCiAgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCiAgKi8KLXZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSopOwordm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgYW4gdXNlciBwcm92aWRlZCBvcGFxdWUgaGFuZGxlLiBUaGlzIG9wYXF1ZSBoYW5kbGUgaXMgcGFzc2VkIGFzCiAgKiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGRhdGEgc291cmNlIGNhbGxiYWNrcy4KICAqLwogdm9pZCBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKAotICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwgdm9pZCAqdXNlcmRhdGEpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwgdm9pZCAqdXNlcmRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgcmFuZG9tIGFjY2VzcyBtZWRpYSBkYXRhIHRvIHRoZQpAQCAtMTExLDcgKzE0OCw3IEBACiAgKi8KIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQoCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAotICAgICAgICBBTWVkaWFEYXRhU291cmNlUmVhZEF0KTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzb3VyY2UgdG8gdGhlCkBAIC0xMjIsNyArMTU5LDcgQEAKICAqLwogdm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUoCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAotICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSk7CisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFNldCBhIGN1c3RvbSBjYWxsYmFjayB0byByZWNlaXZlIHNpZ25hbCBmcm9tIHRoZSBOREsgbWVkaWEgZnJhbWV3b3JrCkBAIC0xMzMsMTAgKzE3MCwzNCBAQAogICovCiB2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UoCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAotICAgICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKICNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VDbG9zZSBmb3IKKyAqIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UqKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldCBhIGN1c3RvbSBjYWxsYmFjayBmb3Igc3VwcGx5aW5nIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGJ5dGVzCisgKiB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZSBzdGFydGluZyBhdCBhbiBvZmZzZXQgd2l0aG91dAorICogYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUKKyAqIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfREFUQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAppbmRleCA5ZTlmNGMzLi4yZTQzOGQ5IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvKioKKyAqIEBhZGR0b2dyb3VwIE1lZGlhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrTWVkaWFEcm0uaAorICovCisKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgogICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgpAQCAtNDcsNiArNTYsNyBAQAogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7CiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlJZDsKIAogdHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CiAgICAgLyoqCkBAIC03Miw1OSArODIsMTggQEAKICAgICAgKiBUaGlzIGV2ZW50IG1heSBpbmRpY2F0ZSBzb21lIHNwZWNpZmljIHZlbmRvci1kZWZpbmVkIGNvbmRpdGlvbiwgc2VlIHlvdXIKICAgICAgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscwogICAgICAqLwotICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNAorICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNCwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgaW5kaWNhdGVzIHRoYXQgYSBzZXNzaW9uIG9wZW5lZCBieSB0aGUgYXBwIGhhcyBiZWVuIHJlY2xhaW1lZAorICAgICAqIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorICAgICAqLworICAgIEVWRU5UX1NFU1NJT05fUkVDTEFJTUVEID0gNSwKIH0gQU1lZGlhRHJtRXZlbnRUeXBlOwogCi10eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCi0gICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCi0vKioKLSAqIFF1ZXJ5IGlmIHRoZSBnaXZlbiBzY2hlbWUgaWRlbnRpZmllZCBieSBpdHMgVVVJRCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGFuZAotICogd2hldGhlciB0aGUgZHJtIHBsdWdpbiBpcyBhYmxlIHRvIGhhbmRsZSB0aGUgbWVkaWEgY29udGFpbmVyIGZvcm1hdCBzcGVjaWZpZWQgYnkgbWltZVR5cGUuCi0gKgotICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCi0gKiBtaW1lVHlwZSBpcyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtZWRpYSBjb250YWluZXIsIGUuZy4gInZpZGVvL21wNCIuICBJZiBtaW1lVHlwZQotICogaXMgbm90IGtub3duIG9yIHJlcXVpcmVkLCBpdCBjYW4gYmUgcHJvdmlkZWQgYXMgTlVMTC4KLSAqLwotYm9vbCBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCAqdXVpZCwgY29uc3QgY2hhciAqbWltZVR5cGUpOwotCi0vKioKLSAqIENyZWF0ZSBhIE1lZGlhRHJtIGluc3RhbmNlIGZyb20gYSBVVUlECi0gKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KLSAqLwotQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IHVpbnQ4X3QgKnV1aWQpOwotCi0vKioKLSAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QKLSAqLwotdm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKik7Ci0KLS8qKgotICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXZlbnQgb2NjdXJzCi0gKgotICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50Ci0gKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtICosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0vKioKLSAqIE9wZW4gYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBNZWRpYURybSBvYmplY3QuICBBIHNlc3Npb24gSUQgaXMgcmV0dXJuZWQuCi0gKgotICogcmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcHJvdmlzaW9uaW5nIGlzIG5lZWRlZAotICogcmV0dXJucyBNRURJQURSTV9SRVNPVVJDRV9CVVNZX0VSUk9SIGlmIHJlcXVpcmVkIHJlc291cmNlcyBhcmUgaW4gdXNlCi0gKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYURybV9vcGVuU2Vzc2lvbihBTWVkaWFEcm0gKiwgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOwotCi0vKioKLSAqIENsb3NlIGEgc2Vzc2lvbiBvbiB0aGUgTWVkaWFEcm0gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkCi0gKiB3aXRoIEFNZWRpYURybV9vcGVuU2Vzc2lvbi4KLSAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOwotCiB0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7CiAgICAgLyoqCi0gICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvbmxpbmUgdXNlLCB0aGV5IHdpbGwKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCiAgICAgICogbm90IGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHN1YnNlcXVlbnQgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkCiAgICAgICogdG8gYSBuZXR3b3JrLgogICAgICAqLwpAQCAtMTUwLDYgKzExOSwxMTYgQEAKICAgICBjb25zdCBjaGFyICptVmFsdWU7CiB9IEFNZWRpYURybUtleVZhbHVlOwogCit0eXBlZGVmIGVudW0gQU1lZGlhS2V5U3RhdHVzVHlwZSB7CisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBjdXJyZW50bHkgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YS4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfVVNBQkxFLAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBubyBsb25nZXIgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YSBiZWNhdXNlIGl0cyBleHBpcmF0aW9uCisgICAgICogdGltZSBoYXMgcGFzc2VkLgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9FWFBJUkVELAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBub3QgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBpdHMgb3V0cHV0CisgICAgICogcmVxdWlyZW1lbnRzIGNhbm5vdCBjdXJyZW50bHkgYmUgbWV0LgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9PVVRQVVROT1RBTExPV0VELAorCisgICAgLyoqCisgICAgICogVGhlIHN0YXR1cyBvZiB0aGUga2V5IGlzIG5vdCB5ZXQga25vd24gYW5kIGlzIGJlaW5nIGRldGVybWluZWQuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX1NUQVRVU1BFTkRJTkcsCisKKyAgICAvKioKKyAgICAgKiBUaGUga2V5IGlzIG5vdCBjdXJyZW50bHkgdXNhYmxlIHRvIGRlY3J5cHQgbWVkaWEgZGF0YSBiZWNhdXNlIG9mIGFuCisgICAgICogaW50ZXJuYWwgZXJyb3IgaW4gcHJvY2Vzc2luZyB1bnJlbGF0ZWQgdG8gaW5wdXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfSU5URVJOQUxFUlJPUiwKKworfSBBTWVkaWFEcm1LZXlTdGF0dXNUeXBlOworCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm1LZXlTdGF0dXMgeworICAgIEFNZWRpYURybUtleUlkIGtleUlkOworICAgIEFNZWRpYURybUtleVN0YXR1c1R5cGUga2V5VHlwZTsKK30gQU1lZGlhRHJtS2V5U3RhdHVzOworCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIpKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwgY29uc3QgQU1lZGlhRHJtS2V5U3RhdHVzICprZXlTdGF0dXMsCisgICAgICAgIHNpemVfdCBudW1LZXlzLCBib29sIGhhc05ld1VzYWJsZUtleSk7CisKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKKworLyoqCisgKiBRdWVyeSBpZiB0aGUgZ2l2ZW4gc2NoZW1lIGlkZW50aWZpZWQgYnkgaXRzIFVVSUQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBhbmQKKyAqIHdoZXRoZXIgdGhlIGRybSBwbHVnaW4gaXMgYWJsZSB0byBoYW5kbGUgdGhlIG1lZGlhIGNvbnRhaW5lciBmb3JtYXQgc3BlY2lmaWVkIGJ5IG1pbWVUeXBlLgorICoKKyAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgorICogbWltZVR5cGUgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLCBlLmcuICJ2aWRlby9tcDQiLiAgSWYgbWltZVR5cGUKKyAqIGlzIG5vdCBrbm93biBvciByZXF1aXJlZCwgaXQgY2FuIGJlIHByb3ZpZGVkIGFzIE5VTEwuCisgKi8KK2Jvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIENyZWF0ZSBhIE1lZGlhRHJtIGluc3RhbmNlIGZyb20gYSBVVUlECisgKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KKyAqLworQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IHVpbnQ4X3QgKnV1aWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CisKKy8qKgorICogUmVsZWFzZSBhIE1lZGlhRHJtIG9iamVjdAorICovCit2b2lkIEFNZWRpYURybV9yZWxlYXNlKEFNZWRpYURybSAqKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV4cGlyYXRpb24gdXBkYXRlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBzdGF0dXMgY2hhbmdlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKKyAqIHJldHVybnMgTUVESUFEUk1fUkVTT1VSQ0VfQlVTWV9FUlJPUiBpZiByZXF1aXJlZCByZXNvdXJjZXMgYXJlIGluIHVzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIENsb3NlIGEgc2Vzc2lvbiBvbiB0aGUgTWVkaWFEcm0gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkCisgKiB3aXRoIEFNZWRpYURybV9vcGVuU2Vzc2lvbi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CisKIC8qKgogICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCiAgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KQEAgLTE5OSw3ICsyNzgsNyBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKICAgICAgICAgY29uc3QgdWludDhfdCAqaW5pdCwgc2l6ZV90IGluaXRTaXplLCBjb25zdCBjaGFyICptaW1lVHlwZSwgQU1lZGlhRHJtS2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlWYWx1ZSAqb3B0aW9uYWxQYXJhbWV0ZXJzLCBzaXplX3QgbnVtT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEEga2V5IHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyIGJ5IHRoZSBhcHAsIHRoZW4gaXQgaXMKQEAgLTIxOSw3ICsyOTgsOCBAQAogICovCiAKIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUsIEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLAorICAgICAgICBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogUmVzdG9yZSBwZXJzaXN0ZWQgb2ZmbGluZSBrZXlzIGludG8gYSBuZXcgc2Vzc2lvbi4gIGtleVNldElkIGlkZW50aWZpZXMgdGhlCkBAIC0yMjksMTQgKzMwOSwxNSBAQAogICoga2V5U2V0SWQgaWRlbnRpZmllcyB0aGUgc2F2ZWQga2V5IHNldCB0byByZXN0b3JlCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZXN0b3JlS2V5cyhBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCi0gICAgICAgIGNvbnN0IEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCk7CisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZW1vdmUgdGhlIGN1cnJlbnQga2V5cyBmcm9tIGEgc2Vzc2lvbi4KICAqCiAgKiBrZXlTZXRJZCBpZGVudGlmaWVzIGtleXMgdG8gcmVtb3ZlCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJlcXVlc3QgYW4gaW5mb3JtYXRpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGtleSBzdGF0dXMgZm9yIHRoZSBzZXNzaW9uLiAgVGhlIHN0YXR1cyBpcwpAQCAtMjUyLDcgKzMzMyw3IEBACiAgKiBhbmQgbnVtUGFpcnMgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBwYWlycyBhdmFpbGFibGUuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9xdWVyeUtleVN0YXR1cyhBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCi0gICAgICAgIEFNZWRpYURybUtleVZhbHVlICprZXlWYWx1ZVBhaXJzLCBzaXplX3QgKm51bVBhaXJzKTsKKyAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAogLyoqCkBAIC0yNzEsNyArMzUyLDcgQEAKICAqICAgICAgIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UHJvdmlzaW9uUmVxdWVzdC4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3QoQU1lZGlhRHJtICosIGNvbnN0IHVpbnQ4X3QgKipwcm92aXNpb25SZXF1ZXN0LAotICAgICAgICBzaXplX3QgKnByb3Zpc2lvblJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqc2VydmVyVXJsKTsKKyAgICAgICAgc2l6ZV90ICpwcm92aXNpb25SZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKnNlcnZlclVybCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCiAvKioKQEAgLTI4Niw3ICszNjcsNyBAQAogICogc2VydmVyIHJlamVjdGVkIHRoZSByZXF1ZXN0CiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoQU1lZGlhRHJtICosCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAogLyoqCkBAIC0zMTEsNyArMzkyLDcgQEAKICAqIG51bWJlciByZXF1aXJlZC4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAotICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcyk7CisgICAgICAgIEFNZWRpYURybVNlY3VyZVN0b3AgKnNlY3VyZVN0b3BzLCBzaXplX3QgKm51bVNlY3VyZVN0b3BzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFByb2Nlc3MgdGhlIFNlY3VyZVN0b3Agc2VydmVyIHJlc3BvbnNlIG1lc3NhZ2Ugc3NSZWxlYXNlLiAgQWZ0ZXIgYXV0aGVudGljYXRpbmcKQEAgLTMyMCw3ICs0MDEsNyBAQAogICogc3NSZWxlYXNlIGlzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW5kaWNhdGluZyB3aGljaCBzZWN1cmUgc3RvcHMgdG8gcmVsZWFzZQogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAotICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpOworICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIG1ha2VyIG9mIHRoZSBEUk0gZW5naW5lIHBsdWdpbgpAQCAtMzUzLDcgKzQzNCw3IEBACiAgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZy4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgY29uc3QgY2hhciAqKnByb3BlcnR5VmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQnl0ZSBhcnJheSBwcm9wZXJ0eSBuYW1lOiB0aGUgZGV2aWNlIHVuaXF1ZSBpZGVudGlmaWVyIGlzIGVzdGFibGlzaGVkIGR1cmluZwpAQCAtMzY4LDE5ICs0NDksMTkgQEAKICAqIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKLSAgICAgICAgQU1lZGlhRHJtQnl0ZUFycmF5ICpwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgQU1lZGlhRHJtQnl0ZUFycmF5ICpwcm9wZXJ0eVZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0IGEgRFJNIGVuZ2luZSBwbHVnaW4gYnl0ZSBhcnJheSBwcm9wZXJ0eSB2YWx1ZS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLCBzaXplX3QgdmFsdWVTaXplKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBkZWNyeXB0aW9uIG9mIERBU0ggQ29tbW9uIEVuY3J5cHRlZCBNZWRpYSwgdGhlCkBAIC00MDksNyArNDkwLDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2VuY3J5cHQoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKLSAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogRGVjcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCkBAIC00MjAsNyArNTAxLDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2RlY3J5cHQoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKLSAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogR2VuZXJhdGUgYSBzaWduYXR1cmUgdXNpbmcgdGhlIHNwZWNpZmllZCBtYWNBbGdvcml0aG0gb3ZlciB0aGUgbWVzc2FnZSBkYXRhCkBAIC00MzMsNyArNTE0LDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NpZ24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCi0gICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKTsKKyAgICAgICAgdWludDhfdCAqc2lnbmF0dXJlLCBzaXplX3QgKnNpZ25hdHVyZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qCiAgKiBQZXJmb3JtIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlCkBAIC00NDQsMTAgKzUyNSwxMiBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fdmVyaWZ5KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgY29uc3QgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCBzaWduYXR1cmVTaXplKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2lnbmF0dXJlLCBzaXplX3Qgc2lnbmF0dXJlU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDEzYWFjYzkuLjJiZTFkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTE0LDYgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvKioKKyAqIEBhZGR0b2dyb3VwIE1lZGlhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrTWVkaWFFcnJvci5oCisgKi8KIAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCkBAIC01NSw2ICs2Myw3IEBACiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKICAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAogICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gOCwKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCkBAIC03OSwzICs4OCw1IEBACiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9ICisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKaW5kZXggZjdiOWNmZC4uZTNkOWZlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCkBAIC0xNCw2ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisgKiBAYWRkdG9ncm91cCBNZWRpYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka01lZGlhRXh0cmFjdG9yLmgKKyAqLwogCiAvKgogICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KQEAgLTQ2LDQzICs1NCw0NCBAQAogLyoqCiAgKiBDcmVhdGUgbmV3IG1lZGlhIGV4dHJhY3RvcgogICovCi1BTWVkaWFFeHRyYWN0b3IqIEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGV4dHJhY3RvcgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKEFNZWRpYUV4dHJhY3RvciopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqICBTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciosIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCi0gICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKKyAgICAgICAgb2ZmNjRfdCBsZW5ndGgpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0IHRoZSBVUkkgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwgY29uc3QgY2hhciAqbG9jYXRpb24pOwotICAgICAgICAvLyBUT0RPIHN1cHBvcnQgaGVhZGVycworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwKKyAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24pIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKIAogLyoqCiAgKiBTZXQgdGhlIGN1c3RvbSBkYXRhIHNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbShBTWVkaWFFeHRyYWN0b3IqLCBBTWVkaWFEYXRhU291cmNlICpzcmMpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b20oQU1lZGlhRXh0cmFjdG9yKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSAqc3JjKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKIC8qKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBtZWRpYSBmaWxlCiAgKi8KLXNpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IqKTsKK3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJldHVybiB0aGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgdHJhY2suIFRoZSBjYWxsZXIgbXVzdCBmcmVlIHRoZSByZXR1cm5lZCBmb3JtYXQKICAqLwotQU1lZGlhRm9ybWF0KiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCk7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZApAQCAtOTAsNDEgKzk5LDQyIEBACiAgKiBTZWxlY3RpbmcgdGhlIHNhbWUgdHJhY2sgbXVsdGlwbGUgdGltZXMgaGFzIG5vIGVmZmVjdCwgdGhlIHRyYWNrIGlzCiAgKiBvbmx5IHNlbGVjdGVkIG9uY2UuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFVuc2VsZWN0IHRoZSBzcGVjaWZpZWQgdHJhY2suIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZFNhbXBsZURhdGEsIGdldFNhbXBsZVRyYWNrSW5kZXggYW5kCiAgKiBnZXRTYW1wbGVUaW1lIG9ubHkgcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWJzZXQgb2YgdHJhY2tzIHNlbGVjdGVkLi4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJlYWQgdGhlIGN1cnJlbnQgc2FtcGxlLgogICovCi1zc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSk7Citzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLAorICAgICAgICB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZSdzIGZsYWdzLgogICovCi11aW50MzJfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoQU1lZGlhRXh0cmFjdG9yKik7IC8vIHNlZSBkZWZpbml0aW9ucyBiZWxvdwordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogUmV0dXJucyB0aGUgdHJhY2sgaW5kZXggdGhlIGN1cnJlbnQgc2FtcGxlIG9yaWdpbmF0ZXMgZnJvbSAob3IgLTEKICAqIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlKQogICovCi1pbnQgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoQU1lZGlhRXh0cmFjdG9yKik7CitpbnQgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNhbXBsZSdzIHByZXNlbnRhdGlvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KICAqIG9yIC0xIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgogICovCi1pbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKEFNZWRpYUV4dHJhY3RvciopOworaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEFkdmFuY2UgdG8gdGhlIG5leHQgc2FtcGxlLiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgc2FtcGxlIGRhdGEKICAqIGlzIGF2YWlsYWJsZSAoZW5kIG9mIHN0cmVhbSkuCiAgKi8KLWJvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKik7Citib29sIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIHR5cGVkZWYgZW51bSB7CiAgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQywKQEAgLTEzNSw3ICsxNDUsOCBAQAogLyoqCiAgKgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKEFNZWRpYUV4dHJhY3RvciosIGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yKiwKKyAgICAgICAgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogbWFwcGluZyBvZiBjcnlwdG8gc2NoZW1lIHV1aWQgdG8gdGhlIHNjaGVtZSBzcGVjaWZpYyBkYXRhIGZvciB0aGF0IHNjaGVtZQpAQCAtMTU3LDEwICsxNjgsMTAgQEAKIC8qKgogICogR2V0IHRoZSBQU1NIIGluZm8gaWYgcHJlc2VudC4KICAqLwotUHNzaEluZm8qIEFNZWRpYUV4dHJhY3Rvcl9nZXRQc3NoSW5mbyhBTWVkaWFFeHRyYWN0b3IqKTsKK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCi1BTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKEFNZWRpYUV4dHJhY3RvciAqKTsKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIGVudW0gewogICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DID0gMSwKQEAgLTE3Niw3ICsxODcsNyBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYSBmb3JtYXQ7IGhvd2V2ZXIsIHRoZSBmb3JtYXQgY291bGQgYmUgZW1wdHkKICAqIChubyBrZXktdmFsdWUgcGFpcnMpIGlmIHRoZSBtZWRpYSBjb250YWluZXIgZG9lcyBub3QgcHJvdmlkZSBmb3JtYXQgaW5mb3JtYXRpb24uCiAgKi8KLUFNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQoQU1lZGlhRXh0cmFjdG9yKik7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzYW1wbGUgaW4gYnl0ZXMsIG9yIC0xIHdoZW4gbm8gc2FtcGxlcyBhcmUKQEAgLTE4OCw3ICsxOTksNyBAQAogICogQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKGV4LCBidWYsIHNhbXBsZVNpemUpOwogICoKICAqLwotc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShBTWVkaWFFeHRyYWN0b3IqKTsKK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiBjYWNoZWQgbWVkaWEgc2FtcGxlcyBkb3dubG9hZGVkIGZyb20gYSBuZXR3b3JrIGRhdGEgc291cmNlCkBAIC0yMDEsNyArMjEyLDcgQEAKICAqIGNhY2hlZCBkdXJhdGlvbiBjYW5ub3QgYmUgY2FsY3VsYXRlZCAoYml0cmF0ZSwgZHVyYXRpb24sIGFuZCBmaWxlIHNpemUgaW5mb3JtYXRpb24KICAqIG5vdCBhdmFpbGFibGUpLgogICovCi1pbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbihBTWVkaWFFeHRyYWN0b3IgKik7CitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbihBTWVkaWFFeHRyYWN0b3IgKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZSdzIG1ldGFkYXRhIGZvcm1hdCBpbnRvIHxmbXR8LiBFeGFtcGxlcyBvZiBzYW1wbGUgbWV0YWRhdGEgYXJlCkBAIC0yMTIsNyArMjIzLDggQEAKICAqIEV4aXN0aW5nIGtleS12YWx1ZSBwYWlycyBpbiB8Zm10fCB3b3VsZCBiZSByZW1vdmVkIGlmIHRoaXMgQVBJIHJldHVybnMgQU1FRElBX09LLgogICogVGhlIGNvbnRlbnRzIG9mIHxmbXR8IGlzIHVuZGVmaW5lZCBpZiB0aGlzIEFQSSByZXR1cm5zIEFNRURJQV9FUlJPUl8qLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsIEFNZWRpYUZvcm1hdCAqZm10KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQoQU1lZGlhRXh0cmFjdG9yICpleCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmbXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIApAQCAtMjIxLDMgKzIzMyw1IEBACiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9FWFRSQUNUT1JfSAorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCmluZGV4IDY4NzA1NGUuLmZkNDNmMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorICogQGFkZHRvZ3JvdXAgTWVkaWEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtNZWRpYUZvcm1hdC5oCisgKi8KKwogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCiAgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCkBAIC0zOSwxMjggKzQ4LDE5NyBAQAogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKLUFNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpOwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKTsKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpIF9fSU5UUk9EVUNFRF9JTigyMSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogSHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvcm1hdC4gVGhlIHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSB0aGUgZm9ybWF0LAogICogYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byB0b1N0cmluZywgb3IgdW50aWwgdGhlIGZvcm1hdCBpcyBkZWxldGVkLgogICovCi1jb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0Kik7Citjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KTsKLWJvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7Ci1ib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KTsKLWJvb2wgQU1lZGlhRm9ybWF0X2dldFNpemUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjEpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjEpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFNpemUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAvKioKICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQgYW5kIHJlbWFpbnMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgbmFtZWQgZW50cnkKICAqIGlzIHBhcnQgb2YgdGhlIGZvcm1hdC4KICAqLwotYm9vbCBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQqKiBkYXRhLCBzaXplX3QgKnNpemUpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQqKiBkYXRhLCBzaXplX3QgKnNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAvKioKICAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwgYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBnZXRTdHJpbmcsCiAgKiBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCiAgKi8KLWJvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEludDMyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpOwotdm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSk7Ci12b2lkIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEZsb2F0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogLyoqCiAgKiBUaGUgcHJvdmlkZWQgc3RyaW5nIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCiAgKi8KLXZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAvKioKICAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCiAgKi8KLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAotCi0vKioKLSAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/Ci0gKi8KLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1I7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUjsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0Q7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzI7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1A7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEg7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0Q7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0U7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUw7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEg7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEE7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT047Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEg7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOwotCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSyBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUyBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MRVZFTCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUklORyBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggX19JTlRST0RVQ0VEX0lOKDIxKTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldERvdWJsZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKm91dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGJvb2wgQU1lZGlhRm9ybWF0X2dldFJlY3QoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLCBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKTsKKyAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLCBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCi12b2lkIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlKTsKLXZvaWQgQU1lZGlhRm9ybWF0X3NldFNpemUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldERvdWJsZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyOCk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRTaXplKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIHZvaWQgQU1lZGlhRm9ybWF0X3NldFJlY3QoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiByZW1vdmUgYWxsIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBnaXZlbiBBTWVkaWFGb3JtYXQKKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBjb3B5IG9uZSBBTWVkaWFGb3JtYXQgdG8gYW5vdGhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSAorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAppbmRleCAxZWNkMWNhLi43MzkzODY3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCkBAIC0xNCw2ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisgKiBAYWRkdG9ncm91cCBNZWRpYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka01lZGlhTXV4ZXIuaAorICovCiAKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgpAQCAtNTAsMTIgKzU4LDEyIEBACiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKICAqLwotQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpOworQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIG11eGVyCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfZGVsZXRlKEFNZWRpYU11eGVyKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZXQgYW5kIHN0b3JlIHRoZSBnZW9kYXRhIChsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlKSBpbiB0aGUgb3V0cHV0IGZpbGUuCkBAIC02OCw3ICs3Niw4IEBACiAgKiBMYXRpdHVkZSBtdXN0IGJlIGluIHRoZSByYW5nZSBbLTkwLCA5MF0uCiAgKiBMb25naXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy0xODAsIDE4MF0uCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyKiwgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmdpdHVkZSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciosCisgICAgICAgIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25naXR1ZGUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0cyB0aGUgb3JpZW50YXRpb24gaGludCBmb3Igb3V0cHV0IHZpZGVvIHBsYXliYWNrLgpAQCAtODIsMjYgKzkxLDI2IEBACiAgKiBUaGUgYW5nbGUgaXMgc3BlY2lmaWVkIGluIGRlZ3JlZXMsIGNsb2Nrd2lzZS4KICAqIFRoZSBzdXBwb3J0ZWQgYW5nbGVzIGFyZSAwLCA5MCwgMTgwLCBhbmQgMjcwIGRlZ3JlZXMuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludChBTWVkaWFNdXhlciosIGludCBkZWdyZWVzKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludChBTWVkaWFNdXhlciosIGludCBkZWdyZWVzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEFkZHMgYSB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgogICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ldyB0cmFjayBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZmFpbHVyZSwKICAqIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG1lZGlhX3N0YXR1c190LgogICovCi1zc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyKiwgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworc3NpemVfdCBBTWVkaWFNdXhlcl9hZGRUcmFjayhBTWVkaWFNdXhlciosIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0YXJ0IHRoZSBtdXhlci4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBBTWVkaWFNdXhlcl9hZGRUcmFjayBhbmQKICAqIGJlZm9yZSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0YXJ0KEFNZWRpYU11eGVyKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdGFydChBTWVkaWFNdXhlciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU3RvcHMgdGhlIG11eGVyLgogICogT25jZSB0aGUgbXV4ZXIgc3RvcHMsIGl0IGNhbiBub3QgYmUgcmVzdGFydGVkLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBXcml0ZXMgYW4gZW5jb2RlZCBzYW1wbGUgaW50byB0aGUgbXV4ZXIuCkBAIC0xMTEsMTAgKzEyMCwxMyBAQAogICogYnkgdGhlIGVuY29kZXIuKQogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEoQU1lZGlhTXV4ZXIgKm11eGVyLAotICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbyk7CisgICAgICAgIHNpemVfdCB0cmFja0lkeCwgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX01VWEVSX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2OGE1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUFJJVkFURV9NRURJQV9OREtJTUFHRV9IXworI2RlZmluZSBfUFJJVkFURV9NRURJQV9OREtJTUFHRV9IXworLy8gRm9ybWF0cyBub3QgbGlzdGVkIGluIHRoZSBwdWJsaWMgQVBJLCBidXQgc3RpbGwgYXZhaWxhYmxlIHRvIEFJbWFnZVJlYWRlcgorZW51bSBBSU1BR0VfUFJJVkFURV9GT1JNQVRTIHsKKyAgICAvKioKKyAgICAgKiBVbnByb2Nlc3NlZCBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgcmF3CisgICAgICogZGVwdGggbWVhc3VyZW1lbnRzLCBvcGFxdWUgd2l0aCAxNiBiaXQKKyAgICAgKiBzYW1wbGVzLgorICAgICAqCisgICAgICovCisKKyAgICBBSU1BR0VfRk9STUFUX1JBV19ERVBUSCA9IDB4MTAwMiwKK307CisjZW5kaWYgLy8gX1BSSVZBVEVfTUVESUFfTkRLSU1BR0UKZGlmZiAtLWdpdCBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0IGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKaW5kZXggZmI1NjY5NC4uZjY2NmFkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKKysrIGIvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQKQEAgLTQsNiArNCw3IEBACiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZUFzeW5jOyAjIGludHJvZHVjZWQ9MjYKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZTsgI3ZuZGsKICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0Rm9ybWF0OyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0SGVpZ2h0OyAjIGludHJvZHVjZWQ9MjQKQEAgLTMyLDU1ICszMywxMjIgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FSVElTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVY7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfR0VOUkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX01JTUU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9PUDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BTlVGQUNUVVJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX01JTUU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU47ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfUFNTSDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1A7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1lFQVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50OyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlOwpAQCAtMTAwLDYgKzE2OCw3IEBACiAgICAgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXI7CiAgICAgQU1lZGlhQ29kZWNfZmx1c2g7CisgICAgQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRm9ybWF0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNfZ2V0TmFtZTsgIyBpbnRyb2R1Y2VkPTI4CkBAIC0xMzAsNiArMTk5LDkgQEAKICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ld1VyaTsgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlOyAgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9jbG9zZVNlc3Npb247CiAgICAgQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRDsKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKQEAgLTE1MSw2ICsyMjMsOCBAQAogICAgIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXI7CiAgICAgQU1lZGlhRHJtX3NldFByb3BlcnR5Qnl0ZUFycmF5OwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZzsKKyAgICBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURybV9zZXRPbktleXNDaGFuZ2VMaXN0ZW5lcjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRHJtX3NpZ247CiAgICAgQU1lZGlhRHJtX3ZlcmlmeTsKICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZTsKQEAgLTE3NCw2ICsyNDgsOCBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcjsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRm9ybWF0X2NvcHk7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKICAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY1MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8TmRrSW1hZ2VSZWFkZXJQcml2Lmg+CisjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKwordHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7Cit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtJbWFnZUJ1ZmZlclVzYWdlID0KKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0ltYWdlV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1JHQkFfODg4ODsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhJbWFnZXMgPSAxOworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1F1ZXVlQnVmZmVySW5wdXRUaW1lU3RhbXAgPSAxMzg0ODg4NjExOworc3RhdGljIGNvbnN0ZXhwciBib29sIGtRdWV1ZUJ1ZmZlcklucHV0SXNBdXRvVGltZVN0YW1wID0gZmFsc2U7CitzdGF0aWMgY29uc3RleHByIGFuZHJvaWRfZGF0YXNwYWNlIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworc3RhdGljIGNvbnN0IFJlY3Qga1F1ZXVlQnVmZmVySW5wdXRSZWN0ID0gUmVjdChrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0KTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUgPSAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0gPSAwOworc3RhdGljIGNvbnN0IHNwPEZlbmNlPiBrUXVldWVCdWZmZXJJbnB1dEZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOworCitzdGF0aWMgY29uc3RleHByIGludCBrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyA9IDEwMCAqIDEwMDA7CisKK2NsYXNzIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsIGtJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VCdWZmZXJVc2FnZSAsIGtNYXhJbWFnZXMsICZpbWFnZVJlYWRlcl8pOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgQVNTRVJUX05FKGltYWdlUmVhZGVyXywgbnVsbHB0cik7CisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyQXZhaWxhYmxlQ2JfKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihpbWFnZVJlYWRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyRGV0YWNoZWRDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoaW1hZ2VSZWFkZXJfKSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKGltYWdlUmVhZGVyXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEhhbmRsZUltYWdlQXZhaWxhYmxlKCkgeworICAgICAgICBBSW1hZ2UgKm91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQU1FRElBX09LOworICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFtdKEFJbWFnZSAqaW1nKSB7IEFJbWFnZV9kZWxldGUoaW1nKTsgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFJbWFnZSwgZGVjbHR5cGUoaW1hZ2VEZWxldGVyKT4gaW1nKG51bGxwdHIsIGltYWdlRGVsZXRlcik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBpbWFnZSBjYW4gYmUgYWNxdWlyZWQuCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKGltYWdlUmVhZGVyXywgJm91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgaW1nLnJlc2V0KG91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX05FKGltZywgbnVsbHB0cik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHdlIGNhbiBnZXQgYSBoYW5kbGUgdG8gdGhlIGltYWdlJ3MgaGFyZHdhcmUgYnVmZmVyIGFuZCBhCisgICAgICAgIC8vIG5hdGl2ZSBoYW5kbGUgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlciAqaGFyZHdhcmVCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmaGFyZHdhcmVCdWZmZXIpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBBU1NFUlRfTkUoaGFyZHdhcmVCdWZmZXIsIG51bGxwdHIpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oID0gQUhhcmR3YXJlQnVmZmVyX2dldE5hdGl2ZUhhbmRsZShoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgICAgIGltYWdlQXZhaWxhYmxlXyA9IHRydWU7CisgICAgICAgIGltYWdlQ29uZFZhcl8ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uSW1hZ2VBdmFpbGFibGUodm9pZCAqY29udGV4dCwgQUltYWdlUmVhZGVyICpyZWFkZXIpIHsKKyAgICAgICAgKHZvaWQpcmVhZGVyOworICAgICAgICBBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0ICp0aGlzQ29udGV4dCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKj4oY29udGV4dCk7CisgICAgICAgIHRoaXNDb250ZXh0LT5IYW5kbGVJbWFnZUF2YWlsYWJsZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyUmVtb3ZlZCh2b2lkICosIEFJbWFnZVJlYWRlciAqLCBBSGFyZHdhcmVCdWZmZXIgKikgeworICAgIH0KKworICAgIEFJbWFnZVJlYWRlciAqaW1hZ2VSZWFkZXJfID0gbnVsbHB0cjsKKyAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBpbWFnZVJlYWRlckF2YWlsYWJsZUNiX3t0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIGltYWdlUmVhZGVyRGV0YWNoZWRDYl97dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKKyAgICBzdGQ6Om11dGV4IGltYWdlQXZhaWxhYmxlTXV0ZXhfOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGltYWdlQ29uZFZhcl87CisgICAgYm9vbCBpbWFnZUF2YWlsYWJsZV8gPSBmYWxzZTsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxSR0JBOEJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICAgIGNvbnN0IHNpemVfdCBQSVhFTF9TSVpFID0gNDsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gKHkgKiBzdHJpZGUgKyB4KSAqIFBJWEVMX1NJWkU7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworICAgICAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gKDEgPDwgKGMrMikpKSAmIDE7CisgICAgICAgICAgICAgICAgYnVmW29mZnNldCArIGNdID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDIzMSA6IDM1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgLy8gQUltYWdlUmVhZGVyLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaW1hZ2VSZWFkZXJfLCAmbmgpOworICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBvbmx5IGludHMgaW4gdGhlIGhhbmRsZS4KKyAgICBBU1NFUlRfRVEobmgtPm51bUZkcywgMCk7CisgICAgQVNTRVJUX05FKG5oLT5udW1JbnRzLCAwKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIEhHQlAgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBoYW5kbGUuCisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9ICBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUobmgpOworICAgIEFTU0VSVF9ORShoZ2JwLCBudWxscHRyKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihoZ2JwKTsKKyAgICBpbnQgZGVxdWV1ZWRTbG90ID0gLTE7CisgICAgc3A8RmVuY2U+IGRlcXVldWVkRmVuY2U7CisgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgb3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+Y29ubmVjdChudWxscHRyLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUsIGZhbHNlLCAmb3V0cHV0KSk7CisKKyAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGRlcXVldWUgYSBidWZmZXIuCisgICAgQVNTRVJUX0VRKE9LLAorICAgICAgICAgICAgICB+SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiAmCisgICAgICAgICAgICAgICAgICAgICAgKGlnYnAtPmRlcXVldWVCdWZmZXIoJmRlcXVldWVkU2xvdCwgJmRlcXVldWVkRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VGb3JtYXQsIGtJbWFnZUJ1ZmZlclVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpKSk7CisgICAgRVhQRUNUX0xFKDAsIGRlcXVldWVkU2xvdCk7CisgICAgRVhQRUNUX0dUKEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTLCBkZXF1ZXVlZFNsb3QpOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZGVxdWV1ZWRCdWZmZXI7CisgICAgaWdicC0+cmVxdWVzdEJ1ZmZlcihkZXF1ZXVlZFNsb3QsICZkZXF1ZXVlZEJ1ZmZlcik7CisgICAgdWludDhfdCogaW1nID0gbnVsbHB0cjsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT5sb2NrKGtJbWFnZUJ1ZmZlclVzYWdlLCAodm9pZCoqKSgmaW1nKSkpOworCisgICAgLy8gV3JpdGUgaW4gc29tZSBkdW1teSBpbWFnZSBkYXRhLgorICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIGRlcXVldWVkQnVmZmVyLT5nZXRXaWR0aCgpLCBkZXF1ZXVlZEJ1ZmZlci0+Z2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkQnVmZmVyLT5nZXRTdHJpZGUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXF1ZXVlZEJ1ZmZlci0+dW5sb2NrKCkpOworICAgIFF1ZXVlQnVmZmVySW5wdXQgcXVldWVCdWZmZXJJbnB1dChrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0VHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dEZlbmNlKTsKKyAgICBRdWV1ZUJ1ZmZlck91dHB1dCBxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICBBU1NFUlRfRVEoT0ssIGlnYnAtPnF1ZXVlQnVmZmVyKGRlcXVldWVkU2xvdCwgcXVldWVCdWZmZXJJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWV1ZUJ1ZmZlck91dHB1dCkpOworICAgIC8vIHdhaXQgdW50aWwgdGhlIG9uSW1hZ2VBdmFpbGFibGUgY2FsbGJhY2sgaXMgY2FsbGVkLCBvciB0aW1lb3V0IGNvbXBsZXRlcy4KKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW1hZ2VBdmFpbGFibGVNdXRleF8pOworICAgIGltYWdlQ29uZFZhcl8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc117IHJldHVybiB0aGlzLT5pbWFnZUF2YWlsYWJsZV87fSk7CisgICAgRVhQRUNUX1RSVUUoaW1hZ2VBdmFpbGFibGVfKSA8PCAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbWFnZSBkYXRhIHRvIGJlIGhhbmRsZWQhXG4iOworfQorCitjbGFzcyBBSW1hZ2VSZWFkZXJQcml2YXRlRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBzdGF0dXMgPSBBSW1hZ2VSZWFkZXJfbmV3KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heEltYWdlcywgJmltZ1JlYWRlcik7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBBTUVESUFfT0spOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWdSZWFkZXIpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1nUmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBSW1hZ2VSZWFkZXIgKmltZ1JlYWRlciA9IG51bGxwdHI7Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyUHJpdmF0ZUZvcm1hdFRlc3QsIENyZWF0ZVRlc3QpIHsKKyAgICBFWFBFQ1RfVFJVRShpbWdSZWFkZXIgIT0gbnVsbHB0cik7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcCBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpbWcgeworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3N0YXRpYyBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQICgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBoYWxUb2tlbiB2ZWM8dWludDhfdD4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoYWxUb2tlbjsKKyAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oY29uc3RfY2FzdDxpbnQgKj4oJihoYW5kbGUtPmRhdGFbMV0pKSksCisgICAgICAgIGhhbmRsZS0+ZGF0YVswXSk7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhc3RGcm9tKHJldHJpZXZlSGFsSW50ZXJmYWNlKGhhbFRva2VuKSk7CisgICAgcmV0dXJuIGhnYnA7Cit9CisKK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZSgKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGhhbmRsZS0+bnVtRmRzICE9IDAgIHx8CisgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IHN0ZDo6Y2VpbChzaXplb2Yoc2l6ZV90KSAvIHNpemVvZihpbnQpKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvbnZlcnROYXRpdmVIYW5kbGVUb0hHQlAoaGFuZGxlKTsKK30KKworfSAvL25hbWVzcGFjZSBhaW1nCit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCmluZGV4IGQ2ZGFlNWIuLjNhZGI0MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icApAQCAtMTYsMjUgKzE2LDQzIEBACiAgICAgbmFtZTogImxpYm1lZGlhdXRpbHMiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUltYWdlUmVhZGVyVXRpbHMuY3BwIiwKICAgICAgICAgIkJhdHRlcnlOb3RpZmllci5jcHAiLAogICAgICAgICAiSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCIsCiAgICAgICAgICJQcm9jZXNzSW5mby5jcHAiLAogICAgICAgICAiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNlcnZpY2VVdGlsaXRpZXMuY3BwIiwKKyAgICAgICAgIlRpbWVDaGVjay5jcHAiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgXSwKIAorICAgIGxvZ3RhZ3M6IFsiRXZlbnRMb2dUYWdzLmxvZ3RhZ3MiXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgcHJvZHVjdF9pc19pb3Q6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItRFRBUkdFVF9BTkRST0lEX1RISU5HUyJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgLy8gRm9yIGFuZHJvaWRfbWFsbG9wdCBkZWZpbml0aW9ucy4KKyAgICAgICAgImJpb25pYy9saWJjL3ByaXZhdGUiCisgICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MgYi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2YwZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKQEAgLTAsMCArMSw0MSBAQAorIyBUaGUgZW50cmllcyBpbiB0aGlzIGZpbGUgbWFwIGEgc3BhcnNlIHNldCBvZiBsb2cgdGFnIG51bWJlcnMgdG8gdGFnIG5hbWVzLgorIyBUaGlzIGlzIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLCBpbiAvc3lzdGVtL2V0YywgYW5kIHBhcnNlZCBieSBsb2djYXQuCisjCisjIFRhZyBudW1iZXJzIGFyZSBkZWNpbWFsIGludGVnZXJzLCBmcm9tIDAgdG8gMl4zMS4gIChMZXQncyBsZWF2ZSB0aGUKKyMgbmVnYXRpdmUgdmFsdWVzIGFsb25lIGZvciBub3cuKQorIworIyBUYWcgbmFtZXMgYXJlIG9uZSBvciBtb3JlIEFTQ0lJIGxldHRlcnMgYW5kIG51bWJlcnMgb3IgdW5kZXJzY29yZXMsIGkuZS4KKyMgIltBLVpdW2Etel1bMC05XV8iLiAgRG8gbm90IGluY2x1ZGUgc3BhY2VzIG9yIHB1bmN0dWF0aW9uICh0aGUgZm9ybWVyCisjIGltcGFjdHMgbG9nIHJlYWRhYmlsaXR5LCB0aGUgbGF0dGVyIG1ha2VzIHJlZ2V4IHNlYXJjaGVzIG1vcmUgYW5ub3lpbmcpLgorIworIyBUYWcgbnVtYmVycyBhbmQgbmFtZXMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgQmxhbmsgbGluZXMgYW5kIGxpbmVzCisjIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLgorIworIyBPcHRpb25hbGx5LCBhZnRlciB0aGUgdGFnIG5hbWVzIGNhbiBiZSBwdXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHZhbHVlKHMpCisjIG9mIHRoZSB0YWcuIERlc2NyaXB0aW9uIGFyZSBpbiB0aGUgZm9ybWF0CisjICAgICg8bmFtZT58ZGF0YSB0eXBlW3xkYXRhIHVuaXRdKQorIyBNdWx0aXBsZSB2YWx1ZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMuCisjCisjIFRoZSBkYXRhIHR5cGUgaXMgYSBudW1iZXIgZnJvbSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyMgMTogaW50CisjIDI6IGxvbmcKKyMgMzogc3RyaW5nCisjIDQ6IGxpc3QKKyMKKyMgVGhlIGRhdGEgdW5pdCBpcyBhIG51bWJlciB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMgMTogTnVtYmVyIG9mIG9iamVjdHMKKyMgMjogTnVtYmVyIG9mIGJ5dGVzCisjIDM6IE51bWJlciBvZiBtaWxsaXNlY29uZHMKKyMgNDogTnVtYmVyIG9mIGFsbG9jYXRpb25zCisjIDU6IElkCisjIDY6IFBlcmNlbnQKKyMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KKyMKKyMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisKKyMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKKworNjEwMDAgYXVkaW9zZXJ2ZXJfYmluZGVyX3RpbWVvdXQgKGNvbW1hbmR8MykKKworIyBOT1RFIC0gdGhlIHJhbmdlIDEwMDAwMDAtMjAwMDAwMCBpcyByZXNlcnZlZCBmb3IgcGFydG5lcnMgYW5kIG90aGVycyB3aG8KKyMgd2FudCB0byBkZWZpbmUgdGhlaXIgb3duIGxvZyB0YWdzIHdpdGhvdXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgY29yZSBwbGF0Zm9ybS4KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwIGIvbWVkaWEvdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKaW5kZXggMThmNWYyNS4uMjk4OGI1MiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKKysrIGIvbWVkaWEvdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlICJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgiCiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGJpb25pY19tYWxsb2MuaD4KKwogLyoKICAqIFRoZSBjb2RlIGhlcmUgb3JpZ2luYWxseSByZXNpZGVkIGluIE1lZGlhUGxheWVyU2VydmljZS5jcHAKICAqLwpAQCAtNDcsMjkgKzQ5LDIyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuICJDIiB2b2lkIGdldF9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqKiBpbmZvLCBzaXplX3QqIG92ZXJhbGxTaXplLAotICAgICAgICBzaXplX3QqIGluZm9TaXplLCBzaXplX3QqIHRvdGFsTWVtb3J5LCBzaXplX3QqIGJhY2t0cmFjZVNpemUpOwotCi1leHRlcm4gIkMiIHZvaWQgZnJlZV9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqIGluZm8pOwotCiBzdGQ6OnN0cmluZyBkdW1wTWVtb3J5QWRkcmVzc2VzKHNpemVfdCBsaW1pdCkKIHsKLSAgICB1aW50OF90ICppbmZvOwotICAgIHNpemVfdCBvdmVyYWxsU2l6ZTsKLSAgICBzaXplX3QgaW5mb1NpemU7Ci0gICAgc2l6ZV90IHRvdGFsTWVtb3J5OwotICAgIHNpemVfdCBiYWNrdHJhY2VTaXplOwotICAgIGdldF9tYWxsb2NfbGVha19pbmZvKCZpbmZvLCAmb3ZlcmFsbFNpemUsICZpbmZvU2l6ZSwgJnRvdGFsTWVtb3J5LCAmYmFja3RyYWNlU2l6ZSk7CisgICAgYW5kcm9pZF9tYWxsb3B0X2xlYWtfaW5mb190IGxlYWtfaW5mbzsKKyAgICBpZiAoIWFuZHJvaWRfbWFsbG9wdChNX0dFVF9NQUxMT0NfTEVBS19JTkZPLCAmbGVha19pbmZvLCBzaXplb2YobGVha19pbmZvKSkpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CiAKICAgICBzaXplX3QgY291bnQ7Ci0gICAgaWYgKGluZm8gPT0gbnVsbHB0ciB8fCBvdmVyYWxsU2l6ZSA9PSAwIHx8IGluZm9TaXplID09IDAKLSAgICAgICAgICAgIHx8IChjb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemUpID09IDApIHsKKyAgICBpZiAobGVha19pbmZvLmJ1ZmZlciA9PSBudWxscHRyIHx8IGxlYWtfaW5mby5vdmVyYWxsX3NpemUgPT0gMCB8fCBsZWFrX2luZm8uaW5mb19zaXplID09IDAKKyAgICAgICAgICAgIHx8IChjb3VudCA9IGxlYWtfaW5mby5vdmVyYWxsX3NpemUgLyBsZWFrX2luZm8uaW5mb19zaXplKSA9PSAwKSB7CiAgICAgICAgIEFMT0dEKCJubyBtYWxsb2MgaW5mbywgbGliYy5kZWJ1Zy5tYWxsb2MucHJvZ3JhbSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0Iik7Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgICBvc3MgPDwgdG90YWxNZW1vcnkgPDwgIiBieXRlcyBpbiAiIDw8IGNvdW50IDw8ICIgYWxsb2NhdGlvbnNcbiI7CisgICAgb3NzIDw8IGxlYWtfaW5mby50b3RhbF9tZW1vcnkgPDwgIiBieXRlcyBpbiAiIDw8IGNvdW50IDw8ICIgYWxsb2NhdGlvbnNcbiI7CiAgICAgb3NzIDw8ICIgIEFCSTogJyIgQUJJX1NUUklORyAiJyIgPDwgIlxuXG4iOwogICAgIGlmIChjb3VudCA+IGxpbWl0KSBjb3VudCA9IGxpbWl0OwogCkBAIC04MywxNCArNzgsMTQgQEAKICAgICAgICAgICAgIHVpbnRwdHJfdCBiYWNrdHJhY2VbXTsKICAgICAgICAgfTsKIAotICAgICAgICBjb25zdCBBbGxvY0VudHJ5ICogY29uc3QgZSA9IChBbGxvY0VudHJ5ICopKGluZm8gKyBpICogaW5mb1NpemUpOworICAgICAgICBjb25zdCBBbGxvY0VudHJ5ICogY29uc3QgZSA9IChBbGxvY0VudHJ5ICopKGxlYWtfaW5mby5idWZmZXIgKyBpICogbGVha19pbmZvLmluZm9fc2l6ZSk7CiAKICAgICAgICAgb3NzIDw8IChlLT5zaXplICogZS0+YWxsb2NhdGlvbnMpCiAgICAgICAgICAgICAgICAgPDwgIiBieXRlcyAoICIgPDwgZS0+c2l6ZSA8PCAiIGJ5dGVzICogIiA8PCBlLT5hbGxvY2F0aW9ucyA8PCAiIGFsbG9jYXRpb25zIClcbiI7Ci0gICAgICAgIG9zcyA8PCBiYWNrdHJhY2Vfc3RyaW5nKGUtPmJhY2t0cmFjZSwgYmFja3RyYWNlU2l6ZSkgPDwgIlxuIjsKKyAgICAgICAgb3NzIDw8IGJhY2t0cmFjZV9zdHJpbmcoZS0+YmFja3RyYWNlLCBsZWFrX2luZm8uYmFja3RyYWNlX3NpemUpIDw8ICJcbiI7CiAgICAgfQogICAgIG9zcyA8PCAiXG4iOwotICAgIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyhpbmZvKTsKKyAgICBhbmRyb2lkX21hbGxvcHQoTV9GUkVFX01BTExPQ19MRUFLX0lORk8sICZsZWFrX2luZm8sIHNpemVvZihsZWFrX2luZm8pKTsKICAgICByZXR1cm4gb3NzLnN0cigpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjQyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZVV0aWxpdGllcyIKKworI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKKyAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKKyAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKKyAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCisgKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgorICovCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKworc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOworICAgIH0KKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZXNbMF07Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworCisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCisgICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCisgICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhcHBPcHMuY2hlY2tPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOworfQorCitib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOworfQorCit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybjsKKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKK30KKworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR1YoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVNZWRpYU91dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfTUVESUFfT1VUUFVUIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlTWVkaWFPdXRwdXQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9NRURJQV9PVVRQVVQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KKyAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkLCBwaWQsIHVpZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dWKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKKyAgICAvLyBnaXZlbiB0aGlzIGlzIGEgcGVybWlzc2lvbiBjaGVjaywgY291bGQgdGhpcyBiZSBpc0F1ZGlvU2VydmVyT3JSb290VWlkKCk/CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmcpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgKKyAgICAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQpOworCisjaWZkZWYgVEFSR0VUX0FORFJPSURfVEhJTkdTCisgICAgaWYgKCFvaykgeworICAgICAgICAvLyBVc2UgYSBzZWNvbmRhcnkgcGVybWlzc2lvbiBvbiBBbmRyb2lkIFRoaW5ncyB0byBhbGxvdyBhIG1vcmUgbGVuaWVudCBsZXZlbCBvZiBwcm90ZWN0aW9uLgorICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCgKKyAgICAgICAgICAgICAgICAiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbmRyb2lkVGhpbmdzQWxsb3dlZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dFKCJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworI2Vsc2UKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbmRpZgorICAgIHJldHVybiBvazsKK30KKworYm9vbCBkdW1wQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKKyAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCisgICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOworICAgIEFMT0dFX0lGKCFvaywgIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNNb2RpZnlQaG9uZVN0YXRlKS5jX3N0cigpKTsKKyAgICByZXR1cm4gb2s7Cit9CisKKy8vIHByaXZpbGVnZWQgYmVoYXZpb3IgbmVlZGVkIGJ5IERpYWxlciwgU2V0dGluZ3MsIFNldHVwV2l6YXJkIGFuZCBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIKK2Jvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzV3JpdGVTZWN1cmVTZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpCisgICAgICAgIHx8IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNXcml0ZVNlY3VyZVNldHRpbmdzLCBwaWQsIHVpZCkKKyAgICAgICAgfHwgUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZywgcGlkLCB1aWQpOworICAgIEFMT0dFX0lGKCFvaywgIlJlcXVlc3QgcmVxdWlyZXMgJXMgb3IgJXMiLAorICAgICAgICAgICAgIFN0cmluZzgoc01vZGlmeVBob25lU3RhdGUpLmNfc3RyKCksIFN0cmluZzgoc1dyaXRlU2VjdXJlU2V0dGluZ3MpLmNfc3RyKCkpOworICAgIHJldHVybiBvazsKK30KKworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KQoreworICAgIGlmIChpTWVtb3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBJTWVtb3J5IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaU1lbW9yeS0+Z2V0TWVtb3J5KCk7CisgICAgaWYgKGhlYXAgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBOVUxMIGhlYXAgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb2ZmX3Qgc2l6ZSA9IGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoaGVhcC0+Z2V0SGVhcElEKCksIDAsIFNFRUtfU0VUKTsKKworICAgIGlmIChpTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCB8fCBzaXplIDwgKG9mZl90KWlNZW1vcnktPnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBwb2ludGVyICVwIHNpemUgJXp1IGZkIHNpemUgJXUiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlNZW1vcnktPnBvaW50ZXIoKSwgaU1lbW9yeS0+c2l6ZSgpLCAodWludDMyX3Qpc2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpyZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCkgeworICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBpZiAoc20gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBkZWZhdWx0U2VydmljZU1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxJQmluZGVyPiBwYWNrYWdlTWFuYWdlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYobmF0aXZlUGFja2FnZU1hbmFnZXJOYW1lKSk7CisgICAgaWYgKHBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgbmF0aXZlIHBhY2thZ2UgbWFuYWdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihwYWNrYWdlTWFuYWdlcik7Cit9CisKK3N0ZDo6b3B0aW9uYWw8Ym9vbD4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6ZG9Jc0FsbG93ZWQodWlkX3QgdWlkKSB7CisgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8qKiBDYW4gbm90IGZldGNoIHBhY2thZ2UgbWFuYWdlciBhdCBjb25zdHJ1Y3Rpb24gaXQgbWF5IG5vdCB5ZXQgYmUgcmVnaXN0ZXJlZC4gKi8KKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gcmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgYXMgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCByZWFjaGFibGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhY2thZ2VOYW1lczsKKyAgICBhdXRvIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+Z2V0TmFtZXNGb3JVaWRzKHsoaW50MzJfdCl1aWR9LCAmcGFja2FnZU5hbWVzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgaWYgKHBhY2thZ2VOYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBmb3IgdWlkICV1IGlzIGRlbmllZCBhcyBubyBwYWNrYWdlIG5hbWUgY291bGQgYmUgcmV0cmlldmVkICIKKyAgICAgICAgICAgICAgImZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGlzQWxsb3dlZDsKKyAgICBzdGF0dXMgPSBtUGFja2FnZU1hbmFnZXItPmlzQXVkaW9QbGF5YmFja0NhcHR1cmVBbGxvd2VkKHBhY2thZ2VOYW1lcywgJmlzQWxsb3dlZCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgbWFuaWZlc3QgcHJvcGVydHkgY291bGQgbm90IGJlICIKKyAgICAgICAgICAgICAgInJldHJpZXZlZCBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBpZiAocGFja2FnZU5hbWVzLnNpemUoKSAhPSBpc0FsbG93ZWQuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyIHJldHVybmVkIGluY29oZXJlbnQiCisgICAgICAgICAgICAgICIgcmVzcG9uc2Ugc2l6ZTogJXp1ICE9ICV6dSIsIF9fZnVuY19fLCB1aWQsIHBhY2thZ2VOYW1lcy5zaXplKCksIGlzQWxsb3dlZC5zaXplKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKworICAgIC8vIFppcCB0b2dldGhlciBwYWNrYWdlTmFtZXMgYW5kIGlzQWxsb3dlZCBmb3IgZGVidWcgbG9ncworICAgIFBhY2thZ2VzJiBwYWNrYWdlcyA9IG1EZWJ1Z0xvZ1t1aWRdOworICAgIHBhY2thZ2VzLnJlc2l6ZShwYWNrYWdlTmFtZXMuc2l6ZSgpKTsgLy8gUmV1c2UgYWxsIG9iamVjdHMKKyAgICBzdGQ6OnRyYW5zZm9ybShiZWdpbihwYWNrYWdlTmFtZXMpLCBlbmQocGFja2FnZU5hbWVzKSwgYmVnaW4oaXNBbGxvd2VkKSwKKyAgICAgICAgICAgICAgICAgICBiZWdpbihwYWNrYWdlcyksIFtdIChhdXRvJiBuYW1lLCBib29sIGlzQWxsb3dlZCkgLT4gUGFja2FnZSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3RkOjptb3ZlKG5hbWUpLCBpc0FsbG93ZWR9OworICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgLy8gT25seSBhbGxvdyBwbGF5YmFjayByZWNvcmQgaWYgYWxsIHBhY2thZ2VzIGluIHRoaXMgVUlEIGFsbG93IGl0CisgICAgYm9vbCBwbGF5YmFja0NhcHR1cmVBbGxvd2VkID0gc3RkOjphbGxfb2YoYmVnaW4oaXNBbGxvd2VkKSwgZW5kKGlzQWxsb3dlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGJvb2wgYikgeyByZXR1cm4gYjsgfSk7CisKKyAgICByZXR1cm4gcGxheWJhY2tDYXB0dXJlQWxsb3dlZDsKK30KKwordm9pZCBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QgeworICAgIGRwcmludGYoZmQsICIlKnNBbGxvdyBwbGF5YmFjayBjYXB0dXJlIGxvZzpcbiIsIHNwYWNlcywgIiIpOworICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzTm8gcGFja2FnZSBtYW5hZ2VyXG4iLCBzcGFjZXMgKyAyLCAiIik7CisgICAgfQorICAgIGRwcmludGYoZmQsICIlKnNQYWNrYWdlIG1hbmFnZXIgZXJyb3JzOiAldVxuIiwgc3BhY2VzICsgMiwgIiIsIG1QYWNrYWdlTWFuYWdlckVycm9ycyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHVpZENhY2hlIDogbURlYnVnTG9nKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFja2FnZSA6IHN0ZDo6Z2V0PFBhY2thZ2VzPih1aWRDYWNoZSkpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlKnMtIHVpZD0lNXUsIGFsbG93UGxheWJhY2tDYXB0dXJlPSVzLCBwYWNrYWdlTmFtZT0lc1xuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PGNvbnN0IHVpZF90Pih1aWRDYWNoZSksCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UucGxheWJhY2tDYXB0dXJlQWxsb3dlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLm5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2Y0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9FdmVudExvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCisgICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoreworfQorCitUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7CisgICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK25zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7CisgICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7CisgICAgbUNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIGVuZFRpbWVOczsKK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOworICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKKyAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0CisgICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOworICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUlNQUdFX1JFQURFUl9VVElMU19ICisjZGVmaW5lIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFJldHJpZXZlcyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZV9oYW5kbGVfdAorLy8gcHJvdmlkZWQgKHRoaXMgbmF0aXZlIGhhbmRsZSBNVVNUIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKCkpLgorc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKKworfS8vIG5hbWVzcGFjZSBhaW1nCit9Ly8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQUlNQUdFX1JFQURFUl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2QzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKyNkZWZpbmUgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZWVwIHZhbHVlcyBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9hdi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncworZW51bSB7CisgIExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCA9IDYxMDAwLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2ZTYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBdWRpbyBwZXJtaXNzaW9uIHV0aWxpdGllcworCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBzeXN0ZW0gc2VydmljZXMuCisvLyBXZSBhbGxvdyB0aGF0IHNvbWUgc2VydmljZXMgbWlnaHQgaGF2ZSBzZXBhcmF0ZSBwcm9jZXNzZXMgdG8KKy8vIGhhbmRsZSBtdWx0aXBsZSB1c2VycywgZS5nLiB1MTBfc3lzdGVtLCB1MTBfYmx1ZXRvb3RoLCB1MTBfcmFkaW8uCitzdGF0aWMgaW5saW5lIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gYXVkaW9zZXJ2ZXIuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gVXNlZCBmb3Igc29tZSBwZXJtaXNzaW9uIGNoZWNrcy4KKy8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVIgfHwgdWlkID09IEFJRF9ST09UOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KKy8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPT0gQUlEX1NZU1RFTSB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyBNZWRpYXNlcnZlciBtYXkgZm9yd2FyZCB0aGUgY2xpZW50IFBJRCBhbmQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGw7CisvLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgc3dpdGNoICh1aWQpIHsKKyAgICBjYXNlIEFJRF9NRURJQToKKyAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Cit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKTsKK2Jvb2wgZHVtcEFsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKKworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KTsKKworY2xhc3MgTWVkaWFQYWNrYWdlTWFuYWdlciB7CitwdWJsaWM6CisgICAgLyoqIFF1ZXJ5IHRoZSBQYWNrYWdlTWFuYWdlciB0byBjaGVjayBpZiBhbGwgYXBwcyBvZiBhbiBVSUQgYWxsb3cgcGxheWJhY2sgY2FwdHVyZS4gKi8KKyAgICBib29sIGFsbG93UGxheWJhY2tDYXB0dXJlKHVpZF90IHVpZCkgeworICAgICAgICBhdXRvIHJlc3VsdCA9IGRvSXNBbGxvd2VkKHVpZCk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXJFcnJvcnMrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKKyAgICB9CisgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIG5hdGl2ZVBhY2thZ2VNYW5hZ2VyTmFtZSA9ICJwYWNrYWdlX25hdGl2ZSI7CisgICAgc3RkOjpvcHRpb25hbDxib29sPiBkb0lzQWxsb3dlZCh1aWRfdCB1aWQpOworICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFwcHMgbWFuaWZlc3QKKyAgICB1aW50X3QgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzID0gMDsKKyAgICBzdHJ1Y3QgUGFja2FnZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIGJvb2wgcGxheWJhY2tDYXB0dXJlQWxsb3dlZCA9IGZhbHNlOworICAgIH07CisgICAgdXNpbmcgUGFja2FnZXMgPSBzdGQ6OnZlY3RvcjxQYWNrYWdlPjsKKyAgICBzdGQ6Om1hcDx1aWRfdCwgUGFja2FnZXM+IG1EZWJ1Z0xvZzsKK307Cit9CisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBVVRJTFNfU0VSVklDRVVUSUxJVElFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCnJlbmFtZSB0byBtZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjlkYzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwYWNrYWdlIGlzIGV4Y2x1ZGVkIGZyb20gYnVpbGQgZm9yIG5vdyBzaW5jZSBBUElzIHVzaW5nIHRoaXMgYXBrIGJlY2FtZSBoaWRkZW4uCi0jCi0jTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotI2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpICMgQnVpbGQgTWVkaWFDb21wb25lbnRzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBQREsgYnVpbGQuICBNZWRpYUNvbXBvbmVudHMgd29uJ3QKLSMjIGJ1aWxkIGluIFBESyBidWlsZHMgYmVjYXVzZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIGlzIG5vdCBhdmFpbGFibGUgYnV0Ci0jIyBJTWVkaWFTZXNzaW9uMi5haWRsIGFuZCBJTWVkaWFDb250cm9sbGVyMi5haWRsIGFyZSB1c2luZyBjbGFzc2VzIGZyb20KLSMjIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEuCi0jCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0jCi0jTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50cwotI0xPQ0FMX01PRFVMRV9PV05FUiA6PSBnb29nbGUKLSMKLSMjIFRPRE86IGNyZWF0ZSBhIHNlcGFyYXRlIGtleSBmb3IgdGhpcyBwYWNrYWdlLgotI0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0jCi0jIyBUT0RPOiBVc2UgU3lzdGVtIFNESyBvbmNlIHB1YmxpYyBBUElzIGFyZSBhcHByb3ZlZAotIyMgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKLSNMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotIwotI0xPQ0FMX1NSQ19GSUxFUyA6PSBcCi0jICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0jICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKLSMKLSNMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmNmZwotIwotI0xPQ0FMX01VTFRJTElCIDo9IGZpcnN0Ci0jCi0jTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zCi0jCi0jIyBUbyBlbWJlZCBuYXRpdmUgbGlicmFyaWVzIGluIHBhY2thZ2UsIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cuCi0jI0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKLSMjTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotIyMgICAgbGliYWFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYmFtcmV4dHJhY3RvciBcCi0jIyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1pZGlleHRyYWN0b3IgXAotIyMgICAgbGlibWt2ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wM2V4dHJhY3RvciBcCi0jIyAgICBsaWJtcDRleHRyYWN0b3IgXAotIyMgICAgbGlibXBlZzJleHRyYWN0b3IgXAotIyMgICAgbGlib2dnZXh0cmFjdG9yIFwKLSMjICAgIGxpYndhdmV4dHJhY3RvciBcCi0jCi0jIyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIG90aGVyIHN1cHBvcnQgbGlicmFyaWVzLgotI0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1hcHBjb21wYXQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctcGFsZXR0ZQotI0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCi0jCi0jaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0jCi0jZW5kaWYgICMgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKLSMKLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZkY2ExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCi0gICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+Ci0KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQ29tcG9uZW50cyBVcGRhdGUiCi0gICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpleHRyYWN0TmF0aXZlTGlicz0iZmFsc2UiPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjczMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEtlZXAgZW50cnkgcG9pbnQgZm9yIHVwZGF0YWJsZSBKYXZhIGNsYXNzZXMKLS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSB7Ci0gICBwdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IGluaXRpYWxpemUoYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MjUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhkZGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljZDc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyYWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjcwN2VhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyZDAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1ZWUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQzNDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmI2NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMzA1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZmRlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzlkZjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM0NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDM0MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyM2U0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGMyNWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRiOWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2YzEwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYmY0ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MTFiNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVkNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjdlMGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTU4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTFhODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWFlZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzc3N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDg3OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkMmM5Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMmFiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2ZWE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDc5MGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZDU4Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYjc3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NjOTg0NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjE3ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZmVmM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTAwNDdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E1ZDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNDMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4OTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZmM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhYzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMDRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjMDYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJkNDk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzkzMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVhNmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTYxMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdhOWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjMzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MTgxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhNTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA1ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRlYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYjQxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxOGFiZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTgxMTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBiMTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWJhM2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzRkNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5NTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzg0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2Mjk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFiNjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTdmNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNjYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZWNkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDBiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiZTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRmMWJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThiNDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzJjMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYWU0NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0YzI4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5MzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUxZjY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmZhZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmJkODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczYTFmOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTA2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJiODAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYTAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2YyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjU0NzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NWFmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjdmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU3MGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0MDNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRiZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDYwNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDU1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYzQ4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4ZjhlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MGU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjM0YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ1MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxY2Y1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDhiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViM2YxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlOGIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGZjMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE2YWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OThjYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZDE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcwNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZkYjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzgyOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2NjNzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2VkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMWI5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxZGQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3OGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzViZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTkyMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg3ZTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA2ZGI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjI1YmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Njk3ZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZWMyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDBiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3YzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRjMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ2MTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDc3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZDdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGQ1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMzQ5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2M0NjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmY2ViZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTMyYTdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYyY2EzNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzMTI1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVlODdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0NDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE3ZTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1YzNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEzYmE1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNhMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzE4M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjZiMzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWE4ZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlYjEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmI2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYWE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVlZmU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNjMzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU2ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MTZjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MjkzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1YjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhMGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmE2NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGViYzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNzhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjk5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZhZDllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkOGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGZkNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGI1YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMWVmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MTBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFjMDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZiMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZThmZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiODQwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNDA1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxOGMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NTNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjkxYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWM2MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMGE2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxZjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODY2N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjgxODMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2YxOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTE1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZmYTAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWM0ZGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMTA5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NmYwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkwMDFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxNTgxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTYyMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjk1MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMWJkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZDJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ1MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjFhZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhM2Y4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMTY2Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1MjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIyYThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzdhZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjMxZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWI3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmEwZTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyNWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZlMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmYxZWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZGNkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOWI4MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZTQ0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5Y2E4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM3NWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2JkMjdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmIwYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTE0YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmU1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMjEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlN2UzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjAxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTI4ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmZkNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNzFhOGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGNiNmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzg4NjNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzNTAzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTQ4NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYTY3ODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM5NWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNzI4Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjBmNTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMzkzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDI1MzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyOGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Mjc3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjViZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNGFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA2NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzMjRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MThmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI0ZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWYwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWM3NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVjN2ZhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyODdlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2QwY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZhNzJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MGVlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDQzNTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3N2MzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyN2YwYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjE5YmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5MjFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNzZiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTUyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMxYTZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgotICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgotICAgICAgICA8L3NoYXBlPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNTk3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICA8c2l6ZQotICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjcxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTIwLDExSDcuODNsNS41OSwtNS41OUwxMiw0bC04LDggOCw4IDEuNDEsLTEuNDFMNy44MywxM0gyMHYtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyMjhlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTJiNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNzIwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzZkMTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTY0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjUxMmRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI1MTJkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjUxMiIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSI1MTIiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM2MTYxNjEiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0gMCAwIEggNTEyIFYgNTEyIEggMCBWIDAgWiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzUyNTI1MiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI1NiwxNTF2MTIzLjE0Yy02Ljg4LTQuMDItMTQuODItNi40OC0yMy4zMy02LjQ4IGMtMjUuNzgsMC00Ni42NywyMC44OC00Ni42Nyw0Ni42N2MwLDI1Ljc4LDIwLjg4LDQ2LjY3LDQ2LjY3LDQ2LjY3czQ2LjY3LTIwLjg4LDQ2LjY3LTQ2LjY3VjE5Ny42N0gzMjZWMTUxSDI1NnoiIC8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZjE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNmJjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01LDE2aDN2M2gydi01TDUsMTR2MnpNOCw4TDUsOHYyaDVMMTAsNUw4LDV2M3pNMTQsMTloMnYtM2gzdi0yaC01djV6TTE2LDhMMTYsNWgtMnY1aDVMMTksOGgtM3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNzVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCi0xN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCi0xLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQotMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTIyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWY2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDE5SDVWNWg3VjNINWMtMS4xMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuODksMiAyLDJoMTRjMS4xLDAgMiwtMC45IDIsLTJ2LTdoLTJ2N3pNMTQsM3YyaDMuNTlsLTkuODMsOS44MyAxLjQxLDEuNDFMMTksNi40MVYxMGgyVjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmUyMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzlkZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTAsMTYuNXYtOWw2LDQuNSAtNiw0LjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAotQzIyLDYuNDgsMTcuNTIsMiwxMiwyegotTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKLUMxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU4NmI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I2ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDNINUMzLjg5LDMsMywzLjksMyw1djE0YzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjVDMjEsMy45LDIwLjEsMywxOSwzegotTTEzLDloNGMwLjU1LDAsMSwwLjQ1LDEsMXY0IGMwLDAuNTUtMC40NSwxLTEsMWgtNFY5egotTTkuNSwxMy41di0xSDdjLTAuNTUsMC0xLTAuNDUtMS0xVjEwYzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDF2MUg5LjV2LTAuNWgtMnYxSDEwCi1jMC41NSwwLDEsMC40NSwxLDFWMTRjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTFoMS41djAuNUg5LjV6Ci1NMTQuNSwxMy41aDJ2LTNoLTJWMTMuNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllY2MxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYyODEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGEzMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDZoMnYxMkw2LDE4ek05LjUsMTJsOC41LDZMMTgsNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MWMwNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjJiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMyw5djZoNGw1LDVMMTIsNEw3LDlMMyw5ek0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3Y4LjA1YzEuNDgsLTAuNzMgMi41LC0yLjI1IDIuNSwtNC4wMnpNMTQsMy4yM3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxcy0yLjExLDUuODUgLTUsNi43MXYyLjA2YzQuMDEsLTAuOTEgNywtNC40OSA3LC04Ljc3cy0yLjk5LC03Ljg2IC03LC04Ljc3eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzdmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNDE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFkZmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDg0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0IiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGM4YzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTBlMGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLQotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM3ZWNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfZGFyayIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMjM1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzJiYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2ZkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDFmMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ1YTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjdhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTEwOGE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNmNlOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0ZmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZGJjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YTE3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwLjQiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmYyOTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZDM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0N2E3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E1OTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNzA1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjQjMwMEZGMDAiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlYTVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjhkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0Nzg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1OGYwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgotICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKLSAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+Ci0KLSAgICAgICAgPFNlZWtCYXIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgotICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgotCi0gICAgICAgIDxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGM4MGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5ZTE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODg3OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNDQ3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9tcl9leHBhbmRhYmxlX2FyZWEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kaWFsb2dfYXJlYSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZEZsb2F0aW5nIj4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX3RpdGxlX2JhciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNzJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2xvc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2N1c3RvbV9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RlZmF1bHRfY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yUHJpbWFyeSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbWVkaWFfbWFpbl9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9wbGF5YmFja19jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9wbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9kaXZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luY2UgZGlhbG9nJ3MgdG9wIGxheW91dCBtcl9leHBhbmRhYmxlX2FyZWEgaXMgY2xpY2thYmxlLCBpdCBwcm9wYWdhdGVzIHByZXNzZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIG5vbi1jbGlja2FibGUgY2hpbGRyZW4uIFNwZWNpZnkgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIHRvIHByZXZlbnQgdm9sdW1lIHNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhhdmluZyBmYWxzZSBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2dyb3VwX2xpc3QiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyU3R5bGU9Im91dHNpZGVPdmVybGF5IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgotICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvbkJhclN0eWxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEluZGljYXRvcnM9InRvcHxib3R0b20iPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkcCI+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24zIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZXV0cmFsQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIi8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24yIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZWdhdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyUG9zaXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDwvYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ+Ci0gICAgICAgIDwvU2Nyb2xsVmlldz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkwNThiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzA1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCi0gICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgotPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZmM2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGdyYWRpZW50Ci0gICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCIKLSAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9lbmQiCi0gICAgICAgIGFuZHJvaWQ6YW5nbGU9Ii0yNzAiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjMwYWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjk3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYp9mE2YbYuNin2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KfZhNij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYstixINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINis2KfYsdmNINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KXYsdiz2KfZhCDYpdmE2YkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYrNin2LHZjSDYp9mE2KjYrdirINi52YYg2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYpdmK2YLYp9mBINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYpdi62YTYp9mCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2KrYtNi62YrZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2KXZitmC2KfZgSDZhdik2YLYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itil2YrZgtin2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqtmI2LPZiti5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYqti12LrZitixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LXZiNix2Kkg2KfZhNij2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2LTYsdmK2Lcg2KrZhdix2YrYsSDZhdiz2KrZiNmJINin2YTYtdmI2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItmE2YUg2YrYqtmFINin2K7YqtmK2KfYsSDYo9mKINmI2LPYp9im2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItmE2Kcg2KrYqtmI2YHYsSDYo9mKINmF2LnZhNmI2YXYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYrNin2LHZjSDYpdix2LPYp9mEINin2YTYtNin2LTYqSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjBhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWJkNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHRltGB0YLRjdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNGL0LvQsNC00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCQ0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQhtC00LfQtSDQv9Cw0LTQutC70Y7Rh9GN0L3QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0J/QsNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70ZbRgNCw0LLQsNGG0Ywg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNGL0LvQsNC0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LTQu9GD0YfRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0YvQvdGW0YbRjCDRgtGA0LDQvdGB0LvRj9GG0YvRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GA0LDQudCz0YDQsNGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDRi9C/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQktC+0LrQu9Cw0LTQutCwINCw0LvRjNCx0L7QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LDRntC30YPQvdC+0Log0LPRg9GH0L3QsNGB0YbRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00YvRj9GE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC90YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LTRgdGD0YLQvdGW0YfQsNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC9INGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxMmQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1OTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzc0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgemEgZW1pdGlyYW5qZS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6YW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplZGFuIG1lZGlqIG5pamUgb2RhYnJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVtYSBkb3N0dXBuaWggaW5mb3JtYWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWFjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4OTIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdhNzkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwLiBGb3JiaW5kZWxzZW4gZXIgYWZicnVkdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwLiBPcHJldHRlciBmb3JiaW5kZWxzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXAuIFRpbHNsdXR0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kZXIgZW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZmJyeWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIG1lZCBhdCBjYXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTw6Z0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVZHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJMeWRzdHlya2Vza3lkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2VuIG1lZGllciBlciBtYXJrZXJldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGVyIGVyIGluZ2VuIHRpbGfDpm5nZWxpZ2Ugb3BseXNuaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6ZybWVuIGNhc3RlcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjU3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmY2OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwMDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWVhZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDMwMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVudmlhci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbnZpYXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgZW52w61vIGRlIGNvbnRlbmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGUgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmfDum4gbWVkaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhheSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW52aWFuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIzNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTE5ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM3NzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPbjNiz2KrZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2K/aqdmF2Ycg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINin2LHYqtio2KfYtyDZgti32Lkg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINiv2LHYrdin2YQg2YXYsdiq2KjYt+KAjNiz2KfYstuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDZhdix2KrYqNi3INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsdiz2KfZhCDZhdit2KrZiNinINio2YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLZvtuM2K/YpyDaqdix2K/ZhiDYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9ix2KrYqNin2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYqtmI2YLZgSDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2LPYqtmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2b7Yrti0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdqp2KsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYqtmI2YLZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itio2LLYsdqvINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLaqdmI2obaqSDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti52qnYsyDYsdmI24wg2KzZhNivINii2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YTYutiy2YbYr9mHINmF24zYstin2YYg2LXYr9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLYsdiz2KfZhtmHINin2YbYqtiu2KfYqCDZhti02K/ZhyDYp9iz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itin2LfZhNin2LnYp9iqINiv2LEg2K/Ys9iq2LHYsyDZhtuM2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2K/Ysdit2KfZhCDZgdix2LPYqtin2K/ZhiDYtdmB2K3ZhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MzQzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk4NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzMxMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWPDtG5lIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJY8O0bmUgQ2FzdC4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJY8O0bmUgQ2FzdC4gQ29ubmV4aW9u4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikljw7RuZSBDYXN0LiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWN0dXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYzM1NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVmM2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyYTU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpL7gpIfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkh+CkuCDgpKrgpLAg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCkvuCkh+CkuCDgpKLgpYLgpILgpKIg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCkqOCkviDgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSa4KSy4KS+4KSP4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KSb4KWL4KSf4KS+IOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWL4KSIIOCkruClgOCkoeCkv+Ckr+CkviDgpJrgpK/gpKjgpL/gpKQg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSIIOCknOCkvuCkqOCkleCkvuCksOClgCDgpK7gpYzgpJzgpYLgpKYg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeCknyDgpLngpYsg4KSw4KS54KWAIOCkueCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2VlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YmRmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4MmI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItWA1aHVtNWh1a/VodaA1aMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i1Y3VodaA1oTVpdaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNW2INWh1bbVu9Wh1b/VvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtW41oLVtCDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItS41bbVv9aA1aXWhCDVvdWh1oDWhNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i1Y3VodaA1oTVpdaA1asg1bjWgNW41bbVuNaC1bQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i1LHVttW71aHVv9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLUtNWh1aTVodaA1aXWgdW21aXVrCDVsNWl1bzVodaA1bHVodWv1bjWgtW01agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItWT1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLVhtW+1aHVo9Wh1oDVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItS01aHVpNWh1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLUtNWh1aTVodaA1aXWgdW21aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItS41bbVpNWh1oDVsdWh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLUv9W41a7Vr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLUsdWs1aLVuNW01asg1bfVodW61avVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLVgdWh1bXVttWrINW41oLVqtWj1bbVuNaC1anVtdWh1bYg1a/VodaA1aPVodW+1bjWgNWr1bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItWE1aXVpNWr1aEg1obVodW11azVpdaAINW51aXVtiDVqNW21b/WgNW+1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i1Y/VpdWy1aXVr9W41oLVqdW11bjWgtW21bbVpdaA1agg1bDVodW91aHVttWl1azVqyDVudWl1bYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItS31a/WgNWh1bbVqCDVsNWl1bzVodaA1bHVodWv1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjc1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVlYTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZlM2FjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQdWxzYW50ZSBUcmFzbWV0dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIERpc2Nvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3Npb25lIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhc21ldHRpIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSaWNlcmNhIGRpIGRpc3Bvc2l0aXZpIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNjb2xsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21waSB0cmFzbWlzc2lvbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNoaXVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJpcHJvZHVjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJbnRlcnJvbXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXNwYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29tcHJpbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJDb3BlcnRpbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRGlzcG9zaXRpdm8gZGkgc2NvcnJpbWVudG8gZGVsIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVzc3VuIGNvbnRlbnV0byBtdWx0aW1lZGlhbGUgc2VsZXppb25hdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lc3N1bmEgaW5mb3JtYXppb25lIGRpc3BvbmliaWxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFzbWlzc2lvbmUgZGVsbG8gc2NoZXJtbyBpbiBjb3JzbyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYjBjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTcyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEwODFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGDoeGDmOGDoeGDouGDlOGDm+GDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOS4YOQ4YOX4YOY4YOo4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5A6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOY4YOhIOGDm+GDneGDq+GDmOGDlOGDkeGDkC4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5jhg6Eg4YOS4YOQ4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YOT4YOQ4YOu4YOj4YOg4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YOT4YOQ4YOZ4YOV4YOg4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhg57hg5Dhg6Phg5bhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhg5Lhg5Dhg6jhg5rhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGDqeGDkOGDmeGDlOGDquGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGDkOGDmuGDkeGDneGDm+GDmOGDoSDhg5Lhg5Dhg6Dhg5Thg5nhg5Dhg5zhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YOu4YOb4YOY4YOhIOGDoeGDmuGDkOGDmOGDk+GDlOGDoOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YOb4YOU4YOT4YOY4YOQIOGDkOGDoOGDqeGDlOGDo+GDmuGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoSDhg67hg5Thg5rhg5vhg5jhg6Hhg5Dhg6zhg5Xhg5Phg53hg5vhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Thg5nhg6Dhg5Dhg5zhg5jhg6Eg4YOS4YOQ4YOT4YOQ4YOq4YOU4YOb4YOQIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDc4MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzN2ZkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsrjgsr/gsrjgs43gsp/gsoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LK44LK+4LKn4LKo4LKX4LKz4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgsrLgsr7gspfgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsqTgspfgs4rgsoLgsqHgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LKH4LKm4LKV4LON4LKV4LOGIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCyuOCyvuCyp+CyqOCyl+Cys+CyqOCzjeCyqOCzgSDgsrngs4HgsqHgs4HgspXgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgeCyteCyv+CyleCzhiDgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCyruCzgeCymuCzjeCymuCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCyquCzjeCysuCzhyDgsq7gsr7gsqHgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCyteCyv+CysOCyvuCyriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCyteCyv+CyuOCzjeCypOCysOCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LK44LKC4LKV4LOB4LKa4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LKG4LKy4LON4LKs4LKu4LONIOCyleCysuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsrXgsr7gsrLgs43gsq/gs4Lgsq7gs40g4LK44LON4LKy4LOI4LKh4LKw4LONIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LKn4LON4LKv4LKuIOCyhuCyr+CzjeCyleCzhuCyruCyvuCyoeCysuCyvuCyl+Cyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyueCyv+CypOCyvyDgsrLgsq3gs43gsq/gsrXgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCyquCysOCypuCzhuCyr+CyqOCzjeCyqOCzgSDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODkzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MTNhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYxZTFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+MTMyZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjFkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MThkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzM3ZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMzZkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDA2M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdMSTbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iSWVyxKtjZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJBcHJhaWRlcyBwb2dhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgcMSBcnRyYXVrdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkFwcmFpZGVzIHBvZ2EuIE5vdGllayBzYXZpZW5vanVtYSBpenZlaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIGl6dmVpZG90cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJBcHJhaWTEq8WhYW5hIHV6IGllcsSrY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOb3RpZWsgaWVyxKvEjXUgbWVrbMSTxaFhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXR2aWVub3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcHR1csSTdCBhcHJhaWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJBaXp2xJNydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkF0c2thxYZvdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikl6dsSTcnN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYWvEvGF1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYSB2xIFjacWGxaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2thxLx1bWEgc2zEq2RuaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5hdiBhdGxhc8SrdGkgbXVsdGl2aWRlcyBmYWlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmF2IHBpZWVqYW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTm90aWVrIGVrcsSBbmEgYXByYWlkZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZWUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNGI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotOp0YXTqdOp0YDTqdC80LbSr9Kv0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQodCw0LvRgdCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtCz0LTRgdC+0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JTQsNC80LbRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLTqdGF06nTqdGA06nQvNC2INGF0LDQudC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0KHQsNC70LPQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JTQsNC80LbRg9GD0LvQsNGF0YvQsyDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0KXQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQotC+0LPQu9GD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0q/RgCDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JTRjdC70LPRjdGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQpdGD0YDQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQptC+0LzQs9C40LnQvSDQt9GD0YDQsNCzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YPRg9C90Ysg0YLSr9Cy0YjQuNC9INGC0LDQsNGA0YPRg9C70LDQs9GHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQr9C80LDRgCDRhyDQvNC10LTQuNCwINGB0L7QvdCz0L7QvtCz0q/QuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JzRjdC00Y3RjdC70Y3QuyDQsdCw0LnRhdCz0q/QuSDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQlNGN0LvQs9GN0YbQuNC50LMg0LTQsNC80LbRg9GD0LvQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiZWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1ZTQ4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q4MDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YCF4YCU4YCF4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGAgOGArOGAheGAuuGAkOGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIHhgJzhgK/hgJDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCZ4YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCU4YCx4YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJHhgKzhgLjhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAheGAgOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCDhgJvhgL7hgKzhgJbhgL3hgLHhgIHhgLzhgIThgLrhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YCG4YCA4YC64YCe4YC94YCa4YC64YCZ4YC+4YCvIOGAluGAvOGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAgeGAvOGAhOGAuuGAuCDhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGAleGAreGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGAluGAveGAhOGAt+GAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YCB4YCP4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YCW4YC84YCU4YC34YC64YCB4YC74YCb4YCU4YC64YGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhgIHhgLHhgKvhgIDhgLrhgJ7hgK3hgJnhgLrhgLjhgJvhgJThgLouLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhgKHhgJrhgLrhgJzhgLrhgJjhgJnhgLrhgJXhgK/hgLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YCh4YCe4YC24YCh4YCQ4YCt4YCv4YC44YCh4YCA4YC74YCa4YC64YCB4YC74YCt4YCU4YC64YCe4YCK4YC34YC6IOGAhuGAnOGAreGAr+GAgOGAuuGAkuGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YCZ4YCK4YC64YCe4YCK4YC34YC64YCZ4YCu4YCS4YCu4YCZ4YC+IOGAmeGAm+GAveGAseGAuOGAgeGAu+GAmuGAuuGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YCh4YCB4YC74YCA4YC64YCh4YCc4YCA4YC6IOGAmeGAm+GAm+GAvuGAreGAlOGAreGAr+GAhOGAuuGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YCQ4YCK4YC64YC44YCW4YC84YCQ4YC64YCb4YCx4YC4IOGAmeGAu+GAgOGAuuGAlOGAvuGArOGAleGAvOGAhOGAuiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NjRjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmNjJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJhdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pY29vbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgdmVyYnJva2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIG1ha2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtaWNvb24uIFZlcmJvbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZW4gbmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkFwcGFyYXRlbiB6b2VrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTG9za29wcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0ZW4gc3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2x1aXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJPbmRlcmJyZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVaXR2b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhbWVudm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ob2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZXNjaHVpZnJlZ2VsYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmZvcm1hdGllIGJlc2NoaWtiYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTY2hlcm0gY2FzdGVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVkZjcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MmE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBhNjFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjJmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIERlY29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gU2UgY29uZWN0ZWF6xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBDb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcm9pZWN0YcibaSBwZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlIGNhdXTEgyBkaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZWNvbmVjdGHIm2ktdsSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTnUgbWFpIHByb2llY3RhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLDjm5jaGlkZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlZGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IsOObnRyZXJ1cGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJPcHJpyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXh0aW5kZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVzdHLDom5nZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkdyYWZpY2EgYWxidW11bHVpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaXNvciBwZW50cnUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pY2l1biBmaciZaWVyIG1lZGlhIHNlbGVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdSBzdW50IGRpc3BvbmliaWxlIGluZm9ybWHIm2lpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTZSBwcm9pZWN0ZWF6xIMgZWNyYW51bCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWNlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNaWRsbyBwcmVub3N1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI1pZGxvIHByZW5vc3UuIE9kcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXDDoWphIHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZW5vcyBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkjEvmFkYWrDuiBzYSB6YXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2acWlIHByZW7DocWhYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2cmllxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVocmHFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlpiYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYnLDoXpvayBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zw7p2YcSNIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSBzw7ogdnlicmFuw6kgxb5pYWRuZSBtw6lkacOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaWUgc8O6IGvCoGRpc3BvesOtY2lpIMW+aWFkbmUgaW5mb3Jtw6FjaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZW7DocWhYSBzYSBvYnJhem92a2EiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTRjZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZTExMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdGS0LDRmNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCS0LXQt9CwINGY0LUg0L/RgNC10LrQuNC90YPRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30YPRmNC1INGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9Cw0L0g0ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQsdCw0YbRg9GYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9GA0L7QvdCw0LvQsNC20LXRmtC1INGD0YDQtdGS0LDRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60LjQvdC4INCy0LXQt9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JfQsNGD0YHRgtCw0LLQuCDQv9GA0LXQsdCw0YbQuNCy0LDRmtC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9Cw0YPRgdGC0LDQstC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LrRg9C/0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntC80L7RgiDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JrQu9C40LfQsNGHINC30LAg0ZjQsNGH0LjQvdGDINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LXQvNCwINC40LfQsNCx0YDQsNC90LjRhSDQvNC10LTQuNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LjRgdGDINC00L7RgdGC0YPQv9C90LUg0L3QuNC60LDQutCy0LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/RgNC10LHQsNGG0YPRmNC1INGB0LUg0LXQutGA0LDQvSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZDNlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyY2IxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjYwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjkwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhYjhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTc4ZjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMTJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsLjgsL/gsLjgsY3gsJ/gsK7gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwvyDgsKzgsJ/gsKjgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LCm4LGA4LCo4LC/4LCV4LC/IOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsILgsKHgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsKjgsYEg4LCV4LCo4LGB4LCX4LGK4LCC4LCf4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsL7gsKjgsY3gsKjgsL8g4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsK7gsYLgsLjgsL/gsLXgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsKrgsY3gsLLgsYcg4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsKrgsL7gsJzgsY0g4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LC14LC/4LC44LGN4LCk4LCw4LC/4LCC4LCq4LCc4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsJXgsYHgsKbgsL/gsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsIbgsLLgsY3gsKzgsK7gsY0g4LCG4LCw4LGN4LCf4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCwteCwvuCwsuCxjeCwr+CxguCwruCxjSDgsLjgsY3gsLLgsK/gsL/gsKHgsLDgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCwruCxgOCwoeCwv+Cwr+CwviDgsI/gsKbgsYAg4LCO4LCC4LCa4LGB4LCV4LGL4LCs4LCh4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsLjgsK7gsL7gsJrgsL7gsLDgsIIg4LCF4LCC4LCm4LGB4LCs4LC+4LCf4LGB4LCy4LGLIOCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LC44LGN4LCV4LGN4LCw4LGA4LCo4LGN4oCM4LCo4LGBIOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYThhZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2QwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjM5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW5sYSBkw7zEn21lc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW50xLEga2VzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsWedXJheWEgeWF5xLFubGE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYnVsdW51eW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLF5xLEga2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFuxLEgZHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJLYXBhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJha2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2xldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iRGFyYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxiw7xtIGthcGHEn8SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNlcyBkw7x6ZXlpIGtheWTEsXJtYSDDp3VidcSfdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVkeWEgc2XDp2lsbWVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQmlsZ2kgeW9rIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW5sYW7EsXlvciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMzY1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYzU5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDgxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJUaXppbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJRdXJpbG1hbGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVXppbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbm1vcWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUXV5aWRhZ2lnYSB0cmFuc2xhdHNpeWEgcWlsaXNoOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlF1cmlsbWFsYXJuaSB0b3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVWxhbmlzaG5pIHV6aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVHJhbnNsYXRzaXlhbmkgdG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJZb3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJCb3NobGFzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVG/igJh4dGF0aWIgdHVyaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWW95aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZaWfigJhpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBtdXFvdmFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUb3Z1c2ggYmFsYW5kbGlnaSBzbGF5ZGVyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTXVsdGltZWRpYSB0YW5sYW1hZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIZWNoIHFhbmRheSBtYeKAmWx1bW90IHlv4oCYcSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW5uaSB0cmFuc2xhdHNpeWEgcWlsaXNoIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4Y2NhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIyZDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU1YzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXjgILlt7Lop6PpmaTpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIleOAguato+WcqOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXjgILlt7LpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+6IezIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuWwmuacqumBuOaTh+WqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ6Kmz57Sw6LOH5paZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZmRlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2M0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg3MzIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXItYXJyYXkgbmFtZT0ic3BlZWRfbXVsdGlwbGllZF9ieV8xMDAiPgotICAgICAgICA8aXRlbT4yNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjc1PC9pdGVtPgotICAgICAgICA8aXRlbT4xMDA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTUwPC9pdGVtPgotICAgICAgICA8aXRlbT4yMDA8L2l0ZW0+Ci0gICAgPC9pbnRlZ2VyLWFycmF5PgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyODViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+Ci0gICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQotICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZwotICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+Ci0KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzI5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdiMDIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEaWFsb2cgc2l6ZSAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj4zMjBkcDwvZGltZW4+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj4zMjBkcDwvZGltZW4+Ci0KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+Mjg4ZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjhkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCI+MTZkcDwvZGltZW4+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGV4cGFuZC9jb2xsYXBzZSBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgaW4gYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBvdXQgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zIj4yMDA8L2ludGVnZXI+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCI+MTUwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIj4yMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MThkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjEyc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEwc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgiPjIyNWRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCI+NTRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiPjMwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjI3ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjE2c3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTNzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfc2V0dGluZ3Nfb2Zmc2V0Ij44ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciPjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfcGF1c2VfaWNvbl9zaXplIj4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2ljb25fc2l6ZSI+MjhkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9taW5pbWFsX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfaWNvbl9tYXJnaW4iPjEwZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIj4yMzJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSI+MTc2ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIj4yZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4xMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9idWZmZXJfdmlld19oZWlnaHQiPjVkcDwvZGltZW4+Ci0gICAgPCEtLSBUT0RPOiBhZGp1c3QgYm90dG9tIGJhciB2aWV3IC0tPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3YTNiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KLSAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+Ci0gICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgotICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KLSAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgotICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4yeDwvaXRlbT4KLSAgICA8L3N0cmluZy1hcnJheT4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+Ci0KLSAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWE4ZWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2OTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fZGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkxpZ2h0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuVGl0bGUiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlN1YmhlYWQiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuQm9keTEiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGU4YzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTc1NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotCi0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFhMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFVzYWdlICcuIHJ1bmN0cy5zaCcKLQotZnVuY3Rpb24gX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlKCkgewotICBlY2hvICdydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMgW29wdGlvbl06IEJ1aWxkLCBmbGFzaCBkZXZpY2UsJwotICBlY2hvICcgICAgICAgICAgICAgIGFuZCBydW4gc3Vic2V0IG9mIEN0c01lZGlhVGVzdENhc2VzIHRoYXQgTWVkaWFDb21wb25lbnRzIGNvdmVycy4nCi0gIGVjaG8gJyAgICAgICAgICAqV2FybmluZyogVGhpcyBieXBhc3NlcyBDVFMgc2V0dXAgKGUuZy4gZG93bmxvYWQgbWVkaWEgY29udGVudHMgZnJvbSBzZXJ2ZXIpJwotICBlY2hvICcgICAgICAgICAgRm9yIHJ1bm5pbmcgQ1RTIGluIG9mZmljaWFsIHdheSwgdXNlIGF0ZXN0IG9yIGN0cy10cmFkZWZlZCAnCi0gIGVjaG8gJyAgICAgLWh8LS1oZWxwOiBUaGlzIGhlbHAnCi0gIGVjaG8gJyAgICAgLS1za2lwOiBTa2lwIGJ1aWxkIGFuZCBmbGFzaC4gSnVzdCByZXJ1bi10ZXN0cycKLSAgZWNobyAnICAgICAtLW1pbjogT25seSByZWJ1aWxkIHRlc3RzIGFuZCB1cGRhdGFibGUgbGlicmFyeS4nCi0gIGVjaG8gJyAgICAgLS10ZXN0OiBPbmx5IHJlYnVpbGQgdGVzdHMnCi0gIGVjaG8gJyAgICAgLXMgW2RldmljZV9pZF06IFNwZWNpZnkgYSBkZXZpY2UgbmFtZSB0byBydW4gdGVzdCBhZ2FpbnN0LicKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZWZpbmUgJHtBREJIT1NUfSBpbnN0ZWFkLicKLSAgZWNobyAnICAgICAtciBbY291bnRdOiBSZXBlYXQgdGVzdHMgZm9yIGdpdmVuIGNvdW50LiBJdCB3aWxsIHN0b3Agd2hlbiBmYWlscy4nCi0gIGVjaG8gJyAgICAgLS1pZ25vcmU6IEtlZXAgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gd2hlbiBpdCBmYWlscy4nCi0gIGVjaG8gJyAgICAgLXQgW3Rlc3RdOiBPbmx5IHJ1biB0aGUgc3BlY2lmaWMgdGVzdC4gQ2FuIGJlIGVpdGhlciBhIGNsYXNzIG9yIGEgbWV0aG9kLicKLX0KLQotZnVuY3Rpb24gcnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzKCkgewotICAjIEVkaXQgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIHRlc3RzLgotICAjIExpc3QgdXAgbGlicyBhbmQgYXBrcyBpbiB0aGUgbWVkaWFfYXBpIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBwbGFjZSB0ZXN0IHRhcmdldCBhdCB0aGUgbGFzdC4KLSAgbG9jYWwgVEVTVF9QQUNLQUdFX0RJUj0oImZyYW1ld29ya3MvYXYvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3QiKQotICBsb2NhbCBURVNUX1BBQ0tBR0U9KCJhbmRyb2lkLm1lZGlhLmN0cyIpCi0gIGxvY2FsIEJVSUxEX1RBUkdFVFM9KCJNZWRpYUNvbXBvbmVudHMiICJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gICMgRG9uJ3QgaW5jbHVkZSBNZWRpYUNvbXBvbmVudHMgLS0gaWYgd2Ugc2ltcGx5IGluc3RhbGwgaXQsIHN5c3RlbSBzZXJ2ZXIKLSAgIyB3b3VsZG4ndCB1c2UgdGhlIGluc3RhbGxlZCBvbmUuCi0gIGxvY2FsIElOU1RBTExfVEFSR0VUUz0oIkN0c01lZGlhVGVzdENhc2VzIikKLSAgbG9jYWwgVEVTVF9SVU5ORVI9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gIGxvY2FsIERFUEVOREVOQ0lFUz0oIm1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCIgImFuZHJvaWQtc3VwcG9ydC10ZXN0IiAiY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCIpCi0gIGxvY2FsIERFRkFVTFRfVEVTVF9UQVJHRVQ9IiIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9ImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQnJvd3NlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQ29udHJvbGxlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGEyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yX1Blcm1pc3Npb25UZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbk1hbmFnZXJfTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuU2Vzc2lvblRva2VuMlRlc3QiCi0gIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV07IHRoZW4KLSAgICBlY2hvICJOZWVkcyB0byBsdW5jaCBhIHRhcmdldCBmaXJzdCIKLSAgICByZXR1cm4KLSAgZmkKLQotICBsb2NhbCBvbGRfcGF0aD0ke09MRFBXRH0KLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBsb2NhbCBPUFRJT05fU0tJUD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX01JTj0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1Q9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9SRVBFQVRfQ09VTlQ9IjEiCi0gICAgbG9jYWwgT1BUSU9OX0lHTk9SRT0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1RfVEFSR0VUPSIke0RFRkFVTFRfVEVTVF9UQVJHRVR9IgotICAgIGxvY2FsIGFkYmhvc3RfbG9jYWwKLSAgICB3aGlsZSAoKCAiJCMiICkpOyBkbwotICAgICAgY2FzZSAiJHsxfSIgaW4KLSAgICAgICAgLWh8LS1oZWxwKQotICAgICAgICAgIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQotICAgICAgICAgIHJldHVybgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tc2tpcCkKLSAgICAgICAgICBPUFRJT05fU0tJUD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLW1pbikKLSAgICAgICAgICBPUFRJT05fTUlOPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tdGVzdCkKLSAgICAgICAgICBPUFRJT05fVEVTVD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtcykKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIGFkYmhvc3RfbG9jYWw9JHsxfQotICAgICAgICAgIDs7Ci0gICAgICAgIC1yKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1JFUEVBVF9DT1VOVD0iJHsxfSIKLSAgICAgICAgICA7OwotICAgICAgICAtLWlnbm9yZSkKLSAgICAgICAgICBPUFRJT05fSUdOT1JFPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC10KQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1RFU1RfVEFSR0VUPSIkezF9IgotICAgICAgZXNhYwotICAgICAgc2hpZnQKLSAgICBkb25lCi0KLSAgICAjIEJ1aWxkIGFkYiBjb21tYW5kLgotICAgIGxvY2FsIGFkYgotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgYWRiaG9zdF9sb2NhbD0ke0FEQkhPU1R9Ci0gICAgZmkKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGxvY2FsIGRldmljZV9jb3VudD0kKGFkYiBkZXZpY2VzIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCB3YyAtbCkKLSAgICAgIGlmIFtbICIke2RldmljZV9jb3VudH0iICE9ICIyIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJUb28gbWFueSBkZXZpY2VzLiBTcGVjaWZ5IGEgZGV2aWNlLiIgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgICBhZGI9ImFkYiIKLSAgICBlbHNlCi0gICAgICBhZGI9ImFkYiAtcyAke2FkYmhvc3RfbG9jYWx9IgotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS8ke1RFU1RfUEFDS0FHRV9ESVJ9IgotICAgICNsb2NhbCBURVNUX1BBQ0tBR0U9JChzZWQgLW4gJ3MvXi4qXGJwYWNrYWdlXGI9IlwoW2EtejAtOVwuXSpcKSIuKiQvXDEvcCcgJHt0YXJnZXRfZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sKQotCi0gICAgaWYgW1sgIiR7T1BUSU9OX1NLSVB9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGlmIG5lZWRlZC4KLSAgICAgIGxvY2FsIGRlcGVuZGVuY3kKLSAgICAgIGxvY2FsIGJ1aWxkX2RlcGVuZGVuY3k9IiIKLSAgICAgIGZvciBkZXBlbmRlbmN5IGluICR7REVQRU5ERU5DSUVTW0BdfTsgZG8KLSAgICAgICAgaWYgW1sgIiR7ZGVwZW5kZW5jeX0iID09ICJvdXQvIiogXV07IHRoZW4KLSAgICAgICAgICBpZiBbWyAhIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7ZGVwZW5kZW5jeX0gXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiBbWyAiJChmaW5kICR7T1VUfSAtbmFtZSAke2RlcGVuZGVuY3l9X2ludGVybWVkaWF0ZXMgfCB3YyAtbCkiID09ICIwIiBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2J1aWxkX2RlcGVuZGVuY3l9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiQnVpbGRpbmcgZGVwZW5kZW5jaWVzLiBXaWxsIG9ubHkgcHJpbnQgc3RkZXJyLiIKLSAgICAgICAgbSAke0RFUEVOREVOQ0lFU1tAXX0gLWogPiAvZGV2L251bGwKLSAgICAgIGZpCi0KLSAgICAgICMgQnVpbGQgdGVzdCBhcGsgYW5kIHJlcXVpcmVkIGFway4KLSAgICAgIGxvY2FsIGJ1aWxkX3RhcmdldHMKLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7SU5TVEFMTF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsaWYgW1sgIiR7T1BUSU9OX01JTn0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IgotICAgICAgZWxzZQotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IGRyb2lkIgotICAgICAgZmkKLSAgICAgIG0gJHtidWlsZF90YXJnZXRzfSAtaiB8fCBicmVhawotCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICAjIEZsYXNoIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgbG9jYWwgZGV2aWNlX2J1aWxkX3R5cGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYnVpbGQudHlwZSkiCi0gICAgICAgIGlmIFtbICIke2RldmljZV9idWlsZF90eXBlfSIgPT0gInVzZXIiIF1dOyB0aGVuCi0gICAgICAgICAgIyBVc2VyIGJ1aWxkLiBDYW5ub3QgYWRiIHN5bmMKLSAgICAgICAgICAke2FkYn0gcmVib290IGJvb3Rsb2FkZXIKLSAgICAgICAgICBmYXN0Ym9vdCBmbGFzaGFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBsb2NhbCBkZXZpY2VfdmVyaXR5X21vZGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYm9vdC52ZXJpdHltb2RlKSIKLSAgICAgICAgICBpZiBbWyAiJHtkZXZpY2VfdmVyaXR5X21vZGV9IiAhPSAiZGlzYWJsZWQiIF1dOyB0aGVuCi0gICAgICAgICAgICAke2FkYn0gZGlzYWJsZS12ZXJpdHkKLSAgICAgICAgICAgICR7YWRifSByZWJvb3QKLSAgICAgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgZmkKLSAgICAgICAgICAke2FkYn0gcmVtb3VudAotICAgICAgICAgICR7YWRifSBzaGVsbCBzdG9wCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHNldHByb3AgbG9nLnRhZy5NZWRpYVNlc3Npb25TZXJ2aWNlIERFQlVHCi0gICAgICAgICAgJHthZGJ9IHN5bmMKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RhcnQKLSAgICAgICAgZmkKLSAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAjIEVuc3VyZSBwYWNrYWdlIG1hbmFnZXIgaXMgbG9hZGVkLgotICAgICAgICAjIFRPRE8oamFld2FuKTogRmluZCBiZXR0ZXIgd2F5IHRvIHdhaXQKLSAgICAgICAgc2xlZXAgMTUKLSAgICAgIGZpCi0KLSAgICAgICMgSW5zdGFsbCBhcGtzCi0gICAgICBsb2NhbCBpbnN0YWxsX2ZhaWxlZD0iZmFsc2UiCi0gICAgICBmb3IgdGFyZ2V0IGluICR7SU5TVEFMTF9UQVJHRVRTW0BdfTsgZG8KLSAgICAgICAgbG9jYWwgYXBrX3BhdGg9JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwaykKLSAgICAgICAgbG9jYWwgYXBrX251bT0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrIHwgd2MgLWwpCi0gICAgICAgIGlmIFtbICIke2Fwa19udW19IiAhPSAiMSIgXV07IHRoZW4KLSAgICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGEgJHt0YXJnZXR9LmFway4gRm91bmQgJHthcGtfbnVtfSBhcGtzIiAmJiBicmVhawotICAgICAgICBmaQotICAgICAgICBlY2hvICJJbnN0YWxsaW5nICR7dGFyZ2V0fS5hcGsuIHBhdGg9JHthcGtfcGF0aH0iCi0gICAgICAgICR7YWRifSBpbnN0YWxsIC1yICR7YXBrX3BhdGh9Ci0gICAgICAgIGlmIFtbICIkez99IiAhPSAiMCIgXV07IHRoZW4KLSAgICAgICAgICBpbnN0YWxsX2ZhaWxlZD0idHJ1ZSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7aW5zdGFsbF9mYWlsZWR9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGluc3RhbGwuIFRlc3Qgd291bGRuJ3QgcnVuLiIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGxvY2FsIHRlc3RfdGFyZ2V0PSIiCi0gICAgaWYgW1sgLW4gIiR7T1BUSU9OX1RFU1RfVEFSR0VUfSIgXV07IHRoZW4KLSAgICAgIHRlc3RfdGFyZ2V0PSItZSBjbGFzcyAke09QVElPTl9URVNUX1RBUkdFVH0iCi0gICAgZmkKLQotICAgIGxvY2FsIGkKLSAgICBsb2NhbCB0bXBmaWxlPSQodGVtcGZpbGUpCi0gICAgZm9yICgoaT0xOyBpIDw9ICR7T1BUSU9OX1JFUEVBVF9DT1VOVH07IGkrKykpOyBkbwotICAgICAgZWNobyAiUnVuIHRlc3QgJHtpfS8ke09QVElPTl9SRVBFQVRfQ09VTlR9IgotICAgICAgJHthZGJ9IHNoZWxsIGFtIGluc3RydW1lbnQgJHt0ZXN0X3RhcmdldH0gLXcgJHtURVNUX1BBQ0tBR0V9LyR7VEVTVF9SVU5ORVJ9ID4mICR7dG1wZmlsZX0KLSAgICAgIGNhdCAke3RtcGZpbGV9Ci0gICAgICBpZiBbWyAiJHtPUFRJT05fSUdOT1JFfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGlmIFtbIC1uICIkKGdyZXAgJHt0bXBmaWxlfSAtZSAnRkFJTFVSRVx8Y3Jhc2hlZCcpIiBdXTsgdGhlbgotICAgICAgICAgICMgYW0gaW5zdHJ1bWVudCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlIHNvIG5lZWQgdG8gZ3JlcCByZXN1bHQgbWVzc2FnZSBpbnN0ZWFkCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIHJtICR7dG1wZmlsZX0KLSAgICBicmVhawotICBkb25lCi19Ci0KLWVjaG8gIkZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGFkZGVkIHRvIHlvdXIgZW52aXJvbm1lbnQ6IgotX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODhiNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLS8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKLSAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7Ci0gICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7Ci0gICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKLSAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKLSAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOwotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBCcm93c2VyIHNlcGNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKLSAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOwotICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDQ2N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0gLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLSAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7Ci0gICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKLQotICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgotICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgotICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCi0gICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCi0gICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKLSAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7Ci0gICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlbmQgY29tbWFuZAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKLSAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKLQotICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7Ci0gICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOwotICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDkwOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXIySW1wbCBleHRlbmRzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyMiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBjaGFuZ2UuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIE1lZGlhQnJvd3NlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdF9pbXBsKEJ1bmRsZSByb290SGludHMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldExpYnJhcnlSb290KGdldENvbnRyb2xsZXJTdHViKCksIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudW5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbV9pbXBsKFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRJdGVtKGdldENvbnRyb2xsZXJTdHViKCksIG1lZGlhSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW5faW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRDaGlsZHJlbihnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlYXJjaChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdF9pbXBsKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRTZWFyY2hSZXN1bHQoZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLCBmaW5hbCBTdHJpbmcgcm9vdE1lZGlhSWQsIGZpbmFsIEJ1bmRsZSByb290RXh0cmEpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0TGlicmFyeVJvb3REb25lKGdldEluc3RhbmNlKCksIHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRJdGVtRG9uZShnZXRJbnN0YW5jZSgpLCBtZWRpYUlkLCBpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0Q2hpbGRyZW5Eb25lKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlYXJjaFJlc3VsdENoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldFNlYXJjaFJlc3VsdERvbmUoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DaGlsZHJlbkNoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkzNjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7Ci0KLSAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKLSAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KLSAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQotICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKLSAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKLSAgICAgICAgbVRva2VuID0gdG9rZW47Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCi0gICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uCi0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCi0gICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bwotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKLSAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOwotCi0gICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKLSAgICAgICAgLy8gcmVhc29ucy4KLSAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgotICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQotICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgotICAgICAgICAvLyAgICB0aHJlYWQuCi0gICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgotICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCi0gICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQotICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCi0gICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCi0gICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCi0gICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcwotICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgotICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKLSAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8tb3AuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKLSAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKLSAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKLSAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAotICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgotICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7Ci0gICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcwotICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCi0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKLSAgICAgICAgICAgIC8vIGZvciBzdXJlLgotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOwotCi0gICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7Ci0gICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmYzVkZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKLSAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7Ci0gICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGEwZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfQlJPV1NBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19QTEFZQUJMRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFJdGVtMkltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5mbGFncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVRBREFUQSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIubWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVVJRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIudXVpZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVVUlEIG1VVUlEOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgLy8gRnJvbSB0aGUgcHVibGljIEFQSQotICAgIHB1YmxpYyBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncykgewotICAgICAgICB0aGlzKG1lZGlhSWQsIGRzZCwgbWV0YWRhdGEsIGZsYWdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtZWRpYUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZCA9IG1lZGlhSWQ7Ci0gICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRzZDsKLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICBtVVVJRCA9ICh1dWlkID09IG51bGwpID8gVVVJRC5yYW5kb21VVUlEKCkgOiB1dWlkOwotCi0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYUl0ZW0yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVkaWFJdGVtMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUl0ZW0yIG90aGVyID0gKE1lZGlhSXRlbTIpIG9iajsKLSAgICAgICAgcmV0dXJuIG1VVUlELmVxdWFscygoKE1lZGlhSXRlbTJJbXBsKSBvdGhlci5nZXRQcm92aWRlcigpKS5tVVVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgb2JqZWN0IGFzIGEgYnVuZGxlIHRvIHNoYXJlIGJldHdlZW4gcHJvY2Vzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBidW5kbGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9GTEFHUywgbUZsYWdzKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9NRVRBREFUQSwgbU1ldGFkYXRhLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1VVSUQsIG1VVUlELnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1VVSUQpOwotICAgICAgICByZXR1cm4gZnJvbUJ1bmRsZShidW5kbGUsIFVVSUQuZnJvbVN0cmluZyh1dWlkU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVVSUR9LgotICAgICAqIElmIHtAbGluayBVVUlEfQotICAgICAqIGNhbiBiZSBudWxsIGZvciBjcmVhdGluZyBuZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcGFyYW0gdXVpZCBBIHtAbGluayBVVUlEfSB0byBvdmVycmlkZS4gQ2FuIGJlIHtAbGluayBudWxsfSBmb3Igb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSBidW5kbGUuZ2V0QnVuZGxlKEtFWV9NRVRBREFUQSk7Ci0gICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGZpbmFsIGludCBmbGFncyA9IGJ1bmRsZS5nZXRJbnQoS0VZX0ZMQUdTKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbnVsbCwgbWV0YWRhdGEsIGZsYWdzLCB1dWlkKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVtMnsiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBtTWV0YWRhdGE9IikuYXBwZW5kKG1NZXRhZGF0YSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFnc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbUZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhSWQiKTsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBnZXREYXRhU291cmNlRGVzY19pbXBsKCkgewotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBARmxhZ3MgaW50IG1GbGFnczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lZGlhSWQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQnVpbGRlciBpbnN0YW5jZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWRfaW1wbChATnVsbGFibGUgU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREYXRhU291cmNlRGVzY19pbXBsKEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkYXRhU291cmNlRGVzYykgewotICAgICAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZGF0YVNvdXJjZURlc2M7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAobU1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfTUVESUFfSUQpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIGl0cyBzdWZmaWNpZW50IChlLmcuIFVzZSBVVUlEIGluc3RlYWQ/KQotICAgICAgICAgICAgICAgIGlkID0gKG1NZWRpYUlkICE9IG51bGwpID8gbU1lZGlhSWQgOiB0b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbURhdGFTb3VyY2VEZXNjLCBtTWV0YWRhdGEsIG1GbGFncykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0Y2Q0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cwotICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbnN0YW5jZSk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKLQotICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAotICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KLSAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCi0gICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWM1MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZwotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmF0aW5nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJpdG1hcCBibXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJtcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7Ci0gICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNGUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsIGltcGxlbWVudHMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5bGlzdEFnZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudEltcGwoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZC4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3Q9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0U2h1ZmZsZU1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRSZXBlYXRNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbV9pbXBsKEBOb25OdWxsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGl0ZW1MaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhU291cmNlRGVzYygpID09IGRzZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucHV0QWxsKG1DYWxsYmFja3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM2MDQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci0KLSAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjawotICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KLSAgICAvLwotICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7Ci0gICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKLSAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKLSAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCi0gICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKLSAgICAvLyAgICAgfSk7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKLSAgICAvLwotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHBsYXllcgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50Ci0gICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQotICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCi0gICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLQotICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KLSAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQotICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCi0gICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgewotICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7Ci0gICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgewotICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKLSAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKLSAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7Ci0KLSAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgbVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgewotICAgICAgICAvLyBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCi0gICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPwotICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKLSAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KLSAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgotICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCi0gICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KLSAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKLSAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgotICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCi0gICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KLSAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQotICAgICAgICAvKgotICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCi0gICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgotICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgewotICAgICAgICByZXR1cm4gbVBsYXllcjsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2s7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7Ci0gICAgfQotCi0gICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKLSAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCi0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOwotCi0gICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOwotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAotICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOwotICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCi0gICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgotICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCi0gICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCi0gICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGVyIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOwotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgICAgIFN0cmluZyBtSWQ7Ci0gICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBDIG1DYWxsYmFjazsKLSAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKLSAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKLSAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKLSAgICAgICAgICAgIG1JZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgewotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NTdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KLSAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgewotICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgotICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KLSAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKLSAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKLSAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAotICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOwotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgotICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCi0gICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOwotICAgICAgICAgICAgaWYgKGFjY2VwdCkgewotICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKLSAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucwotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9Ci0gICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNaXNjCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLy8gVE9ETyhqYWV3YW4pOiBOZWVkIGEgdGVzdCBmb3Igc2Vzc2lvbiBzZXJ2aWNlIGl0c2VsZi4KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTVBTZXNzaW9uU2VydmljZSI7IC8vIHRvIG1lZXQgMjMgY2hhciBsaW1pdCBpbiBMb2cgdGFnCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlIHRoaXMuIChiLzc0MDk0NjExKQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2soKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IG1TdGFydFNlbGZJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUnVubmluZ0ZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24yIG1TZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCgiICsgaW5zdGFuY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGdldFNlc3Npb25faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbiBvblVwZGF0ZU5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHQgbm90aWZpY2F0aW9uIFVJIGxhdGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIG1TdGFydFNlbGZJbnRlbnQgPSBuZXcgSW50ZW50KG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldENsYXNzKCkpOwotCi0gICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMihtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gZ2V0U2Vzc2lvblR5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gc2VydmljZSwgYnV0IHdhcyAiICsgdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbiA9IG1JbnN0YW5jZS5vbkNyZWF0ZVNlc3Npb24odG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxsIHx8ICF0b2tlbi5nZXRJZCgpLmVxdWFscyhtU2Vzc2lvbi5nZXRUb2tlbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiB3aXRoIGlkICIgKyB0b2tlbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IGdvdCAiICsgbVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IGhlcmUuCi0gICAgICAgIC8vIG1TZXNzaW9uLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2ssIG1TZXNzaW9uLmdldEV4ZWN1dG9yKCkpOwotICAgIH0KLQotICAgIEBUb2tlblR5cGUgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmRfaW1wbChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFTZXNzaW9uMkltcGwpIG1TZXNzaW9uLmdldFByb3ZpZGVyKCkpLmdldFNlc3Npb25TdHViKCkuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKGludCBwbGF5ZXJTdGF0ZSkgewotICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBtZWRpYU5vdGlmaWNhdGlvbiA9IG1JbnN0YW5jZS5vblVwZGF0ZU5vdGlmaWNhdGlvbigpOwotICAgICAgICBpZiAobWVkaWFOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChwbGF5ZXJTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmRTZXJ2aWNlKG1TdGFydFNlbGZJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kKG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0lETEU6Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdG9wRm9yZWdyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFOb3RpZmljYXRpb25JbXBsIGltcGxlbWVudHMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25JbXBsKE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90aWZpY2F0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWQgPSBub3RpZmljYXRpb25JZDsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXROb3RpZmljYXRpb25JZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uIGdldE5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTgxMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKLQotICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7Ci0gICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOwotICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCi0gICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCi0gICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOwotICAgIH0KLQotICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7Ci0gICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgewotICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgewotICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgewotICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTBkMzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLUBSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQotcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLQotICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKLSAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOwotICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgewotICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKLSAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NzBhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50IGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50IjsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9QTEFZTElTVCA9IC0xOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfSVRFTVMgPSAtMjsKLQotICAgIHByaXZhdGUgZmluYWwgUGxheUl0ZW0gbUVvcFBsYXlJdGVtID0gbmV3IFBsYXlJdGVtKEVORF9PRl9QTEFZTElTVCwgbnVsbCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIGZpbmFsIE15UGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyQ2FsbGJhY2s7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0gICAgLy8gVE9ETzogQ2hlY2sgaWYgaGF2aW5nIHRoZSBzYW1lIGl0ZW0gaXMgb2theSAoYi83NDA5MDc0MSkKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1TaHVmZmxlZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNYXA8TWVkaWFJdGVtMiwgRGF0YVNvdXJjZURlc2M+IG1JdGVtRHNkTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheUl0ZW0gbUN1cnJlbnQ7Ci0KLSAgICAvLyBDYWxsZWQgb24gc2Vzc2lvbiBjYWxsYmFjayBleGVjdXRvci4KLSAgICBwcml2YXRlIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgbXBiLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG1wYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwgJiYgbUN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQbGF5SXRlbSB7Ci0gICAgICAgIGludCBzaHVmZmxlZElkeDsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkOwotICAgICAgICBNZWRpYUl0ZW0yIG1lZGlhSXRlbTsKLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgpIHsKLSAgICAgICAgICAgIHRoaXMoc2h1ZmZsZWRJZHgsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4LCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIHRoaXMuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZCh0aGlzLm1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IGRzZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gIT0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpLmVxdWFscyhkc2QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblBsYXlsaXN0QWdlbnQoQE5vbk51bGwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbkltcGwsCi0gICAgICAgICAgICBATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSW1wbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uSW1wbCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gc2Vzc2lvbkltcGw7Ci0gICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXJDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2soKTsKLSAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXIoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbVBsYXllcikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1QbGF5bGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5jbGVhcigpOwotCi0gICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gaW4gcmFuZG9tIHBvc2l0aW9uIG9mIG1TaHVmZmxlZExpc3QuCi0gICAgICAgICAgICAgICAgc2h1ZmZsZWRJZHggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChtU2h1ZmZsZWRMaXN0LnNpemUoKSArIDEpOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC5yZW1vdmUoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUGxheWxpc3Quc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobVBsYXlsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnNldChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICBtUGxheWxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IGl0ZW0uZXF1YWxzKG1DdXJyZW50Lm1lZGlhSXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXcgUGxheUl0ZW0oc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBwcmV2ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIC0xKTsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gcHJldjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBuZXh0ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCByZXBlYXRNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCAhPSBudWxsICYmIG1DdXJyZW50ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCBzaHVmZmxlTW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBpbnQgZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1ZhbGlkSXRlbSgpID8gbUN1cnJlbnQuc2h1ZmZsZWRJZHggOiBOT19WQUxJRF9JVEVNUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRJdGVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZHNkID0gbUl0ZW1Ec2RNYXAuZ2V0KGl0ZW0pOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIgPSBtRHNtSGVscGVyOwotICAgICAgICBpZiAoaGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IERvIG5vdCBjYWxsIG9uRGF0YVNvdXJjZU1pc3Npbmcgd2l0aCB0aGUgbG9jayAoYi83NDA5MDc0MSkuCi0gICAgICAgICAgICBkc2QgPSBoZWxwZXIub25EYXRhU291cmNlTWlzc2luZyhtU2Vzc2lvbkltcGwuZ2V0SW5zdGFuY2UoKSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHNkOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNvbnNpZGVyIHRvIGNhbGwgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkIGluc2lkZSAoYi83NDA5MDc0MSkKLSAgICBwcml2YXRlIFBsYXlJdGVtIGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKGludCBjdXJTaHVmZmxlZElkeCwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IG1QbGF5bGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA9PSBFTkRfT0ZfUExBWUxJU1QpIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gKGRpcmVjdGlvbiA+IDApID8gLTEgOiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCArPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPCAwIHx8IGN1clNodWZmbGVkSWR4ID49IG1QbGF5bGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc2l6ZSAtIDEpID8gbnVsbCA6IG1Fb3BQbGF5SXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IGN1clNodWZmbGVkSWR4IDwgMCA/IG1QbGF5bGlzdC5zaXplKCkgLSAxIDogMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1TaHVmZmxlZExpc3QuZ2V0KGN1clNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlJdGVtKGN1clNodWZmbGVkSWR4LCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKSB7Ci0gICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1DdXJyZW50Lm1lZGlhSXRlbSk7Ci0gICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBBZGRlZCBhbiBpdGVtLgotICAgICAgICAgICAgbUN1cnJlbnQuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudC5zaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtU2h1ZmZsZWRMaXN0LnNpemUoKSAtIDEsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnQubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQobUN1cnJlbnQuc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgaWYgKHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobUN1cnJlbnQubWVkaWFJdGVtKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudCA9PSBudWxsIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUGxheWVyLmdldEN1cnJlbnREYXRhU291cmNlKCkgIT0gbUN1cnJlbnQuZHNkKSB7Ci0gICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobUN1cnJlbnQuZHNkKTsKLSAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQobVJlcGVhdE1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2FsbCBzZXROZXh0RGF0YVNvdXJjZSAoYi83NDA5MDc0MSkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpIHsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5jbGVhcigpOwotICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZEFsbChtUGxheWxpc3QpOwotICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMCi0gICAgICAgICAgICAgICAgfHwgbVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobVNodWZmbGVkTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGFtcHMgdmFsdWUgdG8gWzAsIHNpemVdCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA+IHNpemUpID8gc2l6ZSA6IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZjhjNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKLSAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KLSAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0KLSAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQotICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCi0gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKLSAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCi0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCi0gICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKLSAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVVpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7Ci0gICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKLSAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKLSAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICByZXR1cm4gbVR5cGUKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7Ci0gICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKLSAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKLSAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOwotICAgIH0KLQotICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjJlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQotICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZWVjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VcGRhdGVBcHBlYXJhbmNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5DbG9zZWRDYXB0aW9uUmVuZGVyZXIgc2luY2UgUAotcHVibGljIGNsYXNzIENsb3NlZENhcHRpb25SZW5kZXJlciBleHRlbmRzIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ2VhNjA4Q0NXaWRnZXQgbUNDV2lkZ2V0OwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9NSU1FKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobUNDV2lkZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ0NXaWRnZXQgPSBuZXcgQ2VhNjA4Q0NXaWRnZXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDZWE2MDhDYXB0aW9uVHJhY2sobUNDV2lkZ2V0LCBmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBmb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBDZWE2MDhDYXB0aW9uVHJhY2sgZXh0ZW5kcyBTdWJ0aXRsZVRyYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDUGFyc2VyIG1DQ1BhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDV2lkZ2V0IG1SZW5kZXJpbmdXaWRnZXQ7Ci0KLSAgICBDZWE2MDhDYXB0aW9uVHJhY2soQ2VhNjA4Q0NXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0LCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3VwZXIoZm9ybWF0KTsKLQotICAgICAgICBtUmVuZGVyaW5nV2lkZ2V0ID0gcmVuZGVyaW5nV2lkZ2V0OwotICAgICAgICBtQ0NQYXJzZXIgPSBuZXcgQ2VhNjA4Q0NQYXJzZXIobVJlbmRlcmluZ1dpZGdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCkgewotICAgICAgICBtQ0NQYXJzZXIucGFyc2UoZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyaW5nV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3VlcykgewotICAgICAgICAvLyBPdmVycmlkaW5nIHdpdGggTk8tT1AsIENDIHJlbmRlcmluZyBieS1wYXNzZXMgdGhpcwotICAgIH0KLX0KLQotLyoqCi0gKiBBYnN0cmFjdCB3aWRnZXQgY2xhc3MgdG8gcmVuZGVyIGEgY2xvc2VkIGNhcHRpb24gdHJhY2suCi0gKi8KLWFic3RyYWN0IGNsYXNzIENsb3NlZENhcHRpb25XaWRnZXQgZXh0ZW5kcyBWaWV3R3JvdXAgaW1wbGVtZW50cyBTdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldCB7Ci0KLSAgICBpbnRlcmZhY2UgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpOwotICAgICAgICB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBzY2FsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwdGlvblN0eWxlIERFRkFVTFRfQ0FQVElPTl9TVFlMRSA9IENhcHRpb25TdHlsZS5ERUZBVUxUOwotCi0gICAgLyoqIENhcHRpb25pbmcgbWFuYWdlciwgdXNlZCB0byBvYnRhaW4gYW5kIHRyYWNrIGNhcHRpb24gcHJvcGVydGllcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdNYW5hZ2VyIG1NYW5hZ2VyOwotCi0gICAgLyoqIEN1cnJlbnQgY2FwdGlvbiBzdHlsZS4gKi8KLSAgICBwcm90ZWN0ZWQgQ2FwdGlvblN0eWxlIG1DYXB0aW9uU3R5bGU7Ci0KLSAgICAvKiogQ2FsbGJhY2sgZm9yIHJlbmRlcmluZyBjaGFuZ2VzLiAqLwotICAgIHByb3RlY3RlZCBPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAvKiogQ29uY3JldGUgbGF5b3V0IG9mIENDLiAqLwotICAgIHByb3RlY3RlZCBDbG9zZWRDYXB0aW9uTGF5b3V0IG1DbG9zZWRDYXB0aW9uTGF5b3V0OwotCi0gICAgLyoqIFdoZXRoZXIgYSBjYXB0aW9uIHN0eWxlIGNoYW5nZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0KLSAgICAgICAgLy8gQ2Fubm90IHJlbmRlciB0ZXh0IG92ZXIgdmlkZW8gd2hlbiBsYXllciB0eXBlIGlzIGhhcmR3YXJlLgotICAgICAgICBzZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKLQotICAgICAgICBtTWFuYWdlciA9IChDYXB0aW9uaW5nTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKG1NYW5hZ2VyLmdldFVzZXJTdHlsZSgpKTsKLQotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dCA9IGNyZWF0ZUNhcHRpb25MYXlvdXQoY29udGV4dCk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKG1NYW5hZ2VyLmdldEZvbnRTY2FsZSgpKTsKLSAgICAgICAgYWRkVmlldygoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgbWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICBsYXlvdXQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubGF5b3V0KGwsIHQsIHIsIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbmFnZXMgd2hldGhlciB0aGlzIHJlbmRlcmVyIGlzIGxpc3RlbmluZyBmb3IgY2FwdGlvbiBzdHlsZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nTGlzdGVuZXIgPSBuZXcgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Vc2VyU3R5bGVDaGFuZ2VkKENhcHRpb25TdHlsZSB1c2VyU3R5bGUpIHsKLSAgICAgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZSh1c2VyU3R5bGUpOwotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9udFNjYWxlQ2hhbmdlZChmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShmb250U2NhbGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc0xpc3RlbmVyID0gaXNBdHRhY2hlZFRvV2luZG93KCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgaWYgKG1IYXNDaGFuZ2VMaXN0ZW5lciAhPSBuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtSGFzQ2hhbmdlTGlzdGVuZXIgPSBuZWVkc0xpc3RlbmVyOwotCi0gICAgICAgICAgICBpZiAobmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIENDUGFyc2VyIHByb2Nlc3NlcyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uIGRhdGEuCi0gKgotICogSXQgY2FsbHMgYmFjayBpbnRvIE9uRGlzcGxheUNoYW5nZWRMaXN0ZW5lciB1cG9uCi0gKiBkaXNwbGF5IGNoYW5nZSB3aXRoIHN0eWxlZCB0ZXh0IGZvciByZW5kZXJpbmcuCi0gKgotICovCi1jbGFzcyBDZWE2MDhDQ1BhcnNlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09MUyA9IDMyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDZWE2MDhDQ1BhcnNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0KLSAgICAvLyBFSUEtQ0VBLTYwODogVGFibGUgNzAgLSBDb250cm9sIENvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJDTCA9IDB4MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJTICA9IDB4MjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPRiA9IDB4MjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPTiA9IDB4MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUiA9IDB4MjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMiA9IDB4MjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMyA9IDB4MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVNCA9IDB4Mjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPTiA9IDB4Mjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJEQyA9IDB4Mjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSICA9IDB4MmE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJURCA9IDB4MmI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVETSA9IDB4MmM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSICA9IDB4MmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOTSA9IDB4MmU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPQyA9IDB4MmY7Ci0KLSAgICAvLyBUcmFuc3BhcmVudCBTcGFjZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVFMgPSAnXHUwMEEwJzsKLQotICAgIC8vIENhcHRpb25pbmcgTW9kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQUlOVF9PTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUk9MTF9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUE9QX09OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9URVhUID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICBwcml2YXRlIGludCBtUm9sbFVwU2l6ZSA9IDQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IG1EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtTm9uRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbVRleHRNZW0gPSBuZXcgQ0NNZW1vcnkoKTsKLQotICAgIENlYTYwOENDUGFyc2VyKERpc3BsYXlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gZGF0YSkgewotICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBDQ0RhdGEuZnJvbUJ5dGVBcnJheShkYXRhKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjY0RhdGFbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGVDdHJsQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVRhYk9mZnNldHMoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVQQUNDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlTWlkUm93Q29kZShjY0RhdGFbaV0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoY2NEYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBEaXNwbGF5TGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKTsKLSAgICAgICAgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgZ2V0TWVtb3J5KCkgewotICAgICAgICAvLyBnZXQgdGhlIENDIG1lbW9yeSB0byBvcGVyYXRlIG9uIGZvciBjdXJyZW50IG1vZGUKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIE1PREVfUE9QX09OOgotICAgICAgICAgICAgcmV0dXJuIG1Ob25EaXNwbGF5OwotICAgICAgICBjYXNlIE1PREVfVEVYVDoKLSAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogc3VwcG9ydCBvbmx5IGNhcHRpb24gbW9kZSBmb3Igbm93LAotICAgICAgICAgICAgLy8gaW4gdGV4dCBtb2RlLCBkdW1wIGV2ZXJ5dGhpbmcgdG8gdGV4dCBtZW0uCi0gICAgICAgICAgICByZXR1cm4gbVRleHRNZW07Ci0gICAgICAgIGNhc2UgTU9ERV9QQUlOVF9PTjoKLSAgICAgICAgY2FzZSBNT0RFX1JPTExfVVA6Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlY29naW5pemVkIG1vZGU6ICIgKyBtTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaWYgKCFjY0RhdGEuaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXh0ZW5kZWQgY2hhciBpbmNsdWRlcyAxIGF1dG9tYXRpYyBiYWNrc3BhY2UKLSAgICAgICAgaWYgKGNjRGF0YS5pc0V4dGVuZGVkQ2hhcigpKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVUZXh0KGNjRGF0YS5nZXREaXNwbGF5VGV4dCgpKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9QQUlOVF9PTiB8fCBtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNaWRSb3dDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgU3R5bGVDb2RlIG0gPSBjY0RhdGEuZ2V0TWlkUm93KCk7Ci0gICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlTWlkUm93Q29kZShtKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUEFDQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFBBQyBwYWMgPSBjY0RhdGEuZ2V0UEFDKCk7Ci0KLSAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkubW92ZUJhc2VsaW5lVG8ocGFjLmdldFJvdygpLCBtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVBBQyhwYWMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRhYk9mZnNldHMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgdGFicyA9IGNjRGF0YS5nZXRUYWJPZmZzZXQoKTsKLQotICAgICAgICBpZiAodGFicyA+IDApIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLnRhYih0YWJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVDdHJsQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCBjdHJsQ29kZSA9IGNjRGF0YS5nZXRDdHJsQ29kZSgpOwotCi0gICAgICAgIGlmIChtUHJldkN0cmxDb2RlICE9IElOVkFMSUQgJiYgbVByZXZDdHJsQ29kZSA9PSBjdHJsQ29kZSkgewotICAgICAgICAgICAgLy8gZGlzY2FyZCBkb3VibGUgY3RybCBjb2RlcyAoYnV0IGlmIHRoZXJlJ3MgYSAzcmQgb25lLCB3ZSBzdGlsbCB0YWtlIHRoYXQpCi0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGN0cmxDb2RlKSB7Ci0gICAgICAgIGNhc2UgUkNMOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJTOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFUjoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlUyOgotICAgICAgICBjYXNlIFJVMzoKLSAgICAgICAgY2FzZSBSVTQ6Ci0gICAgICAgICAgICBtUm9sbFVwU2l6ZSA9IChjdHJsQ29kZSAtIDB4MjMpOwotICAgICAgICAgICAgLy8gZXJhc2UgbWVtb3J5IGlmIGN1cnJlbnRseSBpbiBvdGhlciBzdHlsZQotICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlbGVjdCByb2xsLXVwIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUk9MTF9VUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPTjoKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZsYXNoIE9uIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSREM6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcGFpbnQtb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBtVGV4dE1lbS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlREOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFRE06Ci0gICAgICAgICAgICAvLyBlcmFzZSBkaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLnJvbGxVcChtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLmNyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5NOgotICAgICAgICAgICAgLy8gZXJhc2Ugbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU9DOgotICAgICAgICAgICAgLy8gc3dhcCBkaXNwbGF5L25vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgc3dhcE1lbW9yeSgpOwotICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2Q3RybENvZGUgPSBjdHJsQ29kZTsKLQotICAgICAgICAvLyBoYW5kbGVkCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXNwbGF5KCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUgPSBtTGlzdGVuZXIuZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5Q2hhbmdlZChtRGlzcGxheS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3YXBNZW1vcnkoKSB7Ci0gICAgICAgIENDTWVtb3J5IHRlbXAgPSBtRGlzcGxheTsKLSAgICAgICAgbURpc3BsYXkgPSBtTm9uRGlzcGxheTsKLSAgICAgICAgbU5vbkRpc3BsYXkgPSB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlQ29kZSB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEUgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gMjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9DWUFOID0gMzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9SRUQgPSA0OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1lFTExPVyA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfTUFHRU5UQSA9IDY7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfSU5WQUxJRCA9IDc7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9JVEFMSUNTICAgPSAweDAwMDAwMDAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1VOREVSTElORSA9IDB4MDAwMDAwMDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Db2xvck1hcCA9IHsKLSAgICAgICAgICAgICJXSElURSIsICJHUkVFTiIsICJCTFVFIiwgIkNZQU4iLCAiUkVEIiwgIllFTExPVyIsICJNQUdFTlRBIiwgIklOVkFMSUQiCi0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgaW50IG1TdHlsZTsKLSAgICAgICAgZmluYWwgaW50IG1Db2xvcjsKLQotICAgICAgICBzdGF0aWMgU3R5bGVDb2RlIGZyb21CeXRlKGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZUNvZGUoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZShpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgbVN0eWxlID0gc3R5bGU7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJdGFsaWNzKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1VuZGVybGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc3RyLmFwcGVuZCgieyIpOwotICAgICAgICAgICAgc3RyLmFwcGVuZChtQ29sb3JNYXBbbUNvbG9yXSk7Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIElUQUxJQ1MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBVTkRFUkxJTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIn0iKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUEFDIGV4dGVuZHMgU3R5bGVDb2RlIHsKLSAgICAgICAgZmluYWwgaW50IG1Sb3c7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sOwotCi0gICAgICAgIHN0YXRpYyBQQUMgZnJvbUJ5dGVzKGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludFtdIHJvd1RhYmxlID0gezExLCAxLCAzLCAxMiwgMTQsIDUsIDcsIDl9OwotICAgICAgICAgICAgaW50IHJvdyA9IHJvd1RhYmxlW2RhdGExICYgMHgwN10gKyAoKGRhdGEyICYgMHgyMCkgPj4gNSk7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGluZGVudCBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGluZGVudCA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIGluZGVudCAqIDQsIHN0eWxlLCBDT0xPUl9XSElURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgLTEsIHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMoaW50IHJvdywgaW50IGNvbCwgaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICBtUm93ID0gcm93OwotICAgICAgICAgICAgbUNvbCA9IGNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJbmRlbnRQQUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1Db2wgPj0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Um93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2w7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7JWQsICVkfSwgJXMiLAotICAgICAgICAgICAgICAgICAgICBtUm93LCBtQ29sLCBzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGFibGUgdmVyc2lvbiBvZiBCYWNrZ3JvdW5kU3BhbiB0byBmYWNpbGl0YXRlIHRleHQgcmVuZGVyaW5nIHdpdGggZWRnZSBzdHlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbiBleHRlbmRzIENoYXJhY3RlclN0eWxlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUFwcGVhcmFuY2UgewotICAgICAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICAgICAgcHVibGljIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoVGV4dFBhaW50IGRzKSB7Ci0gICAgICAgICAgICBkcy5iZ0NvbG9yID0gbUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ0NMaW5lQnVpbGRlciBrZWVwcyB0cmFjayBvZiBkaXNwbGF5YWJsZSBjaGFycywgYXMgd2VsbCBhcwotICAgICAqIE1pZFJvdyBzdHlsZXMgYW5kIFBBQ3MsIGZvciBhIHNpbmdsZSBsaW5lIG9mIENDIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEl0IGdlbmVyYXRlcyBzdHlsZWQgdGV4dCB2aWEgZ2V0U3R5bGVkVGV4dCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1EaXNwbGF5Q2hhcnM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbU1pZFJvd1N0eWxlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtUEFDU3R5bGVzOwotCi0gICAgICAgIENDTGluZUJ1aWxkZXIoU3RyaW5nIHN0cikgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cik7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIG1QQUNTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGFyQXQoaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgY2gpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNaWRSb3dBdChpbnQgaW5kZXgsIFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgJyAnKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UEFDQXQoaW50IGluZGV4LCBQQUMgcGFjKSB7Ci0gICAgICAgICAgICBtUEFDU3R5bGVzW2luZGV4XSA9IHBhYzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwbHlTdHlsZVNwYW4oCi0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0LAotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChzLmlzSXRhbGljcygpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlU3BhbihhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlLklUQUxJQyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLmlzVW5kZXJsaW5lKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5kZXJsaW5lU3BhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIobURpc3BsYXlDaGFycyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMSwgbmV4dCA9IDA7Ci0gICAgICAgICAgICBpbnQgc3R5bGVTdGFydCA9IC0xOwotICAgICAgICAgICAgU3R5bGVDb2RlIGN1clN0eWxlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0IDwgbURpc3BsYXlDaGFycy5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBuZXdTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaWRSb3dTdHlsZXNbbmV4dF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBtaWQtcm93IHN0eWxlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1NaWRSb3dTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUEFDU3R5bGVzW25leHRdICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0eWxlU3RhcnQgPCAwIHx8IHN0YXJ0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgUEFDIHN0eWxlIGNoYW5nZSwgb25seSBpZjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gbm8gc3R5bGUgc2V0LCBvcgotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzdHlsZSBzZXQsIGJ1dCBwcmV2IGNoYXIgaXMgbm9uZS1kaXNwbGF5YWJsZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1QQUNTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clN0eWxlID0gbmV3U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDAgJiYgc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgbmV3U3R5bGUsIHN0eWxlU3RhcnQsIG5leHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlU3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0KSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkU3RhcnQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChzdGFydCkgPT0gJyAnID8gc3RhcnQgOiBzdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZEVuZCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQgLSAxKSA9PSAnICcgPyBuZXh0IDogbmV4dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdGFydCwgZXhwYW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIGN1clN0eWxlLCBzdHlsZVN0YXJ0LCBleHBhbmRlZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3R5bGVkVGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NNZW1vcnkgbW9kZWxzIGEgY29uc29sZS1zdHlsZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTWVtb3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJsYW5rTGluZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCdWlsZGVyW10gbUxpbmVzID0gbmV3IENDTGluZUJ1aWxkZXJbTUFYX1JPV1MgKyAyXTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbDsKLQotICAgICAgICBDQ01lbW9yeSgpIHsKLSAgICAgICAgICAgIGNoYXJbXSBibGFuayA9IG5ldyBjaGFyW01BWF9DT0xTICsgMl07Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChibGFuaywgVFMpOwotICAgICAgICAgICAgbUJsYW5rTGluZSA9IG5ldyBTdHJpbmcoYmxhbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcmFzZSgpIHsKLSAgICAgICAgICAgIC8vIGVyYXNlIGFsbCBsaW5lcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdyA9IE1BWF9ST1dTOwotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRlcigpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10uY2hhckF0KGkpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUNvbDsgaiA8IG1MaW5lc1ttUm93XS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2pdLnNldENoYXJBdChqLCBUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGFiKGludCB0YWJzKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2wodGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJzKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKC0xKTsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQobUNvbCwgVFMpOwotICAgICAgICAgICAgICAgIGlmIChtQ29sID09IE1BWF9DT0xTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIHJlY29tbWVuZGF0aW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiBjdXJzb3Igd2FzIGF0IGNvbCAzMiwgbW92ZSBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBjb2wgMzEgYW5kIGVyYXNlIGJvdGggY29sIDMxJjMyCi0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQoTUFYX0NPTFMsIFRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvclRvKG1Sb3cgKyAxLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcm9sbFVwKGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBtUm93IC0gd2luZG93U2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoc3RhcnRSb3cgPCAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRSb3cgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gc3RhcnRSb3c7IGkgPCBtUm93OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBtTGluZXNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gbVJvdzsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGJhc2Ugcm93Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gY29sIDEsIGluIGNhc2UgUEFDIGlzIG5vdCBzZW50Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0Q2hhckF0KG1Db2wsIHRleHQuY2hhckF0KGkpKTsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTWlkUm93Q29kZShTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRNaWRSb3dBdChtQ29sLCBtKTsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQQUMoUEFDIHBhYykgewotICAgICAgICAgICAgaWYgKHBhYy5pc0luZGVudFBBQygpKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgcGFjLmdldENvbCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldFBBQ0F0KG1Db2wsIHBhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3Bhbm5hYmxlU3RyaW5nQnVpbGRlcj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfUk9XUyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm93cy5hZGQobUxpbmVzW2ldICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2ldLmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSA6IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3MudG9BcnJheShuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltNQVhfUk9XU10pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB4LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICByZXR1cm4geCA8IG1pbiA/IG1pbiA6ICh4ID4gbWF4ID8gbWF4IDogeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG9Sb3coaW50IHJvdykgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JCeUNvbChpbnQgY29sKSB7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAobUNvbCArIGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVCYXNlbGluZVRvKGludCBiYXNlUm93LCBpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaWYgKG1Sb3cgPT0gYmFzZVJvdykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhY3R1YWxXaW5kb3dTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBiYXNlUm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IG1Sb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBtUm93KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGJvdHRvbSB0byB0b3Agcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gYWN0dWFsV2luZG93U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHRvcCB0byBib3R0b20gcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbFdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciByZXN0IG9mIHRoZSByb3dzCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VSb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gYmFzZVJvdyArIDE7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDQ0xpbmVCdWlsZGVyIGdldExpbmVCdWZmZXIoaW50IHJvdykgewotICAgICAgICAgICAgaWYgKG1MaW5lc1tyb3ddID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbcm93XSA9IG5ldyBDQ0xpbmVCdWlsZGVyKG1CbGFua0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1MaW5lc1tyb3ddOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ0RhdGEgcGFyc2VzIHRoZSByYXcgQ0MgYnl0ZSBwYWlyIGludG8gZGlzcGxheWFibGUgY2hhcnMsCi0gICAgICogbWlzYyBjb250cm9sIGNvZGVzLCBNaWQtUm93IG9yIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGExOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGEyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1DdHJsQ29kZU1hcCA9IHsKLSAgICAgICAgICAgICJSQ0wiLCAiQlMiICwgIkFPRiIsICJBT04iLAotICAgICAgICAgICAgIkRFUiIsICJSVTIiLCAiUlUzIiwgIlJVNCIsCi0gICAgICAgICAgICAiRk9OIiwgIlJEQyIsICJUUiIgLCAiUlREIiwKLSAgICAgICAgICAgICJFRE0iLCAiQ1IiICwgIkVOTSIsICJFT0MiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGVjaWFsQ2hhck1hcCA9IHsKLSAgICAgICAgICAgICJcdTAwQUUiLAotICAgICAgICAgICAgIlx1MDBCMCIsCi0gICAgICAgICAgICAiXHUwMEJEIiwKLSAgICAgICAgICAgICJcdTAwQkYiLAotICAgICAgICAgICAgIlx1MjEyMiIsCi0gICAgICAgICAgICAiXHUwMEEyIiwKLSAgICAgICAgICAgICJcdTAwQTMiLAotICAgICAgICAgICAgIlx1MjY2QSIsIC8vIEVpZ2h0aCBub3RlCi0gICAgICAgICAgICAiXHUwMEUwIiwKLSAgICAgICAgICAgICJcdTAwQTAiLCAvLyBUcmFuc3BhcmVudCBzcGFjZQotICAgICAgICAgICAgIlx1MDBFOCIsCi0gICAgICAgICAgICAiXHUwMEUyIiwKLSAgICAgICAgICAgICJcdTAwRUEiLAotICAgICAgICAgICAgIlx1MDBFRSIsCi0gICAgICAgICAgICAiXHUwMEY0IiwKLSAgICAgICAgICAgICJcdTAwRkIiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGFuaXNoQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFNwYW5pc2ggYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzEiLCAvLyBBCi0gICAgICAgICAgICAiXHUwMEM5IiwgLy8gRQotICAgICAgICAgICAgIlx1MDBEMyIsIC8vIEkKLSAgICAgICAgICAgICJcdTAwREEiLCAvLyBPCi0gICAgICAgICAgICAiXHUwMERDIiwgLy8gVQotICAgICAgICAgICAgIlx1MDBGQyIsIC8vIHUKLSAgICAgICAgICAgICJcdTIwMTgiLCAvLyBvcGVuaW5nIHNpbmdsZSBxdW90ZQotICAgICAgICAgICAgIlx1MDBBMSIsIC8vIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgICAgICAgICIqIiwKLSAgICAgICAgICAgICInIiwKLSAgICAgICAgICAgICJcdTIwMTQiLCAvLyBlbSBkYXNoCi0gICAgICAgICAgICAiXHUwMEE5IiwgLy8gQ29weXJpZ2h0Ci0gICAgICAgICAgICAiXHUyMTIwIiwgLy8gU2VydmljZW1hcmsKLSAgICAgICAgICAgICJcdTIwMjIiLCAvLyByb3VuZCBidWxsZXQKLSAgICAgICAgICAgICJcdTIwMUMiLCAvLyBvcGVuaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgIlx1MjAxRCIsIC8vIGNsb3NpbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAvLyBGcmVuY2gKLSAgICAgICAgICAgICJcdTAwQzAiLAotICAgICAgICAgICAgIlx1MDBDMiIsCi0gICAgICAgICAgICAiXHUwMEM3IiwKLSAgICAgICAgICAgICJcdTAwQzgiLAotICAgICAgICAgICAgIlx1MDBDQSIsCi0gICAgICAgICAgICAiXHUwMENCIiwKLSAgICAgICAgICAgICJcdTAwRUIiLAotICAgICAgICAgICAgIlx1MDBDRSIsCi0gICAgICAgICAgICAiXHUwMENGIiwKLSAgICAgICAgICAgICJcdTAwRUYiLAotICAgICAgICAgICAgIlx1MDBENCIsCi0gICAgICAgICAgICAiXHUwMEQ5IiwKLSAgICAgICAgICAgICJcdTAwRjkiLAotICAgICAgICAgICAgIlx1MDBEQiIsCi0gICAgICAgICAgICAiXHUwMEFCIiwKLSAgICAgICAgICAgICJcdTAwQkIiCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVByb3R1Z3Vlc2VDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gUG9ydHVndWVzZQotICAgICAgICAgICAgIlx1MDBDMyIsCi0gICAgICAgICAgICAiXHUwMEUzIiwKLSAgICAgICAgICAgICJcdTAwQ0QiLAotICAgICAgICAgICAgIlx1MDBDQyIsCi0gICAgICAgICAgICAiXHUwMEVDIiwKLSAgICAgICAgICAgICJcdTAwRDIiLAotICAgICAgICAgICAgIlx1MDBGMiIsCi0gICAgICAgICAgICAiXHUwMEQ1IiwKLSAgICAgICAgICAgICJcdTAwRjUiLAotICAgICAgICAgICAgInsiLAotICAgICAgICAgICAgIn0iLAotICAgICAgICAgICAgIlxcIiwKLSAgICAgICAgICAgICJeIiwKLSAgICAgICAgICAgICJfIiwKLSAgICAgICAgICAgICJ8IiwKLSAgICAgICAgICAgICJ+IiwKLSAgICAgICAgICAgIC8vIEdlcm1hbiBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDNCIsCi0gICAgICAgICAgICAiXHUwMEU0IiwKLSAgICAgICAgICAgICJcdTAwRDYiLAotICAgICAgICAgICAgIlx1MDBGNiIsCi0gICAgICAgICAgICAiXHUwMERGIiwKLSAgICAgICAgICAgICJcdTAwQTUiLAotICAgICAgICAgICAgIlx1MDBBNCIsCi0gICAgICAgICAgICAiXHUyNTAyIiwgLy8gdmVydGljYWwgYmFyCi0gICAgICAgICAgICAiXHUwMEM1IiwKLSAgICAgICAgICAgICJcdTAwRTUiLAotICAgICAgICAgICAgIlx1MDBEOCIsCi0gICAgICAgICAgICAiXHUwMEY4IiwKLSAgICAgICAgICAgICJcdTI1MEMiLCAvLyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTAiLCAvLyB0b3AtcmlnaHQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE0IiwgLy8gbG93ZXItbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTgiLCAvLyBsb3dlci1yaWdodCBjb3JuZXIKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgQ0NEYXRhW10gZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotICAgICAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gbmV3IENDRGF0YVtkYXRhLmxlbmd0aCAvIDNdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNjRGF0YVtpXSA9IG5ldyBDQ0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAyXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjY0RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ0RhdGEoYnl0ZSB0eXBlLCBieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBtRGF0YTEgPSBkYXRhMTsKLSAgICAgICAgICAgIG1EYXRhMiA9IGRhdGEyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEN0cmxDb2RlKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNCB8fCBtRGF0YTEgPT0gMHgxYykKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUgZ2V0TWlkUm93KCkgewotICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IHN0YW5kYXJkIE1pZC1yb3cgY29kZXMsIGlnbm9yZQotICAgICAgICAgICAgLy8gb3B0aW9uYWwgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIG1pZC1yb3cgY29kZXMKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlQ29kZS5mcm9tQnl0ZShtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMgZ2V0UEFDKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgJiAweDcwKSA9PSAweDEwCi0gICAgICAgICAgICAgICAgICAgICYmIChtRGF0YTIgJiAweDQwKSA9PSAweDQwCi0gICAgICAgICAgICAgICAgICAgICYmICgobURhdGExICYgMHgwNykgIT0gMCB8fCAobURhdGEyICYgMHgyMCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFDLmZyb21CeXRlcyhtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUYWJPZmZzZXQoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE3IHx8IG1EYXRhMSA9PSAweDFmKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMSAmJiBtRGF0YTIgPD0gMHgyMykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTIgJiAweDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEaXNwbGF5YWJsZUNoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCYXNpY0NoYXIoKSB8fCBpc1NwZWNpYWxDaGFyKCkgfHwgaXNFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBnZXRCYXNpY0NoYXJzKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0ciA9ICBnZXRTcGVjaWFsQ2hhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IGdldEV4dGVuZGVkQ2hhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGN0cmxDb2RlVG9TdHJpbmcoaW50IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN0cmxDb2RlTWFwW2N0cmxDb2RlIC0gMHgyMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYXNpY0NoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2Y7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQQotICAgICAgICAgICAgICAgICAgICB8fCBtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjaGFyIGdldEJhc2ljQ2hhcihieXRlIGRhdGEpIHsKLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vbi1BU0NJSSBvbmVzCi0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MkE6IGMgPSAnXHUwMEUxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVDOiBjID0gJ1x1MDBFOSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RTogYyA9ICdcdTAwRUQnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUY6IGMgPSAnXHUwMEYzJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDYwOiBjID0gJ1x1MDBGQSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QjogYyA9ICdcdTAwRTcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0M6IGMgPSAnXHUwMEY3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdEOiBjID0gJ1x1MDBEMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RTogYyA9ICdcdTAwRjEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Y6IGMgPSAnXHUyNTg4JzsgYnJlYWs7IC8vIEZ1bGwgYmxvY2sKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjID0gKGNoYXIpIGRhdGE7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY0NoYXJzKCkgewotICAgICAgICAgICAgaWYgKG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMSkpOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGEyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlY2lhbENoYXJNYXBbbURhdGEyIC0gMHgzMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BhbmlzaENoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb3R1Z3Vlc2VDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhMSA8IDB4MTAgJiYgbURhdGEyIDwgMHgxMCkgewotICAgICAgICAgICAgICAgIC8vIE51bGwgUGFkLCBpZ25vcmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU51bGw6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdHJsQ29kZSA9IGdldEN0cmxDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoY3RybENvZGUgIT0gSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdJXMiLCBtVHlwZSwgY3RybENvZGVUb1N0cmluZyhjdHJsQ29kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdGFiT2Zmc2V0ID0gZ2V0VGFiT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAodGFiT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdVGFiJWQiLCBtVHlwZSwgdGFiT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUEFDIHBhYyA9IGdldFBBQygpOwotICAgICAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1QQUM6ICVzIiwgbVR5cGUsIHBhYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3R5bGVDb2RlIG0gPSBnZXRNaWRSb3coKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU1pZC1yb3c6ICVzIiwgbVR5cGUsIG0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1EaXNwbGF5YWJsZTogJXMgKCUwMnggJTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsIGdldERpc3BsYXlUZXh0KCksIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIFdpZGdldCBjYXBhYmxlIG9mIHJlbmRlcmluZyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9ucy4KLSAqLwotY2xhc3MgQ2VhNjA4Q0NXaWRnZXQgZXh0ZW5kcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGltcGxlbWVudHMgQ2VhNjA4Q0NQYXJzZXIuRGlzcGxheUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IG1UZXh0Qm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUR1bW15VGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IjsKLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDQ0xheW91dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cykgewotICAgICAgICAoKENDTGF5b3V0KSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkudXBkYXRlKHN0eWxlZFRleHRzKTsKLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYXB0aW9uU3R5bGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQm94IGV4dGVuZHMgVGV4dFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGT05UX1BBRERJTkdfUkFUSU8gPSAwLjc1ZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9PVVRMSU5FX1JBVElPID0gMC4xZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9TSEFET1dfUkFUSU8gPSAwLjA1ZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT3V0bGluZVdpZHRoOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXM7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd09mZnNldDsKLQotICAgICAgICBwcml2YXRlIGludCBtVGV4dENvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CZ0NvbG9yID0gQ29sb3IuQkxBQ0s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlVHlwZSA9IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VDb2xvciA9IENvbG9yLlRSQU5TUEFSRU5UOwotCi0gICAgICAgIENDTGluZUJveChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUik7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgc2V0VGV4dENvbG9yKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIHNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWZhdWx0ICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIG1lYXN1cmUpCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9vdXRsaW5lX3dpZHRoKTsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19yYWRpdXMpOwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBtVGV4dENvbG9yID0gY2FwdGlvblN0eWxlLmZvcmVncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1CZ0NvbG9yID0gY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1FZGdlVHlwZSA9IGNhcHRpb25TdHlsZS5lZGdlVHlwZTsKLSAgICAgICAgICAgIG1FZGdlQ29sb3IgPSBjYXB0aW9uU3R5bGUuZWRnZUNvbG9yOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCBtU2hhZG93T2Zmc2V0LCBtU2hhZG93T2Zmc2V0LCBtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYykgKiBGT05UX1BBRERJTkdfUkFUSU87Ci0gICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgZm9udFNpemUpOwotCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gRURHRV9PVVRMSU5FX1JBVElPICogZm9udFNpemUgKyAxLjBmOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IEVER0VfU0hBRE9XX1JBVElPICogZm9udFNpemUgKyAxLjBmOzsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSBtU2hhZG93UmFkaXVzOwotCi0gICAgICAgICAgICAvLyBzZXQgZm9udCBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIHdpZHRoCi0gICAgICAgICAgICBzZXRTY2FsZVgoMS4wZik7Ci0gICAgICAgICAgICBnZXRQYWludCgpLmdldFRleHRCb3VuZHMobUR1bW15VGV4dCwgMCwgbUR1bW15VGV4dC5sZW5ndGgoKSwgbVRleHRCb3VuZHMpOwotICAgICAgICAgICAgZmxvYXQgYWN0dWFsVGV4dFdpZHRoID0gbVRleHRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IHJlcXVpcmVkVGV4dFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIHNldFNjYWxlWChyZXF1aXJlZFRleHRXaWR0aCAvIGFjdHVhbFRleHRXaWR0aCk7Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfVU5TUEVDSUZJRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORQotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGVkZ2Ugc3R5bGVzIGRvbid0IHJlcXVpcmUgYSBzZWNvbmQgcGFzcwotICAgICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9PVVRMSU5FKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0VkZ2VPdXRsaW5lKGMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSYWlzZWQgb3IgZGVwcmVzc2VkCi0gICAgICAgICAgICAgICAgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZU91dGxpbmUoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBQYWludC5Kb2luIHByZXZpb3VzSm9pbiA9IHRleHRQYWludC5nZXRTdHJva2VKb2luKCk7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2aW91c1dpZHRoID0gdGV4dFBhaW50LmdldFN0cm9rZVdpZHRoKCk7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMX0FORF9TVFJPS0UpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4oUGFpbnQuSm9pbi5ST1VORCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgobU91dGxpbmVXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgb3V0bGluZSBhbmQgYmFja2dyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLgotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4ocHJldmlvdXNKb2luKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChwcmV2aW91c1dpZHRoKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIC8vIERyYXcgZm9yZWdyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByYWlzZWQgPSBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9SQUlTRUQ7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JVcCA9IHJhaXNlZCA/IENvbG9yLldISVRFIDogbUVkZ2VDb2xvcjsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvckRvd24gPSByYWlzZWQgPyBtRWRnZUNvbG9yIDogQ29sb3IuV0hJVEU7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXQgPSBtU2hhZG93UmFkaXVzIC8gMmY7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYmFja2dyb3VuZCBhbmQgdGV4dCB3aXRoIHNoYWRvdyB1cAotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgLW9mZnNldCwgLW9mZnNldCwgY29sb3JVcCk7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGV4dCB3aXRoIHNoYWRvdyBkb3duCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCArb2Zmc2V0LCArb2Zmc2V0LCBjb2xvckRvd24pOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHNldHRpbmdzCi0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRTcGFucyhpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGUgc3Bhbm5hYmxlID0gKFNwYW5uYWJsZSkgdGV4dDsKLSAgICAgICAgICAgICAgICBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbltdIGJnU3BhbnMgPSBzcGFubmFibGUuZ2V0U3BhbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBzcGFubmFibGUubGVuZ3RoKCksIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJnU3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmdTcGFuc1tpXS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IENlYTYwOENDUGFyc2VyLk1BWF9ST1dTOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTQUZFX0FSRUFfUkFUSU8gPSAwLjlmOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQm94W10gbUxpbmVCb3hlcyA9IG5ldyBDQ0xpbmVCb3hbTUFYX1JPV1NdOwotCi0gICAgICAgIENDTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuU1RBUlQpOwotICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0gPSBuZXcgQ0NMaW5lQm94KGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtTGluZUJveGVzW2ldLCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRDYXB0aW9uU3R5bGUoY2FwdGlvblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmVzIHRoZSBmb250IHNjYWxlIGNoYW5nZXMgb2YgdGhlIHN5c3RlbSB3aWRlIENDIHByZWZlcmVuY2UuCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gdGV4dEJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFRleHQodGV4dEJ1ZmZlcltpXSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5TUEFOTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCA9IGdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBzYWZlSGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHNhZmVXaWR0aCAqIDMgPj0gc2FmZUhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSBzYWZlSGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSBzYWZlV2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLQotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHQgPSBzYWZlSGVpZ2h0IC8gTUFYX1JPV1M7Ci0gICAgICAgICAgICBpbnQgbGluZUhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgIGludCBsaW5lV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgc2FmZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5tZWFzdXJlKGxpbmVXaWR0aE1lYXN1cmVTcGVjLCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgICAgIC8vIHNhZmUgY2FwdGlvbiBhcmVhCi0gICAgICAgICAgICBpbnQgdmlld1BvcnRXaWR0aCA9IHIgLSBsOwotICAgICAgICAgICAgaW50IHZpZXdQb3J0SGVpZ2h0ID0gYiAtIHQ7Ci0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoLCBzYWZlSGVpZ2h0OwotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHZpZXdQb3J0V2lkdGggKiAzID49IHZpZXdQb3J0SGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0SGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0SGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydFdpZHRoOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydFdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBpbnQgbGVmdCA9ICh2aWV3UG9ydFdpZHRoIC0gc2FmZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKHZpZXdQb3J0SGVpZ2h0IC0gc2FmZUhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLmxheW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogaSAvIE1BWF9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIHNhZmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiAoaSArIDEpIC8gTUFYX1JPV1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM2ZDdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLS8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgotcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7Ci0gICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKLSAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAotICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KLSAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKLSAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCi0gICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgotICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCi0gICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0Ci0gICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCi0gICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKLSAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TdG9wKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNTVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAotLyoqCi0gKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCi0gKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCi0gKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7Ci0gICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOwotICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgotICAgICAgICAgICAgICAgIGRvU2hvdygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6Ci0gICAgICAgICAgICAgICAgZG9IaWRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQotICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KLSAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQotICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKLSAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOwotICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKLSAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcwotICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAotICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KLSAgICAgKgotICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAotICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgotICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6Ci0gICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCi0gICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KLSAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KLSAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50Ci0gICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgotICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQotICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCi0gICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKLSAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCi0gICAgICogYW5kIEZPUkNFRD1uby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOwotCi0gICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOwotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JwotICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgotICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLQotICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCi0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGlkZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKLSAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCi0gICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCi0gICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKLSAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICBoaWRlKCk7Ci0gICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOwotICAgICAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7Ci0gICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgfQotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKLSAgICAgKiBNZWRpYVBsYXllcn0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgICAqIHJlbmRlcmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCi0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCi0gICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAotICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCi0gICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKLSAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOwotCi0gICAgLyoqCi0gICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAotICAgICAqICBzZXR0aW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7Ci0gICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQotICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgewotICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTA2NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVUcmFjayBzaW5jZSBQCi0vKioKLSAqIEEgc3VidGl0bGUgdHJhY2sgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCi0gKiBhbiBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzdWJ0aXRsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YnRpdGxlVHJhY2sgaW1wbGVtZW50cyBNZWRpYVRpbWVQcm92aWRlci5Pbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVHJhY2siOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWVNczsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lTXM7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKLQotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUVuZFRpbWUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlJRCA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotCi0gICAgcHJpdmF0ZSBDdWVMaXN0IG1DdWVzOwotICAgIGZpbmFsIHByaXZhdGUgVmVjdG9yPEN1ZT4gbUFjdGl2ZUN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVmlzaWJsZTsKLQotICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIE1lZGlhRm9ybWF0IG1Gb3JtYXQ7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbUN1ZXMgPSBuZXcgQ3VlTGlzdCgpOwotICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTWVkaWFGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICBsb25nIHJ1bklEID0gZGF0YS5nZXRTdGFydFRpbWVVcygpICsgMTsKLSAgICAgICAgb25EYXRhKGRhdGEuZ2V0RGF0YSgpLCB0cnVlIC8qIGVvcyAqLywgcnVuSUQpOwotICAgICAgICBzZXRSdW5EaXNjYXJkVGltZU1zKAotICAgICAgICAgICAgICAgIHJ1bklELAotICAgICAgICAgICAgICAgIChkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyBkYXRhLmdldER1cmF0aW9uVXMoKSkgLyAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBpbnB1dCBkYXRhIGZvciB0aGUgc3VidGl0bGUgdHJhY2suICBUaGUKLSAgICAgKiBjb21wbGV0ZSBzdWJ0aXRsZSBmb3IgYSB0cmFjayBjYW4gaW5jbHVkZSBtdWx0aXBsZSB3aG9sZSB1bml0cwotICAgICAqIChydW5zKS4gIEVhY2ggb2YgdGhlc2UgdW5pdHMgY2FuIGhhdmUgbXVsdGlwbGUgc2VjdGlvbnMuICBUaGUKLSAgICAgKiBjb250ZW50cyBvZiBhIHJ1biBhcmUgc3VibWl0dGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHdpdGggZW9zCi0gICAgICogaW5kaWNhdGluZyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uICBDYWxscyBmcm9tIGRpZmZlcmVudAotICAgICAqIHJ1bnMgbXVzdCBub3QgYmUgaW50ZXJtaXhlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN1YnRpdGxlIGRhdGEgYnl0ZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW9zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uCi0gICAgICogQHBhcmFtIHJ1bklEIG1vc3RseS11bmlxdWUgSUQgZm9yIHRoaXMgcnVuIG9mIGRhdGEuICBTdWJ0aXRsZSBjdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggcnVuSUQgb2YgMCBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogICAgICAgICAgICAgIGRpc3BsYXkuICBDdWVzIHdpdGggcnVuSUQgb2YgfjAgYXJlIGRpc2NhcmRlZAotICAgICAqICAgICAgICAgICAgICBvbmx5IGF0IHRoZSBkZWxldGlvbiBvZiB0aGUgdHJhY2sgb2JqZWN0LiAgQ3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIG90aGVyIHJ1bklELXMgYXJlIGRpc2NhcmRlZCBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBydW4sIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdGltZXN0YW1wIG9mCi0gICAgICogICAgICAgICAgICAgIGFueSBvZiBpdHMgY3VlcyAod2l0aCB0aGlzIHJ1bklEKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFkZGluZyB0aGUgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCB0byB0aGUgdmlldyBoaWVyYXJjaHksCi0gICAgICogYXMgd2VsbCBhcyB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIHRoZSBzdWJ0aXRsZSB0cmFjaywgb3Igd2hlbiB0aGUgdmlkZW8KLSAgICAgKiBzdXJmYWNlIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2lkZ2V0IHRoYXQgcmVuZGVycyB0aGlzIHN1YnRpdGxlIHRyYWNrLiBGb3IgbW9zdCByZW5kZXJlcnMKLSAgICAgKiAgICAgICAgIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGZvciBhbGwKLSAgICAgKiAgICAgICAgIHRyYWNrcyBzdXBwb3J0ZWQgYnkgdGhhdCByZW5kZXJlciwgYXMgYXQgbW9zdCBvbmUgc3VidGl0bGUgdHJhY2sKLSAgICAgKiAgICAgICAgIGlzIHZpc2libGUgYXQgb25lIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgY3VlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN1YnRpdGxlCi0gICAgICogdmlldyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUFjdGl2ZUN1ZXMoYm9vbGVhbiByZWJ1aWxkLCBsb25nIHRpbWVNcykgewotICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgdGltZXMgbWVhbiBzZWVraW5nIG9yIG5ldyBhY3RpdmUgY3VlcyBiZWluZyBhZGRlZAotICAgICAgICAvLyAoZHVyaW5nIHRoZWlyIG93biB0aW1lc3BhbikKLSAgICAgICAgaWYgKHJlYnVpbGQgfHwgbUxhc3RVcGRhdGVUaW1lTXMgPiB0aW1lTXMpIHsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ID0KLSAgICAgICAgICAgICAgICBtQ3Vlcy5lbnRyaWVzQmV0d2VlbihtTGFzdFVwZGF0ZVRpbWVNcywgdGltZU1zKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGFpcjxMb25nLCBDdWU+IGV2ZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgQ3VlIGN1ZSA9IGV2ZW50LnNlY29uZDsKLQotICAgICAgICAgICAgaWYgKGN1ZS5tRW5kVGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHBhc3QgY3VlcwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmVtb3ZpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tUnVuSUQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGN1ZXMKLSAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgd2lsbCBoYXBwZW4gaW4gc3RhcnQgb3JkZXIKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VlIGlzIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxldGUgYW55IHJ1bnMgKi8KLSAgICAgICAgd2hpbGUgKG1SdW5zQnlFbmRUaW1lLnNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1SdW5zQnlFbmRUaW1lLmtleUF0KDApIDw9IHRpbWVNcykgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KDApOyAvLyByZW1vdmVzIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGludCBpeCkgewotICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCk7Ci0gICAgICAgIHdoaWxlIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ3VlIGN1ZSA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICB3aGlsZSAoY3VlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBDdWUgbmV4dEN1ZSA9IGN1ZS5tTmV4dEluUnVuOwotICAgICAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdWUgPSBuZXh0Q3VlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJ1bnNCeUlELnJlbW92ZShydW4ubVJ1bklEKTsKLSAgICAgICAgICAgIFJ1biBuZXh0UnVuID0gcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICBydW4ubVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4ubU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4gPSBuZXh0UnVuOwotICAgICAgICB9Ci0gICAgICAgIG1SdW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKiByZW1vdmUgYWxsIGN1ZXMgKHVudGFuZ2xlIGFsbCBjcm9zcy1saW5rcykgKi8KLSAgICAgICAgaW50IHNpemUgPSBtUnVuc0J5RW5kVGltZS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaXggPSBzaXplIC0gMTsgaXggPj0gMDsgaXgtLSkgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGl4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlVGltZShsb25nIHRpbWVNcykgewotICAgICAgICBtTGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBY3RpdmVDdWVzKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkNsZWFyaW5nICIgKyBtQWN0aXZlQ3Vlcy5zaXplKCkgKyAiIGFjdGl2ZSBjdWVzIik7Ci0gICAgICAgIG1BY3RpdmVDdWVzLmNsZWFyKCk7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVUaW1lZEV2ZW50cygpIHsKLSAgICAgICAgLyogZ2V0IHRpbWVzIGZvciB0aGUgbmV4dCBldmVudCAqLwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IG1DdWVzLm5leHRUaW1lQWZ0ZXIobUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzY2hlZCBAIiArIG1OZXh0U2NoZWR1bGVkVGltZU1zICsgIiBhZnRlciAiICsgbUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdCgKLSAgICAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPj0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAobU5leHRTY2hlZHVsZWRUaW1lTXMgKiAxMDAwKSA6IE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25UaW1lZEV2ZW50ICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXMoZmFsc2UsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TZWVrICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblN0b3AiKTsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLSAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdChNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIGlmIChtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZpc2libGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIGlmICghbVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEN1ZShDdWUgY3VlKSB7Ci0gICAgICAgIG1DdWVzLmFkZChjdWUpOwotCi0gICAgICAgIGlmIChjdWUubVJ1bklEICE9IDApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KGN1ZS5tUnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuID0gbmV3IFJ1bigpOwotICAgICAgICAgICAgICAgIG1SdW5zQnlJRC5wdXQoY3VlLm1SdW5JRCwgcnVuKTsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChydW4ubUVuZFRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGluay11cCBjdWVzIGluIHRoZSBzYW1lIHJ1bgotICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgcnVuLm1GaXJzdEN1ZSA9IGN1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGEgY3VlIGlzIGFkZGVkIHRoYXQgc2hvdWxkIGJlIHZpc2libGUsIG5lZWQgdG8gcmVmcmVzaCB2aWV3Ci0gICAgICAgIGxvbmcgbm93TXMgPSAtMTsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3dNcyA9IG1UaW1lUHJvdmlkZXIuZ2V0Q3VycmVudFRpbWVVcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHByZWNpc2UgKi8sIHRydWUgLyogbW9ub3RvbmljICovKSAvIDEwMDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcyBpdCB3ZSBhcmUgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyArICIgPD0gIiArIG5vd01zICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgKyAiID49ICIgKyBtTGFzdFRpbWVNcyk7Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyA8PSBub3dNcyAmJgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHRydXN0IG5vd01zLCBzbyBjaGVjayBhbnkgY3VlIHNpbmNlIGxhc3QgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcykgewotICAgICAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gdGhpczsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhlbk1zID0gbm93TXM7Ci0gICAgICAgICAgICBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHdpdGggc3luY2hyb25pemVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyBtdWx0aXBsZSB1cGRhdGVzIGFzIHRoZSBydW5uYWJsZSBjb3VsZCBiZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRoZW5Ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBkZWxheSB1cGRhdGUgc28gd2UgZG9uJ3QgdXBkYXRlIHZpZXcgb24gZXZlcnkgY3VlLiAgVE9ETyB3aHkgMTA/Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCAxMCAvKiBkZWxheSAqLykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNjaGVkdWxpbmcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLncoVEFHLCAiZmFpbGVkIHRvIHNjaGVkdWxlIHN1YnRpdGxlIHZpZXcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zICYmCi0gICAgICAgICAgICAgICAgKGN1ZS5tU3RhcnRUaW1lTXMgPCBtTmV4dFNjaGVkdWxlZFRpbWVNcyB8fAotICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA8IDApKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVQcm92aWRlcihNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgPT0gdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN0YXRpYyBjbGFzcyBDdWVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdWVMaXN0IjsKLSAgICAgICAgLy8gc2ltcGxpc3RpYywgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtQ3VlczsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzID0gbmV3IFZlY3RvcjxDdWU+KDIpOwotICAgICAgICAgICAgICAgIG1DdWVzLnB1dCh0aW1lTXMsIGN1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWVzLmNvbnRhaW5zKGN1ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZHVwbGljYXRlIGN1ZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcG9zaXRpdmUtZHVyYXRpb24gY3VlcwotICAgICAgICAgICAgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPj0gY3VlLm1FbmRUaW1lTXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIWFkZEV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbGFzdFRpbWVNcyA9IGN1ZS5tU3RhcnRUaW1lTXM7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPiBsYXN0VGltZU1zICYmIHRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShDdWUgY3VlKSB7Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+PiBlbnRyaWVzQmV0d2VlbigKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxhc3RUaW1lTXMsIGZpbmFsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPiA+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZSAoIiArIGxhc3RUaW1lTXMgKyAiLCAiICsgdGltZU1zICsgIl09Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzLnN1Yk1hcChsYXN0VGltZU1zICsgMSwgdGltZU1zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbmV4dFRpbWVBZnRlcihsb25nIHRpbWVNcykgewotICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+PiB0YWlsID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IG1DdWVzLnRhaWxNYXAodGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbC5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhbURvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFBhaXI8TG9uZywgQ3VlPiBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RW50cnkgPSBuZXcgUGFpcjxMb25nLCBDdWU+KAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMsIG1MaXN0SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtTGFzdEVudHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHJlbW92aW5nIGVuZCB0YWdzCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0TGlzdEl0ZXJhdG9yID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RW50cnkuc2Vjb25kLm1FbmRUaW1lTXMgIT0gbUxhc3RFbnRyeS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZW5kLWN1ZQotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobUN1ZXMuZ2V0KG1MYXN0RW50cnkuZmlyc3QpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShtTGFzdEVudHJ5LmZpcnN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVzdCBvZiB0aGUgY3VlcwotICAgICAgICAgICAgICAgIEN1ZSBjdWUgPSBtTGFzdEVudHJ5LnNlY29uZDsKLSAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IGN1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgY3VlcyArICIiKTsKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IGN1ZXM7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHRLZXkoKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZW1haW5pbmdDdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcyA9IG1SZW1haW5pbmdDdWVzLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy5nZXQobUN1cnJlbnRUaW1lTXMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMudGFpbE1hcChtQ3VycmVudFRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1DdXJyZW50VGltZU1zOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0gICAgICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1SZW1haW5pbmdDdWVzOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MYXN0TGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBQYWlyPExvbmcsQ3VlPiBtTGFzdEVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VlTGlzdCgpIHsKLSAgICAgICAgICAgIG1DdWVzID0gbmV3IFRyZWVNYXA8TG9uZywgVmVjdG9yPEN1ZT4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1ZSB7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1TdGFydFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmdbXSBtSW5uZXJUaW1lc01zOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQ7Ci0KLSAgICAgICAgcHVibGljIEN1ZSBtTmV4dEluUnVuOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZShsb25nIHRpbWVNcykgeyB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSAod2l0aCBkZWZhdWx0IGVuZCB0aW1lKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKGxvbmcgcnVuSUQpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgd2l0aCBnaXZlbiBlbmQgdGltZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bkRpc2NhcmRUaW1lTXMobG9uZyBydW5JRCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB3aGV0aGVyIHRoaXMgaXMgYSB0ZXh0IHRyYWNrIHdobyBmaXJlcyBldmVudHMgaW5zdGVhZCBnZXR0aW5nIHJlbmRlcmVkICovCi0gICAgcHVibGljIGludCBnZXRUcmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJpbmdXaWRnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQKLSAgICAgICAgICAgICAgICA6IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuIHsKLSAgICAgICAgcHVibGljIEN1ZSBtRmlyc3RDdWU7Ci0gICAgICAgIHB1YmxpYyBSdW4gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIFJ1biBtUHJldlJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zID0gLTE7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRCA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RvcmVkRW5kVGltZU1zID0gLTE7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeUVuZFRpbWVNcyhMb25nU3BhcnNlQXJyYXk8UnVuPiBydW5zQnlFbmRUaW1lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgb2xkIHZhbHVlIGlmIGFueQotICAgICAgICAgICAgaW50IGl4ID0gcnVuc0J5RW5kVGltZS5pbmRleE9mS2V5KG1TdG9yZWRFbmRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzID09IHJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUuc2V0VmFsdWVBdChpeCwgbU5leHRSdW5BdEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXRFbmRUaW1lTXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG5ldyB2YWx1ZQotICAgICAgICAgICAgaWYgKG1FbmRUaW1lTXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBydW5zQnlFbmRUaW1lLmdldChtRW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucHV0KG1FbmRUaW1lTXMsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1TdG9yZWRFbmRUaW1lTXMgPSBtRW5kVGltZU1zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXRFbmRUaW1lTXMoKSB7Ci0gICAgICAgICAgICBSdW4gcHJldiA9IG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0KLSAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHByZXY7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBzdWJ0aXRsZXMgb250byBhIENhbnZhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmluZ1dpZGdldCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBjYWxsYmFjaywgd2hpY2ggaXMgdXNlZCB0byBzZW5kIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAgICAgICogcmVuZGVyZWQgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIHVwZGF0ZSBjYWxsYmFjawotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgY2FsbGJhY2spOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBzaXplLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggaW4gcGl4ZWxzCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGluIHBpeGVscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgZHJhdyBzdWJ0aXRsZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgc3VidGl0bGVzIHNob3VsZCBiZSBkcmF3biwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbmRlcnMgc3VidGl0bGVzIG9udG8gYSB7QGxpbmsgQ2FudmFzfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgY2FudmFzIG9uIHdoaWNoIHRvIHJlbmRlciBzdWJ0aXRsZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGV0YWNoZWQgZnJvbSBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIHVzZWQgdG8gc2VuZCB1cGRhdGVzIGFib3V0IGNoYW5nZXMgdG8gcmVuZGVyaW5nIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2hhbmdlZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbmRlcmluZyBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSByZW5kZXJpbmdXaWRnZXQgdGhlIHdpZGdldCB3aG9zZSBkYXRhIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZTU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgewotICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOwotICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKLSAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAotICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmI0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87Ci0KLSAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7Ci0KLSAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQotCi0gICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7Ci0gICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7Ci0gICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7Ci0gICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgyNCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQXBpMjQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGV2aWNlVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGQ0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQotICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKLSAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCi0gKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCi0gKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQotICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKLSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHA+Ci0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCi0gKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKLSAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgotICogPC9wPjxwcmU+Ci0gKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KLSAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKLSAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgotICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCi0gKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgotICogJmx0Oy9tZW51PgotICogPC9wcmU+PHA+Ci0gKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCi0gKiA8L3A+PHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgewotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gKgotICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAqCi0gKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAqICAgICB9Ci0gKgotICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKgotICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICogICAgIH0KLSAqCi0gKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICogICAgIH0KLSAqCi0gKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAqCi0gKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7Ci0gKgotICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKLSAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9Ci0gKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOwotICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKgotICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICogICAgIH0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KLSAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KLSAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQotICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCi0gICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7Ci0gICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOwotICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZThhNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KLSAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCi0gKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKLSAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KLSAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCi0gKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90Ci0gKiBiZSBjbGlja2VkLgotICogPC9wPjxwPgotICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAotICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAotICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCi0gKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZwotICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKLSAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7Ci0gICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7Ci0KLSAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OwotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAotICAgIH07Ci0KLSAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKLQotICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7Ci0gICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7Ci0gICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKLSAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcwotICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKLSAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCi0gICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9Ci0gICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCi0gICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChmbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLSAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCi0gICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICA6IG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKLSAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7Ci0KLSAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKLSAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZwotICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOwotICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7Ci0gICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKLQotICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgotICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOwotICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7Ci0gICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7Ci0gICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOwotICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgewotICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgewotICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAotICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGludCByZXNJZDsKLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOwotCi0gICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNjRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5BcHBDb21wYXREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHJvdXRlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyI7Ci0KLSAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSByb3V0ZSBsaXN0IGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVubmF0dXJhbCBkaWFsb2cgY2hhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyA9IDMwMEw7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1JPVVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtUm91dGVzOwotICAgIHByaXZhdGUgUm91dGVBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1JPVVRFUzoKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKChMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4pIG1lc3NhZ2Uub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCByb3V0ZXMgaW4gdGhlIHByb3ZpZGVkIGxpc3QgYW5kCi0gICAgICogcmVtb3ZlcyB0aG9zZSBmb3Igd2hpY2gge0BsaW5rICNvbkZpbHRlclJvdXRlfSByZXR1cm5zIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZXMgVGhlIGxpc3Qgb2Ygcm91dGVzIHRvIGZpbHRlciBpbi1wbGFjZSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpbHRlclJvdXRlcyhATm9uTnVsbCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3V0ZXMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGlmICghb25GaWx0ZXJSb3V0ZShyb3V0ZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGVuYWJsZWQgbm9uLWRlZmF1bHQgcm91dGVzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgc2VsZWN0b3IuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgcm91dGVzCi0gICAgICogZGlmZmVyZW50bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBjb25zaWRlciwgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb25GaWx0ZXJSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHRpdGxlSWQpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfZGlhbG9nKSk7Ci0KLSAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQWRhcHRlciA9IG5ldyBSb3V0ZUFkYXB0ZXIoZ2V0Q29udGV4dCgpLCBtUm91dGVzKTsKLSAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfbGlzdCk7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0RW1wdHlWaWV3KGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfdGl0bGUpOwotCi0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChnZXRDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb3V0ZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KG1Sb3V0ZXIuZ2V0Um91dGVzKCkpOwotICAgICAgICAgICAgb25GaWx0ZXJSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocm91dGVzLCBSb3V0ZUNvbXBhcmF0b3Iuc0luc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1MYXN0VXBkYXRlVGltZSA+PSBVUERBVEVfUk9VVEVTX0RFTEFZX01TKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfUk9VVEVTLCByb3V0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVUaW1lICsgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVJvdXRlcyhMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Sb3V0ZXMuYWRkQWxsKHJvdXRlcyk7Ci0gICAgICAgIG1BZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3V0ZUFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPgotICAgICAgICAgICAgaW1wbGVtZW50cyBMaXN0Vmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRGVmYXVsdEljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVR2SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJHcm91cEljb247Ci0KLSAgICAgICAgcHVibGljIFJvdXRlQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIHJvdXRlcyk7Ci0KLSAgICAgICAgICAgIFR5cGVkQXJyYXkgc3R5bGVkQXR0cmlidXRlcyA9IEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1EZWZhdWx0SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBtVHZJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgxKTsKLSAgICAgICAgICAgIG1TcGVha2VySWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMik7Ci0gICAgICAgICAgICBtU3BlYWtlckdyb3VwSWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMyk7Ci0gICAgICAgICAgICBzdHlsZWRBdHRyaWJ1dGVzLnJlY3ljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9saXN0X2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQxID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfbmFtZSk7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2Rlc2MpOwotICAgICAgICAgICAgdGV4dDEuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcm91dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgPQotICAgICAgICAgICAgICAgICAgICByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyAmJiAhVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkJPVFRPTSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LnNldEVuYWJsZWQocm91dGUuaXNFbmFibGVkKCkpOwotCi0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfaWNvbik7Ci0gICAgICAgICAgICBpZiAoaWNvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoZ2V0SWNvbkRyYXdhYmxlKHJvdXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgVXJpIGljb25VcmkgPSByb3V0ZS5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKGljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaXMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9hZCAiICsgaWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJY29uRHJhd2FibGUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KLSAgICAgICAgICAgIHN3aXRjaCAocm91dGUuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1RWOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR2SWNvbjsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9TUEVBS0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJJY29uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGJlc3QgZ3Vlc3MgYmFzZWQgb24gb3RoZXIgcm91dGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBzcGVha2VycyBjYW4gYmUgZ3JvdXBlZCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckdyb3VwSWNvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEljb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUm91dGVDb21wYXJhdG9yIHNJbnN0YW5jZSA9IG5ldyBSb3V0ZUNvbXBhcmF0b3IoKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyBsaHMsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByaHMpIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmhzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU2YjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGNmY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKLSAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKLSAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldwotICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOwotCi0gICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOwotCi0gICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKLSAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7Ci0gICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7Ci0KLSAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKLSAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7Ci0gICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7Ci0gICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOwotICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKLSAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOwotCi0gICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKLSAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKLSAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKLQotICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOwotICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKLSAgICBVcmkgbUFydEljb25Vcmk7Ci0gICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOwotICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKLSAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOwotICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7Ci0KLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOwotICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotCi0gICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi0gICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOwotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKLSAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCi0gICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7Ci0gICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCi0gICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgotICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgotICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgotICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKLSAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7Ci0gICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7Ci0KLSAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7Ci0gICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7Ci0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKLQotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9Ci0gICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOwotCi0gICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0KLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOwotCi0gICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5Ci0gICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25VcmkgPSBudWxsOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0KLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1DcmVhdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCi0gICAgICogdm9sdW1lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7Ci0gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIGhlaWdodC4KLSAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKLSAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQotICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCi0gICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCi0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KLSAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOwotICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7Ci0gICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCi0gICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7Ci0gICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgICAgICB9Ci0gICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOwotICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7Ci0KLSAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOwotICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KLSAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQotICAgICAgICAvLyBhbHdheXMgc2hvd24uCi0gICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgotICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKLQotICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotCi0gICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIGlmIChhbmltYXRlKSB7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCi0gICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKLSAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOwotICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOwotICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIG1JbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7Ci0gICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgewotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKLSAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCi0gICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQotICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCi0gICAgICAgIC8vIGFuaW1hdGlvbi4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQotICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7Ci0gICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgewotICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKLSAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCi0gICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgewotICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgewotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7Ci0gICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCi0gICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKLSAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKLSAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKLSAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOwotICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKLSAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAotICAgICAqIGEgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKLSAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7Ci0gICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBDbGlja0xpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKLSAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCi0gICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOwotICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKLSAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKLSAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7Ci0KLSAgICAgICAgRmV0Y2hBcnRUYXNrKCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgewotICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCi0gICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOwotICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQotICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVkNzRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBtRGlhbG9nOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cuY2xlYXJHcm91cExpc3RBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWFmMzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKLSAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQotICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJmN2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQotICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAotICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKLSAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0Ci0gICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgewotICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7Ci0gICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKLSAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCi0gICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCi0gICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7Ci0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7Ci0gICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUxMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgZGlzY292ZXJ5IGZyYWdtZW50LgotICogPHA+Ci0gKiBUaGlzIGZyYWdtZW50IHRha2VzIGNhcmUgb2YgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgbWVkaWEgcm91dGUgZGlzY292ZXJ5Ci0gKiBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0YXJ0IG9uU3RhcnQoKX0gcGhhc2UKLSAqIGFuZCByZW1vdmluZyBpdCBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0b3Agb25TdG9wKCl9IHBoYXNlLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEgcm91dGUgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzCi0gKiB0byBkaXNjb3Zlci4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBvdmVycmlkZSB7QGxpbmsgI29uQ3JlYXRlQ2FsbGJhY2t9IHRvCi0gKiBwcm92aWRlIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGNhbGxiYWNrIHRvIHJlZ2lzdGVyLgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IHRoZSBkaXNjb3ZlcnkgY2FsbGJhY2sgbWFrZXMgdGhlIGFwcGxpY2F0aW9uIGJlIGNvbm5lY3RlZCB3aXRoIGFsbCB0aGUKLSAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlc30KLSAqIHdoaWxlIGl0IGlzIHJlZ2lzdGVyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRNZWRpYVJvdXRlcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXIoKSB7Ci0gICAgICAgIGlmIChtUm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfQotICAgICAqIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGRvZXMgbm90aGluZy4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdXBwbHkgaXRzIG93biBjYWxsYmFjay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY2FsbGJhY2ssIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLkNhbGxiYWNrIG9uQ3JlYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7IH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZsYWdzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30gaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIGNhbGxiYWNrIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG9uQ3JlYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwYTk1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotLyoqCi0gKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7Ci0KLSAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAotICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOwotICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKLQotICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVkMjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotCi0vKioKLSAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKLSAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7Ci0KLSAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKLSAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KLSAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgewotICAgICAgICBtVGh1bWIgPSB0aHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7Ci0gICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCi0gICAgICogdGhlIHRodW1iLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOwotICAgICAgICB9Ci0gICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjA0MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuQ29sb3JVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0NPTlRSQVNUID0gMy4wZjsKLQotICAgIEBJbnREZWYoe0NPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCwgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbnRyb2xsZXJDb2xvclR5cGUge30KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EID0gMHhERTAwMDAwMDsgLyogT3BhY2l0eSBvZiA4NyUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCA9IENvbG9yLldISVRFOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlclRoZW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEFwcGx5IGJhc2UgTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0KLSAgICAgICAgLy8gQXBwbHkgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgaW50IHN0eWxlID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gcHJlcGFyZQotICAgICAqIHRoZSBjb250ZXh0IGFuZCB0aGVtZSBmb3IgYSBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGxhdHRlciBtZXRob2QgcmVsaWVzIG9uIHRoZQotICAgICAqIGZvcm1lciBtZXRob2QgdG8gcHJvcGVybHkgcHJlcGFyZSB0aGUgY29udGV4dCk6Ci0gICAgICogICBzdXBlcihjb250ZXh0ID0gY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChjb250ZXh0LCB0aGVtZSksCi0gICAgICogICAgICAgICAgIGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKGNvbnRleHQpKTsKLSAgICAgKgotICAgICAqIEl0IHdpbGwgYXBwbHkgdGhlbWUgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoc3R5bGUgbG9va3VwcyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSk6Ci0gICAgICogICAxKSBDdXJyZW50IHRoZW1lCi0gICAgICogICAyKSBTdXBwbGllZCB0aGVtZQotICAgICAqICAgMykgQmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgKiAgIDQpIEN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUsIGlmIHByb3ZpZGVkCi0gICAgICovCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSwgYm9vbGVhbiBhbGVydERpYWxvZykgewotICAgICAgICAvLyAxKSBDdXJyZW50IHRoZW1lIGlzIGFscmVhZHkgYXBwbGllZCB0byB0aGUgY29udGV4dAotCi0gICAgICAgIC8vIDIpIElmIG5vIHRoZW1lIGlzIHN1cHBsaWVkLCBsb29rIGl0IHVwIGZyb20gdGhlIGNvbnRleHQgKGRpYWxvZ1RoZW1lL2FsZXJ0RGlhbG9nVGhlbWUpCi0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIWFsZXJ0RGlhbG9nID8gYW5kcm9pZC5SLmF0dHIuZGlhbG9nVGhlbWUgOiBhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ1RoZW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgICBBcHBseSBpdAotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpOwotCi0gICAgICAgIC8vIDMpIElmIGEgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGFwcGx5IHRoZSBiYXNlIHRoZW1lCi0gICAgICAgIGlmIChnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QuCi0gICAgc3RhdGljIGludCBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCkgQXBwbHkgdGhlIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgICAgaW50IHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIC8vIDMpIE5vIGN1c3RvbSBNZWRpYVJvdXRlciB0aGVtZSB3YXMgcHJvdmlkZWQgc28gYXBwbHkgdGhlIGJhc2UgdGhlbWUgaW5zdGVhZAotICAgICAgICAgICAgdGhlbWUgPSBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLSAgICAvLyBFTkQuIFByZXZpb3VzIHR3byBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLgotCi0gICAgc3RhdGljIGludCBnZXRUaGVtZVJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IGF0dHIpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSkgPyB2YWx1ZS5yZXNvdXJjZUlkIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0RGlzYWJsZWRBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5kaXNhYmxlZEFscGhhLCB2YWx1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA/IHZhbHVlLmdldEZsb2F0KCkgOiAwLjVmOwotICAgIH0KLQotICAgIHN0YXRpYyBAQ29udHJvbGxlckNvbG9yVHlwZSBpbnQgZ2V0Q29udHJvbGxlckNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCwgcHJpbWFyeUNvbG9yKQotICAgICAgICAgICAgICAgID49IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgcmV0dXJuIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnV0dG9uVGV4dENvbG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckJhY2tncm91bmQpOwotCi0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yKSA8IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjb2xvckFjY2VudCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LgotICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JBY2NlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltYXJ5Q29sb3I7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgVmlldyBtYWluQ29udHJvbHMsIFZpZXcgZ3JvdXBDb250cm9scywgYm9vbGVhbiBoYXNHcm91cCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgcHJpbWFyeURhcmtDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5RGFyayk7Ci0gICAgICAgIGlmIChoYXNHcm91cCAmJiBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNob3dpbmcgZGFyayBjb250cm9scyBpbiBhIHBvc3NpYmx5IGRhcmsgKGkuZS4gdGhlIHByaW1hcnkgZGFyayksIG1vZGVsCi0gICAgICAgICAgICAvLyB0aGUgd2hpdGUgZGlhbG9nIGFuZCB1c2UgdGhlIHByaW1hcnkgY29sb3IgZm9yIHRoZSBncm91cCBjb250cm9scy4KLSAgICAgICAgICAgIHByaW1hcnlEYXJrQ29sb3IgPSBwcmltYXJ5Q29sb3I7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgfQotICAgICAgICBtYWluQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlEYXJrQ29sb3IpOwotICAgICAgICAvLyBBbHNvIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGUgdmlldyB0YWdzLiBUaGV5IGFyZSB1c2VkIGluCi0gICAgICAgIC8vIHNldFZvbHVtZVNsaWRlckNvbG9yKCkgYmVsb3cuCi0gICAgICAgIG1haW5Db250cm9scy5zZXRUYWcocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRUYWcocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyLCBWaWV3IGJhY2tncm91bmRWaWV3KSB7Ci0gICAgICAgIGludCBjb250cm9sbGVyQ29sb3IgPSBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCk7Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb250cm9sbGVyQ29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIC8vIENvbXBvc2l0ZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGluIG9yZGVyIG5vdCB0byBzaG93IHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdGh1bWIuCi0gICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gKGludCkgYmFja2dyb3VuZFZpZXcuZ2V0VGFnKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ29sb3IgPSBDb2xvclV0aWxzLmNvbXBvc2l0ZUNvbG9ycyhjb250cm9sbGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lU2xpZGVyLnNldENvbG9yKGNvbnRyb2xsZXJDb2xvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpZ2h0VGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICAvLyBUT0RPKHN1bmdzb28pOiBTd2l0Y2ggdG8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmlzTGlnaHRUaGVtZQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdC5SLmF0dHIuaXNMaWdodFRoZW1lLAotICAgICAgICAgICAgICAgIHZhbHVlLCB0cnVlKSAmJiB2YWx1ZS5kYXRhICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRoZW1lQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUsIGludCBhdHRyKSB7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRycyA9IHsgYXR0ciB9OwotICAgICAgICAgICAgVHlwZWRBcnJheSB0YSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhzdHlsZSwgYXR0cnMpOwotICAgICAgICAgICAgaW50IGNvbG9yID0gdGEuZ2V0Q29sb3IoMCwgMCk7Ci0gICAgICAgICAgICB0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBpZiAoY29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUucmVzb3VyY2VJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcih2YWx1ZS5yZXNvdXJjZUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldFJvdXRlclRoZW1lSWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCB0aGVtZUlkOwotICAgICAgICBpZiAoaXNMaWdodFRoZW1lKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodF9EYXJrQ29udHJvbFBhbmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodENvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZW1lSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGRlZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQotICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOwotICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOwotICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgewotICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKLSAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7Ci0gICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKLSAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgewotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOwotICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOwotICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKLSAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOwotICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgewotICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTM5YmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE3KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCi0gICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKLSAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKLSAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKLQotICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOwotICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgewotICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgotICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCi0gICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bwotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKLQotICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOwotICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMzU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE4KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmosIGludCBmbGFncykgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaiwgZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjU5YjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNikKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKLQotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgotICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCi0gICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgotICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWU3NzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAotICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCi0gKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCi0gKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCi0gKiA8L3A+PHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKLSAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQotICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCi0gKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKLSAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KLSAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCi0gKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgotICogPC9wPjxwPgotICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKLSAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCi0gKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbwotICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZwotICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCi0gKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgotICogPC91bD48cD4KLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgotICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQotICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAotICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCi0gKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKLSAqIHN0YW5kYXJkIGZlYXR1cmVzLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9Ci0gKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KLSAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQotICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAotICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCi0gKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCi0gKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcwotICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCi0gKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLSAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KLSAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgotICogPC9wPjxwPgotICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcwotICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAotICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgotICogPC9wPgotICoKLSAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99Ci0gKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQotICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKLSAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCi0gKiA8L3A+PHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCi0gKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKLSAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCi0gKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgotICogPC9wPgotICoKLSAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQotICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCi0gKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAotICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCi0gKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQotICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCi0gKiA8L3A+Ci0gKgotICogPGg0PlNlc3Npb25zPC9oND4KLSAqIDxwPgotICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KLSAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCi0gKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgotICogPC9wPjxwPgotICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQotICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKLSAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90Ci0gKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQotICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKLSAqIGFzIGFyZ3VtZW50LgotICogPC9wPjxwPgotICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZwotICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKLSAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucwotICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCi0gKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKLSAqIDwvcD48cD4KLSAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KLSAqIDxwPgotICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KLSAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAotICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcwotICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgotICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KLSAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcwotICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbwotICogaW52YWxpZGF0ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0Ci0gKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgotICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KLSAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKLSAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKLSAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCi0gKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQotICogbmV4dCBpdGVtLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZwotICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCi0gKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcwotICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5Ci0gKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAotICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKLSAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgotICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCi0gKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cwotICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCi0gKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQotICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAotICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgotICogPC9wPjxwPgotICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCi0gKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKLSAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCi0gKiA8L3A+Ci0gKgotICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgotICogPHA+Ci0gKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCi0gKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQotICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KLSAqIDwvcD48cD4KLSAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCi0gKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cwotICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKLSAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKLSAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bwotICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKLSAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCi0gKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCi0gKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQotICogcGF1c2Ugc3RhdGUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8L3VsPgotICoKLSAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQotICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQotICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCi0gKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgotICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKLSAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKLSAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQotICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKLSAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCi0gICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCi0gICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKLSAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAotICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KLSAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKLSAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCi0gICAgICogcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCi0gICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCi0gICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKLSAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMwotICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgotICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9Ci0gICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9Ci0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgotICAgICAqIDxwPgotICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCi0gICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKLSAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKLSAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCi0gICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgotICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KLSAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAotICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgotICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgotICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKLSAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAotICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgotICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKLSAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgotICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAotICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKLSAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCi0gICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgotICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgotICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgotICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgotICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCi0gICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgKiAgICAgICAgICAgICAvLyAuLi4KLSAgICAgKiAgICAgICAgIH0KLSAgICAgKgotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfTsKLSAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOwotICAgICAqIH08L3ByZT4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcwotICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCi0gICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQotICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5Ci0gICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5Ci0gICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KLSAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKLSAgICAgKiBpcyBkaWZmZXJlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KLSAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCi0gICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjawotICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKLSAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCi0gICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KLSAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCi0gICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQotICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgotICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCi0gICAgICogcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAotICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5Ci0gICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQotICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgotICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKLSAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncwotICAgICAqIHBhdXNlIHN0YXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgotICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQotICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKLSAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCi0gICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KLSAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKLSAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCi0gICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAotICAgICAqIG9mIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCi0gICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKLSAgICAgKiBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKLQotICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCi0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAotICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCi0gICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCi0gICAgICogcGxheWJhY2sgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKLSAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0Ci0gICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKLSAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCi0gICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQotICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgotICAgICAqIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCi0gICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCi0gICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKLSAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCi0gICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCi0gICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKLSAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3Igc3BlY2lmeWluZyBtZXRhZGF0YSBhYm91dCBhIG1lZGlhIGl0ZW0gYXMgYSB7QGxpbmsgQnVuZGxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogTWVkaWEgaXRlbSBtZXRhZGF0YSBpcyBkZXNjcmliZWQgYXMgYSBidW5kbGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAqIGluIHRoaXMgY2xhc3MuICBUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIGtleS4KLSAqIDwvcD48cD4KLSAqIEFuIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGtleXMgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHdpbGwgYmUgcmVjb2duaXplZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1NZXRhZGF0YSB7Ci0gICAgLyoKLSAgICAgKiBOb3RlOiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGFsc28gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEga2V5cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBmcm9tIGEgY29udGVudCBzdHJlYW0gYWx0aG91Z2ggdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNvbWV3aGF0IGRpZmZlcmVudCBoZXJlCi0gICAgICogc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGRhdGEgdG8gYSByZW1vdGUgZW5kcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1lZGlhSXRlbU1ldGFkYXRhKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIGFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX1RJVExFIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydHdvcmsgVXJpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBVUkkgZm9yIGFuIGltYWdlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBpdGVtLAotICAgICAqIHN1Y2ggYXMgYWxidW0gb3IgY292ZXIgYXJ0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUV09SS19VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRXT1JLX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXV0aG9yIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVUSE9SID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVVUSE9SIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IENvbXBvc2VyIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NUE9TRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5DT01QT1NFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBUcmFjayB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBZZWFyIG9mIHB1YmxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHllYXIgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWUVBUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLllFQVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFRyYWNrIG51bWJlciAoc3VjaCBhcyBhIHRyYWNrIG9uIGEgQ0QpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIHRyYWNrIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSQUNLX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRSQUNLX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogRGlzYyBudW1iZXIgd2l0aGluIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciBkaXNjIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBrZXk6IEl0ZW0gcGxheWJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIDxjb2RlPmxvbmc8L2NvZGU+IG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBkdXJhdGlvbiBtZXRhZGF0YSBpcyBvbmx5IGEgaGludCB0byBlbmFibGUgYSByZW1vdGUgbWVkaWEgcGxheWVyIHRvCi0gICAgICogZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IGJlZm9yZSBpdCBhY3R1YWxseSBvcGVucyB0aGUgbWVkaWEgc3RyZWFtLgotICAgICAqIFRoZSByZW1vdGUgbWVkaWEgcGxheWVyIHNob3VsZCBzdGlsbCBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb250ZW50IGR1cmF0aW9uIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc3RyZWFtIGl0c2VsZiBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoaXMga2V5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVSQVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EVVJBVElPTiI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQotICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCi0gKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucwotICogd2lsbCByZXBvcnQgaXQuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAotICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQotICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCi0gKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCi0gKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKLSAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKLSAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5Ci0gKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKLSAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCi0gICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCi0gICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCi0gICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZwotICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCi0gICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgotICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKLSAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgotICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAotICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCi0gICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKLSAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKLSAgICAgKiBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKLSAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAotICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bwotICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAotICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCi0gICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKLSAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCi0gICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKLQotICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAotICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgotICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM4NGZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgotICogPHA+Ci0gKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KLSAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7Ci0gICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQotICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQotICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCi0gICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKLSAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KLSAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKLSAgICAgICAgICogPC9saT4KLSAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCi0gICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgewotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NjI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIKLSAqIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSVZFX1NDQU4gPSAiYWN0aXZlU2NhbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gYWN0aXZlU2NhbiBUcnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gYWN0aXZlU2NhbikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4sIGFjdGl2ZVNjYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoS0VZX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlU2NhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3IuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBvdGhlciA9IChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuZXF1YWxzKG90aGVyLmdldFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQWN0aXZlU2NhbigpID09IG90aGVyLmlzQWN0aXZlU2NhbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5oYXNoQ29kZSgpIF4gKGlzQWN0aXZlU2NhbigpID8gMSA6IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlzY292ZXJ5UmVxdWVzdHsgc2VsZWN0b3I9IikuYXBwZW5kKGdldFNlbGVjdG9yKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFjdGl2ZVNjYW49IikuYXBwZW5kKGlzQWN0aXZlU2NhbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChidW5kbGUpIDogbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKLSAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKLSAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQotICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKLSAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZwotICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKLSAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCi0gKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KLSAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQotICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAqIDwvcD48cD4KLSAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKLSAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9Ci0gKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKLSAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9Ci0gKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKLSAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KLSAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQotICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKLSAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCi0gICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgotICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCi0gICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCi0gICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9Ci0gICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKLSAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKLSAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAotICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCi0gICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKLSAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KLSAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcwotICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCi0gICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAotICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bwotICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKLSAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cwotICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCi0gICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCi0gICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25VbnNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAotICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAotICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOwotICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAotICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCi0gICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTM0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IGNsaWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUdJU1RFUiA9IDE7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5SRUdJU1RFUiA9IDI7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBDcmVhdGUgcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1JPVVRFX0lEIDogcm91dGUgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiA9IDM7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWxlYXNlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIgPSA0OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFID0gNTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVuc2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUgPSA2OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0IHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FID0gNzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVwZGF0ZSByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgZGVsdGEgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSA9IDg7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBvYmogICAgIDogbWVkaWEgY29udHJvbCBpbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCA9IDk7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXRzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IGRpc2NvdmVyeSByZXF1ZXN0IGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0lEID0gInJvdXRlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAgPSAicm91dGVHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04gPSAidW5zZWxlY3RSZWFzb24iOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW55IHVucmVjb2duaXplZCBvciBtYWxmb3JtZWQgcmVxdWVzdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFID0gMDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhIHN1Y2Nlc3NmdWwgbWVzc2FnZS4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTID0gMTsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBzZXJ2ZXIgdmVyc2lvbgotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfUkVHSVNURVJFRCA9IDI7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2Nlc3MgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEID0gMzsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbHVyZSByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqIC0gU0VSVklDRV9EQVRBX0VSUk9SOiBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCA9IDQ7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBjaGFuZ2VkLiAgKHVuc29saWNpdGVkIGV2ZW50KQotICAgICAqIC0gYXJnMSAgICA6IHJlc2VydmVkICgwKQotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREFUQV9FUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgY2xpZW50IHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSBzdXBwb3J0IGxpYnJhcnkgdjI0LjEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8yID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX0NVUlJFTlQgPSBDTElFTlRfVkVSU0lPTl8yOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIHNlcnZlciB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VydmljZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UID0gU0VSVklDRV9WRVJTSU9OXzE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX1NUQVJUID0gQ0xJRU5UX1ZFUlNJT05fMTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2VuZ2VyIG9iamVjdCBpcyB2YWxpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yIGFuZCB1bnBhcmNlbGluZyBjb2RlIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlCi0gICAgICogcHJvdmlkZWQgSUJpbmRlciBpcyBhIHZhbGlkIElNZXNzZW5nZXIgb2JqZWN0LiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUKLSAgICAgKiBmb3IgYSBwZWVyIHRvIHNlbmQgYW4gaW52YWxpZCBJQmluZGVyIHRoYXQgd2lsbCByZXN1bHQgaW4gY3Jhc2hlcyBkb3duc3RyZWFtLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBtZXNzZW5nZXIgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlciAhPSBudWxsICYmIG1lc3Nlbmdlci5nZXRCaW5kZXIoKSAhPSBudWxsOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NlbmdlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIGJpbmRlciBpbnRlcmZhY2Ugb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gSU1lc3NlbmdlciB0aGVuIHRoZSBjYWxsIHRvIGdldEJpbmRlcigpIHdpbGwgY3Jhc2ggd2l0aCBhbiBOUEUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGUxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKiA8cD4KLSAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQotICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKLSAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgotICogPC9wPjxwPgotICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAotICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KLSAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCi0gKiA8L3A+PHA+Ci0gKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0Ci0gKiBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8cHJlPgotICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCi0gKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KLSAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgotICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+Ci0gKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+Ci0gKiAgICZsdDsvc2VydmljZT4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOwotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKLQotICAgIC8qCi0gICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7Ci0gICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7Ci0gICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOwotICAgIH0KLQotICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgotICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKLQotICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKLSAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwcmU+Ci0gKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAuYnVpbGQoKTsKLSAqCi0gKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7Ci0KLSAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOwotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcwotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwNTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuQWN0aXZpdHlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5Wb2x1bWVQcm92aWRlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Qcm92aWRlck1ldGFkYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZWRpYVJvdXRlciBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMKLSAqIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLgotICogPHA+Ci0gKiBBIE1lZGlhUm91dGVyIGluc3RhbmNlIGlzIHJldHJpZXZlZCB0aHJvdWdoIHtAbGluayAjZ2V0SW5zdGFuY2V9LiAgQXBwbGljYXRpb25zCi0gKiBjYW4gcXVlcnkgdGhlIG1lZGlhIHJvdXRlciBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGFuZCBpdHMgY2FwYWJpbGl0aWVzCi0gKiB0byBkZXRlcm1pbmUgaG93IHRvIHNlbmQgY29udGVudCB0byB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4gIEFwcGxpY2F0aW9ucyBjYW4KLSAqIGFsc28ge0BsaW5rIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3Qgc2VuZCBjb250cm9sIHJlcXVlc3RzfSB0byB0aGUgcm91dGUKLSAqIHRvIGFzayB0aGUgcm91dGUncyBkZXN0aW5hdGlvbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zCi0gKiBzdWNoIGFzIHBsYXlpbmcgbWVkaWEuCi0gKiA8L3A+PHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBmb3IgaW5mb3JtYXRpb24gb24gaG93IGFuIGFwcGxpY2F0aW9uCi0gKiBjYW4gcHVibGlzaCBuZXcgbWVkaWEgcm91dGVzIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgbWVkaWEgcm91dGVyIEFQSSBpcyBub3QgdGhyZWFkLXNhZmU7IGFsbCBpbnRlcmFjdGlvbnMgd2l0aCBpdCBtdXN0IGJlCi0gKiBkb25lIGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVyIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgcmVhc29uIHRoZSByb3V0ZQotICAgICAqIHdhcyB1bnNlbGVjdGVkIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gPSAwOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIGRpc2Nvbm5lY3QgYnV0dG9uIHRvIGRpc2Nvbm5lY3QgYW5kIGtlZXAgcGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZURlc2NyaXB0b3IjY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEID0gMTsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBzdG9wIGNhc3RpbmcgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEID0gMjsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgc2VsZWN0ZWQKLSAgICAgKiBhIGRpZmZlcmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBNYWludGFpbnMgZ2xvYmFsIG1lZGlhIHJvdXRlciBzdGF0ZSBmb3IgdGhlIHByb2Nlc3MuCi0gICAgLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBpbiBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZSgpIGJlZm9yZSBhbnkKLSAgICAvLyBNZWRpYVJvdXRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgc28gaXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgIC8vIHZhbGlkIHdoZW5ldmVyIGFueSBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICBzdGF0aWMgR2xvYmFsTWVkaWFSb3V0ZXIgc0dsb2JhbDsKLQotICAgIC8vIENvbnRleHQtYm91bmQgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlci4KLSAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbUNhbGxiYWNrUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICBASW50RGVmKGZsYWcgPSB0cnVlLAotICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgfQotICAgICkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENhbGxiYWNrRmxhZ3Mge30KLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBBY3RpdmVseSBzY2FuIGZvciByb3V0ZXMgd2hpbGUgdGhpcyBjYWxsYmFjawotICAgICAqIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgYWN0aXZlbHkgc2NhbiBmb3IgbmV3Ci0gICAgICogcm91dGVzLiAgQ2VydGFpbiByb3V0ZXMsIHN1Y2ggYXMgd2lmaSBkaXNwbGF5IHJvdXRlcywgbWF5IG5vdCBiZSBkaXNjb3ZlcmFibGUKLSAgICAgKiBleGNlcHQgd2hlbiBhY3RpdmVseSBzY2FubmluZy4gIFRoaXMgZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByb3V0ZSBwaWNrZXIKLSAgICAgKiBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSByb3V0ZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHVwIHRvIGRhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFjdGl2ZSBzY2FubmluZyBtYXkgY29uc3VtZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBwb3dlciBhbmQgbWF5IGhhdmUgaW50cnVzaXZlCi0gICAgICogZWZmZWN0cyBvbiB3aXJlbGVzcyBjb25uZWN0aXZpdHkuICBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWN0aXZlIHNjYW5uaW5nCi0gICAgICogb25seSBiZSByZXF1ZXN0ZWQgd2hlbiBpdCBpcyBhY3R1YWxseSBuZWVkZWQgdG8gc2F0aXNmeSBhIHVzZXIgcmVxdWVzdCB0bwotICAgICAqIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBuZXcgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZmxhZyBpbXBsaWVzIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gYnV0IHBlcmZvcm1pbmcKLSAgICAgKiBhY3RpdmUgc2NhbnMgaXMgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgbm9ybWFsIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogRG8gbm90IGZpbHRlciByb3V0ZSBldmVudHMuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3QgYW55Ci0gICAgICogcm91dGUgZXZlbiBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgY2FsbGJhY2sncyBmaWx0ZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXhjZXB0IG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCB0cnkgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIEFsdGhvdWdoIHJvdXRlIGRpc2NvdmVyeSBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQsIGNoZWNraW5nIGZvciBuZXcgcm91dGVzIG1heQotICAgICAqIHJlc3VsdCBpbiBzb21lIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGNvdWxkIHNsb3dseSBkcmFpbiB0aGUgYmF0dGVyeS4gIFRoZXJlZm9yZQotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seSBzcGVjaWZ5IHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gd2hlbgotICAgICAqIHRoZXkgYXJlIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZQotICAgICAqIG9wdGlvbiBvZiBjb25uZWN0aW5nIHRvIG5ldyByb3V0ZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGFkZCBhIGNhbGxiYWNrIHVzaW5nIHRoaXMgZmxhZyBpbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHknc30ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydH0KLSAgICAgKiBtZXRob2QgYW5kIHJlbW92ZSBpdCBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3B9IG1ldGhvZC4KLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50fSBmcmFnbWVudCBtYXkKLSAgICAgKiBhbHNvIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgPSAxIDw8IDI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXZlbiBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSA9IDEgPDwgMzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IElnbm9yZSB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1hdGNoaW5nIG5vbi1kZWZhdWx0IHJvdXRlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiBUaGlzIGNvbnN0cmFpbnQgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gb2ZmZXIgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nCi0gICAgICogdG8gdGhlIHVzZXIuICBUaGVyZSBpcyBubyBwb2ludCBvZmZlcmluZyB0aGUgY2hvb3NlciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBub24tZGVmYXVsdCBjaG9pY2VzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IFJlcXVpcmUgYW4gYWN0dWFsIHJvdXRlIHRvIGJlIG1hdGNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIHJldHVybiB0cnVlCi0gICAgICogaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmIGRpc2NvdmVyeSBpcyBub3QgaW4KLSAgICAgKiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuICBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0bwotICAgICAqIHNhdmUgcmVzb3VyY2VzIGJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIHBlcmZvcm0gcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24KLSAgICAgKiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYKLSAgICAgKiBhIG1hdGNoaW5nIHJvdXRlIGhhcyBhY3R1YWxseSBiZWVuIGRpc2NvdmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0ggPSAxIDw8IDE7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyfSBpbnN0YW5jZSwgc3VjaCBhcyBieSBzdG9yaW5nIHRoZSBpbnN0YW5jZSBpbiBhIGZpZWxkIG9mCi0gICAgICogdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgcmVtYWlucyBhbGl2ZQotICAgICAqIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGl0cyBmZWF0dXJlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBzdXBwb3J0IGxpYnJhcnkgb25seSBob2xkcyBhIHtAbGluayBXZWFrUmVmZXJlbmNlIHdlYWsgcmVmZXJlbmNlfQotICAgICAqIHRvIGVhY2ggbWVkaWEgcm91dGVyIGluc3RhbmNlLiAgV2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotICAgICAqIG1lZGlhIHJvdXRlciBpbnN0YW5jZSwgYWxsIG9mIGl0cyBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByb3V0ZSBkaXNjb3ZlcnkKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBiZSBwZXJmb3JtZWQgb24gaXRzIGJlaGFsZi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaG9sZAotICAgICAqIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBhcyBsb25nIGFzIGl0IGlzIGluIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVyIGdldEluc3RhbmNlKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzR2xvYmFsID0gbmV3IEdsb2JhbE1lZGlhUm91dGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgc0dsb2JhbC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gY3VycmVudGx5IGtub3duIHRvCi0gICAgICogdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHJvdXRlIHByb3ZpZGVyc30KLSAgICAgKiBjdXJyZW50bHkga25vd24gdG8gdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRQcm92aWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3lzdGVtIGFsd2F5cyBwcm92aWRlcyBhIGRlZmF1bHQgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYmx1ZXRvb3RoIHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBibHVldG9vdGggcm91dGUsIGlmIGV4aXN0LCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleGFtaW5lIHRoZSByb3V0ZSdzCi0gICAgICoge0BsaW5rIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBtZWRpYSBjb250cm9sIGludGVudCBmaWx0ZXJzfSB0byBhc3Nlc3MgdGhlCi0gICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSByb3V0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGJvb2xlYW4gcGxheU1vdmllKCkgewotICAgICAqICAgICBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICoKLSAgICAgKiAgICAgLy8gRmlyc3QgdHJ5IHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgaW50ZXJmYWNlLCBpZiBzdXBwb3J0ZWQuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiAgICAgICAgIC8vIFRyeSB0byBzZW5kIGl0IHRoZSBVcmkgb2YgdGhlIG1vdmllIHRvIHBsYXkuCi0gICAgICogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgICAgICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBudWxsKTsKLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2VudCB0aGUgcmVxdWVzdCB0byBwbGF5IHRoZSBtb3ZpZQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gSWYgcmVtb3RlIHBsYXliYWNrIHdhcyBub3QgcG9zc2libGUsIHRoZW4gcGxheSBsb2NhbGx5LgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgbGl2ZSB2aWRlbyBzdHJlYW1pbmcuCi0gICAgICogICAgICAgICAvLyBQcmVwYXJlIHRvIHBsYXkgY29udGVudCBsb2NhbGx5IGluIGEgd2luZG93IG9yIGluIGEgcHJlc2VudGF0aW9uLgotICAgICAqICAgICAgICAgcmV0dXJuIHBsYXlNb3ZpZUluV2luZG93KCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBOZWl0aGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIHNvIHdlIGNhbid0IHBsYXkgdGhlIG1vdmllIHRvIHRoaXMgcm91dGUuCi0gICAgICogICAgIHJldHVybiBmYWxzZTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG90aGVyd2lzZQotICAgICAqIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHJldHVybnMgaXQuIElmIHRoZXJlIGlzIG9uZSBsaXZlIGF1ZGlvIHJvdXRlCi0gICAgICogKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLCBpdCB3aWxsIGJlIHNlbGVjdGVkIGluc3RlYWQgb2YgZGVmYXVsdCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVkIHRoZSBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZQotICAgICAqIG5ld2x5IHNlbGVjdGVkIGRlZmF1bHQgcm91dGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlU2VsZWN0b3IKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNtYXRjaGVzU2VsZWN0b3IKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gdXBkYXRlU2VsZWN0ZWRSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVNlbGVjdGVkUm91dGU6ICIgKyBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmICghcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbGVjdFJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuc2VsZWN0cyB0aGUgY3VycmVudCByb3VuZCBhbmQgc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBpbnN0ZWFkLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWFzb24gZ2l2ZW4gbXVzdCBiZSBvbmUgb2Y6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICBpZiAocmVhc29uIDwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gfHwKLSAgICAgICAgICAgICAgICByZWFzb24gPiBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgcmVhc29uIHRvIHVuc2VsZWN0IHJvdXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gQ2hvb3NlIHRoZSBmYWxsYmFjayByb3V0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgotICAgICAgICAvLyBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgUm91dGVJbmZvIGZhbGxiYWNrUm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgaWYgKHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpICE9IGZhbGxiYWNrUm91dGUpIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoZmFsbGJhY2tSb3V0ZSwgcmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSwgcmVhc29uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHJvdXRlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSByb3V0ZXMgdGhhdCBtYXRjaCB0aGUKLSAgICAgKiBzZWxlY3RvciByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYgdGhlCi0gICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4KLSAgICAgKiB0aGUgbWV0aG9kIHdpbGwgb25seSBjb25zaWRlciBub24tZGVmYXVsdCByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZgotICAgICAqIGRpc2NvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLgotICAgICAqIFVzZSB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9IHRvIHJlcXVpcmUgYW4gYWN0dWFsIG1hdGNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHJvdXRlIG1heSBiZQotICAgICAqICAgICAgICAgICAgYXZhaWxhYmxlLiBNYXkgYmUgemVybyBvciBzb21lIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBhbmQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0uCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2hpbmcgcm91dGUgbWF5IGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuaXNSb3V0ZUF2YWlsYWJsZShzZWxlY3RvciwgZmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9IHdpdGhvdXQgZmxhZ3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNlbGVjdG9yIGRlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvCi0gICAgICogZGlzY292ZXIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZQotICAgICAqIGxpdmUgYXVkaW8gcm91dGVzIHRoZW4gaXQgc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPIGxpdmUgYXVkaW8gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcnl9Ci0gICAgICogaW4gaXRzIHNlbGVjdG9yIHdoZW4gaXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogVGhlIHNlbGVjdG9yIG1heSBpbmNsdWRlIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiB0aGUgc2VsZWN0b3IgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgc2V0IG9mIHNlbGVjdG9ycyBiZWluZyBtb25pdG9yZWQgYnkgdGhlIGNhbGxiYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCByb3V0ZXMKLSAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuICBFdmVudCBmaWx0ZXJpbmcgbWF5IGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcKLSAgICAgKiB0aGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfSBmbGFnIHdoZW4gdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IG1ldGhvZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGV0aGVyIGlzIGl0IHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgcm91dGUgd2l0aCB0aGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdoZXRoZXIgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogaXMgaW4gdGhlIGZvcmVncm91bmQgdG8gcmVxdWVzdCB0aGF0IHBhc3NpdmUgZGlzY292ZXJ5IGJlIHBlcmZvcm1lZCBpZiB0aGVyZSBhcmUKLSAgICAgKiBzdWZmaWNpZW50IHJlc291cmNlcyB0byBhbGxvdyBjb250aW51b3VzIHBhc3NpdmUgZGlzY292ZXJ5LgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcgd2lsbCBiZQotICAgICAqIGlnbm9yZWQgdG8gY29uc2VydmUgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogcGFzc2l2ZSBkaXNjb3ZlcnkgYWJzb2x1dGVseSBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiBvbiBsb3ctUkFNIGRldmljZXMuCi0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGlzIHNob3dpbmcgdG8gY29uZmlybSB0aGUgcHJlc2VuY2Ugb2YgYXZhaWxhYmxlCi0gICAgICogcm91dGVzIHRoYXQgdGhlIHVzZXIgbWF5IGNvbm5lY3QgdG8uICBUaGlzIGZsYWcgbWF5IHVzZSBzdWJzdGFudGlhbGx5IG1vcmUKLSAgICAgKiBwb3dlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAqCi0gICAgICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAgICAgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gICAgICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gICAgICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAgICAgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAgICAgKgotICAgICAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gICAgICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suCi0gICAgICogTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICoge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBAQ2FsbGJhY2tGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQ2FsbGJhY2s6IHNlbGVjdG9yPSIgKyBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNhbGxiYWNrPSIgKyBjYWxsYmFjayArICIsIGZsYWdzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxsYmFja1JlY29yZCByZWNvcmQ7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG5ldyBDYWxsYmFja1JlY29yZCh0aGlzLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkID0gbUNhbGxiYWNrUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiB+cmVjb3JkLm1GbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmVjb3JkLm1GbGFncyB8PSBmbGFnczsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZWNvcmQubVNlbGVjdG9yLmNvbnRhaW5zKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcmVjb3JkLm1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihyZWNvcmQubVNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0b3Ioc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlTmVlZGVkKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gIEl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgZXZlbnRzIGFib3V0Ci0gICAgICogY2hhbmdlcyB0byBtZWRpYSByb3V0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVDYWxsYmFjazogY2FsbGJhY2s9IiArIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRDYWxsYmFja1JlY29yZChDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVjb3Jkcy5nZXQoaSkubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gYWRkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gcmVtb3ZlLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW1vdGUgY29udHJvbCBjbGllbnQgdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUKLSAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlbW90ZSBjb250cm9sIGNsaWVudCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoZSBhdWRpbyBtYW5hZ2VyIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjcmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50Ci0gICAgICogQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudH0gbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fSB0byByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9Ci0gICAgICogICAgICAgICAgICB0byB1bnJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIG1lZGlhIHNlc3Npb25zLiBTZXQgdGhlCi0gICAgICogc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbiBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb259IHRvCi0gICAgICogICAgICAgICAgICB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb246ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uKG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNvbXBhdCBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcge0BsaW5rIE1lZGlhU2Vzc2lvbkNvbXBhdH0uCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb25Db21wYXQ6ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uQ29tcGF0KG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgY2FsbHMgaW50byB0aGUgbWVkaWEgcm91dGVyIGFyZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgICogSXQgcGF5cyB0byBiZSBhIGxpdHRsZSBwYXJhbm9pZCB3aGVuIGdsb2JhbCBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhdCByaXNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpICE9IExvb3Blci5nZXRNYWluTG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBtdXN0IG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJhY2Nlc3NlZCBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyA8VD4gYm9vbGVhbiBlcXVhbChUIGEsIFQgYikgewotICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbWVkaWEgcm91dGUgaGFzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9Ci0gICAgICoge0BsaW5rICNnZXRDb250cm9sRmlsdGVycyBpbnRlbnQgZmlsdGVyc30gdGhhdCBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQotICAgICAqIHJvdXRlIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQgYW5kIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckluZm8gbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRvcklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZXZpY2VUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVNYXg7Ci0gICAgICAgIHByaXZhdGUgRGlzcGxheSBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgQEludERlZih7Q09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0ZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVFlQRV9MT0NBTCxQTEFZQkFDS19UWVBFX1JFTU9URX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwbGF5YmFjayB0eXBlLCAibG9jYWwiLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhCi0gICAgICAgICAqIGlzIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBkZXZpY2UgKGUuZy4gYSBwaG9uZSwgYSB0YWJsZXQpIGFzIHdoZXJlIGl0IGlzCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBwbGF5YmFjayB0eXBlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nIG9uCi0gICAgICAgICAqIGEgZGlmZmVyZW50IGRldmljZSAoaS5lLiB0aGUgcmVtb3RlIGRldmljZSkgdGhhbiB3aGVyZSBpdCBpcyBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAxOwotCi0gICAgICAgIEBJbnREZWYoe0RFVklDRV9UWVBFX1VOS05PV04sIERFVklDRV9UWVBFX1RWLCBERVZJQ0VfVFlQRV9TUEVBS0VSLCBERVZJQ0VfVFlQRV9CTFVFVE9PVEh9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBEZXZpY2VUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSB0eXBlIGlzIHVua25vd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIFRWLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9UViA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfU1BFQUtFUiA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgYmx1ZXRvb3RoIGRldmljZSBzdWNoIGFzIGEgYmx1ZXRvb3RoIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX0JMVUVUT09USCA9IDM7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVk9MVU1FX0ZJWEVELFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVm9sdW1lIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyBmaXhlZCwgaS5lLiBpdCBjYW5ub3QgYmUKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tIHRoaXMgb2JqZWN0LiBBbiBleGFtcGxlIG9mIGZpeGVkIHBsYXliYWNrIHZvbHVtZSBpcyBhIHJlbW90ZSBwbGF5ZXIsCi0gICAgICAgICAqIHBsYXlpbmcgb3ZlciBIRE1JIHdoZXJlIHRoZSB1c2VyIHByZWZlcnMgdG8gY29udHJvbCB0aGUgdm9sdW1lIG9uIHRoZSBIRE1JIHNpbmssIHJhdGhlcgotICAgICAgICAgKiB0aGFuIGF0dGVudWF0ZSBhdCB0aGUgc291cmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX0ZJWEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIHZhcmlhYmxlIGFuZCBjYW4gYmUgY29udHJvbGxlZAotICAgICAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQgaW5kaWNhdGluZyBubyBwcmVzZW50YXRpb24gZGlzcGxheSBpcyBhc3NvY2lhdGVkCi0gICAgICAgICAqIHdpdGggdGhlIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSA9IC0xOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0dFTkVSQUwgPSAxIDw8IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1ZPTFVNRSA9IDEgPDwgMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkgPSAxIDw8IDI7Ci0KLSAgICAgICAgLy8gU2hvdWxkIG1hdGNoIHRvIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLQotICAgICAgICBSb3V0ZUluZm8oUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbURlc2NyaXB0b3JJZCA9IGRlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVyIG9mIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvdmlkZXJJbmZvIGdldFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIHVuaXF1ZSBpZCBmdW5jdGlvbnMgYXMgYSBzdGFibGUgaWRlbnRpZmllciBieSB3aGljaCB0aGUgcm91dGUgaXMga25vd24uCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgaWQgYXMgYSB0b2tlbiB0byByZW1lbWJlciB0aGUKLSAgICAgICAgICogc2VsZWN0ZWQgcm91dGUgYWNyb3NzIHJlc3RhcnRzIG9yIHRvIGNvbW11bmljYXRlIGl0cyBpZGVudGl0eSB0byBhIHNlcnZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgYSBtZWRpYSByb3V0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyBwcmVzZW50ZWQKLSAgICAgICAgICogdG8gdXNlcnMgd2hvIG1heSBzZWxlY3QgdGhpcyBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQgYW5kIG1heSBiZSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdAotICAgICAgICAgKiB5ZXQgcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvciB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIEBDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRTZWxlY3RlZFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0RGVmYXVsdFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldEJsdWV0b290aFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RldmljZVNwZWFrZXIoKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9hdWRpb19yb3V0ZV9uYW1lIiwgInN0cmluZyIsICJhbmRyb2lkIik7Ci0gICAgICAgICAgICByZXR1cm4gaXNEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldFRleHQoZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCkuZXF1YWxzKG1OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIHRoYXQKLSAgICAgICAgICogZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlIGFuZCB0aGUgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRoYXQKLSAgICAgICAgICogaXQgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGludGVudCBmaWx0ZXJzIHRoYXQgc3BlY2lmaWVzIHRoZSBtZWRpYSBjb250cm9sIGludGVudHMgdGhhdAotICAgICAgICAgKiB0aGlzIHJvdXRlIHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBieSBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2suCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGluIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3JpZXMgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlCi0gICAgICAgICAqIHN1Y2ggYXMgd2hldGhlciBpdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHN0cmVhbWluZyBvciByZW1vdGUgcGxheWJhY2suCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5oYXNDYXRlZ29yeShjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5IGFuZCBhY3Rpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGFjdGlvbnMgZGVzY3JpYmUgc3BlY2lmaWMgcmVxdWVzdHMgdGhhdCBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgKiBjYW4gYXNrIGEgcm91dGUgdG8gcGVyZm9ybS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gYWN0aW9uCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgYWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQWN0aW9uKEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbUNvbnRyb2xGaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSAmJiBmaWx0ZXIuaGFzQWN0aW9uKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIGNhbiBoYW5kbGUgdGhlIHNwZWNpZmllZCBpbnRlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IHNHbG9iYWwuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkubWF0Y2goY29udGVudFJlc29sdmVyLCBpbnRlbnQsIHRydWUsIFRBRykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VuZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QgdG8gYmUgcGVyZm9ybWVkCi0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBDb250cm9sIHJlcXVlc3RzCi0gICAgICAgICAqIHNlbnQgdG8gdW5zZWxlY3RlZCByb3V0ZXMgd2lsbCBmYWlsLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgc0dsb2JhbC5zZW5kQ29udHJvbFJlcXVlc3QodGhpcywgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToge0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1R5cGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhdWRpbyBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayAjREVWSUNFX1RZUEVfVFZ9IG9yIHtAbGluayAjREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZVR5cGU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KCkgfHwgbURldmljZVR5cGUgPT0gREVWSUNFX1RZUEVfQkxVRVRPT1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcGxhdGZvcm0gdmVyc2lvbiAyMyBvciBiZWxvdyB3aGVyZSB0aGUgc3lzdGVtIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBkb2Vzbid0IHNwZWNpZnkgZGV2aWNlIHR5cGUgZm9yIGJsdWV0b290aCBtZWRpYSByb3V0ZXMuCi0gICAgICAgICAgICByZXR1cm4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJvdXRlIGlzIHNlbGVjdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdHMgd2hldGhlciB0aGUgcm91dGUgaXMgc3RpbGwgdmFsaWQgYW5kIGVuYWJsZWQuCi0gICAgICAgICAgICAvLyBUaGUgcm91dGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSByb3V0ZSBpcyByZW1vdmVkLgotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYgbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tWb2x1bWUKLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgcm91dGUuIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkKLSAgICAgICAgICogYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lTWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIHJvdXRlIHN1cHBvcnRzIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBpbnRlcnJ1cHRpbmcKLSAgICAgICAgICogcGxheWJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGNhbiBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2ssCi0gICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhIHZvbHVtZSBjaGFuZ2UgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayAjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RTZXRWb2x1bWUodGhpcywgTWF0aC5taW4obVZvbHVtZU1heCwgTWF0aC5tYXgoMCwgdm9sdW1lKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RVcGRhdGVWb2x1bWUodGhpcywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBEaXNwbGF5fSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBzaG93Ci0gICAgICAgICAqIGEge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gb24gYW4gZXh0ZXJuYWwgZGlzcGxheSB3aGVuIHRoaXMgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkgYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseQotICAgICAgICAgKiBzZWxlY3RlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgbWF5IGNoYW5nZSBpbmRlcGVuZGVudGx5IG9mIHRoZSByb3V0ZQotICAgICAgICAgKiBiZWluZyBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgbWF5IGNoYW5nZSB3aGVuIGFuIGV4dGVybmFsIEhETUkgZGlzcGxheSBpcyBjb25uZWN0ZWQKLSAgICAgICAgICogb3IgZGlzY29ubmVjdGVkIGV2ZW4gdGhvdWdoIHRoZSByb3V0ZSBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBkaXNwbGF5IGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGUgcm91dGUgb3IgaWYgdGhlIGRpc3BsYXkgaXMgbm90IHJlYWR5IHRvIHNob3cgVUkgeWV0LgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiB1c2luZyB0aGUge0BsaW5rIENhbGxiYWNrI29uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZH0gY2FsbGJhY2sgYW5kCi0gICAgICAgICAqIHNob3cgb3IgZGlzbWlzcyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gYWNjb3JkaW5nbHkgd2hlbiB0aGUgZGlzcGxheQotICAgICAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvciBpcyByZW1vdmVkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfSByb3V0ZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IHRvIHVzZSB3aGVuIHRoaXMgcm91dGUgaXMKLSAgICAgICAgICogc2VsZWN0ZWQgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPCi0gICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPj0gMCAmJiBtUHJlc2VudGF0aW9uRGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBzR2xvYmFsLmdldERpc3BsYXkobVByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgZXh0cmEgcHJvcGVydGllcyBhYm91dCB0aGlzIHJvdXRlIHRoYXQgd2VyZSBzdXBwbGllZAotICAgICAgICAgKiBieSBpdHMgbWVkaWEgcm91dGUgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0ludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlSW5mb3sgdW5pcXVlSWQ9IiArIG1VbmlxdWVJZAotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIsIGljb25Vcmk9IiArIG1JY29uVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZW5hYmxlZD0iICsgbUVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW5nPSIgKyBtQ29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25TdGF0ZT0iICsgbUNvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIGNhbkRpc2Nvbm5lY3Q9IiArIG1DYW5EaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tUeXBlPSIgKyBtUGxheWJhY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tTdHJlYW09IiArIG1QbGF5YmFja1N0cmVhbQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZVR5cGU9IiArIG1EZXZpY2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lSGFuZGxpbmc9IiArIG1Wb2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZT0iICsgbVZvbHVtZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZU1heD0iICsgbVZvbHVtZU1heAotICAgICAgICAgICAgICAgICAgICArICIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iICsgbVByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcz0iICsgbUV4dHJhcwotICAgICAgICAgICAgICAgICAgICArICIsIHNldHRpbmdzSW50ZW50PSIgKyBtU2V0dGluZ3NJbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlclBhY2thZ2VOYW1lPSIgKyBtUHJvdmlkZXIuZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1OYW1lLCBkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRGVzY3JpcHRpb24sIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1JY29uVXJpLCBkZXNjcmlwdG9yLmdldEljb25VcmkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25VcmkgPSBkZXNjcmlwdG9yLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICE9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RpbmcgIT0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZyA9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblN0YXRlICE9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkQWxsKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUeXBlICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdHJlYW0gIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1N0cmVhbSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VUeXBlICE9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lSGFuZGxpbmcgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGluZyA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZU1heCAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYXggPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgIT0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1FeHRyYXMsIGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBkZXNjcmlwdG9yLmdldEV4dHJhcygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1TZXR0aW5nc0ludGVudCwgZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ludGVudCA9IGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNhbkRpc2Nvbm5lY3QgIT0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuRGlzY29ubmVjdCA9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQGhpZGUgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5nZXRQcm92aWRlckluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUgb3RoZXIgcm91dGVzIGluIGEgZ3JvdXAuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVHcm91cCBleHRlbmRzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBSb3V0ZUdyb3VwKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBzdXBlcihwcm92aWRlciwgZGVzY3JpcHRvcklkLCB1bmlxdWVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvdXRlQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGUgaW4gdGhpcyBncm91cCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCB0byBmZXRjaAotICAgICAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBhdCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZUF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtUm91dGVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBncm91cE1lbWJlcklkcyA9IGRlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZ3JvdXBNZW1iZXJJZHMuc2l6ZSgpICE9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IHNHbG9iYWwuZ2V0VW5pcXVlSWQoZ2V0UHJvdmlkZXIoKSwgZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gZ3JvdXBNZW1iZXIgPSBzR2xvYmFsLmdldFJvdXRlKHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzLmFkZChncm91cE1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICFtUm91dGVzLmNvbnRhaW5zKGdyb3VwTWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGNoYW5nZWQgPyBDSEFOR0VfR0VORVJBTCA6IDApIHwgc3VwZXIudXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcwotICAgICAqIHB1Ymxpc2hlZCBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzb3VyY2VzTm90QXZhaWxhYmxlOwotCi0gICAgICAgIFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldENvbXBvbmVudE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICAgICAgaWYgKG1SZXNvdXJjZXMgPT0gbnVsbCAmJiAhbVJlc291cmNlc05vdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc0dsb2JhbC5nZXRQcm92aWRlckNvbnRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZXMgZm9yIHJvdXRlIHByb3ZpZGVyIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlc05vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaW5kUm91dGVCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1EZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVQcm92aWRlckluZm97IHBhY2thZ2VOYW1lPSIgKyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGV2ZW50cyBhYm91dCBtZWRpYSByb3V0aW5nIGNoYW5nZXMuCi0gICAgICogQWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIENhbGxiYWNrIHdpbGwgb25seSByZWNlaXZlIGV2ZW50cyByZWxldmFudCB0byByb3V0ZXMgdGhhdCB0aGUgY2FsbGJhY2sKLSAgICAgKiB3YXMgcmVnaXN0ZXJlZCBmb3IgdW5sZXNzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30KLSAgICAgKiBmbGFnIHdhcyBzcGVjaWZpZWQgaW4ge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KQotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soQ2FsbGJhY2spCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBGb3IgZGV0YWlsZWQgcmVhc29uLCBvdmVycmlkZSB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9Ci0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3Mgdm9sdW1lIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHZvbHVtZSBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBiZWNvbWVzCi0gICAgICAgICAqIGF2YWlsYWJsZSwgaXMgcmVtb3ZlZCBvciBoYXMgY2hhbmdlcyB0byBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIChzdWNoIGFzIGl0cyBzaXplKS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgb2YgYSBtZWRpYSBjb250cm9sIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFJlc3VsdCBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBFcnJvciBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxiYWNrUmVjb3JkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAgICBwdWJsaWMgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tSZWNvcmQoTWVkaWFSb3V0ZXIgcm91dGVyLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgbVJvdXRlciA9IHJvdXRlcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUm91dGVFdmVudChSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUykgIT0gMAotICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBNZWRpYSByb3V0ZXMgYW5kIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBwcm9jZXNzOyB0aGVpcgotICAgICAqIHN0YXRlIGFuZCB0aGUgYnVsayBvZiB0aGUgbWVkaWEgcm91dGVyIGltcGxlbWVudGF0aW9uIGxpdmVzIGhlcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdsb2JhbE1lZGlhUm91dGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5TeW5jQ2FsbGJhY2ssCi0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5DYWxsYmFjayB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+PiBtUm91dGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFN0cmluZz4gbVVuaXF1ZUlkTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm92aWRlckluZm8+IG1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVtb3RlQ29udHJvbENsaWVudFJlY29yZD4gbVJlbW90ZUNvbnRyb2xDbGllbnRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBtQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyQ29tcGF0IG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgZmluYWwgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG1TeXN0ZW1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb3dSYW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbUJsdWV0b290aFJvdXRlOwotICAgICAgICBSb3V0ZUluZm8gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlcjsKLSAgICAgICAgLy8gQSBtYXAgZnJvbSByb3V0ZSBkZXNjcmlwdG9yIElEIHRvIFJvdXRlQ29udHJvbGxlciBmb3IgdGhlIG1lbWJlciByb3V0ZXMgaW4gdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBncm91cC4KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IG1Sb3V0ZUNvbnRyb2xsZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uUmVjb3JkIG1NZWRpYVNlc3Npb247Ci0gICAgICAgIE1lZGlhU2Vzc2lvbkNvbXBhdCBtUmNjTWVkaWFTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdCBtQ29tcGF0U2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lciBtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBpZihtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBHbG9iYWxNZWRpYVJvdXRlcihDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IERpc3BsYXlNYW5hZ2VyQ29tcGF0LmdldEluc3RhbmNlKGFwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICBtTG93UmFtID0gQWN0aXZpdHlNYW5hZ2VyQ29tcGF0LmlzTG93UmFtRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHN5c3RlbSBtZWRpYSByb3V0ZSBwcm92aWRlciBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aAotICAgICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuICBUaGlzIG9uZSBpcyBzcGVjaWFsIGFuZCByZWNlaXZlcwotICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlciA9IFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5vYnRhaW4oYXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgYWRkUHJvdmlkZXIobVN5c3RlbVByb3ZpZGVyKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIHJvdXRlcyBwdWJsaXNoZWQgYnkgcmVnaXN0ZXJlZCBtZWRpYSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgc2VydmljZXMuCi0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlciA9IG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyIGdldFJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdXRlci5tQ29udGV4dCA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGVyID0gbmV3IE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVJvdXRlcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPihyb3V0ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRleHQgZ2V0UHJvdmlkZXJDb250ZXh0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZ2V0KHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gaW5mbyA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZhdWx0IHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgc2VsZWN0Um91dGUocm91dGUsIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIGlmICghbVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCByZW1vdmVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcm91dGUubUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCBkaXNhYmxlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwocm91dGUsIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIGxvdy1SQU0gZGV2aWNlcywgZG8gbm90IHJlbHkgb24gYWN0dWFsIGRpc2NvdmVyeSByZXN1bHRzIHVubGVzcyBhc2tlZCB0by4KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIKSA9PSAwICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgZXhpc3Rpbmcgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIHJvdXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY2FsbGJhY2sgc2VsZWN0b3JzIGFuZCBhY3RpdmUgc2NhbiBmbGFncy4KLSAgICAgICAgICAgIGJvb2xlYW4gZGlzY292ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1JlY29yZCBjYWxsYmFjayA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU2VsZWN0b3IoY2FsbGJhY2subVNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2NhbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOyAvLyBwZXJmb3JtIGFjdGl2ZSBzY2FuIGltcGxpZXMgcmVxdWVzdCBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUxvd1JhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IGRpc2NvdmVyID8gYnVpbGRlci5idWlsZCgpIDogTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5nZXRTZWxlY3RvcigpLmVxdWFscyhzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuaXNBY3RpdmVTY2FuKCkgPT0gYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpICYmICFhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZWQgZGlzY292ZXJ5IHJlcXVlc3Q6ICIgKyBtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlzY292ZXIgJiYgIWFjdGl2ZVNjYW4gJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvcmNpbmcgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24gYSBsb3ctUkFNIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3lzdGVtIHBlcmZvcm1hbmNlIG1heSBiZSBhZmZlY3RlZC4gIFBsZWFzZSBjb25zaWRlciB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZIGluc3RlYWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlcnMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdmlkZXJDb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHByb3ZpZGVyIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG5ldyBQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBhZGRlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQURERUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vIDMuIFJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBTZXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIFVucmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ2xlYXIgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBEZWxldGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgcmVtb3ZlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfUkVNT1ZFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlID09IHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIudXBkYXRlRGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBleGlzdGluZyByb3V0ZXMgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaAotICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVpciBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSByb3V0ZURlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHJvdXRlIGdyb3VwJ3MgY29udGVudHMgcmVxdWlyZXMgYWxsIG1lbWJlciByb3V0ZXMnIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cHMgdG8gdGhlIGxpc3RzIGFuZCB1cGRhdGUgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gYWRkZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gdXBkYXRlZEdyb3VwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IgPSByb3V0ZURlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSByb3V0ZURlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHJvdXRlIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKHByb3ZpZGVyLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cCA9IHJvdXRlRGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IGlzR3JvdXAgPyBuZXcgUm91dGVHcm91cChwcm92aWRlciwgaWQsIHVuaXF1ZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvdXRlSW5mbyhwcm92aWRlciwgaWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5hZGQodGFyZ2V0SW5kZXgrKywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgYWRkaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByb3V0ZSBkZXNjcmlwdG9yIHdpdGggZHVwbGljYXRlIGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFJlb3JkZXIgdGhlIHJvdXRlIHdpdGhpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHByb3ZpZGVyLm1Sb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBVcGRhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IGFuZC9vciBleGlzdGluZyBncm91cHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IGFkZGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IocGFpci5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogdXBkYXRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcGFpci5zZWNvbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgaW52YWxpZCBwcm92aWRlciBkZXNjcmlwdG9yOiAiICsgcHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgYWxsIHJlbWFpbmluZyByb3V0ZXMgdGhhdCBkbyBub3QgaGF2ZSBtYXRjaGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIHJvdXRlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBub3RpZnkgY2xpZW50cyBhYm91dCByb3V0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBhZnRlciB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgcm91dGUgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBvYnNlcnZlcyB0aGUgbmV3IHJvdXRlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGJlZm9yZSB0aGUgcmVtb3ZhbCBzaW5jZSByZW1vdmluZyB0aGUgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSByZW1vdmVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1JFTU9WRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgY2hhbmdlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQ0hBTkdFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9HRU5FUkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfVk9MVU1FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdm9sdW1lIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggcm91dGUgZGVzY3JpcHRvciBpZHMgYXJlIHVuaXF1ZSB3aXRoaW4gYSBwcm92aWRlciwgaXQncwotICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIHR3byBwcm92aWRlcnMgd2l0aCB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbXVzdCBkZWR1cGUgdGhlIGNvbXBvc2l0ZSBpZC4KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnROYW1lICsgIjoiICsgcm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZCh1bmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkVpdGhlciAiICsgcm91dGVEZXNjcmlwdG9ySWQgKyAiIGlzbid0IHVuaXF1ZSBpbiAiICsgY29tcG9uZW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIgb3Igd2UncmUgdHJ5aW5nIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCBmb3IgYW4gYWxyZWFkeSBhZGRlZCByb3V0ZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VuaXF1ZUlkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIHVuaXF1ZUlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZChuZXdVbmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIG5ld1VuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VuaXF1ZUlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSb3V0ZUJ5VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWRNYXAuZ2V0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgIT0gbnVsbCAmJiAhbURlZmF1bHRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBkZWZhdWx0IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbURlZmF1bHRSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgcm91dGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmICFtQmx1ZXRvb3RoUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgYmx1ZXRvb3RoIHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgYmx1ZXRvb3RoIHJvdXRlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCB8fCAhbVNlbGVjdGVkUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJVbnNlbGVjdGluZyB0aGUgY3VycmVudCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChjaG9vc2VGYWxsYmFja1JvdXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHNlbGVjdGVkIHJvdXRlIGlzIGEgcm91dGUgZ3JvdXAsIHNlbGVjdC91bnNlbGVjdCByb3V0ZSBjb250cm9sbGVycwotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkZWQvcmVtb3ZlZCByb3V0ZSBtZW1iZXJzLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBkZXNjcmlwdG9yIElEcyBmb3IgdGhlIG5ldyByb3V0ZSBncm91cC4KLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZFNldC5hZGQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSByZW1vdmVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPj4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZFNldC5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIGFkZGVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5jb250YWluc0tleShyb3V0ZS5tRGVzY3JpcHRvcklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyb3V0ZS5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIGluZm8gYmVjYXVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gY2hvb3NlRmFsbGJhY2tSb3V0ZSgpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgcm91dGUgaXMgcmVtb3ZlZCBvciBubyBsb25nZXIgc2VsZWN0YWJsZSwKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvIGEgbGl2ZSBhdWRpbyByb3V0ZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgLy8gb25lICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKS4gIEZhaWxpbmcgdGhhdCwgdXNlCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBtRGVmYXVsdFJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtRGVmYXVsdFJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUubURlc2NyaXB0b3JJZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLkRFRkFVTFRfUk9VVEVfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbG9nZ2luZyB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsIHx8IChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiByb3V0ZS5pc0RlZmF1bHQoKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGNhbGxTdGFjayA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIC8vIGNhbGxTdGFja1szXSBpcyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgY2FsbFN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGNhbGxlciA9IGNhbGxTdGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxlci5nZXRDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRNZXRob2ROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TGluZU51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsIGlzIGNhbGxlZCB3aGlsZSBzR2xvYmFsIGlzIG51bGw6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB3aGlsZSBhIEJUIHJvdXRlIGlzIGF2YWlsYWJsZTogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdW5zZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlICsgIiByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVU5TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA6IG1Sb3V0ZUNvbnRyb2xsZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gciA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQoci5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0gcm91dGUgaXMgc2VsZWN0ZWQsIGRvIG5vdCBzeW5jIHRoZSByb3V0ZSB3ZSBzZWxlY3RlZCBiZWZvcmUuCi0gICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQpOwotICAgICAgICAgICAgaW50IHByb3ZpZGVySW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKG1TeXN0ZW1Qcm92aWRlcik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQocHJvdmlkZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IHJvdXRlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmdldChyb3V0ZUluZGV4KS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBuZXcgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVDb250cm9sQ2xpZW50cy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtQ29tcGF0U2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNCkgewotICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24ucmVtb3ZlT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFkZE9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoc2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25SZWNvcmQgbWVkaWFTZXNzaW9uUmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbWVkaWFTZXNzaW9uUmVjb3JkOwotICAgICAgICAgICAgaWYgKG1lZGlhU2Vzc2lvblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb24uZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbXBhdFNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGF0U2Vzc2lvbi5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSA9PSByY2MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lTWF4ID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZyA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1R5cGUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBnZXREZWZhdWx0Um91dGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TZWxlY3RlZFJvdXRlID09IGdldEJsdWV0b290aFJvdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsIHJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZSA9IFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jb25maWd1cmVWb2x1bWUoY29udHJvbFR5cGUsIG1QbGF5YmFja0luZm8udm9sdW1lTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblJlY29yZCB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBtTXNDb21wYXQ7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtTWF4Vm9sdW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlckNvbXBhdCBtVnBDb21wYXQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IE1lZGlhU2Vzc2lvbkNvbXBhdC5mcm9tTWVkaWFTZXNzaW9uKG1BcHBsaWNhdGlvbkNvbnRleHQsIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbkNvbXBhdCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IG1lZGlhU2Vzc2lvbkNvbXBhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlVm9sdW1lKEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1WcENvbXBhdCAhPSBudWxsICYmIGNvbnRyb2xUeXBlID09IG1Db250cm9sVHlwZSAmJiBtYXggPT0gbU1heFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGNoYW5nZWQgY29udHJvbCB0eXBlIG9yIG1heCBqdXN0IHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGN1cnJlbnQgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdC5zZXRDdXJyZW50Vm9sdW1lKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJvdmlkZXIgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBuZXcgVm9sdW1lUHJvdmlkZXJDb21wYXQoY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZVRvKGZpbmFsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShmaW5hbCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvUmVtb3RlKG1WcENvbXBhdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvTG9jYWwobVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1zQ29tcGF0LmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBtUmNjQ29tcGF0OwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0ZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0ID0gUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5vYnRhaW4obUFwcGxpY2F0aW9uQ29udGV4dCwgcmNjKTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SY2NDb21wYXQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFBsYXliYWNrSW5mbyhtUGxheWJhY2tJbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYWxsYmFja0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtVGVtcENhbGxiYWNrUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9NQVNLID0gMHhmZjAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1JPVVRFID0gMHgwMTAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1BST1ZJREVSID0gMHgwMjAwOwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQURERUQgPSBNU0dfVFlQRV9ST1VURSB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUkVNT1ZFRCA9IE1TR19UWVBFX1JPVVRFIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA0OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDU7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDY7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVU5TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNzsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0FEREVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX1JFTU9WRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQ0hBTkdFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMzsKLQotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gb2J0YWluTWVzc2FnZShtc2csIG9iaik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYXJnOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcxOwotCi0gICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTVNHX1JPVVRFX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldFNlbGVjdGVkUm91dGUoKS5nZXRJZCgpLmVxdWFscygoKFJvdXRlSW5mbykgb2JqKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKHdoYXQsIG9iaik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBjYWxsYmFja3MgYmVmb3JlIGludm9raW5nIHRoZW0gaW4gY2FzZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBkdXJpbmcgZGlzcGF0Y2guCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5hZGRBbGwocm91dGVyLm1DYWxsYmFja1JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhbGxiYWNrQ291bnQgPSBtVGVtcENhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayhtVGVtcENhbGxiYWNrUmVjb3Jkcy5nZXQoaSksIHdoYXQsIG9iaiwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcihpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUFkZGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVJlbW92ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQ2hhbmdlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlU2VsZWN0ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNhbGxiYWNrKENhbGxiYWNrUmVjb3JkIHJlY29yZCwgaW50IHdoYXQsIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlciByb3V0ZXIgPSByZWNvcmQubVJvdXRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFjayA9IHJlY29yZC5tQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0ICYgTVNHX1RZUEVfTUFTSykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1JPVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZUluZm8gcm91dGUgPSAoUm91dGVJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkLmZpbHRlclJvdXRlRXZlbnQocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9VTlNFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUFJPVklERVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IChQcm92aWRlckluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJBZGRlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlclJlbW92ZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJDaGFuZ2VkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNjU5Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcwotICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgotICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKLSAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KLSAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bwotICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKLQotICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKLSAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTRlMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKLSAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7Ci0KLSAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKLSAgICAgICAgaWYgKCFtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgewotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKLQotICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKLSAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAotICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBXYXRjaGVzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB0byBiZSBpbnN0YWxsZWQuCi0gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIG1lZGlhIHJvdXRlciBmb3IgZWFjaCByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICogQHNlZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4gbVByb3ZpZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nOwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKENvbnRleHQgY29udGV4dCwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKLSAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KLSAgICAgICAgICAgIC8vIEFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZXN0YXJ0aW5nIHByb3ZpZGVycyBpZiBuZWVkZWQuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzY2FuUGFja2FnZXMoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBwcm92aWRlcnMgZm9yIGFsbCBuZXcgc2VydmljZXMuCi0gICAgICAgIC8vIFJlb3JkZXIgdGhlIGxpc3Qgc28gdGhhdCBwcm92aWRlcnMgbGVmdCBhdCB0aGUgZW5kIHdpbGwgYmUgdGhlIG9uZXMgdG8gcmVtb3ZlLgotICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKGludGVudCwgMCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87Ci0gICAgICAgICAgICBpZiAoc2VydmljZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IGZpbmRQcm92aWRlcihzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZCh0YXJnZXRJbmRleCsrLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5hZGRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA+PSB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOyAvLyByZXN0YXJ0IHRoZSBwcm92aWRlciBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIucmViaW5kSWZEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChtUHJvdmlkZXJzLCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByb3ZpZGVycyBmb3IgbWlzc2luZyBzZXJ2aWNlcy4KLSAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgbVByb3ZpZGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci5oYXNDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVNjYW5QYWNrYWdlc1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU2NhblBhY2thZ2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgICAgICB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQ0OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAqCi0gKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOwotICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7Ci0KLSAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUmNjID0gcmNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1SY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCi0gICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCi0gICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCi0gICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCi0gICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqIERvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgotICAgICAqCi0gICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KLSAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKLSAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotCi0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAotICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKLSAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTE0OTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCi0gKiA8cD4KLSAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCi0gKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLQotICAgIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKLSAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUm91dGUgPSByb3V0ZTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKLQotICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKLSAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAotICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KLSAgICAgKiBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCi0gICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQotICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQotICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5Ci0gICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKLSAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCi0gICAgICogcmVtYWluIHBhdXNlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgewotICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAotICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5Ci0gICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAotICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcwotICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBtZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQotICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgotICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBCdW5kbGUgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBmaW5hbCBpbnQgY29kZTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgewotICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKLSAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm51bGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7Ci0KLSAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0OTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJvdXRlcyBmb3IgYnVpbHQtaW4gc3lzdGVtIGRlc3RpbmF0aW9ucyBzdWNoIGFzIHRoZSBsb2NhbCBkaXNwbGF5Ci0gKiBhbmQgc3BlYWtlci4gIE9uIEplbGx5YmVhbiBhbmQgbmV3ZXIgcGxhdGZvcm0gcmVsZWFzZXMsIHF1ZXJpZXMgdGhlIGZyYW1ld29yawotICogTWVkaWFSb3V0ZXIgZm9yIGZyYW1ld29yay1wcm92aWRlZCByb3V0ZXMgYW5kIHJlZ2lzdGVycyBub24tZnJhbWV3b3JrLXByb3ZpZGVkCi0gKiByb3V0ZXMgYXMgdXNlciByb3V0ZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9VVEVfSUQgPSAiREVGQVVMVF9ST1VURSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBpMjRJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxOCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjJJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjFJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBhZGRlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgcmVtb3ZlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBjaGFuZ2VkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrcyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUUkVBTSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVDaGFuZ2VSZWNlaXZlciBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXI7Ci0gICAgICAgIGludCBtTGFzdFJlcG9ydGVkVm9sdW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgbVZvbHVtZUNoYW5nZVJlY2VpdmVyID0gbmV3IFZvbHVtZUNoYW5nZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVm9sdW1lQ2hhbmdlUmVjZWl2ZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBkZWZhdWx0Um91dGUgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ST1VURV9JRCwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfc3lzdGVtX3JvdXRlX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbEZpbHRlcnMoQ09OVFJPTF9GSUxURVJTKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tTdHJlYW0oUExBWUJBQ0tfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tUeXBlKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lSGFuZGxpbmcoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZU1heChtYXhWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobUxhc3RSZXBvcnRlZFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRSb3V0ZShkZWZhdWx0Um91dGUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZUlkLmVxdWFscyhERUZBVUxUX1JPVVRFX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJvdXRlQ29udHJvbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBEZWZhdWx0Um91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1hdGgubWluKG1heFZvbHVtZSwgTWF0aC5tYXgoMCwgdm9sdW1lICsgZGVsdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIFZvbHVtZUNoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICAgICAgLy8gVGhlc2UgY29uc3RhbnRzIGNvbWUgZnJvbSBBdWRpb01hbmFnZXIuCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfQ0hBTkdFRF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04iOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFIjsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gUExBWUJBQ0tfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgIT0gbUxhc3RSZXBvcnRlZFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrLCBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLQotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3luY0NhbGxiYWNrIG1TeW5jQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1DYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVm9sdW1lQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1Sb3V0ZVR5cGVzOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQWN0aXZlU2NhbjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbGxiYWNrUmVnaXN0ZXJlZDsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBmcmFtZXdvcmsgcm91dGVzIHRvIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSB0YWcgZmllbGQgZm9yIHRoaXMgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBwdWJsaXNoZWQgaXRzIG93biB1c2VyIHJvdXRlcyB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBhbmQgYWxyZWFkeQotICAgICAgICAvLyB1c2VkIHRoZSB0YWcgZm9yIGl0cyBvd24gcHVycG9zZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+IG1TeXN0ZW1Sb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcyB0byBmcmFtZXdvcmsgcm91dGVzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4gbVVzZXJSb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNDYWxsYmFjayA9IHN5bmNDYWxsYmFjazsKLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1DYWxsYmFja09iaiA9IGNyZWF0ZUNhbGxiYWNrT2JqKCk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2FsbGJhY2tPYmogPSBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCByLmdldFN0cmluZyhSLnN0cmluZy5tcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlSWQpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGludCBuZXdSb3V0ZVR5cGVzID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3QWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IHJlcXVlc3QuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdGVnb3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdBY3RpdmVTY2FuID0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IG5ld1JvdXRlVHlwZXMgfHwgbUFjdGl2ZVNjYW4gIT0gbmV3QWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVR5cGVzID0gbmV3Um91dGVUeXBlczsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2NhbiA9IG5ld0FjdGl2ZVNjYW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsYmFjaygpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCByb3V0ZU9iaiA6IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFJvdXRlcyhtUm91dGVyT2JqKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2goT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYXNzaWduUm91dGVJZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqLCBpZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlSWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBzaG91bGQgc3VwcGx5IGEgdW5pcXVlIHJvdXRlIGlkIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgaGVyZS4gIEZvciBub3cgd2UgdXNlIGEgaGFzaCBvZiB0aGUgcm91dGUgbmFtZSBhbmQgdGFrZSBjYXJlCi0gICAgICAgICAgICAvLyB0byBkZWR1cGUgaXQuCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChnZXREZWZhdWx0Um91dGUoKSA9PSByb3V0ZU9iaik7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBpc0RlZmF1bHQgPyBERUZBVUxUX1JPVVRFX0lEIDoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICJST1VURV8lMDh4IiwgZ2V0Um91dGVOYW1lKHJvdXRlT2JqKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChpZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIGlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQobmV3SWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocm91dGVPYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG5ld1ZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZU9iaiAhPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHVzZXJSb3V0ZVJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAodXNlclJvdXRlUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyUm91dGVSZWNvcmQubVJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHJvdXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBzZWxlY3QgaXQgaW5zdGVhZCB3aGVuIHRoZSByb3V0ZSBpcyBhZGRlZC4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNDYWxsYmFjay5vblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyB3aGVuIGEgcm91dGUgaXMgdW5zZWxlY3RlZC4KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBVc2VyUm91dGVSZWNvcmQocm91dGUsIHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJvdXRlT2JqLCByZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socm91dGVPYmosIG1Wb2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZFVzZXJSb3V0ZShtUm91dGVyT2JqLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXdseSBhZGRlZCByb3V0ZSBpcyB0aGUgY291bnRlcnBhcnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgICAgICAgICAgICAgIC8vIHJvdXRlIGluIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHRoZW4gZW5zdXJlIGl0IGlzIHNlbGVjdGVkIGluCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVVc2VyUm91dGUobVJvdXRlck9iaiwgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlT2JqID09IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVXNlclJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVXNlclJvdXRlUmVjb3JkIGdldFVzZXJSb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE9iamVjdCB0YWcgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0VGFnKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiB0YWcgaW5zdGFuY2VvZiBVc2VyUm91dGVSZWNvcmQgPyAoVXNlclJvdXRlUmVjb3JkKXRhZyA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGFsd2F5cyByZWNyZWF0ZSB0aGUgcm91dGUgZGVzY3JpcHRvciB3aGVuIG1ha2luZyBhbnkgY2hhbmdlcwotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBpbW11dGFibGUgb25jZSBwdWJsaXNoZWQuCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCwgZ2V0Um91dGVOYW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLSAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb3V0ZU5hbWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZXMgc2hvdWxkIG5vdCBoYXZlIG51bGwgbmFtZXMgYnV0IGl0IG1heSBoYXBwZW4gZm9yIGJhZGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIHVzZXIgcm91dGVzLiAgV2UgdG9sZXJhdGUgdGhpcyBieSB1c2luZyBhbiBlbXB0eSBuYW1lIHN0cmluZyBoZXJlIGJ1dAotICAgICAgICAgICAgLy8gc3VjaCB1bm5hbWVkIHJvdXRlcyB3aWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgbWVkaWEgcm91dGVyIHVwc3RyZWFtCi0gICAgICAgICAgICAvLyAod2l0aCBhIGxvZyBtZXNzYWdlIHNvIHdlIGNhbiB0cmFjayBkb3duIHRoZSBwcm9ibGVtKS4KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldE5hbWUocm91dGVPYmosIGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRUeXBlcyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1N0cmVhbShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZU1heChyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lSGFuZGxpbmcocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZC5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KS5tUm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtUm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbVJvdXRlRGVzY3JpcHRvcjsgLy8gYXNzaWduZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24KLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICAgICAgbVJvdXRlRGVzY3JpcHRvcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVDb250cm9sbGVyKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZShtUm91dGVPYmosIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RVcGRhdGVWb2x1bWUobVJvdXRlT2JqLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIxIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIxSW1wbCBleHRlbmRzIEplbGx5YmVhbkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kIG1BY3RpdmVTY2FuV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjFJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBuZXdQcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3UHJlc2VudGF0aW9uRGlzcGxheUlkID0gKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdQcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uaXNFbmFibGVkKHJlY29yZC5tUm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGluZyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb25uZWN0aW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXNwbGF5IHByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChwcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUNhbGxiYWNrKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlU2Nhbldvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSwgZ2V0SGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZC5zZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhtQWN0aXZlU2NhbiA/IG1Sb3V0ZVR5cGVzIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxOCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjJJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIxSW1wbCB7Ci0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjJJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmdldERlc2NyaXB0aW9uKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Vc2VyUm91dGVJbmZvLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgICAgICAgICAgfCAobUFjdGl2ZVNjYW4gPyBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcGkyNCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDI0KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwaTI0SW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMkltcGwgewotICAgICAgICBwdWJsaWMgQXBpMjRJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgYnVpbGRlci5zZXREZXZpY2VUeXBlKE1lZGlhUm91dGVyQXBpMjQuUm91dGVJbmZvLmdldERldmljZVR5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci0KLTxib2R5PgotCi08cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQotICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NDcxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0KLSAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIGxwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9Ci0gICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7Ci0gICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7Ci0KLSAgICAgICAgaW50IG1heEhlaWdodCA9IDA7Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCi0gICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOwotICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOwotICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOwotCi0gICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7Ci0KLSAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmYxNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sVmlldzIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xWaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOID0gImZ1bGxTY3JlZW4iOwotCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcHVibGljIGFwaSB0byBzdXBwb3J0IGN1c3RvbSB2aWRlbyB2aWV3LgotICAgIC8vIFRPRE86IENvbWJpbmUgdGhlc2UgY29uc3RhbnRzIGludG8gb25lIHJlZ2FyZGluZyBUcmFja0luZm8uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVklERU9fVFJBQ0tfQ09VTlQgPSAiVmlkZW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19UUkFDS19DT1VOVCA9ICJBdWRpb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UID0gIlN1YnRpdGxlVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1BFRUQgPSAiUGxheWJhY2tTcGVlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfQVVESU9fSU5ERVggPSAiU2VsZWN0ZWRBdWRpb0luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCA9ICJTZWxlY3RlZFN1YnRpdGxlSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUyA9ICJVcGRhdGVUcmFja1N0YXR1cyI7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIGludGVncmF0aW5nIHdpdGggTWVkaWFTZXNzaW9uMiAmIE1lZGlhTWV0YWRhdGEyCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCA9ICJNZWRpYVR5cGVBZHZlcnRpc2VtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUyA9ICJVcGRhdGVNZWRpYVR5cGVTdGF0dXMiOwotCi0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2hvdyBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NIT1dfU1VCVElUTEUgPSAic2hvd1N1YnRpdGxlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBoaWRlIHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElERV9TVUJUSVRMRSA9ICJoaWRlU3VidGl0bGUiOwotICAgIC8vIFRPRE86IHJlbW92ZSBvbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXZpc2VkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfRlVMTFNDUkVFTiA9ICJzZXRGdWxsc2NyZWVuIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZWxlY3QgYXVkaW8gdHJhY2sgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0sgPSAiU2VsZWN0VHJhY2siOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNldCBwbGF5YmFjayBzcGVlZCB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCA9ICJTZXRQbGF5YmFja1NwZWVkIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBtdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTVVURT0gIk11dGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHVubXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOTVVURSA9ICJVbm11dGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0sgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9IRUxQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfTUFJTiA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0RFRkFVTFQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX01VU0lDID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9BRFZFUlRJU0VNRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFV0lORF9USU1FX01TID0gMTAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfVElNRV9NUyA9IDMwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRF9TS0lQX1dBSVRfVElNRV9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX05PTl9FWElTVEVOVCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTVBUWSA9ICIiOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyBtQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlIG1QbGF5YmFja1N0YXRlOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IG1QcmV2U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtQXVkaW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVRyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzTW9kZTsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFNwZWVkSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzV2luZG93TWFyZ2luOwotICAgIHByaXZhdGUgaW50IG1NZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotICAgIHByaXZhdGUgbG9uZyBtUGxheWJhY2tBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Z1bGxTY3JlZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd0V4cGFuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTdG9wcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVJc0VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWVrQXZhaWxhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZHZlcnRpc2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVYVXBkYXRlOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtUm9vdDsKLSAgICBwcml2YXRlIFZpZXcgbVRpdGxlQmFyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFkRXh0ZXJuYWxMaW5rOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJhY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1Sb3V0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUNlbnRlclZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UcmFuc3BvcnRDb250cm9sczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5UGF1c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRmZ3ZEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1SZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QcmV2QnV0dG9uOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1pbmltYWxFeHRyYVZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzOwotICAgIHByaXZhdGUgVmlldyBtUHJvZ3Jlc3NCdWZmZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyTGVmdFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVRpbWVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRTa2lwVmlldzsKLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJSaWdodFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJhc2ljQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUV4dHJhQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUN1c3RvbUJ1dHRvbnM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU3VidGl0bGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRnVsbFNjcmVlbkJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvblJpZ2h0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uTGVmdDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1NdXRlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVZpZGVvUXVhbGl0eUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TZXR0aW5nc0J1dHRvbjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFJlbWFpbmluZ1ZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICBwcml2YXRlIExpc3RWaWV3IG1TZXR0aW5nc0xpc3RWaWV3OwotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVNldHRpbmdzV2luZG93OwotICAgIHByaXZhdGUgU2V0dGluZ3NBZGFwdGVyIG1TZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBTdWJTZXR0aW5nc0FkYXB0ZXIgbVN1YlNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NNYWluVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc1N1YlRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVNldHRpbmdzSWNvbklkc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtQXVkaW9UcmFja0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVZpZGVvUXVhbGl0eUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBsYXliYWNrU3BlZWRUZXh0TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RmxvYXQ+IG1QbGF5YmFja1NwZWVkTGlzdDsKLQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBJbmZsYXRlIE1lZGlhQ29udHJvbFZpZXcyIGZyb20gWE1MCi0gICAgICAgIG1Sb290ID0gbWFrZUNvbnRyb2xsZXJWaWV3KCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1Sb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkZ1bGxTY3JlZW5MaXN0ZW5lcl9pbXBsKE1lZGlhQ29udHJvbFZpZXcyLk9uRnVsbFNjcmVlbkxpc3RlbmVyIGwpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyX2ltcGwoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMgPSBjb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAvLyBTZXQgbU1ldGFkYXRhIGFuZCBtUGxheWJhY2tTdGF0ZSB0byBleGlzdGluZyBNZWRpYVNlc3Npb24gdmFyaWFibGVzIHNpbmNlIHRoZXkgbWF5Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gbUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgICAgICBtQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1dHRvblZpc2liaWxpdHlfaW1wbChpbnQgYnV0dG9uLCBpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgbWVtYmVyIHZhcmlhYmxlcyBmb3IgRmFzdC1Gb3J3YXJkL1BydmlvdXMvUmV3aW5kIGJ1dHRvbnMgdG8gc2F2ZSB2aXNpYmlsaXR5IGluCi0gICAgICAgIC8vIG9yZGVyIHRvIHByZXZlbnQgYmVpbmcgb3ZlcnJpZGVuIGluc2lkZSB1cGRhdGVMYXlvdXQoKS4KLSAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BMQVlfUEFVU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiBjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GRldEOgotICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmIGNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9SRVc6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTkVYVDoKLSAgICAgICAgICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BSRVY6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwgJiYgbVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRlVMTF9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9PVkVSRkxPVzoKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX01VVEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQbGF5QnV0dG9uRm9jdXNfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFDb250cm9sVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSByZW1vdmVkPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxheW91dCB3aGVuIHRoaXMgdmlldydzIHdpZHRoIGNoYW5nZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW55IFVJIG92ZXJsYXAgYmV0d2VlbgotICAgICAgICAvLyB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSB8fCBtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBEaXNtaXNzIFNldHRpbmdzV2luZG93IGlmIGl0IGlzIHNob3dpbmcuCi0gICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB2aWV3cyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gICAgICAgICAgICBpZiAobVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgPT0gMCB8fCBtVGltZVZpZXcuZ2V0V2lkdGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIG1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLSAgICAgICAgICAgIGludCBmdWxsSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IGVtYmVkZGVkSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBBZHZlcnRpc2VtZW50IE1vZGUuCi0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgNC4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gNDsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmUtdGltZSBvcGVyYXRpb24gZm9yIE11c2ljIG1lZGlhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMucmVtb3ZlVmlldyhtTXV0ZUJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLmFkZFZpZXcobU11dGVCdXR0b24sIDApOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgMy4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gMzsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXIgcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZCBvdmVybGFwIGJldHdlZW4gdGl0bGUgdmlldyBhbmQgdGhlIHJpZ2h0Ci0gICAgICAgIC8vIHNpZGUgb2YgdGhlIHRpdGxlIGJhci4KLSAgICAgICAgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLQotICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgYmVsb3cgY29kZSB3aXRoIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKS4KLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSkgewotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIGlmIChtUm91dGVTZWxlY3RvciAhPSBudWxsICYmICFtUm91dGVTZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSk7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheWluZygpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBtUGxheWJhY2tTdGF0ZS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zID0gbVBsYXliYWNrU3RhdGUuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChidWZmZXJlZFBvcyA9PSAtMSkgPyAtMSA6IChpbnQpIChidWZmZXJlZFBvcyAqIDEwMCAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblBhdXNlKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0JhY2t3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtGb3J3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIHdpZGdldHMgdGhhdCBjb250cm9sIHBsYXliYWNrLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgdGhlaXIgb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciB2aWV3LgotICAgICAqIEBoaWRlIFRoaXMgZG9lc24ndCB3b3JrIGFzIGFkdmVydGlzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld0dyb3VwIG1ha2VDb250cm9sbGVyVmlldygpIHsKLSAgICAgICAgVmlld0dyb3VwIHJvb3QgPSAoVmlld0dyb3VwKSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1lZGlhX2NvbnRyb2xsZXIpOwotICAgICAgICBpbml0Q29udHJvbGxlclZpZXcocm9vdCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udHJvbGxlclZpZXcoVmlld0dyb3VwIHYpIHsKLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICAgICAgbVRpdGxlQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXIpOwotICAgICAgICBtVGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZXh0KTsKLSAgICAgICAgbUFkRXh0ZXJuYWxMaW5rID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9leHRlcm5hbF9saW5rKTsKLSAgICAgICAgbUJhY2tCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhY2spOwotICAgICAgICBpZiAobUJhY2tCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1CYWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb3V0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2FzdCk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgbUNlbnRlclZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNlbnRlcl92aWV3KTsKLSAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1pbmltYWxfZXh0cmFfdmlldyk7Ci0gICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgbU1pbmltYWxFeHRyYVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGludCBpY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0gICAgICAgIHBhcmFtcy5zZXRNYXJnaW5zKDAsIChpY29uU2l6ZSArIG1hcmdpblNpemUgKiAyKSAqICgtMSksIDAsIDApOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgICAgIG1Qcm9ncmVzcyA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3MpOwotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgaW5zdGFuY2VvZiBTZWVrQmFyKSB7Ci0gICAgICAgICAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtU2Vla0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0UHJvZ3Jlc3NEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzKSk7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRNYXgoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzX2J1ZmZlcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJMZWZ0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgbVRpbWVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lKTsKLSAgICAgICAgbUVuZFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfZW5kKTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2N1cnJlbnQpOwotICAgICAgICBtQWRTa2lwVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfc2tpcF90aW1lKTsKLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtRm9ybWF0QnVpbGRlciwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJSaWdodFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICBtQmFzaWNDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFzaWNfY29udHJvbHMpOwotICAgICAgICBtRXh0cmFDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZXh0cmFfY29udHJvbHMpOwotICAgICAgICBtQ3VzdG9tQnV0dG9ucyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tX2J1dHRvbnMpOwotICAgICAgICBtU3VidGl0bGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnN1YnRpdGxlKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTaG93IEZ1bGxzY3JlZW4gYnV0dG9uIHdoZW4gb25seSBpdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfcmlnaHQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X2xlZnQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1NdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5tdXRlKTsKLSAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTXV0ZUJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtU2V0dGluZ3NCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzKTsKLSAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC52aWRlb19xdWFsaXR5KTsKLSAgICAgICAgaWYgKG1WaWRlb1F1YWxpdHlCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVZpZGVvUXVhbGl0eUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtQWRSZW1haW5pbmdWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9yZW1haW5pbmcpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgICAgICBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpOwotICAgICAgICBtU2V0dGluZ3NMaXN0VmlldyA9IChMaXN0VmlldykgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zZXR0aW5nc19saXN0KTsKLSAgICAgICAgbVNldHRpbmdzQWRhcHRlciA9IG5ldyBTZXR0aW5nc0FkYXB0ZXIobVNldHRpbmdzTWFpblRleHRzTGlzdCwgbVNldHRpbmdzU3ViVGV4dHNMaXN0LAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0KTsKLSAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlciA9IG5ldyBTdWJTZXR0aW5nc0FkYXB0ZXIobnVsbCwgMCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gPSAoLTEpICogbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX3NldHRpbmdzX29mZnNldCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdyA9IG5ldyBQb3B1cFdpbmRvdyhtU2V0dGluZ3NMaXN0VmlldywgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgcGF1c2Ugb3Igc2VlayBidXR0b25zIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHBhdXNlZCBvciBzZWVrZWQuCi0gICAgICogVGhpcyByZXF1aXJlcyB0aGUgY29udHJvbCBpbnRlcmZhY2UgdG8gYmUgYSBNZWRpYVBsYXllckNvbnRyb2xFeHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgIWNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIGFkZCBhIGNhblNlZWsgdG8gdGhlIE1lZGlhUGxheWVyQ29udHJvbCBpbnRlcmZhY2U7Ci0gICAgICAgICAgICAvLyB0aGlzIHNjaGVtZSBjYW4gYnJlYWsgdGhlIGNhc2Ugd2hlbiBhcHBsaWNhdGlvbnMgd2FudCB0byBhbGxvdyBzZWVrIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvLyBwcm9ncmVzcyBiYXIgYnV0IGRpc2FibGUgZm9yd2FyZC9iYWNrd2FyZCBidXR0b25zLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aGUgZmxhZ3MgU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUsIFNFRUtfRk9SV0FSRF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAvLyBhbmQgU0VFS19BVkFJTEFCTEUgYXJlIGFsbCAodW4pc2V0IHRvZ2V0aGVyOyBhcyBzdWNoIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZQotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGFyaXNlIGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZXgpIHsKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYW4gb2xkIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSwgdGhhdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgIC8vIHRoZSBjYW5QYXVzZS9jYW5TZWVrWFlaIG1ldGhvZHMuIFRoaXMgaXMgT0ssIGl0IGp1c3QgbWVhbnMgd2UKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVkaWEgY2FuIGJlIHBhdXNlZCBhbmQgc2Vla2VkLCBhbmQgc28gd2UgZG9uJ3QgZGlzYWJsZQotICAgICAgICAgICAgLy8gdGhlIGJ1dHRvbnMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1VcGRhdGVQcm9ncmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1Nob3dpbmcgPSBtSW5zdGFuY2UuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgICAgIGlmICghbURyYWdnaW5nICYmIGlzU2hvd2luZyAmJiBpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0RGVsYXllZChtVXBkYXRlUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TIC0gKHBvcyAlIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGb3JUaW1lKGludCB0aW1lTXMpIHsKLSAgICAgICAgaW50IHRvdGFsU2Vjb25kcyA9IHRpbWVNcyAvIDEwMDA7Ci0KLSAgICAgICAgaW50IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAodG90YWxTZWNvbmRzIC8gNjApICUgNjA7Ci0gICAgICAgIGludCBob3VycyA9IHRvdGFsU2Vjb25kcyAvIDM2MDA7Ci0KLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBpZiAoaG91cnMgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiVkOiUwMmQ6JTAyZCIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlMDJkOiUwMmQiLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbGxlciA9PSBudWxsIHx8IG1EcmFnZ2luZykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IDA7Ci0gICAgICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBnZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IChpbnQpIChNQVhfUFJPR1JFU1MgKiAobG9uZykgY3VycmVudFBvc2l0aW9uIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgY3VycmVudFBvc2l0aW9uICE9IG1EdXJhdGlvbikgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldFByb2dyZXNzKHBvc2l0aW9uT25Qcm9ncmVzc0Jhcik7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVkaWEgaXMgYSBsb2NhbCBmaWxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIGJ1ZmZlciwgc28gc2V0IHNlY29uZGFyeQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgdG8gbWF4aW11bS4KLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXJQZXJjZW50YWdlKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhnZXRCdWZmZXJQZXJjZW50YWdlKCkgKiAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVuZFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKG1EdXJhdGlvbikpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKGN1cnJlbnRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgdGhlCi0gICAgICAgICAgICAvLyBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uIDw9IEFEX1NLSVBfV0FJVF9USU1FX01TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURfU0tJUF9XQUlUX1RJTUVfTVMgLSBjdXJyZW50UG9zaXRpb24pIC8gMTAwMCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VGV4dChza2lwVGltZVRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkUmVtYWluaW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1RpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbiA8IDApID8gMCA6IChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyByZW1haW5pbmdUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JUaW1lKHJlbWFpbmluZ1RpbWUpKTsKLSAgICAgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFRleHQocmVtYWluaW5nVGltZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCkgewotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wYXVzZSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGxheSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgY2FuIHRyaWdnZXIgdGhlIHNlZWtiYXIgbGlzdGVuZXIgdG8gdHJpZ2dlcjoKLSAgICAvLwotICAgIC8vIFRoZSBmaXJzdCBpcyB0aGUgdXNlciB1c2luZyB0aGUgdG91Y2hwYWQgdG8gYWRqdXN0IHRoZSBwb3NpdGl0b24gb2YgdGhlCi0gICAgLy8gc2Vla2JhcidzIHRodW1iLiBJbiB0aGlzIGNhc2Ugb25TdGFydFRyYWNraW5nVG91Y2ggaXMgY2FsbGVkIGZvbGxvd2VkIGJ5Ci0gICAgLy8gYSBudW1iZXIgb2Ygb25Qcm9ncmVzc0NoYW5nZWQgbm90aWZpY2F0aW9ucywgY29uY2x1ZGVkIGJ5IG9uU3RvcFRyYWNraW5nVG91Y2guCi0gICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZmllbGQgIm1EcmFnZ2luZyIgdG8gdHJ1ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnZ2luZwotICAgIC8vIHNlc3Npb24gdG8gYXZvaWQganVtcHMgaW4gdGhlIHBvc2l0aW9uIGluIGNhc2Ugb2Ygb25nb2luZyBwbGF5YmFjay4KLSAgICAvLwotICAgIC8vIFRoZSBzZWNvbmQgc2NlbmFyaW8gaW52b2x2ZXMgdGhlIHVzZXIgb3BlcmF0aW5nIHRoZSBzY3JvbGwgYmFsbCwgaW4gdGhpcwotICAgIC8vIGNhc2UgdGhlcmUgV09OJ1QgQkUgb25TdGFydFRyYWNraW5nVG91Y2gvb25TdG9wVHJhY2tpbmdUb3VjaCBub3RpZmljYXRpb25zLAotICAgIC8vIHdlIHdpbGwgc2ltcGx5IGFwcGx5IHRoZSB1cGRhdGVkIHBvc2l0aW9uIHdpdGhvdXQgc3VzcGVuZGluZyByZWd1bGFyIHVwZGF0ZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBtU2Vla0xpc3RlbmVyID0gbmV3IE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIEJ5IHJlbW92aW5nIHRoZXNlIHBlbmRpbmcgcHJvZ3Jlc3MgbWVzc2FnZXMgd2UgbWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0aGF0IGEpIHdlIHdvbid0IHVwZGF0ZSB0aGUgcHJvZ3Jlc3Mgd2hpbGUgdGhlIHVzZXIgYWRqdXN0cwotICAgICAgICAgICAgLy8gdGhlIHNlZWtiYXIgYW5kIGIpIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBkcmFnZ2luZyB0aGUgdGh1bWIKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgcG9zdCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlIGFnYWluIGFuZAotICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSBtZXNzYWdlIHF1ZXVlZCB1cC4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGxheWJhY2sgaXMgY3VycmVudGx5IHN0b3BwZWQuIEluIHRoaXMgY2FzZSwgdXBkYXRlIHRoZSBwYXVzZSBidXR0b24gdG8KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHBsYXkgaW1hZ2UgaW5zdGVhZCBvZiB0aGUgcmVwbGF5IGltYWdlLgotICAgICAgICAgICAgaWYgKG1Jc1N0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBiYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBjaGFuZ2VzIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb2dyZXNzIGJhcidzIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gKGludCkgKCgobG9uZykgbUR1cmF0aW9uICogcHJvZ3Jlc3MpIC8gTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgZnV0dXJlLAotICAgICAgICAgICAgLy8gdGhlIGNhbGwgdG8gc2hvdygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIGJlY2F1c2UgaXQgaXMgYQotICAgICAgICAgICAgLy8gbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgc2hvd2luZy4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUGxheVBhdXNlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1SZXdMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBSRVdJTkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRmZ3ZExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSArIEZPUldBUkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9OZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUHJldkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9QcmV2aW91cygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUJhY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVZpZGVvUXVhbGl0eUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1WaWRlb1F1YWxpdHlMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRnVsbFNjcmVlbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbnRlcmluZ0Z1bGxTY3JlZW4gPSAhbUlzRnVsbFNjcmVlbjsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlLWFycmFuZ2UgdGhlIGJ1dHRvbiBsYXlvdXRzIGFjY29yZGluZyB0byB0aGUgVVguCi0gICAgICAgICAgICBpZiAoaXNFbnRlcmluZ0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYXJncy5wdXRCb29sZWFuKEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOLCBpc0VudGVyaW5nRnVsbFNjcmVlbik7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9GVUxMU0NSRUVOLCBhcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgbUlzRnVsbFNjcmVlbiA9IGlzRW50ZXJpbmdGdWxsU2NyZWVuOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93UmlnaHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU11dGVCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011dGUpIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX211dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY191bm11dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9VTk1VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfTUFJTjsKLSAgICAgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIuc2V0U3ViVGV4dHMobVNldHRpbmdzU3ViVGV4dHNMaXN0KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TZXR0aW5nc01vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfTUFJTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobUF1ZGlvVHJhY2tMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtUGxheWJhY2tTcGVlZFRleHRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTcGVlZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfSEVMUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0ssIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFNwZWVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEZsb2F0KEtFWV9QTEFZQkFDS19TUEVFRCwgbVBsYXliYWNrU3BlZWRMaXN0LmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9IRUxQOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwgcG9zaXRpb24gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEUsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vbiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vZmYsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vZmYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdmlkZW8gcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSBtTWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRpdGxlIGJhciBpcyBtYWRlIHVwIG9mIHR3byBzZXBhcmF0ZSBMaW5lYXJMYXlvdXRzLiBJZiB0aGUgc3VtIG9mIHRoZSB0d28gYmFycyBhcmUKLSAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgdGl0bGUgYmFyLCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlZnQgYmFyICh3aGljaCBtYWtlcyB0aGUKLSAgICAvLyBUZXh0VmlldyB0aGF0IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgbWVkaWEgZmlsZSBzaHJpbmspLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZUJhckxheW91dCgpIHsKLSAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdGl0bGVCYXJXaWR0aCA9IG1UaXRsZUJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBWaWV3IGxlZnRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX2xlZnQpOwotICAgICAgICAgICAgVmlldyByaWdodEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgaW50IGxlZnRCYXJXaWR0aCA9IGxlZnRCYXIuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCByaWdodEJhcldpZHRoID0gcmlnaHRCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIGxlZnRCYXIuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA+IHRpdGxlQmFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSB0aXRsZUJhcldpZHRoIC0gcmlnaHRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSBsZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPCB0aXRsZUJhcldpZHRoICYmIG1PcmlnaW5hbExlZnRCYXJXaWR0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZ0QmFyLnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlVGV4dCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGFydGlzdFRleHQgPSAiIjsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBmb3IgRW1iZWRkZWQgc2l6ZSB0eXBlCi0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVUZXh0ICsgIiAtICIgKyBhcnRpc3RUZXh0KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gdXBkYXRlIGxheW91dCBpbnNpZGUgb25NZWFzdXJlKCkKLSAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldENvbG9yRmlsdGVyKFIuY29sb3IuZ3JheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dChpbnQgbWF4SWNvbkNvdW50LCBpbnQgZnVsbEljb25TaXplLCBpbnQgZW1iZWRkZWRJY29uU2l6ZSwKLSAgICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSwgaW50IGN1cnJXaWR0aCwgaW50IGN1cnJIZWlnaHQsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCkgewotICAgICAgICBpbnQgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBmdWxsSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBlbWJlZGRlZEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZnVsbFdpZHRoID0gbVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgKyBtVGltZVZpZXcuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICsgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBlbWJlZGRlZFdpZHRoID0gbVRpbWVWaWV3LmdldFdpZHRoKCkgKyBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBzY3JlZW5NYXhMZW5ndGggPSBNYXRoLm1heChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZnVsbFdpZHRoID4gc2NyZWVuTWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzY3JlZW4gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG5lZWRlZCBmb3IgRnVsbCBzaXplLgotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxTaXplID0gKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSA/IChjdXJyV2lkdGggPT0gc2NyZWVuTWF4TGVuZ3RoKSA6Ci0gICAgICAgICAgICAgICAgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGlzRnVsbFNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9GVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbWJlZGRlZFdpZHRoIDw9IGN1cnJXaWR0aCkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9FTUJFRERFRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfTUlOSU1BTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShpbnQgc2l6ZVR5cGUpIHsKLSAgICAgICAgbVNpemVUeXBlID0gc2l6ZVR5cGU7Ci0gICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyB0aW1lVmlld1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbVRpbWVWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgIHN3aXRjaCAobVNpemVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9FTUJFRERFRDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GLCBSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRlVMTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmZ1bGxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMsIDApOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRiwgUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9NSU5JTUFMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbU1pbmltYWxFeHRyYVZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0Lm1pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtVGltZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHRpbWVWaWV3UGFyYW1zKTsKLQotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICBtUGxheVBhdXNlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wYXVzZSk7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUGxheVBhdXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GZndkQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mZndkKTsKLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRmZ3ZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVJld0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucmV3KTsKLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVJld0xpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgTmV4dCBhbmQgUHJldmlvdXMgYnV0dG9ucwotICAgICAgICBtTmV4dEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubmV4dCk7Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU5leHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByZXYpOwotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QcmV2TGlzdGVuZXIpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpIHsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0KSk7Ci0KLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKVtQTEFZQkFDS19TUEVFRF8xeF9JTkRFWF0pOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKFJFU09VUkNFX0VNUFRZKTsKLQotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfYXVkaW90cmFjayk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2hlbHApOwotCi0gICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotCi0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCkpOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKSkpOwotICAgICAgICAvLyBTZWxlY3QgdGhlICIxeCIgc3BlZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWDsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBpbnRbXSBzcGVlZHMgPSBtUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuc3BlZWRfbXVsdGlwbGllZF9ieV8xMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAoZmxvYXQpIHNwZWVkc1tpXSAvIDEwMC4wZjsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdC5hZGQoc3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhCYXNlQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIC8vIFNldCBBZGFwdGVyCi0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0KLSAgICAgICAgLy8gU2V0IHdpZHRoIG9mIHdpbmRvdwotICAgICAgICBpbnQgaXRlbVdpZHRoID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA6IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zZXRXaWR0aChpdGVtV2lkdGgpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBoZWlnaHQgb2Ygd2luZG93IGFuZCBzaG93Ci0gICAgICAgIGludCBpdGVtSGVpZ2h0ID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgOiBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICAgICAgaW50IHRvdGFsSGVpZ2h0ID0gYWRhcHRlci5nZXRDb3VudCgpICogaXRlbUhlaWdodDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNob3dBc0Ryb3BEb3duKG1JbnN0YW5jZSwgbVNldHRpbmdzV2luZG93TWFyZ2luLAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiAtIHRvdGFsSGVpZ2h0LCBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IHN0YXRlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcGF1c2UgYnV0dG9uIGRlcGVuZGluZyBvbiBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGZvbGxvd2luZyB0d28gcmVhc29uczoKLSAgICAgICAgICAgIC8vICAgMSkgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSBhcHAgY3VzdG9taXplcyBwbGF5YmFjayBzdGF0ZSBiZWhhdmlvciB3aGVuIGFwcAotICAgICAgICAgICAgLy8gICAgICBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICAgICAgLy8gICAyKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHRoZSBtZWRpYSBmaWxlIHJlYWNoZXMgZW5kIG9mIGR1cmF0aW9uLgotICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgIT0gbVByZXZTdGF0ZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3JlcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tBY3Rpb25zICE9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgbmV3QWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tBY3Rpb25zID0gbmV3QWN0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGJ1dHRvbnMgaWYgY3VzdG9tIGFjdGlvbnMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0Q3VzdG9tQWN0aW9ucygpOwotICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgIGlmIChjdXN0b21BY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IGN1c3RvbUFjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VCdXR0b24gYnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBBdHRyaWJ1dGVTZXQgKi8sIDAgLyogU3R5bGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcHBseSBSLnN0eWxlLkJvdHRvbUJhckJ1dHRvbiB0byB0aGlzIGJ1dHRvbiB1c2luZyBsaWJyYXJ5IGNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyIENvbnN0cnVjdG9yIHdpdGggYXJndW1lbnQgKGludCBkZWZTdHlsZVJlcykgb2YgVmlldy5qYXZhCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKGFjdGlvbi5nZXRJY29uKCkpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VG9vbHRpcFRleHQoYWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25TdHJpbmcgPSBhY3Rpb24uZ2V0QWN0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB3ZSBhcmUganVzdCBzZW5kaW5nIGV4dHJhcyB0aGF0IGNhbWUgZnJvbSBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSByaWdodCBiZWhhdmlvcj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2VuZEN1c3RvbUFjdGlvbihhY3Rpb25TdHJpbmcsIGFjdGlvbi5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLmFkZFZpZXcoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9WSURFT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIGF1ZGlvIHRyYWNrcywgYW5kIHRoaXMgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RlZCBpbnRvIHRoZSBTZXR0aW5ncyB3aW5kb3cgeWV0LCBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBmaXJzdCB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgQXVkaW8gVHJhY2sgc2VsZWN0aW9uIHdpbGwgYmUgZGVmYXVsdGVkIHRvICJOb25lIi4KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX0FVRElPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGV4dCBhYm91dCB0cmFjayBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXVkaW9UcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugc3ViIHRleHQgaW5zaWRlIHRoZSBTZXR0aW5ncyB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrQ291bnQgPT0gMCAmJiBtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdWJ0aXRsZVRyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1N0YXR1cyA9IGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNBZHZlcnRpc2VtZW50ID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1JY29uSWRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTWFpblRleHRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3ViVGV4dHM7Ci0KLSAgICAgICAgcHVibGljIFNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gbWFpblRleHRzLCBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHN1YlRleHRzLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEludGVnZXI+IGljb25JZHMpIHsKLSAgICAgICAgICAgIG1NYWluVGV4dHMgPSBtYWluVGV4dHM7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG1JY29uSWRzID0gaWNvbklkczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtTWFpblRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtTWFpblRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1haW5UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtTWFpblRleHRzID09IG51bGwpID8gMCA6IG1NYWluVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyBtYWluVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5tYWluX3RleHQpOwotICAgICAgICAgICAgVGV4dFZpZXcgc3ViVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5zdWJfdGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7Ci0KLSAgICAgICAgICAgIC8vIFNldCBtYWluIHRleHQKLSAgICAgICAgICAgIG1haW5UZXh0Vmlldy5zZXRUZXh0KG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBzdWIgdGV4dCBhbmQgY2VudGVyIHRoZSBtYWluIHRleHQgaWYgc3ViIHRleHRzIGRvIG5vdCBleGlzdCBhdCBhbGwgb3IgdGhlIHN1YgotICAgICAgICAgICAgLy8gdGV4dCBhdCB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgZW1wdHkuCi0gICAgICAgICAgICBpZiAobVN1YlRleHRzID09IG51bGwgfHwgbVN1YlRleHRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHN1YiB0ZXh0LgotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFRleHQobVN1YlRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbWFpbiBpY29uIGFuZCBzZXQgdmlzaWJpbGl0eSB0byBnb25lIGlmIGljb25zIGFyZSBzZXQgdG8gbnVsbCBvciB0aGUgaWNvbiBhdAotICAgICAgICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIHNldCB0byBSRVNPVVJDRV9OT05fRVhJU1RFTlQuCi0gICAgICAgICAgICBpZiAobUljb25JZHMgPT0gbnVsbCB8fCBtSWNvbklkcy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX05PTl9FWElTVEVOVCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgbWFpbiBpY29uLgotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShtSWNvbklkcy5nZXQocG9zaXRpb24pLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGV4dGVuZCB0aGlzIGNsYXNzIGZyb20gU2V0dGluZ3NBZGFwdGVyCi0gICAgcHJpdmF0ZSBjbGFzcyBTdWJTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNoZWNrUG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIFN1YlNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gdGV4dHMsIGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobVRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVRleHRzID09IG51bGwpID8gMCA6IG1UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBjaGVja1ZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2spOwotCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1UZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtQ2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0cyhMaXN0PFN0cmluZz4gdGV4dHMpIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tQb3NpdGlvbihpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMmNkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi1jbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OwotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OwotCi0gICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwotICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKLSAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTJlODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLQotY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOwotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YTNhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVzsKLQotQFJlcXVpcmVzQXBpKDI2KQotY2xhc3MgVmlkZW9UZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVGV4dHVyZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmU7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgLy8gU3VyZmFjZSBpcyBub3QgcmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0U3VyZmFjZShtU3VyZmFjZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1RFWFRVUkVWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlICE9IG51bGwgJiYgIW1TdXJmYWNlVGV4dHVyZS5pc1JlbGVhc2VkKCkgJiYgbVN1cmZhY2UgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUKLSAgICAgICAgICAgICAgICArICIsIG5ldyBzdXJmYWNlOiAiICsgc3VyZmFjZVRleHR1cmUpOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKTsgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBoZXJlPwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKLSAgICAgICAgLy8gbm8tb3AKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogVGV4dHVyZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmU7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzlkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCi0KLSAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKLQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOwotCi0gICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgotICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OwotICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOwotICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7Ci0gICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKLQotICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCi0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7Ci0gICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KLSAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KLSAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKLQotICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IDEuMGY7Ci0gICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotCi0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KLSAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKLQotICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOwotCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOwotICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKLSAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKLSAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OwotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKLSAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KLSAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgotICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOwotICAgIH0KLQotICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKLSAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1Ec2QgPSBkc2Q7Ci0gICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgb3BlblZpZGVvKGRzZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KLSAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKLSAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgewotICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKLSAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgotICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7Ci0gICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCi0gICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KLSAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOwotICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgotICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OwotICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOwotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQotICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KLSAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKLSAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKLSAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKLSAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAotICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7Ci0gICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKLSAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKLSAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOwotICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOwotICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewotICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKLSAgICAgICAgYnVpbGRlci5wdXRMb25nKAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotCi0gICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7Ci0gICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCi0gICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgotICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7Ci0KLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0KLSAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOwotICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7Ci0gICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NdXNpY1ZpZXcgPSB2OwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKLSAgICB9Ci0KLSAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KLSAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0ZDQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgewotICAgIC8qKgotICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCi0gICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKLSAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKLSAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKLSAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKLSAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKLSAgICAgKiBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KLSAgICAgKi8KLSAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCi0gICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjgyNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwSW1wbCBpbXBsZW1lbnRzIFZpZXdHcm91cFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotCi0gICAgcHVibGljIFZpZXdHcm91cEltcGwoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGVfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25GaW5pc2hJbmZsYXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25MYXlvdXRfaW1wbChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChpbnQgbWVhc3VyZWRXaWR0aCwgaW50IG1lYXN1cmVkSGVpZ2h0KSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwobWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmNoZWNrTGF5b3V0UGFyYW1zX2ltcGwocCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLnNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoVmlldyBjaGlsZCwKLSAgICAgICAgaW50IHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIGludCB3aWR0aFVzZWQsIGludCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaW50IGhlaWdodFVzZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChjaGlsZCwKLSAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCB3aWR0aFVzZWQsIHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBoZWlnaHRVc2VkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmZDJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAotICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKLSAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGp1bml0Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKLQotTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKLQotTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPCEtLQotICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgotICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIwODQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5NYXRjaGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIFNlc3Npb25QbGF5bGlzdEFnZW50fS4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFUEVBVF9NT0RFID0gLTEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TSFVGRkxFX01PREUgPSAtMTAwOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgRXhlY3V0b3IgbUhhbmRsZXJFeGVjdXRvcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtQWdlbnQ7Ci0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1EYXRhU291cmNlSGVscGVyOwotICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhPYmplY3Qgd2FpdExvY2spIHsKLSAgICAgICAgICAgIG1XYWl0TG9jayA9IHdhaXRMb2NrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZUhlbHBlciBpbXBsZW1lbnRzIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIG9uRGF0YVNvdXJjZU1pc3NpbmcoTWVkaWFTZXNzaW9uMiBzZXNzaW9uLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldE1lZGlhSWQoKS5jb250YWlucygiV0lUSE9VVF9EU0QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZ2V0Q29udGV4dCgpLCBVcmkucGFyc2UoImRzZDovL3Rlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaXRlbS5nZXRNZWRpYUlkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE1vY2tQbGF5ZXIgZXh0ZW5kcyBNZWRpYVBsYXllckJhc2UgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsb29wQ3VycmVudChib29sZWFuIGxvb3ApIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1NwZWVkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5ZXJWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soRXhlY3V0b3IgZSwgUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCi0gICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIG1Db250ZXh0LmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2Vzc2lvblBsYXlsaXN0QWdlbnQiKTsKLSAgICAgICAgaGFuZGxlclRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gKHJ1bm5hYmxlKSAtPiB7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtUGxheWVyID0gbW9jayhNb2NrUGxheWVyLmNsYXNzKTsKLSAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gKFBsYXllckV2ZW50Q2FsbGJhY2spIGFyZ3NbMV07Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSkud2hlbihtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBtb2NrKE1lZGlhU2Vzc2lvbjJJbXBsLmNsYXNzKTsKLSAgICAgICAgbURhdGFTb3VyY2VIZWxwZXIgPSBuZXcgTXlEYXRhU291cmNlSGVscGVyKCk7Ci0gICAgICAgIG1BZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudChtU2Vzc2lvbkltcGwsIG1QbGF5ZXIpOwotICAgICAgICBtQWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRGF0YVNvdXJjZUhlbHBlcik7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKG1XYWl0TG9jayk7Ci0gICAgICAgIG1BZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtSGFuZGxlckV4ZWN1dG9yLCBtRXZlbnRDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdFNhZmVseSgpOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSBudWxsOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFNodWZsbGVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaHVmZmxlTW9kZSA9IG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKElOVkFMSURfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRSZXBlYXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXBlYXRNb2RlID0gbUFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoSU5WQUxJRF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMTA7Ci0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplLCBtQWdlbnQuZ2V0UGxheWxpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEl0ZW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1BsYXlsaXN0SXRlbQotICAgICAgICBmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShwbGF5bGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0SXRlbQotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gMDsgY3VyUGxheVBvcyA8IGxpc3RTaXplIC0gMTsgKytjdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zICsgMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxOyBjdXJQbGF5UG9zID4gMDsgLS1jdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzIHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0IHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEsIG5leHRQbGF5UG9zID0gMAotICAgICAgICAvLyBUZXN0IG5leHQgcGxheSBwb3MgYWZ0ZXIgc2V0dGluZyByZXBlYXQgbW9kZSBub25lLgotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIFRlc3QgYWRkIGl0ZW06IFswIChjdXIpLCAxLCAyLCAzLCA0XSAtPiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtXzUgPSBnZW5lcmF0ZU1lZGlhSXRlbSg1KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgLy8gTW92ZSBjdXJyZW50OiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0gLT4gWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdIC0+IFswLCAxLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBpdGVtOiBbMCwgMSwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgcHJldmlvdXNJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBuZXh0IGl0ZW06IFswLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBuZXh0SXRlbSA9IHBsYXlsaXN0LmdldCgyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBpdGVtOiBbMCwgMiAoY3VyKSwgNF0gLT4gWzAsIDIgKGN1ciksIDVdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIE1vdmUgbGFzdCBhbmQgcmVtb3ZlIHRoZSBsYXN0IGl0ZW06IFswLCAyIChjdXIpLCA1XSAtPiBbMCwgMiwgNSAoY3VyKV0gLT4gWzAsIDIgKGN1cildCi0gICAgICAgIE1lZGlhSXRlbTIgbGFzdEl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSBwbGF5bGlzdC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdFdpdGhJbnZhbGlkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIEFkZCBpdGVtOiBbMCAoY3VyKSwgMV0gLT4gWzAgKGN1ciksIDMgKG5vX2RzZCksIDFdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0yID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIG5leHQgaXRlbTogIFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gcHJldmlvdXMgaXRlbTogWzAsIDIgKG5vX2RzZCksIDEgKGN1cildIC0+IFswIChjdXIpLCAyIChub19kc2QpLCAxXQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldCgwKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFsyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMiAobm9fZHNkKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgaXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgaW52YWxpZCBpdGVtOiBbMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0wID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMCk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCB2YWxpZCBpdGVtOiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDEsIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0xID0gZ2VuZXJhdGVNZWRpYUl0ZW0oMSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsaWQgaXRlbSB3aXRoIGFuIGludmFsaWQgaXRlbToKLSAgICAgICAgLy8gWzAgKG5vX2RzZCksIDEgKGN1ciksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAzIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMyA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDMpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0QWZ0ZXJPbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICB2ZXJpZnkobVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gY3JlYXRlQW5kU2V0UGxheWxpc3QoaW50IGxpc3RTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyArK2kpIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChnZW5lcmF0ZU1lZGlhSXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRQbGF5bGlzdChpdGVtcywgbnVsbCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQbGF5bGlzdEVxdWFscyhMaXN0PE1lZGlhSXRlbTI+IGV4cGVjdGVkLCBMaXN0PE1lZGlhSXRlbTI+IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0KGkpLmVxdWFscyhhY3R1YWwuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEX1dJVEhPVVRfRFNEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL09XTkVSUyBiL3BhY2thZ2VzL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNGNlZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWFrZXJzdGVuQGdvb2dsZS5jb20KLWR3a2FuZ0Bnb29nbGUuY29tCi1qYWV3YW5AZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCi1zdW5nc29vQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGQ1ZDAwZGEuLjY2YTRiY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsNCArMSw3IEBACitjaHpAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KIGdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWQ1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDczIEBACisKKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2ZsaW5nZXIiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9GbGluZ2VyLmNwcCIsCisgICAgICAgICJBdWRpb0h3RGV2aWNlLmNwcCIsCisgICAgICAgICJBdWRpb1N0cmVhbU91dC5jcHAiLAorICAgICAgICAiQXVkaW9XYXRjaGRvZy5jcHAiLAorICAgICAgICAiQnVmTG9nLmNwcCIsCisgICAgICAgICJFZmZlY3RzLmNwcCIsCisgICAgICAgICJGYXN0Q2FwdHVyZS5jcHAiLAorICAgICAgICAiRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RDYXB0dXJlU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RNaXhlci5jcHAiLAorICAgICAgICAiRmFzdE1peGVyRHVtcFN0YXRlLmNwcCIsCisgICAgICAgICJGYXN0TWl4ZXJTdGF0ZS5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZC5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZFN0YXRlLmNwcCIsCisgICAgICAgICJOQkFJT19UZWUuY3BwIiwKKyAgICAgICAgIlBhdGNoUGFuZWwuY3BwIiwKKyAgICAgICAgIlNwZGlmU3RyZWFtT3V0LmNwcCIsCisgICAgICAgICJTdGF0ZVF1ZXVlLmNwcCIsCisgICAgICAgICJUaHJlYWRzLmNwcCIsCisgICAgICAgICJUcmFja3MuY3BwIiwKKyAgICAgICAgIlR5cGVkTG9nZ2VyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYmF1ZGlvcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJhdWRpb3NwZGlmIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWFsb2dzZXJ2aWNlIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjcHVzdGF0cyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPVwiU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcFwiIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTllNjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCi0gICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKLSAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvSHdEZXZpY2UuY3BwICAgICAgICAgICBcCi0gICAgQXVkaW9TdHJlYW1PdXQuY3BwICAgICAgICAgIFwKLSAgICBTcGRpZlN0cmVhbU91dC5jcHAgICAgICAgICAgXAotICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCi0gICAgUGF0Y2hQYW5lbC5jcHAgICAgICAgICAgICAgIFwKLSAgICBTdGF0ZVF1ZXVlLmNwcCAgICAgICAgICAgICAgXAotICAgIEJ1ZkxvZy5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgVHlwZWRMb2dnZXIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2cgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvcHJvY2Vzc2luZyBcCi0gICAgbGliYXVkaW9zcGRpZiBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJtZWRpYWxvZ3NlcnZpY2UgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYm5iYWlvIFwKLSAgICBsaWJuYmxvZyBcCi0gICAgbGlicG93ZXJtYW5hZ2VyIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjcHVzdGF0cyBcCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEF1ZGlvV2F0Y2hkb2cuY3BwICAgICAgICBcCi0gICAgRmFzdENhcHR1cmUuY3BwICAgICAgICAgIFwKLSAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAgXAotICAgIEZhc3RDYXB0dXJlU3RhdGUuY3BwICAgICBcCi0gICAgRmFzdE1peGVyLmNwcCAgICAgICAgICAgIFwKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUuY3BwICAgXAotICAgIEZhc3RNaXhlclN0YXRlLmNwcCAgICAgICBcCi0gICAgRmFzdFRocmVhZC5jcHAgICAgICAgICAgIFwKLSAgICBGYXN0VGhyZWFkRHVtcFN0YXRlLmNwcCAgXAotICAgIEZhc3RUaHJlYWRTdGF0ZS5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGI4ODRjZjQuLmQzODE5MGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMywxMiArMjMsMTMgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC00NSw5ICs0NiwxMCBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogCkBAIC01Niw3ICs1OCw2IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCkBAIC02NCw4ICs2NSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAvLyNkZWZpbmUgQlVGTE9HX05ERUJVRyAwCkBAIC0xMDAsMTcgKzEwMSw2IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwogCi0KLSNpZmRlZiBURUVfU0lOSwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0VuYWJsZWQgPSBmYWxzZTsKLQotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEZyYW1lcyA9IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRGcmFtZXMgPSBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRnJhbWVzID0ga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQ7Ci0jZW5kaWYKLQogLy8gSW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIG9mZmxvYWRlZCB0cmFja3MgZWFjaCB0aW1lIGEgVmlzdWFsaXplciBpcyB0dXJuZWQgb24gYW5kIG9mZgogLy8gd2UgZGVmaW5lIGEgbWluaW11bSB0aW1lIGR1cmluZyB3aGljaCBhIGdsb2JhbCBlZmZlY3QgaXMgY29uc2lkZXJlZCBlbmFibGVkLgogc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pbkdsb2JhbEVmZmVjdEVuYWJsZXRpbWVOcyA9IHNlY29uZHMoNzIwMCk7CkBAIC0xMzQsNiArMTI0LDIxIEBACiAgICAgfQogfQogCisvLyBLZWVwIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBleHRlcm5hbCB2aWJyYXRvciBzZXJ2aWNlCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKSB7CisgICAgaWYgKHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9PSAwKSB7CisgICAgICAgIHNwIDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZSgKKyAgICAgICAgICAgIFN0cmluZzE2KCJleHRlcm5hbF92aWJyYXRvcl9zZXJ2aWNlIikpOworICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0ZDo6c3RyaW5nIGZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTYwLDYgKzE2NSw3IEBACiAgICAgICBtVG90YWxNZW1vcnkoMCksCiAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVBhdGNoUGFuZWwodGhpcyksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CiAgICAgLy8gdW5zaWduZWQgaW5zdGVhZCBvZiBhdWRpb191bmlxdWVfaWRfdXNlX3QsIGJlY2F1c2UgKysgb3BlcmF0b3IgaXMgdW5hdmFpbGFibGUgZm9yIGVudW0KQEAgLTE2OCw3ICsxNzQsNiBAQAogICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CiAgICAgfQogCi0gICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgZmFsc2UpOwogICAgIGlmIChkb0xvZykgewogICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLApAQCAtMTg1LDI3ICsxOTAsNiBAQAogICAgIG1FZmZlY3RzRmFjdG9yeUhhbCA9IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKTsKIAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwotICAgIGludCB0ZWVFbmFibGVkID0gMDsKLSAgICBpZiAoZGVidWdnYWJsZSkgewotICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwotICAgIH0KLSAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewotICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMikgewotICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKLSAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOwotICAgIH0KLSNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6b25GaXJzdFJlZigpCkBAIC0yMjYsOCArMjEwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7Ci0KICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogCiAgICAgZ0F1ZGlvRmxpbmdlciA9IHRoaXM7CkBAIC0yNDMsNiArMjI1LDE0IEBACiAgICAgICAgIC8vIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoKSB3aWxsIHJlbW92ZSBzcGVjaWZpZWQgZW50cnkgZnJvbSBtUGxheWJhY2tUaHJlYWRzCiAgICAgICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwobVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKSk7CiAgICAgfQorICAgIHdoaWxlICghbU1tYXBUaHJlYWRzLmlzRW1wdHkoKSkgeworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbyA9IG1NbWFwVGhyZWFkcy5rZXlBdCgwKTsKKyAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KDApLT5pc091dHB1dCgpKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKGlvKTsgLy8gcmVtb3ZlcyBlbnRyeSBmcm9tIG1NbWFwVGhyZWFkcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGlvKTsgIC8vIHJlbW92ZXMgZW50cnkgZnJvbSBtTW1hcFRocmVhZHMKKyAgICAgICAgfQorICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIG5vIG1IYXJkd2FyZUxvY2sgbmVlZGVkLCBhcyB0aGVyZSBhcmUgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byB0aGlzCkBAIC0zMDYsMjAgKzI5NiwyNiBAQAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBsb2NhbEF0dHIgPSAqYXR0cjsKICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKICAgICAgICAgYXVkaW9fY29uZmlnX3QgZnVsbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKICAgICAgICAgZnVsbENvbmZpZy5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CiAgICAgICAgIGZ1bGxDb25maWcuY2hhbm5lbF9tYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgICAgIGZ1bGxDb25maWcuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF0dHIsICZpbywKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CisKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgIEFMT0dXX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCisgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIiwgX19mdW5jX18pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoYXR0ciwgJmlvLAorICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNPUkRfUklJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsCkBAIC0zMzYsMTIgKzMzMiwxMiBAQAogICAgIHNwPE1tYXBUaHJlYWQ+IHRocmVhZCA9IG1NbWFwVGhyZWFkcy52YWx1ZUZvcihpbyk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIGludGVyZmFjZSA9IG5ldyBNbWFwVGhyZWFkSGFuZGxlKHRocmVhZCk7Ci0gICAgICAgIHRocmVhZC0+Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCwgY2FsbGJhY2ssICpkZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgdGhyZWFkLT5jb25maWd1cmUoJmxvY2FsQXR0ciwgc3RyZWFtVHlwZSwgYWN0dWFsU2Vzc2lvbklkLCBjYWxsYmFjaywgKmRldmljZUlkLCBwb3J0SWQpOwogICAgICAgICAqaGFuZGxlID0gcG9ydElkOwogICAgICAgICAqc2Vzc2lvbklkID0gYWN0dWFsU2Vzc2lvbklkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICB9CkBAIC0zNTMsNiArMzQ5LDI3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorLyogc3RhdGljICovCitpbnQgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBpbnQzMl90IHJldDsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gZXZzLT5vbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoKmV4dGVybmFsVmlicmF0aW9uLCAmcmV0KTsKKyAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFOworfQorCisvKiBzdGF0aWMgKi8KK3ZvaWQgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbikgeworICAgIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IGV2cyA9IGdldEV4dGVybmFsVmlicmF0b3JTZXJ2aWNlKCk7CisgICAgaWYgKGV2cyAhPSAwKSB7CisgICAgICAgIGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoKmV4dGVybmFsVmlicmF0aW9uKTsKKyAgICB9Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkaW9faW50ZXJmYWNlc1tdID0gewogICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZLAogICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLApAQCAtNDUzLDE1ICs0NzAsOCBAQAogCiBib29sIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2soTXV0ZXgmIG11dGV4KQogewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtdXRleC50aW1lZExvY2soa0R1bXBMb2NrVGltZW91dE5zKTsKKyAgICByZXR1cm4gZXJyID09IE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtNDc4LDcgKzQ4OCw3IEBACiAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKQEAgLTUzNCwxMiArNTQ0LDIyIEBACiAgICAgICAgICAgICBkZXYtPmR1bXAoZmQpOwogICAgICAgICB9CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAvLyBkdW1wIHRoZSBzZXJpYWxseSBzaGFyZWQgcmVjb3JkIHRlZSBzaW5rCi0gICAgICAgIGlmIChtUmVjb3JkVGVlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIGR1bXBUZWUoZmQsIG1SZWNvcmRUZWVTb3VyY2UsIEFVRElPX0lPX0hBTkRMRV9OT05FLCAnQycpOwotICAgICAgICB9Ci0jZW5kaWYKKyAgICAgICAgbVBhdGNoUGFuZWwuZHVtcChmZCk7CisKKyAgICAgICAgLy8gZHVtcCBleHRlcm5hbCBzZXRQYXJhbWV0ZXJzCisgICAgICAgIGF1dG8gZHVtcExvZ2dlciA9IFtmZF0oU2ltcGxlTG9nJiBsb2dnZXIsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzIHNldFBhcmFtZXRlcnM6XG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGxvZ2dlci5kdW1wKGZkLCAiICAgICIgLyogcHJlZml4ICovKTsKKyAgICAgICAgfTsKKyAgICAgICAgZHVtcExvZ2dlcihtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2csICJSZWplY3RlZCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1BcHBTZXRQYXJhbWV0ZXJMb2csICJBcHAiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtU3lzdGVtU2V0UGFyYW1ldGVyTG9nLCAiU3lzdGVtIik7CisKKyAgICAgICAgLy8gZHVtcCBoaXN0b3JpY2FsIHRocmVhZHMgaW4gdGhlIGxhc3QgMTAgc2Vjb25kcworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0aHJlYWRMb2cgPSBtVGhyZWFkTG9nLmR1bXBUb1N0cmluZygKKyAgICAgICAgICAgICAgICAiSGlzdG9yaWNhbCBUaHJlYWQgTG9nICIsIDAgLyogbGluZXMgKi8sCisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpIC0gMTAgKiA2MCAqIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICB3cml0ZShmZCwgdGhyZWFkTG9nLmNfc3RyKCksIHRocmVhZExvZy5zaXplKCkpOwogCiAgICAgICAgIEJVRkxPR19SRVNFVDsKIApAQCAtNTQ3LDYgKzU2NywxMCBAQAogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIE5CQUlPX1RlZSBkdW1wIGlzIHNhZmUgdG8gY2FsbCBvdXRzaWRlIG9mIEFGIGxvY2suCisgICAgICAgIE5CQUlPX1RlZTo6ZHVtcEFsbChmZCwgIl9EVU1QIik7CisjZW5kaWYKICAgICAgICAgLy8gYXBwZW5kIGEgY29weSBvZiBtZWRpYS5sb2cgaGVyZSBieSBmb3J3YXJkaW5nIGZkIHRvIGl0LCBidXQgZG9uJ3QgYXR0ZW1wdAogICAgICAgICAvLyB0byBsb29rdXAgdGhlIHNlcnZpY2UgaWYgaXQncyBub3QgcnVubmluZywgYXMgaXQgd2lsbCBibG9jayBmb3IgYSBzZWNvbmQKICAgICAgICAgaWYgKHNNZWRpYUxvZ1NlcnZpY2VBc0JpbmRlciAhPSAwKSB7CkBAIC02NjIsMTEgKzY4NiwxNiBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKIAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGVmZmVjdFRocmVhZElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBlZmZlY3RJZHM7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGxvY2FsQXR0ciA9IGlucHV0LmF0dHI7CisKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC02NzQsOCArNzAzLDggQEAKICAgICAgICAgdXBkYXRlUGlkID0gdHJ1ZTsKICAgICB9CiAgICAgcGlkX3QgY2xpZW50UGlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQ7CisgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAodXBkYXRlUGlkKSB7Ci0gICAgICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFBpZCAhPSAtMSAmJiBjbGllbnRQaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCiAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBjbGllbnRQaWQpOwpAQCAtNjkzLDEwICs3MjIsOSBAQAogICAgIG91dHB1dC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgb3V0cHV0Lm91dHB1dElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOwotCi0gICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZpbnB1dC5hdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAorICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgJmlucHV0LmNvbmZpZywgaW5wdXQuZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwogCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGdldE91dHB1dEZvckF0dHIoKSByZXR1cm4gZXJyb3IgJWQgb3IgaW52YWxpZCBvdXRwdXQgaGFuZGxlIiwgbFN0YXR1cyk7CkBAIC03NTUsMTggKzc4Myw4MSBAQAogICAgICAgICBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IGlucHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAgICAgICAgIG91dHB1dC5mbGFncyA9IGlucHV0LmZsYWdzOwogCi0gICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgaW5wdXQuYXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIGxvY2FsQXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LmZyYW1lQ291bnQsICZvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgaW5wdXQuc3BlZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCAmb3V0cHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwgY2xpZW50VWlkLCAmbFN0YXR1cywgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmICh0cmFjayA9PSAwKSk7CiAgICAgICAgIC8vIHdlIGRvbid0IGFib3J0IHlldCBpZiBsU3RhdHVzICE9IE5PX0VSUk9SOyB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgcmVnYXJkbGVzcwogCiAgICAgICAgIG91dHB1dC5hZkZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKTsKICAgICAgICAgb3V0cHV0LmFmU2FtcGxlUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogICAgICAgICBvdXRwdXQuYWZMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKKyAgICAgICAgb3V0cHV0LnBvcnRJZCA9IHBvcnRJZDsKKworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gQ29ubmVjdCBzZWNvbmRhcnkgb3V0cHV0cy4gRmFpbHVyZSBvbiBhIHNlY29uZGFyeSBvdXRwdXQgbXVzdCBub3QgaW1wZWQgdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIEFueSBzZWNvbmRhcnkgb3V0cHV0IHNldHVwIGZhaWx1cmUgd2lsbCBsZWFkIHRvIGEgZGVzeW5jIGJldHdlZW4gdGhlIEFQIGFuZCBBRiB1bnRpbAorICAgICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIFRlZVBhdGNoZXMgdGVlUGF0Y2hlczsKKyAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc2Vjb25kYXJ5T3V0cHV0IDogc2Vjb25kYXJ5T3V0cHV0cykgeworICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpzZWNvbmRhcnlUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc2Vjb25kYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igc2Vjb25kYXJ5IG91dHB1dCAlZCIsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gc3RkOjpsY20odGhyZWFkLT5mcmFtZUNvdW50KCksIHNlY29uZGFyeVRocmVhZC0+ZnJhbWVDb3VudCgpKTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAgICAgICAgICAgICBhdXRvIGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2spOworICAgICAgICAgICAgICAgIHNwIHBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQobnVsbHB0ciAvKiB0aHJlYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogYnVmZmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2Vjb25kYXJ5IG91dHB1dCBwYXRjaFJlY29yZCBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBjaGVjayBjb21wYXRpYmlsaXR5IG9mIHRoZSBzZWNvbmRhcnlUaHJlYWQgd2l0aCB0aGUgUGF0Y2hUcmFjaworICAgICAgICAgICAgICAgIC8vIGZvciBmYXN0IHVzYWdlOiB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIsIHNhbXBsZSByYXRlIG1hdGNoZXMsIGV0Yy47CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdywgd2UgZXhjbHVkZSBmYXN0IHRyYWNrcyBieSByZW1vdmluZyB0aGUgRmFzdCBmbGFnLgorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkob3V0cHV0LmZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgICAgICAgICAgICAgIHNwIHBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soc2Vjb25kYXJ5VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhdGNoVHJhY2stPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hUcmFjayBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVlUGF0Y2hlcy5wdXNoX2JhY2soe3BhdGNoUmVjb3JkLCBwYXRjaFRyYWNrfSk7CisgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoVHJhY2spOworICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIGRvd25zdHJlYW0gcGF0Y2hUcmFjayBvbiB0aGUgc2Vjb25kYXJ5VGhyZWFkIHRlbXBvcmFyaWx5IG91dGxpdmVzCisgICAgICAgICAgICAgICAgLy8gb3VyIGNyZWF0ZWQgdHJhY2ssIGVuc3VyZSB0aGUgY29ycmVzcG9uZGluZyBwYXRjaFJlY29yZCBpcyBzdGlsbCBhbGl2ZS4KKyAgICAgICAgICAgICAgICBwYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2hSZWNvcmQsIHRydWUgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaFRyYWNrLCBmYWxzZSAvKiBob2xkUmVmZXJlbmNlICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNrLT5zZXRUZWVQYXRjaGVzKHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKSk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCkBAIC03NzQsNyArODY1LDEwIEBACiAgICAgICAgICAgICAvLyBubyByaXNrIG9mIGRlYWRsb2NrIGJlY2F1c2UgQXVkaW9GbGluZ2VyOjptTG9jayBpcyBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQsIHRydWUpOworICAgICAgICAgICAgaWYgKG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkSWQgPSB0aHJlYWQtPmlkKCk7CisgICAgICAgICAgICAgICAgZWZmZWN0SWRzID0gdGhyZWFkLT5nZXRFZmZlY3RJZHNfbChzZXNzaW9uSWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gTG9vayBmb3Igc3luYyBldmVudHMgYXdhaXRpbmcgZm9yIGEgc2Vzc2lvbiB0byBiZSB1c2VkLgpAQCAtODA4LDEyICs5MDIsMTggQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIC8vIGVmZmVjdFRocmVhZElkIGlzIG5vdCBOT05FIGlmIGFuIGVmZmVjdCBjaGFpbiBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFjayBzZXNzaW9uCisgICAgLy8gd2FzIGZvdW5kIG9uIGFub3RoZXIgdGhyZWFkIGFuZCBtdXN0IGJlIG1vdmVkIG9uIHRoaXMgdGhyZWFkCisgICAgaWYgKGVmZmVjdFRocmVhZElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjptb3ZlRWZmZWN0c1RvSW8oZWZmZWN0SWRzLCBlZmZlY3RUaHJlYWRJZCk7CisgICAgfQorCiAgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwpAQCAtOTE3LDYgKzEwMTcsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIHN0YXR1c190IHJldCA9IGluaXRDaGVjaygpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgcmFuZ2UKKyAgICBpZiAoaXNuYW4oYmFsYW5jZSkgfHwgZmFicyhiYWxhbmNlKSA+IDEuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBzaG9ydCBjdXQuCisgICAgaWYgKG1NYXN0ZXJCYWxhbmNlID09IGJhbGFuY2UpIHJldHVybiBOT19FUlJPUjsKKworICAgIG1NYXN0ZXJCYWxhbmNlID0gYmFsYW5jZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKICAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKQEAgLTEwNTYsNiArMTE5MCwxMyBAQAogICAgIHJldHVybiBtYXN0ZXJWb2x1bWVfbCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqYmFsYW5jZSA9IGdldE1hc3RlckJhbGFuY2VfbCgpOworICAgIHJldHVybiBOT19FUlJPUjsgLy8gaWYgY2FsbGVkIHRocm91Z2ggYmluZGVyLCBtYXkgcmV0dXJuIGEgdHJhbnNhY3Rpb25hbCBlcnJvcgorfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZSgpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEwNjcsNiArMTIwOCwxMSBAQAogICAgIHJldHVybiBtTWFzdGVyVm9sdW1lOwogfQogCitmbG9hdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1NYXN0ZXJCYWxhbmNlOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZV9sKCkgY29uc3QKIHsKICAgICByZXR1cm4gbU1hc3Rlck11dGU7CkBAIC0xMDc4LDkgKzEyMjQsOSBAQAogICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgaW52YWxpZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgY2FsbGVyICE9IGdldHBpZF9jYWNoZWQpIHsKLSAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHBpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyLCBzdHJlYW0pOworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiAhaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7CisgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSB1aWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlclVpZCwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTEwMiw3ICsxMjQ4LDggQEAKICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsICJhdHRlbXB0IHRvIGNoYW5nZSBBVURJT19TVFJFQU1fUEFUQ0ggdm9sdW1lIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1BBVENIICYmIHZhbHVlICE9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAiQVVESU9fU1RSRUFNX1BBVENIIG11c3QgaGF2ZSBmdWxsIHNjYWxlIHZvbHVtZSIpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIFZvbHVtZUludGVyZmFjZSAqdm9sdW1lSW50ZXJmYWNlID0gZ2V0Vm9sdW1lSW50ZXJmYWNlX2wob3V0cHV0KTsKQEAgLTExODAsNiArMTMyNywyMyBAQAogICAgIH0KIH0KIAorLy8gZm9yd2FyZEF1ZGlvSHdTeW5jVG9Eb3duc3RyZWFtUGF0Y2hlc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mKT4gdXNlVGhyZWFkKQoreworICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICBpZiAobVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyh1cFN0cmVhbSwgJnN3UGF0Y2hlcykgIT0gT0spIHJldHVybjsKKyAgICBBTE9HVl9JRighc3dQYXRjaGVzLmVtcHR5KCksICIlcyBmb3VuZCAlenUgZG93bnN0cmVhbSBwYXRjaGVzIGZvciBzdHJlYW0gSUQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHN3UGF0Y2hlcy5zaXplKCksIHVwU3RyZWFtKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN3UGF0Y2ggOiBzd1BhdGNoZXMpIHsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGRvd25TdHJlYW0gPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc3dQYXRjaC5nZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpKTsKKyAgICAgICAgaWYgKGRvd25TdHJlYW0gIT0gTlVMTCAmJiAodXNlVGhyZWFkID09IG51bGxwdHIgfHwgdXNlVGhyZWFkKGRvd25TdHJlYW0pKSkgeworICAgICAgICAgICAgZG93blN0cmVhbS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gRmlsdGVyIHJlc2VydmVkIGtleXMgZnJvbSBzZXRQYXJhbWV0ZXJzKCkgYmVmb3JlIGZvcndhcmRpbmcgdG8gYXVkaW8gSEFMIG9yIGFjdGluZyB1cG9uLgogLy8gU29tZSBrZXlzIGFyZSB1c2VkIGZvciBhdWRpbyByb3V0aW5nIGFuZCBhdWRpbyBwYXRoIGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdXNlCiAvLyBieSBhdWRpbyBwb2xpY3kgYW5kIGF1ZGlvIGZsaW5nZXIgZm9yIGZ1bmN0aW9uYWwsIHByaXZhY3kgYW5kIHNlY3VyaXR5IHJlYXNvbnMuCkBAIC0xMjAwLDIzICsxMzY0LDM5IEBACiAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLAogICAgIH07CiAKLSAgICAvLyBtdWx0aXVzZXIgZnJpZW5kbHkgYXBwIElEIGNoZWNrIGZvciByZXF1ZXN0cyBjb21pbmcgZnJvbSBhdWRpb3NlcnZlcgotICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChjYWxsaW5nVWlkKSA9PSBBSURfQVVESU9TRVJWRVIpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byBmaWx0ZXIgaWYgYXVkaW9zZXJ2ZXIuCiAgICAgfQogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKICAgICBTdHJpbmc4IHZhbHVlOworICAgIEF1ZGlvUGFyYW1ldGVyIHJlamVjdGVkUGFyYW07CiAgICAgZm9yIChhdXRvJiBrZXkgOiBrUmVzZXJ2ZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmlsdGVyaW5nIGtleSAlcyB2YWx1ZSAlcyBmcm9tIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSwgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICByZWplY3RlZFBhcmFtLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwogICAgICAgICB9CiAgICAgfQorICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhwYXJhbS5zaXplKCkgKyByZWplY3RlZFBhcmFtLnNpemUoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5zaXplKCksIHJlamVjdGVkUGFyYW0udG9TdHJpbmcoKSwgY2FsbGluZ1VpZCk7CiAgICAga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpIHsKKyAgICBhdXRvIHByZWZpeCA9IFN0cmluZzg6OmZvcm1hdCgiVUlEICU1ZCIsIGNhbGxpbmdVaWQpOworICAgIGF1dG8gc3VmZml4ID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlY2VpdmVkOiAlcyIsIG9yaWdpbmFsS1ZQU2l6ZSwgb3JpZ2luYWxLVlBzLmNfc3RyKCkpOworICAgIGlmIChyZWplY3RlZEtWUFNpemUgIT0gMCkgeworICAgICAgICBhdXRvIGVycm9yID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlamVjdGVkOiAlcyIsIHJlamVjdGVkS1ZQU2l6ZSwgcmVqZWN0ZWRLVlBzLmNfc3RyKCkpOworICAgICAgICBBTE9HVygiJXM6ICVzLCAlcywgJXMiLCBfX2Z1bmNfXywgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICAgICAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLmxvZygiJXMsICVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byYgbG9nZ2VyID0gKGlzU2VydmljZVVpZChjYWxsaW5nVWlkKSA/IG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2cgOiBtQXBwU2V0UGFyYW1ldGVyTG9nKTsKKyAgICAgICAgbG9nZ2VyLmxvZygiJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIGNhbGxpbmcgdWlkICVkIiwKQEAgLTEyOTYsNyArMTQ3Niw5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwgZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KQEAgLTE0NzIsMzAgKzE2NTQsMzYgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGQ6OnZlY3Rvcjwgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+ID4gcmVtb3ZlZEVmZmVjdHM7CiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOwotICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgICAgIH0KIAotICAgIEFMT0dWKCIlZCBkaWVkLCByZWxlYXNpbmcgaXRzIHNlc3Npb25zIiwgcGlkKTsKLSAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwotICAgIGJvb2wgcmVtb3ZlZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7Ci0gICAgICAgIEFMT0dWKCIgcGlkICVkIEAgJXp1IiwgcmVmLT5tUGlkLCBpKTsKLSAgICAgICAgaWYgKHJlZi0+bVBpZCA9PSBwaWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCIgcmVtb3ZpbmcgZW50cnkgZm9yIHBpZCAlZCBzZXNzaW9uICVkIiwgcGlkLCByZWYtPm1TZXNzaW9uaWQpOwotICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvblJlZnMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBkZWxldGUgcmVmOwotICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICBudW0tLTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGkrKzsKKyAgICAgICAgQUxPR1YoIiVkIGRpZWQsIHJlbGVhc2luZyBpdHMgc2Vzc2lvbnMiLCBwaWQpOworICAgICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOworICAgICAgICBib29sIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICkgeworICAgICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7CisgICAgICAgICAgICBBTE9HVigiIHBpZCAlZCBAICV6dSIsIHJlZi0+bVBpZCwgaSk7CisgICAgICAgICAgICBpZiAocmVmLT5tUGlkID09IHBpZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIgcmVtb3ZpbmcgZW50cnkgZm9yIHBpZCAlZCBzZXNzaW9uICVkIiwgcGlkLCByZWYtPm1TZXNzaW9uaWQpOworICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25SZWZzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZWY7CisgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbnVtLS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVtb3ZlZCkgeworICAgICAgICAgICAgcmVtb3ZlZEVmZmVjdHMgPSBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJlbW92ZWQpIHsKLSAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOworICAgIGZvciAoYXV0byYgZWZmZWN0IDogcmVtb3ZlZEVmZmVjdHMpIHsKKyAgICAgICAgZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOwogICAgIH0KIH0KIApAQCAtMTUyMSwxOCArMTcwOSwzNSBAQAogfQogCiAvLyBnZXRFZmZlY3RUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi1zcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkPiBBdWRpb0ZsaW5nZXI6OmdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgIGludCBFZmZlY3RJZCkKK3NwPEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZT4gQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQgZWZmZWN0SWQpCiB7Ci0gICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZDsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQ7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgRWZmZWN0SWQpICE9IDApIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgZWZmZWN0SWQpICE9IDApIHsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZCA9PSAwKTsKICAgICAgICAgICAgIHRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5nZXRFZmZlY3Qoc2Vzc2lvbklkLCBlZmZlY3RJZCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkID09IDApOworICAgICAgICAgICAgdGhyZWFkID0gbVJlY29yZFRocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLT5nZXRFZmZlY3Qoc2Vzc2lvbklkLCBlZmZlY3RJZCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkID09IDApOworICAgICAgICAgICAgdGhyZWFkID0gbU1tYXBUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIHRocmVhZDsKIH0KIApAQCAtMTYzNiw3ICsxODQxLDcgQEAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC0xNjQ0LDggKzE4NDksOCBAQAogICAgICAgICB1cGRhdGVQaWQgPSB0cnVlOwogICAgIH0KICAgICBwaWRfdCBjbGllbnRQaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZDsKKyAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmICh1cGRhdGVQaWQpIHsKLSAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50UGlkICE9IC0xICYmIGNsaWVudFBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudFBpZCk7CkBAIC0xNjk0LDYgKzE4OTksNyBAQAogICAgICAgICBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmaW5wdXQuYXR0ciwgJm91dHB1dC5pbnB1dElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvVHJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLApAQCAtMTcwMSwxMiArMTkwNywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5vcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQuY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MsICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCgpIGdldElucHV0Rm9yQXR0ciByZXR1cm4gZXJyb3IgJWQiLCBsU3RhdHVzKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKG91dHB1dC5pbnB1dElkKTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCwgaW5wdXQgaGFuZGxlICVkIiwgb3V0cHV0LmlucHV0SWQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtMTcyMSw3ICsxOTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5mcmFtZUNvdW50LCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCAmb3V0cHV0LmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBjbGllbnRVaWQsICZvdXRwdXQuZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5vcFBhY2thZ2VOYW1lKTsKQEAgLTE3NTIsNiArMTk2Miw3IEBACiAKICAgICBvdXRwdXQuY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CiAgICAgb3V0cHV0LmJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKICAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwpAQCAtMTg1NSw2ICsyMDY2LDEwIEBACiAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIE1TRCBtb2R1bGUgaXMgaW5zZXJ0ZWQgYmVmb3JlIGhhcmR3YXJlIG1vZHVsZXMgaW4gb3JkZXIgdG8gbWl4IGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxBdWRpb0h3RGV2aWNlOjpGbGFncz4oZmxhZ3MgfCBBdWRpb0h3RGV2aWNlOjpBSFdEX0lTX0lOU0VSVCk7CisgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpIG5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX01PRFVMRSk7CiAgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwpAQCAtMTg4Niw3ICsyMTAxLDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTkzMSw2ICsyMTQ2LDI4IEBACiAgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoX19mdW5jX18pOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKIGF1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTc2LDcgKzIyMTMsMTAgQEAKICAgICAgICAgaWYgKHNlc3Npb25zICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgdmFsdWUpOwotICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDIyLDcgKzIyNjIsMTAgQEAKICAgICAgICAgQUxPR1YoInNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sIGZvdW5kIElEICVkIGZvciBzZXNzaW9uICVkIiwgc3luY0lkLCBzZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHN5bmNJZCk7Ci0gICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgIH0KIH0KIApAQCAtMjExMiw2ICsyMzU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9CiAgICAgfQpAQCAtMjIxMCw2ICsyNDU0LDggQEAKICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkICE9IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocGxheWJhY2tUaHJlYWQpOworCiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUikgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIyMzIsNyArMjQ3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zID0gcGxheWJhY2tUaHJlYWQtPmdldEVmZmVjdENoYWluc19sKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUVmZmVjdENoYWluX2woZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSwgcGxheWJhY2tUaHJlYWQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRocmVhZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRocmVhZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMjQxLDEyICsyNDg3LDE0IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICAgICAgICAgIEFMT0dEKCJjbG9zaW5nIG1tYXBUaHJlYWQgJXAiLCBtbWFwVGhyZWFkLmdldCgpKTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwogICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtQ2xvc2VkKG91dHB1dCk7CiAgICAgfQogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCiAgICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCkBAIC0yMjc1LDcgKzI1MjMsNyBAQAogICAgIGRlbGV0ZSBvdXQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgdGhyZWFkLT5leGl0KCk7CkBAIC0yMzI3LDcgKzI1NzUsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKAorICAgICAgICAgICAgbW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncywgQVVESU9fREVWSUNFX05PTkUsIFN0cmluZzh7fSk7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgpAQCAtMjM0Myw3ICsyNTkyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG91dHB1dERldmljZUFkZHJlc3MpCiB7CiAgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2VzKTsKICAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CkBAIC0yMzUxLDYgKzI2MDIsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvLyBTb21lIGZsYWdzIGFyZSBzcGVjaWZpYyB0byBmcmFtZXdvcmsgYW5kIG11c3Qgbm90IGxlYWsgdG8gdGhlIEhBTC4KKyAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGZsYWdzICYgfkFVRElPX0lOUFVUX0ZSQU1FV09SS19GTEFHUyk7CisKICAgICAvLyBBdWRpbyBQb2xpY3kgY2FuIHJlcXVlc3QgYSBzcGVjaWZpYyBoYW5kbGUgZm9yIGhhcmR3YXJlIGhvdHdvcmQuCiAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyBub3QgdG8gcmUtb3BlbiBhbiBhbHJlYWR5IG9wZW5lZCBpbnB1dC4KICAgICAvLyBJdCBpcyB0byB1c2UgYSBwcmUtYXNzaWduZWQgSS9PIGhhbmRsZS4KQEAgLTIzNjksNyArMjYyMyw4IEBACiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBpbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOworICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAlI3gsIFNhbXBsaW5nUmF0ZSAlZCIKICAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCBhZGRyICVzIiwKICAgICAgICAgICAgIGluU3RyZWFtLmdldCgpLApAQCAtMjM5Miw3ICsyNjQ3LDggQEAKICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmluU3RyZWFtKTsKICAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQogCkBAIC0yNDA4LDU1ICsyNjY0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwpAQCAtMjQ2Niw5ICsyNjczLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CkBAIC0yNDk3LDYgKzI3MDEsOCBAQAogICAgICAgICBpZiAocmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHJlY29yZFRocmVhZCk7CisKICAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQogICAgICAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCiAgICAgICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKQEAgLTI1MzksNiArMjc0NSw3IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKQEAgLTI1NjgsNyArMjc3NSw3IEBACiAgICAgZGVsZXRlIGluOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOwpAQCAtMjYwNiw3ICsyODEzLDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAKQEAgLTI2MzcsMjkgKzI4NDUsNDAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgewotICAgICAgICBjYWxsZXIgPSBwaWQ7Ci0gICAgfQotICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07IGkrKykgewotICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnJlZiA9IG1BdWRpb1Nlc3Npb25SZWZzLml0ZW1BdChpKTsKLSAgICAgICAgaWYgKHJlZi0+bVNlc3Npb25pZCA9PSBhdWRpb1Nlc3Npb24gJiYgcmVmLT5tUGlkID09IGNhbGxlcikgewotICAgICAgICAgICAgcmVmLT5tQ250LS07Ci0gICAgICAgICAgICBBTE9HVigiIGRlY3JlbWVudGVkIHJlZmNvdW50IHRvICVkIiwgcmVmLT5tQ250KTsKLSAgICAgICAgICAgIGlmIChyZWYtPm1DbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25SZWZzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSByZWY7Ci0gICAgICAgICAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOworICAgIHN0ZDo6dmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gcmVtb3ZlZEVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKKyAgICAgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIGFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpCisgICAgICAgICAgICBjYWxsZXIgPSBwaWQ7CiAgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAocmVmLT5tU2Vzc2lvbmlkID09IGF1ZGlvU2Vzc2lvbiAmJiByZWYtPm1QaWQgPT0gY2FsbGVyKSB7CisgICAgICAgICAgICAgICAgcmVmLT5tQ250LS07CisgICAgICAgICAgICAgICAgQUxPR1YoIiBkZWNyZW1lbnRlZCByZWZjb3VudCB0byAlZCIsIHJlZi0+bUNudCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZi0+bUNudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25SZWZzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVmOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IGVmZmVjdHMgPSBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRFZmZlY3RzLmluc2VydChyZW1vdmVkRWZmZWN0cy5lbmQoKSwgZWZmZWN0cy5iZWdpbigpLCBlZmZlY3RzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgYXVkaW9zZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCisgICAgICAgIC8vIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3Mgbm90IGluIG5vdGlmaWNhdGlvbiBjbGllbnRzIGFuZCB3ZSBpZ25vcmUgdGhlIHdhcm5pbmcuCisgICAgICAgIEFMT0dXX0lGKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCksCisgICAgICAgICAgICAgICAgICJzZXNzaW9uIGlkICVkIG5vdCBmb3VuZCBmb3IgcGlkICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOwogICAgIH0KLSAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIG1lZGlhc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAotICAgIC8vIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3Mgbm90IGluIG5vdGlmaWNhdGlvbiBjbGllbnRzIGFuZCB3ZSBpZ25vcmUgdGhlIHdhcm5pbmcuCi0gICAgQUxPR1dfSUYoY2FsbGVyICE9IGdldHBpZF9jYWNoZWQsICJzZXNzaW9uIGlkICVkIG5vdCBmb3VuZCBmb3IgcGlkICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworCitFeGl0OgorICAgIGZvciAoYXV0byYgZWZmZWN0IDogcmVtb3ZlZEVmZmVjdHMpIHsKKyAgICAgICAgZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOworICAgIH0KIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OmlzU2Vzc2lvbkFjcXVpcmVkX2woYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbikKQEAgLTI2NzQsMTEgKzI4OTMsMTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpwdXJnZVN0YWxlRWZmZWN0c19sKCkgeworc3RkOjp2ZWN0b3I8c3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+PiBBdWRpb0ZsaW5nZXI6OnB1cmdlU3RhbGVFZmZlY3RzX2woKSB7CiAKICAgICBBTE9HVigicHVyZ2luZyBzdGFsZSBlZmZlY3RzIik7CiAKICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGNoYWluczsKKyAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWRFZmZlY3RzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0ID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOwpAQCAtMjY5MCw2ICsyOTEwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0ID0gbVJlY29yZFRocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKQEAgLTI2OTksNiArMjkyMCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8TW1hcFRocmVhZD4gdCA9IG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHQtPm1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBlYyA9IHQtPm1FZmZlY3RDaGFpbnNbal07CisgICAgICAgICAgICBjaGFpbnMucHVzaChlYyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSBjaGFpbnNbaV07CiAgICAgICAgIGludCBzZXNzaW9uaWQgPSBlYy0+c2Vzc2lvbklkKCk7CkBAIC0yNzI3LDExICsyOTU3LDIyIEBACiAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdC0+cHVyZ2VIYW5kbGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkX2woZWZmZWN0LCBmYWxzZSwgZWZmZWN0LT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlZEVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuOworICAgIHJldHVybiByZW1vdmVkRWZmZWN0czsKK30KKworLy8gZHVtcFRvVGhyZWFkTG9nX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpCit7CisgICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZzsKKyAgICBjb25zdCBpbnQgZmQgPSBmZFRvU3RyaW5nLmZkKCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgdGhyZWFkLT5kdW1wKGZkLCB7fSAvKiBhcmdzICovKTsKKyAgICAgICAgbVRocmVhZExvZy5sb2dzKC0xIC8qIHRpbWUgKi8sIGZkVG9TdHJpbmcuZ2V0U3RyaW5nQW5kQ2xvc2UoKSk7CisgICAgfQogfQogCiAvLyBjaGVja1RocmVhZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKQEAgLTI5MzksMTYgKzMxODAsNzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAogeworICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlVXVpZCA9PSBOVUxMIHx8IGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewotICAgICAgICByZXR1cm4gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgeworCisgICAgaWYgKCFtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQotfQogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGF0LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBUeXBlVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW5zdGVhZC4KKworICAgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgZGVzY3JpcHRvciB0byBhdm9pZCBtb2RpZnlpbmcgfGRlc2NyaXB0b3J8IGluIHRoZSBmYWlsdXJlIGNhc2UuCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZworCisgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsIHBUeXBlVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqZGVzY3JpcHRvciA9IGRlc2M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZWZlcnJlZCBmbGFnIG9yIHRoaXMgZGVzY3JpcHRvciBtYXRjaGVzIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBzdWNjZXNzISBJZiB0aGlzIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZSBhIGJldHRlciBtYXRjaGluZyB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGlmIG5vIGVmZmVjdCB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGZsYWcgaXMgZm91bmQsIHRoZSBkZXNjcmlwdG9yIHJldHVybmVkIHdpbGwgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGVmZmVjdCB0aGF0IGF0IGxlYXN0IGhhZCBhIG1hdGNoaW5nIHR5cGUgdXVpZCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkVHlwZUZsYWcgPT0gRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBwcmVmZXJyZWRUeXBlRmxhZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVmZmVjdCBub3QgZm91bmQgYnkgdHlwZS4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWl0aGVyIHV1aWQgb3IgdHlwZSB1dWlkIG11c3QgYmUgbm9uLW51bGwgVVVJRHMuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CiAKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTI5NjcsNyArMzI2Niw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKQEAgLTI5ODMsODQgKzMyODIsNTUgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYgIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8vIFNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgcmVzZXJ2ZWQgZm9yIG91dHB1dCBzdGFnZSBlZmZlY3RzCi0gICAgLy8gdGhhdCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIChydW5uaW5nIGluIHNhbWUgcHJvY2VzcykKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmIGdldHBpZF9jYWNoZWQgIT0gcGlkKSB7Ci0gICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQogICAgIGlmIChtRWZmZWN0c0ZhY3RvcnlIYWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGVmZmVjdHMgZmFjdG9yeSBoYWwiLCBfX2Z1bmNfXyk7CiAgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT51dWlkKSkgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RHZXREZXNjcmlwdG9yIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluIGVmZmVjdCBmYWN0b3J5Ci0gICAgICAgICAgICBpZiAoRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT50eXBlKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBubyBlZmZlY3QgdHlwZSIpOwotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQ7Ci0gICAgICAgICAgICBkLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCi0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5RWZmZWN0IiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsICZwRGVzYy0+dHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4gSWYgdGhlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gMCBhbmQgdGhlIGVmZmVjdCBpcyBub3QgYXV4aWxpYXJ5LCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgotICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZDsKLSAgICAgICAgICAgIH0KKyAgICAvLyBjaGVjayBhdWRpbyBzZXR0aW5ncyBwZXJtaXNzaW9uIGZvciBnbG9iYWwgZWZmZWN0cworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gcGVybWlzc2lvbiBmb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIiwgX19mdW5jX18pOworICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKKyAgICAgICAgaWYgKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG9ubHkgQVBNIGNhbiBjcmVhdGUgdXNpbmcgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQVBNIG11c3Qgc3BlY2lmeSBvdXRwdXQgd2hlbiB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZW5lcmFsIHNlc3Npb25JZC4KKworICAgICAgICBpZiAoYXVkaW9fdW5pcXVlX2lkX2dldF91c2Uoc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgaWYgdGhlIGNhbGxpbmdVaWQgKGxpbWl0ZWQgdG8gcGlkKSBpcyBpbiBtQXVkaW9TZXNzaW9uUmVmcworICAgICAgICAvLyB0byBwcmV2ZW50IGNyZWF0aW5nIGFuIGVmZmVjdCB3aGVuIG9uZSBkb2Vzbid0IGFjdHVhbGx5IGhhdmUgdHJhY2sgd2l0aCB0aGF0IHNlc3Npb24/CiAgICAgfQorCiAgICAgeworICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGUgdXVpZC90eXBlLgorICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBpcyB0aGUgb3V0cHV0IG1peCwgcHJlZmVyIGFuIGF1eGlsaWFyeSBlZmZlY3QsCisgICAgICAgIC8vIG90aGVyd2lzZSBubyBwcmVmZXJlbmNlLgorICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlID0gKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIDogRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKTsKKyAgICAgICAgbFN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmcERlc2MtPnR5cGUsIHByZWZlcnJlZFR5cGUsICZkZXNjKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBnZXRFZmZlY3REZXNjcmlwdG9yIiwgbFN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KIAogICAgICAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdHMgb24gYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9tIDAgKG91dHB1dCBtaXgpCiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCkBAIC0zMDkzLDQxICszMzYzLDM2IEBACiAgICAgICAgIC8vIG91dHB1dCB0aHJlYWRzLgogICAgICAgICAvLyBJZiBvdXRwdXQgaXMgMCBoZXJlLCBzZXNzaW9uSWQgaXMgbmVpdGhlciBTRVNTSU9OX09VVFBVVF9TVEFHRSBub3IgU0VTU0lPTl9PVVRQVVRfTUlYCiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCi0gICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKKyAgICAgICAgLy8gTm90ZTogaW8gaXMgbmV2ZXIgQVVESU9fSU9fSEFORExFX05PTkUgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQgYnkgQVBNLgorICAgICAgICAvLyBBbiBBdWRpb0VmZmVjdCBjcmVhdGVkIGZyb20gdGhlIEphdmEgQVBJIHdpbGwgaGF2ZSBpbyBhcyBBVURJT19JT19IQU5ETEVfTk9ORS4KICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KLSAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CisgICAgICAgICAgICBpbyA9IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woc2Vzc2lvbklkLCBtUGxheWJhY2tUaHJlYWRzKTsKKyAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1SZWNvcmRUaHJlYWRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1NbWFwVGhyZWFkcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHlvdSB3aXNoIHRvIGNyZWF0ZSBhIFJlY29yZCBwcmVwcm9jZXNzaW5nIEF1ZGlvRWZmZWN0IGluIEphdmEsCisgICAgICAgICAgICAvLyB5b3UgTVVTVCBjcmVhdGUgYW4gQXVkaW9SZWNvcmQgZmlyc3QgYW5kIGtlZXAgaXQgYWxpdmUgc28gaXQgaXMgcGlja2VkIHVwIGFib3ZlLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCB3aGVuIGNyZWF0ZWQgb24gYSBQbGF5YmFjayB0aHJlYWQgYnkgbGVnYWN5CisgICAgICAgICAgICAvLyBoYW5kbGluZyBiZWxvdy4gIERpdHRvIHdpdGggTW1hcCwgdGhlIGFzc29jaWF0ZWQgTW1hcCB0cmFjayBtdXN0IGJlIGNyZWF0ZWQKKyAgICAgICAgICAgIC8vIGJlZm9yZSBjcmVhdGluZyB0aGUgQXVkaW9FZmZlY3Qgb3IgdGhlIGlvIGhhbmRsZSBtdXN0IGJlIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIGVmZmVjdCBpcyBjcmVhdGVkIGFmdGVyIGFuIEF1ZGlvUmVjb3JkIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIGlmIChnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZWZmZWN0ICVzIHdpdGggbm8gc3BlY2lmaWVkIGlvIGhhbmRsZSBpcyBkZW5pZWQgYmVjYXVzZSB0aGUgQXVkaW9SZWNvcmQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBzZXNzaW9uICVkIG5vIGxvbmdlciBleGlzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0aHJlYWQgd2hlcmUgdGhlIHNwZWNpZmllZCBhdWRpbyBzZXNzaW9uIGlzIHByZXNlbnQKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25UeXBlID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblR5cGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB3aXRoIHNhbWUgZWZmZWN0IHNlc3Npb24gaXMgcHJlZmVyYWJsZQotICAgICAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25UeXBlICYgVGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW8gPSBtUmVjb3JkVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbyA9IG1NbWFwVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMZWdhY3kgaGFuZGxpbmcgb2YgY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGV4cGlyZWQgb3IgbWFkZS11cAorICAgICAgICAgICAgLy8gc2Vzc2lvbiBpZC4gIFdlIHRoaW5rIHRoYXQgaXQgaXMgYSBQbGF5YmFjayBlZmZlY3QuCisgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gSWYgbm8gb3V0cHV0IHRocmVhZCBjb250YWlucyB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQsIGRlZmF1bHQgdG8KICAgICAgICAgICAgIC8vIGZpcnN0IG91dHB1dC4gVGhlIGVmZmVjdCBjaGFpbiB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjb3JyZWN0IG91dHB1dAogICAgICAgICAgICAgLy8gdGhyZWFkIHdoZW4gYSB0cmFjayB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgY3JlYXRlZApAQCAtMzE4OCw4ICszNDUzLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBsU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgIC8vIGhhbmRsZSBtdXN0IGJlIGNsZWFyZWQgb3V0c2lkZSBsb2NrLgorICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SIHx8IGxTdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBoYW5kbGUtPmVmZmVjdCgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGVmZmVjdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByU3RhdHVzID0gZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOworICAgICAgICAgICAgaWYgKHJTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gclN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KIApAQCAtMzIyMSwxNCArMzQ5NCwzMCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChkc3RUaHJlYWQtPm1Mb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNyY1RocmVhZC0+bUxvY2spOwotICAgIHJldHVybiBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIHNyY1RocmVhZCwgZHN0VGhyZWFkLCBmYWxzZSk7CisgICAgcmV0dXJuIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQpOwogfQogCisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gZ2V0RWZmZWN0VGhyZWFkX2woc2Vzc2lvbklkLCBlZmZlY3RJZCk7CisgICAgaWYgKHRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfc2wodGhyZWFkLT5tTG9jayk7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSB0aHJlYWQtPmdldEVmZmVjdF9sKHNlc3Npb25JZCwgZWZmZWN0SWQpOworICAgIHRocmVhZC0+c2V0RWZmZWN0U3VzcGVuZGVkX2woJmVmZmVjdC0+ZGVzYygpLnR5cGUsIHN1c3BlbmRlZCwgc2Vzc2lvbklkKTsKK30KKworCiAvLyBtb3ZlRWZmZWN0Q2hhaW5fbCBtdXN0IGJlIGNhbGxlZCB3aXRoIGJvdGggc3JjVGhyZWFkIGFuZCBkc3RUaHJlYWQgbUxvY2tzIGhlbGQKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUVmZmVjdENoYWluX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqc3JjVGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkKQogewogICAgIEFMT0dWKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIHNlc3Npb24gJWQgZnJvbSB0aHJlYWQgJXAgdG8gdGhyZWFkICVwIiwKICAgICAgICAgICAgIHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQpOwpAQCAtMzI4NCwzNiArMzU3Myw2OCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RyYXRlZ3kgPSBkc3RDaGFpbi0+c3RyYXRlZ3koKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmVSZWdpc3RlcikgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgmZWZmZWN0LT5kZXNjKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VGhyZWFkLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPmlkKCkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQoZWZmZWN0LT5pZCgpLCBlZmZlY3QtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgfQogICAgICAgICBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woMCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2wocmVtb3ZlZFtpXSk7Ci0gICAgICAgICAgICBpZiAoZHN0Q2hhaW4gIT0gMCAmJiByZVJlZ2lzdGVyKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QocmVtb3ZlZFtpXS0+aWQoKSk7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KCZyZW1vdmVkW2ldLT5kZXNjKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFtpXS0+aWQoKSk7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQoZWZmZWN0LT5pZCgpLCBlZmZlY3QtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUF1eEVmZmVjdFRvSW8oaW50IEVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIGRzdFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICpzcmNUaHJlYWQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4oZ2V0RWZmZWN0VGhyZWFkX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBFZmZlY3RJZCkuZ2V0KCkpOworCisgICAgaWYgKEVmZmVjdElkICE9IDAgJiYgdGhyZWFkICE9IDAgJiYgZHN0VGhyZWFkICE9IHRocmVhZC5nZXQoKSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKGRzdFRocmVhZC0+bUxvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gc3JjQ2hhaW4gPSB0aHJlYWQtPmdldEVmZmVjdENoYWluX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluOworICAgICAgICBpZiAoc3JjQ2hhaW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBzcmNDaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woRWZmZWN0SWQpOworICAgICAgICBpZiAoZWZmZWN0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIHN0YXR1cyA9IGRzdFRocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgdGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Y2hhaW4oKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCitFeGl0OgorICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAorICAgICAgICBpZiAoZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6QUNUSVZFIHx8CisgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgeworICAgICAgICAgICAgZWZmZWN0LT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzcmNUaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAqc3JjVGhyZWFkID0gdGhyZWFkOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6aXNOb25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZWRfbCgpCiB7CiAgICAgaWYgKG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lICE9IDAgJiYKQEAgLTMzOTQsMTM2ICszNzE1LDYgQEAKIH0KIAogCi1zdHJ1Y3QgRW50cnkgewotI2RlZmluZSBURUVfTUFYX0ZJTEVOQU1FIDMyIC8vICVZJW0lZCVIJU0lU18lZC53YXYgPSA0KzIrMisyKzIrMisxKzErNCsxID0gMjEKLSAgICBjaGFyIG1GaWxlTmFtZVtURUVfTUFYX0ZJTEVOQU1FXTsKLX07Ci0KLWludCBjb21wYXJFbnRyeShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bUZpbGVOYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bUZpbGVOYW1lKTsKLX0KLQotI2lmZGVmIFRFRV9TSU5LCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KQotewotICAgIE5CQUlPX1NvdXJjZSAqdGVlU291cmNlID0gc291cmNlLmdldCgpOwotICAgIGlmICh0ZWVTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyAud2F2IHJvdGF0aW9uCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIGlmIDIgdGhyZWFkcyBjYWxsIHRoaXMgc2ltdWx0YW5lb3VzbHkuCi0gICAgICAgIC8vIFRoZXkgd291bGQgYm90aCB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LCBidXQgdGhlIHJlc3VsdCB3b3VsZCBzaW1wbHkgYmUKLSAgICAgICAgLy8gZmFpbHVyZXMgYXQgdW5saW5rKCkgd2hpY2ggYXJlIGlnbm9yZWQuICBJdCdzIGFsc28gdW5saWtlbHkgc2luY2UKLSAgICAgICAgLy8gbm9ybWFsbHkgZHVtcHN5cyBpcyBvbmx5IGRvbmUgYnkgYnVncmVwb3J0IG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKLSAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7Ci0gICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKLSAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwotICAgICAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSNkZWZpbmUgVEVFX01BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKLSNkZWZpbmUgVEVFX01BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKLSAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW1RFRV9NQVhfU09SVF07Ci0gICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IFRFRV9NQVhfU09SVCkgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsgLy8gY2xlYXIgZXJybm8gYmVmb3JlIHJlYWRkaXIoKSB0byB0cmFjayBwb3RlbnRpYWwgZXJyb3JzLgotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgInRlZSByZWFkZGlyKCkgZmFpbHVyZSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uIC53YXYgZmlsZSBlbnRyaWVzCi0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4ocmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBURUVfTUFYX0ZJTEVOQU1FIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKLSAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7Ci0gICAgICAgICAgICAgICAgcXNvcnQoZW50cmllcywgZW50cnlDb3VudCwgc2l6ZW9mKEVudHJ5KSwgY29tcGFyRW50cnkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIFRFRV9NQVhfS0VFUDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlLipzOiAlc1xuIiwgKGludCkgdGVlUGF0aExlbiwgdGVlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciB0ZWVUaW1lWzE2XTsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgICAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7Ci0gICAgICAgIHN0cmZ0aW1lKHRlZVRpbWUsIHNpemVvZih0ZWVUaW1lKSwgIiVZJW0lZCVIJU0lUyIsICZ0bSk7Ci0gICAgICAgIHNucHJpbnRmKCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBzaXplb2YodGVlUGF0aCkgLSB0ZWVQYXRoTGVuLCAiJXNfJWRfJWMud2F2IiwgdGVlVGltZSwgaWQsCi0gICAgICAgICAgICAgICAgc3VmZml4KTsKLSAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCi0gICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgICAgICBpZiAodGVlRmQgPj0gMCkgewotICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKLSAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKLSAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCi0gICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7Ci0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOwotI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCi0gICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBib29sIHdhc0ZpcnN0UmVhZCA9IGZpcnN0UmVhZDsKLSAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSAoc3NpemVfdCkgT1ZFUlJVTiAmJiB3YXNGaXJzdFJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3R1YWwgPD0gKHNzaXplX3QpY291bnQpOwotICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gYWN0dWFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBmcmFtZVNpemU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBjbG9zZSh0ZWVGZCk7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCBjcmVhdGUgZmlsZSB3aXRoIHRlbXBvcmFyeSBuYW1lIGFuZCB0aGVuIHJlbmFtZSB0byBmaW5hbCBpZiBub24tZW1wdHkuCi0gICAgICAgICAgICBpZiAodG90YWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDU2N2M1YTkuLjcyZTY2OWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTIxLDEzICsyMSwxOSBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9CbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KQEAgLTY0LDcgKzcwLDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvTGluZWFyTWFwLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKQEAgLTczLDYgKzgyLDcgQEAKICNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgogI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtODAsNiArOTAsOCBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uLmg+CisKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuQXVkaW9SZWNvcmQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTMzLDYgKzE0NSwxMCBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGUoKSBjb25zdDsKIAorICAgIC8vIEJhbGFuY2UgdmFsdWUgbXVzdCBiZSB3aXRoaW4gLTEuZiAobGVmdCBvbmx5KSB0byAxLmYgKHJpZ2h0IG9ubHkpIGluY2x1c2l2ZS4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKTsKQEAgLTIwNCw2ICsyMjAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KApAQCAtMjIxLDYgKzIzOSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKIAorICAgICAgICAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwpAQCAtMjc4LDYgKzMwMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TW1hcFN0cmVhbUludGVyZmFjZT4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgc3RhdGljIGludCBvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pOworICAgIHN0YXRpYyB2b2lkIG9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKTsKIHByaXZhdGU6CiAgICAgLy8gRklYTUUgVGhlIDQwMCBpcyB0ZW1wb3JhcmlseSB0b28gaGlnaCB1bnRpbCBhIGxlYWsgb2Ygd3JpdGVycyBpbiBtZWRpYS5sb2cgaXMgZml4ZWQuCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDQwMCAqIDEwMjQ7CkBAIC0zNDgsNyArMzczLDYgQEAKIAogICAgIEF1ZGlvSHdEZXZpY2UqICAgICAgICAgIGZpbmRTdWl0YWJsZUh3RGV2X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CiAKICAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgdG8gdHJ1ZSB0byBlbmFibGUgZ3JlYXRlciB0aGFuIHN0ZXJlbyBvdXRwdXQKICAgICAvLyBmb3IgdGhlIE1peGVyVGhyZWFkIGFuZCBkZXZpY2Ugc2luay4gIE51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkIGlzCkBAIC0zNTksMTYgKzM4MywxNyBAQAogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CiAgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhhcHRpYyBjaGFubmVsIG1hc2sgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjaGFubmVsIHBvc2l0aW9uIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhDaGFubmVsQ291bnQgPSBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscworICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMgOiBGQ0NfMjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCi0gICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9wb3NpdGlvbl9tYXNrX2lzX291dF9jYW5vbmljYWwoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg6CiAgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKQEAgLTQxMSwxMyArNDM2LDE3IEBACiAgICAgc3RhdGljIHVpbnQzMl90ICAgICAgICAgbVNjcmVlblN0YXRlOwogCiAgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCi0gICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tUaW1lb3V0TnMgPSAxICogTkFOT1NfUEVSX1NFQ09ORDsKICAgICBzdGF0aWMgYm9vbCBkdW1wVHJ5TG9jayhNdXRleCYgbXV0ZXgpOwogICAgIHZvaWQgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkIGR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICBTaW1wbGVMb2cgbVRocmVhZExvZ3sxNn07IC8vIDE2IFRocmVhZCBoaXN0b3J5IGxpbWl0CisKKyAgICBjbGFzcyBUaHJlYWRCYXNlOworICAgIHZvaWQgZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCk7CisKICAgICAvLyAtLS0gQ2xpZW50IC0tLQogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6CkBAIC01MDQsNiArNTMzLDkgQEAKICAgICBjbGFzcyBFZmZlY3RDaGFpbjsKIAogICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluOworICAgIHN0cnVjdCBUZWVQYXRjaDsKKyAgICB1c2luZyBUZWVQYXRjaGVzID0gc3RkOjp2ZWN0b3I8VGVlUGF0Y2g+OworCiAKICAgICBzdHJ1Y3QgIHN0cmVhbV90eXBlX3QgewogICAgICAgICBzdHJlYW1fdHlwZV90KCkKQEAgLTUzMCw2ICs1NjIsMjYgQEAKIAogI2luY2x1ZGUgIlBhdGNoUGFuZWwuaCIKIAorICAgIC8vIEZpbmQgaW8gaGFuZGxlIGJ5IHNlc3Npb24gaWQuCisgICAgLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byBhbiBpbyBoYW5kbGUgd2l0aCBhIG1hdGNoaW5nIGVmZmVjdCBjaGFpbiB0byBzZXNzaW9uIGlkLgorICAgIC8vIElmIG5vbmUgZm91bmQsIEFVRElPX0lPX0hBTkRMRV9OT05FIGlzIHJldHVybmVkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKAorICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgY29uc3QgVCYgdGhyZWFkcykgeworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2Vzc2lvblR5cGUgPSB0aHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICAgICAgaWYgKHNlc3Npb25UeXBlICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbyA9IHRocmVhZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKChzZXNzaW9uVHlwZSAmIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGVmZmVjdCBjaGFpbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW87CisgICAgfQorCiAgICAgLy8gc2VydmVyIHNpZGUgb2YgdGhlIGNsaWVudCdzIElBdWRpb1RyYWNrCiAgICAgY2xhc3MgVHJhY2tIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6Qm5BdWRpb1RyYWNrIHsKICAgICBwdWJsaWM6CkBAIC01NDIsNiArNTk0LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CkBAIC01NjYsNiArNjE5LDEwIEBACiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gbVJlY29yZFRyYWNrOwogCkBAIC02MDcsNyArNjY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBvdXRwdXREZXZpY2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gb3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLApAQCAtNjQwLDggKzY5OSwxMSBAQAogCiAgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVFZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnNyY1RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3Rlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCk7CisKKyAgICAgICAgICAgICAgc3RhdHVzX3QgbW92ZUF1eEVmZmVjdFRvSW8oaW50IEVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIGRzdFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICpzcmNUaHJlYWQpOwogCiAgICAgICAgICAgICAgIC8vIHJldHVybiB0aHJlYWQgYXNzb2NpYXRlZCB3aXRoIHByaW1hcnkgaGFyZHdhcmUgZGV2aWNlLCBvciBOVUxMCiAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpIGNvbnN0OwpAQCAtNjUwLDcgKzcxMiw3IEBACiAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcGxheWJhY2sgdGhyZWFkIHdpdGggc21hbGxlc3QgSEFMIGJ1ZmZlciBzaXplLCBhbmQgcHJlZmVyIGZhc3QKICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmZhc3RQbGF5YmFja1RocmVhZF9sKCkgY29uc3Q7CiAKLSAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGludCBFZmZlY3RJZCk7CisgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IGdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGludCBlZmZlY3RJZCk7CiAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCk7CkBAIC02NzYsNyArNzM4LDEyIEBACiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVmZmVjdCB3YXMgZm91bmQgaW4gbU9ycGhhbkVmZmVjdENoYWlucywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKIAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOworCiAgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLApAQCAtNjkzLDYgKzc2MCwxMSBAQAogICAgICAgICAgICAgYXVkaW9Id0RldihkZXYpLCBzdHJlYW0oaW4pLCBmbGFncyhmbGFncykge30KICAgICB9OwogCisgICAgc3RydWN0IFRlZVBhdGNoIHsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gcGF0Y2hSZWNvcmQ7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBwYXRjaFRyYWNrOworICAgIH07CisKICAgICAvLyBmb3IgbUF1ZGlvU2Vzc2lvblJlZnMgb25seQogICAgIHN0cnVjdCBBdWRpb1Nlc3Npb25SZWYgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25pZCwgcGlkX3QgcGlkKSA6CkBAIC03NTQsNiArODI2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGJlbG93IGFyZSBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlID0gMC5mOwogICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB2YXJpYWJsZXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CkBAIC03NzEsNiArODQ0LDcgQEAKICAgICAgICAgICAgICAgICBWZWN0b3I8QXVkaW9TZXNzaW9uUmVmKj4gbUF1ZGlvU2Vzc2lvblJlZnM7CiAKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWVfbCgpIGNvbnN0OworICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgIGdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGVfbCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGVfbChjb25zdCBjaGFyICpuYW1lKTsKIApAQCAtNzkzLDQ0ICs4NjcsMTkgQEAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgdm9pZCAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQotICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiBtUmVjb3JkVGVlU291cmNlOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKTsKIAogcHVibGljOgotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyB0ZWUgc2luaywgaWYgZW5hYmxlZCBieSBwcm9wZXJ0eSwgYWxsb3dzIGR1bXBzeXMgdG8gd3JpdGUgbW9zdCByZWNlbnQgYXVkaW8gdG8gLndhdiBmaWxlCi0gICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KTsKLQotICAgIC8vIHdoZXRoZXIgdGVlIHNpbmsgaXMgZW5hYmxlZCBieSBwcm9wZXJ0eQotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rSW5wdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rT3V0cHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua1RyYWNrRW5hYmxlZDsKLQotICAgIC8vIHJ1bnRpbWUgY29uZmlndXJlZCBzaXplIG9mIGVhY2ggdGVlIHNpbmsgcGlwZSwgaW4gZnJhbWVzCi0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua0lucHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtPdXRwdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua1RyYWNrRnJhbWVzOwotCi0gICAgLy8gY29tcGlsZS10aW1lIGRlZmF1bHQgc2l6ZSBvZiB0ZWUgc2luayBwaXBlcywgaW4gZnJhbWVzCi0gICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSNlbmRpZgotCiAgICAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIHZhcmlhYmxlcyBhdG9taWNhbGx5IHdpdGhvdXQgbUxvY2ssCiAgICAgLy8gdGhvdWdoIHRoZSB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCBtTG9jay4KICAgICBib29sICAgIGlzTG93UmFtRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTG93UmFtRGV2aWNlOyB9CkBAIC04NDUsMTAgKzg5NCwxNSBAQAogCiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKIAotICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFBhdGNoUGFuZWwgbVBhdGNoUGFuZWw7CiAgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1FZmZlY3RzRmFjdG9yeUhhbDsKIAotICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCmluZGV4IGViODI2YzYuLmQ0Mjk5YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMzUsNiArMzUsOSBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGlzIGlzbid0IGEgdGVybWluYWwgbW9kdWxlLCBhbmQgc29mdHdhcmUgcGF0Y2hlcworICAgICAgICAvLyBhcmUgdXNlZCB0byB0cmFuc3BvcnQgYXVkaW8gZGF0YSBmdXJ0aGVyLgorICAgICAgICBBSFdEX0lTX0lOU0VSVCAgICAgICAgICAgICAgPSAweDQsCiAgICAgfTsKIAogICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKQEAgLTU1LDYgKzU4LDEwIEBACiAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgfQogCisgICAgYm9vbCBpc0luc2VydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0lTX0lOU0VSVCkpOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggMWQ0YjNmZS4uYTYwYTVmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC02Niw4ICs2Niw5IEBACiAgICAgLy8gTWFpbnRhaW4gYSA2NC1iaXQgcmVuZGVyIHBvc2l0aW9uIHVzaW5nIHRoZSAzMi1iaXQgcmVzdWx0IGZyb20gdGhlIEhBTC4KICAgICAvLyBUaGlzIGRlbHRhIGNhbGN1bGF0aW9uIHJlbGllcyBvbiB0aGUgYXJpdGhtZXRpYyBvdmVyZmxvdyBiZWhhdmlvcgogICAgIC8vIG9mIGludGVnZXJzLiBGb3IgZXhhbXBsZSAoMTAwIC0gMHhGRkZGRkZGMCkgPSAxMTYuCi0gICAgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOwotICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbiA9IChpbnQzMl90KShoYWxQb3NpdGlvbiAtIHRydW5jYXRlZFBvc2l0aW9uKTsKKyAgICBjb25zdCB1aW50MzJfdCB0cnVuY2F0ZWRQb3NpdGlvbiA9ICh1aW50MzJfdCltUmVuZGVyUG9zaXRpb247CisgICAgaW50MzJfdCBkZWx0YUhhbFBvc2l0aW9uOyAvLyBpbml0aWFsaXphdGlvbiBub3QgbmVlZGVkLCBvdmVyd2l0dGVuIGJ5IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coKQorICAgICh2b2lkKSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KGhhbFBvc2l0aW9uLCB0cnVuY2F0ZWRQb3NpdGlvbiwgJmRlbHRhSGFsUG9zaXRpb24pOwogICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgewogICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCmluZGV4IGFlOTYwMzYuLjVmNmFjYTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgc2l6ZV90IG1heEJ5dGVzID0gMCkgOiBtSWQoaWQpLCBtRm9ybWF0KGZvcm1hdCksIG1DaGFubmVscyhjaGFubmVscyksCiAgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLCBtTWF4Qnl0ZXMobWF4Qnl0ZXMpIHsKLSAgICBtQnl0ZUNvdW50ID0gMGw7CisgICAgbUJ5dGVDb3VudCA9IDA7CiAgICAgbVBhdXNlZCA9IGZhbHNlOwogICAgIGlmICh0YWcgIT0gTlVMTCkgewogICAgICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5KG1UYWcsIHRhZyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggMjA0N2RmZC4uM2M0ZmJiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMzEsOSArMzEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC01MCw2ICs1MCw4IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisjZGVmaW5lIERFRkFVTFRfT1VUUFVUX1NBTVBMRV9SQVRFIDQ4MDAwCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY2LDYgKzE2OCw2OCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjp1cGRhdGVQb2xpY3lTdGF0ZSgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgYm9vbCBkb1JlZ2lzdGVyID0gZmFsc2U7CisgICAgYm9vbCByZWdpc3RlcmVkID0gZmFsc2U7CisgICAgYm9vbCBkb0VuYWJsZSA9IGZhbHNlOworICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvOworICAgIHVpbnQzMl90IHN0cmF0ZWd5OworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAvLyByZWdpc3RlciBlZmZlY3Qgd2hlbiBmaXJzdCBoYW5kbGUgaXMgYXR0YWNoZWQgYW5kIHVucmVnaXN0ZXIgd2hlbiBsYXN0IGhhbmRsZSBpcyByZW1vdmVkCisgICAgICAgIGlmIChtUG9saWN5UmVnaXN0ZXJlZCAhPSBtSGFuZGxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBkb1JlZ2lzdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qb2xpY3lSZWdpc3RlcmVkID0gbUhhbmRsZXMuc2l6ZSgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUG9saWN5UmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICBzcCA8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgc3AgPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworCisgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbHB0ciB8fCBjaGFpbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW8gPSB0aHJlYWQtPmlkKCk7CisgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSBjaGFpbi0+c3RyYXRlZ3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBlbmFibGUgZWZmZWN0IHdoZW4gcmVnaXN0ZXJlZCBhY2NvcmRpbmcgdG8gZW5hYmxlIHN0YXRlIHJlcXVlc3RlZCBieSBjb250cm9sbGluZyBoYW5kbGUKKyAgICAgICAgaWYgKG1IYW5kbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlID0gY29udHJvbEhhbmRsZV9sKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIgJiYgbVBvbGljeUVuYWJsZWQgIT0gaGFuZGxlLT5lbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBkb0VuYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVBvbGljeUVuYWJsZWQgPSBoYW5kbGUtPmVuYWJsZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWdpc3RlcmVkID0gbVBvbGljeVJlZ2lzdGVyZWQ7CisgICAgICAgIGVuYWJsZWQgPSBtUG9saWN5RW5hYmxlZDsKKyAgICAgICAgbVBvbGljeUxvY2subG9jaygpOworICAgIH0KKyAgICBBTE9HVigiJXMgbmFtZSAlcyBpZCAlZCBzZXNzaW9uICVkIGRvUmVnaXN0ZXIgJWQgcmVnaXN0ZXJlZCAlZCBkb0VuYWJsZSAlZCBlbmFibGVkICVkIiwKKyAgICAgICAgX19mdW5jX18sIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwgbVNlc3Npb25JZCwgZG9SZWdpc3RlciwgcmVnaXN0ZXJlZCwgZG9FbmFibGUsIGVuYWJsZWQpOworICAgIGlmIChkb1JlZ2lzdGVyKSB7CisgICAgICAgIGlmIChyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoCisgICAgICAgICAgICAgICAgJm1EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGlvLAorICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlZ2lzdGVyZWQgJiYgZG9FbmFibGUpIHsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQobUlkLCBlbmFibGVkKTsKKyAgICB9CisgICAgbVBvbGljeUxvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnJlbW92ZUhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMjI4LDcgKzI5Miw2IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzc2l6ZV90IG51bUhhbmRsZXMgPSByZW1vdmVIYW5kbGVfbChoYW5kbGUpOwogICAgIGlmICgobnVtSGFuZGxlcyA9PSAwKSAmJiAoIW1QaW5uZWQgfHwgdW5waW5JZkxhc3QpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7CiAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gYWYgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGFmICE9IDApIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwpAQCAtMjQ2LDcgKzMwOSw3IEBACiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICBjYXNlIFJFU1RBUlQ6CiAgICAgICAgIHJlc2V0X2woKTsKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCiAgICAgY2FzZSBTVEFSVElORzoKICAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCkBAIC0yNjMsNyArMzI2LDkgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFNUT1BQSU5HOgotICAgICAgICBpZiAoc3RvcF9sKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gdm9sdW1lIGNvbnRyb2wgZm9yIG9mZmxvYWQgYW5kIGRpcmVjdCB0aHJlYWRzIG11c3QgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuCisgICAgICAgIGlmIChzdG9wX2woKSA9PSBOT19FUlJPUgorICAgICAgICAgICAgJiYgIShpc1ZvbHVtZUNvbnRyb2woKSAmJiBpc09mZmxvYWRlZE9yRGlyZWN0KCkpKSB7CiAgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSBtTWF4RGlzYWJsZVdhaXRDbnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSAxOyAvLyB3aWxsIGNhdXNlIGltbWVkaWF0ZSB0cmFuc2l0aW9uIHRvIElETEUKQEAgLTMwNSw4ICszNzAsOCBAQAogICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgZWZmZWN0IGJ1ZmZlcnMgd2l0aG91dCBhbiBpbnRlcm1lZGlhcnkgZWZmZWN0IHByb2Nlc3MuCiAgICAgLy8gVE9ETzogY29uc2lkZXIgaW1wbGVtZW50aW5nIGNoYW5uZWwgY29udmVyc2lvbi4KICAgICBjb25zdCBzaXplX3Qgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnQgPQotICAgICAgICAgICAgaW5DaGFubmVsQ291bnQgIT0gb3V0Q2hhbm5lbENvdW50ID8gMAotICAgICAgICAgICAgICAgICAgICA6IG91dENoYW5uZWxDb3VudCAqIHN0ZDo6bWluKAorICAgICAgICAgICAgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkICE9IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPyAwCisgICAgICAgICAgICAgICAgICAgIDogbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCAqIHN0ZDo6bWluKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwogICAgIGNvbnN0IGF1dG8gYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQgPSBbdGhpcywgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnRdKCkgewpAQCAtNDc2LDcgKzU0MSwxMiBAQAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChjaGFpbi5nZXQoKSAhPSBudWxscHRyICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKLSAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICAvLyBzaW1pbGFyIGhhbmRsaW5nIHdpdGggZGF0YV9ieXBhc3MgYWJvdmUuCisgICAgICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCisgICAgICAgICAgICAgICAgY29weUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTU0Nyw3ICs2MTcsMTQgQEAKIAogICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKworICAgIC8vIERvbid0IHVzZSBzYW1wbGUgcmF0ZSBmb3IgdGhyZWFkIGlmIGVmZmVjdCBpc24ndCBvZmZsb2FkYWJsZS4KKyAgICBpZiAoKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQpICYmICFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gREVGQVVMVF9PVVRQVVRfU0FNUExFX1JBVEU7CisgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBpbnB1dCBhcyA0OGtIeiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgfQogICAgIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlOwogICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CkBAIC03NzgsNiArODU1LDE2IEBACiAgICAgfQogICAgIHN0YXR1c190IGNtZFN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yoc3RhdHVzX3QpOworCisgICAgaWYgKGlzVm9sdW1lQ29udHJvbCgpICYmIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj5jaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgICAgIC8vIFdlIGhhdmUgdGhlIEVmZmVjdENoYWluIGFuZCBFZmZlY3RNb2R1bGUgbG9jaywgcGVybWl0IGEgcmVlbnRyYW50IGNhbGwgdG8gc2V0Vm9sdW1lOgorICAgICAgICAvLyByZXNldFZvbHVtZV9sIC0tPiBzZXRWb2x1bWVfbCAtLT4gRWZmZWN0TW9kdWxlOjpzZXRWb2x1bWUKKyAgICAgICAgbVNldFZvbHVtZVJlZW50cmFudFRpZCA9IGdldHRpZCgpOworICAgICAgICBjaGFpbi0+cmVzZXRWb2x1bWVfbCgpOworICAgICAgICBtU2V0Vm9sdW1lUmVlbnRyYW50VGlkID0gSU5WQUxJRF9QSUQ7CisgICAgfQorCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX0RJU0FCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKQEAgLTkxNywxMSArMTAwNCw2IEBACiAgICAgQUxPR1YoInNldEVuYWJsZWQgJXAgZW5hYmxlZCAlZCIsIHRoaXMsIGVuYWJsZWQpOwogCiAgICAgaWYgKGVuYWJsZWQgIT0gaXNFbmFibGVkKCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQobUlkLCBlbmFibGVkKTsKLSAgICAgICAgaWYgKGVuYWJsZWQgJiYgc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgLy8gZ29pbmcgZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkCiAgICAgICAgIGNhc2UgSURMRToKQEAgLTk5Myw2ICsxMDc1LDE2IEBACiAgICAgfQogfQogCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6Ok9GRkxPQUQgfHwgbVRocmVhZFR5cGUgPT0gVGhyZWFkQmFzZTo6RElSRUNUKTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChpc1ZvbHVtZUNvbnRyb2woKSAmJiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpID8gaXNFbmFibGVkKCkgOiBpc1Byb2Nlc3NFbmFibGVkKCkpKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CiAgICAgQUxPR1ZWKCJzZXRJbkJ1ZmZlciAlcCIsKCZidWZmZXIpKTsKIApAQCAtMTA5MSw3ICsxMTgzLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvTG9ja1JlZW50cmFudCBfbChtTG9jaywgbVNldFZvbHVtZVJlZW50cmFudFRpZCk7CiAgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQpAQCAtMTEwMCw3ICsxMTkyLDggQEAKICAgICAvLyBpZiBjb250cm9sbGVyIGZsYWcgaXMgc2V0IChOb3RlIHRoYXQgY29udHJvbGxlciA9PSBUUlVFID0+IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHNldCkKICAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpICYmCiAgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHx8Ci0gICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCkpIHsKKyAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCB8fAorICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUikpIHsKICAgICAgICAgdWludDMyX3Qgdm9sdW1lWzJdOwogICAgICAgICB1aW50MzJfdCAqcFZvbHVtZSA9IE5VTEw7CiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yodm9sdW1lKTsKQEAgLTExMjIsNiArMTIxNSwxOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0Vm9sdW1lRm9yT3V0cHV0X2wodWludDMyX3QgbGVmdCwgdWludDMyX3QgcmlnaHQpCit7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwICYmCisgICAgICAgICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgJiYKKyAgICAgICAgIWlzTm9uT2ZmbG9hZGFibGVFbmFibGVkX2woKSkgeworICAgICAgICBQbGF5YmFja1RocmVhZCAqdCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgZmxvYXQgdm9sX2wgPSAoZmxvYXQpbGVmdCAvICgxIDw8IDI0KTsKKyAgICAgICAgZmxvYXQgdm9sX3IgPSAoZmxvYXQpcmlnaHQgLyAoMSA8PCAyNCk7CisgICAgICAgIHQtPnNldFZvbHVtZUZvck91dHB1dF9sKHZvbF9sLCB2b2xfcik7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtMTIwMywxNCArMTMwOSwxMSBAQAogewogICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOwotICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGlzY29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGUtPmhhc0NvbnRyb2woKSkgewotICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBoYW5kbGUtPmVuYWJsZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlID0gY29udHJvbEhhbmRsZV9sKCk7CisgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGVuYWJsZWQgPSBoYW5kbGUtPmVuYWJsZWQoKTsKICAgICB9CisgICAgbUhhbmRsZXMuY2xlYXIoKTsKICAgICByZXR1cm4gZW5hYmxlZDsKIH0KIApAQCAtMTI4Miw2ICsxMzg1LDcgQEAKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FOiBzLmFwcGVuZCgibm9uZSIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOiBzLmFwcGVuZCgiaW1wbGVtZW50cyBjb250cm9sIik7IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIGluZGljYXRpb24iKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjogcy5hcHBlbmQoIm1vbml0b3JzIHZvbHVtZSIpOyBicmVhazsKICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKICAgICB9CiAgICAgcy5hcHBlbmQoIiwgIik7CkBAIC0xMzg0LDkgKzE0ODgsMTAgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdENvdWxkIG5vdCBsb2NrIEZ4IG11dGV4OlxuIik7CiAgICAgfQogCi0gICAgcmVzdWx0LmFwcGVuZCgiXHRcdFNlc3Npb24gU3RhdHVzIFN0YXRlIEVuZ2luZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgJXBcbiIsCi0gICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBSZWdpc3RlcmVkIEVuYWJsZWQgU3VzcGVuZGVkIEVuZ2luZTpcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgJXMgICAgICAgICAgJXMgICAgICAgJXMgICAgICAgICAlcFxuIiwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsIG1TdGF0dXMsIG1TdGF0ZSwgbVBvbGljeVJlZ2lzdGVyZWQgPyAieSIgOiAibiIsIG1Qb2xpY3lFbmFibGVkID8gInkiIDogIm4iLAorICAgICAgICAgICAgbVN1c3BlbmRlZCA/ICJ5IiA6ICJuIiwgbUVmZmVjdEludGVyZmFjZS5nZXQoKSk7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0RGVzY3JpcHRvcjpcbiIpOwogICAgIGNoYXIgdXVpZFN0cls2NF07CkBAIC0xNDQ5LDYgKzE1NTQsMTEgQEAKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CiAKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSAhPSAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICJcdEVmZmVjdCBJRCAlZCBIQUwgZHVtcDpcbiIsIG1JZCk7CisgICAgICAgICh2b2lkKW1FZmZlY3RJbnRlcmZhY2UtPmR1bXAoZmQpOworICAgIH0KKwogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMTUxNiw2ICsxNjI2LDEyIEBACiAKICAgICBtRW5hYmxlZCA9IHRydWU7CiAKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGVmZmVjdC0+dGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICB0aHJlYWQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlZmZlY3QsIHRydWUsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOwpAQCAtMTUyNiw3ICsxNjQyLDcgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IGVmZmVjdC0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICBzdGF0dXMgPSBlZmZlY3QtPnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIHRocmVhZC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOwpAQCAtMTU2OSw2ICsxNjg1LDggQEAKICAgICB9CiAgICAgbUVuYWJsZWQgPSBmYWxzZTsKIAorICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKKwogICAgIGlmIChlZmZlY3QtPnN1c3BlbmRlZCgpKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CkBAIC0xNjA0LDIwICsxNzIyLDE3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOwogICAgIHsKICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBlZmZlY3QtPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gY2xlYW51cCBhcyBtdWNoIGFzIHdlIGNhbgotICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDAgJiYgZWZmZWN0LT5kaXNjb25uZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KSA+IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLCBfX0ZVTkNUSU9OX18sIHRoaXMpOworICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gZWZmZWN0LT50aHJlYWQoKS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlZmZlY3QtPmRpc2Nvbm5lY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpID4gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4MTUsNyArMTkzMCw3IEBACiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKICAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLApAQCAtMTg5MSw2ICsyMDA2LDE2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0ZDo6dmVjdG9yPGludD4gQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Z2V0RWZmZWN0SWRzKCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlkczsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWRzLnB1c2hfYmFjayhtRWZmZWN0c1tpXS0+aWQoKSk7CisgICAgfQorICAgIHJldHVybiBpZHM7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Y2xlYXJJbnB1dEJ1ZmZlcigpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTIyMDAsOCArMjMyNSw3IEBACiAKICAgICAvLyBmaXJzdCB1cGRhdGUgdm9sdW1lIGNvbnRyb2xsZXIKICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZTsgaSA+IDA7IGktLSkgewotICAgICAgICBpZiAobUVmZmVjdHNbaSAtIDFdLT5pc1Byb2Nlc3NFbmFibGVkKCkgJiYKLSAgICAgICAgICAgIChtRWZmZWN0c1tpIC0gMV0tPmRlc2MoKS5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCkgeworICAgICAgICBpZiAobUVmZmVjdHNbaSAtIDFdLT5pc1ZvbHVtZUNvbnRyb2xFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGN0cmxJZHggPSBpIC0gMTsKICAgICAgICAgICAgIGhhc0NvbnRyb2wgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMjI5LDcgKzIzNTMsNyBAQAogICAgIH0KICAgICAvLyB0aGVuIGluZGljYXRlIHZvbHVtZSB0byBhbGwgb3RoZXIgZWZmZWN0cyBpbiBjaGFpbi4KICAgICAvLyBQYXNzIGFsdGVyZWQgdm9sdW1lIHRvIGVmZmVjdHMgYmVmb3JlIHZvbHVtZSBjb250cm9sbGVyCi0gICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyCisgICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyIG9yIHdpdGggdm9sdW1lIG1vbml0b3IgZmxhZwogICAgIHVpbnQzMl90IGxWb2wgPSBuZXdMZWZ0OwogICAgIHVpbnQzMl90IHJWb2wgPSBuZXdSaWdodDsKIApAQCAtMjI0MiwxMSArMjM2NiwxOCBAQAogICAgICAgICAgICAgbFZvbCA9ICpsZWZ0OwogICAgICAgICAgICAgclZvbCA9ICpyaWdodDsKICAgICAgICAgfQotICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKCZsVm9sLCAmclZvbCwgZmFsc2UpOworICAgICAgICAvLyBQYXNzIHJlcXVlc3RlZCB2b2x1bWUgZGlyZWN0bHkgaWYgdGhpcyBpcyB2b2x1bWUgbW9uaXRvciBtb2R1bGUKKyAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5pc1ZvbHVtZU1vbml0b3IoKSkgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZShsZWZ0LCByaWdodCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZSgmbFZvbCwgJnJWb2wsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KICAgICAqbGVmdCA9IG5ld0xlZnQ7CiAgICAgKnJpZ2h0ID0gbmV3UmlnaHQ7CiAKKyAgICBzZXRWb2x1bWVGb3JPdXRwdXRfbCgqbGVmdCwgKnJpZ2h0KTsKKwogICAgIHJldHVybiBoYXNDb250cm9sOwogfQogCkBAIC0yMjczLDEzICsyNDA0LDEwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzaXplX3QgbnVtRWZmZWN0cyA9IG1FZmZlY3RzLnNpemUoKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgJXp1IGVmZmVjdHMgZm9yIHNlc3Npb24gJWRcbiIsIG51bUVmZmVjdHMsIG1TZXNzaW9uSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBjb25zdCBzaXplX3QgbnVtRWZmZWN0cyA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgJXp1IGVmZmVjdHMgZm9yIHNlc3Npb24gJWRcbiIsIG51bUVmZmVjdHMsIG1TZXNzaW9uSWQpOwogCiAgICAgaWYgKG51bUVmZmVjdHMpIHsKICAgICAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKQEAgLTIzMDcsNiArMjQzNSw4IEBACiAgICAgICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfQogfQogCkBAIC0yNTA4LDYgKzI2MzgsMTEgQEAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6aXNOb25PZmZsb2FkYWJsZUVuYWJsZWQoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGlzTm9uT2ZmbG9hZGFibGVFbmFibGVkX2woKTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjppc05vbk9mZmxvYWRhYmxlRW5hYmxlZF9sKCkKK3sKICAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBpZiAobUVmZmVjdHNbaV0tPmlzRW5hYmxlZCgpICYmICFtRWZmZWN0c1tpXS0+aXNPZmZsb2FkYWJsZSgpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCAyMzI3YmI5Li4yMjA4NzRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTg1LDYgKzg1LDggQEAKICAgICBzdGF0dXNfdCAgICBzZXRFbmFibGVkX2woYm9vbCBlbmFibGVkKTsKICAgICBib29sIGlzRW5hYmxlZCgpIGNvbnN0OwogICAgIGJvb2wgaXNQcm9jZXNzRW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OworICAgIGJvb2wgaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKICAgICBpbnQxNl90ICAgICAqaW5CdWZmZXIoKSBjb25zdCB7CkBAIC05NSw3ICs5Nyw4IEBACiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KICAgICB2b2lkICAgICAgICBzZXRDaGFpbihjb25zdCB3cDxFZmZlY3RDaGFpbj4mIGNoYWluKSB7IG1DaGFpbiA9IGNoYWluOyB9Ci0gICAgdm9pZCAgICAgICAgc2V0VGhyZWFkKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIHsgbVRocmVhZCA9IHRocmVhZDsgfQorICAgIHZvaWQgICAgICAgIHNldFRocmVhZChjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKQorICAgICAgICAgICAgICAgICAgICB7IG1UaHJlYWQgPSB0aHJlYWQ7IG1UaHJlYWRUeXBlID0gdGhyZWFkLnByb21vdGUoKS0+dHlwZSgpOyB9CiAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCgpIHsgcmV0dXJuIG1UaHJlYWQ7IH0KIAogICAgIHN0YXR1c190IGFkZEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CkBAIC0xMjgsMTEgKzEzMSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0spID09IDA7IH0KICAgICBib29sICAgICAgICAgICAgIGlzUHJvY2Vzc0ltcGxlbWVudGVkKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX05PX1BST0NFU1MpID09IDA7IH0KKyAgICBib29sICAgICAgICAgICAgIGlzVm9sdW1lQ29udHJvbCgpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDsgfQorICAgIGJvb2wgICAgICAgICAgICAgaXNWb2x1bWVNb25pdG9yKCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9NT05JVE9SOyB9CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKICAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CiAgICAgdm9pZCAgICAgICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CiAgICAgdm9pZCAgICAgICAgICAgICByZWxlYXNlX2woKTsKIAorICAgIHN0YXR1c190ICAgICAgICAgdXBkYXRlUG9saWN5U3RhdGUoKTsKKwogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgpAQCAtMTUwLDYgKzE2MSw3IEBACiAKIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgICAgICAvLyBtdXRleCBmb3IgcHJvY2VzcywgY29tbWFuZHMgYW5kIGhhbmRsZXMgbGlzdCBwcm90ZWN0aW9uCiAgICAgd3A8VGhyZWFkQmFzZT4gICAgICBtVGhyZWFkOyAgICAvLyBwYXJlbnQgdGhyZWFkCisgICAgVGhyZWFkQmFzZTo6dHlwZV90ICBtVGhyZWFkVHlwZTsgLy8gcGFyZW50IHRocmVhZCB0eXBlCiAgICAgd3A8RWZmZWN0Q2hhaW4+ICAgICBtQ2hhaW47ICAgICAvLyBwYXJlbnQgZWZmZWN0IGNoYWluCiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7ICAgICAgICAvLyB0aGlzIGluc3RhbmNlIHVuaXF1ZSBJRAogICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAvLyBhdWRpbyBzZXNzaW9uIElECkBAIC0xNzYsNiArMTg4LDM0IEBACiAgICAgdWludDMyX3QgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkOwogICAgIHVpbnQzMl90IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQ7CiAjZW5kaWYKKworICAgIGNsYXNzIEF1dG9Mb2NrUmVlbnRyYW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEF1dG9Mb2NrUmVlbnRyYW50KE11dGV4JiBtdXRleCwgcGlkX3QgYWxsb3dlZFRpZCkKKyAgICAgICAgICAgIDogbU11dGV4KGdldHRpZCgpID09IGFsbG93ZWRUaWQgPyBudWxscHRyIDogJm11dGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobU11dGV4ICE9IG51bGxwdHIpIG1NdXRleC0+bG9jaygpOworICAgICAgICB9CisgICAgICAgIH5BdXRvTG9ja1JlZW50cmFudCgpIHsKKyAgICAgICAgICAgIGlmIChtTXV0ZXggIT0gbnVsbHB0cikgbU11dGV4LT51bmxvY2soKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIE11dGV4ICogY29uc3QgbU11dGV4OworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIHBpZF90IElOVkFMSURfUElEID0gKHBpZF90KS0xOworICAgIC8vIHRoaXMgdGlkIGlzIGFsbG93ZWQgdG8gY2FsbCBzZXRWb2x1bWUoKSB3aXRob3V0IGFjcXVpcmluZyB0aGUgbXV0ZXguCisgICAgcGlkX3QgbVNldFZvbHVtZVJlZW50cmFudFRpZCA9IElOVkFMSURfUElEOworCisgICAgLy8gQXVkaW8gcG9saWN5IGVmZmVjdCBzdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8gTXV0ZXggcHJvdGVjdGluZyB0cmFuc2FjdGlvbnMgd2l0aCBhdWRpbyBwb2xpY3kgbWFuYWdlciBhcyBtTG9jayBjYW5ub3QKKyAgICAvLyBiZSBoZWxkIHRvIGF2b2lkIGNyb3NzIGRlYWRsb2NrcyB3aXRoIGF1ZGlvIHBvbGljeSBtdXRleAorICAgIE11dGV4ICAgbVBvbGljeUxvY2s7CisgICAgLy8gRWZmZWN0IGlzIHJlZ2lzdGVyZWQgaW4gQVBNIG9yIG5vdAorICAgIGJvb2wgICAgbVBvbGljeVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAvLyBFZmZlY3QgZW5hYmxlZCBzdGF0ZSBjb21tdW5pY2F0ZWQgdG8gQVBNLiBFbmFibGVkIHN0YXRlIGNvcnJlc3BvbmRzIHRvCisgICAgLy8gc3RhdGUgcmVxdWVzdGVkIGJ5IHRoZSBFZmZlY3RIYW5kbGUgd2l0aCBjb250cm9sCisgICAgYm9vbCAgICBtUG9saWN5RW5hYmxlZCA9IGZhbHNlOwogfTsKIAogLy8gVGhlIEVmZmVjdEhhbmRsZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJRWZmZWN0IGludGVyZmFjZS4gSXQgcHJvdmlkZXMgcmVzb3VyY2VzCkBAIC0zMDYsNiArMzQ2LDcgQEAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tSWRfbChpbnQgaWQpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbVR5cGVfbChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldEVmZmVjdElkcygpOwogICAgIC8vIEZJWE1FIHVzZSBmbG9hdCB0byBpbXByb3ZlIHRoZSBkeW5hbWljIHJhbmdlCiAgICAgYm9vbCBzZXRWb2x1bWVfbCh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGZvcmNlID0gZmFsc2UpOwogICAgIHZvaWQgcmVzZXRWb2x1bWVfbCgpOwpAQCAtMzUzLDYgKzM5NCw3IEBACiAKICAgICAvLyBBdCBsZWFzdCBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpbiB0aGUgY2hhaW4gaXMgZW5hYmxlZAogICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVuYWJsZWQoKTsKKyAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFbmFibGVkX2woKTsKIAogICAgIHZvaWQgc3luY0hhbEVmZmVjdHNTdGF0ZSgpOwogCkBAIC00MDMsNiArNDQ1LDggQEAKIAogICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpOwogCisgICAgdm9pZCBzZXRWb2x1bWVGb3JPdXRwdXRfbCh1aW50MzJfdCBsZWZ0LCB1aW50MzJfdCByaWdodCk7CisKICAgICAgICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAogICAgIG11dGFibGUgIE11dGV4IG1Mb2NrOyAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAogICAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAppbmRleCBkMDYzNzcyLi5kNmQ2ZTI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KQEAgLTE1Myw3ICsxNTQsNyBAQAogICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gLTE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIH0KLQorICAgIGR1bXBTdGF0ZS0+bVNpbGVuY2VkID0gY3VycmVudC0+bVNpbGVuY2VDYXB0dXJlOwogfQogCiB2b2lkIEZhc3RDYXB0dXJlOjpvbldvcmsoKQpAQCAtMTYxLDcgKzE2MiwyMSBAQAogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKLSAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXI7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworCisgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IH4wOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCBjYXVzZSBhbnkgaXNzdWVzIGlmIHdlIGp1c3QgZ2V0IGEgc21hbGwgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1JbnB1dFNvdXJjZSAhPSBOVUxMKTsKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CkBAIC0xOTIsMTIgKzIwOCwyMiBAQAogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1SZWFkQnVmZmVyU3RhdGUgPiAwKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+bVNpbGVuY2VDYXB0dXJlKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1SZWFkQnVmZmVyLCAwLCBtUmVhZEJ1ZmZlclN0YXRlICogRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtUGlwZVNpbmstPndyaXRlKG1SZWFkQnVmZmVyLCBtUmVhZEJ1ZmZlclN0YXRlKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc3VwcG9ydHMgYXQgbW9zdCBvbmUgZmFzdCBjYXB0dXJlIGNsaWVudC4KLSAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAotICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gY3VycmVudC0+bUNibGs7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICBpZiAoZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBmYXN0IHRyYWNrIGlzIGEgcGF0Y2ggcmVjb3JkLCB1cGRhdGUgdGhlIGNibGsgYnkKKyAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHJlbGVhc2VCdWZmZXIoKS4KKyAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KHBhdGNoQnVmZmVyLnJhdywgY3VycmVudC0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyLCBtRm9ybWF0Lm1Gb3JtYXQsIGZyYW1lc1dyaXR0ZW4gKiBtRm9ybWF0Lm1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgIGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZwYXRjaEJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc3VwcG9ydHMgYXQgbW9zdCBvbmUgZmFzdCBjYXB0dXJlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOwogICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoZnJhbWVzV3JpdHRlbiArIHJlYXIsICZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOwogICAgICAgICAgICAgICAgIGNibGstPm1TZXJ2ZXIgKz0gZnJhbWVzV3JpdHRlbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwCmluZGV4IDUzZWViYTUuLmI4YjM4NjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcApAQCAtNDQsMTAgKzQ0LDExIEBACiAgICAgZG91YmxlIHBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gbVNhbXBsZVJhdGU7CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdENhcHR1cmUgY29tbWFuZD0lcyByZWFkU2VxdWVuY2U9JXUgZnJhbWVzUmVhZD0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHJlYWRFcnJvcnM9JXUgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dVxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldSBwZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXUgcGVyaW9kPSUuMmYgbXNcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBzaWxlbmNlZDogJXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKG1Db21tYW5kKSwgbVJlYWRTZXF1ZW5jZSwgbUZyYW1lc1JlYWQsCiAgICAgICAgICAgICAgICAgbVJlYWRFcnJvcnMsIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKLSAgICAgICAgICAgICAgICBwZXJpb2RTZWMgKiAxZTMpOworICAgICAgICAgICAgICAgIHBlcmlvZFNlYyAqIDFlMywgbVNpbGVuY2VkID8gInRydWUiIDogImZhbHNlIik7CiB9CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oCmluZGV4IDZmOWM0YzMuLmExYjg3MDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oCkBAIC0zNSw2ICszNSw3IEBACiAgICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCiAgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CiAgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7CisgICAgYm9vbCAgICAgbVNpbGVuY2VkID0gZmFsc2U7IC8vIGNhcHR1cmUgaXMgc2lsZW5jZWQKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAppbmRleCA5YmNhMmQ0Li5mOTQ5Mjc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKQEAgLTM3LDYgKzM4LDEyIEBACiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAorICAgIGF1ZGlvX2Zvcm1hdF90ICBtRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gbnVsbHB0cjsgICAvLyBhIHJlZmVyZW5jZSB0byBhIHBhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgaW4gZmFzdCBtb2RlCisgICAgYm9vbCAgICAgICAgICAgIG1TaWxlbmNlQ2FwdHVyZSA9IGZhbHNlOyAgICAvLyByZXF1ZXN0IHRvIHNpbGVuY2UgY2FwdHVyZSBmb3IgZmFzdCB0cmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGU6IHRoaXMgYWxzbyBzaWxlbmNlcyB0aGUgbm9ybWFsIG1peGVyIHBpcGUKKwogICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCiAgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggNzliYjlmZS4uYzViOTk1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTMyLDEzICszMiwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+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+aXNEcmFpbmVkKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtQ2xpZW50UHJveHktPmdldFRpbWVzdGFtcCgmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzLCB0aGUgdGltZXN0YW1wIExPQ0FUSU9OX1NFUlZFUiBhbmQgTE9DQVRJT05fS0VSTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyB3aWxsIGJlIHByb3Blcmx5IGZpbGxlZC4gSWYgZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gYSBkZWZhdWx0IGluaXRpYWxpemVkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRoIG1UaW1lTnNbXSBmaWxsZWQgd2l0aCAtMSdzKSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLApAQCAtMjU3LDYgKzM1NCw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisKICAgICAvKiogQXR0cmlidXRlcyBvZiB0aGUgc291cmNlIHRyYWNrcy4KICAgICAgKgogICAgICAqIFRoaXMgbWVtYmVyIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBtVHJhY2tNZXRhZGF0YXNNdXRleCB0YWtlbi4KQEAgLTI3NCw3ICszNzIsNyBAQAogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjawogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMjg1LDcgKzM4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CkBAIC0zMDEsMTIgKzQwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHJlc3RhcnRJZkRpc2FibGVkKCk7CiAKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCAzN2I4ZjkxLi5jODM5N2NkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLApAQCAtODUsNyArODYsNyBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgc2V0T3ZlcmZsb3coKSB7IGJvb2wgdG1wID0gbU92ZXJmbG93OyBtT3ZlcmZsb3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CkBAIC05NywxMiArOTgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgaWYgKCFpc1BhdGNoVHJhY2soKSkgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWQoKSBjb25zdDsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIHN0YXRpYyAgYm9vbCAgICAgICAgY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtU3RhdGUKIApAQCAtMTQxLDcgKzE1Myw3IEBACiB9OwogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFJlY29yZCA6IHZpcnR1YWwgcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoUmVjb3JkIDogcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hUcmFja0Jhc2UgewogcHVibGljOgogCiAgICAgUGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCkBAIC0xNTEsNyArMTYzLDggQEAKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoUmVjb3JkKCk7CiAKICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtMTYyLDExICsxNzUsNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8Q2xpZW50UHJveHk+ICAgICAgICAgICAgIG1Qcm94eTsKLSAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eTsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0OwogfTsgIC8vIGVuZCBvZiBQYXRjaFJlY29yZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI2N2VhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0KLS8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCi0gKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0Ci0gKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCi0gKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAotICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotCi0vLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQotLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCi0vLyBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gdmFsaWRhdGUgYmluZGVyIGludGVyZmFjZSBjYWxscyB3aXRoaW4gYXVkaW9zZXJ2ZXIKLS8vIChlLmcuIEF1ZGlvUG9saWN5TWFuYWdlciB0byBBdWRpb0ZsaW5nZXIpLgotcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLQotLy8gQSB0cnVzdGVkIGNhbGxpbmcgVUlEIG1heSBzcGVjaWZ5IHRoZSBjbGllbnQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGwuCi0vLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCi1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKSB7Ci0gICAgc3dpdGNoICh1aWQpIHsKLSAgICBjYXNlIEFJRF9NRURJQToKLSAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOwotICAgIH0KLSAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgotICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCi0gICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCi0gICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucwotICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KLSAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKLSAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCi0gICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKLSAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKLSAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZwotICAgIH0KLSAgICByZXR1cm4gcGFja2FnZXNbMF07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290KHVpZF90IHVpZCkgewotICAgIC8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgdW5mb3JrZWQgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgotICAgIHJldHVybiB1aWQgPT0gQUlEX1JPT1QgfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUiA7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybiB0cnVlOwotCi0gICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCi0gICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCi0gICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBpZiAoc3RhcnQpIHsKLSAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCi0gICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhcHBPcHMubm90ZU9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Ci19Ci0KLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Ci19Ci0KLXZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuOwotCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGFwcE9wcy5maW5pc2hPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpOwotfQotCi1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7Ci0KLSAgICBpZiAob2spIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7Ci0gICAgfQotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGR1bXBBbGxvd2VkKCkgewotICAgIC8vIGRvbid0IG9wdGltaXplIGZvciBzYW1lIHBpZCwgc2luY2UgbWVkaWFzZXJ2ZXIgbmV2ZXIgZHVtcHMgaXRzZWxmCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7Ci0gICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQotICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NTZiMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBzeXN0ZW0gc2VydmljZXMuCi0vLyBXZSBhbGxvdyB0aGF0IHNvbWUgc2VydmljZXMgbWlnaHQgaGF2ZSBzZXBhcmF0ZSBwcm9jZXNzZXMgdG8KLS8vIGhhbmRsZSBtdWx0aXBsZSB1c2VycywgZS5nLiB1MTBfc3lzdGVtLCB1MTBfYmx1ZXRvb3RoLCB1MTBfcmFkaW8uCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgewotICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKLX0KLQotZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7Ci1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwotYm9vbCBkdW1wQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggNDk5MzQyMC4uODczMjI3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpAQCAtMzYsMTAgKzM4LDEzIEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NhZmVfbWF0aC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTU0LDYgKzU5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KIAorI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgpAQCAtNjIsOCArNjgsOCBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgpAQCAtNzEsNyArNzcsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKIApAQCAtMjAwLDcgKzIwNiw3IEBACiAvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KIC8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAogLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHg0MDAwOworc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4RDAwMDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMzMsOSArMzM5LDkgQEAKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKIHByaXZhdGU6CiAgICAgVGhyZWFkQ3B1VXNhZ2UgbUNwdVVzYWdlOyAgICAgICAgICAgLy8gaW5zdGFudGFuZW91cyB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVdjU3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCiAKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIG1IelN0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gY3ljbGVzCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcwogCiAgICAgaW50IG1DcHVOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkJ3MgY3VycmVudCBDUFUgbnVtYmVyCiAgICAgaW50IG1DcHVrSHo7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlcXVlbmN5IG9mIHRocmVhZCdzIGN1cnJlbnQgQ1BVIGluIGtIegpAQCAtMzYxLDcgKzM2Nyw3IEBACiAKICAgICAvLyByZWNvcmQgc2FtcGxlIGZvciB3YWxsIGNsb2NrIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgbVdjU3RhdHMuc2FtcGxlKHdjTnMpOworICAgICAgICBtV2NTdGF0cy5hZGQod2NOcyk7CiAgICAgfQogCiAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IENQVSBudW1iZXIKQEAgLTM4MCwyNiArMzg2LDI2IEBACiAKICAgICAvLyBpZiBubyBjaGFuZ2UgaW4gQ1BVIG51bWJlciBvciBmcmVxdWVuY3ksIHRoZW4gcmVjb3JkIHNhbXBsZSBmb3IgY3ljbGUgc3RhdGlzdGljcwogICAgIGlmICh2YWxpZCAmJiBtQ3B1a0h6ID4gMCkgewotICAgICAgICBkb3VibGUgY3ljbGVzID0gd2NOcyAqIGNwdWtIeiAqIDAuMDAwMDAxOwotICAgICAgICBtSHpTdGF0cy5zYW1wbGUoY3ljbGVzKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKKyAgICAgICAgbUh6U3RhdHMuYWRkKGN5Y2xlcyk7CiAgICAgfQogCi0gICAgdW5zaWduZWQgbiA9IG1XY1N0YXRzLm4oKTsKKyAgICBjb25zdCB1bnNpZ25lZCBuID0gbVdjU3RhdHMuZ2V0TigpOwogICAgIC8vIG1DcHVVc2FnZS5lbGFwc2VkKCkgaXMgZXhwZW5zaXZlLCBzbyBkb24ndCBjYWxsIGl0IGV2ZXJ5IGxvb3AKICAgICBpZiAoKG4gJiAxMjcpID09IDEpIHsKLSAgICAgICAgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgZWxhcHNlZCA9IG1DcHVVc2FnZS5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgewotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AgPSBlbGFwc2VkIC8gKGRvdWJsZSkgbjsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wMTAwID0gcGVyTG9vcCAqIDAuMDE7Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDFrID0gcGVyTG9vcCAqIDAuMDAxOwotICAgICAgICAgICAgZG91YmxlIG1lYW4gPSBtV2NTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2ID0gbVdjU3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluaW11bSA9IG1XY1N0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMubWF4aW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5tZWFuKCk7Ci0gICAgICAgICAgICBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuc3RkZGV2KCk7Ci0gICAgICAgICAgICBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMubWluaW11bSgpOwotICAgICAgICAgICAgZG91YmxlIG1heEN5Y2xlcyA9IG1IelN0YXRzLm1heGltdW0oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFuID0gbVdjU3RhdHMuZ2V0TWVhbigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLmdldFN0ZERldigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhpbXVtID0gbVdjU3RhdHMuZ2V0TWF4KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbkN5Y2xlcyA9IG1IelN0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXZDeWNsZXMgPSBtSHpTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5nZXRNYXgoKTsKICAgICAgICAgICAgIG1DcHVVc2FnZS5yZXNldEVsYXBzZWQoKTsKICAgICAgICAgICAgIG1XY1N0YXRzLnJlc2V0KCk7CiAgICAgICAgICAgICBtSHpTdGF0cy5yZXNldCgpOwpAQCAtNDUzLDUwICs0NTksNiBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgZGV2aWNlc1RvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0ZDo6c3RyaW5nIGlucHV0RmxhZ3NUb1N0cmluZyhhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhmbGFncywgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBvdXRwdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgY2hhciAqc291cmNlVG9TdHJpbmcoYXVkaW9fc291cmNlX3Qgc291cmNlKQotewotICAgIHN3aXRjaCAoc291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDogICAgICAgICAgICAgIHJldHVybiAiZGVmYXVsdCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOiAgICAgICAgICAgICAgICAgIHJldHVybiAibWljIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6ICAgICAgICAgcmV0dXJuICJ2b2ljZSB1cGxpbmsiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOiAgICAgICByZXR1cm4gInZvaWNlIGRvd25saW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOiAgICAgICAgICAgcmV0dXJuICJ2b2ljZSBjYWxsIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6ICAgICAgICAgICAgcmV0dXJuICJjYW1jb3JkZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOiAgICByZXR1cm4gInZvaWNlIHJlY29nbml0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOiAgcmV0dXJuICJ2b2ljZSBjb21tdW5pY2F0aW9uIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOiAgICAgICAgcmV0dXJuICJyZW1vdGUgc3VibWl4IjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDogICAgICAgICAgcmV0dXJuICJ1bnByb2Nlc3NlZCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6ICAgICAgICAgICAgIHJldHVybiAiRk0gdHVuZXIiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6ICAgICAgICAgICAgICByZXR1cm4gImhvdHdvcmQiOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwotICAgIH0KLX0KLQogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLApAQCAtNTI4LDYgKzQ5MCw4IEBACiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwogICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICB9CisKKyAgICBzZW5kU3RhdGlzdGljcyh0cnVlIC8qIGZvcmNlICovKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWFkeVRvUnVuKCkKQEAgLTYwMiwxNiArNTY2LDI3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc2VuZElvQ29uZmlnRXZlbnRfbChldmVudCwgcGlkKTsKKyAgICBzZW5kSW9Db25maWdFdmVudF9sKGV2ZW50LCBwaWQsIHBvcnRJZCk7CiB9CiAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkKTsKKyAgICAvLyBUaGUgYXVkaW8gc3RhdGlzdGljcyBoaXN0b3J5IGlzIGV4cG9uZW50aWFsbHkgd2VpZ2h0ZWQgdG8gZm9yZ2V0IGV2ZW50cworICAgIC8vIGFib3V0IGZpdmUgb3IgbW9yZSBzZWNvbmRzIGluIHRoZSBwYXN0LiAgSW4gb3JkZXIgdG8gaGF2ZQorICAgIC8vIGNyaXNwZXIgc3RhdGlzdGljcyBmb3IgbWVkaWFtZXRyaWNzLCB3ZSByZXNldCB0aGUgc3RhdGlzdGljcyBvbgorICAgIC8vIGFuIElvQ29uZmlnRXZlbnQsIHRvIHJlZmxlY3QgZGlmZmVyZW50IHByb3BlcnRpZXMgZm9yIGEgbmV3IGRldmljZS4KKyAgICBtSW9KaXR0ZXJNcy5yZXNldCgpOworICAgIG1MYXRlbmN5TXMucmVzZXQoKTsKKyAgICBtUHJvY2Vzc1RpbWVNcy5yZXNldCgpOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkLCBwb3J0SWQpOwogICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIApAQCAtNjk0LDcgKzY2OSw3IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7CiAgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChJb0NvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKLSAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QaWQpOworICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGRhdGEtPm1FdmVudCwgZGF0YS0+bVBpZCwgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVI6IHsKICAgICAgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CkBAIC03MTEsOCArNjg2LDggQEAKICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaF9sKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2UoKTsKICAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coIkNGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0g6IG9sZCBkZXZpY2UgJSN4ICglcykgbmV3IGRldmljZSAlI3ggKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIGRldmljZXNUb1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIGRldmljZXNUb1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCB0b1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIHRvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2UoKTsKQEAgLTcyMSw4ICs2OTYsOCBAQAogICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaF9sKGRhdGEtPm1IYW5kbGUpOwogICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZSgpOwogICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygiQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IG9sZCBkZXZpY2UgJSN4ICglcykgbmV3IGRldmljZSAlI3ggKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIGRldmljZXNUb1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIGRldmljZXNUb1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCB0b1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIHRvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInByb2Nlc3NDb25maWdFdmVudHNfbCgpIHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC03NDksNiArNzI0LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obWFzayk7CiAKICAgICBzd2l0Y2ggKHJlcHJlc2VudGF0aW9uKSB7CisgICAgLy8gVHJhdmVsIGFsbCBzaW5nbGUgYml0IGNoYW5uZWwgbWFzayB0byBjb252ZXJ0IGNoYW5uZWwgbWFzayB0byBzdHJpbmcuCiAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7CiAgICAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCkgcy5hcHBlbmQoImZyb250LWxlZnQsICIpOwpAQCAtNzY5LDYgKzc0NSwxMCBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUKSBzLmFwcGVuZCgidG9wLWJhY2stbGVmdCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoInRvcC1iYWNrLWNlbnRlciwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1sZWZ0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX1JJR0hUKSBzLmFwcGVuZCgidG9wLXNpZGUtcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0IpIHMuYXBwZW5kKCJoYXB0aWMtQiwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSkgcy5hcHBlbmQoImhhcHRpYy1BLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOwpAQCAtNzgzLDYgKzc2MywxMiBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0NFTlRFUikgcy5hcHBlbmQoImNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCkgcy5hcHBlbmQoInRvcC1sZWZ0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX1JJR0hUKSBzLmFwcGVuZCgidG9wLXJpZ2h0LCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CkBAIC04MDQsMTIgKzc5MCw4IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgZHByaW50ZihmZCwgIlxuJXMgdGhyZWFkICVwLCBuYW1lICVzLCB0aWQgJWQsIHR5cGUgJWQgKCVzKTpcbiIsIGlzT3V0cHV0KCkgPyAiT3V0cHV0IiA6ICJJbnB1dCIsCiAgICAgICAgICAgICB0aGlzLCBtVGhyZWFkTmFtZSwgZ2V0VGlkKCksIHR5cGUoKSwgdGhyZWFkVHlwZVRvU3RyaW5nKHR5cGUoKSkpOwogCkBAIC04MTgsNiArODAwLDIxIEBACiAgICAgICAgIGRwcmludGYoZmQsICIgIFRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CiAgICAgfQogCisgICAgZHVtcEJhc2VfbChmZCwgYXJncyk7CisgICAgZHVtcEludGVybmFsc19sKGZkLCBhcmdzKTsKKyAgICBkdW1wVHJhY2tzX2woZmQsIGFyZ3MpOworICAgIGR1bXBFZmZlY3RDaGFpbnNfbChmZCwgYXJncyk7CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOworICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQorewogICAgIGRwcmludGYoZmQsICIgIEkvTyBoYW5kbGU6ICVkXG4iLCBtSWQpOwogICAgIGRwcmludGYoZmQsICIgIFN0YW5kYnk6ICVzXG4iLCBtU3RhbmRieSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgZHByaW50ZihmZCwgIiAgU2FtcGxlIHJhdGU6ICV1IEh6XG4iLCBtU2FtcGxlUmF0ZSk7CkBAIC04MzIsNiArODI5LDggQEAKICAgICBkcHJpbnRmKGZkLCAiICBQZW5kaW5nIGNvbmZpZyBldmVudHM6Iik7CiAgICAgc2l6ZV90IG51bUNvbmZpZyA9IG1Db25maWdFdmVudHMuc2l6ZSgpOwogICAgIGlmIChudW1Db25maWcpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbmZpZzsgaSsrKSB7CiAgICAgICAgICAgICBtQ29uZmlnRXZlbnRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4gICAgJXMiLCBidWZmZXIpOwpAQCAtODQxLDIwICs4NDAsNDcgQEAKICAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CiAgICAgLy8gTm90ZTogb3V0cHV0IGRldmljZSBtYXkgYmUgdXNlZCBieSBjYXB0dXJlIHRocmVhZHMgZm9yIGVmZmVjdHMgc3VjaCBhcyBBRUMuCi0gICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIGRldmljZXNUb1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIGRldmljZXNUb1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCBzb3VyY2VUb1N0cmluZyhtQXVkaW9Tb3VyY2UpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBPdXRwdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbU91dERldmljZSwgdG9TdHJpbmcobU91dERldmljZSkuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCB0b1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCB0b1N0cmluZyhtQXVkaW9Tb3VyY2UpLmNfc3RyKCkpOwogCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAvLyBEdW1wIHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICBpZiAobVR5cGUgPT0gUkVDT1JECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgfQorCisgICAgaWYgKG1MYXN0SW9CZWdpbk5zID4gMCkgeyAvLyBNTUFQIG1heSBub3Qgc2V0IHRoaXMKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTGFzdCAlcyBvY2N1cnJlZCAobXNlY3MpOiAlbGxkXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIChzeXN0ZW1UaW1lKCkgLSBtTGFzdElvQmVnaW5OcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc1RpbWVNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFByb2Nlc3MgdGltZSBtcyBzdGF0czogJXNcbiIsIG1Qcm9jZXNzVGltZU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKG1Jb0ppdHRlck1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsICVzIGppdHRlciBtcyBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAobUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRocmVhZGxvb3AgJXMgbGF0ZW5jeSBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICBzaXplX3QgbnVtRWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWlucy5zaXplKCk7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlenUgRWZmZWN0IENoYWluc1xuIiwgbnVtRWZmZWN0Q2hhaW5zKTsKQEAgLTEyODMsNyArMTMwOSw2IEBACiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOwogICAgIGJvb2wgY2hhaW5DcmVhdGVkID0gZmFsc2U7CiAgICAgYm9vbCBlZmZlY3RDcmVhdGVkID0gZmFsc2U7Ci0gICAgYm9vbCBlZmZlY3RSZWdpc3RlcmVkID0gZmFsc2U7CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgZWZmZWN0SWQgPSBBVURJT19VTklRVUVfSURfVVNFX1VOU1BFQ0lGSUVEOwogCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwpAQCAtMTMxOSwxMyArMTM0NCw2IEBACiAKICAgICAgICAgaWYgKGVmZmVjdCA9PSAwKSB7CiAgICAgICAgICAgICBlZmZlY3RJZCA9IG1BdWRpb0ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7Ci0gICAgICAgICAgICAvLyBDaGVjayBDUFUgYW5kIG1lbW9yeSB1c2FnZQotICAgICAgICAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgZGVzYywgbUlkLCBjaGFpbi0+c3RyYXRlZ3koKSwgc2Vzc2lvbklkLCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdFJlZ2lzdGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGVmZmVjdCBtb2R1bGUgaWYgbm9uZSBwcmVzZW50IGluIHRoZSBjaGFpbgogICAgICAgICAgICAgbFN0YXR1cyA9IGNoYWluLT5jcmVhdGVFZmZlY3RfbChlZmZlY3QsIHRoaXMsIGRlc2MsIGVmZmVjdElkLCBzZXNzaW9uSWQsIHBpbm5lZCk7CiAgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMTM1NSw5ICsxMzczLDYgQEAKICAgICAgICAgaWYgKGVmZmVjdENyZWF0ZWQpIHsKICAgICAgICAgICAgIGNoYWluLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlZmZlY3RSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3RJZCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKGNoYWluQ3JlYXRlZCkgewogICAgICAgICAgICAgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjaGFpbik7CiAgICAgICAgIH0KQEAgLTEzODgsNyArMTQwMyw2IEBACiAgICAgfQogICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgbUF1ZGlvRmxpbmdlci0+dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGVmZmVjdCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CiAgICAgICAgIGlmIChoYW5kbGUtPmVuYWJsZWQoKSkgewogICAgICAgICAgICAgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOwogICAgICAgICB9CkBAIC0xNDA5LDYgKzE0MjMsMTIgQEAKICAgICByZXR1cm4gY2hhaW4gIT0gMCA/IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbChlZmZlY3RJZCkgOiAwOwogfQogCitzdGQ6OnZlY3RvcjxpbnQ+IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0RWZmZWN0SWRzX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKK3sKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgcmV0dXJuIGNoYWluICE9IG51bGxwdHIgPyBjaGFpbi0+Z2V0RWZmZWN0SWRzKCkgOiBzdGQ6OnZlY3RvcjxpbnQ+e307Cit9CisKIC8vIFBsYXliYWNrVGhyZWFkOjphZGRFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQKIC8vIFBsYXliYWNrVGhyZWFkOjptTG9jayBoZWxkCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKQEAgLTE1MTksNyArMTUzOSw3IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewogICAgIGNvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CiAgICAgY29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1JZDsKQEAgLTE1NzEsNiArMTU5MSw5IEBACiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCiAgICAgbUhhc0NoYW5nZWQgPSB0cnVlOworI2lmZGVmIFRFRV9TSU5LCisgICAgdHJhY2stPmR1bXBUZWUoLTEgLyogZmQgKi8sICJfUkVNT1ZFIik7CisjZW5kaWYKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKQEAgLTE2NDUsNiArMTY2OCw2NSBAQAogICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwogfQogCisvLyBDYWxsIG9ubHkgZnJvbSB0aHJlYWRMb29wKCkgb3Igd2hlbiBpdCBpcyBpZGxlLgorLy8gRG8gbm90IGNhbGwgZnJvbSBoaWdoIHBlcmZvcm1hbmNlIGNvZGUgYXMgdGhpcyBtYXkgZG8gYmluZGVyIHJwYyB0byB0aGUgTWVkaWFNZXRyaWNzIHNlcnZpY2UuCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFN0YXRpc3RpY3MoYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBEbyBub3QgbG9nIGlmIHdlIGhhdmUgbm8gc3RhdHMuCisgICAgLy8gV2UgY2hvb3NlIHRoZSB0aW1lc3RhbXAgdmVyaWZpZXIgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBsaWtlbHkgaXRlbSB0byBiZSBwcmVzZW50LgorICAgIGNvbnN0IGludDY0X3QgbnN0YXRzID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldE4oKSAtIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck47CisgICAgaWYgKG5zdGF0cyA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEb24ndCBsb2cgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBwZXIgMTIgaG91cnMuCisgICAgLy8gV2UgdXNlIEJPT1RUSU1FIHRvIGluY2x1ZGUgc3VzcGVuZCB0aW1lLgorICAgIGNvbnN0IGludDY0X3QgdGltZU5zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CisgICAgY29uc3QgaW50NjRfdCBzaW5jZU5zID0gdGltZU5zIC0gbUxhc3RSZWNvcmRlZFRpbWVOczsgLy8gb2sgaWYgbUxhc3RSZWNvcmRlZFRpbWVOcyA9IDAKKyAgICBpZiAoIWZvcmNlICYmIHNpbmNlTnMgPD0gMTIgKiBOQU5PU19QRVJfSE9VUikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTiA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXROKCk7CisgICAgbUxhc3RSZWNvcmRlZFRpbWVOcyA9IHRpbWVOczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdGhyZWFkIikpOworCisjZGVmaW5lIE1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KKworICAgIC8vIHRocmVhZCBjb25maWd1cmF0aW9uCisgICAgaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJpZCIsIChpbnQzMl90KW1JZCk7IC8vIElPIGhhbmRsZQorICAgIC8vIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpbVBvcnRJZCk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLCB0aHJlYWRUeXBlVG9TdHJpbmcobVR5cGUpKTsKKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZVJhdGUiLCAoaW50MzJfdCltU2FtcGxlUmF0ZSk7CisgICAgaXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJjaGFubmVsTWFzayIsIChpbnQ2NF90KW1DaGFubmVsTWFzayk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSk7CisgICAgaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpbUZyYW1lQ291bnQpOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJvdXREZXZpY2UiLCB0b1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiaW5EZXZpY2UiLCB0b1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOworCisgICAgLy8gdGhyZWFkIHN0YXRpc3RpY3MKKyAgICBpZiAobUlvSml0dGVyTXMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLm1lYW4iLCBtSW9KaXR0ZXJNcy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLnN0ZCIsIG1Jb0ppdHRlck1zLmdldFN0ZERldigpKTsKKyAgICB9CisgICAgaWYgKG1Qcm9jZXNzVGltZU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5tZWFuIiwgbVByb2Nlc3NUaW1lTXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCBtUHJvY2Vzc1RpbWVNcy5nZXRTdGREZXYoKSk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gdHNqaXR0ZXIgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0Sml0dGVyTXMoKTsKKyAgICBpZiAodHNqaXR0ZXIuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5tZWFuIiwgdHNqaXR0ZXIuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgdHNqaXR0ZXIuZ2V0U3RkRGV2KCkpOworICAgIH0KKyAgICBpZiAobUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgbUxhdGVuY3lNcy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMuc3RkIiwgbUxhdGVuY3lNcy5nZXRTdGREZXYoKSk7CisgICAgfQorCisgICAgaXRlbS0+c2VsZnJlY29yZCgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjc0LDcgKzE3NTYsNyBAQAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1UcmFja3ModHlwZSA9PSBNSVhFUiksCiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKLSAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAorICAgICAgICBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAogICAgICAgICBtTWl4ZXJTdGF0dXMoTUlYRVJfSURMRSksCiAgICAgICAgIG1NaXhlclN0YXR1c0lnbm9yaW5nRmFzdFRyYWNrcyhNSVhFUl9JRExFKSwKICAgICAgICAgbVN0YW5kYnlEZWxheU5zKEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyksCkBAIC0xNzA5LDEwICsxNzkxLDIxIEBACiAgICAgICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT5jYW5TZXRNYXN0ZXJNdXRlKCkpIHsKICAgICAgICAgICAgIG1NYXN0ZXJNdXRlID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1PdXRwdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CiAKICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX09VVF9CVVMsIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgIGlmICh0eXBlID09IE1JWEVSIHx8IHR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfb3V0cHV0X2RldmljZXMiLAorICAgICAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfT1VUX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgIH0KKwogICAgIC8vICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKICAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewpAQCAtMTczMiwxNiArMTgyNSwyNCBAQAogICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCisvLyBUaHJlYWQgdmlydHVhbHMKKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKLSAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKLSAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKLSAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKLSAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CisgICAgcnVuKG1UaHJlYWROYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCisvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnByZUV4aXQoKQoreworICAgIEFMT0dWKCIgIHByZUV4aXQoKSIpOworICAgIC8vIEZJWE1FIHRoaXMgaXMgdXNpbmcgaGFyZC1jb2RlZCBzdHJpbmdzIGJ1dCBpbiB0aGUgZnV0dXJlLCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZQorICAgIC8vICAgICAgIGNvbnZlcnRlZCB0byB1c2UgYXVkaW8gSEFMIGV4dGVuc2lvbnMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0dW5uZWxpbmcKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMoU3RyaW5nOCgiZXhpdGluZz0xIikpOworICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzIG9uIGV4aXQ6ICVkIiwgcmVzdWx0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIFN0cmluZzggcmVzdWx0OwogCkBAIC0xNzczLDcgKzE4NzQsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTc5Myw3ICsxODk0LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC0xODA2LDEzICsxOTA3LDE0IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwotCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG11dGU6ICVzXG4iLCBtTWFzdGVyTXV0ZSA/ICJvbiIgOiAib2ZmIik7CisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFwdGljIGNoYW5uZWwgbWFzazogJSN4ICglcylcbiIsIG1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFza1RvU3RyaW5nKG1IYXB0aWNDaGFubmVsTWFzaywgdHJ1ZSAvKiBvdXRwdXQgKi8pLmNfc3RyKCkpOworICAgIH0KICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CiAgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgRGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKQEAgLTE4MjUsNyArMTkyNyw3IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIG91dHB1dCwgZmxhZ3MsIG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgICAgICAgICAgb3V0cHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyB3cml0dGVuOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdXNwZW5kZWQgZnJhbWVzOiAlbGxkXG4iLCAobG9uZyBsb25nKW1TdXNwZW5kZWRGcmFtZXMpOwogICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgewpAQCAtMTgzNywyMyArMTkzOSw2IEBACiAgICAgfQogfQogCi0vLyBUaHJlYWQgdmlydHVhbHMKLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4obVRocmVhZE5hbWUsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKLX0KLQotLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpwcmVFeGl0KCkKLXsKLSAgICBBTE9HVigiICBwcmVFeGl0KCkiKTsKLSAgICAvLyBGSVhNRSB0aGlzIGlzIHVzaW5nIGhhcmQtY29kZWQgc3RyaW5ncyBidXQgaW4gdGhlIGZ1dHVyZSwgdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUKLSAgICAvLyAgICAgICBjb252ZXJ0ZWQgdG8gdXNlIGF1ZGlvIEhBTCBleHRlbnNpb25zIHJlcXVpcmVkIHRvIHN1cHBvcnQgdHVubmVsaW5nCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKLSAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgcGFyYW1ldGVycyBvbiBleGl0OiAlZCIsIHJlc3VsdCk7Ci19Ci0KIC8vIFBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKQEAgLTE4NjksNiArMTk1NCw3IEBACiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCkBAIC0xODgwLDExICsxOTY2LDE3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgY2hlY2tJTWVtb3J5KHNoYXJlZEJ1ZmZlcikgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTE5MDUsNyArMTk5Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQogICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKLSAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSAobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSB8fAogICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIHx8CiAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJiYgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAqLykpICYmCkBAIC0yMDQzLDkgKzIxMzUsMTUgQEAKICAgICAgICAgICAgIC8vIG5vdGlmeSBldmVyeSBIQUwgYnVmZmVyLCByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSB0cmFjayBidWZmZXIKICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GcmFtZUNvdW50OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIG5vcm1hbCB0cmFja3MsIHVzZSBhdCBsZWFzdCBkb3VibGUtYnVmZmVyaW5nIGlmIG5vIHNhbXBsZSByYXRlIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAvLyBvciBhdCBsZWFzdCB0cmlwbGUtYnVmZmVyaW5nIGlmIHRoZXJlIGlzIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAgICAgICAgIGNvbnN0IGludCBuQnVmZmVyaW5nID0gc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSA/IDIgOiAzOworICAgICAgICAgICAgLy8gVHJpcGxlIGJ1ZmZlciB0aGUgbm90aWZpY2F0aW9uIHBlcmlvZCBmb3IgYSB0cmlwbGUgYnVmZmVyZWQgbWl4ZXIgcGVyaW9kOworICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkb3VibGUgYnVmZmVyaW5nIGZvciB0aGUgbm90aWZpY2F0aW9uIHBlcmlvZCBpcyBmaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIEF1ZGlvVHJhY2sgdG8gbW9kaWZ5IHRoZSBub3RpZmljYXRpb24gcGVyaW9kCisgICAgICAgICAgICAvLyBvbiBBdWRpb1RyYWNrOjpzZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjaGFuZ2VzLgorICAgICAgICAgICAgY29uc3QgaW50IG5CdWZmZXJpbmcgPQorICAgICAgICAgICAgICAgICAgICAodWludDY0X3R7ZnJhbWVDb3VudH0gKiBtU2FtcGxlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1aW50NjRfdHttTm9ybWFsRnJhbWVDb3VudH0gKiBzYW1wbGVSYXRlKSA9PSAzID8gMyA6IDI7CisKICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGZyYW1lQ291bnQgLyBuQnVmZmVyaW5nOwogICAgICAgICAgICAgLy8gSWYgY2xpZW50IHJlcXVlc3RlZCBhIGZhc3QgdHJhY2sgYnV0IHRoaXMgd2FzIGRlbmllZCwgdGhlbiB1c2UgdGhlIHNtYWxsZXIgbWF4aW11bS4KICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKQEAgLTIxNDAsNyArMjIzOCw3IEBACiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMjE3NCw0OCArMjI3MiwxNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCi17Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCi0gICAgICAgIGludCBuYW1lOwotICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgotICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICBuYW1lID0gKml0OwotICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCiB7Ci0gICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKLQotICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tJZHMpIHsKICAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja0lkcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAogICAgICAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCB3aGVuIE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKSBuZXh0IGNoYW5nZXMgbUF1ZGlvTWl4ZXIuCi0gICAgICAgICAgICBtRGVsZXRlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tJZHMuZW1wbGFjZSh0cmFja0lkKTsKICAgICAgICAgfQotCi0gICAgICAgIG1VbnVzZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKFQ6OlRSQUNLX05BTUVfUEVORElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgInZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG5vdCBpbiBtVHJhY2tzIChyZXR1cm5lZCAlemQpIiwgbmFtZSwgaW5kZXgpOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0yMjUxLDYgKzIzMTgsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKIHsKICAgICBpZiAoaXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMjg2LDYgKzIzNTgsMTEgQEAKICAgICByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldFZvbHVtZUZvck91dHB1dF9sKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSBjb25zdAoreworICAgIG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKK30KKwogLy8gYWRkVHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKQogewpAQCAtMjI5OCwxNSArMjM3NSwxMyBAQAogICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIHN0YXRlID0gdHJhY2stPm1TdGF0ZTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAvLyBhYm9ydCB0cmFjayB3YXMgc3RvcHBlZC9wYXVzZWQgd2hpbGUgd2UgcmVsZWFzZWQgdGhlIGxvY2sKICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSB0cmFjay0+bVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTIzMTksNiArMjM5NCw3IEBACiAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQogICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RhcnQpOwogI2VuZGlmCisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0NMSUVOVF9TVEFSVEVELCB0cmFjay0+Y3JlYXRvclBpZCgpLCB0cmFjay0+cG9ydElkKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc2V0IHJldHJ5IGNvdW50IGZvciBidWZmZXIgZmlsbApAQCAtMjMzNSw2ICsyNDExLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwID8gVHJhY2s6OkZTX0ZJTExFRCA6IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgaW50ZW5zaXR5ID0gQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8QXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90PihpbnRlbnNpdHkpKTsKKyAgICAgICAgICAgIC8vIEhhcHRpYyBwbGF5YmFjayBzaG91bGQgYmUgZW5hYmxlZCBieSB2aWJyYXRvciBzZXJ2aWNlLgorICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGUgaGFwdGljIHBsYXliYWNrIG9mIGFsbCBhY3RpdmUgdHJhY2sgdG8gZW5zdXJlIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBvbmUgdHJhY2sgcGxheWluZyBoYXB0aWMgaWYgY3VycmVudCB0cmFjayBzaG91bGQgcGxheSBoYXB0aWMuCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHRyYWNrLT5tUmVzZXREb25lID0gZmFsc2U7CiAgICAgICAgIHRyYWNrLT5tUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSAwOwogICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CkBAIC0yNDAwLDcgKzI0OTUsMTYgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgeworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtT3V0cHV0ID09IG51bGxwdHIgfHwgbU91dHB1dC0+c3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtT3V0cHV0LT5zdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7CiAKQEAgLTI0MTksNyArMjUyMywxMCBAQAogICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwogICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwogICAgICAgICBicmVhazsKLQorICAgIGNhc2UgQVVESU9fQ0xJRU5UX1NUQVJURUQ6CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKKyAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwpAQCAtMjQ1Nyw2ICsyNTY0LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyByZWplY3Qgb3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzCiAgICAgaWYgKChtRHJhaW5TZXF1ZW5jZSAmIDEpICYmIChzZXF1ZW5jZSA9PSBtRHJhaW5TZXF1ZW5jZSkpIHsKKyAgICAgICAgLy8gUmVnaXN0ZXIgZGlzY29udGludWl0eSB3aGVuIEhXIGRyYWluIGlzIGNvbXBsZXRlZCBiZWNhdXNlIHRoYXQgY2FuIGNhdXNlCisgICAgICAgIC8vIHRoZSB0aW1lc3RhbXAgZnJhbWUgcG9zaXRpb24gdG8gcmVzZXQgdG8gMCBmb3IgZGlyZWN0IGFuZCBvZmZsb2FkIHRocmVhZHMuCisgICAgICAgIC8vIChPdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMgYXJlIGlnbm9yZWQsIHNpbmNlIHRoZSBkaXNjb250aW51aXR5IHdvdWxkIGJlIGhhbmRsZWQKKyAgICAgICAgLy8gZWxzZXdoZXJlLCBlLmcuIGluIGZsdXNoKS4KKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKICAgICAgICAgbURyYWluU2VxdWVuY2UgJj0gfjE7CiAgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwogICAgIH0KQEAgLTI0NzYsNiArMjU4OCw3IEBACiAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKTsKICAgICB9CiAgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOworICAgIG1CYWxhbmNlLnNldENoYW5uZWxNYXNrKG1DaGFubmVsTWFzayk7CiAKICAgICAvLyBHZXQgYWN0dWFsIEhBTCBmb3JtYXQuCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRGb3JtYXQoJm1IQUxGb3JtYXQpOwpAQCAtMjU5NSw3ICsyNzA4LDcgQEAKICAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CiAgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKICAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCkgewotICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBhbHNvIHZhbGlkOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gbm8gbG9uZ2VyIHZhbGlkOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CkBAIC0yNjA5LDYgKzI3MjIsMTEgQEAKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CiAgICAgfQogCisgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIG1DaGFubmVsTWFzayAmPSB+bUhhcHRpY0NoYW5uZWxNYXNrOworICAgIG1IYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICBtQ2hhbm5lbENvdW50IC09IG1IYXB0aWNDaGFubmVsQ291bnQ7CisKICAgICAvLyBmb3JjZSByZWNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0IGNoYWlucyBhbmQgZW5naW5lcyB0byB0YWtlIG5ldyBidWZmZXIgc2l6ZSBhbmQgYXVkaW8KICAgICAvLyBwYXJhbWV0ZXJzIGludG8gYWNjb3VudAogICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKQEAgLTI2MTcsNyArMjczNSw4IEBACiAgICAgLy8gY3JlYXRlIGEgY29weSBvZiBtRWZmZWN0Q2hhaW5zIGFzIGNhbGxpbmcgbW92ZUVmZmVjdENoYWluX2woKSBjYW4gcmVvcmRlciBzb21lIGVmZmVjdCBjaGFpbnMKICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIG1BdWRpb0ZsaW5nZXItPm1vdmVFZmZlY3RDaGFpbl9sKGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCksIHRoaXMsIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgbUF1ZGlvRmxpbmdlci0+bW92ZUVmZmVjdENoYWluX2woZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSwKKyAgICAgICAgICAgIHRoaXMvKiBzcmNUaHJlYWQgKi8sIHRoaXMvKiBkc3RUaHJlYWQgKi8pOwogICAgIH0KIH0KIApAQCAtMjY3NywyOCArMjc5Niw2IEBACiAgICAgfQogfQogCi0vLyBoYXNBdWRpb1Nlc3Npb25fbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkgJiYgIXRyYWNrLT5pc0ludmFsaWQoKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIHBsYWNlZCBpbiBzYW1lIHN0cmF0ZWd5IGFzIE1VU0lDIHN0cmVhbSBzbyB0aGF0CkBAIC0yNzc2LDI0ICsyODczLDE4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAvLyBNaXNjZWxsYW5lb3VzIHRyYWNrIGNsZWFudXAgd2hlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LAorICAgIC8vIGNhbGxlZCB3aXRob3V0IFRocmVhZCBsb2NrIGJ1dCBzeW5jaHJvbml6ZWQgd2l0aCB0aHJlYWRMb29wIHByb2Nlc3NpbmcuCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCi0gICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKICAgICAgICAgfQogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpdHJhY2tzVG9SZW1vdmU7IC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1NpbGVudE1vZGVfbCgpCkBAIC0yODQ1LDYgKzI5MzYsOSBAQAogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgIG1UZWUud3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgZnJhbWVzV3JpdHRlbik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTI5ODQsNyArMzA3OCw3IEBACiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwogICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSwKICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKQEAgLTMxMjUsOCArMzIxOSw4IEBACiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiB0cmFja3NUb1JlbW92ZTsKIAogICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpOwotICAgIG5zZWNzX3QgbGFzdFdyaXRlRmluaXNoZWQgPSAtMTsgLy8gdGltZSBsYXN0IHNlcnZlciB3cml0ZSBjb21wbGV0ZWQKLSAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7IC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgorICAgIGludDY0X3QgbGFzdExvb3BDb3VudFdyaXR0ZW4gPSAtMjsgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKyAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7ICAgIC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgogCiAgICAgLy8gTUlYRVIKICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKQEAgLTMxNjIsNyArMzI1NiwxOCBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcyBzaG91bGQgcmVzZXQgZnJhbWUgY291bnQgdG8gemVybyBvbiBzdG9wL2ZsdXNoCisgICAgLy8gVE9ETzogYWRkIGNvbmZpcm1hdGlvbiBjaGVja3M6CisgICAgLy8gMSkgRElSRUNUIHRocmVhZHMgYW5kIGxpbmVhciBQQ00gZm9ybWF0IHJlYWxseSByZXNldHMgdG8gMD8KKyAgICAvLyAyKSBJcyBmcmFtZSBjb3VudCByZWFsbHkgdmFsaWQgaWYgbm90IGxpbmVhciBwY20/CisgICAgLy8gMykgQXJlIGFsbCA2NCBiaXRzIG9mIHBvc2l0aW9uIHJldHVybmVkLCBub3QganVzdCBsb3dlc3QgMzIgYml0cz8KKyAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLnNldERpc2NvbnRpbnVpdHlNb2RlKG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CisgICAgfQorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKworICAgIC8vIGxvb3BDb3VudCBpcyB1c2VkIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDsgIWV4aXRQZW5kaW5nKCk7ICsrbG9vcENvdW50KQogICAgIHsKICAgICAgICAgLy8gTG9nIG1lcmdlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIEF1ZGlvRmxpbmdlciBiaW5kZXIgdHJhbnNhY3Rpb25zLCBidXQKICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBjb3ZlciBhdWRpbyBwbGF5YmFjay4gSXQncyByZXF1ZXN0ZWQgaGVyZSBmb3IgdGhhdCByZWFzb24uCkBAIC0zMTcxLDYgKzMyNzYsNTEgQEAKICAgICAgICAgY3B1U3RhdHMuc2FtcGxlKG15TmFtZSk7CiAKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX05PTkU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFRyYWNrPj4gYWN0aXZlVHJhY2tzOworCisgICAgICAgIC8vIElmIHRoZSBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9CVVMsIGNoZWNrIGZvciBkb3duc3RyZWFtIGxhdGVuY3kuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGU6IHdlIGFjY2VzcyBvdXREZXZpY2UoKSBvdXRzaWRlIG9mIG1Mb2NrLgorICAgICAgICBpZiAoaXNNc2REZXZpY2UoKSAmJiAob3V0RGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgeworICAgICAgICAgICAgLy8gSGVyZSwgd2UgdHJ5IGZvciB0aGUgQUYgbG9jaywgYnV0IGRvIG5vdCBibG9jayBvbiBpdCBhcyB0aGUgbGF0ZW5jeQorICAgICAgICAgICAgLy8gaXMgbW9yZSBpbmZvcm1hdGlvbmFsLgorICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGlkKCksICZzd1BhdGNoZXMpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzd1BhdGNoZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3dQYXRjaGVzWzBdLmdldExhdGVuY3lNc19sKCZsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gc3dQYXRjaGVzWzBdLmdldFBhdGNoSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IGRvd25zdHJlYW1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgZG93bnN0cmVhbSBsYXRlbmN5ICh3ZSBhc3N1bWUgYSBtYXggcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIDUgc2Vjb25kcykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5MYXRlbmN5ID0gMC4sIG1heExhdGVuY3kgPSA1MDAwLjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA+PSBtaW5MYXRlbmN5ICYmIGxhdGVuY3lNcyA8PSBtYXhMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGF0ZW5jeU1zID4gbWF4TGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWF4TGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBvdXIgZGV2aWNlIGlzIG5vIGxvbmdlciBBVURJT19ERVZJQ0VfT1VUX0JVUywgcmVzZXQgcGF0Y2ggaGFuZGxlIGFuZCBzdGF0cy4KKyAgICAgICAgICAgICAgICBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCkBAIC0zMTg1LDE2ICszMzM1LDUxIEBACiAgICAgICAgICAgICAgICAgbG9nU3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gQ29sbGVjdCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFBsYXliYWNrIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpIHsgLy8gbm8gaW5kZW50YXRpb24KICAgICAgICAgICAgIC8vIEdhdGhlciB0aGUgZnJhbWVzUmVsZWFzZWQgY291bnRlcnMgZm9yIGFsbCBhY3RpdmUgdHJhY2tzLAogICAgICAgICAgICAgLy8gYW5kIGFzc29jaWF0ZSB3aXRoIHRoZSBzaW5rIGZyYW1lcyB3cml0dGVuIG91dC4gIFdlIG5lZWQKICAgICAgICAgICAgIC8vIHRoaXMgdG8gY29udmVydCB0aGUgc2luayB0aW1lc3RhbXAgdG8gdGhlIHRyYWNrIHRpbWVzdGFtcC4KICAgICAgICAgICAgIGJvb2wga2VybmVsTG9jYXRpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIER1cGxpY2F0aW5nVGhyZWFkIG1heSBub3QgaGF2ZSBhIG1Ob3JtYWxTaW5rLgorICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCisgICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKCZ0aW1lc3RhbXApID09IE9LKSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZCh0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogRG93bnN0cmVhbSBsYXRlbmN5IG9ubHkgYWRkZWQgaWYgdGltZXN0YW1wIGNvcnJlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwKSB7IC8vIHdlIGhhdmUgbGF0ZW5jeSBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBuZXdQb3NpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpbnQ2NF90KG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXRNZWFuKCkgKiBtU2FtcGxlUmF0ZSAqIDFlLTMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCByZXRyb2dyYWRlCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU3VzcGVuZGVkRnJhbWVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBXZSBhbHdheXMgZmV0Y2ggdGhlIHRpbWVzdGFtcCBoZXJlIGJlY2F1c2Ugb2Z0ZW4gdGhlIGRvd25zdHJlYW0KICAgICAgICAgICAgICAgICAvLyBzaW5rIHdpbGwgYmxvY2sgd2hpbGUgd3JpdGluZy4KLSAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKLSAgICAgICAgICAgICAgICAodm9pZCkgbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogCiAgICAgICAgICAgICAgICAgLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB2YWxpZCBrZXJuZWwgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgaW4gdW5kZXJydW4KICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIG5vcm1hbCBtaXhlciBwZXJpb2QgaXMgdGhlIHNhbWUgYXMgdGhlIGZhc3QgbWl4ZXIgcGVyaW9kLCBvciB0aGVyZQpAQCAtMzIyMyw3ICszNDA4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdXNwZW5kZWRGcmFtZXM7IC8vIGFkZCBmcmFtZXMgZGlzY2FyZGVkIHdoZW4gc3VzcGVuZGVkCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbUZyYW1lc1dyaXR0ZW4gZm9yIG5vbi1vZmZsb2FkZWQgdHJhY2tzIGFyZSBjb250aWd1b3VzCiAgICAgICAgICAgICAvLyBldmVuIGFmdGVyIHN0YW5kYnkoKSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdHJhY2sgZnJhbWUKICAgICAgICAgICAgIC8vIHRvIHNpbmsgZnJhbWUgbWFwcGluZy4KQEAgLTMyMzksMTEgKzM0MjcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB0aW1lIGJlZm9yZSB3ZSBjYWxsZWQgdGhlIEhBTCB3cml0ZSAtIGl0IGlzIGEgYml0IG1vcmUgYWNjdXJhdGUKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gd2hlbiB0aGUgc2VydmVyIGxhc3QgcmVhZCBkYXRhIHRoYW4gdGhlIGN1cnJlbnQgdGltZSBoZXJlLgogICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0V3JpdGVUaW1lIHdpbGwgYmUgLTEKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCBtTGFzdElvQmVnaW5OcyB3aWxsIGJlIC0xCiAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2Ugc3lzdGVtVGltZSgpLgogICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1GcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtTGFzdFdyaXRlVGltZSA9PSAtMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0SW9CZWdpbk5zID09IC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzeXN0ZW1UaW1lKCkgOiBtTGFzdElvQmVnaW5OczsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKQEAgLTMyNTEsMTAgKzM0MzksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsgLy8gbm90ZSAwLiBtZWFucyB0aW1lc3RhbXAgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IC8vIGlmIChtVHlwZSAuLi4gKSB7IC8vIG5vIGluZGVudGF0aW9uCiAjaWYgMAogICAgICAgICAgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKICAgICAgICAgICAgIGlmICh6ICUgMTAwID09IDApIHsKQEAgLTMyOTUsNyArMzQ5Myw3IEBACiAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAorICAgICAgICAgICAgaWYgKChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIHB1dCBhdWRpbyBoYXJkd2FyZSBpbnRvIHN0YW5kYnkgYWZ0ZXIgc2hvcnQgZGVsYXkKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU3RhbmRieV9sKCkpIHsKQEAgLTMzMDcsOSArMzUwNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzZW5kU3RhdGlzdGljcyhmYWxzZSAvKiBmb3JjZSAqLyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzLnNpemUoKSAmJiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSAmJiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byB3YWl0LCBmbHVzaCB0aGUgYmluZGVyIGNvbW1hbmQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIApAQCAtMzM1Miw2ICszNTUxLDI1IEBACiAgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCiAgICAgICAgICAgICAvLyBvciBtb2RpZmllZCBpZiBhbiBlZmZlY3QgaXMgY3JlYXRlZCBvciBkZWxldGVkCiAgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHNlc3Npb24gdG8gcGljayB1cCBoYXB0aWMgZGF0YS4KKyAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBkb25lIHVuZGVyIHRoZSBzYW1lIGxvY2sgYXMgcHJlcGFyZVRyYWNrc19sKCkuCisgICAgICAgICAgICAvLyBUT0RPOiBXcml0ZSBoYXB0aWMgZGF0YSBkaXJlY3RseSB0byBzaW5rIGJ1ZmZlciB3aGVuIG1peGluZy4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCAmJiBlZmZlY3RDaGFpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9IHRyYWNrLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIGEgbG9jYWwgY29weSBvZiBhY3RpdmUgdHJhY2tzIHdpdGggbG9jayAocmVsZWFzZSB3L28gbG9jaykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ29udHJvbCBtZXRob2RzIG9uIHRoZSB0cmFjayBhY3F1aXJlIHRoZSBUaHJlYWRCYXNlIGxvY2sgKGUuZy4gc3RhcnQoKQorICAgICAgICAgICAgLy8gc3RvcCgpLCBwYXVzZSgpLCBldGMuKSwgYnV0IHRoZSB0aHJlYWRMb29wIGlzIGVudGl0bGVkIHRvIGNhbGwgYXVkaW8KKyAgICAgICAgICAgIC8vIGRhdGEgLyBidWZmZXIgbWV0aG9kcyBvbiB0cmFja3MgZnJvbSBhY3RpdmVUcmFja3Mgd2l0aG91dCB0aGUgVGhyZWFkQmFzZSBsb2NrLgorICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmluc2VydChhY3RpdmVUcmFja3MuZW5kKCksIG1BY3RpdmVUcmFja3MuYmVnaW4oKSwgbUFjdGl2ZVRyYWNrcy5lbmQoKSk7CiAgICAgICAgIH0gLy8gbUxvY2sgc2NvcGUgZW5kcwogCiAgICAgICAgIGlmIChtQnl0ZXNSZW1haW5pbmcgPT0gMCkgewpAQCAtMzM2Niw2ICszNTg0LDEzIEBACiAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKICAgICAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUYWxseSB1bmRlcnJ1biBmcmFtZXMgYXMgd2UgYXJlIGluc2VydGluZyAwcyBoZXJlLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogYWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEVpdGhlciB0aHJlYWRMb29wX21peCgpIG9yIHRocmVhZExvb3Bfc2xlZXBUaW1lKCkgc2hvdWxkIGhhdmUgc2V0CkBAIC0zMzg5LDggKzM2MTQsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKCFoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIGlmICghbUVmZmVjdEJ1ZmZlclZhbGlkICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQ2hhbm5lbENvdW50LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBmb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKQEAgLTM0MDgsNiArMzY1MSwxOSBAQAogICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwICYmIG1UeXBlICE9IE9GRkxPQUQpIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV3JpdGUgaGFwdGljIGRhdGEgZGlyZWN0bHkgdG8gc2luayBidWZmZXIgd2hlbiBtaXhpbmcuCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVIYXB0aWNTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlSGFwdGljU2Vzc2lvbklkID09IGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhcHRpYyBkYXRhIGlzIGFjdGl2ZSBpbiB0aGlzIGNhc2UsIGNvcHkgaXQgZGlyZWN0bHkgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYnVmZmVyIHRvIG91dCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXVkaW9CdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCwgRUZGRUNUX0JVRkZFUl9GT1JNQVQpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWVmZmVjdENoYWluc1tpXS0+b3V0QnVmZmVyKCkgKyBhdWRpb0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9CVUZGRVJfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopZWZmZWN0Q2hhaW5zW2ldLT5pbkJ1ZmZlcigpICsgYXVkaW9CdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCwgbU5vcm1hbEZyYW1lQ291bnQgKiBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzQzMyw4ICszNjg5LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghaGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvIGl0IGhlcmUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICAgICAgICAgIC8vIG1CYWxhbmNlIGRldGVjdHMgemVybyBiYWxhbmNlIHdpdGhpbiB0aGUgY2xhc3MgZm9yIHNwZWVkIChub3QgbmVlZGVkIGhlcmUpLgorICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5wcm9jZXNzKChmbG9hdCAqKW1FZmZlY3RCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpKTsKKyAgICAgICAgICAgIC8vIFRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQgd2hlbiBoYXB0aWMgY2hhbm5lbHMgZXhpc3QsCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBjaGFubmVscyBoZXJlLgorICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShtU2lua0J1ZmZlciwgbUNoYW5uZWxDb3VudCwgbVNpbmtCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCwgbUZvcm1hdCkgKiBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KQEAgLTM0NDQsNDMgKzM3MTYsNjggQEAKICAgICAgICAgICAgIC8vIG1TbGVlcFRpbWVVcyA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICAgICAgICAgIHNzaXplX3QgcmV0ID0gMDsKLSAgICAgICAgICAgICAgICAvLyBXZSBzYXZlIGxhc3RXcml0ZUZpbmlzaGVkIGhlcmUsIGFzIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQsCi0gICAgICAgICAgICAgICAgLy8gZm9yIHRocm90dGxpbmcuIE9uIHRocmVhZCBzdGFydCwgcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gc2V0IHRvIC0xLCB3aGljaCBwcm9wZXJseSByZXN1bHRzIGluIG5vIHRocm90dGxpbmcgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlLgotICAgICAgICAgICAgICAgIG5zZWNzX3QgcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCA9IGxhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSAwOworICAgICAgICAgICAgICAgIC8vIHdyaXRlUGVyaW9kTnMgaXMgdXBkYXRlZCA+PSAwIHdoZW4gcmV0ID4gMC4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IHdyaXRlUGVyaW9kTnMgPSAtMTsKICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJld3JpdGUgdG8gcmVkdWNlIG51bWJlciBvZiBzeXN0ZW0gY2FsbHMKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7ICAvLyBhbHNvIHVzZWQgZm9yIGR1bXBzeXMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9CZWdpbk5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICByZXQgPSB0aHJlYWRMb29wX3dyaXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGxhc3RXcml0ZUZpbmlzaGVkIC0gbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nIC09IHJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHJldCAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lcyA9IHJldCAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSBmcmFtZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGVyaW9kTnMgPSBsYXN0SW9FbmROcyAtIG1MYXN0SW9FbmROczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gd3JpdGUgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNvbnRpbnVvdXMgbWl4aW5nIGN5Y2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50V3JpdHRlbiArIDEpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QsIGludDY0X3Q+Ojpjb21wdXRlSml0dGVyTXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZnJhbWVzLCB3cml0ZVBlcmlvZE5zfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSAvKiBsYXN0VGltZXN0YW1wICovLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwcm9jZXNzTXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RJb0JlZ2luTnMgLSBtTGFzdElvRW5kTnMpICogMWUtNjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc1RpbWVNcy5hZGQocHJvY2Vzc01zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFXcml0ZU5zID0gbGFzdElvRW5kTnMgLSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiBkZWx0YVdyaXRlTnMgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0SW9FbmROcyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsZCBtc2VjcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFXcml0ZU5zIC8gTkFOT1NfUEVSX01JTExJU0VDT05ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcywgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGltaW5nIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IGxhc3RJb0JlZ2luTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSBsYXN0SW9FbmROczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMb29wQ291bnRXcml0dGVuID0gbG9vcENvdW50OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX1RSQUNLKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmICFtU3RhbmRieSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiBtYXhQZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RXcml0ZUZpbmlzaGVkIC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbHUgbXNlY3MsICVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtVGhyZWFkVGhyb3R0bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZIC8vIHdlIGFyZSBtaXhpbmcgKGFjdGl2ZSB0cmFja3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmV0ID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3cm90ZSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB3cml0ZVBlcmlvZE5zID4gMCkgeyAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgd3JpdGUgcGVyaW9kIGluZm8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbWl0IE1peGVyVGhyZWFkIGRhdGEgcHJvY2Vzc2luZyB0byBubyBtb3JlIHRoYW4gdHdpY2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBwcm9jZXNzaW5nIHJhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLwpAQCAtMzQ5OSwxMiArMzc5Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiB0aHJlYWRMb29wX21peCAoc2lnbmlmaWNhbnQgZm9yIGhlYXZ5IG1peGluZywgZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIG9uIGxvdyB0aWVyIHByb2Nlc3NvcnMpCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyAoYW5kIGRlbHRhTnMpIGlzIGFuIG92ZXJlc3RpbWF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGFOczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhTnMgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkLHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQsICZkZWx0YU5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IGRlbHRhTnMgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBPSyBpZiBkZWx0YU1zIGlzIGFuIG92ZXJlc3RpbWF0ZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gd3JpdGVQZXJpb2ROcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0aHJvdHRsZU1zID0gKGludDMyX3QpbUhhbGZCdWZmZXJNcyAtIGRlbHRhTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNpZ25lZCltSGFsZkJ1ZmZlck1zID49IHRocm90dGxlTXMgJiYgdGhyb3R0bGVNcyA+IDApIHsKQEAgLTM1MTcsNyArMzgxMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlVGltZU1zICs9IHRocm90dGxlTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3R0bGUgbXVzdCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBwcmV2aW91cyBtaXhlciBsb29wJ3Mgd3JpdGUgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFsbG93IGJhY2stdG8tYmFjayB0aHJvdHRsaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXcml0ZUZpbmlzaGVkICs9IHRocm90dGxlTXMgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIHByb3BlciB0aW1pbmcgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7ICAvLyB3ZSBmZXRjaCB0aGUgd3JpdGUgZW5kIHRpbWUgYWdhaW4uCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpZmYgPSBtVGhyZWFkVGhyb3R0bGVUaW1lTXMgLSBtVGhyZWFkVGhyb3R0bGVFbmRNczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKQEAgLTM2MDAsMjQgKzM4OTUsMzYgQEAKIC8vIHJlbW92ZVRyYWNrc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrc19sKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewotICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7Ci0gICAgICAgICAgICBBTE9HVigicmVtb3ZlVHJhY2tzX2wgcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLCBjaGFpbi5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrLT5pZCgpLCBjaGFpbi5nZXQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGFuIGV4dGVybmFsIGNsaWVudCB0cmFjaywgaW5mb3JtIEFQTSB3ZSdyZSBubyBsb25nZXIgYWN0aXZlLCBhbmQgcmVtb3ZlIGlmIG5lZWRlZC4KKyAgICAgICAgLy8gV2UgZG8gdGhpcyB1bmRlciBsb2NrIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGNvbnNpc3RlbnQgaWYgdGhlIFRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG91ciB0cmFja3MgdmVjdG9yCisgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAorICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCisgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgfQogICAgIH0KLQogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQpAQCAtMzYzNCw2ICszOTQxLDE1IEBACiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7CiAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQpAQCAtMzY2Niw2ICszOTgyLDcgQEAKICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgIH0KIAorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2lua1BvcnRJZCA9IHBhdGNoLT5zaW5rc1swXS5pZDsKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKICAgICAvLyB0aGUgY2hhbmdlCkBAIC0zNjk1LDcgKzQwMTIsNyBAQAogCiAgICAgLy8gbVByZXZPdXREZXZpY2UgaXMgdGhlIGxhdGVzdCBkZXZpY2Ugc2V0IGJ5IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgpLiBJdCBpcyBub3Qgc2V0IHdoZW4KICAgICAvLyB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgZmlyc3QgcGF0Y2ggY3JlYXRpb24gdHJpZ2dlcnMgYW4gaW9Db25maWdDaGFuZ2VkIGNhbGxiYWNrCi0gICAgYm9vbCBjb25maWdDaGFuZ2VkID0gbVByZXZPdXREZXZpY2UgIT0gdHlwZTsKKyAgICBib29sIGNvbmZpZ0NoYW5nZWQgPSAobVByZXZPdXREZXZpY2UgIT0gdHlwZSkgfHwgKG1EZXZpY2VJZCAhPSBzaW5rUG9ydElkKTsKICAgICBtT3V0RGV2aWNlID0gdHlwZTsKICAgICBtUGF0Y2ggPSAqcGF0Y2g7CiAKQEAgLTM3MjQsNiArNDA0MSw3IEBACiAgICAgfQogICAgIGlmIChjb25maWdDaGFuZ2VkKSB7CiAgICAgICAgIG1QcmV2T3V0RGV2aWNlID0gdHlwZTsKKyAgICAgICAgbURldmljZUlkID0gc2lua1BvcnRJZDsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzc3MiwxMiArNDA5MCwxNiBAQAogICAgIGRlc3Ryb3lUcmFja19sKHRyYWNrKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CiAgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzc5Myw2ICs0MTE1LDcgQEAKICAgICAgICAgLy8gbVBpcGVTaW5rIGJlbG93CiAgICAgICAgIC8vIG1Ob3JtYWxTaW5rIGJlbG93CiB7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKICAgICBBTE9HVigiTWl4ZXJUaHJlYWQoKSBpZD0lZCBkZXZpY2U9JSN4IHR5cGU9JWQiLCBpZCwgZGV2aWNlLCB0eXBlKTsKICAgICBBTE9HVigibVNhbXBsZVJhdGU9JXUsIG1DaGFubmVsTWFzaz0lI3gsIG1DaGFubmVsQ291bnQ9JXUsIG1Gb3JtYXQ9JSN4LCBtRnJhbWVTaXplPSV6dSwgIgogICAgICAgICAgICAgIm1GcmFtZUNvdW50PSV6dSwgbU5vcm1hbEZyYW1lQ291bnQ9JXp1IiwKQEAgLTM4MDksNyArNDEzMiw4IEBACiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQygKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogI2lmICFMT0dfTkRFQlVHCiAgICAgc3NpemVfdCBpbmRleCA9CiAjZWxzZQpAQCAtMzg1MSwxNiArNDE3NSwxNCBAQAogICAgICAgICAgICAgLy8gY2hhbmdlIG91ciBTaW5rIGZvcm1hdCB0byBhY2NlcHQgb3VyIGludGVybWVkaWF0ZSBwcmVjaXNpb24KICAgICAgICAgICAgIG1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CiAgICAgICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgTW9ub1BpcGUgdG8gY29ubmVjdCBvdXIgc3VibWl4IHRvIEZhc3RNaXhlcgogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIE5CQUlPX0Zvcm1hdCBvcmlnZm9ybWF0ID0gZm9ybWF0OwotI2VuZGlmCisKICAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCiAgICAgICAgIEFMT0dWKCJmb3JtYXQgY2hhbmdlZCBmcm9tICUjeCB0byAlI3giLCBmb3JtYXQubUZvcm1hdCwgZmFzdE1peGVyRm9ybWF0KTsKICAgICAgICAgZm9ybWF0Lm1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CkBAIC0zODcyLDcgKzQxOTQsNyBAQAogICAgICAgICBNb25vUGlwZSAqbW9ub1BpcGUgPSBuZXcgTW9ub1BpcGUobU5vcm1hbEZyYW1lQ291bnQgKiA0LCBmb3JtYXQsIHRydWUgLyp3cml0ZUNhbkJsb2NrKi8pOwogICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CiAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSNpZiAhTE9HX05ERUJVRyB8fCBkZWZpbmVkKFRFRV9TSU5LKQorI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKICAgICAgICAgKHZvaWQpCkBAIC0zODgzLDI1ICs0MjA1LDggQEAKICAgICAgICAgICAgICAgICAobW9ub1BpcGUtPm1heEZyYW1lcygpICogNykgLyA4IDogbU5vcm1hbEZyYW1lQ291bnQgKiAyKTsKICAgICAgICAgbVBpcGVTaW5rID0gbW9ub1BpcGU7CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtPdXRwdXRFbmFibGVkKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIEZhc3RNaXhlcidzIG91dHB1dCBmb3IgZHVtcHN5cwotICAgICAgICAgICAgUGlwZSAqdGVlU2luayA9IG5ldyBQaXBlKG1UZWVTaW5rT3V0cHV0RnJhbWVzLCBvcmlnZm9ybWF0KTsKLSAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnMyWzFdID0ge29yaWdmb3JtYXR9OwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNpbmsgPSB0ZWVTaW5rOwotICAgICAgICAgICAgUGlwZVJlYWRlciAqdGVlU291cmNlID0gbmV3IFBpcGVSZWFkZXIoKnRlZVNpbmspOwotICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICBtVGVlU291cmNlID0gdGVlU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAvLyBjcmVhdGUgZmFzdCBtaXhlciBhbmQgY29uZmlndXJlIGl0IGluaXRpYWxseSB3aXRoIGp1c3Qgb25lIGZhc3QgdHJhY2sgZm9yIG91ciBzdWJtaXgKLSAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIoKTsKKyAgICAgICAgbUZhc3RNaXhlciA9IG5ldyBGYXN0TWl4ZXIobUlkKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgc3EtPnNldE9ic2VydmVyRHVtcCgmbVN0YXRlUXVldWVPYnNlcnZlckR1bXApOwpAQCAtMzkxMiw4ICs0MjE3LDExIEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMzkyMSwyNCArNDIyOSwzMCBAQAogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmsgPSBtT3V0cHV0U2luay5nZXQoKTsKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKKyAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKKyAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0TWl4ZXJGdXRleDsKICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0TWl4ZXJEdW1wU3RhdGU7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgc3RhdGUtPm1UZWVTaW5rID0gbVRlZVNpbmsuZ2V0KCk7Ci0jZW5kaWYKICAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdE1peGVyTG9nU2l6ZSwgIkZhc3RNaXhlciIpOwogICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RNaXhlck5CTG9nV3JpdGVyLmdldCgpOwogICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAKKyAgICAgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgaW5mbzsKKyAgICAgICAgaW5mby5pZCA9IG1JZDsKKyAgICAgICAgaW5mby50eXBlID0gTkJMb2c6OkZBU1RNSVhFUjsKKyAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsKKwogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdE1peGVyKTsKIAogI2lmZGVmIEFVRElPX1dBVENIRE9HCkBAIC0zOTQ3LDkgKzQyNjEsMTQgQEAKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnNldER1bXAoJm1BdWRpb1dhdGNoZG9nRHVtcCk7CiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5ydW4oIkF1ZGlvV2F0Y2hkb2ciLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICB0aWQgPSBtQXVkaW9XYXRjaGRvZy0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAjZW5kaWYKLQorICAgIH0gZWxzZSB7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gT25seSB1c2UgdGhlIE1peGVyVGhyZWFkIHRlZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgIG1UZWUuc2V0KG1PdXRwdXRTaW5rLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfTSIpOworI2VuZGlmCiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC00MDEzLDEyICs0MzMyLDYgQEAKICAgICByZXR1cm4gbGF0ZW5jeTsKIH0KIAotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQotewotICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyh0cmFja3NUb1JlbW92ZSk7Ci19Ci0KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQpAQCAtNDIxNywxNCArNDUzMCwxNCBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKAogICAgICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSkKIHsKLSAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIG5hbWVzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcwotICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKFt0aGlzXShpbnQgbmFtZSkgewotICAgICAgICAvLyBmb3IgZWFjaCBuYW1lLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCi0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveShuYW1lKTsKKyAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIGlkcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tJZHMoW3RoaXNdKGludCB0cmFja0lkKSB7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrSWQsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KHRyYWNrSWQpOwogICAgICAgICB9CiAgICAgfSk7Ci0gICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja0lkcygpOwogCiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZApAQCAtNDI2NSw2ICs0NTc4LDM4IEBACiAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCiAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgogCisgICAgLy8gRGVmZXJyZWRPcGVyYXRpb25zIGhhbmRsZXMgc3RhdGlzdGljcyBhZnRlciBzZXR0aW5nIG1peGVyU3RhdHVzLgorICAgIGNsYXNzIERlZmVycmVkT3BlcmF0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBEZWZlcnJlZE9wZXJhdGlvbnMobWl4ZXJfc3RhdGUgKm1peGVyU3RhdHVzKQorICAgICAgICAgICAgOiBtTWl4ZXJTdGF0dXMobWl4ZXJTdGF0dXMpIHsgfQorCisgICAgICAgIC8vIHdoZW4gbGVhdmluZyBzY29wZSwgdGFsbHkgZnJhbWVzIHByb3Blcmx5LgorICAgICAgICB+RGVmZXJyZWRPcGVyYXRpb25zKCkgeworICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IG1peGluZyAoTUlYRVJfVFJBQ0tTX1JFQURZKQorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIHVuZGVycnVuIG9jY3Vycy4KKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZhc3RUcmFja3MgYW5kIE5vcm1hbFRyYWNrcyBoZXJlLgorICAgICAgICAgICAgaWYgKCptTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1bmRlcnJ1biA6IG1VbmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5maXJzdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRhbGx5VW5kZXJydW5GcmFtZXMoKSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSB0cmFjayBjb3VudGVycworICAgICAgICAvLyB3aXRoIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gZnJhbWVzIGZvciBhIHBhcnRpY3VsYXIgbWl4ZXIgcGVyaW9kLgorICAgICAgICAvLyBXZSBkZWZlciB0YWxseWluZyB1bnRpbCB3ZSBrbm93IHRoZSBmaW5hbCBtaXhlciBzdGF0dXMuCisgICAgICAgIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzcDxUcmFjaz4gdHJhY2ssIHNpemVfdCB1bmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgbVVuZGVycnVuRnJhbWVzLmVtcGxhY2VfYmFjayh0cmFjaywgdW5kZXJydW5GcmFtZXMpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBtaXhlcl9zdGF0ZSAqIGNvbnN0IG1NaXhlclN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNwPFRyYWNrPiwgc2l6ZV90Pj4gbVVuZGVycnVuRnJhbWVzOworICAgIH0gZGVmZXJyZWRPcGVyYXRpb25zKCZtaXhlclN0YXR1cyk7IC8vIGltcGxpY2l0IG5lc3RlZCBzY29wZSBmb3IgdmFyaWFibGUgY2FwdHVyZQorCisgICAgYm9vbCBub0Zhc3RIYXB0aWNUcmFjayA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV07CiAKQEAgLTQyNzMsNiArNDYxOCwxMyBAQAogCiAgICAgICAgIC8vIHByb2Nlc3MgZmFzdCB0cmFja3MKICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1GYXN0TWl4ZXIuZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogRmFzdFRyYWNrKCVkKSBwcmVzZW50IHdpdGhvdXQgRmFzdE1peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpZCgpLCB0cmFjay0+aWQoKSk7CisKKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBub0Zhc3RIYXB0aWNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgKHRob3VnaCB1bmxpa2VseSkgZm9yIGEgZmFzdCB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgICAvLyBhbmQgdGhlbiByZW1vdmVkIHdpdGhpbiB0aGUgc2FtZSBub3JtYWwgbWl4IGN5Y2xlLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBhcwpAQCAtNDI5OSwxMyArNDY1MSwxNCBAQAogICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIC8vIGRvbid0IGNvdW50IHVuZGVycnVucyB0aGF0IG9jY3VyIHdoaWxlIHN0b3BwaW5nIG9yIHBhdXNpbmcKICAgICAgICAgICAgIC8vIG9yIHN0b3BwZWQgd2hpY2ggY2FuIG9jY3VyIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQgd2hpbGUgYWN0aXZlCisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKCEodHJhY2stPmlzU3RvcHBpbmcoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICByZWNlbnRVbmRlcnJ1bnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgZmFzdCBtaXhlciB3aWxsIHB1bGwgJiBtaXggcGFydGlhbCBidWZmZXJzLCBidXQgd2UgY291bnQgYXMgYSBmdWxsIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMocmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWNjb3VudCBmb3IgRmFzdFRyYWNrIHVuZGVycnVucy4KKyAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBub3JtYWwgdHJhY2tzLAogICAgICAgICAgICAgLy8gd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGZvciBmYXN0IHRyYWNrcy4KQEAgLTQzNTIsNyArNDcwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVE9QUElOR18yOgogICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNFRDoKICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVE9QUEVEOgpAQCAtNDM5Nyw2ICs0NzUwLDggQEAKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSB2cDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSB0cmFjay0+bUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSB0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgfD0gMSA8PCBqOwogICAgICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwpAQCAtNDQwNyw5ICs0NzYyLDE0IEBACiAgICAgICAgICAgICAgICAgLy8gbGFja3MgYW55IHN5bmNocm9uaXphdGlvbiBvciBiYXJyaWVyIHNvIFZvbHVtZVByb3ZpZGVyIG1heSByZWFkIGEgc3RhbGUgdmFsdWUKICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKS5maXJzdDsKLSAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUgPSBtYXN0ZXJWb2x1bWUKKyAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWU7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BsYXliYWNrUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHZvbHVtZSA9IDAuZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2b2x1bWUgPSBtYXN0ZXJWb2x1bWUKICAgICAgICAgICAgICAgICAgICAgICAgICogbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZQogICAgICAgICAgICAgICAgICAgICAgICAgKiB2aDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJhY2stPm1DYWNoZWRWb2x1bWUgPSB2b2x1bWU7CiAgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gdm9sdW1lICogZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwpAQCAtNDQ0Miw2ICs0ODAyLDEwIEBACiAgICAgICAgICAgICAgICAgLy8gQXZvaWRzIGEgbWlzbGVhZGluZyBkaXNwbGF5IGluIGR1bXBzeXMKICAgICAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCk7CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTQ0NTEsMTkgKzQ4MTUsMjEgQEAKIAogICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgLy8gZm9yIGFsbCBpdHMgYnVmZmVycyB0byBiZSBmaWxsZWQgYmVmb3JlIHByb2Nlc3NpbmcgaXQKLSAgICAgICAgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogCiAgICAgICAgIC8vIGlmIGFuIGFjdGl2ZSB0cmFjayBkb2Vzbid0IGV4aXN0IGluIHRoZSBBdWRpb01peGVyLCBjcmVhdGUgaXQuCi0gICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeworICAgICAgICAvLyB1c2UgdGhlIHRyYWNrSWQgYXMgdGhlIEF1ZGlvTWl4ZXIgbmFtZS4KKyAgICAgICAgaWYgKCFtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpOiBBdWRpb01peGVyIGNhbm5vdCBjcmVhdGUgdHJhY2soJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFja0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOyAvLyBjb25zaWRlciBpdCBkZWFkLgogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDQ4NCw3ICs0ODUwLDcgQEAKICAgICAgICAgLy8gVE9ETzogT05MWSBVU0VEIEZPUiBMRUdBQ1kgUkVTQU1QTEVSUywgcmVtb3ZlIHdoZW4gdGhleSBhcmUgcmVtb3ZlZC4KICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKICAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKLSAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFja0lkKTsKIAogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXMgPSAxOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkgJiYKQEAgLTQ0OTYsMTMgKzQ4NjIsMTMgQEAKICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0cmFjZU5hbWUoIm5SZHkiKTsKLSAgICAgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyh0cmFja0lkKTsKICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLmNfc3RyKCksIGZyYW1lc1JlYWR5KTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGZyYW1lc1JlYWR5ID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIG5hbWUsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtPS10gb24gdGhyZWFkICVwIiwgdHJhY2tJZCwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CiAKICAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CiAKQEAgLTQ1MTksOSArNDg4NSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzV2l0aEVmZmVjdCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVwYXJlVHJhY2tzX2woKTogdHJhY2sgJWQgYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVwYXJlVHJhY2tzX2woKTogdHJhY2soJWQpIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC00NTMyLDkgKzQ4OTgsMTIgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUU7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgbmV3IHRyYWNrIGlzIHBhdXNlZCBpbW1lZGlhdGVseSBhZnRlciBzdGFydCwgZG8gbm90IHJhbXAgb24gcmVzdW1lLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bVNlcnZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsIEF1ZGlvTWl4ZXI6OlJFU0VULCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IC0xLjA7CiAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgbm90IG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBtU2VydmVyCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgewpAQCAtNDU0OSwxNSArNDkxOCwxOSBAQAogICAgICAgICAgICAgLy8gcmVhZCBvcmlnaW5hbCB2b2x1bWVzIHdpdGggdm9sdW1lIGNvbnRyb2wKICAgICAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwogICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CisgICAgICAgICAgICAvLyBBbHdheXMgZmV0Y2ggdm9sdW1lc2hhcGVyIHZvbHVtZSB0byBlbnN1cmUgc3RhdGUgaXMgdXBkYXRlZC4KKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHZoID0gdHJhY2stPmdldFZvbHVtZUhhbmRsZXIoKS0+Z2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSkuZmlyc3Q7CiAKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUKKyAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPmlzUGxheWJhY2tSZXN0cmljdGVkKCkpIHsKICAgICAgICAgICAgICAgICB2bCA9IHZyID0gMDsKICAgICAgICAgICAgICAgICB2bGYgPSB2cmYgPSB2YWYgPSAwLjsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKQEAgLTQ1NzAsOCArNDk0Myw2IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayByaWdodCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlLjNnIiwgdnJmKTsKICAgICAgICAgICAgICAgICAgICAgdnJmID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgdmggPSB0cmFjay0+Z2V0Vm9sdW1lSGFuZGxlcigpLT5nZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSkuZmlyc3Q7CiAgICAgICAgICAgICAgICAgLy8gbm93IGFwcGx5IHRoZSBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWUgYW5kIHNoYXBlciB2b2x1bWUKICAgICAgICAgICAgICAgICB2bGYgKj0gdiAqIHZoOwogICAgICAgICAgICAgICAgIHZyZiAqPSB2ICogdmg7CkBAIC00NjMwLDQxICs1MDAxLDQyIEBACiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCB0cmFjayk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKHRyYWNrSWQpOwogCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgogICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYOwotICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CisgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gcHJveHktPmdldFNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgIGlmIChyZXFTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcVNhbXBsZVJhdGUgPiBtYXhTYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1heFNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CiAKLSAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRJTUVTVFJFVENILAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlBMQVlCQUNLX1JBVEUsCiAgICAgICAgICAgICAgICAgJnBsYXliYWNrUmF0ZSk7CkBAIC00Njg1LDI5ICs1MDU3LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+YXV4QnVmZmVyKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpIQVBUSUNfSU5URU5TSVRZLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpKTsKIAogICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXM7CkBAIC00NzIwLDEzICs1MTAwLDEzIEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZGVzaXJlZEZyYW1lcyAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzZWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglcCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglZCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IGRlc2lyZWRGcmFtZXM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbnMudGFsbHlVbmRlcnJ1bkZyYW1lcyh0cmFjaywgdW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBjbGVhciBlZmZlY3QgY2hhaW4gaW5wdXQgYnVmZmVyIGlmIGFuIGFjdGl2ZSB0cmFjayB1bmRlcnJ1bnMgdG8gYXZvaWQgc2VuZGluZwogICAgICAgICAgICAgLy8gcHJldmlvdXMgYXVkaW8gYnVmZmVyIGFnYWluIHRvIGVmZmVjdHMKQEAgLTQ3MzUsNyArNTExNSw3IEBACiAgICAgICAgICAgICAgICAgY2hhaW4tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgbmFtZSwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgdHJhY2tJZCwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CiAgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNUZXJtaW5hdGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBlZCgpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KQEAgLTQ3NTQsNyArNTEzNCw4IEBACiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsIG5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC00NzY3LDEzICs1MTQ4LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUobmFtZSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZSh0cmFja0lkKTsKICAgICAgICAgfQogCiAgICAgICAgIH0gICAvLyBsb2NhbCB2YXJpYWJsZSBzY29wZSB0byBhdm9pZCBnb3RvIHdhcm5pbmcKIAogICAgIH0KIAorICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FICYmIHNxICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBmYXN0IHRyYWNrIHBsYXlpbmcgaGFwdGljIGFuZCBGYXN0TWl4ZXIgZXhpc3RzLAorICAgICAgICAvLyBlbmFibGluZyB0aGUgZmlyc3QgRmFzdFRyYWNrLCB3aGljaCBwcm92aWRlcyBtaXhlZCBkYXRhIGZyb20gbm9ybWFsCisgICAgICAgIC8vIHRyYWNrcywgdG8gcGxheSBoYXB0aWMgZGF0YS4KKyAgICAgICAgRmFzdFRyYWNrICpmYXN0VHJhY2sgPSAmc3RhdGUtPm1GYXN0VHJhY2tzWzBdOworICAgICAgICBpZiAoZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IG5vRmFzdEhhcHRpY1RyYWNrKSB7CisgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBub0Zhc3RIYXB0aWNUcmFjazsKKyAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBQdXNoIHRoZSBuZXcgRmFzdE1peGVyIHN0YXRlIGlmIG5lY2Vzc2FyeQogICAgIGJvb2wgcGF1c2VBdWRpb1dhdGNoZG9nID0gZmFsc2U7CiAgICAgaWYgKGRpZE1vZGlmeSkgewpAQCAtNDgyOCw5ICs1MjIwLDkgQEAKICAgICAvLyBvZiBwcmVwYXJlVHJhY2tzX2woKTsgdGhpcyByZWxlYXNlcyBhbnkgb3V0c3RhbmRpbmcgYnVmZmVyIGJhY2sgdG8gdGhlIHRyYWNrLgogICAgIC8vIFNlZSBhbHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkZXN0cm95VHJhY2tfbCgpLgogICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiAqdHJhY2tzVG9SZW1vdmUpIHsKLSAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOwotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5OTksMTcgKzUzOTEsMTcgQEAKICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBBdWRpb01peGVyIGNhbm5vdCBjcmVhdGUgdHJhY2soJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KQEAgLTUwMTksMTMgKzU0MTEsMTUgQEAKIH0KIAogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKKyAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFsc19sKGZkLCBhcmdzKTsKICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWQgdGhyb3R0bGUgdGltZSAobXNlY3MpOiAldVxuIiwgbVRocmVhZFRocm90dGxlVGltZU1zKTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogJXNcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkuY19zdHIoKSk7CiAgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7Ci0KKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgYmFsYW5jZTogJWYgKCVzKVxuIiwgbU1hc3RlckJhbGFuY2UubG9hZCgpLAorICAgICAgICAgICAgKGhhc0Zhc3RNaXhlcigpID8gc3RkOjp0b19zdHJpbmcobUZhc3RNaXhlci0+Z2V0TWFzdGVyQmFsYW5jZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUJhbGFuY2UudG9TdHJpbmcoKSkuY19zdHIoKSk7CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwogCkBAIC01MDMzLDkgKzU0MjcsOSBAQAogICAgICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgICAgIGNvbnN0IEZhc3RNaXhlckR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0TWl4ZXJEdW1wU3RhdGUobUZhc3RNaXhlckR1bXBTdGF0ZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0TWl4ZXJEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdE1peGVyRHVtcFN0YXRlPihtRmFzdE1peGVyRHVtcFN0YXRlKTsKICAgICAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgICAgIGRlbGV0ZSBjb3B5OwogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICAvLyBTaW1pbGFyIGZvciBzdGF0ZSBxdWV1ZQpAQCAtNTA1NiwxMiArNTQ1MCw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyXG4iKTsKICAgICB9Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIFdyaXRlIHRoZSB0ZWUgb3V0cHV0IHRvIGEgLndhdiBmaWxlCi0gICAgZHVtcFRlZShmZCwgbVRlZVNvdXJjZSwgbUlkLCAnTScpOwotI2VuZGlmCi0KIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aWRsZVNsZWVwVGltZVVzKCkgY29uc3QKQEAgLTUwODgsNTIgKzU0NzYsNjEgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQotICAgICAgICAsIG1Wb2x1bWVTaGFwZXJBY3RpdmUoZmFsc2UpCiB7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6On5EaXJlY3RPdXRwdXRUaHJlYWQoKQogewogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woZmQsIGFyZ3MpOworICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBiYWxhbmNlOiAlZiAgTGVmdDogJWYgIFJpZ2h0OiAlZlxuIiwKKyAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSwgbU1hc3RlckJhbGFuY2VMZWZ0LCBtTWFzdGVyQmFsYW5jZVJpZ2h0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1NYXN0ZXJCYWxhbmNlICE9IGJhbGFuY2UpIHsKKyAgICAgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7CisgICAgICAgIG1CYWxhbmNlLmNvbXB1dGVTdGVyZW9CYWxhbmNlKGJhbGFuY2UsICZtTWFzdGVyQmFsYW5jZUxlZnQsICZtTWFzdGVyQmFsYW5jZVJpZ2h0KTsKKyAgICAgICAgYnJvYWRjYXN0X2woKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKQogewogICAgIGZsb2F0IGxlZnQsIHJpZ2h0OwogCi0gICAgaWYgKG1NYXN0ZXJNdXRlIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7CisgICAgLy8gRW5zdXJlIHZvbHVtZXNoYXBlciBzdGF0ZSBhbHdheXMgYWR2YW5jZXMgZXZlbiB3aGVuIG11dGVkLgorICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKyAgICBjb25zdCBhdXRvIFtzaGFwZXJWb2x1bWUsIHNoYXBlckFjdGl2ZV0gPSB0cmFjay0+Z2V0Vm9sdW1lSGFuZGxlcigpLT5nZXRWb2x1bWUoCisgICAgICAgICAgICBwcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgbVZvbHVtZVNoYXBlckFjdGl2ZSA9IHNoYXBlckFjdGl2ZTsKKworICAgIGlmIChtTWFzdGVyTXV0ZSB8fCBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSB8fCB0cmFjay0+aXNQbGF5YmFja1Jlc3RyaWN0ZWQoKSkgewogICAgICAgICBsZWZ0ID0gcmlnaHQgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwotICAgICAgICBmbG9hdCB2ID0gbU1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7Ci0gICAgICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLQotICAgICAgICAvLyBHZXQgdm9sdW1lc2hhcGVyIHNjYWxpbmcKLSAgICAgICAgc3RkOjpwYWlyPGZsb2F0IC8qIHZvbHVtZSAqLywgYm9vbCAvKiBhY3RpdmUgKi8+Ci0gICAgICAgICAgICB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpOwotICAgICAgICB2ICo9IHZoLmZpcnN0OwotICAgICAgICBtVm9sdW1lU2hhcGVyQWN0aXZlID0gdmguc2Vjb25kOworICAgICAgICBjb25zdCBmbG9hdCB2ID0gbU1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWUgKiBzaGFwZXJWb2x1bWU7CiAKICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CiAgICAgICAgIGxlZnQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgIH0KLSAgICAgICAgbGVmdCAqPSB2OworICAgICAgICBsZWZ0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZUxlZnQ7IC8vIERpcmVjdE91dHB1dFRocmVhZCBiYWxhbmNlIGFwcGxpZWQgYXMgdHJhY2sgdm9sdW1lCiAgICAgICAgIHJpZ2h0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKICAgICAgICAgaWYgKHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgcmlnaHQgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICB9Ci0gICAgICAgIHJpZ2h0ICo9IHY7CisgICAgICAgIHJpZ2h0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZVJpZ2h0OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTUxNDIsMjAgKzU1MzksMjAgQEAKICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBsZWZ0OwogICAgICAgICAgICAgbVJpZ2h0Vm9sRmxvYXQgPSByaWdodDsKIAotICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gZmxvYXQgdG8gOC4yNAotICAgICAgICAgICAgdWludDMyX3QgdmwgPSAodWludDMyX3QpKGxlZnQgKiAoMSA8PCAyNCkpOwotICAgICAgICAgICAgdWludDMyX3QgdnIgPSAodWludDMyX3QpKHJpZ2h0ICogKDEgPDwgMjQpKTsKLQogICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKICAgICAgICAgICAgIC8vIG9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBvbiBEaXJlY3RPdXRwdXRUaHJlYWQsIHNvIGlmCiAgICAgICAgICAgICAvLyB0aGVyZSBpcyBvbmUsIHRoZSB0cmFjayBpcyBjb25uZWN0ZWQgdG8gaXQKICAgICAgICAgICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zWzBdLT5zZXRWb2x1bWVfbCgmdmwsICZ2cik7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IChmbG9hdCl2bCAvICgxIDw8IDI0KTsKLSAgICAgICAgICAgICAgICByaWdodCA9IChmbG9hdCl2ciAvICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAvLyBpZiBlZmZlY3QgY2hhaW4gZXhpc3RzLCB2b2x1bWUgaXMgaGFuZGxlZCBieSBpdC4KKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZXMgZnJvbSBmbG9hdCB0byA4LjI0CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmwgPSAodWludDMyX3QpKGxlZnQgKiAoMSA8PCAyNCkpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZyID0gKHVpbnQzMl90KShyaWdodCAqICgxIDw8IDI0KSk7CisgICAgICAgICAgICAgICAgLy8gRGlyZWN0L09mZmxvYWQgZWZmZWN0IGNoYWlucyBzZXQgb3V0cHV0IHZvbHVtZSBpbiBzZXRWb2x1bWVfbCgpLgorICAgICAgICAgICAgICAgICh2b2lkKW1FZmZlY3RDaGFpbnNbMF0tPnNldFZvbHVtZV9sKCZ2bCwgJnZyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgdm9sdW1lLgorICAgICAgICAgICAgICAgIHNldFZvbHVtZUZvck91dHB1dF9sKGxlZnQsIHJpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gc2V0dGluZyBvdXRwdXQgc3RyZWFtIHZvbHVtZTogJWQiLCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNTE3NSw2ICs1NTcyLDExIEBACiAgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHByZXZpb3VzVHJhY2sgPT0gMCkgeworICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhbiBvbGQgdHJhY2sgYWRkZWQgYmFjayBkdXJpbmcgdHJhY2sgdHJhbnNpdGlvbiBmb3IgZGlyZWN0CisgICAgICAgIC8vIG91dHB1dCwgc28gYWx3YXlzIGlzc3VlcyBmbHVzaCB0byBmbHVzaCBkYXRhIG9mIHRoZSBwcmV2aW91cyB0cmFjayBpZiBpdAorICAgICAgICAvLyB3YXMgYWxyZWFkeSBkZXN0cm95ZWQgd2l0aCBIQUwgcGF1c2VkLCB0aGVuIGZsdXNoIGNhbiByZXN1bWUgdGhlIHBsYXliYWNrCisgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgIH0KICAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7CiB9CkBAIC01MjEzLDcgKzU2MTUsNiBAQAogICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01MjQ4LDcgKzU2NDksNyBAQAogICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzU3RvcHBpbmdfMigpICYmICF0cmFjay0+aXNTdG9wcGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKQEAgLTUzMTAsNyArNTcxMSw4IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUzMjQsNyArNTcyNiw3IEBACiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3IgbWl4ZXIgc3RhdGUgY29udHJvbAogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTU1NjMsNiArNTk2NSw3IEBACiAgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgZmx1c2ggcmVzZXRzIGZyYW1lIGNvdW50LgogfQogCiBpbnQ2NF90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgewpAQCAtNTgwNiw3ICs2MjA5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTU4NTAsNyArNjI1Myw3IEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgYnVmZmVyIGNhbiBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvIHNvIHdlIG11c3QKQEAgLTU4OTcsNiArNjMwMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwpAQCAtNTkxOCw4ICs2MzI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC02MDYyLDcgKzY0NzMsMjIgQEAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFdyaXR0ZW4gPSBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisKKyAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IE91dHB1dFRyYWNrIGZvciB0aW1lc3RhbXAgYW5kIGZyYW1lIGNvdW50aW5nLgorCisgICAgICAgIC8vIFRoZSB0aHJlYWRMb29wKCkgZ2VuZXJhbGx5IGFzc3VtZXMgd3JpdGluZyBhIGZ1bGwgc2luayBidWZmZXIgc2l6ZSBhdCBhIHRpbWUuCisgICAgICAgIC8vIEhlcmUsIHdlIGNvcnJlY3QgZm9yIHdyaXRlRnJhbWVzIG9mIDAgKGEgc3RvcCkgb3IgdW5kZXJydW5zIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgYWx3YXlzIGNsYWltIHN1Y2Nlc3MuCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgY29ycmVjdGlvbiA9IG1TaW5rQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemUgLSBhY3R1YWxXcml0dGVuOworICAgICAgICAgICAgQUxPR0RfSUYoY29ycmVjdGlvbiAhPSAwICYmIHdyaXRlRnJhbWVzICE9IDAsCisgICAgICAgICAgICAgICAgICAgICIlczogd3JpdGVGcmFtZXM6JXUgIGFjdHVhbFdyaXR0ZW46JXpkICBjb3JyZWN0aW9uOiV6ZCAgbUZyYW1lc1dyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3cml0ZUZyYW1lcywgYWN0dWFsV3JpdHRlbiwgY29ycmVjdGlvbiwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiAtPSBjb3JyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogUmVwb3J0IGNvcnJlY3Rpb24gZm9yIHRoZSBvdGhlciBvdXRwdXQgdHJhY2tzIGFuZCBzaG93IGluIHRoZSBkdW1wLgogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC02MDc2LDkgKzY1MDIsOSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICBNaXhlclRocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgTWl4ZXJUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CiAKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgICBjb25zdCBzaXplX3QgbnVtVHJhY2tzID0gbU91dHB1dFRyYWNrcy5zaXplKCk7CkBAIC02MDg3LDcgKzY1MTMsNyBAQAogICAgICAgICBzcyA8PCAiOiI7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtT3V0cHV0VHJhY2tzKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSB0cmFjay0+dGhyZWFkKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+bmFtZSgpIDw8ICIgOiAiOworICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+aWQoKSA8PCAiIDogIjsKICAgICAgICAgICAgIGlmICh0aHJlYWQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNzIDw8IHRocmVhZC5nZXQoKSA8PCAiLCAiIDw8IHRocmVhZC0+aWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02MjI3LDkgKzY2NTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKICAgICBtSW5wdXQoaW5wdXQpLApAQCAtNjIzNyw5ICs2NjYwLDYgQEAKICAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKLSNpZmRlZiBURUVfU0lOSwotICAgICwgbVRlZVNpbmsodGVlU2luaykKLSNlbmRpZgogICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAogICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCiAgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CkBAIC02MjU2LDggKzY2NzYsMjAgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAorICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CisgICAgfQorCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9pbnB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfSU5fQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKwogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtNjM1NCw3ICs2Nzg2LDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdENhcHR1cmUpOwogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgIC8vIEZJWE1FCkBAIC02MzYyLDYgKzY3OTQsMTAgQEAKIAogICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0KG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfSU5QVVRfVEhSRUFEKTsKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9DIik7CisjZW5kaWYKIGZhaWxlZDogOwogCiAgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQpAQCAtNjQyMiw4ICs2ODU4LDEwIEBACiAgICAgLy8gdXNlZCB0byByZXF1ZXN0IGEgZGVmZXJyZWQgc2xlZXAsIHRvIGJlIGV4ZWN1dGVkIGxhdGVyIHdoaWxlIG11dGV4IGlzIHVubG9ja2VkCiAgICAgdWludDMyX3Qgc2xlZXBVcyA9IDA7CiAKKyAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRSZWFkID0gLTI7ICAvLyBuZXZlciBtYXRjaGVzICJwcmV2aW91cyIgbG9vcCwgd2hlbiBsb29wQ291bnQgPSAwLgorCiAgICAgLy8gbG9vcCB3aGlsZSB0aGVyZSBpcyB3b3JrIHRvIGRvCi0gICAgZm9yICg7OykgeworICAgIGZvciAoaW50NjRfdCBsb29wQ291bnQgPSAwOzsgKytsb29wQ291bnQpIHsgIC8vIGxvb3BDb3VudCB1c2VkIGZvciBzdGF0aXN0aWNzIHRyYWNraW5nCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCiAgICAgICAgIC8vIGFjdGl2ZVRyYWNrcyBhY2N1bXVsYXRlcyBhIGNvcHkgb2YgYSBzdWJzZXQgb2YgbUFjdGl2ZVRyYWNrcwpAQCAtNjQzNSw2ICs2ODczLDggQEAKICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgZmFzdCB0cmFjayB3aGljaCBpcyBhYm91dCB0byBiZSByZW1vdmVkCiAgICAgICAgIHNwPFJlY29yZFRyYWNrPiBmYXN0VHJhY2tUb1JlbW92ZTsKIAorICAgICAgICBib29sIHNpbGVuY2VGYXN0Q2FwdHVyZSA9IGZhbHNlOworCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC02NDg5LDYgKzY5MjksNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNJTkc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0VEOwogICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NTEwLDIyICs2OTUxLDQxIEBACiAgICAgICAgICAgICAgICAgICAgIGFsbFN0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOiAgICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGlkbGUKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0VEOiAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBFRDogLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBkZXN0cm95ZWQvdGVybWluYXRlZAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVW5leHBlY3RlZCBhY3RpdmUgdHJhY2sgc3RhdGU6JWQsIGlkOiVkLCB0cmFja3M6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWN0aXZlVHJhY2tTdGF0ZSwgYWN0aXZlVHJhY2stPmlkKCksIHNpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCghbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrID09IDApOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYWN0aXZlIGZhc3QgdHJhY2sgaXMgc2lsZW5jZWQgZWl0aGVyOgorICAgICAgICAgICAgICAgICAgICAvLyAxKSBzaWxlbmNlIHRoZSB3aG9sZSBjYXB0dXJlIGZyb20gZmFzdCBjYXB0dXJlIGJ1ZmZlciBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBvbmx5IGFjdGl2ZSB0cmFjaworICAgICAgICAgICAgICAgICAgICAvLyAyKSBpbnZhbGlkYXRlIHRoaXMgdHJhY2s6IHRoaXMgd2lsbCBjYXVzZSB0aGUgY2xpZW50IHRvIHJlY29ubmVjdCBhbmQgcG9zc2libHkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgYmUgaW52YWxpZGF0ZWQgYWdhaW4gdW50aWwgdW5zaWxlbmNlZAorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2tUb1JlbW92ZSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tUb1JlbW92ZSA9IGFjdGl2ZVRyYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2woYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVuY2VGYXN0Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrID0gYWN0aXZlVHJhY2s7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CiAgICAgICAgICAgICAgICAgaSsrOwogCi0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFtRmFzdFRyYWNrQXZhaWwpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2sgPT0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjayA9IGFjdGl2ZVRyYWNrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMpOwpAQCAtNjU0MCw3ICs3MDAwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcwotICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2xlZXBVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKICAgICAgICAgICAgICAgICB9CkBAIC02NTkxLDYgKzcwNTEsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGFicCA9IChmYXN0VHJhY2sgIT0gMCAmJiBmYXN0VHJhY2stPmlzUGF0Y2hUcmFjaygpKSA/CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9CdWZmZXJQcm92aWRlcio+KGZhc3RUcmFjay5nZXQoKSkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gYWJwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IGFicDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IGZhc3RUcmFjayA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEIDogZmFzdFRyYWNrLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5tU2lsZW5jZUNhcHR1cmUgIT0gc2lsZW5jZUZhc3RDYXB0dXJlKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1TaWxlbmNlQ2FwdHVyZSA9IHNpbGVuY2VGYXN0Q2FwdHVyZTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOwogICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgewogICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKQEAgLTY2MTMsMTEgKzcwODUsMTEgQEAKIAogICAgICAgICBpbnQzMl90IHJlYXIgPSBtUnNtcEluUmVhciAmIChtUnNtcEluRnJhbWVzUDIgLSAxKTsKICAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkOworICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0JlZ2luTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIHN0YXJ0IElPIHRpbWluZwogCiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKIAogICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCkBAIC02NjcxLDE2ICs3MTQzLDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAvLyBlbmQgSU8gdGltaW5nCisKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBzZXJ2ZXIgc3RhdHMKICAgICAgICAgLy8gc3lzdGVtVGltZSgpIGlzIG9wdGlvbmFsIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyB0aW1lc3RhbXBzLgogICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSArPSBmcmFtZXNSZWFkOwotICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IGxhc3RJb0VuZE5zOwogCiAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2ZXIgdGltZXN0YW1wIHdpdGgga2VybmVsIHN0YXRzCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZS5nZXQoKSA9PSBudWxscHRyIC8qIGRvbid0IG9idGFpbiBmb3IgRmFzdENhcHR1cmUsIGNvdWxkIGJsb2NrICovKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uLCB0aW1lOwotICAgICAgICAgICAgaW50IHJldCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5wdXQtPnN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpID09IE5PX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIHRpbWUgPiBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pIHsKKworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQocG9zaXRpb24sIHRpbWUsIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgdGltZXN0YW1wcworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSB0aW1lOwogICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGdlbmVyYWwgcmVjb3JkIGJ1ZmZlcnMgc2hvdWxkIHRlbmQgdG8gYmUgZW1wdHkgaW4KQEAgLTY2ODgsOCArNzE3OCwxOSBAQAogICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgLy8gQWxzbywgaXQgaXMgbm90IGFkdmFudGFnZW91cyB0byBjYWxsIGdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gZHVyaW5nIHRoZSByZWFkCiAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHJlYWQgb2J0YWlucyBhIGxvY2ssIHByZXZlbnRpbmcgdGhlIHRpbWVzdGFtcCBjYWxsIGZyb20gZXhlY3V0aW5nLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIEZyb20gdGhlIHRpbWVzdGFtcCwgaW5wdXQgcmVhZCBsYXRlbmN5IGlzIG5lZ2F0aXZlIG91dHB1dCB3cml0ZSBsYXRlbmN5LgorICAgICAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gbUlucHV0ICE9IE5VTEwgPyBtSW5wdXQtPmZsYWdzIDogQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gUmVjb3JkVHJhY2s6OmNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZChtRm9ybWF0LCBmbGFncykKKyAgICAgICAgICAgICAgICA/IC0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpIDogMC47CisgICAgICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsgLy8gbm90ZSAwLiBtZWFucyB0aW1lc3RhbXAgaXMgZW1wdHkuCisgICAgICAgICAgICBtTGF0ZW5jeU1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICB9CisKICAgICAgICAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGltZXN0YW1wIGluZm9ybWF0aW9uCiAgICAgICAgIC8vIEFMT0dEKCIlcyIsIG1UaW1lc3RhbXAudG9TdHJpbmcoKS5jX3N0cigpKTsKIApAQCAtNjcwMywxMCArNzIwNCwxMSBAQAogICAgICAgICAgICAgZ290byB1bmxvY2s7CiAgICAgICAgIH0KICAgICAgICAgQUxPR19BU1NFUlQoZnJhbWVzUmVhZCA+IDApOworICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogCi0gICAgICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOwotICAgICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgKHZvaWQpbVRlZS53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKKyNlbmRpZgogICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgogICAgICAgICB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOwpAQCAtNjc2NCw5ICs3MjY2LDMzIEBACiAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIFJlY29yZEJ1ZmZlckNvbnZlcnRlciB1c2VkIGZvciBkaXJlY3Qgc3RyZWFtcy4gUGFzcworICAgICAgICAgICAgICAgICAgICAvLyBzdHJhaWdodCBmcm9tIFJlY29yZFRocmVhZCBidWZmZXIgdG8gUmVjb3JkVHJhY2sgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBidWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihidWZmZXIuZnJhbWVDb3VudCAhPSBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlYWQgbGVzcyB0aGFuIGV4cGVjdGVkICglenUgdnMgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidWZmZXIuZnJhbWVDb3VudCwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGJ1ZmZlci5yYXcsIGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNhbm5vdCBmaWxsIHJlcXVlc3QsIHN0YXR1czogJWQsIGZyYW1lQ291bnQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CkBAIC02Nzg1LDcgKzczMTEsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvdWxkIGRvIGEgcGFydGlhbCBkcm9wIG9mIGZyYW1lc091dAogICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCAtPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCAtPSAoc3NpemVfdClmcmFtZXNPdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC02ODM5LDYgKzczNjUsMjMgQEAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCiAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwogICAgICAgICAvLyBlZmZlY3RDaGFpbnMgZG9lc24ndCBuZWVkIHRvIGJlIGNsZWFyZWQsIHNpbmNlIGl0IGlzIGNsZWFyZWQgYnkgZGVzdHJ1Y3RvciBhdCBzY29wZSBlbmQKKyAgICAgICAgaWYgKGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpCisgICAgICAgICAgICAmJiBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFJlYWQgKyAxKSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHJlYWRQZXJpb2ROcyA9IGxhc3RJb0VuZE5zIC0gbUxhc3RJb0VuZE5zOworICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICB7ZnJhbWVzUmVhZCwgcmVhZFBlcmlvZE5zfSwKKyAgICAgICAgICAgICAgICAgICAgezAsIDB9IC8qIGxhc3RUaW1lc3RhbXAgKi8sIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwcm9jZXNzTXMgPSAobGFzdElvQmVnaW5OcyAtIG1MYXN0SW9FbmROcykgKiAxZS02OworCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgIG1Qcm9jZXNzVGltZU1zLmFkZChwcm9jZXNzTXMpOworICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZSB0aW1pbmcgaW5mby4KKyAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICBtTGFzdElvRW5kTnMgPSBsYXN0SW9FbmROczsKKyAgICAgICAgbGFzdExvb3BDb3VudFJlYWQgPSBsb29wQ291bnQ7CiAgICAgfQogCiAgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwpAQCAtNjkxNyw2ICs3NDYwLDcgQEAKICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKKyAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLApAQCAtNjkzOCw2ICs3NDgyLDEyIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkgJiYgKCpmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgb24gYW4gZW5jb2RlZCBzdHJlYW0gcmVxdWlyZXMgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QiKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC02OTYyLDggKzc1MTIsMTAgQEAKICAgICAgICAgICAgIC8vIHdlIGZvcm1lcmx5IGNoZWNrZWQgZm9yIGEgY2FsbGJhY2sgaGFuZGxlciAobm9uLTAgdGlkKSwKICAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBmb3IgVFJBTlNGRVJfT0JUQUlOIG1vZGUKICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCi0gICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwgKGZyYW1lQ291bnQgPT0gbVBpcGVGcmFtZXNQMikpICYmCisgICAgICAgICAgICAvLyBGcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkICgwKSwgb3IgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBwaXBlIGRlcHRoLgorICAgICAgICAgICAgLy8gSXQgaXMgT0sgdG8gcHJvdmlkZSBhIGhpZ2hlciBjYXBhY2l0eSB0aGFuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIC8vIFdlIHdpbGwgZm9yY2UgaXQgdG8gbVBpcGVGcmFtZXNQMiBiZWxvdy4KKyAgICAgICAgICAgIChmcmFtZUNvdW50IDw9IG1QaXBlRnJhbWVzUDIpICYmCiAgICAgICAgICAgICAvLyBQQ00gZGF0YQogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBmb3JtYXQKQEAgLTcwNDcsNyArNzU5OSw3IEBACiAKICAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBhdHRyLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIG9wUGFja2FnZU5hbWUsIHBvcnRJZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKQEAgLTcxMDMsOCArNzY1NSwxNCBAQAogICAgIHsKICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzdG9wcGVkIHlldCAobW92ZWQgdG8gUEFVU0VEIGFuZCBub3QgaW4gbUFjdGl2ZVRyYWNrcykKKyAgICAgICAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIHN0YXJ0SW5wdXQoKS4KICAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03MTIxLDE3ICs3Njc5LDM2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHZlcmlmeSB0aGF0IHJlY29yZFRyYWNrIGlzIHN0aWxsIGluIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gU1RBUlRJTkdfMiBmb3JjZXMgZGVzdHJveSB0byBjYWxsIHN0b3BJbnB1dC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgbVN0YXRlOiVkIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHN0YXRlLCBsZXQgdGhlbSB0YWtlIG92ZXIsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgbVN0YXRlIGluIHRoZSBuZXcgc3RhdGUuCisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSdyZSBvaywgYnV0IHBlcmhhcHMgc3RhcnRJbnB1dCBoYXMgZmFpbGVkCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogc3RhcnRJbnB1dCBmYWlsZWQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gQWN0aXZlVHJhY2tzIGlmIFNUQVJUSU5HXzEgYW5kIHZhbGlkLCBzbyByZW1vdmUgZnJvbSBBY3RpdmVUcmFja3MsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgaW4gU1RBUlRJTkdfMSwgc28gZGVzdHJveSgpIHdpbGwgbm90IGNhbGwgc3RvcElucHV0LgogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woCisgICAgICAgICAgICAgICAgQVVESU9fQ0xJRU5UX1NUQVJURUQsIHJlY29yZFRyYWNrLT5jcmVhdG9yUGlkKCksIHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udApAQCAtNzEzOSwyNiArNzcxNiwxNSBAQAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKLSAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIGlmICghcmVjb3JkVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLXN0YXJ0RXJyb3I6Ci0gICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7Ci0gICAgfQotICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KLSAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNzE3NywyNCArNzc0MywyOCBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIC8vIGlmIHdlJ3JlIGludmFsaWQsIHdlIGNhbid0IGJlIG9uIHRoZSBBY3RpdmVUcmFja3MuCiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwotICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAotICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBOT1RFOiBXYWl0aW5nIGhlcmUgaXMgaW1wb3J0YW50IHRvIGtlZXAgc3RvcCBzeW5jaHJvbm91cy4KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHBhdGNoUmVjb3JkIHBlZXIgcmVsZWFzZS4KKyAgICB3aGlsZSAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcgJiYgIXJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCisgICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwogICAgIH0KLSAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKLSAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgeworCisgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTRUQpIHsgLy8gc3VjY2Vzc2Z1bCBzdG9wCiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvLyBkb24ndCBoYW5kbGUgYW55dGhpbmcgLSB3ZSd2ZSBiZWVuIGludmFsaWRhdGVkIG9yIHJlc3RhcnRlZCBhbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUKKyAgICBBTE9HV19JRigiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBzdG9wLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTcyMzcsNiArNzgwNywyMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pCit7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKICAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fApAQCAtNzI3OSwyNCArNzg2NCwxNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwotICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwotICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOwotICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwotCiAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQgPSBtSW5wdXQ7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGlucHV0ICE9IE5VTEwgPyBpbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1JbjogJXAgZmxhZ3MgJSN4ICglcylcbiIsCi0gICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIGlucHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlucHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyByZWFkOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNSZWFkKTsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9CiAKQEAgLTczMTIsMTIgKzc4ODcsMTIgQEAKICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RDYXB0dXJlRHVtcFN0YXRlKG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RDYXB0dXJlRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdENhcHR1cmVEdW1wU3RhdGU+KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CiAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgZGVsZXRlIGNvcHk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CkBAIC03MzI4LDcgKzc5MDMsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTczNDgsNyArNzkyMyw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtNzM4Nyw3ICs3OTYyLDcgQEAKICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwogICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogCiAgICAgc2l6ZV90IGZyYW1lc0luOwogICAgIGJvb2wgb3ZlcnJ1biA9IGZhbHNlOwpAQCAtNzQwMSw3ICs3OTc2LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBjbGllbnQgaXMgbm90IGtlZXBpbmcgdXAgd2l0aCBzZXJ2ZXIsIGJ1dCBnaXZlIGl0IGxhdGVzdCBkYXRhCiAgICAgICAgIGZyYW1lc0luID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzOwotICAgICAgICBtUnNtcEluRnJvbnQgPSAvKiBmcm9udCA9ICovIHJlYXIgLSBmcmFtZXNJbjsKKyAgICAgICAgbVJzbXBJbkZyb250ID0gLyogZnJvbnQgPSAqLyBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3coCisgICAgICAgICAgICAgICAgcmVhciwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJhbWVzSW4pKTsKICAgICAgICAgb3ZlcnJ1biA9IHRydWU7CiAgICAgfQogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgIT0gTlVMTCkgewpAQCAtNzQyNSw3ICs4MDAxLDcgQEAKICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwogICAgIGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgIC8vIEZJWE1FIHNob3VsZCBub3QgYmUgUDIgKGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgbGF0ZW5jeSkKICAgICAvLyBGSVhNRSBpZiBjbGllbnQgbm90IGtlZXBpbmcgdXAsIGRpc2NhcmQKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lcykpOwpAQCAtNzQ1OCwxMyArODAzNCwxMyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgaW50MzJfdCBzdGVwQ291bnQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXItPmZyYW1lQ291bnQpOwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBtUnNtcEluVW5yZWwpOwogICAgIG1Sc21wSW5VbnJlbCAtPSBzdGVwQ291bnQ7Ci0gICAgbVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBtUnNtcEluRnJvbnQgPSBhdWRpb191dGlsczo6c2FmZV9hZGRfb3ZlcmZsb3cobVJzbXBJbkZyb250LCBzdGVwQ291bnQpOwogICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQpAQCAtNzYxNCw3ICs4MTkwLDggQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAKICAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7CkBAIC03NjMxLDcgKzgyMDgsMTAgQEAKICAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKICAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSAwOwogICAgICAgICBicmVhazsKLQorICAgIGNhc2UgQVVESU9fQ0xJRU5UX1NUQVJURUQ6CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKKyAgICAgICAgZGVzYy0+bVBvcnRJZCA9IHBvcnRJZDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CkBAIC03NjQzLDEwICs4MjIzLDE1IEBACiB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmbVNhbXBsZVJhdGUsICZtQ2hhbm5lbE1hc2ssICZtSEFMRm9ybWF0KTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgYXVkaW8gcHJvcGVydGllcyBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwotICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsIG1DaGFubmVsQ291bnQsIEZDQ184KTsKICAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpLCAiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfOCwgIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLAorICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIEZDQ184KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDYW4gaGF2ZSBtb3JlIHRoYXQgRkNDXzggY2hhbm5lbHMgaW4gZW5jb2RlZCBzdHJlYW1zLgorICAgICAgICBBTE9HSSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKKyAgICB9CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEZyYW1lU2l6ZSgmbUZyYW1lU2l6ZSk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciByZXRyaWV2aW5nIGZyYW1lIHNpemUgZnJvbSBIQUw6ICVkIiwgcmVzdWx0KTsKICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgmbUJ1ZmZlclNpemUpOwpAQCAtNzY5NiwyNyArODI4MSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vIGhhc0F1ZGlvU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBtVHJhY2tzW2ldLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047Ci0gICAgICAgICAgICBpZiAobVRyYWNrc1tpXS0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYm9vbD4gQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNlc3Npb25JZHMoKSBjb25zdAogewogICAgIEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYm9vbD4gaWRzOwpAQCAtNzc1MCwxMSArODMxNCw2IEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCiB7Ci0gICAgLy8gb25seSBvbmUgY2hhaW4gcGVyIGlucHV0IHRocmVhZAotICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWxyZWFkeSBvbmUgY2hhaW4gJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwogICAgIGNoYWluLT5zZXRUaHJlYWQodGhpcyk7CiAgICAgY2hhaW4tPnNldEluQnVmZmVyKE5VTEwpOwpAQCAtNzc3NCwxMyArODMzMywxNCBAQAogc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCiB7CiAgICAgQUxPR1YoInJlbW92ZUVmZmVjdENoYWluX2woKSAlcCBmcm9tIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKLSAgICBBTE9HV19JRihtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAxLAotICAgICAgICAgICAgInJlbW92ZUVmZmVjdENoYWluX2woKSAlcCBpbnZhbGlkIGNoYWluIHNpemUgJXp1IG9uIHRocmVhZCAlcCIsCi0gICAgICAgICAgICBjaGFpbi5nZXQoKSwgbUVmZmVjdENoYWlucy5zaXplKCksIHRoaXMpOwotICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIG1FZmZlY3RDaGFpbnMucmVtb3ZlQXQoMCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGNoYWluID09IG1FZmZlY3RDaGFpbnNbaV0pIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbUVmZmVjdENoYWlucy5zaXplKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTc3OTAsNiArODM1MCw3IEBACiAKICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKICAgICBtSW5EZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgIG1QYXRjaCA9ICpwYXRjaDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKQEAgLTc4MzEsOSArODM5MiwxMCBAQAogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCi0gICAgaWYgKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB7CisgICAgaWYgKChtSW5EZXZpY2UgIT0gbVByZXZJbkRldmljZSkgfHwgKG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSBtSW5EZXZpY2U7CisgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CkBAIC03ODU2LDI0ICs4NDE4LDI4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVRyYWNrcy5hZGQocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc5MjYsNyArODQ5Miw3IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAogICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX05PTkUpLAotICAgICAgbURldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKICAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKICAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCiAgICAgICBtSGFsVm9sRmxvYXQoLTEuMGYpLCAvLyBJbml0aWFsaXplIHRvIGlsbGVnYWwgdmFsdWUgc28gaXQgYWx3YXlzIGdldHMgc2V0IHByb3Blcmx5IGxhdGVyLgpAQCAtNzk2MCw3ICs4NTI2LDcgQEAKICAgICB9CiAgICAgLy8gVGhpcyB3aWxsIGRlY3JlbWVudCByZWZlcmVuY2VzIGFuZCBtYXkgY2F1c2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoaXMgdGhyZWFkLgogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICB9CkBAIC04MDM5LDYgKzg2MDUsNyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLApAQCAtODA0Nyw3ICs4NjE0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgICAgIEFMT0dEX0lGKCFzZWNvbmRhcnlPdXRwdXRzLmVtcHR5KCksCisgICAgICAgICAgICAgICAgICJNbWFwVGhyZWFkOjpzdGFydCBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzLCBpZ25vcmluZyB0aGVtIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwpAQCAtODA1NSw2ICs4NjI1LDcgQEAKICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDT1JEX1JJSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwKQEAgLTgwNzIsMjEgKzg2NDMsMjAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBib29sIHNpbGVuY2VkID0gZmFsc2U7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQpOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gYWJvcnQgaWYgc3RhcnQgaXMgcmVqZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlczogZXJyb3Igc3RhcnQgcmVqZWN0ZWQgYnkgQXVkaW9Qb2xpY3lNYW5hZ2VyID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgfQpAQCAtODA5NywyMSArODY2NywyMiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCisgICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KKyAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dHB1dCgpLCBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgcG9ydElkKTsKKwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAogICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKLSAgICB9IGVsc2UgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NpbGVuY2VkX2woKSAmJiB0cmFjay0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKLSAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOworICAgIH0gZWxzZSBpZiAoIXRyYWNrLT5pc1NpbGVuY2VkX2woKSkgeworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAodC0+aXNTaWxlbmNlZF9sKCkgJiYgdC0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKKyAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPwotICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKLSAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTgxNTgsOCArODcyOSw4IEBACiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHRyYWNrLT5wb3J0SWQoKSk7CkBAIC04MTg0LDcgKzg3NTUsNyBAQAogICAgIGlmIChtSGFsU3RyZWFtID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTgyMTUsOSArODc4NiwxMSBAQAogCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKKyAgICAgICAgeyAvLyB1bmRlciBUaHJlYWQgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgICAgIGlmIChtU2lnbmFsUGVuZGluZykgewogICAgICAgICAgICAgLy8gQSBzaWduYWwgd2FzIHJhaXNlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkCiAgICAgICAgICAgICBtU2lnbmFsUGVuZGluZyA9IGZhbHNlOwpAQCAtODI1MiwxMCArODgyNSwxMyBAQAogICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCk7CiAKICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CisgICAgICAgIH0gLy8gcmVsZWFzZSBUaHJlYWQgbG9jaworCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7IC8vIFRocmVhZCBpcyBub3QgbG9ja2VkLCBidXQgZWZmZWN0IGNoYWluIGlzIGxvY2tlZAogICAgICAgICB9Ci0gICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorCisgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbiwgaW5jbHVkaW5nIG1vdmluZyB0byBhbm90aGVyIHRocmVhZC4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2lsbCBiZSBhY3R1YWxseSBkZWxldGVkIGhlcmUgaWYgdGhleSB3ZXJlIHJlbW92ZWQgZnJvbQogICAgICAgICAvLyBtRWZmZWN0Q2hhaW5zIGxpc3QgZHVyaW5nIG1peGluZyBvciBlZmZlY3RzIHByb2Nlc3NpbmcKQEAgLTgzMjAsNyArODg5Niw4IEBACiAgICAgcmV0dXJuIFN0cmluZzgoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgX191bnVzZWQpIHsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogCiAgICAgZGVzYy0+bUlvSGFuZGxlID0gbUlkOwpAQCAtODQxMSw3ICs4OTg4LDcgQEAKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIGlmIChpc091dHB1dCgpICYmIG1QcmV2T3V0RGV2aWNlICE9IG1PdXREZXZpY2UpIHsKKyAgICBpZiAoaXNPdXRwdXQoKSAmJiAobVByZXZPdXREZXZpY2UgIT0gbU91dERldmljZSB8fCBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpKSB7CiAgICAgICAgIG1QcmV2T3V0RGV2aWNlID0gdHlwZTsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKQEAgLTg0MjIsNyArODk5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQotICAgIGlmICghaXNPdXRwdXQoKSAmJiBtUHJldkluRGV2aWNlICE9IG1JbkRldmljZSkgeworICAgIGlmICghaXNPdXRwdXQoKSAmJiAobVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UgfHwgbURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBtUHJldkluRGV2aWNlID0gdHlwZTsKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwpAQCAtODQ1NSw5ICs5MDMyLDkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIFRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1BdWRpb0h3RGV2LT5oYW5kbGUoKTsKQEAgLTg1MTYsMjggKzkwOTMsNiBAQAogICAgIHJldHVybiBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQogewogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTg2MDYsMjggKzkxNjEsMTcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwotICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwotICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOwotICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKLQogICAgIGRwcmludGYoZmQsICIgIEF0dHJpYnV0ZXM6IGNvbnRlbnQgdHlwZSAlZCB1c2FnZSAlZCBzb3VyY2UgJWRcbiIsCiAgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsIG1BdHRyLnVzYWdlLCBtQXR0ci5zb3VyY2UpOwogICAgIGRwcmludGYoZmQsICIgIFNlc3Npb246ICVkIHBvcnQgSWQ6ICVkXG4iLCBtU2Vzc2lvbklkLCBtUG9ydElkKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgY2xpZW50c1xuIik7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBzaXplX3QgbnVtdHJhY2tzID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CkBAIC04NjM1LDcgKzkxNzksNyBAQAogICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwpAQCAtODg0MSw5ICs5Mzg1LDE4IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewotICAgIE1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woZmQsIGFyZ3MpOwogCiAgICAgZHByaW50ZihmZCwgIiAgU3RyZWFtIHR5cGU6ICVkIFN0cmVhbSB2b2x1bWU6ICVmIEhBTCB2b2x1bWU6ICVmIFN0cmVhbSBtdXRlICVkXG4iLAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1TdHJlYW1Wb2x1bWUsIG1IYWxWb2xGbG9hdCwgbVN0cmVhbU11dGUpOwpAQCAtODg2Myw3ICs5NDE2LDEzIEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OmV4aXRTdGFuZGJ5KCkKIHsKLSAgICBtSW5wdXQtPnN0cmVhbS0+c2V0R2FpbigxLjBmKTsKKyAgICB7CisgICAgICAgIC8vIG1JbnB1dCBtaWdodCBoYXZlIGJlZW4gY2xlYXJlZCBieSBjbGVhcklucHV0KCkKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxscHRyICYmIG1JbnB1dC0+c3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBNbWFwVGhyZWFkOjpleGl0U3RhbmRieSgpOwogfQogCkBAIC04OTMxLDQgKzk0OTAsMTMgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggMzNkNjkyMy4uYzZhODIwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC00Myw5ICs0Myw2IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKIAotICAgIHZvaWQgZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2b2lkIGR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQogICAgIHZvaWQgY2xlYXJQb3dlck1hbmFnZXIoKTsKIAogICAgIC8vIGJhc2UgZm9yIHJlY29yZCBhbmQgcGxheWJhY2sKQEAgLTEwNiw4ICsxMDMsOSBAQAogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6Ci0gICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCkge30KKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CisgICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCksIG1Qb3J0SWQocG9ydElkKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJJTyBldmVudDogZXZlbnQgJWRcbiIsIG1FdmVudCk7CkBAIC0xMTUsMTMgKzExMywxNCBAQAogCiAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CiAgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90ICAgbVBvcnRJZDsKICAgICB9OwogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6CisgICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CiAgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pIHsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3IElvQ29uZmlnRXZlbnREYXRhKGV2ZW50LCBwaWQpOworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KICAgICB9OwpAQCAtMjYzLDEzICsyNjIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpID0gMDsKICAgICAgICAgICAgICAgICAvLyBzZW5kQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICAgIC8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbQogICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NDb25maWdFdmVudHNfbCgpLgogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb25maWdFdmVudF9sKHNwPENvbmZpZ0V2ZW50PiYgZXZlbnQpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbywgYm9vbCBmb3JBcHApOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnRfbChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvLCBib29sIGZvckFwcCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKTsKQEAgLTI4MSw3ICsyODMsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwogCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCkBAIC0zMTgsNiArMzIwLDcgQEAKICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0RWZmZWN0Q2hhaW4oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgLy8gc2FtZSBhcyBnZXRFZmZlY3RDaGFpbigpIGJ1dCBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2UgbXV0ZXggbG9ja2VkCiAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldEVmZmVjdENoYWluX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBnZXRFZmZlY3RJZHNfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAvLyBhZGQgYW4gZWZmZWN0IGNoYWluIHRvIHRoZSBjaGFpbiBsaXN0IChtRWZmZWN0Q2hhaW5zKQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikgPSAwOwogICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbiBlZmZlY3QgY2hhaW4gZnJvbSB0aGUgY2hhaW4gbGlzdCAobUVmZmVjdENoYWlucykKQEAgLTMzNyw3ICszNDAsOCBAQAogICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3QoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0X2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICAvLyBhZGQgYW5kIGVmZmVjdCBtb2R1bGUuIEFsc28gY3JlYXRlcyB0aGUgZWZmZWN0IGNoYWluIGlzIG5vbmUgZXhpc3RzIGZvcgotICAgICAgICAgICAgICAgIC8vIHRoZSBlZmZlY3RzIGF1ZGlvIHNlc3Npb24KKyAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0cyBhdWRpbyBzZXNzaW9uLiBPbmx5IGNhbGxlZCBpbiBhIGNvbnRleHQgb2YgbW92aW5nIGFuIGVmZmVjdAorICAgICAgICAgICAgICAgIC8vIGZyb20gb25lIHRocmVhZCB0byBhbm90aGVyCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgYWRkRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCBlZmZlY3QgbW9kdWxlLiBBbHNvIHJlbW92ZXMgdGhlIGVmZmVjdCBjaGFpbiBpcyB0aGlzIHdhcyB0aGUgbGFzdAogICAgICAgICAgICAgICAgIC8vIGVmZmVjdApAQCAtMzU2LDYgKzM2MCwyNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBjb25zdCBUJiB0cmFja3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tCYXNlPiYgdHJhY2sgPSB0cmFja3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdHJhY2stPmlzSW52YWxpZCgpICAgICAgIC8vIG5vdCB5ZXQgcmVtb3ZlZCBmcm9tIHRyYWNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOyAgLy8gY2F1dGlvbiwgb25seSByZXByZXNlbnRzIGZpcnN0IHRyYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkKQpAQCAtMzkzLDYgKzQxOCwxNSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBicm9hZGNhc3RfbCgpOwogCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgaXNNc2REZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNNc2REZXZpY2U7IH0KKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgICAgICAgICAgICAgLy8gZGVsaXZlciBzdGF0cyB0byBtZWRpYW1ldHJpY3MuCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RhdGlzdGljcyhib29sIGZvcmNlKTsKKwogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogCiBwcm90ZWN0ZWQ6CkBAIC00MzQsNiArNDY4LDE3IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyTW9ub19sKGJvb2wgbW9ubyBfX3VudXNlZCkgeyB9CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgcmVxdWlyZU1vbm9CbGVuZCgpIHsgcmV0dXJuIGZhbHNlOyB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgd2l0aGluIHRoZSB0aHJlYWRMb29wIHRvIG9idGFpbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMLgorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wIF9fdW51c2VkKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzX2woaW50IGZkIF9fdW51c2VkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgfQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3NfbChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsgfQorCisKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBtRWZmZWN0Q2hhaW5zCiAKICAgICAgICAgICAgICAgICBjb25zdCB0eXBlX3QgICAgICAgICAgICBtVHlwZTsKQEAgLTQ3Myw2ICs1MTgsMTAgQEAKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldk91dERldmljZTsgICAvLyBwcmV2aW91cyBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVByZXZJbkRldmljZTsgICAgLy8gcHJldmlvdXMgaW5wdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgbVBhdGNoOworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEBicmllZiBtRGV2aWNlSWQgIGN1cnJlbnQgZGV2aWNlIHBvcnQgdW5pcXVlIGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgIG1BdWRpb1NvdXJjZTsKIAogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1JZDsKQEAgLTQ5MywxMCArNTQyLDMxIEBACiAgICAgICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbU5CTG9nV3JpdGVyOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeTsKICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAgICAgICBtVGltZXN0YW1wOworICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPCAvLyBGb3IgdGltZXN0YW1wIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgICAgICAgICAgICAgLy8gVGhyZWFkTG9vcCBzdGF0aXN0aWNzIHBlciBpdGVyYXRpb24uCisgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvRW5kTnMgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlYWQgdW5kZXIgVGhyZWFkQmFzZSBsb2NrIChpZiBub3Qgb24gdGhlIHRocmVhZExvb3AgdGhyZWFkKS4KKyAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1Jb0ppdHRlck1zezAuOTk1IC8qIGFscGhhICovfTsKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1Qcm9jZXNzVGltZU1zezAuOTk1IC8qIGFscGhhICovfTsKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1MYXRlbmN5TXN7MC45OTUgLyogYWxwaGEgKi99OworCisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgbGFzdCBjb3VudCB3aGVuIHdlIGRlbGl2ZXJlZCBzdGF0aXN0aWNzIHRvIG1lZGlhbWV0cmljcy4KKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdFJlY29yZGVkVGltZXN0YW1wVmVyaWZpZXJOID0gMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdFJlY29yZGVkVGltZU5zID0gMDsgIC8vIEJPT1RUSU1FIHRvIGluY2x1ZGUgc3VzcGVuZC4KKworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Jc01zZERldmljZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIC8vIEEgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBldmFsdWF0ZWQgYnkgdGhlIHRocmVhZCBsb29wIGhhcyBjaGFuZ2VkIGFuZAogICAgICAgICAgICAgICAgIC8vIHdlIG11c3Qgbm90IHdhaXQgZm9yIGFzeW5jIHdyaXRlIGNhbGxiYWNrIGluIHRoZSB0aHJlYWQgbG9vcCBiZWZvcmUgZXZhbHVhdGluZyBpdAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TaWduYWxQZW5kaW5nOwogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgICAgICBOQkFJT19UZWUgICAgICAgICAgICAgICBtVGVlOworI2VuZGlmCiAgICAgICAgICAgICAgICAgLy8gQWN0aXZlVHJhY2tzIGlzIGEgc29ydGVkIHZlY3RvciBvZiB0cmFjayB0eXBlIFQgcmVwcmVzZW50aW5nIHRoZQogICAgICAgICAgICAgICAgIC8vIGFjdGl2ZSB0cmFja3Mgb2YgdGhyZWFkTG9vcCgpIHRvIGJlIGNvbnNpZGVyZWQgYnkgdGhlIGxvY2tlZCBwcmVwYXJlIHBvcnRpb24uCiAgICAgICAgICAgICAgICAgLy8gQWN0aXZlVHJhY2tzIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBUaHJlYWRCYXNlIGxvY2sgaGVsZC4KQEAgLTU0Myw2ICs2MTMsOSBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxUPiYgaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaW5kZXhPZihpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTkzLDYgKzY2NiwxMCBAQAogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOworCitwcml2YXRlOgorICAgICAgICAgICAgICAgIHZvaWQgZHVtcEJhc2VfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgICAgIHZvaWQgZHVtcEVmZmVjdENoYWluc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiB9OwogCiBjbGFzcyBWb2x1bWVJbnRlcmZhY2UgewpAQCAtNjQ1LDggKzcyMiw2IEBACiAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCkBAIC02OTYsNiArNzcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMsIHRydWUgLyogZm9yY2UgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3NfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobU91dHB1dCA9PSBOVUxMKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQpAQCAtNzA3LDExICs3ODUsMTQgQEAKIAogICAgICAgICAgICAgICAgIC8vIFZvbHVtZUludGVyZmFjZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpOwogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIHN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRWb2x1bWVGb3JPdXRwdXRfbChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3Q7CisKICAgICAgICAgICAgICAgICBzcDxUcmFjaz4gICBjcmVhdGVUcmFja19sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLApAQCAtNzI2LDYgKzgwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovLApAQCAtNzQ5LDcgKzgzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVN1c3BlbmRlZCkgPiAwOyB9CiAKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWxzbyByZW1vdmluZyBhbmQgcGFzc2luZyBhbiBleHBsaWNpdCBtTWFpbkJ1ZmZlciBpbml0aWFsaXphdGlvbgogICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciB0byBBRjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpUcmFjaygpLgpAQCAtNzY0LDcgKzg0Nyw5IEBACiAKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKIApAQCAtNzgyLDcgKzg2Nyw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBhc3luY2hyb25vdXMgc2lnbmFsIHdhaXQgdGltZS4KICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgeyByZXR1cm4gSU5UNjRfTUFYOyB9CkBAIC03OTksNiArODg0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzLnNpemUoKSA8IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgJiBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkgJiYgcG9wY291bnQoZGV2aWNlKSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtODc4LDYgKzk2OCwxMSBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbjsKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZEZyYW1lczsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKKworICAgIC8vIG1IYXB0aWNDaGFubmVsTWFzayBhbmQgbUhhcHRpY0NoYW5uZWxDb3VudCB3aWxsIG9ubHkgYmUgdmFsaWQgd2hlbiB0aGUgdGhyZWFkIHN1cHBvcnQKKyAgICAvLyBoYXB0aWMgcGxheWJhY2suCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gMDsKIHByaXZhdGU6CiAgICAgLy8gbU1hc3Rlck11dGUgaXMgaW4gYm90aCBQbGF5YmFja1RocmVhZCBhbmQgaW4gQXVkaW9GbGluZ2VyLiAgV2hlbiBhCiAgICAgLy8gUGxheWJhY2tUaHJlYWQgbmVlZHMgdG8gZmluZCBvdXQgaWYgbWFzdGVyLW11dGVkLCBpdCBjaGVja3MgaXQncyBsb2NhbApAQCAtOTMwLDE5ICsxMDI1LDE5IEBACiAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIGZpbmFsOwogICAgIHZpcnR1YWwgdm9pZCBzZW5kTWV0YWRhdGFUb0JhY2tlbmRfbChjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyBuYW1lcyBmb3IgYWxsIHRyYWNrcwotICAgIC8vIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIFRocmVhZC4KKyAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgdHJhY2tzIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIFRocmVhZC4KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICBjbGFzcyBUcmFja3MgewogICAgIHB1YmxpYzoKLSAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja05hbWVzKSA6Ci0gICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja05hbWVzKHNhdmVEZWxldGVkVHJhY2tOYW1lcykgeyB9CisgICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tJZHMpIDoKKyAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrSWRzKHNhdmVEZWxldGVkVHJhY2tJZHMpIHsgfQogCiAgICAgICAgIC8vIFNvcnRlZFZlY3RvciBtZXRob2RzCi0gICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKTsKKyAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmFkZCh0cmFjayk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImNhbm5vdCBhZGQgdHJhY2siKTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQogICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CiAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwpAQCAtOTYzLDI4ICsxMDU4LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5lbmQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCAgICAgICAgICBwcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gbURlbGV0ZWRUcmFja05hbWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBtRGVsZXRlZFRyYWNrTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZihuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHNpemVfdCAgICAgICAgICBwcm9jZXNzRGVsZXRlZFRyYWNrSWRzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGludCB0cmFja0lkIDogbURlbGV0ZWRUcmFja0lkcykgeworICAgICAgICAgICAgICAgIGYodHJhY2tJZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBtRGVsZXRlZFRyYWNrSWRzLnNpemUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja05hbWVzKCkgeyBtRGVsZXRlZFRyYWNrTmFtZXMuY2xlYXIoKTsgfQorICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tJZHMoKSB7IG1EZWxldGVkVHJhY2tJZHMuY2xlYXIoKTsgfQogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgLy8gVHJhY2sgbmFtZXMgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCi0gICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tOYW1lczsgLy8gdHJ1ZSB0byBlbmFibGUgdHJhY2tpbmcKLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtRGVsZXRlZFRyYWNrTmFtZXM7Ci0KLSAgICAgICAgLy8gRmFzdCBsb29rdXAgb2YgcHJldmlvdXNseSBkZWxldGVkIHRyYWNrIG5hbWVzIGZvciByZXVzZS4KLSAgICAgICAgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgZGVjaXNpb24gKGFjdHVhbGx5IGFueSBub24tbmVnYXRpdmUKLSAgICAgICAgLy8gaW50ZWdlciB0aGF0IGlzbid0IGluIG1UcmFja3NbKl0tPm5hbWVzKCkgY291bGQgYmUgdXNlZCkgLSB3ZSBhdHRlbXB0Ci0gICAgICAgIC8vIHRvIHVzZSB0aGUgc21hbGxlc3QgcG9zc2libGUgYXZhaWxhYmxlIG5hbWUuCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbVVudXNlZFRyYWNrTmFtZXM7CisgICAgICAgIC8vIFRyYWNrcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKKyAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja0lkczsgLy8gdHJ1ZSB0byBlbmFibGUgdHJhY2tpbmcKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBtRGVsZXRlZFRyYWNrSWRzOwogCiAgICAgICAgIFNvcnRlZFZlY3RvcjxzcDxUPj4gbVRyYWNrczsgLy8gd3JhcHBlZCBTb3J0ZWRWZWN0b3IuCiAgICAgfTsKQEAgLTk5NSw3ICsxMDgxLDggQEAKICAgICBBdWRpb1N0cmVhbU91dCAgICAgICAgICAgICAgICAgICptT3V0cHV0OwogCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwotICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWU7CisgICAgc3RkOjphdG9taWM8ZmxvYXQ+ICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZXt9OworICAgIGF1ZGlvX3V0aWxzOjpCYWxhbmNlICAgICAgICAgICAgbUJhbGFuY2U7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtV3JpdGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXM7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5Xcml0ZTsKQEAgLTEwNTQsMTYgKzExNDEsMTMgQEAKICAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtUGlwZVNpbms7CiAgICAgLy8gVGhlIGN1cnJlbnQgc2luayBmb3IgdGhlIG5vcm1hbCBtaXhlciB0byB3cml0ZSBpdCdzIChzdWIpbWl4LCBtT3V0cHV0U2luayBvciBtUGlwZVNpbmsKICAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtTm9ybWFsU2luazsKLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIEZvciBkdW1wc3lzCi0gICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiAgICAgICAgbVRlZVNvdXJjZTsKLSNlbmRpZgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TY3JlZW5TdGF0ZTsgICAvLyBjYWNoZWQgY29weSBvZiBnU2NyZWVuU3RhdGUKICAgICAvLyBUT0RPOiBhZGQgY29tbWVudCBhbmQgYWRqdXN0IHNpemUgYXMgbmVlZGVkCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAga0Zhc3RNaXhlckxvZ1NpemUgPSA4ICogMTAyNDsKICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXI7CiAKKyAgICAvLyBEb3duc3RyZWFtIHBhdGNoIGxhdGVuY3ksIGF2YWlsYWJsZSBpZiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMC4KKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNc3swLjk5OX07CiAKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCA9IDA7CkBAIC0xMDk1LDcgKzExNzksNiBAQAogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1RyYWNrQWxsb3dlZF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTExMTQsMTIgKzExOTcsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIHNzaXplX3QgICAgIHRocmVhZExvb3Bfd3JpdGUoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTExNTIsNiArMTIzNiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKCp0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgIHNldE1hc3Rlck1vbm9fbChib29sIG1vbm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsKQEAgLTExNjMsMjcgKzEyNTUsNDMgQEAKICAgICAgICAgICAgICAgICAvLyBCbGVuZGluZyB3aXRoIGxpbWl0ZXIgaXMgbm90IGlkZW1wb3RlbnQsCiAgICAgICAgICAgICAgICAgLy8gYW5kIGJsZW5kaW5nIHdpdGhvdXQgbGltaXRlciBpcyBpZGVtcG90ZW50IGJ1dCBpbmVmZmljaWVudCB0byBkbyB0d2ljZS4KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgIHJlcXVpcmVNb25vQmxlbmQoKSB7IHJldHVybiBtTWFzdGVyTW9uby5sb2FkKCkgJiYgIWhhc0Zhc3RNaXhlcigpOyB9CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdE1peGVyLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIERpcmVjdE91dHB1dFRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CiBwdWJsaWM6CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQorICAgICAgICA6IERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkgeyB9CisKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RGlyZWN0T3V0cHV0VGhyZWFkKCk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKwogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKQEAgLTExOTMsMTAgKzEzMDEsMTAgQEAKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCi0gICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlOworICAgIGJvb2wgbVZvbHVtZVNoYXBlckFjdGl2ZSA9IGZhbHNlOwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdm9pZCBwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjayk7CiAKQEAgLTEyMDUsMTAgKzEzMTMsMzEgQEAKIAogICAgIHdwPFRyYWNrPiAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYWNrOyAgICAgICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHRyYWNrIHN3aXRjaAogCisgICAgLy8gVGhpcyBtdXN0IGJlIGluaXRpYWxpemVkIGZvciBpbml0aWFsIGNvbmRpdGlvbiBvZiBtTWFzdGVyQmFsYW5jZSA9IDAgKGRpc2FibGVkKS4KKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZUxlZnQgPSAxLmY7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2VSaWdodCA9IDEuZjsKKwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzLCBxdWVyeSB0aGUgb3V0cHV0IHNpbmsgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cG9zaXRpb242NCwgJnRpbWUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGludDY0X3QpdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQogfTsKIAogY2xhc3MgT2ZmbG9hZFRocmVhZCA6IHB1YmxpYyBEaXJlY3RPdXRwdXRUaHJlYWQgewpAQCAtMTI4Miw4ICsxNDExLDYgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RHVwbGljYXRpbmdUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKLQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZE91dHB1dFRyYWNrKE1peGVyVGhyZWFkKiB0aHJlYWQpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU91dHB1dFRyYWNrKE1peGVyVGhyZWFkKiB0aHJlYWQpOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHdhaXRUaW1lTXMoKSBjb25zdCB7IHJldHVybiBtV2FpdFRpbWVNczsgfQpAQCAtMTI5Miw2ICsxNDE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKSBvdmVycmlkZTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG91dHB1dHNSZWFkeShjb25zdCBTb3J0ZWRWZWN0b3I8IHNwPE91dHB1dFRyYWNrPiA+ICZvdXRwdXRUcmFja3MpOwpAQCAtMTMxNiw2ICsxNDQ0LDIyIEBACiAgICAgU29ydGVkVmVjdG9yIDwgc3A8T3V0cHV0VHJhY2s+ID4gIG1PdXRwdXRUcmFja3M7CiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dFRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBmb3J3YXJkIHRoZSBmaXJzdCBPdXRwdXRUcmFjaydzIGtlcm5lbCBpbmZvcm1hdGlvbiBmb3IgdGltZXN0YW1wLgorICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgdHJhY2tUaW1lc3RhbXAgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0VHJhY2tzWzBdLT5nZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpOworICAgICAgICAgICAgaWYgKHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPiAwKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsgIC8vIGRpc2NhcmQgc2VydmVyIHRpbWVzdGFtcCAtIHRoYXQncyBpZ25vcmVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiB9OwogCiAvLyByZWNvcmQgdGhyZWFkCkBAIC0xMzc0LDkgKzE1MTgsNiBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHZpcnR1YWwgICAgIH5SZWNvcmRUaHJlYWQoKTsKIApAQCAtMTM4NCw5ICsxNTI1LDYgQEAKICAgICB2b2lkICAgICAgICBkZXN0cm95VHJhY2tfbChjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHRyYWNrKTsKICAgICB2b2lkICAgICAgICByZW1vdmVUcmFja19sKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgdHJhY2spOwogCi0gICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcHJlRXhpdCgpOwpAQCAtMTQwOSw2ICsxNTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLApAQCAtMTQyNCw3ICsxNTYzLDYgQEAKICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gZG8gaXQncyBwYXJ0IG9mIHRoZSBzdG9wcGluZyBwcm9jZXNzCiAgICAgICAgICAgICBib29sICAgICAgICBzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdDsKIApAQCAtMTQzMywyMCArMTU3MSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCi0gICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldElucHV0RnJhbWVzTG9zdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwogICAgIHZpcnR1YWwgc2l6ZV90IHJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkQmFzZTo6aGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkLCBtVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzZXQgb2YgdW5pcXVlIHNlc3Npb24gSURzIGFjcm9zcyBhbGwgdHJhY2tzLgogICAgICAgICAgICAgLy8gVGhlIGtleXMgYXJlIHRoZSBzZXNzaW9uIElEcywgYW5kIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBhcmUgbWVhbmluZ2xlc3MuCkBAIC0xNDYwLDcgKzE2MDEsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RDYXB0dXJlICE9IDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKQEAgLTE0NzgsOCArMTYxOSwyMyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCiAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CiAKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGZhc3RUcmFja0F2YWlsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0VHJhY2tBdmFpbDsgfQorCisgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyBwb3Bjb3VudCBmb3IgZXhhY3RseSBvbmUgZGV2aWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19pbnB1dF9kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5EZXZpY2UgJiBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwogICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC0xNTA3LDggKzE2NjMsNiBAQAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwotICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7Ci0KICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZApAQCAtMTU1MSw2ICsxNzA1LDggQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogICAgICAgICAgICAgLy8gY29tbW9uIHN0YXRlIHRvIGFsbCByZWNvcmQgdGhyZWFkcwogICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY1N1c3BlbmRlZDsKKworICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQgPSAwOyAgICAvLyBjb250aW51b3VzIHJ1bm5pbmcgY291bnRlci4KIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTU5NywxMyArMTc1MywxNCBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSGFsUGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsICAgICBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxTdHJlYW07IH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtMTYxMSw3ICsxNzY4LDEwIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCi0gICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB1c2luZyBtQWN0aXZlVHJhY2tzIGFzIG5vIG1UcmFja3MgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbUFjdGl2ZVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3Q7CiAKQEAgLTE2MjYsMTUgKzE3ODYsMTIgQEAKICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkIF9fdW51c2VkLCBib29sIHNpbGVuY2VkIF9fdW51c2VkKSB7fQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cjsKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwotICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZDsKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOwogCiAgICAgICAgICAgICAgICAgd3A8TW1hcFN0cmVhbUNhbGxiYWNrPiAgbUNhbGxiYWNrOwpAQCAtMTY4MSwxMyArMTgzOCwxNCBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc1ZvbHVtZV9sKCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc091dHB1dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwogICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwpAQCAtMTcxNSw2ICsxODczLDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IDNiODM2OWYuLjY1NTg5ZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTI1LDEzICsyNSwxMyBAQAogcHVibGljOgogICAgIGVudW0gdHJhY2tfc3RhdGUgewogICAgICAgICBJRExFLAotICAgICAgICBGTFVTSEVELAorICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKICAgICAgICAgLy8gbmV4dCAyIHN0YXRlcyBhcmUgY3VycmVudGx5IHVzZWQgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgIC8vIGFuZCBvZmZsb2FkZWQgdHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBJTkdfMSwgICAgIC8vIHdhaXRpbmcgZm9yIGZpcnN0IHVuZGVycnVuCiAgICAgICAgIFNUT1BQSU5HXzIsICAgICAvLyB3YWl0aW5nIGZvciBwcmVzZW50YXRpb24gY29tcGxldGUKLSAgICAgICAgUkVTVU1JTkcsCisgICAgICAgIFJFU1VNSU5HLCAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCiAgICAgICAgIFBBVVNFRCwKQEAgLTU0LDExICs1NCw2IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKLSAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCi0gICAgfTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLApAQCAtNjksNiArNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGUgYWxsb2MgPSBBTExPQ19DQkxLLApAQCAtODQsNiArODAsOCBAQAogICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrKCkgY29uc3QgeyByZXR1cm4gbUNibGs7IH0KICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CiAgICAgICAgICAgICB1aWRfdCAgICAgICB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CisgICAgICAgICAgICBwaWRfdCAgICAgICBjcmVhdG9yUGlkKCkgY29uc3QgeyByZXR1cm4gbUNyZWF0b3JQaWQ7IH0KKwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCkBAIC05MSw2ICs4OSw3IEBACiAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CiAgICAgICAgICAgICBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0V4dGVybmFsVHJhY2soKSBjb25zdCB7IHJldHVybiAhaXNPdXRwdXRUcmFjaygpICYmICFpc1BhdGNoVHJhY2soKTsgfQpAQCAtOTgsOCArOTcsMTExIEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICBpbnZhbGlkYXRlKCkgeyBtSXNJbnZhbGlkID0gdHJ1ZTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUlzSW52YWxpZDsgfQogCisgICAgICAgICAgICB2b2lkICAgICAgICB0ZXJtaW5hdGUoKSB7IG1UZXJtaW5hdGVkID0gdHJ1ZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUZXJtaW5hdGVkKCkgY29uc3QgeyByZXR1cm4gbVRlcm1pbmF0ZWQ7IH0KKwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHRoZSBidWZmZXIgY29udGVudHMgc2l6ZSBjb252ZXJ0ZWQgdG8gdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAqIGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHN0cmVhbWluZyB0cmFja3MuIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IKKyAgICAgICAgICAgICAqIFBDTSBzdGF0aWMgdHJhY2tzIGFuZCBub3QgZGVmaW5lZCBmb3Igbm9uLVBDTSB0cmFja3MuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLgorICAgICAgICAgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCkgKiAxMDAwIC8gc2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSB0cmFjayBzdXBwb3J0cyBzZXJ2ZXIgbGF0ZW5jeSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgdHJhY2sgbGlmZXRpbWUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQ7IH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSBzZXJ2ZXIgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFjaworICAgICAgICAgICAgICogdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4gIFRoaXMgaXMgdGhlIHRpbWUgZm9yIHRoZSBuZXh0IGZyYW1lIGluIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRoZSBkZXZpY2Ugc291cmNlIG9yIHNpbmsuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIHNlcnZlciB0aHJlYWQgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNvdXJjZS9zaW5rLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFNlcnZlckxhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRocmVhZCBsb2NrIGlzIGFjcXVpcmVkLCB0aGVzZSBhdG9taWNzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLCBjb25zaWRlcmVkIGEgYmVuaWduIHJhY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgc2VydmVyTGF0ZW5jeU1zID0gbVNlcnZlckxhdGVuY3lNcy5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckxhdGVuY3lNcyA9PSAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJvbVRyYWNrID0gbVNlcnZlckxhdGVuY3lGcm9tVHJhY2subG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSB0b3RhbCBjbGllbnQgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFja3MKKyAgICAgICAgICAgICAqIGZvciB0aGUgbmV4dCBjbGllbnQgYXBwIGFjY2VzcyB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlOyBpLmUuIHRoZQorICAgICAgICAgICAgICogc2VydmVyIGxhdGVuY3kgcGx1cyB0aGUgYnVmZmVyIGxhdGVuY3kuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIGNsaWVudCBhcHAgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNpbmsvc291cmNlLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRyYWNrTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTZXJ2ZXJMYXRlbmN5TXMoJnNlcnZlckxhdGVuY3lNcywgZnJvbVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXMgKyBidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBleHRlcm5hbC4KKyAgICAgICAgICAgc3RydWN0IEZyYW1lVGltZSB7CisgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lczsKKyAgICAgICAgICAgICAgIGludDY0X3QgdGltZU5zOworICAgICAgICAgICB9OworCisgICAgICAgICAgIC8vIEtlcm5lbEZyYW1lVGltZSBpcyB1cGRhdGVkIHBlciAibWl4IiBwZXJpb2QgZXZlbiBmb3Igbm9uLXBjbSB0cmFja3MuCisgICAgICAgICAgIHZvaWQgICAgICAgICBnZXRLZXJuZWxGcmFtZVRpbWUoRnJhbWVUaW1lICpmdCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZ0ID0gbUtlcm5lbEZyYW1lVGltZS5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0xMTEsOCArMjEzLDYgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVNpemU7IH0KQEAgLTEzNiwxNCArMjM2LDYgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVE9QUElOR18yOwogICAgIH0KIAotICAgIGJvb2wgaXNUZXJtaW5hdGVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRlcm1pbmF0ZWQ7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgICAgIG1UZXJtaW5hdGVkID0gdHJ1ZTsKLSAgICB9Ci0KICAgICAvLyBVcHBlciBjYXNlIGNoYXJhY3RlcnMgYXJlIGZpbmFsIHN0YXRlcy4KICAgICAvLyBMb3dlciBjYXNlIGNoYXJhY3RlcnMgYXJlIHRyYW5zaXRvcnkuCiAgICAgY29uc3QgY2hhciAqZ2V0VHJhY2tTdGF0ZVN0cmluZygpIGNvbnN0IHsKQEAgLTIxMCwxMyArMzAyLDIxIEBACiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgc3A8U2VydmVyUHJveHk+ICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7Ci0gICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOwogICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgLy8gdW5pcXVlIElEIGZvciB0aGlzIHRyYWNrIHVzZWQgYnkgYXVkaW8gcG9saWN5CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQorCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2t7fTsgLy8gbGF0ZW5jeSBmcm9tIHRyYWNrIG9yIHNlcnZlciB0aW1lc3RhbXAuCisgICAgc3RkOjphdG9taWM8ZG91YmxlPiBtU2VydmVyTGF0ZW5jeU1ze307ICAgICAgICAvLyBsYXN0IGxhdGVuY3kgcHVzaGVkIGZyb20gc2VydmVyIHRocmVhZC4KKyAgICBzdGQ6OmF0b21pYzxGcmFtZVRpbWU+IG1LZXJuZWxGcmFtZVRpbWV7fTsgICAgIC8vIGxhc3QgZnJhbWUgdGltZSBvbiBrZXJuZWwgc2lkZS4KKyAgICBjb25zdCBwaWRfdCAgICAgICAgIG1DcmVhdG9yUGlkOyAgLy8gY2FuIGJlIGRpZmZlcmVudCBmcm9tIG1jbGllbnQtPnBpZCgpIGZvciBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGNyZWF0ZWQgYnkgTnVQbGF5ZXIgb24gYmVoYWxmIG9mIGEgY2xpZW50CiB9OwogCiAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IFBhdGNoVHJhY2sgYW5kIFBhdGNoUmVjb3JkLgpAQCAtMjMxLDMgKzMzMSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpID0gMDsKIH07CisKK2NsYXNzIFBhdGNoVHJhY2tCYXNlIDogcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcgoreworcHVibGljOgorICAgIHVzaW5nIFRpbWVvdXQgPSBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz47CisgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksIGNvbnN0IFRocmVhZEJhc2UmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpOworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyUHJveHkoY29uc3Qgc3A8VD4gJnByb3h5LCBib29sIGhvbGRSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQgPSBob2xkUmVmZXJlbmNlID8gcHJveHkgOiBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUHJveHkgPSBwcm94eS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyUGVlclByb3h5KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUmVmZXJlbmNlSG9sZC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUHJveHkgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3Qgc3A8Q2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsKKyAgICBzcDxSZWZCYXNlPiAgICAgICAgICAgICAgICAgbVBlZXJSZWZlcmVuY2VIb2xkOyAgIC8vIGtlZXBzIG1QZWVyUHJveHkgYWxpdmUgZHVyaW5nIGFjY2Vzcy4KKyAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eSA9IG51bGxwdHI7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dHt9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBkZTE1ZTRiLi4yYTVhNzEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjgsMTEgKzI4LDExIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01Niw2ICs1Niw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFRyYWNrQmFzZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlRyYWNrQmFzZSIKIAogc3RhdGljIHZvbGF0aWxlIGludDMyX3QgbmV4dFRyYWNrSWQgPSA1NTsKIApAQCAtNzEsNiArNzMsNyBAQAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jLApAQCAtOTcsMTQgKzEwMCwxNiBAQAogICAgICAgICBtSWQoYW5kcm9pZF9hdG9taWNfaW5jKCZuZXh0VHJhY2tJZCkpLAogICAgICAgICBtVGVybWluYXRlZChmYWxzZSksCiAgICAgICAgIG1UeXBlKHR5cGUpLAotICAgICAgICBtVGhyZWFkSW9IYW5kbGUodGhyZWFkLT5pZCgpKSwKKyAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZCA/IHRocmVhZC0+aWQoKSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKSwKICAgICAgICAgbVBvcnRJZChwb3J0SWQpLAotICAgICAgICBtSXNJbnZhbGlkKGZhbHNlKQorICAgICAgICBtSXNJbnZhbGlkKGZhbHNlKSwKKyAgICAgICAgbUNyZWF0b3JQaWQoY3JlYXRvclBpZCkKIHsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gQVVESU9fVUlEX0lOVkFMSUQgJiYgY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CiAgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQogICAgIC8vIGNsaWVudFVpZCBjb250YWlucyB0aGUgdWlkIG9mIHRoZSBhcHAgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0cmFjaywgc28gd2UgY2FuIGJsYW1lCkBAIC0xNDQsNyArMTQ5LDcgQEAKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7CiAgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOwogICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1Miw3ICsxNTcsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKSBtYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1IiwgX19mdW5jX18sIG1JZCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjYsNyArMTcxLDggQEAKICAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDUsMjcgKzIxMSwxMiBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgKGludClhbGxvYyk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIF9fZnVuY19fLCBtSWQsIChpbnQpYWxsb2MpOwogICAgICAgICB9CiAgICAgICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKIAogI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChGb3JtYXRfaXNWYWxpZChwaXBlRm9ybWF0KSkgewotICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua1RyYWNrRnJhbWVzLCBwaXBlRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtwaXBlRm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1UZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtVGVlLnNldChzYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBmb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfVFJBQ0spOwogI2VuZGlmCiAKICAgICB9CkBAIC0yNDQsOSArMjM1LDYgQEAKIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewotI2lmZGVmIFRFRV9TSU5LCi0gICAgZHVtcFRlZSgtMSwgbVRlZVNvdXJjZSwgbUlkLCAnVCcpOwotI2VuZGlmCiAgICAgLy8gZGVsZXRlIHRoZSBwcm94eSBiZWZvcmUgZGVsZXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgaXQgcmVmZXJzIHRvLCB0byBhdm9pZCBkYW5nbGluZyByZWZlcmVuY2UKICAgICBtU2VydmVyUHJveHkuY2xlYXIoKTsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewpAQCAtMjc0LDkgKzI2Miw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogI2lmZGVmIFRFRV9TSU5LCi0gICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICB9CisgICAgbVRlZS53cml0ZShidWZmZXItPnJhdywgYnVmZmVyLT5mcmFtZUNvdW50KTsKICNlbmRpZgogCiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CkBAIC0yOTMsOSArMjc5LDMyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBhdGNoVHJhY2tCYXNlOjpQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRCYXNlJiB0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQorICAgIDogbVByb3h5KHByb3h5KQoreworICAgIGlmICh0aW1lb3V0KSB7CisgICAgICAgIHNldFBlZXJUaW1lb3V0KCp0aW1lb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEb3VibGUgYnVmZmVyIG1peGVyCisgICAgICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogdGhyZWFkLmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc2FtcGxlUmF0ZSgpOworICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHN7bWl4QnVmZmVyTnN9KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQYXRjaFRyYWNrQmFzZTo6c2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpIHsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gdGltZW91dC5jb3VudCgpIC8gc3RkOjpuYW5vOjpkZW47CisgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSB0aW1lb3V0LmNvdW50KCkgJSBzdGQ6Om5hbm86OmRlbjsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKQEAgLTM0MCw2ICszNDksMTAgQEAKICAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKQEAgLTM2OCw2ICszODEsMTE3IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgQXBwT3AgZm9yIGF1ZGlvIHBsYXliYWNrCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHN0YXRpYworc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yPgorQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpjcmVhdGVJZk5lZWRlZCgKKyAgICAgICAgICAgIHVpZF90IHVpZCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBpbnQgaWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgVmVjdG9yIDxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgICAgIGdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworICAgICAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IG5vdCBtdXRpbmcgdHJhY2s6JWQgdXNhZ2U6JWQgZm9yIHNlcnZpY2UgVUlEICVkIiwKKyAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgYXR0ci51c2FnZSwKKyAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBzdHJlYW0gdHlwZSBoYXMgYmVlbiBmaWx0ZXJlZCBieSBhdWRpbyBwb2xpY3kgdG8gaW5kaWNhdGUgd2hldGhlciBpdCBjYW4gYmUgbXV0ZWQKKyAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgeworICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IG5vdCBtdXRpbmcgdHJhY2s6JWQgdXNhZ2U6JWQgRU5GT1JDRURfQVVESUJMRSIsIGlkLCBhdHRyLnVzYWdlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmICgoYXR0ci5mbGFncyAmIEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpCisgICAgICAgICAgICA9PSBBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZKSB7CisgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogbm90IG11dGluZyB0cmFjazolZCBmbGFncyAlI3ggaGF2ZSBGTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZIiwKKyAgICAgICAgICAgIGlkLCBhdHRyLmZsYWdzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgT3BQbGF5QXVkaW9Nb25pdG9yKHVpZCwgYXR0ci51c2FnZSwgaWQpOworfQorCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6Ok9wUGxheUF1ZGlvTW9uaXRvcigKKyAgICAgICAgdWlkX3QgdWlkLCBhdWRpb191c2FnZV90IHVzYWdlLCBpbnQgaWQpCisgICAgICAgIDogbUhhc09wUGxheUF1ZGlvKHRydWUpLCBtVWlkKHVpZCksIG1Vc2FnZSgoaW50MzJfdCkgdXNhZ2UpLCBtSWQoaWQpCit7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6fk9wUGxheUF1ZGlvTW9uaXRvcigpCit7CisgICAgaWYgKG1PcENhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BDYWxsYmFjayk7CisgICAgfQorICAgIG1PcENhbGxiYWNrLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBnZXRQYWNrYWdlc0ZvclVpZChtVWlkLCBtUGFja2FnZXMpOworICAgIGNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKTsKKyAgICBpZiAoIW1QYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbU9wQ2FsbGJhY2sgPSBuZXcgUGxheUF1ZGlvT3BDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ01vZGUoQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTywgbVBhY2thZ2VzWzBdLCBtT3BDYWxsYmFjayk7CisgICAgfQorfQorCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6aGFzT3BQbGF5QXVkaW8oKSBjb25zdCB7CisgICAgcmV0dXJuIG1IYXNPcFBsYXlBdWRpby5sb2FkKCk7Cit9CisKKy8vIE5vdGUgdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIChhbmQgbmV2ZXIgdG8gYmUpIGZvciBhdWRpbyBzZXJ2ZXIgLyBwYXRjaCByZWNvcmQgdHJhY2sKKy8vIC0gbm90IGNhbGxlZCBmcm9tIGNvbnN0cnVjdG9yIGR1ZSB0byBjaGVjayBvbiBVSUQsCisvLyAtIG5vdCBjYWxsZWQgZnJvbSBQbGF5QXVkaW9PcENhbGxiYWNrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyBjYXNlCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6Y2hlY2tQbGF5QXVkaW9Gb3JVc2FnZSgpCit7CisgICAgaWYgKG1QYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbUhhc09wUGxheUF1ZGlvLnN0b3JlKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGhhc0l0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUgOiBtUGFja2FnZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbW9kZSA9IG1BcHBPcHNNYW5hZ2VyLmNoZWNrQXVkaW9PcE5vVGhyb3coQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgbVVzYWdlLCBtVWlkLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgICAgICBoYXNJdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogdHJhY2s6JWQgdXNhZ2U6JWQgJXNtdXRlZCIsIG1JZCwgbVVzYWdlLCBoYXNJdCA/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+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKLSAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXJ0KCk7CiAgICAgfQogfQpAQCAtMTYwMSwxMCArMTg4NCwxNCBAQAogLy8gICAgICBSZWNvcmQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIEFwcE9wIGZvciBhdWRpbyByZWNvcmRpbmcKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yIgorCiAvLyBzdGF0aWMKIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcj4KIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQoCkBAIC0xNjYxLDcgKzE5NDgsNyBAQAogCiAvLyBDYWxsZWQgYnkgUmVjb3JkQXVkaW9PcENhbGxiYWNrIHdoZW4gT1BfUkVDT1JEX0FVRElPIGlzIHVwZGF0ZWQgaW4gQXBwT3AgY2FsbGJhY2sKIC8vIGFuZCBpbiBvbkZpcnN0UmVmKCkKLS8vIE5vdGUgdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIChhbmQgbmV2ZXIgdG8gYmUpIGZvciBhdWRpbyBzZXJ2ZXIgLyBwYXRjaCByZWNvcmQgdHJhY2sKKy8vIE5vdGUgdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIChhbmQgbmV2ZXIgdG8gYmUpIGZvciBhdWRpbyBzZXJ2ZXIgLyByb290IHRyYWNrCiAvLyBkdWUgdG8gdGhlIFVJRCBpbiBjcmVhdGVJZk5lZWRlZCgpLiBBcyBhIHJlc3VsdCBmb3IgdGhvc2UgcmVjb3JkIHRyYWNrLCBpdCdzOgogLy8gLSBub3QgY2FsbGVkIGZyb20gY29uc3RydWN0b3IsCiAvLyAtIG5vdCBjYWxsZWQgZnJvbSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZCBpbiB0aGlzIGNhc2UKQEAgLTE2OTMsNyArMTk4MCwxMSBAQAogICAgIH0KIH0KIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZEhhbmRsZSIKKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OlJlY29yZEhhbmRsZSgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spCiAgICAgOiBCbkF1ZGlvUmVjb3JkKCksCkBAIC0xNzA4LDcgKzE5OTksNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbikgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICBtUmVjb3JkVHJhY2stPnN0YXJ0KChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90KWV2ZW50LCAoYXVkaW9fc2Vzc2lvbl90KSB0cmlnZ2VyU2Vzc2lvbikpOwogfQpAQCAtMTcxOSwxOCArMjAxMCwzMiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wX25vbnZpcnR1YWwoKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RvcCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgbVJlY29yZFRyYWNrLT5zdG9wKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKIH0KIAorYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChtUmVjb3JkVHJhY2stPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRUcmFjayIKIAogLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OlJlY29yZFRyYWNrKApAQCAtMTc0NCwxMyArMjA0OSwxNSBAQAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBidWZmZXJTaXplLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICBjcmVhdG9yUGlkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE3NjcsMTggKzIwNzQsMjAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAotICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOwotICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCi0gICAgLy8KLSAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKLSAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKLSAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCi0gICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzRGlyZWN0KCkpIHsKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgICAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IFJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LApAQCAtMTc4OSwxMiArMjA5OCwyMCBAQAogICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogb25seSBOb3JtYWwgUmVjb3JkIGhhcyB0aW1lc3RhbXBzIChGYXN0IFJlY29yZCBkb2VzIG5vdCkuCisgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkKKyAgICAgICAgICAgICsgIl9SIik7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewotICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQpAQCAtMTg1MSwxNyArMjE2OCwzNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwotICAgICAgICB9CisgICAgICAgIHRyYWNrX3N0YXRlIHByaW9yU3RhdGUgPSBtU3RhdGU7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7IC8vIG1vdmUgbVN0YXRlIHRvIFNUT1BQRUQsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgICAgIC8vIEFQTSBwb3J0aWQvY2xpZW50IG1hbmFnZW1lbnQgZG9uZSBvdXRzaWRlIG9mIGxvY2suCisgICAgICAgIC8vIE5PVEU6IGlmIHRocmVhZCBkb2Vzbid0IGV4aXN0LCB0aGUgaW5wdXQgZGVzY3JpcHRvciBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZFOiAgICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgc3RpbGwgYWN0aXZlCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCBzdWNjZXNzZnVsbHkgY2FsbGVkCisgICAgICAgICAgICBjYXNlIFBBVVNJTkc6ICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygc3RvcCgpIHBhdXNpbmcgKHN0aWxsIGFjdGl2ZSkKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYW5kIHN0YXJ0SW5wdXQgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIGNhc2UgUEFVU0VEOiAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgSURMRTogICAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVE9QUEVEOiAgICAvLyB1bmV4cGVjdGVkIChkZXN0cm95ZWQpCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBwcmlvciBzdGF0ZTogJWQiLCBfX2Z1bmNfXywgbUlkLCBwcmlvclN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xODc4LDMxICsyMjEyLDUwIEBACiB9CiAKIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgICAgIElkIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgIFMgIEZsYWdzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgU291cmNlICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFNlcnZlciBGcm1DbnQgRnJtUmR5IFNpbCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2ZCAlNnUgJTd1ICU3dSAgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xOTMyLDYgKzIyODUsMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xOTQ1LDYgKzIzMDgsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmlzU2lsZW5jZWQoKSBjb25zdCB7CkBAIC0xOTY3LDYgKzIzMzksMzEgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFJlY29yZCIKKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xOTc0LDM4ICsyMzcxLDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KQogICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENILCBTdHJpbmcxNigpKSwKLSAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHBpZCgpLCBBSURfQVVESU9TRVJWRVIsCisgICAgICAgICAgICAgICAgZmxhZ3MsIFRZUEVfUEFUQ0gsIFN0cmluZzE2KCkpLAorICAgICAgICBQYXRjaFRyYWNrQmFzZShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKnJlY29yZFRocmVhZCwgdGltZW91dCkKIHsKLSAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKLQotICAgIEFMT0dWKCJQYXRjaFJlY29yZCAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgQUxPR1YoIiVzKCVkKTogc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6On5QYXRjaFJlY29yZCgpCiB7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOwogICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAiUGF0Y2hSZWNvcmQoKSAlcCBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICAgICAgICAgICAiJXMoJWQpOiBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKQEAgLTIwMTYsNyArMjQxMiw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMjAzNSw3ICsyNDMxLDkgQEAKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKIH0KIAotCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6TW1hcFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6TW1hcFRyYWNrKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLApAQCAtMjA0MywxMyArMjQ0MSwxNSBAQAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICBib29sIGlzT3V0LAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLCBpc091dCwKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCiAgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCiAgICAgICAgIG1QaWQocGlkKSwgbVNpbGVuY2VkKGZhbHNlKSwgbVNpbGVuY2VkTm90aWZpZWQoZmFsc2UpCkBAIC0yMDY2LDcgKzI0NjYsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yMDk3LDE5ICsyNDk3LDI4IEBACiB7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudCBTZXNzaW9uIFBvcnQgSWQgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgRmxhZ3MgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc091dCgpID8gIlVzZyBDVCI6ICJTb3VyY2UiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICU3dSAlMDhYICUwOFggJTZ1IDB4JTAzWCAiLAogICAgICAgICAgICAgbVBpZCwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgbUF0dHIuZmxhZ3MpOworICAgIGlmIChpc091dCgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUzeCAlMngiLCBtQXR0ci51c2FnZSwgbUF0dHIuY29udGVudF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNngiLCBtQXR0ci5zb3VyY2UpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDM4YzNjMDIuLjZlZjE5YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC05Nyw4ICs5Nyw0MiBAQAogI2RlZmluZSBMT0dfQVVESU9fU1RBVEUoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCiAgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9BVURJT19TVEFURSwgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCisvLyBMb2cgdGhlIGRpZmZlcmVuY2UgYmV3dGVlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLAorLy8gZGl2aWRlZCBieSB0aGUgc2FtcGxlIHJhdGUuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX0xBVEVOQ1kobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9MQVRFTkNZPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgb3ZlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19PVkVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfT1ZFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIGluZm8uIFRoaXMgY3VycmVudGx5IGluY2x1ZGVzIHR5cGUsIGZyYW1lQ291bnQsIGFuZCBzYW1wbGVSYXRlLgorLy8gUGFyYW1ldGVyIHR5cGUgaXMgdGhyZWFkX2luZm9fdCBhcyBkZWZpbmVkIGluIE5CTG9nLmguCisjZGVmaW5lIExPR19USFJFQURfSU5GTyhpbmZvKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPR19USFJFQURfUEFSQU1TKHBhcmFtcykgZG8ge05CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX1BBUkFNUz4ocGFyYW1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB1bmRlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19VTkRFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1VOREVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgd2FybXVwIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19XQVJNVVBfVElNRShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dBUk1VUF9USU1FPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCBhIHR5cGVkIGVudHJ5IHRoYXQgcmVwcmVzZW50cyBhIHRocmVhZCdzIHdvcmsgdGltZSBpbiBuYW5vc2Vjb25kcy4KKy8vIFBhcmFtZXRlciBucyBzaG91bGQgYmUgb2YgdHlwZSB1aW50MzJfdC4KKyNkZWZpbmUgTE9HX1dPUktfVElNRShucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dPUktfVElNRT4obnMpOyB9IHdoaWxlICgwKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKKy8vIFRPRE8gY29uc2lkZXIgYWRkaW5nIGEgdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgdGxEdW1teU5CTG9nV3JpdGVyIGFuZCB0aGVuCisvLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsRHVtbXlOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KKy8vIGNoZWNrIGZvciBudWxscHRyIGV2ZXJ5IHRpbWUuIEFsc28gcmVkdWNlcyB0aGUgbmVlZCB0byBhZGQgYSBuZXcgbG9nZ2luZyBtYWNybyBhYm92ZQorLy8gZWFjaCB0aW1lIHdlIHdhbnQgdG8gbG9nIGEgbmV3IHR5cGUuCiBleHRlcm4gdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgKnRsTkJMb2dXcml0ZXI7CiB9CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDJiODlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icApAQCAtMCwwICsxLDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5Y2FlMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCi0gICAgc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIFwKLSAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAotICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAotICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCi0gICAgbGlibWVkaWFfaGVscGVyIFwKLSAgICBsaWJtZWRpYW1ldHJpY3MgXAotICAgIGxpYmVmZmVjdHNjb25maWcKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnNvdW5kdHJpZ2dlcgotCi1pZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKLQotaWZuZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0kKGVycm9yIENvbmZpZ3VyYWJsZSBwb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY29uZiBmaWxlKQotZW5kaWYgI2lmbmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgICBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeSBcCi0gICAgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUKLUxPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUKLQotZWxzZQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lZGVmYXVsdAotCi1lbmRpZiAjIGlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhX2hlbHBlcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYW1ldHJpY3MKLQotaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaWN1dWMgbGlieG1sMgotCi1MT0NBTF9DRkxBR1MgKz0gLURVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi1lbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWlmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBtYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5tawotIwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggNDgxMmIxZi4uMzBmMjlkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC01OCwyNyArNTgsMTUgQEAKICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICBBUElfSU5QVVRfSU5WQUxJRCA9IC0xLAogICAgICAgICBBUElfSU5QVVRfTEVHQUNZICA9IDAsLy8gZS5nLiBhdWRpbyByZWNvcmRpbmcgZnJvbSBhIG1pY3JvcGhvbmUKLSAgICAgICAgQVBJX0lOUFVUX01JWF9DQVBUVVJFLC8vIHVzZWQgZm9yICJyZW1vdGUgc3VibWl4IiwgY2FwdHVyZSBvZiB0aGUgbWVkaWEgdG8gcGxheSBpdCByZW1vdGVseQorICAgICAgICBBUElfSU5QVVRfTUlYX0NBUFRVUkUsLy8gdXNlZCBmb3IgInJlbW90ZSBzdWJtaXgiIGxlZ2FjeSBtb2RlIChubyBEQVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBvZiB0aGUgbWVkaWEgdG8gcGxheSBpdCByZW1vdGVseQogICAgICAgICBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURSwvLyB1c2VkIGZvciBwbGF0Zm9ybSBhdWRpbyByZXJvdXRpbmcsIHdoZXJlIG1peGVzIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IGV4dGVybmFsIGFuZCBkeW5hbWljYWxseSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9saWNpZXMgd2hpY2ggcmVyb3V0ZSBhdWRpbyBtaXhlcworICAgICAgICBBUElfSU5QVVRfTUlYX1BVQkxJQ19DQVBUVVJFX1BMQVlCQUNLLCAgLy8gdXNlZCBmb3IgcGxheWJhY2sgY2FwdHVyZSB3aXRoIGEgTWVkaWFQcm9qZWN0aW9uCiAgICAgICAgIEFQSV9JTlBVVF9URUxFUEhPTllfUlgsIC8vIHVzZWQgZm9yIGNhcHR1cmUgZnJvbSB0ZWxlcGhvbnkgUlggcGF0aAogICAgIH0gaW5wdXRfdHlwZV90OwogCi0gICAgZW51bSB7Ci0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FID0gMCwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwgPSAoMSA8PCAwKSwgICAgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgY2FsbAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSA9ICgxIDw8IDEpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYW5vdGhlciBjYXB0dXJlCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEID0gKDEgPDwgMiksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGhvdHdvcmQKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQgPSAoMSA8PCAzKSwgICAvLyBwcmUtZW1wdGVkIHNvbWVvbmUKLSAgICAgICAgICAgICAgICAvLyBOQjogcHJlZW1wdCBpcyBtYXJrZWQgb24gYSBzdWNjZXNzZnVsIHJldHVybiwgb3RoZXJzIGFyZSBvbiBmYWlsaW5nIGNhbGxzCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9MQVNUID0gKDEgPDwgNCksCi0KLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCA9IChBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCAtIDEpLAotICAgIH07Ci0KLSAgICB0eXBlZGVmIHVpbnQzMl90IGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdDsKLQogcHVibGljOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5SW50ZXJmYWNlKCkge30KICAgICAvLwpAQCAtODksMTQgKzc3LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gcGhvbmUgc3RhdGUuIFZhbGlkIHBob25lcyBzdGF0ZXMgYXJlIGRlZmluZWQgYnkgYXVkaW9fbW9kZV90CiAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CiAgICAgLy8gZm9yY2UgdXNpbmcgYSBzcGVjaWZpYyBkZXZpY2UgY2F0ZWdvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNhZ2UKQEAgLTEyMiwyMyArMTEyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8gcmVxdWVzdCBhbiBpbnB1dCBhcHByb3ByaWF0ZSBmb3IgcmVjb3JkIGZyb20gdGhlIHN1cHBsaWVkIGRldmljZSB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCkBAIC0xNDcsMTYgKzEzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vCiAgICAgLy8gdm9sdW1lIGNvbnRyb2wgZnVuY3Rpb25zCkBAIC0xODEsNiArMTYyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KSA9IDA7CisKICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKIApAQCAtMTk2LDYgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgPSAwOwogCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTIwNSw3ICsyMDAsMTAgQEAKICAgICAvL2R1bXAgc3RhdGUKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0yMzMsMTEgKzIzMSwxNSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICAgICAgICAgID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKSA9IDA7CkBAIC0yNTEsNyArMjUzLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkgPSAwOwogfTsKIAogCkBAIC0zMjQsMTEgKzM0MSw2IEBACiAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKIAotICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKSA9IDA7Ci0KICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CiAKQEAgLTMzNyw2ICszNDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgPSAwOworCiAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTM1MywxNSArMzY5LDIwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKKwogICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIGV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRmZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiYXVkaW9wb2xpY3lfdGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAgIm5hbWUiOiAic3lzdGVtYXVkaW9fdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDQgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2U4ZTMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5tawotIwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg5NjdlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKLS8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgotI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCi0KLWVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgU1RSQVRFR1lfTUVESUEsCi0gICAgU1RSQVRFR1lfUEhPTkUsCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAotICAgIFNUUkFURUdZX0RUTUYsCi0gICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCi0gICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKLSAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgTlVNX1NUUkFURUdJRVMKLX07Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggZmMwMTJhMi4uMWRiZDFlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTE2LDEwICsxNiwyNCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBWb2x1bWVTb3VyY2UgaXMgdGhlIGRpc2NyaW1pbmVudCBmb3Igdm9sdW1lIG1hbmFnZW1lbnQgb24gYW4gb3V0cHV0LgorICogSXQgdXNlZCB0byBiZSB0aGUgc3RyZWFtIHR5cGUgYnkgbGVnYWN5LCBpdCBtYXkgYmUgaG9zdCB2b2x1bWUgZ3JvdXAgb3IgYSB2b2x1bWUgY3VydmVzIGlmCisgKiB3ZSBhbGxvdyB0byBoYXZlIG1vcmUgdGhhbiBvbmUgY3VydmUgcGVyIHZvbHVtZSBncm91cCAobWFuZGF0b3J5IHRvIGdldCByaWQgb2YgQXVkaW9TZXJ2ZXIKKyAqIHN0cmVhbSBhbGlhc2VzLgorICovCitlbnVtIFZvbHVtZVNvdXJjZSA6IHN0ZDo6dW5kZXJseWluZ190eXBlPHZvbHVtZV9ncm91cF90Pjo6dHlwZTsKK3N0YXRpYyBjb25zdCBWb2x1bWVTb3VyY2UgVk9MVU1FX1NPVVJDRV9OT05FID0gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihWT0xVTUVfR1JPVVBfTk9ORSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwogLy8gQWJzb2x1dGUgbWluIHZvbHVtZSBpbiBkQiAoY2FuIGJlIHJlcHJlc2VudGVkIGluIHNpbmdsZSBwcmVjaXNpb24gbm9ybWFsIGZsb2F0IHZhbHVlKQogI2RlZmluZSBWT0xVTUVfTUlOX0RCICgtNzU4KQogCkBAIC0xMzQsNiArMTQ4LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCA5YmQ2OGUxLi42MDVmYzFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMTcsOSArMTcsMjAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFN0cmVhbVR5cGVWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworc3RhdGljIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBkZWZhdWx0QXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGdEeW5hbWljRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA9IDUwMDA7CisKIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuCiAvLyBEbyBub3QgbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKICNkZWZpbmUgU0FNUExFX1JBVEVfSFpfTUFYIDE5MjAwMApAQCAtMzIsMTQgKzQzLDYgQEAKICNkZWZpbmUgTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQgRkNDXzgKIAogLyoqCi0gKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKLSAqIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXRzKCkKLSAqLwotI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWHxcCi0gICAgICAgIEFVRElPX0RFVklDRV9JTl9CVVN8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQotCi0KLS8qKgogICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKICAqIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KICAqLwpAQCAtNjgsMjMgKzcxLDYgQEAKIH0KIAogLyoqCi0gKiBDaGVjayBpZiB0aGUgaW5wdXQgZGV2aWNlIGdpdmVuIGlzIGNvbnNpZGVyZWQgYXMgYSB2aXJ0dWFsIGRldmljZS4KLSAqCi0gKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgdmlydHVhbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGlubGluZSBib29sIGlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7Ci0gICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmICgoZGV2aWNlICYgfkFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwpID09IDApKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKICAqIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyCiAgKgpAQCAtMTAxLDYgKzg3LDIxIEBACiB9CiAKIC8qKgorICogQ2hlY2sgd2hldGhlciBhdWRpbyBkZXZpY2UgaGFzIGVuY29kaW5nIGNhcGFiaWxpdHkuCisgKgorICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY29uc2lkZXIKKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgZGV2aWNlIGhhcyBlbmNvZGluZyBjYXBhYmlsaXR5LCBmYWxzZSBvdGhlcndpc2UuLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX2hhc19lbmNvZGluZ19jYXBhYmlsaXR5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCiAgKiBSZXR1cm5zIHRoZSBwcmlvcml0eSBvZiBhIGdpdmVuIGF1ZGlvIHNvdXJjZSBmb3IgY2FwdHVyZS4gVGhlIHByaW9yaXR5IGlzIHVzZWQgd2hlbiBtb3JlIHRoYW4gb25lCiAgKiBjYXB0dXJlIHNlc3Npb24gaXMgYWN0aXZlIG9uIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIGRldGVybWluZSB3aGljaCBzZXNzaW9uIGRyaXZlcyByb3V0aW5nIGFuZAogICogZWZmZWN0IGNvbmZpZ3VyYXRpb24uCkBAIC0xMDgsNyArMTA5LDEwIEBACiAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGNvbnNpZGVyLiBWYWxpZCBzb3VyY2VzIGFyZToKICAqIC0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAqIC0gQVVESU9fU09VUkNFX0NBTUNPUkRFUgorICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UKKyAqIC0gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VECiAgKiAtIEFVRElPX1NPVVJDRV9NSUMKKyAqIC0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCiAgKiAtIEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04KICAqIC0gQVVESU9fU09VUkNFX0hPVFdPUkQKQEAgLTEyMSwxMCArMTI1LDE2IEBACiB7CiAgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgewogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiA2OworICAgICAgICByZXR1cm4gOTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIHJldHVybiA1OworICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgcmV0dXJuIDc7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CisgICAgICAgIHJldHVybiA2OwogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CiAgICAgICAgIHJldHVybiA0OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICByZXR1cm4gMzsKQEAgLTE1MiwzICsxNjIsMjUgQEAKICAgICB9CiAgICAgcmV0dXJuIGZvcm1hdDEgPT0gZm9ybWF0MjsKIH0KKworLyoqCisgKiBAYnJpZWYgaGFzU3RyZWFtIGNoZWNrcyBpZiBhIGdpdmVuIHN0cmVhbSB0eXBlIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIGNvbnNpZGVyLgorICogQHBhcmFtIHN0cmVhbVR5cGUgdG8gY29uc2lkZXIKKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKGJlZ2luKHN0cmVhbXMpLCBlbmQoc3RyZWFtcyksIHN0cmVhbVR5cGUpICE9IGVuZChzdHJlYW1zKTsKK30KKworLyoqCisgKiBAYnJpZWYgaGFzVm9pY2VTdHJlYW0gY2hlY2tzIGlmIGEgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gdG8gY29uc2lkZXIuCisgKiBAcmV0dXJuIHRydWUgaWYgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBzdHJlYW1zLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhhc1ZvaWNlU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMpCit7CisgICAgcmV0dXJuIGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyZjNjZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvR2Fpbi5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9QYXRjaC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUG9saWN5TWl4LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb3J0LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Sb3V0ZS5jcHAiLAorICAgICAgICAic3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0h3TW9kdWxlLmNwcCIsCisgICAgICAgICJzcmMvSU9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvU2VyaWFsaXplci5jcHAiLAorICAgICAgICAic3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIiwKKyAgICAgICAgInNyYy9UeXBlQ29udmVydGVyLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGlibWVkaWEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9wb2xpY3ljb21tb24iXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWU2ODcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9HYWluLmNwcCBcCi0gICAgc3JjL0h3TW9kdWxlLmNwcCBcCi0gICAgc3JjL0lPUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1BvcnQuY3BwIFwKLSAgICBzcmMvQXVkaW9Qcm9maWxlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIFwKLSAgICBzcmMvQXVkaW9QYXRjaC5jcHAgXAotICAgIHNyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgXAotICAgIHNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIFwKLSAgICBzcmMvU2Vzc2lvblJvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Wb2x1bWVDdXJ2ZS5jcHAgXAotICAgIHNyYy9UeXBlQ29udmVydGVyLmNwcCBcCi0gICAgc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYm1lZGlhCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMgXAotICAgIHN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLQotaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfU1JDX0ZJTEVTICs9IHNyYy9TZXJpYWxpemVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmljdXVjIGxpYnhtbDIKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbgotCi1lbHNlCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgXAotICAgIHNyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0dhaW5zLmNwcAotCi1lbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCBmODZlNzVhLi5hOTQ4ZWE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTM4LDcgKzM4LDcgQEAKIGNsYXNzIEF1ZGlvUm91dGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUm91dGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggNGFjNTA4Zi4uNGFmOTNlMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtMTgsNyArMTgsOSBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTMsMTcgKzU1LDQxIEBACiAgICAgaW50IGdldE1heFJhbXBJbk1zKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWF4X3JhbXBfbXM7IH0KIAogICAgIC8vIFRPRE86IHJlbW92ZSBkdW1wIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKIAorICAgIHZvaWQgc2V0VXNlRm9yVm9sdW1lKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSB7IG1Vc2VGb3JWb2x1bWUgPSBjYW5Vc2VGb3JWb2x1bWU7IH0KKyAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1Vc2VGb3JWb2x1bWU7IH0KKwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19nYWluICZnZXRHYWluKCkgY29uc3QgeyByZXR1cm4gbUdhaW47IH0KIAogcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CiAgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47CiAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9IGZhbHNlOworfTsKKworY2xhc3MgQXVkaW9HYWlucyA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb0dhaW4+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmdhaW46ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZ2Fpbi0+Y2FuVXNlRm9yVm9sdW1lKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBhZGQoY29uc3Qgc3A8QXVkaW9HYWluPiBnYWluKQorICAgIHsKKyAgICAgICAgcHVzaF9iYWNrKGdhaW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjk2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIEkvTyBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGV4dAorICogY2FuIGJlIHF1ZXJpZWQgYW5kIHVwZGF0ZWQuCisgKi8KK2NsYXNzIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UoKSB7fTsKKworICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIElvRGVzY3JpcHRvciwgY2xhc3MgRmlsdGVyPgorc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9EZXNjcmlwdG9yJiBkZXNjLCBGaWx0ZXIgZmlsdGVyLCBib29sJiBhY3RpdmUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBhdXRvIGFjdGl2ZUNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovKTsKKyAgICBhdXRvIGFjdGl2ZUNsaWVudHNXaXRoUm91dGUgPQorICAgICAgICBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBmaWx0ZXIsIHRydWUgLypwcmVmZXJyZWREZXZpY2UqLyk7CisgICAgYWN0aXZlID0gYWN0aXZlQ2xpZW50cy5zaXplKCkgPiAwOworICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlQ2xpZW50cy5zaXplKCkgPT0gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGFjdGl2ZUNsaWVudHNXaXRoUm91dGVbMF0tPnByZWZlcnJlZERldmljZUlkKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIElvQ29sbGVjdGlvbiwgY2xhc3MgRmlsdGVyPgorc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9Db2xsZWN0aW9uJiBpb0NvbGxlY3Rpb24sIEZpbHRlciBmaWx0ZXIsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpb0NvbGxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byBkZXNjID0gaW9Db2xsZWN0aW9uLnZhbHVlQXQoaSk7CisgICAgICAgIGJvb2wgYWN0aXZlOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjdXJEZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGRlc2MsIGZpbHRlciwgYWN0aXZlLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGFjdGl2ZSAmJiBjdXJEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGN1ckRldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IGRmMWNmMjYuLjM3ZjlkMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC0xNiwzNiArMTYsNDUgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSU9Qcm9maWxlOwogY2xhc3MgQXVkaW9Qb2xpY3lNaXg7CitjbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKIAogLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gaW5wdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBpbnB1dAogLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgaW5wdXQuCi1jbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgorY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgICwgcHVibGljIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0T3BlblJlZkNvdW50KCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGUoKSBjb25zdCB7IHJldHVybiAobURldmljZSAhPSBudWxscHRyKSA/CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPnR5cGUoKSA6IEFVRElPX0RFVklDRV9OT05FOyB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURldmljZTsgfQorICAgIHZvaWQgc2V0RGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpIHsgbURldmljZSA9IGRldmljZTsgfQorICAgIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlICE9IG51bGxwdHIgPyBtUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpIDogIERldmljZVZlY3RvcigpOyB9CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICAgICAgICBtSW9IYW5kbGU7ICAgICAgIC8vIGlucHV0IGhhbmRsZQotICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgIG1EZXZpY2U7ICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KLSAgICB3cDxBdWRpb1BvbGljeU1peD4gICAgICAgICAgICBtUG9saWN5TWl4OyAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGlucHV0IGhhbmRsZQorICAgIHdwPEF1ZGlvUG9saWN5TWl4PiAgbVBvbGljeU1peDsgICAgICAgICAgICAgICAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKKyAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAgICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQogCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKQEAgLTU1LDQzICs2NCw1NiBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IGdldFByZWVtcHRlZFNlc3Npb25zKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNQcmVlbXB0ZWRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKICAgICB2b2lkIGNsZWFyUHJlZW1wdGVkU2Vzc2lvbnMoKTsKLSAgICBib29sIGlzQWN0aXZlKCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1HbG9iYWxBY3RpdmVDb3VudCA+IDA7IH0KICAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0OworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSgpIGNvbnN0OwogICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBhZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0gICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGdldEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7Ci0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBnZXRBdWRpb1Nlc3Npb25zKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEF1ZGlvU2Vzc2lvbkNvdW50KGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0KLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpIGNvbnN0OworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkgY29uc3Q7CisgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworICAgIGludDMyX3QgYWN0aXZlQ291bnQoKSB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQ7IH0KKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3Q7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0QWN0aXZlRWZmZWN0cygpIGNvbnN0OyAvLyBlbmFibGVkIGFuZCBub3Qgc3VzcGVuZGVkCisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCk7CiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZC4KLSAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgxKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKQogICAgIHN0YXR1c190IHN0YXJ0KCk7CiAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQKLSAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpCiAgICAgdm9pZCBzdG9wKCk7CiAgICAgdm9pZCBjbG9zZSgpOwogCi1wcml2YXRlOgotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7Ci0gICAgLy8gYXVkaW8gc2Vzc2lvbnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dAotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gICAgICAgIG1TZXNzaW9uczsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgZ2V0Q2xpZW50c0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSwKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQsIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+CisgICAgdm9pZCBhZGRDbGllbnQoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gJmNsaWVudCkgb3ZlcnJpZGU7CisKKyAgICAvLyBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgc3VzcGVuZCBvciByZXN0b3JlIGVmZmVjdHMgYWNjb3JkaW5nIGhpZ2hlc3QgcHJpb3JpdHkKKyAgICAvLyBhY3RpdmUgdXNlIGNhc2UKKyAgICB2b2lkIGNoZWNrU3VzcGVuZEVmZmVjdHMoKTsKKworIHByaXZhdGU6CisKKyAgICB2b2lkIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oaW50IGV2ZW50LCBjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKKworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURldmljZSA9IG51bGxwdHI7IC8qKjwgY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8gKi8KKwogICAgIC8vIEJlY2F1c2UgYSBwcmVlbXB0aWJsZSBjYXB0dXJlIHNlc3Npb24gY2FuIHByZWVtcHQgYW5vdGhlciBvbmUsIHdlIGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3AKICAgICAvLyBzaXR1YXRpb24gd2VyZSBlYWNoIHNlc3Npb24gaXMgYWxsb3dlZCB0byByZXN0YXJ0IGFmdGVyIGJlaW5nIHByZWVtcHRlZCwKICAgICAvLyB0aHVzIHByZWVtcHRpbmcgdGhlIG90aGVyIG9uZSB3aGljaCByZXN0YXJ0cyBhbmQgc28gb24uCkBAIC05OSw3ICsxMjEsOSBAQAogICAgIC8vIGEgcGFydGljdWxhciBpbnB1dCBzdGFydGVkIGFuZCBwcmV2ZW50IHByZWVtcHRpb24gb2YgdGhpcyBhY3RpdmUgaW5wdXQgYnkgdGhpcyBzZXNzaW9uLgogICAgIC8vIFdlIGFsc28gaW5oZXJpdCBzZXNzaW9ucyBmcm9tIHRoZSBwcmVlbXB0ZWQgaW5wdXQgdG8gYXZvaWQgYSAzIHdheSBwcmVlbXB0aW9uIGxvb3AgZXRjLi4uCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVByZWVtcHRlZFNlc3Npb25zOwotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKQEAgLTExMSwxOSArMTM1LDMxIEBACiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogCiAgICAgLy8gY291bnQgYWN0aXZlIGNhcHR1cmUgc2Vzc2lvbnMgdXNpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWQgZGV2aWNlcy4KLSAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCBpcyBwYXNzZWQKLSAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSBjb25zdDsKKyAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBlbXB0eSB2ZWN0b3IgaXMgcGFzc2VkCisgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCiAgICAgICogT25seSBjb25zaWRlcnMgaW5wdXRzIGZyb20gcGh5c2ljYWwgZGV2aWNlcyAoZS5nLiBtYWluIG1pYywgaGVhZHNldCBtaWMpIHdoZW4KICAgICAgKiBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCiAgICAgICovCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcworICAgICogZGV2aWNlLgorICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgKiBAcGFyYW0gZGlzY29ubmVjdGVkRGV2aWNlIGRldmljZSB0byBiZSBkaXNjb25uZWN0ZWQKKyAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCAyNDdmMjBmLi5jZDU0MDg1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xNiw1NSArMTYsMjM0IEBACiAKICNwcmFnbWEgb25jZQogCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgIkF1ZGlvU291cmNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSU9Qcm9maWxlOwogY2xhc3MgQXVkaW9Qb2xpY3lNaXg7CiBjbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7CisKK2NsYXNzIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BY3Rpdml0eVRyYWNraW5nKCkgPSBkZWZhdWx0OworICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eUNvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluUGFzdE1zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3lzVGltZSA9PSAwKSB7CisgICAgICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lKSA8IGluUGFzdE1zKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZpdHlDb3VudCkgPCAwKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogaW52YWxpZCBkZWx0YSAlZCwgcmVmQ291bnQgJWQiLCBfX2Z1bmNfXywgZGVsdGEsIG1BY3Rpdml0eUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgaWYgKCFtQWN0aXZpdHlDb3VudCkgeworICAgICAgICAgICAgc2V0U3RvcFRpbWUoc3lzdGVtVGltZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KKyAgICBuc2Vjc190IGdldFN0b3BUaW1lKCkgY29uc3QgeyByZXR1cm4gbVN0b3BUaW1lOyB9CisgICAgdm9pZCBzZXRTdG9wVGltZShuc2Vjc190IHN0b3BUaW1lKSB7IG1TdG9wVGltZSA9IHN0b3BUaW1lOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CisgICAgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBY3Rpdml0eUNvdW50OiAlZCwgU3RvcFRpbWU6ICUiIFBSSWQ2NCAiLCAiLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eUNvdW50KCksIGdldFN0b3BUaW1lKCkpOworICAgIH0KK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworICAgIG5zZWNzX3QgbVN0b3BUaW1lID0gMDsKK307CisKKy8qKgorICogQGJyaWVmIFZvbHVtZUFjdGl2aXR5OiBpdCB0cmFja3MgdGhlIGFjdGl2aXR5IGZvciB2b2x1bWUgcG9saWN5ICh2b2x1bWUgaW5kZXgsIG11dGUsCisgKiBtZW1vcml6ZSBwcmV2aW91cyBzdG9wLCBhbmQgc3RvcmUgbXV0ZSBpZiBpbmNvbXBhdGlibGUgZGV2aWNlIHdpdGggYW5vdGhlciBzdHJhdGVneS4KKyAqLworY2xhc3MgVm9sdW1lQWN0aXZpdHkgOiBwdWJsaWMgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIGJvb2wgaXNNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1NdXRlQ291bnQgPiAwOyB9CisgICAgaW50IGdldE11dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1NdXRlQ291bnQ7IH0KKyAgICBpbnQgaW5jTXV0ZUNvdW50KCkgeyByZXR1cm4gKyttTXV0ZUNvdW50OyB9CisgICAgaW50IGRlY011dGVDb3VudCgpIHsgcmV0dXJuIG1NdXRlQ291bnQgPiAwID8gLS1tTXV0ZUNvdW50IDogLTE7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICBBY3Rpdml0eVRyYWNraW5nOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiwgVm9sdW1lOiAlLjAzZiwgTXV0ZUNvdW50OiAlMDJkXG4iLCBtQ3VyVm9sdW1lRGIsIG1NdXRlQ291bnQpOworICAgIH0KKyAgICB2b2lkIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYikgeyBtQ3VyVm9sdW1lRGIgPSB2b2x1bWVEYjsgfQorICAgIGZsb2F0IGdldFZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJWb2x1bWVEYjsgfQorCitwcml2YXRlOgorICAgIGludCBtTXV0ZUNvdW50ID0gMDsgLyoqPCBtdXRlIHJlcXVlc3QgY291bnRlciAqLworICAgIGZsb2F0IG1DdXJWb2x1bWVEYiA9IE5BTjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbiBkQi4gKi8KK307CisvKioKKyAqIE5vdGU6IHZvbHVtZSBhY3Rpdml0aWVzIHNoYWxsIGJlIGluZGV4ZWQgYnkgQ3VydmVzSWQgaWYgd2Ugd2FudCB0byBhbGxvdyBtdWx0aXBsZQorICogY3VydmVzIHBlciB2b2x1bWUgc291cmNlLCBpbmZlcnJpbmcgYSBtdXRlIG1hbmFnZW1lbnQgb3Igdm9sdW1lIGJhbGFuY2luZyBiZXR3ZWVuIEhXIGFuZCBTVyBpcworICogZG9uZQorICovCit1c2luZyBWb2x1bWVBY3Rpdml0aWVzID0gc3RkOjptYXA8Vm9sdW1lU291cmNlLCBWb2x1bWVBY3Rpdml0eT47CisKKy8qKgorICogQGJyaWVmIFRoZSBBY3Rpdml0eSBjbGFzczogaXQgdHJhY2tzIHRoZSBhY3Rpdml0eSBmb3Igdm9sdW1lIHBvbGljeSAodm9sdW1lIGluZGV4LCBtdXRlLAorICogbWVtb3JpemUgcHJldmlvdXMgc3RvcCwgYW5kIHN0b3JlIG11dGUgaWYgaW5jb21wYXRpYmxlIGRldmljZSB3aXRoIGFub3RoZXIgc3RyYXRlZ3kuCisgKiBIYXZpbmcgdGhpcyBjbGFzcyBwcmV2ZW50cyBmcm9tIGxvb3Bpbmcgb24gYWxsIGF0dHJpYnV0ZXMgKGxlZ2FjeSBzdHJlYW1zKSBvZiB0aGUgc3RyYXRlZ3kKKyAqLworY2xhc3MgUm91dGluZ0FjdGl2aXR5IDogcHVibGljIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICB2b2lkIHNldE11dGVkQnlEZXZpY2UoIGJvb2wgaXNNdXRlZCkgeyBtSXNNdXRlZEJ5RGV2aWNlID0gaXNNdXRlZDsgfQorICAgIGJvb2wgaXNNdXRlZEJ5RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXV0ZWRCeURldmljZTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBY3Rpdml0eVRyYWNraW5nOjpkdW1wKGRzdCwgc3BhY2VzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7CisgICAgfQorcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlIGRldmljZSBzZWxlY3Rpb24uCisgICAgICogU2VlIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgICovCisgICAgYm9vbCBtSXNNdXRlZEJ5RGV2aWNlID0gZmFsc2U7Cit9OwordXNpbmcgUm91dGluZ0FjdGl2aXRpZXMgPSBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIFJvdXRpbmdBY3Rpdml0eT47CiAKIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAogLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCi1jbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK2NsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+CiB7CiBwdWJsaWM6CiAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0ICB7IHJldHVybiBtRGV2aWNlczsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CiAKLSAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzZXRTdG9wVGltZSBzZXQgdGhlIHN0b3AgdGltZSBkdWUgdG8gdGhlIGNsaWVudCBzdG9wcGFnZSBvciBhIHJlIHJvdXRpbmcgb2YgdGhpcworICAgICAqIGNsaWVudAorICAgICAqIEBwYXJhbSBjbGllbnQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHdoZW4gdGhlIGNsaWVudCBzdG9wcGVkL3dhcyByZXJvdXRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3RvcFRpbWUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBuc2Vjc190IHN5c1RpbWUpOworCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgY2xpZW50LT5hY3RpdmUoKSBzdGF0ZSBhbmQgdGhlIG91dHB1dCBkZXNjcmlwdG9yJ3MgZ2xvYmFsIGFjdGl2ZSBjb3VudCwKKyAgICAgKiBhbG9uZyB3aXRoIHRoZSBzdHJlYW0gYWN0aXZlIGNvdW50IGFuZCBtQWN0aXZlQ2xpZW50cy4KKyAgICAgKiBUaGUgY2xpZW50IG11c3QgYmUgcHJldmlvdXNseSBhZGRlZCBieSB0aGUgYmFzZSBjbGFzcyBhZGRDbGllbnQoKS4KKyAgICAgKiBJbiBjYXNlIG9mIGR1cGxpY2F0aW5nIHRocmVhZCwgY2xpZW50IHNoYWxsIGJlIGFkZGVkIG9uIHRoZSBkdXBsaWNhdGVkIHRocmVhZCwgbm90IG9uIHRoZQorICAgICAqIGludm9sdmVkIG91dHB1dHMgYnV0IHNldENsaWVudEFjdGl2ZSB3aWxsIGJlIGNhbGxlZCBvbiBhbGwgb3V0cHV0IHRvIHRyYWNrIHN0cmF0ZWd5IGFuZAorICAgICAqIGFjdGl2ZSBjbGllbnQgZm9yIGEgZ2l2ZW4gb3V0cHV0LgorICAgICAqIEFjdGl2ZSByZWYgY291bnQgb2YgdGhlIGNsaWVudCB3aWxsIGJlIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIHRocm91Z2ggc2V0QWN0aXZlIEFQSQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UgPSBWT0xVTUVfU09VUkNFX05PTkUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQW55QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gYWN0aXZlTGlzdDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5wdXNoX2JhY2soaXRlci5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGl2ZUxpc3Q7CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldEFjdGl2aXR5Q291bnQoKSA6IDA7CisgICAgfQorICAgIGJvb2wgaXNNdXRlZChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuaXNNdXRlZCgpIDogZmFsc2U7CisgICAgfQorICAgIGludCBnZXRNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldE11dGVDb3VudCgpIDogMDsKKyAgICB9CisgICAgaW50IGluY011dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpCisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXNbdnNdLmluY011dGVDb3VudCgpOworICAgIH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllc1t2c10uZGVjTXV0ZUNvdW50KCk7CisgICAgfQorICAgIHZvaWQgc2V0Q3VyVm9sdW1lKFZvbHVtZVNvdXJjZSB2cywgZmxvYXQgdm9sdW1lRGIpCisgICAgeworICAgICAgICAvLyBFdmVuIGlmIG5vdCBhY3Rpdml0eSBmb3IgdGhpcyBzb3VyY2UgcmVnaXN0ZXJlZCwgbmVlZCB0byBjcmVhdGUgYW55d2F5CisgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5zZXRWb2x1bWUodm9sdW1lRGIpOworICAgIH0KKyAgICBmbG9hdCBnZXRDdXJWb2x1bWUoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKSA/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRWb2x1bWUoKSA6IE5BTjsKKyAgICB9CisKKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdF9zdHJhdGVneV90IHBzLCB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdBY3Rpdml0aWVzLmZpbmQocHMpICE9IHN0ZDo6ZW5kKG1Sb3V0aW5nQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChwcykuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpIDogZmFsc2U7CisgICAgfQorICAgIGJvb2wgaXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nQWN0aXZpdGllcy5maW5kKHBzKSAhPSBzdGQ6OmVuZChtUm91dGluZ0FjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQocHMpLmlzTXV0ZWRCeURldmljZSgpIDogZmFsc2U7CisgICAgfQorICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYm9vbCBpc011dGVkKQorICAgIHsKKyAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzW3BzXS5zZXRNdXRlZEJ5RGV2aWNlKGlzTXV0ZWQpOworICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CkBAIC03MywyMiArMjUyLDU4IEBACiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgeyBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7IH07CisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgc3A8QXVkaW9Qb3J0PiAgICAgICBtUG9ydDsKLSAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCi0gICAgdWludDMyX3QgbVJlZkNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgdXNpbmcgdGhpcyBvdXRwdXQKLSAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKLSAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZSBpbiBkQgotICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKLSAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIFRyYWNrQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZSBDbGllbnRNYXBIYW5kbGVyIHRvIGFib3J0IHdoZW4gcmVtb3ZpbmcgYSBjbGllbnQgd2hlbiBhY3RpdmUuCisgICAgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBjbGllbnQgPSBnZXRDbGllbnQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBub25leGlzdGVudCBjbGllbnQgcG9ydElkICVkIiwgX19mdW5jX18sIG1JZCwgcG9ydElkKTsKKyAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQsIHdlIGNvdWxkIHJlbW92ZSBpdHMKKyAgICAgICAgLy8gYXNzb2NpYXRlZCBhY3RpdmUgY291bnQgYnkgY2FsbGluZyBjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudCgpLAorICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBiZSBoaWRpbmcgYSBwcm9ibGVtLCBzbyB3ZSBsb2cgZmF0YWwgaW5zdGVhZC4KKyAgICAgICAgYXV0byBjbGllbnRJdGVyID0gc3RkOjpmaW5kKGJlZ2luKG1BY3RpdmVDbGllbnRzKSwgZW5kKG1BY3RpdmVDbGllbnRzKSwgY2xpZW50KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnRJdGVyICE9IG1BY3RpdmVDbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCkgcmVtb3ZpbmcgY2xpZW50IHBvcnRJZCAlZCB3aGljaCBpcyBhY3RpdmUgKGNvdW50ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgcG9ydElkLCBjbGllbnQtPmdldEFjdGl2aXR5Q291bnQoKSk7CisgICAgICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CisgICAgfQorCisgICAgY29uc3QgVHJhY2tDbGllbnRWZWN0b3ImIGdldEFjdGl2ZUNsaWVudHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWN0aXZlQ2xpZW50czsKKyAgICB9CisKKyAgICBib29sIHVzZUh3R2FpbigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIWRldmljZXMoKS5pc0VtcHR5KCkgPyBkZXZpY2VzKCkuaXRlbUF0KDApLT5oYXNHYWluQ29udHJvbGxlcigpIDogZmFsc2U7CisgICAgfQorCisgICAgRGV2aWNlVmVjdG9yIG1EZXZpY2VzOyAvKio8IGN1cnJlbnQgZGV2aWNlcyB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8gKi8KKyAgICB3cDxBdWRpb1BvbGljeU1peD4gbVBvbGljeU1peDsgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAKIHByb3RlY3RlZDoKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisgICAgY29uc3Qgc3A8QXVkaW9Qb3J0PiBtUG9ydDsKKyAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqIGNvbnN0IG1DbGllbnRJbnRlcmZhY2U7CisgICAgdWludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZlIGNvdW50CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgLy8gVGhlIEFjdGl2ZUNsaWVudHMgc2hvd3MgdGhlIGNsaWVudHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBAVm9sdW1lU291cmNlIGNvdW50cworICAgIC8vIGFuZCBtYXkgaW5jbHVkZSB1cHN0cmVhbSBjbGllbnRzIGZyb20gYSBkdXBsaWNhdGluZyB0aHJlYWQuCisgICAgLy8gQ29tcGFyZSB3aXRoIHRoZSBDbGllbnRNYXAgKG1DbGllbnRzKSB3aGljaCBhcmUgZXh0ZXJuYWwgQXVkaW9UcmFjayBjbGllbnRzIG9mIHRoZQorICAgIC8vIG91dHB1dCBkZXNjcmlwdG9yIChhbmQgZG8gbm90IGNvdW50IGludGVybmFsIFBhdGNoVHJhY2tzKS4KKyAgICBUcmFja0NsaWVudFZlY3RvciBtQWN0aXZlQ2xpZW50czsKKworICAgIFJvdXRpbmdBY3Rpdml0aWVzIG1Sb3V0aW5nQWN0aXZpdGllczsgLyoqPCB0cmFjayByb3V0aW5nIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KKworICAgIFZvbHVtZUFjdGl2aXRpZXMgbVZvbHVtZUFjdGl2aXRpZXM7IC8qKjwgdHJhY2sgdm9sdW1lIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgpAQCAtOTksMTkgKzMxNCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0OworICAgIHZvaWQgc2V0RGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIHsgbURldmljZXMgPSBkZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCk7CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0MSAhPSBOVUxMICYmIG1PdXRwdXQyICE9IE5VTEwpOyB9CiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQorICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0QWxsQ2xpZW50c0luYWN0aXZlKCkKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogY2xpZW50c0xpc3QodHJ1ZSkpIHsKKyAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7CkBAIC0xMjAsNDggKzM0Miw3MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7Ci0gICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIGNoYW5nZVJlZkNvdW50KDEpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICAgICAgICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkLgotICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKTsKLSAgICAgICAgICAgIHZvaWQgc3RvcCgpOwotICAgICAgICAgICAgdm9pZCBjbG9zZSgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgb3BlbkR1cGxpY2F0aW5nKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKTsKKyAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKKworICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCisgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgc2V0Q2xpZW50QWN0aXZlKHRydWUpOworICAgICAgICBzdGF0dXNfdCBzdGFydCgpOworICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KKyAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSk7CisgICAgICAgIHZvaWQgc3RvcCgpOworICAgICAgICB2b2lkIGNsb3NlKCk7CisgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzRGV2aWNlCisgICAgICogQHBhcmFtIGRldmljZSB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYnkgdHlwZSAoZm9yIG5vbiBidXMgLyByZW1vdGUgc3VibWl4IGRldmljZXMpLAorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCAoYm90aCB0eXBlIGFuZCBhZGRyZXNzKSBmb3IgYnVzIC8gcmVtb3RlIHN1Ym1peAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0FsbERldmljZXMKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyB3ZWFrbHkgc3VwcG9ydGVkIGJ5IHR5cGUgKGUuZy4gZm9yIG5vbiBidXMgLyByc3VibWl4IGRldmljZXMpLAorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCAoYm90aCB0eXBlIGFuZCBhZGRyZXNzKSBmb3IgYnVzIC8gcmVtb3RlIHN1Ym1peAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXJTdXBwb3J0ZWREZXZpY2VzIHRha2VzIGEgdmVjdG9yIG9mIGRldmljZXMgYW5kIGZpbHRlcnMgdGhlbSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZGV2aWNlIHN1cHBvcnRlZCBieSB0aGlzIG91dHB1dCAodGhlIHByb2ZpbGUgZnJvbSB3aGljaCB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20pCisgICAgICogQHBhcmFtIGRldmljZXMgcmVmZXJlbmNlIGRldmljZSB2ZWN0b3IgdG8gYmUgZmlsdGVyZWQKKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiBkZXZpY2VzIGZpbHRlcmVkIGZyb20gdGhlIHN1cHBvcnRlZCBkZXZpY2VzIG9mIHRoaXMgb3V0cHV0ICh3ZWFrbHkgb3Igbm90CisgICAgICogZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgdHlwZSkKKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQogICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCi0gICAgd3A8QXVkaW9Qb2xpY3lNaXg+IG1Qb2xpY3lNaXg7ICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKQEAgLTE3MCw3ICs0MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBtU291cmNlOworICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKIH07CiAKQEAgLTE3OCwyNSArNDI0LDUyIEBACiAgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlCisgICAgICogdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCiAgICAgICogbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQogICAgICAqIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZyB3aGljaAogICAgICAqIHVzZXMgYW4gb3V0cHV0IGZvciBwbGF5YmFjayB3aXRoIGEgbm9uLWVtcHR5LCBub24gIjAiIGFkZHJlc3MuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmVSZW1vdGVseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiIGRldmljZS4KKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgc291cmNlIGNvbnRyaWJ1dGluZyB0byBWb2x1bWVTb3VyY2UgaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiCisgICAgICogZGV2aWNlLgogICAgICAqIE92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIGxvY2FsL3JlbW90ZSBwbGF5YmFjay4KICAgICAgKiBVc2VkIGZvciBpbnN0YW5jZSBieSBwb2xpY3kgbWFuYWdlciB0byBhbHRlciB0aGUgc3BlYWtlciBwbGF5YmFjayAoInNwZWFrZXIgc2FmZSIgYmVoYXZpb3IpCiAgICAgICogd2hlbiBtZWRpYSBwbGF5cyBvciBub3QgbG9jYWxseS4KICAgICAgKiBGb3IgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24sICJyZW1vdGVseSIgbWVhbnMgcGxheWluZyBkdXJpbmcgc2NyZWVuIG1pcnJvcmluZy4KICAgICAgKi8KLSAgICBib29sIGlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlTG9jYWxseShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUgY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJhdGVneSBpcyBhY3RpdmUgKG9yIHdhcyBhY3RpdmUKKyAgICAgKiBpbiB0aGUgcGFzdCkgb24gdGhlIGdpdmVuIG91dHB1dCBhbmQgYWxsIHRoZSBvdXRwdXRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBIVyBNb2R1bGUKKyAgICAgKiB0aGUgc2FtZSBtb2R1bGUgdGhhbiB0aGUgZ2l2ZW4gb3V0cHV0CisgICAgICogQHBhcmFtIG91dHB1dERlc2MgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGJlIGNoZWNrZWQgdXBvbiBhY3Rpdml0eSBzdGF0dXMKKyAgICAgKiBAcGFyYW0gaW5QYXN0TXMgaWYgMCwgY2hlY2sgY3VycmVudGx5LCBvdGhlcndpc2UsIGNoZWNrIGluIHRoZSBwYXN0CisgICAgICogQHBhcmFtIHN5c1RpbWUgc2hhbGwgYmUgc2V0IGlmIHJlcXVlc3QgaXMgZG9uZSBmb3IgdGhlIHBhc3QgYWN0aXZpdHkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFuIG91dHB1dCBmb2xsb3dpbmcgdGhlIHN0cmF0ZWd5IGlzIGFjdGl2ZSBvbiB0aGUgc2FtZSBtb2R1bGUgdGhhbiBkZXNjLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgICogcHJldmVudCBmcm9tIHVzaW5nIHRoaXMgZGV2aWNlIGFueSBtb3JlIGJ5IGNsZWFyaW5nIGFsbCB0aGUgc2Vzc2lvbiByb3V0ZXMgaW52b2x2aW5nIHRoaXMKKyAgICAgKiBkZXZpY2UuCisgICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgICogQHBhcmFtIGRpc2Nvbm5lY3RlZERldmljZSBkZXZpY2UgdG8gYmUgZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CiAKICAgICAvKioKICAgICAgKiByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQpAQCAtMjE4LDI3ICs0OTEsNTMgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKiBAYnJpZWYgaXNBbnlPdXRwdXRBY3RpdmUgY2hlY2tzIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIChha2EgcGxheWluZykgZXhjZXB0IHRoZSBvbmUocykgdGhhdAorICAgICAqIGhvbGQgdGhlIHZvbHVtZSBzb3VyY2UgdG8gYmUgaWdub3JlZAorICAgICAqIEBwYXJhbSB2b2x1bWVTb3VyY2VUb0lnbm9yZSBzb3VyY2Ugbm90IHRvIGJlIGNvbnNpZGVyZWQgaW4gdGhlIGFjdGl2aXR5IGRldGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBmb3IgYW55IHZvbHVtZSBzb3VyY2UgZXhjZXB0IHRoZSBvbmUgdG8gYmUgaWdub3JlZAogICAgICAqLwotICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3Q7CisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FueUFjdGl2ZSh2b2x1bWVTb3VyY2VUb0lnbm9yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogY2xhc3MgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gOgogICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSB2b2x1bWUgc291cmNlIGV4Y2VwdCB0aGUgb25lIHRvIGJlIGlnbm9yZWQKICAgICAgKi8KLSAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OworICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBbnlBY3RpdmUodm9sdW1lU291cmNlVG9JZ25vcmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggYzFjM2YzYy4uMDg0M2ZlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDcgKzMxLDcgQEAKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwpAQCAtNDcsNyArNDgsNyBAQAogCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCA0M2Y2ZWQ2Li4yMjY0ZDhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMTYsOCArMTYsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CkBAIC0yOCw3ICszMCw2IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDIxICszOSwyMCBAQAogICAgIEF1ZGlvUG9saWN5Q29uZmlnKEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqdm9sdW1lcyA9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UpCiAgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKSwKLSAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMoZGVmYXVsdE91dHB1dERldmljZXMpLAotICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXModm9sdW1lcyksCisgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSksCiAgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAotICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQotICAgIHsKLSAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKm1Wb2x1bWVDdXJ2ZXMgPSB2b2x1bWVzOwotICAgICAgICB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsKKyAgICAgICAgbVNvdXJjZSA9IGZpbGU7CiAgICAgfQogCiAgICAgdm9pZCBzZXRId01vZHVsZXMoY29uc3QgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMpCkBAIC0xMDAsNTEgKzEwMCw4MyBAQAogCiAgICAgdm9pZCBzZXREZWZhdWx0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0RGV2aWNlKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gZGVmYXVsdERldmljZTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBkZWZhdWx0RGV2aWNlOwogICAgIH0KIAotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2VzOyB9CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsgfQogCiAgICAgdm9pZCBzZXREZWZhdWx0KHZvaWQpCiAgICAgewotICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgICAgICBtU291cmNlID0gIkF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0IjsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IG1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKIAotICAgICAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpOworICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZLCAyIC8qaGFsVmVyc2lvbk1ham9yKi8pOworICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YXR0YWNoKG1vZHVsZSk7CiAKLSAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZTsKLSAgICAgICAgb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7Ci0gICAgICAgIG91dFByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBzcDxPdXRwdXRQcm9maWxlPiBvdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKICAgICAgICAgb3V0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDQxMDApKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG91dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpOwogICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKLSAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7Ci0gICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CisgICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOworICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKICAgICAgICAgaW5Qcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGVmYXVsdElucHV0RGV2aWNlKTsKICAgICAgICAgbW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoaW5Qcm9maWxlKTsKIAotICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCk7CisgICAgfQorCisgICAgLy8gU3Vycm91bmQgZm9ybWF0cywgd2l0aCBhbiBvcHRpb25hbCBsaXN0IG9mIHN1YmZvcm1hdHMgdGhhdCBhcmUgZXF1aXZhbGVudCBmcm9tIHVzZXJzJyBQT1YuCisgICAgdXNpbmcgU3Vycm91bmRGb3JtYXRzID0gc3RkOjp1bm9yZGVyZWRfbWFwPGF1ZGlvX2Zvcm1hdF90LCBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+PjsKKworICAgIGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmZ2V0U3Vycm91bmRGb3JtYXRzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtU3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRzKGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmc3Vycm91bmRGb3JtYXRzKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHsKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUUywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFNfSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUFDX0xDLCB7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsIEFVRElPX0ZPUk1BVF9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1hIRX19LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzNfSk9DLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDNCwge319fTsKICAgICB9CiAKIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbVNvdXJjZTsKICAgICBId01vZHVsZUNvbGxlY3Rpb24gJm1Id01vZHVsZXM7IC8qKjwgQ29sbGVjdGlvbiBvZiBNb2R1bGUsIHdpdGggUHJvZmlsZXMsIGkuZS4gTWl4IFBvcnRzLiAqLwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7CiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZXM7Ci0gICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgLy8gVE9ETzogcmVtb3ZlIHdoZW4gbGVnYWN5IGNvbmYgZmlsZSBpcyByZW1vdmVkLiB0cnVlIG9uIGRldmljZXMgdGhhdCB1c2UgRFJDIG9uIHRoZQogICAgIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGggdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkuCiAgICAgLy8gTm90ZTogcmVtb3ZlIGFsc28gc3BlYWtlcl9kcmNfZW5hYmxlZCBmcm9tIGdsb2JhbCBjb25maWd1cmF0aW9uIG9mIFhNTCBjb25maWcgZmlsZS4KICAgICBib29sIG1Jc1NwZWFrZXJEcmNFbmFibGVkOworICAgIFN1cnJvdW5kRm9ybWF0cyBtU3Vycm91bmRGb3JtYXRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAppbmRleCAzMzQ1NTc5Li4wOTRmNTA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtMTYsNDYgKzE2LDQ3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7CisjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgogCi1jbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK25hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCiAgKiBjdXN0b20gbWl4IGVudHJ5IGluIG1Qb2xpY3lNaXhlcwogICovCiBjbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBBdWRpb01peCwgcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIEF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvTWl4ICZtaXgpOworICAgIEF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvTWl4ICZtaXgpIDogQXVkaW9NaXgobWl4KSB7fQogICAgIEF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvUG9saWN5TWl4JikgPSBkZWxldGU7CiAgICAgQXVkaW9Qb2xpY3lNaXgmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvbGljeU1peCYpID0gZGVsZXRlOwogCi0gICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZnZXRPdXRwdXQoKSBjb25zdDsKKyAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXQ7IH0KKyAgICB2b2lkIHNldE91dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCkgeyBtT3V0cHV0ID0gb3V0cHV0OyB9CisgICAgdm9pZCBjbGVhck91dHB1dCgpIHsgbU91dHB1dC5jbGVhcigpOyB9CiAKLSAgICB2b2lkIHNldE91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCk7Ci0KLSAgICB2b2lkIGNsZWFyT3V0cHV0KCk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0OyAgLy8gQ29ycmVzcG9uZGluZyBvdXRwdXQgc3RyZWFtCiB9OwogCiAKLWNsYXNzIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCwgc3A8QXVkaW9Qb2xpY3lNaXg+ID4KK2NsYXNzIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Qb2xpY3lNaXg+PgogewogcHVibGljOgotICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5TWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvbGljeU1peChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4KSBjb25zdDsKIAotICAgIHN0YXR1c190IHJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpOworICAgIHN0YXR1c190IHJlZ2lzdGVyTWl4KEF1ZGlvTWl4IG1peCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpOwogCi0gICAgc3RhdHVzX3QgdW5yZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyTWl4KGNvbnN0IEF1ZGlvTWl4JiBtaXgpOwogCiAgICAgdm9pZCBjbG9zZU91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOwogCkBAIC02MywyMSArNjQsNTIgQEAKICAgICAgKiBUcnkgdG8gZmluZCBhbiBvdXRwdXQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgZm93ciB0aGUgcmVzZWFyY2ggb2Ygb3V0cHV0IGRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtW291dF0gZGVzYyB0byByZXR1cm4gaWYgYW4gb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIChpbiB0aGlzIGNhc2UsIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciBvdXRwdXQgcGFyYW0gaXMgaW5pdGlhbGl6ZWQpLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBwcmltYXJ5IG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKiBAcGFyYW1bb3V0XSBzZWNvbmRhcnlEZXNjIG90aGVyIGRlc2MgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlIHJvdXRlZCB0by4KKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSByZXF1ZXN0IGlzIHZhbGlkCisgICAgICogICAgICAgICBvdGhlcndpc2UgaWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZAogICAgICAqLwotICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYyk7CisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZwcmltYXJ5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBtaXggZm9yIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiBvdXRwdXQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBvdXRwdXQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBhdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3Qgb2Ygb3V0cHV0IGRldmljZXMgY3VycmVudGx5IHJlYWNoYWJsZQorICAgICAqIEByZXR1cm4gZGV2aWNlIHNlbGVjdGVkIGZyb20gdGhlIG1peCBhdHRhY2hlZCB0byB0aGUgb3V0cHV0LCBudWxsIHBvaW50ZXIgb3RoZXJ3aXNlCisgICAgICovCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMpOwogCiAgICAgc3RhdHVzX3QgZ2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgbWl4IHJ1bGVzIGluIG9yZGVyIHRvIG1ha2Ugc3RyZWFtcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVpZAorICAgICAqIGJlIHJvdXRlZCB0byB0aGUgZ2l2ZW4gYXVkaW8gZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gdWlkIHRoZSB1aWQgZm9yIHdoaWNoIHRoZSBkZXZpY2UgYWZmaW5pdHkgaXMgc2V0CisgICAgICogQHBhcmFtIGRldmljZXMgdGhlIHZlY3RvciBvZiBkZXZpY2VzIHRoYXQgdGhpcyB1aWQgbWF5IGJlIHJvdXRlZCB0by4gQSB0eXBpY2FsCisgICAgICogICAgdXNlIGlzIHRvIHBhc3MgdGhlIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gem9uZSBpbiBhIG11bHRpLXpvbmUgc2V0dXAuCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdXBkYXRlIHdhcyBzdWNjZXNzZnVsLCBJTlZBTElEX09QRVJBVElPTiBvdGhlcndpc2UuCisgICAgICogICAgQW4gZXhhbXBsZSBvZiBmYWlsdXJlIGlzIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgcnVsZXMgaW4gcGxhY2UgdG8gcmVzdHJpY3QKKyAgICAgKiAgICBhIG1peCB0byB0aGUgZ2l2ZW4gdWlkIChpLmUuIHdoZW4gYSBNQVRDSF9VSUQgcnVsZSB3YXMgc2V0IGZvciBpdCkuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworICAgIHN0YXR1c190IGdldERldmljZXNGb3JVaWQodWlkX3QgdWlkLCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZW51bSBjbGFzcyBNaXhNYXRjaFN0YXR1cyB7IE1BVENILCBOT19NQVRDSCwgSU5WQUxJRF9NSVggfTsKKyAgICBNaXhNYXRjaFN0YXR1cyBtaXhNYXRjaChjb25zdCBBdWRpb01peCogbWl4LCBzaXplX3QgbWl4SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCmluZGV4IDA5YTg2ZGQuLmQ5MDZmMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvQ29sbGVjdGlvbnMuaCIKICNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJIYW5kbGVHZW5lcmF0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0yOSw5ICszMCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEh3TW9kdWxlOwotY2xhc3MgQXVkaW9HYWluOwogY2xhc3MgQXVkaW9Sb3V0ZTsKLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPiBBdWRpb0dhaW5Db2xsZWN0aW9uOwogCiBjbGFzcyBBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wb3J0X2hhbmRsZV90PgogewpAQCAtNDksOCArNDgsOCBAQAogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCA9IDA7CiAKLSAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9Ci0gICAgY29uc3QgQXVkaW9HYWluQ29sbGVjdGlvbiAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KKyAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbnMgJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9CisgICAgY29uc3QgQXVkaW9HYWlucyAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykKICAgICB7CkBAIC02NSw2ICs2NCw3IEBACiAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKICAgICBib29sIGlzQXR0YWNoZWQoKSB7IHJldHVybiBtTW9kdWxlICE9IDA7IH0KIAogICAgIC8vIEF1ZGlvIHBvcnQgSURzIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwpAQCAtMTEyLDEwICsxMTIsMTQgQEAKICAgICBzdGF0aWMgYm9vbCBpc0JldHRlckZvcm1hdE1hdGNoKGF1ZGlvX2Zvcm1hdF90IG5ld0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjdXJyZW50Rm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHRhcmdldEZvcm1hdCk7CisgICAgc3RhdGljIHVpbnQzMl90IGZvcm1hdERpc3RhbmNlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDIpOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRm9ybWF0RGlzdGFuY2VNYXggPSA0OwogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1vZHVsZVZlcnNpb25NYWpvcigpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldE1vZHVsZU5hbWUoKSBjb25zdDsKKyAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQogCiAgICAgYm9vbCB1c2VJbnB1dENoYW5uZWxNYXNrKCkgY29uc3QKICAgICB7CkBAIC0xMzIsMTYgKzEzNiwxNyBAQAogICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQogICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworCiAgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKIAotICAgIEF1ZGlvR2FpbkNvbGxlY3Rpb24gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCi0gICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgQXVkaW9HYWlucyBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKIAogcHJpdmF0ZToKICAgICB2b2lkIHBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpIGNvbnN0OwogICAgIHZvaWQgcGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcmF0ZSxjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKIAorICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogICAgIFN0cmluZzggIG1OYW1lOwogICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOwpAQCAtMTUzLDIyICsxNTgsMjIgQEAKIGNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb1BvcnRDb25maWcoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCiAgICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAob3RoZXIgIT0gMCkgJiYKKyAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJiAob3RoZXItPmdldEF1ZGlvUG9ydCgpICE9IDApICYmIChnZXRBdWRpb1BvcnQoKSAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09IGdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAgICAgfQotICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworICAgIGJvb2wgaGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUgPSBmYWxzZSkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZSA9IDB1OworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluID0geyAuaW5kZXggPSAtMSB9OworICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKaW5kZXggODc0MWM2Ni4uYjU4OGQ1NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaApAQCAtMTYsOTEgKzE2LDg0IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgInBvbGljeS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHR5cGVkZWYgU29ydGVkVmVjdG9yPHVpbnQzMl90PiBTYW1wbGVSYXRlVmVjdG9yOwotdHlwZWRlZiBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IENoYW5uZWxzVmVjdG9yOwogdHlwZWRlZiBWZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IEZvcm1hdFZlY3RvcjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yID09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpOworYm9vbCBvcGVyYXRvcj09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByaWdodC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGxlZnRbaW5kZXhdICE9IHJpZ2h0W2luZGV4XSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3IhPSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworfQorCitjbGFzcyBDaGFubmVsc1ZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Cit7CitwdWJsaWM6CisgICAgQ2hhbm5lbHNWZWN0b3IoKSA9IGRlZmF1bHQ7CisgICAgQ2hhbm5lbHNWZWN0b3IoY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisgICAgQ2hhbm5lbHNWZWN0b3IoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgc3YpIDoKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4oc3YpIHt9CisgICAgQ2hhbm5lbHNWZWN0b3ImIG9wZXJhdG9yPShjb25zdCBDaGFubmVsc1ZlY3RvciYpID0gZGVmYXVsdDsKKworICAgIC8vIEFwcGxpZXMgYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbiB0byBhbGwgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICBDaGFubmVsc1ZlY3RvciBhc0luTWFzaygpIGNvbnN0OworICAgIC8vIEFwcGxpZXMgYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dCB0byBhbGwgZWxlbWVudHMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICBDaGFubmVsc1ZlY3RvciBhc091dE1hc2soKSBjb25zdDsKK307CiAKIGNsYXNzIEF1ZGlvUHJvZmlsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KQotICAgIHsKLSAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Ci0gICAgfQorICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGNyZWF0ZUZ1bGxEeW5hbWljKCk7CiAKKyAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSk7CiAgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUNoYW5uZWxNYXNrcyhjaGFubmVsTWFza3MpLAotICAgICAgICBtU2FtcGxpbmdSYXRlcyhzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKQotICAgIHt9CisgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pOwogCiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCi0gICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmZ2V0Q2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2tzOyB9Ci0KLSAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7Ci0gICAgICAgICAgICBtU2FtcGxpbmdSYXRlcyA9IHNhbXBsZVJhdGVzOwotICAgICAgICB9Ci0gICAgfQogICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJmdldFNhbXBsZVJhdGVzKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXM7IH0KKyAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpOworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpOwogCisgICAgdm9pZCBjbGVhcigpOwogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGhhc1ZhbGlkRm9ybWF0KCkgJiYgaGFzVmFsaWRSYXRlcygpICYmIGhhc1ZhbGlkQ2hhbm5lbHMoKTsgfQotCi0gICAgdm9pZCBjbGVhcigpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7Ci0gICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKKyAgICBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbUNoYW5uZWxNYXNrcy5pbmRleE9mKGNoYW5uZWxzKSA+PSAwOwogICAgIH0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c1JhdGUodWludDMyX3QgcmF0ZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7Ci0gICAgfQorICAgIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzLmluZGV4T2YocmF0ZSkgPj0gMDsgfQogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdCh1aW50MzJfdCByYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICZ1cGRhdGVkQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OwogCkBAIC0xMTksNyArMTEyLDcgQEAKIAogICAgIGJvb2wgaXNEeW5hbWljKCkgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdCB8fCBtSXNEeW5hbWljQ2hhbm5lbHMgfHwgbUlzRHluYW1pY1JhdGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIFN0cmluZzggIG1OYW1lOwpAQCAtMTM2LDIxMyArMTI5LDQ4IEBACiBjbGFzcyBBdWRpb1Byb2ZpbGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUHJvZmlsZT4gPgogewogcHVibGljOgotICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCi0gICAgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gVmVjdG9yOjphZGQocHJvZmlsZSk7Ci0gICAgICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCi0gICAgICAgIC8vIFRPRE86IGNvbXBhcmVGb3JtYXRzIGNvdWxkIGJlIGEgbGFtYmRhIHRvIGNvbnZlcnQgYmV0d2VlbiBwb2ludGVyLXRvLWZvcm1hdCB0byBmb3JtYXQ6Ci0gICAgICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgewotICAgICAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgc29ydChjb21wYXJlRm9ybWF0cyk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KKyAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKTsKICAgICAvLyBUaGlzIEFQSSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBvbmNlIHJldHJpZXZpbmcgY2FwYWJpbGl0aWVzCiAgICAgLy8gZm9yIGEgcHJvZmlsZSB3aXRoIGR5bmFtaWMgZm9ybWF0LCByYXRlIGFuZCBjaGFubmVscyBhdHRyaWJ1dGVzCi0gICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpCi0gICAgewotICAgICAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHNldEZvcm1hdHMoRm9ybWF0VmVjdG9yKGZvcm1hdHMpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRDaGFubmVsc0Zvcihwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcm9maWxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKLSAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGl0ZW1BdChwcm9maWxlSW5kZXgpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSAmJiBwcm9maWxlID09IHByb2ZpbGVUb0FkZCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gc2V0IHRoZSBmb3JtYXQgYXMgZHluYW1pYyB0byBhbGxvdyByZW1vdmFsCi0gICAgICAgIHJldHVybiBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KKyAgICBzc2l6ZV90IGFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVQcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKKyAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKTsKKyAgICAvLyBBc3N1bWluZyB0aGF0IHRoaXMgcHJvZmlsZSB2ZWN0b3IgY29udGFpbnMgaW5wdXQgcHJvZmlsZXMsCisgICAgLy8gZmluZCB0aGUgYmVzdCBtYXRjaGluZyBjb25maWcgZnJvbSAnb3V0cHV0UHJvZmlsZXMnLCBhY2NvcmRpbmcgdG8KKyAgICAvLyB0aGUgZ2l2ZW4gcHJlZmVyZW5jZXMgZm9yIGF1ZGlvIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MuCisgICAgLy8gTm90ZTogc3RkOjp2ZWN0b3JzIGFyZSB1c2VkIGJlY2F1c2Ugc3BlY2lhbGl6ZWQgY29udGFpbmVycyBmb3IgZm9ybWF0cworICAgIC8vICAgICAgIGFuZCBjaGFubmVscyBjYW4gYmUgc29ydGVkIGFuZCB1c2UgdGhlaXIgb3duIG9yZGVyaW5nLgorICAgIHN0YXR1c190IGZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiYgcHJlZmVycmVkRm9ybWF0cywgLy8gb3JkZXI6IG1vc3QgcHJlZiAtPiBsZWFzdCBwcmVmCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHByZWZlcnJlZE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2UgKmJlc3RPdXRwdXRDb25maWcpIGNvbnN0OwogCi0gICAgRm9ybWF0VmVjdG9yIGdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRGb3JtYXRzLmFkZChpdGVtQXQoaSktPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0OworICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc1ZhbGlkUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0VmFsaWRQcm9maWxlKCkgIT0gMDsgfQogCi0gICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc0R5bmFtaWMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgRm9ybWF0VmVjdG9yIGdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0Zvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpICE9IDA7IH0KKyAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwogCiAgICAgLy8gT25lIGF1ZGlvIHByb2ZpbGUgd2lsbCBiZSBhZGRlZCBmb3IgZWFjaCBmb3JtYXQgc3VwcG9ydGVkIGJ5IEF1ZGlvIEhBTAotICAgIHZvaWQgc2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpCi0gICAgewotICAgICAgICAvLyBPbmx5IGFsbG93IHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9mIGR5bmFtaWMgcHJvZmlsZQotICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNGb3JtYXRQcm9maWxlID0gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgIGlmIChkeW5hbWljRm9ybWF0UHJvZmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpOwotICAgICAgICAgICAgYWRkKHByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgfQorICAgIHZvaWQgc2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpOwogCi0gICAgdm9pZCBjbGVhclByb2ZpbGVzKCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBzaXplKCk7IGkgIT0gMDsgKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoLS1pKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0R5bmFtaWNGb3JtYXQoKSAmJiBwcm9maWxlLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9maWxlLT5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLSAgICB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCBzcGFjZXMgKyA4KTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICB2b2lkIHNldFNhbXBsZVJhdGVzRm9yKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZENoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldENoYW5uZWxzKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzRm9yKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKIAogICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTEsIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKTsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAppbmRleCA2YjI0ZmRlLi4wMzU3ZmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKQEAgLTQ2LDcgKzQ2LDIwIEBACiAKICAgICBhdWRpb19yb3V0ZV90eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNQYXRjaCBjaGVja3MgaWYgYW4gYXVkaW8gcGF0Y2ggaXMgc3VwcG9ydGVkIGJ5IGEgUm91dGUgZGVjbGFyZWQgaW4KKyAgICAgKiB0aGUgYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUuCisgICAgICogSWYgdGhlIHBhdGNoIGlzIHN1cHBvcnRlZCBuYXRpdmVseSBieSBhbiBBdWRpb0hBTCAod2hpY2ggc3VwcG9ydHMgb2YgY291cnNlIFJvdXRpbmcgQVBJIDMuMCksCisgICAgICogYXVkaW9wb2xpY3kgd2lsbCBub3QgcmVxdWVzdCBBdWRpb0ZsaW5nZXIgdG8gdXNlIGEgc29mdHdhcmUgYnJpZGdlIHRvIHJlYWxpemUgYSBwYXRjaAorICAgICAqIGJldHdlZW4gMiBwb3J0cy4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdWRpbyByb3V0ZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIEF1ZGlvUG9ydFZlY3RvciBtU291cmNlczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkOGJmMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7Ci1jbGFzcyBBdWRpb1BvbGljeU1peDsKLQotY2xhc3MgQXVkaW9TZXNzaW9uIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4LAotICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uOyB9Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZTsgfQotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuZm9ybWF0OyB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuc2FtcGxlX3JhdGU7IH0KLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuY2hhbm5lbF9tYXNrOyB9Ci0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnVpZDsgfQotICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtUmVjb3JkQ2xpZW50SW5mby51aWQgPSB1aWQ7IH0KLSAgICBib29sIG1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBtSXNTb3VuZFRyaWdnZXI7IH0KLSAgICB2b2lkIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KLSAgICBib29sIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KLSAgICB1aW50MzJfdCBvcGVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtT3BlbkNvdW50OyB9IDsKLSAgICB1aW50MzJfdCBhY3RpdmVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmVDb3VudDsgfSA7Ci0KLSAgICB1aW50MzJfdCBjaGFuZ2VPcGVuQ291bnQoaW50IGRlbHRhKTsKLSAgICB1aW50MzJfdCBjaGFuZ2VBY3RpdmVDb3VudChpbnQgZGVsdGEpOwotCi0gICAgdm9pZCBzZXRJbmZvUHJvdmlkZXIoQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtUmVjb3JkQ2xpZW50SW5mbzsKLSAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNvbmZpZzsKLSAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKLSAgICBib29sICBtSXNTb3VuZFRyaWdnZXI7Ci0gICAgYm9vbCBtU2lsZW5jZWQ7Ci0gICAgdWludDMyX3QgIG1PcGVuQ291bnQ7Ci0gICAgdWludDMyX3QgIG1BY3RpdmVDb3VudDsKLSAgICB3cDxBdWRpb1BvbGljeU1peD4gbVBvbGljeU1peDsgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSogbUNsaWVudEludGVyZmFjZTsKLSAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIG1JbmZvUHJvdmlkZXI7Ci19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIDoKLSAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgc3A8QXVkaW9TZXNzaW9uPiA+LAotICAgIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBzdGF0dXNfdCBhZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotCi0gICAgc3RhdHVzX3QgcmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICB1aW50MzJfdCBnZXRPcGVuQ291bnQoKSBjb25zdDsKLQotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3Q7Ci0gICAgYm9vbCBoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMzdmYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGlucHV0IGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBkZXBlbmRlbnQgYXVkaW8gc2Vzc2lvbnMgY2FuIHF1ZXJ5IGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGVpciBjb250ZXh0Ci0gKi8KLWNsYXNzIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcigpIHt9OwotCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7Ci0KLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfkF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcigpIHt9OwotCi0gICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdCA9IDA7OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkwZjQyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgotI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKLQotY2xhc3MgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotICAgIEF1ZGlvU291cmNlRGVzY3JpcHRvcihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA6Ci0gICAgICAgIG1EZXZpY2UoZGV2aWNlKSwgbUF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLCBtVWlkKHVpZCkge30KLSAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZURlc2NyaXB0b3IoKSB7fQotCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0SGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoRGVzYy0+bUhhbmRsZTsgfQotCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURldmljZTsKLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHJpYnV0ZXM7Ci0gICAgdWlkX3QgbVVpZDsKLSAgICBzcDxBdWRpb1BhdGNoPiBtUGF0Y2hEZXNjOwotICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7Ci0gICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKLX07Ci0KLWNsYXNzIEF1ZGlvU291cmNlQ29sbGVjdGlvbiA6Ci0gICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+ID4KLXsKLXB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA1YTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2UpIDoKKyAgICAgICAgbVBvcnRJZChwb3J0SWQpLCBtVWlkKHVpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCisgICAgICAgIG1Db25maWcoY29uZmlnKSwgbVByZWZlcnJlZERldmljZUlkKHByZWZlcnJlZERldmljZUlkKSwgbUFjdGl2ZShmYWxzZSksCisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KKyAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdDsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cmlidXRlczsgfQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZzsgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQ7IH07CisgICAgdm9pZCBzZXRQcmVmZXJyZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkKSB7CisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VJZCA9IHByZWZlcnJlZERldmljZUlkOworICAgIH0KKyAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQorICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJZCBmb3IgdGhpcyBjbGllbnQKKyAgICBjb25zdCB1aWRfdCBtVWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsgLy8gdXNhZ2UuLi4KKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IG1Db25maWc7CisgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUHJlZmVycmVkRGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgIGJvb2wgbUFjdGl2ZTsKKyAgICAgICAgICBib29sIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKK307CisKK2NsYXNzIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSksCisgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwgbVN0cmF0ZWd5KHN0cmF0ZWd5KSwgbVZvbHVtZVNvdXJjZSh2b2x1bWVTb3VyY2UpLCBtRmxhZ3MoZmxhZ3MpLAorICAgICAgICBtU2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUoc2Vjb25kYXJ5T3V0cHV0cykpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJhdGVneTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4mIGdldFNlY29uZGFyeU91dHB1dHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2Vjb25kYXJ5T3V0cHV0czsKKyAgICB9OworICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtVm9sdW1lU291cmNlOyB9CisKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAgICAgY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1BY3Rpdml0eUNvdW50LCAiJXMoJXMpIGludmFsaWQgZGVsdGEgJWQsIGluYWN0aXZlIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8aW50PihtQWN0aXZpdHlDb3VudCkgPCAtZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBDbGllbnREZXNjcmlwdG9yOjpzZXRBY3RpdmUobUFjdGl2aXR5Q291bnQgPiAwKTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgIGNvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBtU3RyYXRlZ3k7CisgICAgY29uc3QgVm9sdW1lU291cmNlIG1Wb2x1bWVTb3VyY2U7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gbVNlY29uZGFyeU91dHB1dHM7CisKKyAgICAvKioKKyAgICAgKiByZXF1aXJlZCBmb3IgZHVwbGljYXRpbmcgdGhyZWFkLCBwcmV2ZW50IGZyb20gcmVtb3ZpbmcgYWN0aXZlIGNsaWVudCBmcm9tIGFuIG91dHB1dAorICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCisgICAgICovCisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBhdWRpb191bmlxdWVfaWRfdCByaWlkLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLCBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1SSUlkKHJpaWQpLCBtU291cmNlKHNvdXJjZSksIG1GbGFncyhmbGFncyksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCisgICAgICAgIG1BcHBTdGF0ZShBUFBfU1RBVEVfSURMRSkge30KKyAgICB+UmVjb3JkQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQoKSBjb25zdCB7IHJldHVybiBtUklJZDsgfQorICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1Tb3VyY2U7IH0KKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQorICAgIGJvb2wgaXNMb3dMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIG1SSUlkID09IFJFQ09SRF9SSUlEX0lOVkFMSUQ7IH0KKyAgICB2b2lkIHNldEFwcFN0YXRlKGFwcF9zdGF0ZV90IGFwcFN0YXRlKSB7IG1BcHBTdGF0ZSA9IGFwcFN0YXRlOyB9CisgICAgYXBwX3N0YXRlX3QgYXBwU3RhdGUoKSB7IHJldHVybiBtQXBwU3RhdGU7IH0KKyAgICBib29sIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtQXBwU3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7IH0KKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gbUVuYWJsZWRFZmZlY3RzOyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fdW5pcXVlX2lkX3QgbVJJSWQ7CisgICAgY29uc3QgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IG1GbGFnczsKKyAgICBjb25zdCBib29sIG1Jc1NvdW5kVHJpZ2dlcjsKKyAgICAgICAgICBhcHBfc3RhdGVfdCBtQXBwU3RhdGU7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOworfTsKKworY2xhc3MgU291cmNlQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIFRyYWNrQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFNvdXJjZUNsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2hEZXNjLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UpOworICAgIH5Tb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoRGVzYzsgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TcmNEZXZpY2U7IH07CisgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVN3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KTsKKyAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtSHdPdXRwdXQ7IH0KKyAgICB2b2lkIHNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpOworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiBtUGF0Y2hEZXNjOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1TcmNEZXZpY2U7CisgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKKyAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OworfTsKKworY2xhc3MgU291cmNlQ2xpZW50Q29sbGVjdGlvbiA6CisgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gPgoreworcHVibGljOgorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworfTsKKwordHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiA+IFRyYWNrQ2xpZW50VmVjdG9yOwordHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gPiBSZWNvcmRDbGllbnRWZWN0b3I7CisKKy8vIEEgTWFwIHRoYXQgYXNzb2NpYXRlcyBhIHBvcnRJZCB3aXRoIGEgY2xpZW50ICh0eXBlIFQpCisvLyB3aGljaCBpcyBlaXRoZXIgVHJhY2tDbGllbnREZXNjcmlwdG9yIG9yIFJlY29yZENsaWVudERlc2NyaXB0b3IuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDbGllbnRNYXBIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DbGllbnRNYXBIYW5kbGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gVHJhY2sgY2xpZW50IG1hbmFnZW1lbnQKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2xpZW50KGNvbnN0IHNwPFQ+ICZjbGllbnQpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBjbGllbnQtPnBvcnRJZCgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFtQ2xpZW50cy5lbXBsYWNlKHBvcnRJZCwgY2xpZW50KS5zZWNvbmQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXR0ZW1wdGluZyB0byBhZGQgY2xpZW50IHRoYXQgYWxyZWFkeSBleGlzdHMiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICB9CisgICAgc3A8VD4gZ2V0Q2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKHBvcnRJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQ2xpZW50cy5lbmQoKSkgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQgPT0gbUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2xpZW50IGRvZXMgbm90IGV4aXN0IiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQtPnNlY29uZC0+YWN0aXZlKCksCisgICAgICAgICAgICAgICAgIiVzKCVkKTogcmVtb3ZpbmcgY2xpZW50IHN0aWxsIGFjdGl2ZSEiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICAgICAgKHZvaWQpbUNsaWVudHMuZXJhc2UoaXQpOworICAgIH0KKyAgICBzaXplX3QgZ2V0Q2xpZW50Q291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50cy5zaXplKCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgeworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoZWxwZXIgdHlwZXMKKyAgICB1c2luZyBDbGllbnRNYXAgPSBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxUPj47CisgICAgdXNpbmcgQ2xpZW50TWFwSXRlcmF0b3IgPSB0eXBlbmFtZSBDbGllbnRNYXA6OmNvbnN0X2l0ZXJhdG9yOyAgLy8gQ2xpZW50TWFwIGlzIGNvbnN0IHF1YWxpZmllZAorICAgIGNsYXNzIENsaWVudEl0ZXJhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENsaWVudEl0ZXJhYmxlKGNvbnN0IENsaWVudE1hcEhhbmRsZXI8VD4gJnJlZikgOiBtQ2xpZW50TWFwSGFuZGxlcihyZWYpIHsgfQorCisgICAgICAgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgLy8gdHJhaXRzCisgICAgICAgICAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgICAgICAgICB1c2luZyB2YWx1ZV90eXBlID0gc3A8VD47CisgICAgICAgICAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgICAgICAgICAgICB1c2luZyBwb2ludGVyID0gY29uc3Qgc3A8VD4qOyAgICAvLyBOb3RlOiBjb25zdAorICAgICAgICAgICAgdXNpbmcgcmVmZXJlbmNlID0gY29uc3Qgc3A8VD4mOyAgLy8gTm90ZTogY29uc3QKKworICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGV4cGxpY2l0IGl0ZXJhdG9yKGNvbnN0IENsaWVudE1hcEl0ZXJhdG9yICZpdCkgOiBtSXQoaXQpIHsgfQorICAgICAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSAgICAvKiBwcmVmaXggKi8gICAgIHsgKyttSXQ7IHJldHVybiAqdGhpczsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yKiAoKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9CisgICAgICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3ItPigpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4gbUl0LT5zZWNvbmQ7IH0gLy8gYXMgaWYgc3A8PgorICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBpdGVyYXRvciYgcmhzKSB7cmV0dXJuIG1JdCAtIHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgPT0gcmhzLm1JdDsgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuIG1JdCAhPSByaHMubUl0OyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBDbGllbnRNYXBJdGVyYXRvciBtSXQ7CisgICAgICAgIH07CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcnttQ2xpZW50TWFwSGFuZGxlci5tQ2xpZW50cy5iZWdpbigpfTsgfQorICAgICAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcnttQ2xpZW50TWFwSGFuZGxlci5tQ2xpZW50cy5lbmQoKX07IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IENsaWVudE1hcEhhbmRsZXI8VD4mIG1DbGllbnRNYXBIYW5kbGVyOyAvLyBpdGVyYXRpbmcgZG9lcyBub3QgbW9kaWZ5IG1hcC4KKyAgICB9OworCisgICAgLy8gcmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcmFuZ2UtYmFzZWQtZm9yIHRvIGVudW1lcmF0ZSBjbGllbnRzLgorICAgIC8vIHRoaXMgaXRlcmFibGUgZG9lcyBub3QgYWxsb3cgbW9kaWZpY2F0aW9uLCBpdCBzaG91bGQgYmUgdXNlZCBhcyBhIHRlbXBvcmFyeS4KKyAgICBDbGllbnRJdGVyYWJsZSBnZXRDbGllbnRJdGVyYWJsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENsaWVudEl0ZXJhYmxleyp0aGlzfTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gQ2xpZW50TWFwIG1hcHMgYSBwb3J0SWQgdG8gYSBjbGllbnQgZGVzY3JpcHRvciAoYm90aCB1bmlxdWVseSBpZGVudGlmeSBlYWNoIG90aGVyKS4KKyAgICBDbGllbnRNYXAgbUNsaWVudHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDc4NTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lDb25maWcuaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlZmluaXRpb25zIGZvciBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ29uZmlnUGFyc2luZ1V0aWxzCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRDb25maWcoY29uc3QgY2hhciAqcGF0aCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgbG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWlucyhjbm9kZSAqcm9vdCwgQXVkaW9Qb3J0ICZhdWRpb1BvcnQpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VEZXNjcmlwdG9yR2FpbnMoY25vZGUgKnJvb3QsIHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2VEZXNjKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlRGV2aWNlKGNub2RlICpyb290LCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZERldmljZXNGcm9tVGFnKGNvbnN0IGNoYXIgKnRhZywgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGVjbGFyZWREZXZpY2VzKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4gJnByaW1hcnlNb2R1bGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRNb2R1bGVHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKaW5kZXggOTJhNGMzZS4uMzNlNTA2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCkBAIC0zMSwxNSArMzEsMzEgQEAKIHB1YmxpYzoKICAgICAgLy8gTm90ZSB0aGF0IGVtcHR5IG5hbWUgcmVmZXJzIGJ5IGNvbnZlbnRpb24gdG8gYSBnZW5lcmljIGRldmljZS4KICAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lID0gU3RyaW5nOCgiIikpOworICAgIERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lID0gU3RyaW5nOCgiIikpOwogCiAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CiAKICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1UYWdOYW1lOyB9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CisgICAgU3RyaW5nOCBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbUFkZHJlc3M7IH0KKyAgICB2b2lkIHNldEFkZHJlc3MoY29uc3QgU3RyaW5nOCAmYWRkcmVzcykgeyBtQWRkcmVzcyA9IGFkZHJlc3M7IH0KKworICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEVuY29kZWRGb3JtYXQoKSB7IHJldHVybiBtQ3VycmVudEVuY29kZWRGb3JtYXQ7IH0KKworICAgIHZvaWQgc2V0RW5jb2RlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gZm9ybWF0OworICAgIH0KIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7CiAKKyAgICBib29sIGhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKICAgICAvLyBBdWRpb1BvcnRDb25maWcKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gKEF1ZGlvUG9ydCopIHRoaXM7IH0KICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC00Nyw0NCArNjMsMTQ4IEBACiAKICAgICAvLyBBdWRpb1BvcnQKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CisKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7Ci0KLSAgICBTdHJpbmc4IG1BZGRyZXNzOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CiAKIHByaXZhdGU6CisgICAgU3RyaW5nOCBtQWRkcmVzc3siIn07CiAgICAgU3RyaW5nOCBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgogICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZVR5cGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7Ci0KLWZyaWVuZCBjbGFzcyBEZXZpY2VWZWN0b3I7CisgICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0OwogfTsKIAogY2xhc3MgRGV2aWNlVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6CiAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorICAgIGV4cGxpY2l0IERldmljZVZlY3Rvcihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgOiBEZXZpY2VWZWN0b3IoKQorICAgIHsKKyAgICAgICAgYWRkKGl0ZW0pOworICAgIH0KIAogICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKICAgICB2b2lkIGFkZChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwogICAgIHNzaXplX3QgcmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICB2b2lkIHJlbW92ZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOwogICAgIHNzaXplX3QgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworICAgIC8vIElmICdhZGRyZXNzJyBpcyBlbXB0eSBhbmQgJ2NvZGVjJyBpcyBBVURJT19GT1JNQVRfREVGQVVMVCwgYSBkZXZpY2Ugd2l0aCBhIG5vbi1lbXB0eQorICAgIC8vIGFkZHJlc3MgbWF5IGJlIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgJ3R5cGUnIGFuZCBlbXB0eSBhZGRyZXNzLgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWMpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlRnJvbUlkCisgICAgICogQHBhcmFtIGlkIG9mIHRoZSBEZXZpY2VEZXNjcmlwdG9yIHRvIHNlYWNoIChha2EgUG9ydCBoYW5kbGUpLgorICAgICAqIEByZXR1cm4gRGV2aWNlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHBvcnQgaWQgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlLiBJZiB0aGUgaWQgaXMKKyAgICAgKiBlcXVhbCB0byBBVURJT19QT1JUX0hBTkRMRV9OT05FLCBpdCBhbHNvIHJldHVybnMgYSBudWxscHRyLgorICAgICAqLwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QgeyByZXR1cm4gaW5kZXhPZihpdGVtKSA+PSAwOyB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQXRMZWFzdE9uZQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYXQgbGlzdCBvbmUgb2YgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBdExlYXN0T25lKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY29udGFpbnNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERldmljZVZlY3RvciBjb250YWlucyBhbGwgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yCisgICAgICovCisgICAgYm9vbCBjb250YWluc0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXIgdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29sbGVjdGlvbiBhZ2FpbnN0IGFub3RoZXIgY29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGZpbHRlciBhZ2FpbnN0CisgICAgICogQHJldHVybiBhIGZpbHRlcmVkIERldmljZVZlY3RvcgorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXIgdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29sbGVjdGlvbiBiZWZvcmUgc2VuZGluZworICAgICAqIHRoZW4gdG8gdGhlIEVuZ2luZSB2aWEgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgaW50ZXJmYWNlCisgICAgICogQHJldHVybiBhIGZpbHRlcmVkIERldmljZVZlY3RvcgorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXJGb3JFbmdpbmUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtZXJnZSB0d28gdmVjdG9ycy4gQXMgU29ydGVkVmVjdG9yIEltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5IChpdCBkb2VzIG5vdCBjaGVjayB0aGUgc2l6ZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IsIG9ubHkgb2YgdGhlIHNvdXJjZSwgaXQgcHJvdmlkZXMgYSBzYWZlIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIGRldmljZXMgc291cmNlIGRldmljZSB2ZWN0b3IgdG8gbWVyZ2Ugd2l0aAorICAgICAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgbWVyZ2VkIHZlY3Rvci4KKyAgICAgKi8KKyAgICBzc2l6ZV90IG1lcmdlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIG9wZXJhdG9yID09IERldmljZVZlY3RvciBhcmUgZXF1YWxzIGlmIGFsbCB0aGUgRGV2aWNlRGVzY3JpcHRvciBjYW4gYmUgZm91bmQgKGFrYQorICAgICAqIERldmljZURlc2NyaXB0b3Igd2l0aCBzYW1lIHR5cGUgYW5kIGFkZHJlc3MpIGFuZCB0aGUgdmVjdG9yIGhhcyBzYW1lIHNpemUuCisgICAgICogQHBhcmFtIHJpZ2h0IERldmljZVZlY3RvciB0byBjb21wYXJlIHRvLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByaWdodCBjb250YWlucyB0aGUgc2FtZSBkZXZpY2UgYW5kIGhhcyB0aGUgc2FtZSBzaXplLgorICAgICAqLworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXZpY2VWZWN0b3IgJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAocmlnaHQuaW5kZXhPZihkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEZpcnN0VmFsaWRBZGRyZXNzCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgdmFsaWQgYWRkcmVzcyBvZiBhIGxpc3Qgb2YgZGV2aWNlLCAiIiBpZiBubyBkZXZpY2Ugd2l0aCB2YWxpZCBhZGRyZXNzCisgICAgICogZm91bmQuCisgICAgICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gaGVscHMgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSB3aGVyZSB3ZSB1c2VkIHRvIGhhdmUgYQorICAgICAqIGRldmljZXMgbWFzayBhbmQgYW4gYWRkcmVzcy4KKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldEZpcnN0VmFsaWRBZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UtPmFkZHJlc3MoKSAhPSAiIikgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPmFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCAwNDgzMWM2Li5jNGVhYjMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTE2LDI1ICsxNiwzOSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiBjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBib29sIGlzTXVzaWNFZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgOgorICAgICAgICBtSWQoaWQpLCBtSW8oaW8pLCBtU2Vzc2lvbihzZXNzaW9uKSwgbUVuYWJsZWQoZmFsc2UpLCBtU3VzcGVuZGVkKGZhbHNlKSwKKyAgICAgICAgbUlzTXVzaWNFZmZlY3QoaXNNdXNpY0VmZmVjdCkKKyAgICB7CisgICAgICAgIG1lbWNweSAoJm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH0KIAotICAgIGludCBtSW87ICAgICAgICAgICAgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KLSAgICByb3V0aW5nX3N0cmF0ZWd5IG1TdHJhdGVneTsgLy8gcm91dGluZyBzdHJhdGVneSB0aGUgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8KLSAgICBpbnQgbVNlc3Npb247ICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCi0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzYzsgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCisgICAgaW50IG1JZDsgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0IHVuaXF1ZSBJRAorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JbzsgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KKyAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247ICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90CisgICAgYm9vbCBtU3VzcGVuZGVkOyAgICAgICAgICAgLy8gZW5hYmxlZCBidXQgc3VzcGVuZGVkIGJ5IGNvbmN1cmVudCBjYXB0dXJlIHBvbGljeQorCisgICAgYm9vbCBpc011c2ljRWZmZWN0KCkgY29uc3QgeyByZXR1cm4gbUlzTXVzaWNFZmZlY3Q7IH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc011c2ljRWZmZWN0OwogfTsKIAogY2xhc3MgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+CkBAIC00MywxNCArNTcsMjIgQEAKICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpOwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksIGludCBzZXNzaW9uLCBpbnQgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLCBpbnQgaWQsIGJvb2wgaXNNdXNpY0VmZmVjdCk7CiAgICAgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGdldEVmZmVjdChpbnQgaWQpIGNvbnN0OworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEVmZmVjdHNGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBpbykgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCAgICAgaXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3Q7Ci0gICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKKyAgICB2b2lkIG1vdmVFZmZlY3RzKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyMjlhNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yOwotCi1jbGFzcyBHYWlucwotewotcHVibGljIDoKLSAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50LCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOwotCi0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IGNiOWY0OWUuLmViMzRkYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC00Niw2ICs0NiwyMiBAQAogCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXREZWNsYXJlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGVjbGFyZWREZXZpY2VzOyB9CiAgICAgdm9pZCBzZXREZWNsYXJlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QWxsRGV2aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1EZWNsYXJlZERldmljZXM7CisgICAgICAgIGRldmljZXMubWVyZ2UobUR5bmFtaWNEZXZpY2VzKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfQorICAgIHZvaWQgYWRkRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgbUR5bmFtaWNEZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKworICAgIGJvb2wgcmVtb3ZlRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1EeW5hbWljRGV2aWNlcy5yZW1vdmUoZGV2aWNlKSA+PSAwOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZ2V0RHluYW1pY0RldmljZXMoKSBjb25zdCB7IHJldHVybiBtRHluYW1pY0RldmljZXM7IH0KIAogICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldElucHV0UHJvZmlsZXMoKSBjb25zdCB7IHJldHVybiBtSW5wdXRQcm9maWxlczsgfQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQpAQCAtODEsOCArOTcsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC05Myw2ICsxMjAsNyBAQAogICAgIElucHV0UHJvZmlsZUNvbGxlY3Rpb24gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgdWludDMyX3QgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgogICAgIERldmljZVZlY3RvciBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgRGV2aWNlVmVjdG9yIG1EeW5hbWljRGV2aWNlczsgLyoqPCBkZXZpY2VzIHRoYXQgY2FuIGJlIGFkZGVkL3JlbW92ZWQgYXQgcnVudGltZSAoZS5nLiByc2J1bWl4KSovCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOwogICAgIEF1ZGlvUG9ydFZlY3RvciBtUG9ydHM7CiB9OwpAQCAtMTAyLDE0ICsxMzAsNjQgQEAKIHB1YmxpYzoKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CiAKLSAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzID0gdHJ1ZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VEZXNjcmlwdG9yIHJldHVybnMgYSBkZXZpY2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHRoZSBkZXZpY2UgdHlwZSBhbmQKKyAgICAgKiBkZXZpY2UgYWRkcmVzcyAoaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpLgorICAgICAqIEl0IG1heSBsb29wIHR3aWNlIG9uIGFsbCBtb2R1bGVzIHRvIGNoZWNrIGlmIGFsbG93VG9DcmVhdGUgaXMgdHJ1ZQorICAgICAqICAgICAgLWZpcnN0IGxvb3Agd2lsbCBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIGEgbW9kdWxlIHNpbmNlIGRlY2xhcmVkIGluIHRoZSBsaXN0CisgICAgICogb2YgZGV2aWNlIHBvcnQgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogICAgICAtKGFsbG93VG9DcmVhdGUgaXMgdHJ1ZSlzZWNvbmQgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSBvbmUKKyAgICAgKiBvciBtb3JlIHByb2ZpbGVzIG9uIGEgZ2l2ZW4gbW9kdWxlIGFuZCB3aWxsIGFkZCBhcyBhIHN1cHBvcnRlZCBkZXZpY2UgZm9yIHRoaXMgbW9kdWxlLgorICAgICAqICAgICAgIFRoZSBkZXZpY2Ugd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBkeW5hbWljIGxpc3Qgb2YgZGV2aWNlIG9mIHRoaXMgbW9kdWxlCisgICAgICogQHBhcmFtIHR5cGUgb2YgdGhlIGRldmljZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCBpZiBub3QgQVVESU9fRk9STUFUX0RFRkFVTFQsIG11c3QgbWF0Y2ggb25lIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gbWF0Y2hBZGRyZXNzIHRydWUgaWYgYSBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gYWxsb3dUb0NyZWF0ZSB0cnVlIGlmIGFsbG93ZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGV2aWNlIChlLmcuIGhkbWksIHVzYi4uLikKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIHR5cGUgKGFuZCBhZGRyZXNzIGlmIG1hdGNoQWRkcmVzcyBpcyB0cnVlKQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY3JlYXRlRGV2aWNlIGNyZWF0ZXMgYSBuZXcgZGV2aWNlIGZyb20gdGhlIHR5cGUgYW5kIGFkZHJlc3MgZ2l2ZW4uIEl0IGNoZWNrcyB0aGF0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgdHlwZSwgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIGRldmljZSAod2VhayBjaGVjaykuCisgICAgICogVGhpcyBjb25jZXJucyBvbmx5IGR5bmFtaWMgZGV2aWNlLCBha2EgZGV2aWNlIHdpdGggYSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBub3QKKyAgICAgKiBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb2R1bGUvdW5kZXJseWluZyBwcm9maWxlcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRpbmcgdGhpcyB0eXBlLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFuVXBGb3JEZXZpY2U6IGxvb3Agb24gYWxsIHByb2ZpbGVzIG9mIGFsbCBtb2R1bGVzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbQorICAgICAqIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2UuIElmIHRoaXMgZGV2aWNlIGlzIGEgZHluYW1pYyBkZXZpY2UgKGFrYSBhIGRldmljZSBub3QgaW4gdGhlCisgICAgICogeG1sIGZpbGUgd2l0aCBhIHJ1bnRpbWUgYWRkcmVzcyksIGl0IGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgY29sbGVjdGlvbiBvZiBkeW5hbWljCisgICAgICogZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uZTBiNTZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzUsNyArMzUsNyBAQAogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQogICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKLSAgICAgICAgICBtYXhPcGVuQ291bnQoKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgPyAxIDogMCksCisgICAgICAgICAgbWF4T3BlbkNvdW50KDEpLAogICAgICAgICAgIGN1ck9wZW5Db3VudCgwKSwKICAgICAgICAgICBtYXhBY3RpdmVDb3VudCgxKSwKICAgICAgICAgICBjdXJBY3RpdmVDb3VudCgwKSB7fQpAQCAtNTcsMTIgKzU3LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwgYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCi0gICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCi0gICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIC8vIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgIC8qKgorICAgICAqIEBicmllZiBpc0NvbXBhdGlibGVQcm9maWxlOiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwKKyAgICAgKiBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KKyAgICAgKiBDaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKiBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICogQHBhcmFtIGZvcm1hdCB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkRm9ybWF0IGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIGZvcm1hdAorICAgICAqIEBwYXJhbSBjaGFubmVsTWFzayB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkQ2hhbm5lbE1hc2sgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgY2hhbm5lbCBtYXNrCisgICAgICogQHBhcmFtIGZsYWdzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyB0cnVlIGlmIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkIG9uIGZsYWdzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9maWxlIGlzIGNvbXBhdGlibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC03Myw1NCArODYsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogICAgIHZvaWQgbG9nKCk7CiAKICAgICBib29sIGhhc1N1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiAhbVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpOyB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICBib29sIHN1cHBvcnRzRGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgfQogCi0gICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgIHRoZSBhZGRyZXNzIGVuZm9yY2VtZW50IGlzIGxpbWl0ZWQgdG8gIm9mZmljYWwgZGV2aWNlcyIgdGhhdCBkaXN0aW5ndWlzaGUgb24gYWRkcmVzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIGJvb2wgZm9yY2VDaGVja09uQWRkcmVzcyA9IGZhbHNlKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOwotICAgIH0KLQotICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZUZvclR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gbVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UtPnR5cGUoKSkgJiYgIWZvcmNlQ2hlY2tPbkFkZHJlc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0RldmljZVR5cGVzKGRldmljZS0+dHlwZSgpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhkZXZpY2UpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7IH0KKyAgICBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyByZXF1aXJlZCBmb3IgaXNPZmZsb2FkU3VwcG9ydGVkKCkgY2hlY2sKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCktPmhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIHZvaWQgY2xlYXJTdXBwb3J0ZWREZXZpY2VzKCkgeyBtU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOyB9CiAgICAgdm9pZCBhZGRTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KLQorICAgIHZvaWQgcmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICB9CiAgICAgdm9pZCBzZXRTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgYWRkcmVzcyk7Ci0gICAgfQotCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnRlZERldmljZXM7IH0KIAogICAgIGJvb2wgY2FuT3Blbk5ld0lvKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwODQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLCBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD4gZ2V0QXR0cmlidXRlcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGdldFN0cmVhbVR5cGVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3QgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNmIwOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCAvKmlzU3BlYWtlckRyY0VuYWJsZWQqLykge30KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHN0cmVhbSwgc3RyZWFtKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdCA9IDA7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCAyOWRlODQ4Li40OGM0MTQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTE3LDIyMyArMTcsOSBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJBdWRpb1BvbGljeUNvbmZpZy5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotc3RydWN0IF94bWxOb2RlOwotc3RydWN0IF94bWxEb2M7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEF1ZGlvR2FpblRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kZVtdOyAvKio8IGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluVmFsdWVNQltdOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4VmFsdWVNQltdOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdFZhbHVlTUJbXTsgLyoqPCBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdGVwVmFsdWVNQltdOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblJhbXBNc1tdOyAvKio8IG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhSYW1wTXNbXTsgLyoqPCAubmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAgKi8KLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb0dhaW4gRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb0dhaW5Db2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gR2FpbiBoYXMgbm8gY2hpbGQKLX07Ci0KLS8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0Ci1zdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNhbXBsaW5nUmF0ZXNbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrc1tdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Qcm9maWxlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotfTsKLQotc3RydWN0IE1peFBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmbGFnc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhPcGVuQ291bnRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4QWN0aXZlQ291bnRbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBJT1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBJT1Byb2ZpbGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzCi19OwotCi1zdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdGFnTmFtZVtdOyAvKio8ICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlU291cmNlW107IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NbXTsgLyoqPCBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgRGV2aWNlRGVzY3JpcHRvciBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RGV2aWNlRGVzY3JpcHRvcj4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIERldmljZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMgKG9wdGlvbm5hbCkKLX07Ci0KLXN0cnVjdCBSb3V0ZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZU1peFtdOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2lua1tdOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc291cmNlc1tdOyAvKio8IHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Sb3V0ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpOwotfTsKLQotc3RydWN0IE1vZHVsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZXNUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBId01vZHVsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEh3TW9kdWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMgYW5kIHJvdXRlVHJhaXRzCi0gICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKLX07Ci0KLXN0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNwZWFrZXJEcmNFbmFibGVkW107Ci0gICAgfTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci19OwotCi1zdHJ1Y3QgVm9sdW1lVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdm9sdW1lUG9pbnRUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RyZWFtW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZUNhdGVnb3J5W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJlZmVyZW5jZVtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxWb2x1bWVDdXJ2ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBObyBDaGlsZAotfTsKLQotY2xhc3MgUG9saWN5U2VyaWFsaXplcgotewotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgcm9vdE5hbWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmVyc2lvbkF0dHJpYnV0ZTsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01ham9yOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNaW5vcjsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotCi1wdWJsaWM6Ci0gICAgUG9saWN5U2VyaWFsaXplcigpOwotICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKnN0ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OwotCi0gICAgc3RkOjpzdHJpbmcgbVJvb3RFbGVtZW50TmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCi19Oworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjQ0NDAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VWZWN0b3I7Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKLSAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50Ci0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLQotICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudAotCi0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0KLSAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgICAgIDogbVVpZCh1aWQpLAotICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAotICAgICAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKLSAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgICAgICAgbVNvdXJjZShzb3VyY2UpCi0gICAge30KLQotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7Ci0KLSAgICBib29sIGlzQWN0aXZlT3JDaGFuZ2VkKCkgewotICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7Ci0gICAgfQotCi0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKLQotICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7Ci0gICAgLy8gZm9yIG91dHB1dHMKLSAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7Ci0gICAgLy8gZm9yIGlucHV0cwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOwotfTsKLQotY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KLXsKLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKLSAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCi0gICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCi0gICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCi0gICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCi0gICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQotICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OwotCi0gICAgZXhwbGljaXQgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6Ci0gICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCi0gICAge30KLQotICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGJvb2wgZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogY2FwdGlvbik7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpOwotICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQuCi0gICAgLy8gU3BlY2lmeSBhbiBJbnB1dChTb3VyY2UpIHJvdXQgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OkFVRElPX1NUUkVBTV9ERUZBVUxUCi0gICAgLy8gaW4gdGhlIHN0cmVhbVR5cGUgYXJndW1lbnQuCi0gICAgdm9pZCBhZGRSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLQotcHJpdmF0ZToKLSAgICAvLyBVc2VkIHRvIG1hcmsgYSBTZXNzaW9uUm91dGUgYXMgZm9yIGVpdGhlciBpbnB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfSW5wdXQpCi0gICAgLy8gb3Igb3V0cHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9PdXRwdXQpCi0gICAgY29uc3Qgc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1NYXBUeXBlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjEwMzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OwotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCk7Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pOwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KTsKLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vKioKLSAqIHN0cmVhbSBkZXNjcmlwdG9ycyBjb2xsZWN0aW9uIGZvciB2b2x1bWUgY29udHJvbAotICovCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgU3RyZWFtRGVzY3JpcHRvcj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOwotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOwotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdDsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKaW5kZXggNjNjMTlkMS4uNmIwNDc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCkBAIC0yMywyNiArMjMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGRldmljZV9jYXRlZ29yeSBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE1peFR5cGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSb3V0ZUZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgUnVsZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKK3N0cnVjdCBSdWxlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwordXNpbmcgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGRldmljZV9jYXRlZ29yeT47CitzdHJ1Y3QgTWl4VHlwZVRyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGludDMyX3Q+IHt9Oworc3RydWN0IFJvdXRlRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPHVpbnQzMl90PiB7fTsKIAogdHlwZWRlZiBUeXBlQ29udmVydGVyPERldmljZUNhdGVnb3J5VHJhaXRzPiBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxNaXhUeXBlVHJhaXRzPiBNaXhUeXBlQ29udmVydGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YjJiNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEN1cnZlUG9pbnQKLXsKLSAgICBDdXJ2ZVBvaW50KCkge30KLSAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgotICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KLSAgICB1aW50MzJfdCBtSW5kZXg7Ci0gICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Ci19OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQotewotICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKLX0KLQotLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQotLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCi0vLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCi1jbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKLSAgICAgICAgbURldmljZUNhdGVnb3J5KGRldmljZSksIG1TdHJlYW1UeXBlKHN0cmVhbSkge30KLQotICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0KLSAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7Ci0gICAgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotfTsKLQotLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQotY2xhc3MgVm9sdW1lQ3VydmVzRm9yU3RyZWFtIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4KLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oKSA6IG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotICAgIHsKLSAgICAgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7Ci0gICAgfQotCi0gICAgc3A8Vm9sdW1lQ3VydmU+IGdldEN1cnZlc0ZvcihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KLSAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIHsgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsgfQotCi0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pIHsgbUluZGV4TWluID0gdm9sSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KSB7IG1JbmRleE1heCA9IHZvbEluZGV4TWF4OyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0KLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiBnZXRPcmlnaW5Wb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChtT3JpZ2luVm9sdW1lQ3VydmVzLmluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSIpOwotICAgICAgICByZXR1cm4gbU9yaWdpblZvbHVtZUN1cnZlcy52YWx1ZUZvcihkZXZpY2VDYXRlZ29yeSk7Ci0gICAgfQotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5IGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IHZvbHVtZUN1cnZlLT5nZXREZXZpY2VDYXRlZ29yeSgpOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgVm9sdW1lIEN1cnZlcyBwZXIgZGV2aWNlIGNhdGVnb3J5IGluIG9yZGVyIHRvIHN3aXRjaCBjdXJ2ZXMuCi0gICAgICAgICAgICBtT3JpZ2luVm9sdW1lQ3VydmVzLmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgICAgICAgICAgcmV0dXJuIEtleWVkVmVjdG9yOjphZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKLSAgICAgICAgaWYgKHZjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOwotICAgICAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vLyBDb2xsZWN0aW9uIG9mIFZvbHVtZSBDdXJ2ZXMgaW5kZXhlZCBieSB1c2UgY2FzZQotY2xhc3MgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKQotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgY3VydmVzCi0gICAgICAgIGZvciAoc3NpemVfdCBpID0gMCA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSk7Ci0gICAgICAgICAgICBLZXllZFZlY3Rvcjo6YWRkKHN0cmVhbSwgVm9sdW1lQ3VydmVzRm9yU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT25jZSBYTUwgaGFzIGJlZW4gcGFyc2VkLCBtdXN0IGJlIGNhbGwgZmlyc3QgdG8gc2FuaXR5IGNoZWNrIHRhYmxlIGFuZCBpbml0aWFsaXplIGluZGV4ZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotICAgIHsKLSAgICAgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbihpbmRleE1pbik7Ci0gICAgICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNYXgoaW5kZXhNYXgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBlZGl0Q3VydmVzRm9yKHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeyByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuY2FuQmVNdXRlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQotICAgIHsKLSAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZzb3VyY2VDdXJ2ZXMgPSBnZXRDdXJ2ZXNGb3Ioc3RyZWFtU3JjKTsKLSAgICAgICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZkc3RDdXJ2ZXMgPSBlZGl0Q3VydmVzRm9yKHN0cmVhbURzdCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHNvdXJjZUN1cnZlcy5zaXplKCkgPT0gZHN0Q3VydmVzLnNpemUoKSwgImRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCIpOwotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlQ3VydmVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IHNvdXJjZUN1cnZlcy5rZXlBdChpbmRleCk7Ci0gICAgICAgICAgICBkc3RDdXJ2ZXMuc2V0Vm9sdW1lQ3VydmUoY2F0LCBzb3VyY2VDdXJ2ZXMuZ2V0T3JpZ2luVm9sdW1lQ3VydmUoY2F0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkudm9sSW5kZXhUb0RiKGNhdCwgaW5kZXhJblVpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gdm9sdW1lQ3VydmUtPmdldFN0cmVhbVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtVHlwZSkuYWRkKHZvbHVtZUN1cnZlKTsKLSAgICB9Ci0gICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZlZGl0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSk7Ci0gICAgfQotICAgIGNvbnN0IFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZ2V0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSk7Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjYTY3Yjg3Li5jOTBhNTgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgNCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMTkzZDRhNi4uMjcyNTg3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCkBAIC05OCwzMiArOTgsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb0dhaW46OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMjdiYzRjNi4uYTA5NmU4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsMjMgKzE3LDIxIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgogI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8cG9saWN5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQorICAgIDogbVByb2ZpbGUocHJvZmlsZSkKKyAgICAsICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKICAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKQEAgLTUxLDE5ICs0OSwxNCBAQAogICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRPcGVuUmVmQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7Ci19Ci0KIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aW5wdXRTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNvdXJjZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpLnNvdXJjZTsKIH0KIAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC04NCw3ICs3Nyw3IEBACiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBpbnB1dFNvdXJjZSgpOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IHNvdXJjZSgpOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKQEAgLTExOSw1NyArMTEyLDYyIEBACiAgICAgbVByZWVtcHRlZFNlc3Npb25zLmNsZWFyKCk7CiB9CiAKLWJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMuaGFzQWN0aXZlU2Vzc2lvbigpOwotfQotCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJgorICAgICAgICAgICAgKChjbGllbnQtPnNvdXJjZSgpID09IHNvdXJjZSkgfHwKKyAgICAgICAgICAgICAgICAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgICAgIChjbGllbnQtPnNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpIGNvbnN0CiB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCB9OworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOworICAgIHJldHVybiB0b3BDbGllbnQgPyB0b3BDbGllbnQtPmF0dHJpYnV0ZXMoKSA6IGF0dHJpYnV0ZXM7Cit9CiAKLSAgICByZXR1cm4gbVNlc3Npb25zLmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKK3NwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlDbGllbnQoKSBjb25zdAoreworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudDsKKworICAgIGZvciAoYm9vbCBhY3RpdmVPbmx5IDogeyB0cnVlLCBmYWxzZSB9KSB7CisgICAgICAgIGludDMyX3QgdG9wUHJpb3JpdHkgPSAtMTsKKyAgICAgICAgYXBwX3N0YXRlX3QgdG9wU3RhdGUgPSBBUFBfU1RBVEVfSURMRTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcF9zdGF0ZV90IGN1clN0YXRlID0gY2xpZW50LT5hcHBTdGF0ZSgpOworICAgICAgICAgICAgaWYgKGN1clN0YXRlID49IHRvcFN0YXRlKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJQcmlvcml0eSA9IHNvdXJjZV9wcmlvcml0eShjbGllbnQtPnNvdXJjZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyUHJpb3JpdHkgPj0gdG9wUHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9wQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgICAgICB0b3BQcmlvcml0eSA9IGN1clByaW9yaXR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3BTdGF0ZSA9IGN1clN0YXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0b3BDbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRvcENsaWVudDsKIH0KIAogYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7Ci0gICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbnMgYXJlIG5vdCBtaXhlZAotICAgIC8vIG9uIGEgZ2l2ZW4gaW5wdXQKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlQXQoMCktPmlzU291bmRUcmlnZ2VyKCk7Ci19Ci0KLXNwPEF1ZGlvU2Vzc2lvbj4gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGlmIChhY3RpdmVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0QWN0aXZlU2Vzc2lvbnMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zOworICAgIC8vIHNvdW5kIHRyaWdnZXIgYW5kIG5vbiBzb3VuZCB0cmlnZ2VyIGNsaWVudHMgYXJlIG5vdCBtaXhlZCBvbiBhIGdpdmVuIGlucHV0CisgICAgLy8gc28gY2hlY2sgb25seSBmaXJzdCBjbGllbnQKKyAgICBpZiAoZ2V0Q2xpZW50Q291bnQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci19Ci0KLXNpemVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGlmIChhY3RpdmVPbmx5KSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5zaXplKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbikgewotICAgIHJldHVybiBtU2Vzc2lvbnMuYWRkU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24sIC8qQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKi90aGlzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgewotICAgIHJldHVybiBtU2Vzc2lvbnMucmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTsKKyAgICByZXR1cm4gZ2V0Q2xpZW50SXRlcmFibGUoKS5iZWdpbigpLT5pc1NvdW5kVHJpZ2dlcigpOwogfQogCiBhdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0UGF0Y2hIYW5kbGUoKSBjb25zdApAQCAtMTgwLDcgKzE3OCwxMyBAQAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsKLSAgICBtU2Vzc2lvbnMub25TZXNzaW9uSW5mb1VwZGF0ZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pc0xvd0xldmVsKCkgPyBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDogUkVDT1JEX0NPTkZJR19FVkVOVF9VUERBVEUsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGF1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0CkBAIC0xOTEsOCArMTk1LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpCkBAIC0yMDksMjQgKzIxMiwyNiBAQAogCiAgICAgbURldmljZSA9IGRldmljZTsKIAotICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgJTA4eCBhZGRyZXNzICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gbURldmljZS0+dHlwZSgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3BlbklucHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UtPnR5cGUoKSAhPSBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZS0+dHlwZSgpLCBkZXZpY2VUeXBlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CkBAIC0yNDAsNyArMjQ1LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKIHsKLSAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CiAgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewogICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjYzLDQyICsyNjgsMjQ3IEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBpbnB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1Jb0hhbmRsZSk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKLSAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CisKICAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudC0tOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LAorICAgICAgICAgICAgICAgICIlcyglZCk6IG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgJWQgPCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgJWQuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSB7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6YWRkQ2xpZW50KGNsaWVudCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FbmFibGVkRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUVuYWJsZWRFZmZlY3RzLnZhbHVlQXQoaSktPm1TZXNzaW9uID09IGNsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICBjbGllbnQtPnRyYWNrRWZmZWN0RW5hYmxlZChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENsaWVudChjbGllbnQtPnBvcnRJZCgpKSA9PSBudWxscHRyLAorICAgICAgICAiJXMoJWQpIGRvZXMgbm90IGV4aXN0IG9uIGlucHV0IGRlc2NyaXB0b3IiLCBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSk7CisgICAgaWYgKGFjdGl2ZSA9PSBjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpIGludmFsaWQgZGVhY3RpdmF0aW9uIHdpdGggZ2xvYmFsQWN0aXZlQ291bnQgJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIC8vIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIGNvbnN0IGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICBtR2xvYmFsQWN0aXZlQ291bnQgKz0gZGVsdGE7CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAwKSkgeworICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIG1TZXNzaW9ucy5kdW1wKGZkLCAxKTsKKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGNoZWNrU3VzcGVuZEVmZmVjdHMoKTsKKworICAgIGludCBldmVudCA9IGFjdGl2ZSA/IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgOiBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1A7CisgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihldmVudCwgY2xpZW50KTsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICBpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCit7CisgICAgQUxPR1YoIiVzIHJpaWQgJWQgdWlkICVkIHBvcnQgJWQgc2Vzc2lvbiAlZCBldmVudCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5yaWlkKCksIGNsaWVudC0+dWlkKCksIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+c2Vzc2lvbigpLCBldmVudCk7CisgICAgLy8gZG8gbm90IHNlbmQgY2FsbGJhY2sgaWYgc3RhcnRpbmcgYW5kIG5vIGRldmljZSBpcyBzZWxlY3RlZCB5ZXQgdG8gYXZvaWQKKyAgICAvLyBkb3VibGUgY2FsbGJhY2tzIGZyb20gc3RhcnRJbnB1dCgpIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRldmljZSBpcyBzZWxlY3RlZAorICAgIC8vICJzdGFydCIgYW5kICJzdG9wIiBldmVudHMgZm9yICJoaWdoIGxldmVsIiBjbGllbnRzIChBdWRpb1JlY29yZCkgYXJlIHNlbnQgYnkgdGhlIGNsaWVudCBzaWRlCisgICAgaWYgKChldmVudCA9PSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUICYmIG1QYXRjaEhhbmRsZSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkKKyAgICAgICAgICAgIHx8ICghY2xpZW50LT5pc0xvd0xldmVsKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgfHwgZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3Qgc2Vzc2lvbkNvbmZpZyA9IGNsaWVudC0+Y29uZmlnKCk7CisgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgcmVjb3JkQ2xpZW50SW5mb3tjbGllbnQtPnJpaWQoKSwgY2xpZW50LT51aWQoKSwgY2xpZW50LT5zZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNvdXJjZSgpLCBjbGllbnQtPnBvcnRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pc1NpbGVuY2VkKCl9OworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHNMaXN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xpZW50RWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgZWZmZWN0c0xpc3QgPSBnZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJnJlY29yZENsaWVudEluZm8sICZzZXNzaW9uQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFZmZlY3RzLCAmY29uZmlnLCBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2hIYW5kbGUsIHNvdXJjZSgpKTsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRDbGllbnRzRm9yU2Vzc2lvbigKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+c2Vzc2lvbigpID09IHNlc3Npb24pIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSkgY29uc3QKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKCghYWN0aXZlT25seSB8fCBjbGllbnQtPmFjdGl2ZSgpKQorICAgICAgICAgICAgJiYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCB8fCBzb3VyY2UgPT0gY2xpZW50LT5zb3VyY2UoKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fCBjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZXBsYWNlVmFsdWVGb3IoZWZmZWN0LT5tSWQsIGVmZmVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlbW92ZUl0ZW0oZWZmZWN0LT5tSWQpOworICAgICAgICAvLyBhbHdheXMgZXhpdCBmcm9tIHN1c3BlbmQgd2hlbiBkaXNhYmxpbmcgYW4gZWZmZWN0IGFzIG9ubHkgZW5hYmxlZCBlZmZlY3RzCisgICAgICAgIC8vIGFyZSBtYW5hZ2VkIGJ5IGNoZWNrU3VzcGVuZEVmZmVjdHMoKQorICAgICAgICBpZiAoZWZmZWN0LT5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3QtPm1JZCwgZWZmZWN0LT5tU2Vzc2lvbiwgZWZmZWN0LT5tU3VzcGVuZGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZ2V0Q2xpZW50c0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdCllZmZlY3QtPm1TZXNzaW9uKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgdXBkYXRlZENsaWVudHM7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gY2xpZW50RWZmZWN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpLmdldEVmZmVjdChlZmZlY3QtPm1JZCk7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IChlbmFibGVkICYmIGNsaWVudEVmZmVjdCA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgIHx8ICghZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgIT0gbnVsbHB0cik7CisgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIGlmIChjaGFuZ2VkICYmIGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZWRDbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgY2hlY2tTdXNwZW5kRWZmZWN0cygpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiB1cGRhdGVkQ2xpZW50cykgeworICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfVVBEQVRFLCBjbGllbnQpOworICAgIH0KK30KKworRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3QKK3sKKyAgICAvLyByZXBvcnQgZWZmZWN0cyBmb3IgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgc291cmNlIGFzIGFwcGxpZWQgdG8gYWxsIGNsaWVudHMKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlbmFibGVkRWZmZWN0czsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiB0b3BDbGllbnQgPSBnZXRIaWdoZXN0UHJpb3JpdHlDbGllbnQoKTsKKyAgICBpZiAodG9wQ2xpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZW5hYmxlZEVmZmVjdHMgPSB0b3BDbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgfQorICAgIHJldHVybiBlbmFibGVkRWZmZWN0czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgdXBkYXRlZENsaWVudHM7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKHVpZCA9PSBjbGllbnQtPnVpZCgpKSB7CisgICAgICAgICAgICBib29sIHdhc1NpbGVuY2VkID0gY2xpZW50LT5pc1NpbGVuY2VkKCk7CisgICAgICAgICAgICBjbGllbnQtPnNldEFwcFN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmIHdhc1NpbGVuY2VkICE9IGNsaWVudC0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlZENsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja1N1c3BlbmRFZmZlY3RzKCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IHVwZGF0ZWRDbGllbnRzKSB7CisgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9VUERBVEUsIGNsaWVudCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjaGVja1N1c3BlbmRFZmZlY3RzKCkKK3sKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiB0b3BDbGllbnQgPSBnZXRIaWdoZXN0UHJpb3JpdHlDbGllbnQoKTsKKyAgICBpZiAodG9wQ2xpZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdCA9IG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZWZmZWN0LT5tU2Vzc2lvbiA9PSB0b3BDbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgaWYgKGVmZmVjdC0+bVN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3QtPm1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tU3VzcGVuZGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghZWZmZWN0LT5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdC0+bUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bVNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tU3VzcGVuZGVkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIGdldElkKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCAxIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvUmVjb3JkIENsaWVudHM6XG4iKTsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CiB9CiAKIGJvb2wgQXVkaW9JbnB1dENvbGxlY3Rpb246OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTMxNCw2NiArNTI0LDgzIEBACiAKIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKIHsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gTlVMTDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChpbnB1dERlc2MtPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzY3JpcHRvcjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gaW5wdXREZXNjOworICAgIHJldHVybiBOVUxMOwogfQogCi11aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoYXVkaW9fZGV2aWNlc190IGRldmljZXMpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAogewogICAgIHVpbnQzMl90IGNvdW50ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKICAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSAmJgotICAgICAgICAgICAgICAgICgoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCkgfHwKLSAgICAgICAgICAgICAgICAgKChpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UgJiBkZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApKSkgeworICAgICAgICAgICAgICAgIChkZXZpY2VzLmlzRW1wdHkoKSB8fCBkZXZpY2VzLmNvbnRhaW5zKGlucHV0RGVzY3JpcHRvci0+Z2V0RGV2aWNlKCkpKSkgewogICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gY291bnQ7CiB9CiAKLVZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCitWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoKQogewogICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fAotICAgICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlSW5wdXRzLmFkZChpbnB1dERlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBhY3RpdmVJbnB1dHM7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0CitzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gaW5wdXREZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKTsKLSAgICByZXR1cm4gZGV2aWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPm1Jb0hhbmRsZSA9PSBlZmZlY3QtPm1JbykgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIH0KICAgICB9Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoCisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggZDE1YmE0Yi4uOGE2MGNmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiVm9sdW1lLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogCkBAIC0zNSwxOSArMzYsOCBAQAogCiBBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Qb3J0KHBvcnQpLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApCisgICAgOiBtUG9ydChwb3J0KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7Ci0gICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBtUmVmQ291bnRbaV0gPSAwOwotICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKLSAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1TdG9wVGltZVtpXSA9IDA7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7Ci0gICAgfQogICAgIGlmIChtUG9ydC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1Qb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CiAgICAgICAgIGlmIChtUG9ydC0+bUdhaW5zLnNpemUoKSA+IDApIHsKQEAgLTU2LDQ4ICs0Niw4OCBAQAogICAgIH0KIH0KIAorYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0Cit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSB7IC5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGUsIC5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAuZm9ybWF0ID0gbUZvcm1hdCB9OworICAgIHJldHVybiBjb25maWc7Cit9CisKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Qb3J0LmdldCgpICE9IG51bGxwdHIgPyBtUG9ydC0+Z2V0TW9kdWxlSGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKK2F1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0UGF0Y2hIYW5kbGUoKSBjb25zdAoreworICAgIHJldHVybiBtUGF0Y2hIYW5kbGU7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOworfQorCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAogewogICAgIHJldHVybiBtSWQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1EZXZpY2U7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQotewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAogICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGhhc1NhbWVId01vZHVsZUFzKG91dHB1dERlc2MpOwotICAgIH0KKyAgICByZXR1cm4gaGFzU2FtZUh3TW9kdWxlQXMob3V0cHV0RGVzYyk7CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0U3RvcFRpbWUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBuc2Vjc190IHN5c1RpbWUpCiB7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKLSAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOwotICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgbVZvbHVtZUFjdGl2aXRpZXNbY2xpZW50LT52b2x1bWVTb3VyY2UoKV0uc2V0U3RvcFRpbWUoc3lzVGltZSk7CisgICAgbVJvdXRpbmdBY3Rpdml0aWVzW2NsaWVudC0+c3RyYXRlZ3koKV0uc2V0U3RvcFRpbWUoc3lzVGltZSk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKK3sKKyAgICBhdXRvIGNsaWVudEl0ZXIgPSBzdGQ6OmZpbmQoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLCBjbGllbnQpOworICAgIGlmIChhY3RpdmUgPT0gKGNsaWVudEl0ZXIgIT0gZW5kKG1BY3RpdmVDbGllbnRzKSkpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaWdub3JlZCBhY3RpdmU6ICVkLCBjdXJyZW50IHN0cmVhbSBjb3VudCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBhY3RpdmUsCisgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChjbGllbnQtPnN0cmF0ZWd5KCkpLmdldEFjdGl2aXR5Q291bnQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7Ci0gICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgbUFjdGl2ZUNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFjdGl2ZUNsaWVudHMuZXJhc2UoY2xpZW50SXRlcik7CisgICAgfQorICAgIGNvbnN0IGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAvLyBJZiBwcyBpcyB1bmtub3duLCBpdCBpcyB0aW1lIHRvIHRyYWNrIGl0IQorICAgIG1Sb3V0aW5nQWN0aXZpdGllc1tjbGllbnQtPnN0cmF0ZWd5KCldLmNoYW5nZUFjdGl2aXR5Q291bnQoZGVsdGEpOworICAgIG1Wb2x1bWVBY3Rpdml0aWVzW2NsaWVudC0+dm9sdW1lU291cmNlKCldLmNoYW5nZUFjdGl2aXR5Q291bnQoZGVsdGEpOworCisgICAgLy8gSGFuZGxlIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgaW50MzJfdCBvbGRHbG9iYWxBY3RpdmVDb3VudCA9IG1HbG9iYWxBY3RpdmVDb3VudDsKKyAgICBpZiAoIWFjdGl2ZSAmJiBtR2xvYmFsQWN0aXZlQ291bnQgPCAxKSB7CisgICAgICAgIEFMT0dXKCIlcyglcyk6IGludmFsaWQgZGVhY3RpdmF0aW9uIHdpdGggZ2xvYmFsUmVmQ291bnQgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgbUdsb2JhbEFjdGl2ZUNvdW50ICs9IGRlbHRhOworCisgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgfHwgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAwKSkgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICBtR2xvYmFsQWN0aXZlQ291bnQgPiAwID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZzLCB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIHJldHVybiAodnMgPT0gVk9MVU1FX1NPVVJDRV9OT05FKSA/CisgICAgICAgICAgICAgICAgaXNBY3RpdmUoaW5QYXN0TXMpIDogKG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpIDogZmFsc2UpOwogfQogCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CkBAIC0xMDYsNTQgKzEzNiwzMiBAQAogICAgIGlmIChpblBhc3RNcyAhPSAwKSB7CiAgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPT0gQVVESU9fU1RSRUFNX1BBVENIKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzQWN0aXZlKGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoaW5QYXN0TXMgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzeXNUaW1lID09IDApIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQsCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICYvKnN0cmVhbXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qZGV2aWNlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7CiAgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CiAgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKICAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAotICAgIGlmICh2b2x1bWUgIT0gbUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRWb2x1bWUoKSBmb3Igc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOwotICAgICAgICBtQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CisgICAgaWYgKHZvbHVtZURiICE9IGdldEN1clZvbHVtZSh2b2x1bWVTb3VyY2UpIHx8IGZvcmNlKSB7CisgICAgICAgIEFMT0dWKCIlcyBmb3Igdm9sdW1lU3JjICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIsIGRlbGF5TXMpOworICAgICAgICBzZXRDdXJWb2x1bWUodm9sdW1lU291cmNlLCB2b2x1bWVEYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODUsMzIgKzE5Myw1NSBAQAogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCitUcmFja0NsaWVudFZlY3RvciBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fAorICAgICAgICAgICAgICAgIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmICFjbGllbnQtPmlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnZvbHVtZVNvdXJjZVRvSWdub3JlXShjb25zdCBhdXRvICZjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjQsNDMgKzI1NSwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1PdXRwdXQxLT5kZXZpY2VzKCk7CisgICAgICAgIGRldmljZXMubWVyZ2UobU91dHB1dDItPmRldmljZXMoKSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICByZXR1cm4gbURldmljZXM7CiB9CiAKIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwpAQCAtMjcyLDEyICsyOTQsMzkgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIHN1cHBvcnRlZERldmljZXMubWVyZ2UobU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzLmZpbHRlcihkZXZpY2VzKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dDItPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOworICAgICAgIHJldHVybiBtUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpOwogICAgIH0KIH0KIApAQCAtMjkwLDQyICszMzksMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOworICAgICAgICBtT3V0cHV0Mi0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKICAgICB9Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLQotICAgIC8vIGhhbmRsZSBzdHJlYW0taW5kZXBlbmRlbnQgcmVmIGNvdW50Ci0gICAgdWludDMyX3Qgb2xkR2xvYmFsUmVmQ291bnQgPSBtR2xvYmFsUmVmQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUdsb2JhbFJlZkNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBnbG9iYWxSZWZDb3VudCAlZCIsIGRlbHRhLCBtR2xvYmFsUmVmQ291bnQpOwotICAgICAgICBtR2xvYmFsUmVmQ291bnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCArPSBkZWx0YTsKLSAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG1Qb2xpY3lNaXgucHJvbW90ZSgpOwotICAgIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA+IDApKSB7Ci0gICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7Ci0gICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOwogfQogCi0KIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKICAgICAvLyB1bml0IGdhaW4gaWYgcmVyb3V0aW5nIHRvIGV4dGVybmFsIHBvbGljeQpAQCAtMzY2LDM0ICszODksNzIgQEAKICAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2cywgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKLSAgICAgICAgLy8gZW5hYmxlZAotICAgICAgICBmbG9hdCB2b2x1bWUgPSBWb2x1bWU6OkRiVG9BbXBsKG1DdXJWb2x1bWVbc3RyZWFtXSk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKLSAgICAgICAgfQotICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zID0gc3RyZWFtVHlwZXM7CisgICAgaWYgKCFBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWVEYiwgdnMsIHN0cmVhbVR5cGVzLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBjaGFuZ2VkOworICAgIGlmIChzdHJlYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VQb3J0IDogZGV2aWNlcygpKSB7CisgICAgICAgIC8vIEFQTSBsb29wcyBvbiBhbGwgZ3JvdXAsIHNvIGZpbHRlciBvbiBhY3RpdmUgZ3JvdXAgdG8gc2V0IHRoZSBwb3J0IGdhaW4sCisgICAgICAgIC8vIGxldCB0aGUgb3RoZXIgZ3JvdXBzIHNldCB0aGUgc3RyZWFtIHZvbHVtZSBhcyBwZXIgbGVnYWN5CisgICAgICAgIC8vIFRPRE86IFBhc3MgaW4gdGhlIGRldmljZSBhZGRyZXNzIGFuZCBjaGVjayBhZ2FpbnN0IGl0LgorICAgICAgICBpZiAoZGV2aWNlID09IGRldmljZVBvcnQtPnR5cGUoKSAmJgorICAgICAgICAgICAgICAgIGRldmljZVBvcnQtPmhhc0dhaW5Db250cm9sbGVyKHRydWUpICYmIGlzQWN0aXZlKHZzKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZXZpY2UgJXMgaGFzIGdhaW4gY29udHJvbGxlciIsIF9fZnVuY19fLCBkZXZpY2VQb3J0LT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gQHRvZG86IGhlcmUgd2UgbWlnaHQgYmUgaW4gdHJvdWJsZSBpZiB0aGUgU3dPdXRwdXQgaGFzIHNldmVyYWwgYWN0aXZlIGNsaWVudHMgd2l0aAorICAgICAgICAgICAgLy8gZGlmZmVyZW50IFZvbHVtZSBTb3VyY2UgKG9yIGlmIHdlIGFsbG93IHNldmVyYWwgY3VydmVzIHdpdGhpbiBzYW1lIHZvbHVtZSBncm91cCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBAdG9kbzogZGVmYXVsdCBzdHJlYW0gdm9sdW1lIHRvIG1heCAoMCkgd2hlbiB1c2luZyBIVyBQb3J0IGdhaW4/CisgICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbCgwKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEF1ZGlvR2FpbnMgZ2FpbnMgPSBkZXZpY2VQb3J0LT5nZXRHYWlucygpOworICAgICAgICAgICAgaW50IGdhaW5NaW5WYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWluVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2Fpbk1heFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNYXhWYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluU3RlcFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRTdGVwVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2FpblZhbHVlTWIgPSAoKHZvbHVtZURiICogMTAwKS8gZ2FpblN0ZXBWYWx1ZUluTWIpICogZ2FpblN0ZXBWYWx1ZUluTWI7CisgICAgICAgICAgICBnYWluVmFsdWVNYiA9IHN0ZDo6bWF4KGdhaW5NaW5WYWx1ZUluTWIsIHN0ZDo6bWluKGdhaW5WYWx1ZU1iLCBnYWluTWF4VmFsdWVJbk1iKSk7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHt9OworICAgICAgICAgICAgZGV2aWNlUG9ydC0+dG9BdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICBjb25maWcuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgICAgICAgICAgY29uZmlnLmdhaW4udmFsdWVzWzBdID0gZ2FpblZhbHVlTWI7CisgICAgICAgICAgICByZXR1cm4gbUNsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcsIDApID09IE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzIGVuYWJsZWQKKyAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbChnZXRDdXJWb2x1bWUodnMpKTsKKyAgICBpZiAoaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSkgeworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICBBTE9HVigiJXMgb3V0cHV0ICVkIGZvciB2b2x1bWVTb3VyY2UgJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQgc3RyZWFtPSVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIG1Jb0hhbmRsZSwgdnMsIHZvbHVtZURiLCBkZWxheU1zLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpCiB7CisgICAgbURldmljZXMgPSBkZXZpY2VzOworICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBkZXZpY2VzLmdldEZpcnN0VmFsaWRBZGRyZXNzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldmljZXMudHlwZXMoKTsKKwogICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWc7CiAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CiAgICAgICAgIGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CkBAIC00MDQsNyArNDY1LDYgQEAKICAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CiAgICAgfQogCi0gICAgbURldmljZSA9IGRldmljZTsKICAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAogICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCiAgICAgaWYgKChtUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmCkBAIC00MjIsMTkgKzQ4MiwxOSBAQAogCiAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CiAKLSAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1DbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZXMudHlwZXMoKSAhPSBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3Blbk91dHB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZXMudHlwZXMoKSwgZGV2aWNlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FLApAQCAtNDkzLDYgKzU1MywxNyBAQAogdm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2xvc2UoKQogewogICAgIGlmIChtSW9IYW5kbGUgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgLy8gY2xlYW4gdXAgYWN0aXZlIGNsaWVudHMgaWYgYW55IChjYW4gaGFwcGVuIGlmIGNsb3NlKCkgaXMgY2FsbGVkIHRvIGZvcmNlCisgICAgICAgIC8vIGNsaWVudHMgdG8gcmVjb25uZWN0CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY2xpZW50IHdpdGggcG9ydCBJRCAlZCBzdGlsbCBhY3RpdmUgb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUlkKTsKKyAgICAgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobUlvSGFuZGxlLCBwYXJhbS50b1N0cmluZygpKTsKQEAgLTUwMSwxMSArNTcyLDYgQEAKIAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQotICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdHJlYW1zIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCi0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKLSAgICAgICAgfQogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KQEAgLTUzNiw1NSArNjAyLDQyIEBACiB9CiAKIC8vIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi1Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlLAorSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPm1EZXZpY2UsIGNsaWVudEludGVyZmFjZSksCisgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5zcmNEZXZpY2UoKSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICAgIG1Tb3VyY2Uoc291cmNlKQogewogfQogCi1zdGF0dXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTb3VyY2U6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVNvdXJjZS0+ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCi17Ci0gICAgcmV0dXJuIG1EZXZpY2U7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlNvdXJjZTpcbiIpOworICAgIG1Tb3VyY2UtPmR1bXAoZHN0LCAwLCAwKTsKIH0KIAogdm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydChwb3J0KTsKIH0KIAogCi1ib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOworICAgIGJvb2wgY2hhbmdlZCA9CisgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIHN0cmVhbXMsIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwogCiAgICAgaWYgKGNoYW5nZWQpIHsKICAgICAgIC8vIFRPRE86IHVzZSBnYWluIGNvbnRyb2xsZXIgb24gc291cmNlIGRldmljZSBpZiBhbnkgdG8gYWRqdXN0IHZvbHVtZQpAQCAtNTkzLDM5ICs2NDYsMzggQEAKIH0KIAogLy8gU3dBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmVMb2NhbGx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpCi0gICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKQorICAgICAgICAgICAgICAgICYmICgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSA9PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQogICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKQEAgLTYzNiwxMSArNjg4LDI4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG90aGVyRGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5zaGFyZXNId01vZHVsZVdpdGgob3RoZXJEZXNjKSAmJgorICAgICAgICAgICAgICAgIG90aGVyRGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcywgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAgJiYKKyAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MiwxMiArNzIxLDExIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7Ci0gICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPmdldE1vZHVsZSgpICE9IE5VTEwpKSB7CisgICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRQcm9maWxlIDogcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02ODMsOTkgKzc1MSw2OCBAQAogCiBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldE91dHB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CiAgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRJZCgpID09IGlkKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBvdXRwdXREZXNjOworICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi0KLXN0YXR1c190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlLCBpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi4zYTRkYjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI3IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgJmNmZyA9IGNmZ3NbaV07CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgIFslcyAlZF0gIiwgc3BhY2VzLCAiIiwgcHJlZml4LCBpICsgMSk7CisgICAgICAgIGlmIChjZmcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIElEICVkICVzIiwgY2ZnLmlkLCB0b1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlKS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJNaXggSUQgJWQgSS9PIGhhbmRsZSAlZCIsIGNmZy5pZCwgY2ZnLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNpbmtzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zaW5rcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KK30KIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9QYXRjaDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUGF0Y2ggJWQ6IG93bmVyIHVpZCAlNGQsIGhhbmRsZSAlMmQsIGFmIGhhbmRsZSAlMmRcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLCBpbmRleCArIDEsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzcmMgIiwgbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7CisgICAgZHVtcFBhdGNoRW5kcG9pbnRzKGRzdCwgc3BhY2VzLCAic2luayIsIG1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKQEAgLTE2MSwxNiArMTM1LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKaW5kZXggMzI3ZGM0ZC4uYzQyOTIzYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApAQCAtMjcsOTUgKzI3LDY3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQXVkaW9Qb2xpY3lNaXg6OkF1ZGlvUG9saWN5TWl4KGNvbnN0IEF1ZGlvTWl4ICZtaXgpIDogQXVkaW9NaXgobWl4KQordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1peDo6c2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KQotewotICAgIG1PdXRwdXQgPSBvdXRwdXQ7Ci19Ci0KLWNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmQXVkaW9Qb2xpY3lNaXg6OmdldE91dHB1dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1PdXRwdXQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNaXg6OmNsZWFyT3V0cHV0KCkKLXsKLSAgICBtT3V0cHV0LmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQXVkaW8gUG9saWN5IE1peCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgc3RkOjpzdHJpbmcgbWl4VHlwZUxpdGVyYWw7CiAgICAgaWYgKCFNaXhUeXBlQ29udmVydGVyOjp0b1N0cmluZyhtTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7CiAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXhUeXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1peCB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbWl4VHlwZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyByb3V0ZUZsYWdMaXRlcmFsOwogICAgIFJvdXRlRmxhZ1R5cGVDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhtUm91dGVGbGFncywgcm91dGVGbGFnTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgaW50IGluZGV4Q3JpdGVyaW9uID0gMDsKICAgICBmb3IgKGNvbnN0IGF1dG8gJmNyaXRlcmlvbiA6IG1Dcml0ZXJpYSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIENyaXRlcmlvbiAlZDpcbiIsIHNwYWNlcyArIDIsICIiLCBpbmRleENyaXRlcmlvbisrKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZUxpdGVyYWw7Ci0gICAgICAgIGlmICghVXNhZ2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSwgdXNhZ2VMaXRlcmFsKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCB1c2FnZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQ3JpdGVyaW9uICVkOiAiLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgcnVsZVR5cGUsIHJ1bGVWYWx1ZTsKKyAgICAgICAgYm9vbCB1bmtub3duUnVsZSA9ICFSdWxlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1SdWxlLCBydWxlVHlwZSk7CisgICAgICAgIHN3aXRjaCAoY3JpdGVyaW9uLm1SdWxlICYgflJVTEVfRVhDTFVTSU9OX01BU0spIHsgLy8gbm8gbmVlZCB0byBtYXRjaCBSVUxFX0VYQ0xVREVfLi4uCisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICBVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCBydWxlVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgICAgICAgICBTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UsIHJ1bGVWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICAgICAgICAgIHJ1bGVWYWx1ZSA9IHN0ZDo6dG9fc3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHVua25vd25SdWxlID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFVzYWdlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgdXNhZ2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGlmIChtTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxpdGVyYWw7Ci0gICAgICAgICAgICBpZiAoIVNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgc291cmNlTGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgIGlmICghdW5rbm93blJ1bGUpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyAlc1xuIiwgcnVsZVR5cGUuY19zdHIoKSwgcnVsZVZhbHVlLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlVua25vd24gcnVsZSB0eXBlIHZhbHVlIDB4JXhcbiIsIGNyaXRlcmlvbi5tUnVsZSk7CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJ1bGVMaXRlcmFsOwotICAgICAgICBpZiAoIVJ1bGVUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVJ1bGUsIHJ1bGVMaXRlcmFsKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sY3JpdGVyaW9uLm1SdWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KEF1ZGlvTWl4IG1peCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpCiB7Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+JiByZWdpc3RlcmVkTWl4ID0gaXRlbUF0KGkpOworICAgICAgICBpZiAobWl4Lm1EZXZpY2VUeXBlID09IHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgJiYgbWl4Lm1EZXZpY2VBZGRyZXNzLmNvbXBhcmUocmVnaXN0ZXJlZE1peC0+bURldmljZUFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWdpc3Rlck1peCgpOiBtaXggYWxyZWFkeSByZWdpc3RlcmVkIGZvciBkZXY9MHgleCBhZGRyPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgIH0KICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KG1peCk7Ci0gICAgYWRkKGFkZHJlc3MsIHBvbGljeU1peCk7CisgICAgYWRkKHBvbGljeU1peCk7CisgICAgQUxPR0QoInJlZ2lzdGVyTWl4KCk6IGFkZGluZyBtaXggZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlVHlwZSwgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpZiAoZGVzYyAhPSAwKSB7CiAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CkBAIC0xMjQsMTcxICs5NiwyNjkgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6dW5yZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyTWl4KGNvbnN0IEF1ZGlvTWl4JiBtaXgpCiB7Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgidW5yZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBub3QgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+JiByZWdpc3RlcmVkTWl4ID0gaXRlbUF0KGkpOworICAgICAgICBpZiAobWl4Lm1EZXZpY2VUeXBlID09IHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgJiYgbWl4Lm1EZXZpY2VBZGRyZXNzLmNvbXBhcmUocmVnaXN0ZXJlZE1peC0+bURldmljZUFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bnJlZ2lzdGVyTWl4KCk6IHJlbW92aW5nIG1peCBmb3IgZGV2PTB4JXggYWRkcj0lcyIsCisgICAgICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgbWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJlbW92ZUF0KGkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgfQogCi0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIEFMT0dFKCJ1bnJlZ2lzdGVyTWl4KCk6IG1peCBub3QgcmVnaXN0ZXJlZCBmb3IgZGV2PTB4JXggYWRkcj0lcyIsCisgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIG1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRBdWRpb1BvbGljeU1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3QKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0QXVkaW9Qb2xpY3lNaXgoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4KSBjb25zdAogewotICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIEFMT0dWKCJnZXRBdWRpb1BvbGljeU1peCgpIGZvciBkZXY9MHgleCBhZGRyPSVzIiwgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy8gV29ya2Fyb3VuZDogd2hlbiBhbiBpbiBhdWRpbyBwb2xpY3kgaXMgcmVnaXN0ZXJlZCwgaXQgb3BlbnMgYW4gb3V0cHV0CisgICAgICAgIC8vIHRoYXQgdHJpZXMgdG8gZmluZCB0aGUgYXVkaW8gcG9saWN5LCB0aHVzIHRoZSBkZXZpY2UgbXVzdCBiZSBpZ25vcmVkLgorICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlQWRkcmVzcy5jb21wYXJlKGFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIHBvbGljeU1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRBdWRpb1BvbGljeU1peDogZm91bmQgbWl4ICV6dSBtYXRjaCAoZGV2VHlwZT0weCV4IGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICB9Ci0gICAgcG9saWN5TWl4ID0gdmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgQUxPR0UoImdldEF1ZGlvUG9saWN5TWl4KCk6IG1peCBub3QgcmVnaXN0ZXJlZCBmb3IgZGV2PTB4JXggYWRkcj0lcyIsCisgICAgICAgICAgICBkZXZpY2VUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Y2xvc2VPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpdGVtQXQoaSk7CiAgICAgICAgIGlmIChwb2xpY3lNaXgtPmdldE91dHB1dCgpID09IGRlc2MpIHsKICAgICAgICAgICAgIHBvbGljeU1peC0+Y2xlYXJPdXRwdXQoKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmcHJpbWFyeURlc2MsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKQogewogICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcXVlcnlpbmcgJXp1IG1peGVzOiIsIHNpemUoKSk7Ci0gICAgZGVzYyA9IDA7CisgICAgcHJpbWFyeURlc2MgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IG1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpdGVtQXQoaSk7CisgICAgICAgIGNvbnN0IGJvb2wgcHJpbWFyeU91dHB1dE1peCA9ICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MpOworICAgICAgICBpZiAoIXByaW1hcnlPdXRwdXRNaXggJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkpIHsKKyAgICAgICAgICAgIC8vIEFBdWRpbyBkb2VzIG5vdCBzdXBwb3J0IE1NQVBfTk9fSVJRIGxvb3BiYWNrIHJlbmRlciwgYW5kIHRoZXJlIGlzIG5vIHdheSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBNbWFwU3RyZWFtSW50ZXJmYWNlOjpzdGFydCB0byByZWplY3QgYSBzcGVjaWZpYyBjbGllbnQgYWRkZWQgdG8gYSBzaGFyZWQKKyAgICAgICAgICAgIC8vIG1tYXAgc3RyZWFtLgorICAgICAgICAgICAgLy8gQXMgYSByZXN1bHQgYWxsIE1NQVBfTk9JUlEgcmVxdWVzdHMgaGF2ZSB0byBiZSByZWplY3RlZCB3aGVuIGFuIGxvb3BiYWNrIHJlbmRlcgorICAgICAgICAgICAgLy8gcG9saWN5IGlzIHByZXNlbnQuIFRoYXQgZW5zdXJlcyBubyBzaGFyZWQgbW1hcCBzdHJlYW0gaXMgdXNlZCB3aGVuIGFuIGxvb3BiYWNrCisgICAgICAgICAgICAvLyByZW5kZXIgcG9saWN5IGlzIHJlZ2lzdGVyZWQuCisgICAgICAgICAgICBBTE9HRCgiJXM6IFJlamVjdGluZyBNTUFQX05PSVJRIHJlcXVlc3QgZHVlIHRvIExPT1BCQUNLfFJFTkRFUiBtaXggcHJlc2VudC4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KIAotICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKLSAgICAgICAgICAgIC8vICAgICAgYXMgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgdHJlYXRtZW50IG9mIHVzYWdlLSBvciB1aWQtYmFzZWQgcnVsZXMKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgaWYgKCFwb2xpY3lEZXNjKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBNaXggaGFzIG5vIG91dHB1dCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBoYXNVaWRFeGNsdWRlUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworICAgICAgICBpZiAocHJpbWFyeU91dHB1dE1peCAmJiBwcmltYXJ5RGVzYyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBQcmltYXJ5IG91dHB1dCBhbHJlYWR5IGZvdW5kIiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgY29udGludWU7IC8vIFByaW1hcnkgb3V0cHV0IGFscmVhZHkgZm91bmQKKyAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGhhc0FkZHJNYXRjaCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1peE1hdGNoKHBvbGljeU1peC5nZXQoKSwgaSwgYXR0cmlidXRlcywgdWlkKSkgeworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg6CisgICAgICAgICAgICAgICAgLy8gVGhlIG1peCBoYXMgY29udHJhZGljdG9yeSBydWxlcywgaWdub3JlIGl0CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVqZWN0IGludmFsaWQgbWl4IGF0IHJlZ2lzdHJhdGlvbgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g6CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBkb2VzIG5vdCBtYXRjaCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGUgbWl4CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpNQVRDSDo7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgVUlEIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgVUlEcwotICAgICAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpZEV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSBjaGVja3M6IGZvciBlYWNoICJkaW1lbnNpb24iIG9mIHJ1bGVzICh1c2FnZSwgdWlkLi4uKSwgd2UgY2FuCi0gICAgICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgotICAgICAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNVaWRNYXRjaFJ1bGVzICYmIGhhc1VpZEV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpdGVyYXRpbmcgb24gY3JpdGVyaWEgYmVjYXVzZSBhbiBleGNsdXNpb24gd2FzIGZvdW5kICh3aWxsIGZhaWwpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgZXhpdGluZyBvbiBzdWNjZXNzIChvciBpbXBsaWNpdCBmYWlsdXJlIGFzIGRlc2MgaXMgMCkKLSAgICAgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKLSAgICAgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmICF1c2FnZU1hdGNoRm91bmQpICB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGdldE91dHB1dEZvckF0dHIgd2lsbCB1c2UgbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgIGRlc2MgPSBtaXgtPmdldE91dHB1dCgpOworICAgICAgICBwb2xpY3lEZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OworICAgICAgICBpZiAocHJpbWFyeU91dHB1dE1peCkgeworICAgICAgICAgICAgcHJpbWFyeURlc2MgPSBwb2xpY3lEZXNjOworICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBzZXQgcHJpbWFyeSBkZXNjIiwgX19mdW5jX18sIGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBvbGljeURlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWl4ICV6dSBpZ25vcmVkIGFzIHNlY29uZGFyeU91dHB1dCBiZWNhdXNlIG5vdCBvcGVuZWQgeWV0IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEFkZCBhIHNlY29uZGFyeSBkZXNjICV6dSIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy0+cHVzaF9iYWNrKHBvbGljeURlc2MpOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgICAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCitBdWRpb1BvbGljeU1peENvbGxlY3Rpb246Ok1peE1hdGNoU3RhdHVzIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6bWl4TWF0Y2goCisgICAgICAgIGNvbnN0IEF1ZGlvTWl4KiBtaXgsIHNpemVfdCBtaXhJbmRleCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQpIHsKKworICAgIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgLy8gTG9vcGJhY2sgcmVuZGVyIG1peGVzIGFyZSBjcmVhdGVkIGZyb20gYSBwdWJsaWMgQVBJIGFuZCB0aHVzIHJlc3RyaWN0ZWQKKyAgICAgICAgLy8gdG8gbm9uIHNlbnNpYmxlIGF1ZGlvIHRoYXQgaGF2ZSBub3Qgb3B0ZWQgb3V0LgorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgYXV0byBoYXNGbGFnID0gW10oYXV0byBmbGFncywgYXV0byBmbGFnKSB7IHJldHVybiAoZmxhZ3MgJiBmbGFnKSA9PSBmbGFnOyB9OworICAgICAgICAgICAgaWYgKGhhc0ZsYWcoYXR0cmlidXRlcy5mbGFncywgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtaXgtPm1BbGxvd1ByaXZpbGVnZWRQbGF5YmFja0NhcHR1cmUgJiYKKyAgICAgICAgICAgICAgICBoYXNGbGFnKGF0dHJpYnV0ZXMuZmxhZ3MsIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9VTktOT1dOIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX01FRElBIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX0dBTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKKyAgICAgICAgLy8gICAgICBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSB0cmVhdG1lbnQgb2YgdXNhZ2UtIG9yIHVpZC1iYXNlZCBydWxlcworICAgICAgICBib29sIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VNYXRjaEZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIHVpZE1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzQWRkck1hdGNoID0gZmFsc2U7CisKKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCIgZ2V0T3V0cHV0Rm9yQXR0cjogbWl4ICV6dTogaW5zcGVjdGluZyBtaXggY3JpdGVyaWEgJXp1IG9mICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1peEluZGV4LCBqLCBtaXgtPm1Dcml0ZXJpYS5zaXplKCkpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBtaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgIGhhc0FkZHJNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgdXNhZ2VzCisgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7CisgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyB1c2FnZSBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRNYXRjaFJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCisgICAgICAgICAgICAgICAgICAgIHVpZE1hdGNoRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX1VJRDoKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KKyAgICAgICAgICAgIC8vIG9ubHkgaGF2ZSBNQVRDSCBydWxlcywgb3IgRVhDTFVERSBydWxlcyBpbiBlYWNoIGRpbWVuc2lvbiwgbm90IGEgY29tYmluYXRpb24KKyAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9VSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKQorICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKKyAgICAgICAgICAgIH0KKworICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQorCisgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQorICAgICAgICBpZiAoaGFzQWRkck1hdGNoIHx8CisgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgeworICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpNQVRDSDsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gbWl4OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgfSBlbHNlIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxEZXZpY2VzLAotICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldE91dHB1dCgpID09IG91dHB1dCkgeworICAgICAgICAgICAgLy8gVGhpcyBEZXNjIGlzIGludm9sdmVkIGluIGEgTWl4LCB3aGljaCBoYXMgdGhlIGhpZ2hlc3QgcHJpbworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaXRlbUF0KGkpLT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICgweCV4LCBhZGRyPSVzKSBmb3JjZWQgYnkgbWl4IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVHlwZSwgYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsRGV2aWNlcywKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBdWRpb1BvbGljeU1peCAqbWl4ID0gaXRlbUF0KGkpLmdldCgpOwogICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0yOTcsMTcgKzM2NywyMiBAQAogICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVNvdXJjZSA9PSBpbnB1dFNvdXJjZSkgfHwKICAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCiAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlICE9IGlucHV0U291cmNlKSkgewotICAgICAgICAgICAgICAgIGlmIChhdmFpbERldmljZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBQb2xpY3lNaXggb25seSBmb3IgcmVtb3RlIHN1Ym1peCBmb3IgaW5wdXQKKyAgICAgICAgICAgICAgICAvLyBzbyBtaXgtPm1EZXZpY2VUeXBlIGNhbiBvbmx5IGJlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICBhdXRvIG1peERldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgbWl4LT5tRGV2aWNlQWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIGlmIChtaXhEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSBtaXg7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWl4RGV2aWNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0SW5wdXRNaXhGb3JBdHRyKApAQCAtMzE5LDE5ICszOTQsMjggQEAKICAgICBTdHJpbmc4IGFkZHJlc3MoYXR0ci50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKIAogI2lmZGVmIExPR19OREVCVUcKLSAgICBBTE9HVigiZ2V0SW5wdXRNaXhGb3JBdHRyIGxvb2tpbmcgZm9yIGFkZHJlc3MgJXNcbiAgbWl4ZXMgYXZhaWxhYmxlOiIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIEFMT0dWKCJnZXRJbnB1dE1peEZvckF0dHIgbG9va2luZyBmb3IgYWRkcmVzcyAlcyBmb3Igc291cmNlICVkXG4gIG1peGVzIGF2YWlsYWJsZToiLAorICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgYXR0ci5zb3VyY2UpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBtaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiBhdWRpb1BvbGljeU1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgYXVkaW9Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKICAgICB9CiAjZW5kaWYKIAotICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOwotICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiYgcmVnaXN0ZXJlZE1peCA9IGl0ZW1BdChpbmRleCk7CisgICAgICAgIGlmIChyZWdpc3RlcmVkTWl4LT5tRGV2aWNlQWRkcmVzcy5jb21wYXJlKGFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJnZXRJbnB1dE1peEZvckF0dHIgZm91bmQgYWRkcj0lcyBkZXY9MHgleCIsCisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLCByZWdpc3RlcmVkTWl4LT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gc2l6ZSgpKSB7CiAgICAgICAgIEFMT0dXKCJnZXRJbnB1dE1peEZvckF0dHIoKSBubyBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gdmFsdWVBdChpbmRleCk7CisgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gaXRlbUF0KGluZGV4KTsKIAogICAgIGlmIChhdWRpb1BvbGljeU1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgewogICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwpAQCAtMzQzLDE0ICs0MjcsMTE0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIHN0ZDo6c3RyaW5nIGxvZygiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7Ci0gICAgd3JpdGUoZmQsIGxvZy5jX3N0cigpLCBsb2cuc2l6ZSgpKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCisgICAgLy8gICAgIm1hdGNoIHVpZCIgcnVsZSBmb3IgdGhpcyB1aWQsIHJldHVybiBhbiBlcnJvcgorICAgIC8vICAgIChhZGRpbmcgYSB1aWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+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+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZmM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBBdWRpb1BvbGljeU1hbmFnZXIuY3BwCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisgICAgbGliYXVkaW9wb2xpY3kgXAorICAgIGxpYnNvdW5kdHJpZ2dlcgorCitpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworaWZuZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiskKGVycm9yIENvbmZpZ3VyYWJsZSBwb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY29uZiBmaWxlKQorZW5kaWYgI2lmbmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCisKK2Vsc2UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKKworZW5kaWYgIyBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFtZXRyaWNzCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYmluZGVyIGxpYmhpZGxiYXNlIGxpYnhtbDIKKworaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKK2VuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQorCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IDI3MzZmZDQuLjFkNGRhY2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMTUsNyArMTUsMTIgQEAKICAqLwogCiAjZGVmaW5lIExPR19UQUcgIkFQTV9BdWRpb1BvbGljeU1hbmFnZXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vIE5lZWQgdG8ga2VlcCB0aGUgbG9nIHN0YXRlbWVudHMgZXZlbiBpbiBwcm9kdWN0aW9uIGJ1aWxkcworLy8gdG8gZW5hYmxlIFZFUkJPU0UgbG9nZ2luZyBkeW5hbWljYWxseS4KKy8vIFlvdSBjYW4gZW5hYmxlIFZFUkJPU0UgbG9nZ2luZyBhcyBmb2xsb3dzOgorLy8gYWRiIHNoZWxsIHNldHByb3AgbG9nLnRhZy5BUE1fQXVkaW9Qb2xpY3lNYW5hZ2VyIFYKKyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKIC8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwogI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCkBAIC0yOCwyNCArMzMsMjUgQEAKICNkZWZpbmUgQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiCiAjZGVmaW5lIEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUgXAogICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FIFwKKyAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KLQorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+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+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC0xODE2LDQzMCArMjIxMiwyMzIgQEAKICAgICByZXR1cm4gaW5wdXQ7CiB9CiAKLS8vc3RhdGljCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICByZXR1cm4gKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB8fAotICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpOwotfQorICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+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+IGlucHV0c1RvQ2xvc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dCA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0LT5jbGllbnRzTGlzdCgpLnNpemUoKSA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGlucHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpCisgICAgICAgICAgICAgICAgfHwgKGlucHV0LT5nZXRBdWRpb1BvcnQoKS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgeworICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5wdXNoX2JhY2sobUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIGNsb3NlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0LT5jbGllbnRzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNsaWVudC0+YXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlucHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbG9zZSkgeworICAgICAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UucHVzaF9iYWNrKG1JbnB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dC0+bUlvSGFuZGxlLCBnZXROZXdJbnB1dERldmljZShpbnB1dCkpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICB9Ci0gICAgbUlucHV0Um91dGVzLmNsZWFyKCk7Ci0gICAgbUlucHV0cy5jbGVhcigpOwotICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCi0gICAgaWYgKHBhdGNoUmVtb3ZlZCkgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIGZvciAoY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlIDogaW5wdXRzVG9DbG9zZSkgeworICAgICAgICBBTE9HVigiJXMgY2xvc2luZyBpbnB1dCAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOworICAgICAgICBjbG9zZUlucHV0KGhhbmRsZSk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCiB7CiAgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWF4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgZm9yIHN0cmVhbSAlZDogaW52YWxpZCBtaW4gJWQgb3IgbWF4ICVkIiwgX19mdW5jX18sIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBvdGhlciBwcml2YXRlIHN0cmVhbSB2b2x1bWVzIHdoaWNoIGZvbGxvdyB0aGlzIG9uZQogICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogICAgIH0KIH0KIApAQCAtMjI0NywxMiArMjQ0NSwxNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogeworICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgQUxPR1YoIiVzOiBzdHJlYW0gJXMgYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLAorICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSwgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgcmV0dXJuIHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBzZWxlY3RlZCBmb3IgdGhpcworICAgIC8vIHN0cmVhbSBieSB0aGUgZW5naW5lLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFZvbHVtZUluZGV4KGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLCAqaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgLy8gR2V0IFZvbHVtZSBncm91cCBtYXRjaGluZyB0aGUgQXVkaW8gQXR0cmlidXRlcworICAgIGF1dG8gZ3JvdXAgPSBtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgaWYgKGdyb3VwID09IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgIEFMT0dEKCIlczogbm8gZ3JvdXAgbWF0Y2hpbmcgd2l0aCAlcyIsIF9fRlVOQ1RJT05fXywgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogZ3JvdXAgJWQgbWF0Y2hpbmcgd2l0aCAlcyIsIF9fRlVOQ1RJT05fXywgZ3JvdXAsIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIElWb2x1bWVDdXJ2ZXMgJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhhdHRyaWJ1dGVzKTsKKyAgICBWb2x1bWVTb3VyY2UgdnMgPSB0b1ZvbHVtZVNvdXJjZShncm91cCk7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKworICAgIHN0YXR1cyA9IHNldFZvbHVtZUN1cnZlSW5kZXgoaW5kZXgsIGRldmljZSwgY3VydmVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlcyBmYWlsZWQgdG8gc2V0IGN1cnZlIGluZGV4IGZvciBncm91cCAlZCBkZXZpY2UgMHglWCIsIF9fZnVuY19fLCBncm91cCwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgY3VyU3JjRGV2aWNlOworICAgIGF1dG8gY3VyQ3VydkF0dHJzID0gY3VydmVzLmdldEF0dHJpYnV0ZXMoKTsKKyAgICBpZiAoIWN1ckN1cnZBdHRycy5lbXB0eSgpICYmIGN1ckN1cnZBdHRycy5mcm9udCgpICE9IGRlZmF1bHRBdHRyKSB7CisgICAgICAgIGF1dG8gYXR0ciA9IGN1ckN1cnZBdHRycy5mcm9udCgpOworICAgICAgICBjdXJTcmNEZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmYWxzZSkudHlwZXMoKTsKKyAgICB9IGVsc2UgaWYgKCFjdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKS5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gc3RyZWFtID0gY3VydmVzLmdldFN0cmVhbVR5cGVzKCkuZnJvbnQoKTsKKyAgICAgICAgY3VyU3JjRGV2aWNlID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIGZhbHNlKS50eXBlcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzcmMgJWQ6IG5vIHZhbGlkIGF0dHJpYnV0ZXMgbm9yIHN0cmVhbSIsX19mdW5jX18sIHZzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3VyU3JjRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoY3VyU3JjRGV2aWNlKTsKKworICAgIC8vIHVwZGF0ZSB2b2x1bWUgb24gYWxsIG91dHB1dHMgYW5kIHN0cmVhbXMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIFRoZSByZXF1ZXN0ZWQgc3RyZWFtIChvciBhIHN0cmVhbSBtYXRjaGluZyBmb3Igdm9sdW1lIGNvbnRyb2wpIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0CisgICAgLy8gLSBUaGUgZGV2aWNlIChvciBkZXZpY2VzKSBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbSBpbmNsdWRlcworICAgIC8vIHRoZSByZXF1ZXN0ZWQgZGV2aWNlCisgICAgLy8gLSBGb3Igbm9uIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSwgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZSBvbiB0aGUgb3V0cHV0IGlzIGVpdGhlciB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgZGV2aWNlIG9yIG9uZSBvZiB0aGUgZGV2aWNlcyBzZWxlY3RlZCBieSB0aGUgZW5naW5lIGZvciB0aGlzIHN0cmVhbQorICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgorICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CisKKyAgICAgICAgaWYgKGN1ckRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgICAgICBjdXJEZXZpY2UgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgY3VyRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludGVyIC8gaW50cmEgdm9sdW1lIGdyb3VwIHByaW9yaXR5IG1hbmFnZW1lbnQ6IExvb3Agb24gc3RyYXRlZ2llcyBhcnJhbmdlZCBieSBwcmlvcml0eQorICAgICAgICAvLyBJZiBhIGhpZ2hlciBwcmlvcml0eSBzdHJhdGVneSBpcyBhY3RpdmUsIGFuZCB0aGUgb3V0cHV0IGlzIHJvdXRlZCB0byBhIGRldmljZSB3aXRoIGEKKyAgICAgICAgLy8gSFcgR2FpbiBtYW5hZ2VtZW50LCBkbyBub3QgY2hhbmdlIHRoZSB2b2x1bWUKKyAgICAgICAgYm9vbCBhcHBseVZvbHVtZSA9IGZhbHNlOworICAgICAgICBpZiAoZGVzYy0+dXNlSHdHYWluKCkpIHsKKyAgICAgICAgICAgIGlmICghKGRlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKGdyb3VwKSkgfHwgaXNJbkNhbGwoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjdGl2ZUNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypwcmVmZXJyZWREZXZpY2UqLyk7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWVtcHRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgaXNIaWdoZXJQcmlvcml0eSA9IHByb2R1Y3RTdHJhdGVneSA8IHN0cmF0ZWd5OworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogYWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNIaWdoZXJQcmlvcml0eSAmJiAoY2xpZW50LT52b2x1bWVTb3VyY2UoKSAhPSB2cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogU3RyYXRlZ3k9JWQgKFxucmVxdWVzdGVyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBncm91cCAlZCwgdm9sdW1lR3JvdXA9JWQgYXR0cmlidXRlcz0lcylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaGlnaGVyIHByaW9yaXR5IHNvdXJjZSBhY3RpdmU6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZvbHVtZUdyb3VwPSVkIGF0dHJpYnV0ZXM9JXMpIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBvdXRwdXQgJXp1LCBiYWlsaW5nIG91dCIsIF9fZnVuY19fLCBwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCwgZ3JvdXAsIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnZvbHVtZVNvdXJjZSgpLCB0b1N0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMoKSkuY19zdHIoKSwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmVlbXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgY29udGludWUgZm9yIGxvb3AgdG8gZW5zdXJlIG5vIGhpZ2hlciBwcmlvIGNsaWVudHMgcnVubmluZyBvbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+dm9sdW1lU291cmNlKCkgPT0gdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNQcmVlbXB0ZWQgfHwgYXBwbHlWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhcHBseVZvbHVtZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBuZXh0IG91dHB1dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2cywgaW5kZXgsIGRlc2MsIGN1ckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKSk7CisgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZGVzYy0+aXNBY3RpdmUodnMpIHx8IGlzSW5DYWxsKCkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgJiYgKChjdXJEZXZpY2UgJiBkZXZpY2UpID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7CisgICAgICAgICAgICBjdXJTcmNEZXZpY2UgfD0gZGV2aWNlOworICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSAoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoY3VyRGV2aWNlKSAmIGN1clNyY0RldmljZSkgIT0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIWN1cnZlcy5oYXNWb2x1bWVJbmRleEZvckRldmljZShjdXJTcmNEZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChhcHBseVZvbHVtZSkgeworICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcworICAgICAgICAgICAgLy8gZGVsYXllZCB2b2x1bWUgY2hhbmdlIGZvciBzeXN0ZW0gc3RyZWFtIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcworICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLCB2cywgaW5kZXgsIGRlc2MsIGN1ckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKKyAgICAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIDAgLypmbGFncyovKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFZvbHVtZUN1cnZlSW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKQorewogICAgIC8vIFZPSUNFX0NBTEwgc3RyZWFtIGhhcyBtaW5Wb2x1bWVJbmRleCA+IDAgIGJ1dCBjYW4gYmUgbXV0ZWQgZGlyZWN0bHkgYnkgYW4KICAgICAvLyBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCi0gICAgaWYgKCgoaW5kZXggPCBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1pbihzdHJlYW0pKSAmJgotICAgICAgICAgICAgIShzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYgaW5kZXggPT0gMCkpIHx8Ci0gICAgICAgICAgICAoaW5kZXggPiBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pKSkgeworICAgIGJvb2wgaGFzVm9pY2UgPSBoYXNWb2ljZVN0cmVhbSh2b2x1bWVDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKSk7CisgICAgaWYgKCgoaW5kZXggPCB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSkgJiYgIShoYXNWb2ljZSAmJiBpbmRleCA9PSAwKSkgfHwKKyAgICAgICAgICAgIChpbmRleCA+IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpKSkgeworICAgICAgICBBTE9HRCgiJXM6IHdyb25nIGluZGV4ICVkIG1pbj0lZCBtYXg9JWQiLCBfX0ZVTkNUSU9OX18sIGluZGV4LAorICAgICAgICAgICAgICB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSwgdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewpAQCAtMjI2MCw5MCArMjYxMiw0OSBAQAogICAgIH0KIAogICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgaWYgKCF2b2x1bWVDdXJ2ZXMuY2FuQmVNdXRlZCgpKSBpbmRleCA9IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogCi0gICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA4eCwgaW5kZXggJWQiLAotICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0KLSAgICAvLyB1cGRhdGUgb3RoZXIgcHJpdmF0ZSBzdHJlYW0gdm9sdW1lcyB3aGljaCBmb2xsb3cgdGhpcyBvbmUKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUN1cnZlcy0+YWRkQ3VycmVudFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgotICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKLSAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RyZWFtIGluY2x1ZGVzCi0gICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKLSAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQotICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneQotICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgotICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGVzYy0+ZGV2aWNlKCkpOwotICAgICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKGRlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGlzSW5DYWxsKCkgJiYgKGN1clN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBjdXJTdHJhdGVneSA9IGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyU3RyZWFtRGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZ2V0RGV2aWNlRm9yU3RyYXRlZ3koCi0gICAgICAgICAgICAgICAgICAgIGN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChjdXJTdHJlYW1EZXZpY2UgJiBkZXZpY2UpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIGFwcGx5Vm9sdW1lOwotICAgICAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgewotICAgICAgICAgICAgICAgIGN1clN0cmVhbURldmljZSB8PSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSAoY3VyRGV2aWNlICYgY3VyU3RyZWFtRGV2aWNlKSAhPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwotICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQotICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKSA/IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgQUxPR1YoIiVzIGRldmljZSAlMDh4LCBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXyAsIGRldmljZSwgaW5kZXgpOworICAgIHZvbHVtZUN1cnZlcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIHNlbGVjdGVkIGZvciB0aGlzCisgICAgLy8gc3RyZWFtIGJ5IHRoZSBlbmdpbmUuCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CiAgICAgfQorICAgIHJldHVybiBnZXRWb2x1bWVJbmRleChnZXRWb2x1bWVDdXJ2ZXMoYXR0ciksIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4KGNvbnN0IElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgfQogICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgaW5kZXggPSBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICBBTE9HVigiJXM6IGRldmljZSAlMDh4IGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2UsIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKLSAgICAqaW5kZXggPSAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpOwotICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpbmRleCA9IGdldFZvbHVtZUN1cnZlcyhhdHRyKS5nZXRWb2x1bWVJbmRleE1pbigpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpbmRleCA9IGdldFZvbHVtZUN1cnZlcyhhdHRyKS5nZXRWb2x1bWVJbmRleE1heCgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjM1OCw5ICsyNjY5LDkgQEAKICAgICAvLyAzOiBUaGUgcHJpbWFyeSBvdXRwdXQKICAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwgbnVsbHB0ciwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMjM3Niw3ICsyNjg3LDcgQEAKIAogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhZGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMgYWN0aXZlT25seSAlZCBvdXRwdXQgJWQgZmxhZ3MgMHglMDh4IiwKQEAgLTI0MDQsNiArMjcxNSw3IEBACiAgICAgfQogCiAgICAgaWYgKG91dHB1dCAhPSBtTXVzaWNFZmZlY3RPdXRwdXQpIHsKKyAgICAgICAgbUVmZmVjdHMubW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBtTXVzaWNFZmZlY3RPdXRwdXQsIG91dHB1dCk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1NdXNpY0VmZmVjdE91dHB1dCwgb3V0cHV0KTsKICAgICAgICAgbU11c2ljRWZmZWN0T3V0cHV0ID0gb3V0cHV0OwogICAgIH0KQEAgLTI0MzEsMjQgKzI3NDMsNjIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1FZmZlY3RzLmlzRWZmZWN0RW5hYmxlZChpZCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGVmZmVjdCAlZCBlbmFibGVkIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgIHNldEVmZmVjdEVuYWJsZWQoaWQsIGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYW5VcEVmZmVjdHNGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBpbykKK3sKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlZmZlY3RzID0gbUVmZmVjdHMuZ2V0RWZmZWN0c0ZvcklvKGlvKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIHN0YWxlIGVmZmVjdCAlcywgaWQgJWQgb24gY2xvc2VkIElPICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGVmZmVjdHMudmFsdWVBdChpKS0+bURlc2MubmFtZSwgZWZmZWN0cy5rZXlBdChpKSwgaW8pOworICAgICAgICB1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdHMua2V5QXQoaSkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdCA9IG1FZmZlY3RzLmdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1JbnB1dHMudHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykKK3sKKyAgIG1FZmZlY3RzLm1vdmVFZmZlY3RzKGlkcywgaW8pOworICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UICYmICFhY3RpdmU7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlID0gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpblBhc3RNcyk7Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmU7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTI0OTMsMzMgKzI4NDMsNDggQEAKICAgICBzcDxId01vZHVsZT4gclN1Ym1peE1vZHVsZTsKICAgICAvLyBleGFtaW5lIGVhY2ggbWl4J3Mgcm91dGUgdHlwZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyBvciBNSVhfUk9VVEVfRkxBR19SRU5ERVIsIG5vdCB0aGUgY29tYmluYXRpb24KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0FMTCkgPT0gTUlYX1JPVVRFX0ZMQUdfQUxMKSB7CisgICAgICAgIEF1ZGlvTWl4IG1peCA9IG1peGVzW2ldOworICAgICAgICAvLyBPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZQorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgubVJvdXRlRmxhZ3MpICYmIG1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgUG9saWN5IE1peCAlenUgb2YgJXp1OiAiCisgICAgICAgICAgICAgICAgICAiT25seSBjYXB0dXJlIG9mIHBsYXliYWNrIGlzIGFsbG93ZWQgaW4gTE9PUF9CQUNLICYgUkVOREVSIG1vZGUiLAorICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSk7CiAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewotICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOworICAgICAgICAvLyBMT09QX0JBQ0sgYW5kIExPT1BfQkFDSyB8IFJFTkRFUiBoYXZlIHRoZSBzYW1lIHJlbW90ZSBzdWJtaXggYmFja2VuZCBhbmQgYXJlIGhhbmRsZWQKKyAgICAgICAgLy8gaW4gdGhlIHNhbWUgd2F5LgorICAgICAgICBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyAlZCIsIGksIG1peGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIG1peC5tUm91dGVGbGFncyk7CiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CiAgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiIFVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOwogICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlVG9NYWtlQXZhaWxhYmxlOworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgIGRldmljZVR5cGVUb01ha2VBdmFpbGFibGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgZGV2aWNlVHlwZVRvTWFrZUF2YWlsYWJsZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBhZGRyZXNzICVzIiwgaSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KG1peCwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0yNTI5LDMxICsyODk0LDM1IEBACiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoYWRkcmVzcywgJmlucHV0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7CiAKLSAgICAgICAgICAgIGlmIChtaXhlc1tpXS5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgaWYgKChyZXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlVHlwZVRvTWFrZUF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGF2YWlsYWJsZSwgdHlwZSAldSwgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBtaXhlc1tpXS5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gbWl4Lm1EZXZpY2VUeXBlOwogICAgICAgICAgICAgQUxPR1YoIiByZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgUkVOREVSLCBkZXY9MHglWCBhZGRyPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgbWl4Lm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sIGZvdW5kT3V0cHV0ID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMCA7IGogPCBtT3V0cHV0cy5zaXplKCkgOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKGRlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIGlmICgocGF0Y2ggIT0gMCkgJiYgKHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cm5jbXAocGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIGRlc2MpICE9IE5PX0VSUk9SKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChtaXgsIGRlc2MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IHJlZ2lzdGVyIG1peCBSRU5ERVIsICBkZXY9MHglWCBhZGRyPSVzIiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE91dHB1dCA9IHRydWU7CkBAIC0yNTY0LDEyICsyOTMzLDEyIEBACiAKICAgICAgICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmICghZm91bmRPdXRwdXQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIE91dHB1dCBub3QgZm91bmQgZm9yIG1peCAlenUgZm9yIGRldmljZSAweCVYIGFkZHIgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjYwMSwyOCArMjk3MCwyOCBAQAogCiAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CiAKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChhZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KG1peCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgZm9yIChhdXRvIGRldmljZSA6IHtBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYfSkgeworICAgICAgICAgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBtYWtpbmcgUmVtb3RlU3VibWl4IGRldmljZSB1bmF2YWlsYWJsZSBmb3IgbWl4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHR5cGUgJWQsIGFkZHJlc3MgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKIAotICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgobWl4KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjYzMSw1NyArMzAwMCwxMTcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0ZXhwciBzaXplX3QgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gPSBzaXplb2YoIkFVRElPX0ZPUk1BVF8iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZtdCA6IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBkc3QtPmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2ZtdDsKKyAgICAgICAgRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhmbXQsIHNmbXQpOworICAgICAgICBkc3QtPmFwcGVuZChzZm10LnNpemUoKSA+PSBhdWRpb0Zvcm1hdFByZWZpeExlbiA/CisgICAgICAgICAgICAgICAgc2ZtdC5jX3N0cigpICsgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gLSAxIDogc2ZtdC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOworICAgIC8vIHVpZC9kZXZpY2UgYWZmaW5pdHkgaXMgb25seSBmb3Igb3V0cHV0IGRldmljZXMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZXNbaV0ubVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGRldmljZT0lMDh4IGlzIE5PVCBhbiBvdXRwdXQgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9ICBtUG9saWN5TWl4ZXMuc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVldmFsdWF0ZSBvdXRwdXRzIGZvciBhbGwgZ2l2ZW4gZGV2aWNlcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcywgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldFVpZERldmljZUFmZmluaXRpZXMoKSBlcnJvciBpbiBjaGVja091dHB1dHNGb3JEZXZpY2UgZm9yIGRldmljZT0lMDh4IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhZGRyPSVzIiwgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBBTE9HVigiJXMoKSB1aWQ9JWQiLCBfX0ZVTkNUSU9OX18sIHVpZCk7CisgICAgc3RhdHVzX3QgcmVzID0gbVBvbGljeU1peGVzLnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlcygpIENvdWxkIG5vdCByZW1vdmUgYWxsIGRldmljZSBhZmZpbml0aWVzIGZvIHVpZCA9ICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAorICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOworICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUGhvbmUgc3RhdGU6ICVzXG4iLCBzdGF0ZUxpdGVyYWwuY19zdHIoKSk7CisgICAgY29uc3QgY2hhciogZm9yY2VVc2VzW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9IHsKKyAgICAgICAgImNvbW11bmljYXRpb25zIiwgIm1lZGlhIiwgInJlY29yZCIsICJkb2NrIiwgInN5c3RlbSIsCisgICAgICAgICJIRE1JIHN5c3RlbSBhdWRpbyIsICJlbmNvZGVkIHN1cnJvdW5kIG91dHB1dCIsICJ2aWJyYXRlIHJpbmdpbmciIH07CisgICAgZm9yIChhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgaSA9IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgIGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSA9IChhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QpKChpbnQpaSArIDEpKSB7CisgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2VWYWx1ZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKGkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcmNlIHVzZSBmb3IgJXM6ICVkIiwgZm9yY2VVc2VzW2ldLCBmb3JjZVVzZVZhbHVlKTsKKyAgICAgICAgaWYgKGkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EICYmCisgICAgICAgICAgICAgICAgZm9yY2VVc2VWYWx1ZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIgKE1BTlVBTDogIik7CisgICAgICAgICAgICBkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKGRzdCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgiKSIpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFRUUyBvdXRwdXQgJXNhdmFpbGFibGVcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiIiA6ICJub3QgIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENvbmZpZyBzb3VyY2U6ICVzXG4iLCBtQ29uZmlnLmdldFNvdXJjZSgpLmNfc3RyKCkpOyAvLyBnZXRDb25maWcgbm90IGNvbnN0CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOworICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOworICAgIG1PdXRwdXRzLmR1bXAoZHN0KTsKKyAgICBtSW5wdXRzLmR1bXAoZHN0KTsKKyAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGRzdCk7CisgICAgbVBvbGljeU1peGVzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9Tb3VyY2VzLmR1bXAoZHN0KTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQWxsb3dlZENhcHR1cmVQb2xpY2llczpcbiIpOworICAgIGZvciAoYXV0byYgcG9saWN5IDogbUFsbG93ZWRDYXB0dXJlUG9saWNpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgIC0gdWlkPSVkIGZsYWdfbWFzaz0lI3hcbiIsIHBvbGljeS5maXJzdCwgcG9saWN5LnNlY29uZCk7CisgICAgfQorCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuUG9saWN5IEVuZ2luZSBkdW1wOlxuIik7CisgICAgbUVuZ2luZS0+ZHVtcChkc3QpOworfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCi0gICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOwotICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCi0gICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGVuY29kZWQgc3Vycm91bmQgb3V0cHV0ICVkXG4iLAotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBUVFMgb3V0cHV0ICVzXG4iLCBtVHRzT3V0cHV0QXZhaWxhYmxlID8gImF2YWlsYWJsZSIgOiAibm90IGF2YWlsYWJsZSIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCisgICAgZHVtcCgmcmVzdWx0KTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwotICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7Ci0gICAgbU91dHB1dHMuZHVtcChmZCk7Ci0gICAgbUlucHV0cy5kdW1wKGZkKTsKLSAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKLSAgICBtRWZmZWN0cy5kdW1wKGZkKTsKLSAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZmQpOwotICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGZkKTsKLQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBjYXB0dXJlUG9saWN5KQoreworICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljaWVzW3VpZF0gPSBjYXB0dXJlUG9saWN5OwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjcwMiwxMiArMzEzMSw5IEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7Ci0gICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KQEAgLTI3MjYsOSArMzE1MiwxMiBAQAogICAgIH0KIAogICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKLSAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgewotICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICBjb25zdCBpbnQgbWluX2R1cmF0aW9uX3NlY3MgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIC0xIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChtaW5fZHVyYXRpb25fc2VjcyA+PSAwKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtaW5fZHVyYXRpb25fc2Vjcyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewpAQCAtMjc0OCwxNSArMzE3NywzNCBAQAogCiAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCiAgICAgLy8gQVVESU9fREVWSUNFX05PTkUKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KERldmljZVZlY3RvcigpIC8qaWdub3JlIGRldmljZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOwogICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRfZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhhdHRyaWJ1dGVzLmZsYWdzLCAmb3V0cHV0X2ZsYWdzKTsKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KERldmljZVZlY3RvcigpIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CisgICAgQUxPR1YoIiVzKCkgcHJvZmlsZSAlc2ZvdW5kIHdpdGggbmFtZTogJXMsICIKKyAgICAgICAgInNhbXBsZSByYXRlOiAldSwgZm9ybWF0OiAweCV4LCBjaGFubmVsX21hc2s6IDB4JXgsIG91dHB1dCBmbGFnczogMHgleCIsCisgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIsCisgICAgICAgIChwcm9maWxlICE9IDAgPyBwcm9maWxlLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkgOiAibnVsbCIpLAorICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5mb3JtYXQsIGNvbmZpZy5jaGFubmVsX21hc2ssIG91dHB1dF9mbGFncyk7CisgICAgcmV0dXJuIChwcm9maWxlICE9IDApOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjg2NSw4ICszMzEzLDcgQEAKICAgICB9CiAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOwogCi0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAotICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICBpZiAoIWF1ZGlvX3BhdGNoX2lzX3ZhbGlkKHBhdGNoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93CkBAIC0yOTM4LDggKzMzODUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcywKKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldkRlc2MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRTYW1wbGluZ1JhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LApAQCAtMjk2MCw3ICszNDA2LDcgQEAKICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQogICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlcy50eXBlcygpLCB0cnVlLCAwLCBoYW5kbGUpOworICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIHRydWUsIDAsIGhhbmRsZSk7CiAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CkBAIC0yOTg5LDE0ICszNDM1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZm9ybWF0LApAQCAtMzAxMCw5ICszNDU1LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCi0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+dHlwZSgpLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2RGVzYy0+dHlwZSgpLCB0cnVlLCBoYW5kbGUpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgc2V0dGluZyBkZXZpY2UgJXMgb24gb3V0cHV0ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldmljZSwgdHJ1ZSwgaGFuZGxlKTsKICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKQEAgLTMwMzIsMTYgKzM0NzcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vdXBkYXRlIHNvdXJjZSBhbmQgc2luayB3aXRoIG91ciBvd24gZGF0YSBhcyB0aGUgZGF0YSBwYXNzZWQgaW4gdGhlIHBhdGNoIG1heQogICAgICAgICAgICAgLy8gYmUgaW5jb21wbGV0ZS4KICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBuZXdQYXRjaCA9ICpwYXRjaDsKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworICAgICAgICAgICAgc3JjRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKIAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewpAQCAtMzA0OSwyOSArMzQ5NCwyOSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOworICAgICAgICAgICAgICAgIHNpbmtEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CiAKICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKICAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJlbnQgSFcgbW9kdWxlcyBPUgogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAKLSAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2VEZXNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDwgMykpIHsKKyAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMCBidXQgbm8gcm91dGUgaGFzIGJlZW4gZGVjbGFyZWQgYmV0d2VlbiBkZXZpY2VzCisgICAgICAgICAgICAgICAgaWYgKCFzcmNEZXZpY2UtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3JjRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPnR5cGUoKSwgbU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0byBnbyB2aWEKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CkBAIC0zMDg1LDI4ICszNTMwLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKIAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZuZXdQYXRjaCwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBpbmRleCwgaGFuZGxlLCAmbmV3UGF0Y2gsIDAsIHVpZCwgJnBhdGNoRGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTMxNDYsMTEgKzM1NzEsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CkBAIC0zMjM5LDEwICszNjY0LDEwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnID0ge307CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZyA9IHt9OwogICAgICAgICBhdWRpb1BvcnRDb25maWctPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgMCk7CiAgICAgfQpAQCAtMzI3MCwzMSArMzY5NSwzMSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAvLyBUYWtlIHRoZSBmaXJzdCBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgcHJvZHVjdCBzdHJhdGVneSBhcyBpdCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSByb3V0ZWQKKyAgICAvLyBkZXZpY2UuIEFsbCBhdHRyaWJ1dGVzIHdpaGluIGEgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSAicm91dGluZyBzdHJhdGVneSIKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKS5mcm9udCgpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZmFsc2UpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgIGlmIChtT3V0cHV0cy5rZXlBdChqKSA9PSBvdXB0dXRUb1NraXApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgaWYgKCFpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5KSkgeworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHMpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvLyBJZiB0aGUgZGVmYXVsdCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kgaXMgb24gYW5vdGhlciBvdXRwdXQgbWl4LAogICAgICAgICAvLyBpbnZhbGlkYXRlIGFsbCB0cmFja3MgaW4gdGhpcyBzdHJhdGVneSB0byBmb3JjZSByZSBjb25uZWN0aW9uLgogICAgICAgICAvLyBPdGhlcndpc2Ugc2VsZWN0IG5ldyBkZXZpY2Ugb24gdGhlIG91dHB1dCBtaXguCiAgICAgICAgIGlmIChvdXRwdXRzLmluZGV4T2YobU91dHB1dHMua2V5QXQoaikpIDwgMCkgewotICAgICAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvIHN0cmVhbSA6IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgZmFsc2UpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsIGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyksIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTMzMDIsMTMgKzM3MjcsMTggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhclNlc3Npb25Sb3V0ZXModWlkX3QgdWlkKQogewogICAgIC8vIHJlbW92ZSBvdXRwdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAotICAgIFNvcnRlZFZlY3Rvcjxyb3V0aW5nX3N0cmF0ZWd5PiBhZmZlY3RlZFN0cmF0ZWdpZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltT3V0cHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFN0cmF0ZWdpZXMuYWRkKGdldFN0cmF0ZWd5KHJvdXRlLT5tU3RyZWFtVHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPHByb2R1Y3Rfc3RyYXRlZ3lfdD4gYWZmZWN0ZWRTdHJhdGVnaWVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBvdXRwdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYXV0byBjbGllbnRTdHJhdGVneSA9IGNsaWVudC0+c3RyYXRlZ3koKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKGFmZmVjdGVkU3RyYXRlZ2llcyksIGVuZChhZmZlY3RlZFN0cmF0ZWdpZXMpLCBjbGllbnRTdHJhdGVneSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZChhZmZlY3RlZFN0cmF0ZWdpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZmZlY3RlZFN0cmF0ZWdpZXMucHVzaF9iYWNrKGNsaWVudC0+c3RyYXRlZ3koKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzE5LDEyICszNzQ5LDEyIEBACiAKICAgICAvLyByZW1vdmUgaW5wdXQgcm91dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVpZAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zb3VyY2VfdD4gYWZmZWN0ZWRTb3VyY2VzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUlucHV0Um91dGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChyb3V0ZS0+bVNvdXJjZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiBjbGllbnQtPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTb3VyY2VzLmFkZChjbGllbnQtPnNvdXJjZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzMzIsNyArMzc2Miw3IEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHNUb0Nsb3NlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5pbnB1dFNvdXJjZSgpKSA+PSAwKSB7CisgICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPnNvdXJjZSgpKSA+PSAwKSB7CiAgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLmFkZChpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzQ0LDggKzM3NzQsOCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCkKIHsKICAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1NvdXJjZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHNvdXJjZURlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChzb3VyY2VEZXNjLT51aWQoKSA9PSB1aWQpIHsKICAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShtQXVkaW9Tb3VyY2VzLmtleUF0KGkpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMzNTcsODcgKzM3ODcsMTEwIEBACiB7CiAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CiAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfSU5QVVQpOwotICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfSE9UV09SRCB9OworICAgICpkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0ciktPnR5cGUoKTsKIAogICAgIHJldHVybiBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWNxdWlyZVNlc3Npb24oKnNlc3Npb24sICppb0hhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7Ci0gICAgQUxPR1YoIiVzIHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBhcmd1bWVudDogc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotCiAgICAgaWYgKHNvdXJjZS0+cm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8CiAgICAgICAgICAgICBzb3VyY2UtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBBTE9HVigiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOworICAgICAgICBBTE9HVygiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0KICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKHNvdXJjZS0+ZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlLT5leHQuZGV2aWNlLmFkZHJlc3MpKTsKLSAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgaWYgKHNyY0RldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQotICAgICAgICAgICAgbmV3IEF1ZGlvU291cmNlRGVzY3JpcHRvcihzcmNEZXZpY2VEZXNjLCBhdHRyaWJ1dGVzLCB1aWQpOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2g7CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaCA9IHt9OwogICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZkdW1teVBhdGNoLCB1aWQpOwotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MgPSBwYXRjaERlc2M7CisKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0KKyAgICAgICAgbmV3IFNvdXJjZUNsaWVudERlc2NyaXB0b3IoKnBvcnRJZCwgdWlkLCAqYXR0cmlidXRlcywgcGF0Y2hEZXNjLCBzcmNEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygqYXR0cmlidXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKCphdHRyaWJ1dGVzKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZChzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSwgc291cmNlRGVzYyk7Ci0gICAgICAgICpoYW5kbGUgPSBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgbUF1ZGlvU291cmNlcy5hZGQoKnBvcnRJZCwgc291cmNlRGVzYyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOwogCiAgICAgLy8gbWFrZSBzdXJlIHdlIG9ubHkgaGF2ZSBvbmUgcGF0Y2ggcGVyIHNvdXJjZS4KICAgICBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9IHNvdXJjZURlc2MtPm1EZXZpY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzb3VyY2VEZXNjLT5zdHJlYW0oKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPSBzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBzaW5rRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUpOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShzaW5rRGV2aWNlLCBTdHJpbmc4KCIiKSk7CisgICAgRGV2aWNlVmVjdG9yIHNpbmtEZXZpY2VzID0KKyAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIHRydWUpOworICAgIEFMT0dfQVNTRVJUKCFzaW5rRGV2aWNlcy5pc0VtcHR5KCksICJjb25uZWN0QXVkaW9Tb3VyY2UoKTogbm8gZGV2aWNlIGZvdW5kIGZvciBhdHRyaWJ1dGVzIik7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IHNpbmtEZXZpY2VzLml0ZW1BdCgwKTsKKyAgICBBTE9HX0FTU0VSVChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzaW5rRGV2aWNlKSwgIiVzOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bVBhdGNoOwogCi0gICAgaWYgKHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSA9PQotICAgICAgICAgICAgc2lua0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSAmJgotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMgJiYKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVigiJXMgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKHNyY0RldmljZS0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZSkgJiYKKyAgICAgICAgICAgIHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPj0gMyAmJgorICAgICAgICAgICAgc2lua0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSAmJgorICAgICAgICAgICAgc3JjRGV2aWNlLT5nZXRBdWRpb1BvcnQoKS0+bUdhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgQUxPR1YoIiVzIERldmljZSB0byBEZXZpY2Ugcm91dGUgc3VwcG9ydGVkIGJ5ID49My4wIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFRPRE86IG1heSBleHBsaWNpdGx5IHNwZWNpZnkgd2hldGhlciB3ZSBzaG91bGQgdXNlIEhXIG9yIFNXIHBhdGNoCiAgICAgICAgIC8vICAgY3JlYXRlIHBhdGNoIGJldHdlZW4gc3JjIGRldmljZSBhbmQgb3V0cHV0IGRldmljZQogICAgICAgICAvLyAgIGNyZWF0ZSBId291dHB1dCBhbmQgYWRkIHRvIG1Id091dHB1dHMKICAgICB9IGVsc2UgewotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2UsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0KLSAgICAgICAgICAgICAgICBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgcmVzdWx0QXR0cjsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc291cmNlRGVzYy0+Y29uZmlnKCkuc2FtcGxlX3JhdGU7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5jaGFubmVsX21hc2s7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5mb3JtYXQ7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dHM7CisgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAmc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIG5vIG91dHB1dCBmb3IgZGV2aWNlICUwOHgiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzIG5vIG91dHB1dCBmb3IgZGV2aWNlICUwOHgiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCBpcyBkdXBsaWNhdGVkIiwgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CkBAIC0zNDUwLDUxICszOTAzLDU4IEBACiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKICAgICAgICAgLy8gLSB0aGUgc2luayBpcyBkZWZpbmVkIGJ5IHdoYXRldmVyIG91dHB1dCBkZXZpY2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgb3V0cHV0CiAgICAgICAgIC8vIHRob3VnaCB3aGljaCB0aGlzIHBhdGNoIGlzIHJvdXRlZC4KLSAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9IDA7Ci0gICAgICAgIHBhdGNoLT5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7Ci0gICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7Ci0gICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY0RldmljZSkuYWRkU291cmNlKG91dHB1dERlc2MsIHsgLnN0cmVhbSA9IHN0cmVhbSB9KTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKICAgICAgICAgQUxPR1YoIiVzIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bVBhdGNoID0gKnBhdGNoQnVpbGRlci5wYXRjaCgpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KHNvdXJjZURlc2MpOworCiAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOwotICAgICAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIHNpbmtEZXZpY2UsIE5VTEwsICZkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc291cmNlRGVzYywgJmRlbGF5TXMpOwogCiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTM5LDUxICszOTk5LDcgQEAKIGZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFZlY3RvciYgZm9ybWF0cykgewotICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBTdHJpbmc4IHJlcGx5OwotICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBpb0hhbmRsZSwgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cykpOwotICAgIEFMT0dWKCIlczogc3VwcG9ydGVkIGZvcm1hdHMgJXMiLCBfX0ZVTkNUSU9OX18sIHJlcGx5LnN0cmluZygpKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKLSAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZm9ybWF0LCBiYWlsaW5nIG91dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGZvciAoYXV0byBmb3JtYXQgOiBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSkpIHsKLSAgICAgICAgLy8gT25seSBBVURJT19GT1JNQVRfQUFDX0xDIHdpbGwgYmUgdXNlZCBpbiBTZXR0aW5ncyBVSSBmb3IgYWxsIEFBQyBmb3JtYXRzLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQUFDX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDX0xDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgZXhpc3QgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdHNbaV0pIHsKLSAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoU1VSUk9VTkRfRk9STUFUU1tpXSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4aXN0ICYmIGlzU3Vycm91bmRGb3JtYXQpIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBjb21wdXRlVm9sdW1lKGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLCB0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpbmRleCwgZGV2aWNlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCkBAIC0zNTk1LDI2MSArNDAxMSwxOTMgQEAKICAgICAgICAgICAgIChzdXJyb3VuZEZvcm1hdHMgPT0gTlVMTCB8fCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkID09IE5VTEwpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiZ2V0U3Vycm91bmRGb3JtYXRzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIiwKLSAgICAgICAgICAgICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7Ci0KLSAgICAvLyBPbmx5IHJldHVybiB2YWx1ZSBpZiB0aGVyZSBpcyBIRE1JIG91dHB1dC4KLSAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAgcmVwb3J0ZWQgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOwogCiAgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKICAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7Ci0gICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IDA7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOyAvLyBVc2VzIHByaW1hcnkgc3Vycm91bmQgZm9ybWF0cyBvbmx5CiAgICAgaWYgKHJlcG9ydGVkKSB7Ci0gICAgICAgIC8vIE9ubHkgZ2V0IHN1cnJvdW5kIGZvcm1hdHMgd2hpY2ggYXJlIHJlcG9ydGVkIGJ5IGRldmljZS4KLSAgICAgICAgLy8gRmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSTsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwotICAgICAgICBib29sIHJlcG9ydGVkRm9ybWF0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycy4KLSAgICAgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoQVVESU9fREVWSUNFX09VVF9IRE1JKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dHMuaXRlbUF0KGopLCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1heCBPdXRwdXQgbnVtYmVyICV1IGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1heE9wZW5Db3VudCwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0LCBmb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEZvcm1hdEZvdW5kIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIC8vIFJldHVybiBmb3JtYXRzIGZyb20gYWxsIGRldmljZSBwcm9maWxlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGJ5CisgICAgICAgIC8vIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXTsKKyAgICAgICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzID0KKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5nZXRBdWRpb1BvcnQoKS0+Z2V0QXVkaW9Qcm9maWxlcygpLmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc3VwcG9ydGVkRm9ybWF0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQoc3VwcG9ydGVkRm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIuc2Vjb25kLmNvdW50KHN1cHBvcnRlZEZvcm1hdHNbal0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVwb3J0ZWRGb3JtYXRGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoU1VSUk9VTkRfRk9STUFUU1tpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOwogICAgICAgICB9CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSBmb3JtYXRzLnNpemUoKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOworICAgIGZvciAoY29uc3QgYXV0byYgZm9ybWF0OiBmb3JtYXRzKSB7CiAgICAgICAgIGlmIChmb3JtYXRzV3JpdHRlbiA8IGZvcm1hdHNNYXgpIHsKLSAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXRzW2ldOwotICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0c1tpXSA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZmluZChBQUNfRk9STUFUU1tpXSkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsKKyAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXQ7CisgICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgc3dpdGNoIChmb3JjZVVzZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChmb3JtYXQpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1TdXJyb3VuZEZvcm1hdHMuZmluZChmb3JtYXRzW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVI6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gQVVUTyBvciBBTFdBWVMgPT4gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRbZm9ybWF0c1dyaXR0ZW4rK10gPSBmb3JtYXRFbmFibGVkOwogICAgICAgICB9Ci0gICAgICAgICgqbnVtU3Vycm91bmRGb3JtYXRzKSsrOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYXVkaW8gZm9ybWF0IGlzIGEgc3Vycm91bmQgZm9ybWF0cy4KLSAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gU1VSUk9VTkRfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgaXNTdXJyb3VuZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWlzU3Vycm91bmRGb3JtYXQpIHsKKyAgICBBTE9HVigiJXMoKSBmb3JtYXQgMHglWCBlbmFibGVkICVkIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKKyAgICBjb25zdCBhdXRvJiBmb3JtYXRJdGVyID0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5maW5kKGF1ZGlvRm9ybWF0KTsKKyAgICBpZiAoZm9ybWF0SXRlciA9PSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlcygpIGZvcm1hdCAweCVYIGlzIG5vdCBhIGtub3duIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gTUFOVUFMLgotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKLSAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwotICAgIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKSAhPQorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vdCBpbiBtYW51YWwgbW9kZSBmb3Igc3Vycm91bmQgc291bmQgZm9ybWF0IHNlbGVjdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmICgobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmIGVuYWJsZWQpCi0gICAgICAgICAgICB8fCAobVN1cnJvdW5kRm9ybWF0cy5maW5kKGF1ZGlvRm9ybWF0KSA9PSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpICYmICFlbmFibGVkKSkgeworICAgIGlmICgobU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChhdWRpb0Zvcm1hdCkgIT0gMCkgPT0gZW5hYmxlZCkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgLy8gVGhlIG9wZXJhdGlvbiBpcyB2YWxpZCBvbmx5IHdoZW4gdGhlcmUgaXMgSERNSSBvdXRwdXQgYXZhaWxhYmxlLgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBzdXJyb3VuZEZvcm1hdHNCYWNrdXAobU1hbnVhbFN1cnJvdW5kRm9ybWF0cyk7CiAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2Uoc3ViRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjOwogICAgIGJvb2wgcHJvZmlsZVVwZGF0ZWQgPSBmYWxzZTsKLSAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KLSAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgIC8vIEZJWE1FOiBXaHkgZG9pbmcgdGhpcyBmb3IgaW5wdXQgSERNSSBkZXZpY2VzIGlmIHdlIGRvbid0IGF1Z21lbnQgdGhlaXIgcmVwb3J0ZWQgZm9ybWF0cz8KKyAgICBEZXZpY2VWZWN0b3IgaGRtaUlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzaygKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpOwogICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KIAotICAgIC8vIFVuZG8gdGhlIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIGR1ZSB0byBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLgogICAgIGlmICghcHJvZmlsZVVwZGF0ZWQpIHsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1coIiVzKCkgbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZCwgdW5kb2luZyBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSIsIF9fZnVuY19fKTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6bW92ZShzdXJyb3VuZEZvcm1hdHNCYWNrdXApOwogICAgIH0KIAogICAgIHJldHVybiBwcm9maWxlVXBkYXRlZCA/IE5PX0VSUk9SIDogSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOnNldFJlY29yZFNpbGVuY2VkKHVpZDolZCwgc2lsZW5jZWQ6JWQpIiwgdWlkLCBzaWxlbmNlZCk7Ci0KLSAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+dWlkKCkgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgQUxPR1YoIiVzKHVpZDolZCwgc3RhdGU6JWQpIiwgX19mdW5jX18sIHVpZCwgc3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQ7CisgICAgICAgICAgICBvdXRQcm9maWxlLT50b0F1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9Qb3J0Lm51bV9jaGFubmVsX21hc2tzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LmNoYW5uZWxfbWFza3NbaV0gJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgcG9ydCBJZCAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgaWYgKHBhdGNoRGVzYyA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5vIHBhdGNoIHdpdGggaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICByZW1vdmVBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogCi0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHNvdXJjZURlc2MpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzd091dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgfQorICAgICAgICBzd091dHB1dERlc2MtPnJlbW92ZUNsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bUh3T3V0cHV0LnByb21vdGUoKTsKKyAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKICAgICAgICAgICAvLyAgIHJlbGVhc2UgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgLy8gICBjbG9zZSBId291dHB1dCBhbmQgcmVtb3ZlIGZyb20gbUh3T3V0cHV0cwpAQCAtMzg2MCwxNiArNDIwOCwxNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3NwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc291cmNlU3RyYXRlZ3kgPQotICAgICAgICAgICAgICAgIChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOwotICAgICAgICBpZiAoc291cmNlU3RyYXRlZ3kgPT0gc3RyYXRlZ3kgJiYgb3V0cHV0RGVzYyAhPSAwICYmIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9PSBvdXRwdXQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyAhPSAwICYmIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9PSBvdXRwdXQpIHsKICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZURlc2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzg4NSw3ICs0MjMyLDYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb24rKzsKIH0KIAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIC8vIFRyZWJsaXplZCBhdWRpbyBwb2xpY3kgeG1sIGNvbmZpZyB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0KICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvc3lzdGVtL2V0YyJ9OwpAQCAtMzg5Nyw1MiArNDI0Myw1MCBAQAogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBmaWxlTmFtZXM7CiAgICAgc3RhdHVzX3QgcmV0OwogCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSAmJgotICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKLSAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQTJEUF9PRkZMT0FEX0RJU0FCTEVEX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYmx1ZXRvb3RoX2F1ZGlvX2hhbC5kaXNhYmxlZCIsIGZhbHNlKSAmJgorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICAgICAgLy8gQm90aCBCbHVldG9vdGhBdWRpb0AyLjAgYW5kIEJsdWV0b290aEEyZHBAMS4wIChPZmZsYW9kKSBhcmUgZGlzYWJsZWQsIGFuZCB1c2VzCisgICAgICAgICAgICAvLyB0aGUgbGVnYWN5IGhhcmR3YXJlIG1vZHVsZSBmb3IgQTJEUCBhbmQgaGVhcmluZyBhaWQuCisgICAgICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9CTFVFVE9PVEhfTEVHQUNZX0hBTF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CisgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICAgICAgLy8gQTJEUCBvZmZsb2FkIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQ6IHRyeSB0byB1c2Ugc3BlY2lhbCBYTUwgZmlsZQorICAgICAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQTJEUF9PRkZMT0FEX0RJU0FCTEVEX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmJsdWV0b290aF9hdWRpb19oYWwuZGlzYWJsZWQiLCBmYWxzZSkpIHsKKyAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQkxVRVRPT1RIX0xFR0FDWV9IQUxfWE1MX0NPTkZJR19GSUxFX05BTUUpOwogICAgIH0KICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CiAKICAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwogICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBjb25maWcpOworICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCAmY29uZmlnKTsKICAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0U291cmNlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotI2VuZGlmCiAKIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZm9yVGVzdGluZyovKQogICAgIDoKLSAgICBtVWlkQ2FjaGVkKGdldHVpZCgpKSwKKyAgICBtVWlkQ2FjaGVkKEFJRF9BVURJT1NFUlZFUiksIC8vIG5vIG5lZWQgdG8gY2FsbCBnZXR1aWQoKSwgdGhlcmUncyBvbmx5IG9uZSBvZiB1cyBydW5uaW5nLgogICAgIG1wQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKICAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKj4obVZvbHVtZUN1cnZlcy5nZXQoKSkpLAotI2Vsc2UKLSAgICBtVm9sdW1lQ3VydmVzKG5ldyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UpLAotI2VuZGlmCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgbURlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKICAgICBtQmVhY29uTXV0ZWQoZmFsc2UpLAogICAgIG1UdHNPdXRwdXRBdmFpbGFibGUoZmFsc2UpLAogICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKLSAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCisgICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKQogewogfQogCkBAIC0zOTUzLDIxICs0Mjk3LDIyIEBACiAgICAgaW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7Ci0jZWxzZQotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKKy8vICBUaGlzIGNoZWNrIGlzIHRvIGNhdGNoIGFueSBsZWdhY3kgcGxhdGZvcm0gdXBkYXRpbmcgdG8gUSB3aXRob3V0IGhhdmluZworLy8gIHN3aXRjaGVkIHRvIFhNTCBzaW5jZSBpdHMgZGVwcmVjYXRpb24gb24gTy4KKy8vIFRPRE86IGFmdGVyIFEgcmVsZWFzZSwgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGZsYWcgYXMgWE1MIGlzIG5vdyB0aGUgb25seQorLy8gICAgICAgIG9wdGlvbiBhbmQgYWxsIGxlZ2FjeSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gWE1MLgorI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCisjZXJyb3IgQXVkaW8gcG9saWN5IG5vIGxvbmdlciBzdXBwb3J0cyBsZWdhY3kgLmNvbmYgY29uZmlndXJhdGlvbiBmb3JtYXQKICNlbmRpZgorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKKyAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKICAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplKCkgewotICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoZ2V0Q29uZmlnKCkuaXNTcGVha2VyRHJjRW5hYmxlZCgpKTsKLQogICAgIC8vIE9uY2UgcG9saWN5IGNvbmZpZyBoYXMgYmVlbiBwYXJzZWQsIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUgYW5kIGluaXRpYWxpemUgaXQuCiAgICAgYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOwogICAgIGlmICghZW5naW5lSW5zdGFuY2UpIHsKQEAgLTM5ODksOCArNDMzNCw2IEBACiAKICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcwogICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlc0FsbCkgewogICAgICAgICBod01vZHVsZS0+c2V0SGFuZGxlKG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUoaHdNb2R1bGUtPmdldE5hbWUoKSkpOwogICAgICAgICBpZiAoaHdNb2R1bGUtPmdldEhhbmRsZSgpID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewpAQCAtNDAxOSw1MSArNDM2Miw0OSBAQAogICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpOworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsUHJvZmlsZURldmljZXMgPSBzdXBwb3J0ZWREZXZpY2VzLmZpbHRlcihtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzdXBwb3J0ZWREZXZpY2UgPSAwOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkRGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIHByb2ZpbGUncyBTdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCi0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VGb3JUeXBlKG91dHB1dERldmljZVR5cGVzKTsKKyAgICAgICAgICAgICAgICAvLyBjaG9vc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMuCisgICAgICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBhdmFpbFByb2ZpbGVEZXZpY2VzLml0ZW1BdCgwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzdXBwb3J0ZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgcHJvZmlsZVR5cGUsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOwotCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBzdXBwb3J0ZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZXMgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICAgfQogICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCiAgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdApAQCAtNDA3OCw4NSArNDQxOSw2OCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUoaW5wdXREZXZpY2VUeXBlcyk7Ci0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIEFMT0dWKCIgIGZvciBpbnB1dCBkZXZpY2UgMHgleCB1c2luZyBhZGRyZXNzICVzIiwgcHJvZmlsZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoaW5wdXREZXZpY2VzLnNpemUoKSA9PSAwLCAiSW5wdXQgZGV2aWNlIGxpc3QgaXMgZW1wdHkhIik7Ci0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4obnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2RGVzYy0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQoaW5Qcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICVzIG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiT3V0cHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0pOwotICAgICAgICAgICAgY29udGludWU7CisgICAgYXV0byBjaGVja0FuZFNldEF2YWlsYWJsZSA9IFt0aGlzXShhdXRvJiBkZXZpY2VzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkZXZpY2UgJXMgaXMgdW5yZWFjaGFibGUiLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERldmljZSBpcyBub3cgdmFsaWRhdGVkIGFuZCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgICAgIHNldEVuZ2luZURldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7Ci0gICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KKyAgICB9OworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBjaGVja0FuZFNldEF2YWlsYWJsZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKwogICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKLSAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKKyAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgIEFMT0dFX0lGKG1EZWZhdWx0T3V0cHV0RGV2aWNlICE9IDAsICJEZWZhdWx0IGRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsCisgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgIH0KICAgICAvLyBJZiBtaWNyb3Bob25lcyBhZGRyZXNzIGlzIGVtcHR5LCBzZXQgaXQgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzID0gU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JBQ0tfTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQxNjYsNiArNDQ5MCw5IEBACiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgfQogCisgICAgLy8gU2lsZW5jZSBBTE9HViBzdGF0ZW1lbnRzCisgICAgcHJvcGVydHlfc2V0KCJsb2cudGFnLiIgTE9HX1RBRywgIkQiKTsKKwogICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTQxODQsNyArNDUxMSw3IEBACiAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzQWxsLmNsZWFyKCk7Ci0gICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CisgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKQEAgLTQyMTcsNDQgKzQ1NDQsMjggQEAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICBkZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlQnlBZGRyZXNzKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgaWYgKGRldkRlc2MgIT0gMCkgewotICAgICAgICBBTE9HVigiZmluZElvSGFuZGxlc0J5QWRkcmVzcygpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBzYW1lIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZpY2UtPnR5cGUoKTsKKyAgICBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0gZGV2aWNlLT5hZGRyZXNzKCk7CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CiAKLSAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgewogICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICAgICAgZGV2RGVzYy0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgIGRldmljZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKQEAgLTQyNjIsMTMgKzQ1NzMsMTAgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00Mjc2LDcgKzQ1ODQsNyBAQAogICAgICAgICBBTE9HVigiICBmb3VuZCAlenUgcHJvZmlsZXMsICV6dSBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQyOTIsOCArNDYwMCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00MzA5LDE2ICs0NjE3LDE2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MzM3LDcgKzQ2NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIGRldmljZSwgYWRkcmVzcywgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgRGV2aWNlVmVjdG9yKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDM0NiwxNCArNDY1NSwxNiBAQAogCiAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiBhZGRyZXNzICE9ICIwIikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoYWRkcmVzcywgcG9saWN5TWl4KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChkZXZpY2VUeXBlLCBhZGRyZXNzLCBwb2xpY3lNaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CiAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSkgewpAQCAtNDM4NSwyOCArNDY5NiwyOCBAQAogICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmb3IgZGV2aWNlICV4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOwogICAgICAgICAgICAgICAgIC8vIExvYWQgZGlnaXRhbCBmb3JtYXQgaW5mbyBvbmx5IGZvciBkaWdpdGFsIGRldmljZXMKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwgdHJ1ZS8qZm9yY2UqLywgMC8qZGVsYXkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLypwYXRjaCBoYW5kbGUqLyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG91dHB1dCAlZCIsIG91dHB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeyAvLyBEaXNjb25uZWN0CkBAIC00NDE1LDEwICs0NzI2LDEwIEBACiAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpID09IGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIGRlc2MtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc2MtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKQEAgLTQ0MjksNyArNDc0MCw3IEBACiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbal07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CkBAIC00NDQxLDMwICs0NzUyLDE4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2M7CiAKLSAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCi0gICAgICAgIGRldkRlc2MtPmNsZWFyQXVkaW9Qcm9maWxlcygpOworICAgICAgICBkZXZpY2UtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwogICAgIH0KIAogICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewotICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICAvLyBsb29rIGZvciBpbnB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKQEAgLTQ0NzIsMTkgKzQ3NzEsMTcgQEAKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKIAotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgcHJvZmlsZSBhdmFpbGFibGUgZm9yIGRldmljZSAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtNDQ5OSw4ICs0Nzk2LDggQEAKICAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDUxOSwxNCArNDgxNiwxNCBAQAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzID0gZGV2aWNlLT5hZGRyZXNzKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ1MzcsNDYgKzQ4MzQsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dChpbnB1dCwgZGVzYyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCiAKICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBpbnB1dCAlZCIsIGlucHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAvLyBlbmQgc2NhbiBwcm9maWxlcwogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBEaXNjb25uZWN0Ci0gICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvcGVuZWQgaW5wdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKLSAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgICAgIGlmICghKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0RGV2aWNlKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKS5zaXplKCk7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CkBAIC00NTkzLDM4ICs0ODgxLDMyIEBACiB7CiAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBjbG9zaW5nT3V0cHV0ID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAoY2xvc2luZ091dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtUG9saWN5TWl4ZXMuY2xvc2VPdXRwdXQob3V0cHV0RGVzYyk7CisgICAgY29uc3QgYm9vbCBjbG9zaW5nT3V0cHV0V2FzQWN0aXZlID0gY2xvc2luZ091dHB1dC0+aXNBY3RpdmUoKTsKKyAgICBtUG9saWN5TWl4ZXMuY2xvc2VPdXRwdXQoY2xvc2luZ091dHB1dCk7CiAKICAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVkIG91dHB1dHMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgYmVpbmcgcmVtb3ZlZC4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCi0gICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKLSAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgewotICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOwotICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOwotICAgICAgICAgICAgfQorICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0ID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGR1cE91dHB1dC0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0IHx8IGR1cE91dHB1dC0+bU91dHB1dDIgPT0gY2xvc2luZ091dHB1dCkpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiByZW1haW5pbmdPdXRwdXQgPQorICAgICAgICAgICAgICAgIGR1cE91dHB1dC0+bU91dHB1dDEgPT0gY2xvc2luZ091dHB1dCA/IGR1cE91dHB1dC0+bU91dHB1dDIgOiBkdXBPdXRwdXQtPm1PdXRwdXQxOwogICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAogICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQogICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KICAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCi0gICAgICAgICAgICBib29sIHdhc0FjdGl2ZSA9IG91dHB1dERlc2MyLT5pc0FjdGl2ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGJvb2wgd2FzQWN0aXZlID0gcmVtYWluaW5nT3V0cHV0LT5pc0FjdGl2ZSgpOworICAgICAgICAgICAgLy8gTm90ZTogbm8tb3Agb24gdGhlIGNsb3Npbmcgb3V0cHV0IHdoZXJlIGFsbCBjbGllbnRzIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluYWN0aXZlCisgICAgICAgICAgICBkdXBPdXRwdXQtPnNldEFsbENsaWVudHNJbmFjdGl2ZSgpOwogICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCiAgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQogICAgICAgICAgICAgaWYgKHdhc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nT3V0cHV0LT5zdG9wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKQEAgLTQ2MzYsNyArNDkxOCw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCi0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGNsb3NpbmdPdXRwdXQtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CiAgICAgICAgICh2b2lkKSAvKnN0YXR1c190IHN0YXR1cyovIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKQEAgLTQ2NDQsMTAgKzQ5MjYsMzEgQEAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9CiAKLSAgICBvdXRwdXREZXNjLT5jbG9zZSgpOworICAgIGlmIChjbG9zaW5nT3V0cHV0V2FzQWN0aXZlKSB7CisgICAgICAgIGNsb3NpbmdPdXRwdXQtPnN0b3AoKTsKKyAgICB9CisgICAgY2xvc2luZ091dHB1dC0+Y2xvc2UoKTsKIAogICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgIC8vIE1TRCBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gc3VwcG9ydCBhIG5vbi1NU0QgZGlyZWN0IG91dHB1dC4gUmVzZXQgTVNEIHBhdGNoIGlmCisgICAgLy8gbm8gZGlyZWN0IG91dHB1dHMgYXJlIG9wZW4uCisgICAgaWYgKCFnZXRNc2RBdWRpb091dERldmljZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xlYW5VcEVmZmVjdHNGb3JJbyhvdXRwdXQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2NjIsNiArNDk2NSw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTQ2NzIsNTEgKzQ5NzYsNjkgQEAKIAogICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworCisgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSAmJgorICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICB9CisKKyAgICBjbGVhblVwRWZmZWN0c0ZvcklvKGlucHV0KTsKIH0KIAotU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpCiB7CiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwogCi0gICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgIEFMT0dWVigiJXMoKSBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWVigib3V0cHV0ICV6dSBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSUwNHgiLAorICAgICAgICBBTE9HVlYoIm91dHB1dCAlenUgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lcyIsCiAgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKLSAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgewotICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBpZiAob3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydHNBbGxEZXZpY2VzKGRldmljZXMpCisgICAgICAgICAgICAgICAgJiYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICBBTE9HVlYoIiVzKCkgZm91bmQgb3V0cHV0ICVkIiwgX19mdW5jX18sIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb3V0cHV0czsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBvbk91dHB1dHNDaGVja2VkKQogewotICAgIGlmIChvdXRwdXRzMS5zaXplKCkgIT0gb3V0cHV0czIuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgY2hlY2tTZWNvbmRhcnlPdXRwdXRzKCk7CisgICAgaWYgKG9uT3V0cHV0c0NoZWNrZWQgIT0gbnVsbHB0ciAmJiBvbk91dHB1dHNDaGVja2VkKCkpIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGlmIChtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpICE9IDApIHsKKyAgICAgICAgc2V0TXNkUGF0Y2goKTsKICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzMS5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAob3V0cHV0czFbaV0gIT0gb3V0cHV0czJbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyQXR0cikgY29uc3QKIHsKLSAgICBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG9sZERldmljZSwgbVByZXZpb3VzT3V0cHV0cyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShuZXdEZXZpY2UsIG1PdXRwdXRzKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhsQXR0cikgPT0KKyAgICAgICAgICAgIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMockF0dHIpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKK3sKKyAgICBhdXRvIHBzSWQgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworCisgICAgRGV2aWNlVmVjdG9yIG9sZERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCAwLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgMCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMob2xkRGV2aWNlcywgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMobmV3RGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgLy8gYWxzbyB0YWtlIGludG8gYWNjb3VudCBleHRlcm5hbCBwb2xpY3ktcmVsYXRlZCBjaGFuZ2VzOiBhZGQgYWxsIG91dHB1dHMgd2hpY2ggYXJlCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvbGljaWVzIGluIHRoZSAiYmVmb3JlIiBhbmQgImFmdGVyIiBvdXRwdXQgdmVjdG9ycwotICAgIEFMT0dWVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIik7CisgICAgQUxPR1ZWKCIlcygpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIiwgX19mdW5jX18pOwogICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1QcmV2aW91c091dHB1dHMuc2l6ZSgpIDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewpAQCAtNDczMiw3ICs1MDU0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICBpZiAoc3JjT3V0cHV0cyAhPSBkc3RPdXRwdXRzKSB7CiAgICAgICAgIC8vIGdldCBtYXhpbXVtIGxhdGVuY3kgb2YgYWxsIHNvdXJjZSBvdXRwdXRzIHRvIGRldGVybWluZSB0aGUgbWluaW11bSBtdXRlIHRpbWUgZ3VhcmFudGVlaW5nCiAgICAgICAgIC8vIGF1ZGlvIGZyb20gaW52YWxpZGF0ZWQgdHJhY2tzIHdpbGwgYmUgcmVuZGVyZWQgd2hlbiB1bm11dGluZwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKQEAgLTQ3NDIsNDggKzUwNjQsNjQgQEAKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIEFMT0dWX0lGKCEoc3JjT3V0cHV0cy5pc0VtcHR5KCkgfHwgZHN0T3V0cHV0cy5pc0VtcHR5KCkpLAorICAgICAgICAgICAgICAiJXM6IHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJXMgdG8gb3V0cHV0ICVzIiwgX19mdW5jX18sIHBzSWQsCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHNyY091dHB1dHNbMF0pLmNfc3RyKCksCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGRzdE91dHB1dHNbMF0pLmNfc3RyKCkpOwogICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzcmNPdXQgOiBzcmNPdXRwdXRzKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVGb3Ioc3JjT3V0KTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSkpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzSWQpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHBzSWQsIHRydWUsIGRlc2MpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwc0lkLCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0LCBzdHJhdGVneSk7CisgICAgICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2UgPSBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoc3JjT3V0LCBhdHRyKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9Ci0gICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIChhbmQgbGlua2VkKSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHNJZCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQogewotICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKLSAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1NlY29uZGFyeU91dHB1dHMoKSB7CisgICAgc3RkOjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gc3RyZWFtc1RvSW52YWxpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzY3JpcHRvciA9IG1PdXRwdXRzW2ldOworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCA6IG91dHB1dERlc2NyaXB0b3ItPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlEZXNjczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGNsaWVudC0+YXR0cmlidXRlcygpLCBjbGllbnQtPnVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5mbGFncygpLCBkZXNjLCAmc2Vjb25kYXJ5RGVzY3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSyB8fAorICAgICAgICAgICAgICAgICFzdGQ6OmVxdWFsKGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA6IHN0cmVhbXNUb0ludmFsaWRhdGUpIHsKKyAgICAgICAgQUxPR0QoIiVzIEludmFsaWRhdGUgc3RyZWFtICVkIGR1ZSB0byBzZWNvbmRhcnkgb3V0cHV0IGNoYW5nZSIsIF9fZnVuY19fLCBzdHJlYW0pOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQpAQCAtNDgzNiwxMDggKzUxNzQsODcgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQorRGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZm9yY2VkIGJ5IHBhdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYW4gYWN0aXZlIHN0cmVhbSBvbiB0aGlzIG91dHB1dCBhbmQKLSAgICAvLyB1c2UgaXQgaW4gcHJpb3JpdHkgYmVmb3JlIGFueSBvdGhlciBydWxlCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShvdXRwdXREZXNjLCBQUk9EVUNUX1NUUkFURUdZX05PTkUsIGFjdGl2ZSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQogCi0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBMZWdhY3kgRW5naW5lIGNhbm5vdCB0YWtlIGNhcmUgb2YgYnVzIGRldmljZXMgYW5kIG1peCwgc28gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNvbmZsaWN0CisgICAgLy8gb2Ygc2V0Rm9yY2VVc2UgLyBEZWZhdWx0IEJ1cyBkZXZpY2UgaGVyZQorICAgIGRldmljZSA9IG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQob3V0cHV0RGVzYywgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpOworICAgICAgICBhdXRvIGF0dHIgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKworICAgICAgICBpZiAoKGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmCisgICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSkgfHwKKyAgICAgICAgICAgICAoKGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fQUxBUk0pIHx8IGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkpICYmCisgICAgICAgICAgICAgICAgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSB8fAorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgeworICAgICAgICAgICAgLy8gUmV0cmlldmFsIG9mIGRldmljZXMgZm9yIHZvaWNlIERMIGlzIGRvbmUgb24gcHJpbWFyeSBvdXRwdXQgcHJvZmlsZSwgY2Fubm90CisgICAgICAgICAgICAvLyBjaGVjayB0aGUgcm91dGUgKHdvdWxkIGZvcmNlIG1vZGlmeWluZyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgcHJvZmlsZSkKKyAgICAgICAgICAgIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmcm9tQ2FjaGUpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6Ci0gICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMzogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkKLSAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KLSAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQotICAgIC8vIDg6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgotICAgIC8vIDk6IHRoZSBzdHJhdGVneSBmb3IgYmVhY29uLCBhLmsuYS4gInRyYW5zbWl0dGVkIHRocm91Z2ggc3BlYWtlciIgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSB0LXQtcwotCi0gICAgLy8gRklYTUU6IGV4dGVuZCB1c2Ugb2YgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZSgpIHRvIGFsbCBzdHJhdGVnaWVzCi0gICAgLy8gd2l0aCBhIHJlZmluZWQgcnVsZSBjb25zaWRlcmluZyBtdXR1YWxseSBleGNsdXNpdmUgZGV2aWNlcyAodXNpbmcgc2FtZSBiYWNrZW5kKQotICAgIC8vIGFzIG9wcG9zZWQgdG8gYWxsIHN0cmVhbXMgb24gdGhlIHNhbWUgYXVkaW8gSEFMIG1vZHVsZS4KLSAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAotICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX01FRElBKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRFRNRikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1JFUk9VVElORykpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HLCBmcm9tQ2FjaGUpOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7CisgICAgQUxPR1YoIiVzIHNlbGVjdGVkIGRldmljZXMgJXMiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIHJldHVybiBkZXZpY2VzOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5nZXREZXZpY2UoKS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+Z2V0RGV2aWNlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKLSAgICAvLyBBVURJT19ERVZJQ0VfTk9ORSwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZSh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOworICAgIGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXREZXNjLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgYWN0aXZlLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICB9Ci0gICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShzb3VyY2UpOworCisgICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCisgICAgLy8gYSBudWxsIHNwPD4sIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKTsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIH0KKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHJldHVybiBkZXZpY2U7CkBAIC00OTQ4LDY1ICs1MjY1LDUwIEBACiAgICAgcmV0dXJuIChzdHJlYW0xID09IHN0cmVhbTIpOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOwotfQotCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKLSAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCi0gICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KLSAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgLy8gZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuCisgICAgLy8gZW5naW5lJ3MgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSB3b3VsZCBmYWxsYmFjayBvbiBpdHMgZGVmYXVsdCBiZWhhdmlvciAobW9zdCBwcm9iYWJseQorICAgIC8vIGRldmljZSBmb3IgbXVzaWMgc3RyZWFtKSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CiAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgeworICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsKKyAgICAgICAgIGN1clN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoY3VyU3RyZWFtICsgMSkpIHsKKyAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCBjdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgeworICAgICAgICBEZXZpY2VWZWN0b3IgY3VyRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oY3VyU3RyZWFtLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBkZXZpY2VzLm1lcmdlKGN1ckRldmljZXMpOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2VzKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgY3VyRGV2aWNlcyB8PSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShjdXJTdHJlYW0pKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMubWVyZ2Uob3V0cHV0RGVzYy0+ZGV2aWNlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkZXZpY2VzIHw9IGN1ckRldmljZXM7CiAgICAgfQogCisgICAgLy8gRmF2b3IgZGV2aWNlcyBzZWxlY3RlZCBvbiBhY3RpdmUgc3RyZWFtcyBpZiBhbnkgdG8gcmVwb3J0IGNvcnJlY3QgZGV2aWNlIGluIGNhc2Ugb2YKKyAgICAvLyBleHBsaWNpdCBkZXZpY2Ugc2VsZWN0aW9uCisgICAgaWYgKCFhY3RpdmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBkZXZpY2VzID0gYWN0aXZlRGV2aWNlczsKKyAgICB9CiAgICAgLypGaWx0ZXIgU1BFQUtFUl9TQUZFIG91dCBvZiByZXN1bHRzLCBhcyBBdWRpb1NlcnZpY2UgZG9lc24ndCBrbm93IGFib3V0IGl0CiAgICAgICBhbmQgZG9lc24ndCByZWFsbHkgbmVlZCB0by4qLwotICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKLSAgICAgICAgZGV2aWNlcyB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGRldmljZXMgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpOworICAgIGlmICghc3BlYWtlclNhZmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBkZXZpY2VzLm1lcmdlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7CisgICAgICAgIGRldmljZXMucmVtb3ZlKHNwZWFrZXJTYWZlRGV2aWNlcyk7CiAgICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1yb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9QQVRDSCwiZ2V0U3RyYXRlZ3koKSBjYWxsZWQgZm9yIEFVRElPX1NUUkVBTV9QQVRDSCIpOwotICAgIHJldHVybiBtRW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKLSAgICAvLyBmbGFncyB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihtRW5naW5lLT5nZXRTdHJhdGVneUZvclVzYWdlKGF0dHItPnVzYWdlKSk7CisgICAgcmV0dXJuIGRldmljZXMudHlwZXMoKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKICAgICBzd2l0Y2goc3RyZWFtKSB7CiAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9OT1RJRklDQVRJT04pKTsKICAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTUwNTcsMTEgKzUzNTksMTAgQEAKICAgICAgICAgLy8gbXV0ZS91bm11dGUgQVVESU9fU1RSRUFNX1RUUyBvbiBhbGwgb3V0cHV0cwogICAgICAgICBBTE9HVigiXHQgbXV0aW5nICVkIiwgbXV0ZSk7CiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOworICAgICAgICBhdXRvIHR0c1ZvbHVtZVNvdXJjZSA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKEFVRElPX1NUUkVBTV9UVFMsIG11dGUvKm9uKi8sCi0gICAgICAgICAgICAgICAgICAgIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgIDAgLypkZWxheSovLCBBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKHR0c1ZvbHVtZVNvdXJjZSwgbXV0ZS8qb24qLywgZGVzYywgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwogICAgICAgICAgICAgaWYgKGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7CiAgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGxhdGVuY3k7CkBAIC01MDczLDQwICs1Mzc0LDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKLXsKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhIHN0cmVhbSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgLy8gc3BlY2lmaWVkIHN0cmF0ZWd5IGFuZCB1c2UgaXQgaW4gcHJpb3JpdHkgb3ZlciBkZWZhdWx0IHJvdXRpbmcgcnVsZXMuCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwotICAgICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3JjZWREZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZnJvbUNhY2hlKSB7Ci0gICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOwotICAgIH0KLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICB9CisgICAgbUVuZ2luZS0+dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CiB9CiAKIHVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcHJldkRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KQEAgLTUxMTcsMzQgKzUzOTIsMzYgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzLnNpemUoKSA+PSAyKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGN1ckRldmljZSA9IGN1ckRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiAoY3VyRGV2aWNlICYgZGV2aWNlKSAmJiAoY3VyRGV2aWNlICE9IGRldmljZSk7CisgICAgYXV0byBwcm9kdWN0U3RyYXRlZ2llcyA9IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpOworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogcHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0KKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBjdXJEZXZpY2VzID0gY3VyRGV2aWNlcy5maWx0ZXIob3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiBjdXJEZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXZpY2VzKSAmJiBjdXJEZXZpY2VzICE9IGRldmljZXM7CiAgICAgICAgIGJvb2wgZG9NdXRlID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pIHsKKyAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKXsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5LCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRvTXV0ZSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCBvdXRwdXQgaWYgaXQgZG9lcyBub3Qgc2hhcmUgYW55IGRldmljZSB3aXRoIGN1cnJlbnQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgaWYgKChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zQXRMZWFzdE9uZShvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlenUgKGN1ckRldmljZSAlMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgbXV0ZSwgZGVzYywgbXV0ZSA/IDAgOiBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWVigiJXMoKSAlcyAoY3VyRGV2aWNlICVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGN1ckRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHJvZHVjdFN0cmF0ZWd5LCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CkBAIC01MTYyLDIyICs1NDM5LDE5IEBACiAKICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCiAgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcwotICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlcyAhPSBwcmV2RGV2aWNlcykpIHsKICAgICAgICAgdWludDMyX3QgdGVtcE11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOwogICAgICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiBpcyBjb25zZXJ2YXRpdmVseSBzZXQgdG8gNCB0aW1lcyB0aGUgcmVwb3J0ZWQgbGF0ZW5jeQogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZUR1cmF0aW9uTXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiA0OwogICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IHRlbXBNdXRlV2FpdE1zKSB7CiAgICAgICAgICAgICBtdXRlV2FpdE1zID0gdGVtcE11dGVXYWl0TXM7CiAgICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0YXJ0IHRoZSB0ZW1wb3JhcnkgbXV0ZSBwZXJpb2QgdG9vIGVhcmx5IGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYywgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlLCBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLCBkZXZpY2UpOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmFjdGl2ZVZzIDogb3V0cHV0RGVzYy0+Z2V0QWN0aXZlVm9sdW1lU291cmNlcygpKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RhcnQgdGhlIHRlbXBvcmFyeSBtdXRlIHBlcmlvZCB0b28gZWFybHkgaW4gY2FzZSBvZgorICAgICAgICAgICAgLy8gZGVsYXllZCBkZXZpY2UgY2hhbmdlCisgICAgICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKGFjdGl2ZVZzLCB0cnVlLCBvdXRwdXREZXNjLCBkZWxheU1zKTsKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUoYWN0aXZlVnMsIGZhbHNlLCBvdXRwdXREZXNjLCBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MTkwLDQ2ICs1NDY0LDQ2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrKQogewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgZGV2aWNlLCBkZWxheU1zKTsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBBTE9HVigiJXMgZGV2aWNlICVzIGRlbGF5TXMgJWQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGRlbGF5TXMpOwogICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CiAKICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgbnVsbHB0ciAvKiBhZGRyZXNzICovLCByZXF1aXJlc011dGVDaGVjayk7Ci0gICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKLSAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2VzLCBmb3JjZSwgZGVsYXlNcywKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCByZXF1aXJlc011dGVDaGVjayk7CisgICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZXMsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQotICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50Ci0gICAgLy8gb3V0cHV0IHByb2ZpbGUKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCiAgICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAotICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IG91dHB1dERlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CisgICAgRGV2aWNlVmVjdG9yIHByZXZEZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UgPSBvdXRwdXREZXNjLT5tRGV2aWNlOworICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUgb3IgaWYgbmV3IGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIEFORCBwcmV2aW91cyBkZXZpY2UocykgaXMoYXJlKSBzdGlsbAorICAgIC8vIGF2YWlsYWJsZSAob3RoZXJ3aXNlIHJlc2V0IGRldmljZSBtdXN0IGJlIGRvbmUgb24gdGhlIG91dHB1dCkKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpICYmIGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5maWx0ZXIocHJldkRldmljZXMpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgJXMgZm9yIG91dHB1dCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlIDB4JTA0eCIsIHByZXZEZXZpY2UpOworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2VzKCkgcHJldkRldmljZSAlcyIsIHByZXZEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKCFmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIG91dHB1dERlc2MtPnNldERldmljZXMoZmlsdGVyZWREZXZpY2VzKTsKICAgICB9CiAKICAgICAvLyBpZiB0aGUgb3V0cHV0cyBhcmUgbm90IG1hdGVyaWFsbHkgYWN0aXZlLCB0aGVyZSBpcyBubyBuZWVkIHRvIG11dGUuCiAgICAgaWYgKHJlcXVpcmVzTXV0ZUNoZWNrKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlcywgZGVsYXlNcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiVzOiBzdXBwcmVzc2luZyBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIiwgX19mdW5jX18pOwogICAgICAgICBtdXRlV2FpdE1zID0gMDsKQEAgLTUyNDAsODkgKzU1MTQsMzIgQEAKICAgICAvLyAgICAgIE9SIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlCiAgICAgLy8gIEFORCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkCiAgICAgLy8gIEFORCB0aGUgb3V0cHV0IGlzIGNvbm5lY3RlZCBieSBhIHZhbGlkIGF1ZGlvIHBhdGNoLgotICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucwotICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJgotICAgICAgICAhZm9yY2UgJiYKLSAgICAgICAgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlIDB4JTA0eCBvciBudWxsIGRldmljZSIsIGRldmljZSk7CisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlcygpIHdpdGhvdXQgY29uZGl0aW9ucworICAgIGlmICgoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSB8fCBmaWx0ZXJlZERldmljZXMgPT0gcHJldkRldmljZXMpICYmCisgICAgICAgICAgICAhZm9yY2UgJiYgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCIlcyBzZXR0aW5nIHNhbWUgZGV2aWNlICVzIG9yIG51bGwgZGV2aWNlLCBmb3JjZT0lZCwgcGF0Y2ggaGFuZGxlPSVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGZvcmNlLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQogCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNoYW5naW5nIGRldmljZSIpOworICAgIEFMT0dWKCIlcyBjaGFuZ2luZyBkZXZpY2UgdG8gJXMiLCBfX2Z1bmNfXywgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyBkbyB0aGUgcm91dGluZwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZWxheU1zLCBOVUxMKTsKICAgICB9IGVsc2UgewotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKLSAgICAgICAgaWYgKChhZGRyZXNzID09IE5VTEwpIHx8IChzdHJsZW4oYWRkcmVzcykgPT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uob3V0cHV0RGVzYyk7CisgICAgICAgIEFMT0dfQVNTRVJUKGZpbHRlcmVkRGV2aWNlcy5zaXplKCkgPD0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYLCAiVG9vIG1hbnkgc2luayBwb3J0cyIpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmZpbHRlcmVkRGV2aWNlIDogZmlsdGVyZWREZXZpY2VzKSB7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhmaWx0ZXJlZERldmljZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAwOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKLSAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKLSAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbmZvcm0gYWxsIGlucHV0IGFzIHdlbGwKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGlucHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGluZm9ybSBpbnB1dCAlZCBvZiBkZXZpY2U6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpbnB1dENtZC5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENtZC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIG91dHB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBkZWxheU1zKTsKICAgICB9CiAKICAgICAvLyB1cGRhdGUgc3RyZWFtIHZvbHVtZXMgYWNjb3JkaW5nIHRvIG5ldyBkZXZpY2UKLSAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgZmlsdGVyZWREZXZpY2VzLnR5cGVzKCksIGRlbGF5TXMpOwogCiAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiB9CkBAIC01MzUxLDYzICs1NTY4LDMwIEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB8fCBmb3JjZSkpIHsKLSAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlmICgoZGV2aWNlICE9IG51bGxwdHIpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+Z2V0RGV2aWNlKCkpIHx8IGZvcmNlKSkgeworICAgICAgICBpbnB1dERlc2MtPnNldERldmljZShkZXZpY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgaW5wdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoaW5wdXREZXNjLAogICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgogICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgICAgICAgICBbaW5wdXREZXNjXShjb25zdCBQYXRjaEJ1aWxkZXI6Om1peF91c2VjYXNlX3QmIHVzZWNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdXNlY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgfSkuCiAgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93Ci0gICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGRldmljZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIHBhdGNoSGFuZGxlLCBpbnB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCAwKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNTQzNiw4ICs1NjIwLDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKQEAgLTU0NTcsNyArNTY0MCw3IEBACiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpIHsKICAgICAgICAgICAgIC8vIHByb2ZpbGUtPmxvZygpOwogICAgICAgICAgICAgLy91cGRhdGVkRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2aWNlKSwgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LCAgICAgICAvKnVwZGF0ZWRGb3JtYXQqLwpAQCAtNTQ2OCw3ICs1NjUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzKi8pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmlyc3RJbmV4YWN0ID09IG51bGxwdHIgJiYgcHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICBpZiAoZmlyc3RJbmV4YWN0ID09IG51bGxwdHIgJiYgcHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGRhdGVkU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LApAQCAtNTQ5Miw4MyArNTY3NSw2MCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpCi17Ci0gICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgYXVkaW9fZGV2aWNlc190IHNlbGVjdGVkRGV2aWNlRnJvbU1peCA9Ci0gICAgICAgICAgIG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgYXZhaWxhYmxlRGV2aWNlVHlwZXMsIHBvbGljeU1peCk7Ci0KLSAgICBpZiAoc2VsZWN0ZWREZXZpY2VGcm9tTWl4ICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZERldmljZUZyb21NaXg7Ci0gICAgfQotICAgIHJldHVybiBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQotewotICAgIC8vIFJvdXRpbmcKLSAgICAvLyBTY2FuIHRoZSB3aG9sZSBSb3V0ZU1hcCB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCByb3V0ZToKLSAgICAvLyBpZiB0aGUgaW5wdXQgc291cmNlIGluIHRoZSBSb3V0ZU1hcCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgYWJvdmUsCi0gICAgLy8gYW5kIGFjdGl2aXR5IGNvdW50IGlzIG5vbi16ZXJvIGFuZCB0aGUgZGV2aWNlIGluIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQotICAgIC8vIHRoZW4gc2VsZWN0IHRoaXMgZGV2aWNlLgotICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbUlucHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7Ci0gICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7Ci0gICAgICAgICBpZiAoKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlKSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKSAmJgotICAgICAgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvcikgPj0gMCkpIHsKLSAgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1mbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCitmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgZmxvYXQgdm9sdW1lREIgPSBtVm9sdW1lQ3VydmVzLT52b2xJbmRleFRvRGIoc3RyZWFtLCBWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KGRldmljZSksIGluZGV4KTsKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGN1cnZlcy52b2xJbmRleFRvRGIoVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBpbmRleCk7CiAKICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugb2YgYWNjZXNzaWJpbGl0eSBhY3RpdmUgd2hpbGUgYSByaW5ndG9uZSBpcyBwbGF5aW5nOiBpZiB0aGUgcmluZ3RvbmUgaXMgbXVjaAogICAgIC8vIGxvdWRlciB0aGFuIHRoZSBhY2Nlc3NpYmlsaXR5IHByb21wdCwgdGhlIHByb21wdCBjYW5ub3QgYmUgaGVhcmQsIHRodXMgbWFza2luZyB0aGUgdG91Y2gKICAgICAvLyBleHBsb3JhdGlvbiBvZiB0aGUgZGlhbGVyIFVJLiBJbiB0aGlzIHNpdHVhdGlvbiwgYnJpbmcgdGhlIGFjY2Vzc2liaWxpdHkgdm9sdW1lIGNsb3NlciB0bwogICAgIC8vIHRoZSByaW5ndG9uZSB2b2x1bWUKLSAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkKLSAgICAgICAgICAgICYmIChBVURJT19NT0RFX1JJTkdUT05FID09IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSkKLSAgICAgICAgICAgICYmIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HLCAwKSkgewotICAgICAgICBjb25zdCBmbG9hdCByaW5nVm9sdW1lREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9SSU5HLCBpbmRleCwgZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEQiAtIDQgPiB2b2x1bWVEQiA/IHJpbmdWb2x1bWVEQiAtIDQgOiB2b2x1bWVEQjsKKyAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgY29uc3QgYXV0byByaW5nVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpOworICAgIGNvbnN0IGF1dG8gbXVzaWNWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pOworCisgICAgaWYgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkKKyAgICAgICAgICAgICYmIChBVURJT19NT0RFX1JJTkdUT05FID09IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSkgJiYKKyAgICAgICAgICAgIG1PdXRwdXRzLmlzQWN0aXZlKHJpbmdWb2x1bWVTcmMsIDApKSB7CisgICAgICAgIGF1dG8gJnJpbmdDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX1JJTkcpOworICAgICAgICBjb25zdCBmbG9hdCByaW5nVm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKHJpbmdDdXJ2ZXMsIHJpbmdWb2x1bWVTcmMsIGluZGV4LCBkZXZpY2UpOworICAgICAgICByZXR1cm4gcmluZ1ZvbHVtZURiIC0gNCA+IHZvbHVtZURiID8gcmluZ1ZvbHVtZURiIC0gNCA6IHZvbHVtZURiOwogICAgIH0KIAotICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgZWFycGllY2Ugdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCi0gICAgaWYgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSAmJgotICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKLSAgICAgICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTogewotICAgICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPQotICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IG1heFZvaWNlVm9sRGIgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvaWNlVm9sdW1lSW5kZXgsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpCisgICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KKyAgICBpZiAoKHZvbHVtZVNvdXJjZSAhPSBjYWxsVm9sdW1lU3JjICYmIChpc0luQ2FsbCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KGNhbGxWb2x1bWVTcmMpKSkgJiYKKyAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYyB8fCB2b2x1bWVTb3VyY2UgPT0gbXVzaWNWb2x1bWVTcmMgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9EVE1GKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkpKSB7CisgICAgICAgIGF1dG8gJnZvaWNlQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGNhbGxWb2x1bWVTcmMpOworICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9IHZvaWNlQ3VydmVzLmdldFZvbHVtZUluZGV4KGRldmljZSk7CisgICAgICAgIGNvbnN0IGZsb2F0IG1heFZvaWNlVm9sRGIgPQorICAgICAgICAgICAgICAgIGNvbXB1dGVWb2x1bWUodm9pY2VDdXJ2ZXMsIGNhbGxWb2x1bWVTcmMsIHZvaWNlVm9sdW1lSW5kZXgsIGRldmljZSkKICAgICAgICAgICAgICAgICArIElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREI7Ci0gICAgICAgICAgICBpZiAodm9sdW1lREIgPiBtYXhWb2ljZVZvbERiKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUoKSBzdHJlYW0gJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSBzdHJlYW0gJWQgYXQgdm9sPSVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lREIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBtYXhWb2ljZVZvbERiKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1heFZvaWNlVm9sRGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEZJWE1FOiBXb3JrYXJvdW5kIGZvciBjYWxsIHNjcmVlbmluZyBhcHBsaWNhdGlvbnMgdW50aWwgYSBwcm9wZXIgYXVkaW8gbW9kZSBpcyBkZWZpbmVkCisgICAgICAgIC8vIHRvIHN1cHBvcnQgdGhpcyBzY2VuYXJpbyA6IEV4ZW1wdCB0aGUgUklORyBzdHJlYW0gZnJvbSB0aGUgYXVkaW8gY2FwIGlmIHRoZSBhdWRpbyB3YXMKKyAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBtdXRlZC4KKyAgICAgICAgLy8gVk9JQ0VfQ0FMTCBzdHJlYW0gaGFzIG1pblZvbHVtZUluZGV4ID4gMCA6IFVzZXJzIGNhbm5vdCBzZXQgdGhlIHZvbHVtZSBvZiB2b2ljZSBjYWxscyB0bworICAgICAgICAvLyAwLiBXZSBkb24ndCB3YW50IHRvIGNhcCB2b2x1bWUgd2hlbiB0aGUgc3lzdGVtIGhhcyBwcm9ncmFtbWF0aWNhbGx5IG11dGVkIHRoZSB2b2ljZSBjYWxsCisgICAgICAgIC8vIHN0cmVhbS4gU2VlIHNldFZvbHVtZUN1cnZlSW5kZXgoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgYm9vbCBleGVtcHRGcm9tQ2FwcGluZyA9ICh2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgJiYgKHZvaWNlVm9sdW1lSW5kZXggPT0gMCk7CisgICAgICAgIEFMT0dWX0lGKGV4ZW1wdEZyb21DYXBwaW5nLCAiJXMgdm9sdW1lIHNvdXJjZSAlZCBhdCB2b2w9JWYgbm90IGNhcHBlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIHZvbHVtZURiKTsKKyAgICAgICAgaWYgKCh2b2x1bWVEYiA+IG1heFZvaWNlVm9sRGIpICYmICFleGVtcHRGcm9tQ2FwcGluZykgeworICAgICAgICAgICAgQUxPR1YoIiVzIHZvbHVtZSBzb3VyY2UgJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSB2b2x1bWUgZ3JvdXAgJWQgYXQgdm9sPSVmIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIHZvbHVtZURiLCBjYWxsVm9sdW1lU3JjLCBtYXhWb2ljZVZvbERiKTsKKyAgICAgICAgICAgIHZvbHVtZURiID0gbWF4Vm9pY2VWb2xEYjsKICAgICAgICAgfQogICAgIH0KLQogICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucwogICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKICAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCkBAIC01NTc2LDExMCArNTczNiwxMzcgQEAKICAgICAvLyBzcGVha2VyIGlzIHBhcnQgb2YgdGhlIHNlbGVjdCBkZXZpY2VzCiAgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKICAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpICYmCi0gICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkKLSAgICAgICAgICAgICAgICB8fCAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCi0gICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkpIHsKKyAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKKyAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSB8CisgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpKSAmJgorICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwKKyAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpIHx8CisgICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSkgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pKSB8fAorICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSkgJiYKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICAgICAgY3VydmVzLmNhbkJlTXV0ZWQoKSkgeworCiAgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKICAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKICAgICAgICAgLy8ganVzdCBzdG9wcGVkCiAgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAogICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7Ci0gICAgICAgICAgICB2b2x1bWVEQiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7Ci0gICAgICAgICAgICBmbG9hdCBtaW5Wb2xEQiA9IChtdXNpY1ZvbERCID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQikgPwotICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERCIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKLSAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1pblZvbERCKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lREIgPSBtaW5Wb2xEQjsKLSAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEQiwgbXVzaWNWb2xEQik7CisgICAgICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKKyAgICAgICAgICAgIGF1dG8gJm11c2ljQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERiID0gY29tcHV0ZVZvbHVtZShtdXNpY0N1cnZlcywgbXVzaWNWb2x1bWVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0N1cnZlcy5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbERiID0gKG11c2ljVm9sRGIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERiIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKKyAgICAgICAgICAgIGlmICh2b2x1bWVEYiA+IG1pblZvbERiKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtaW5Wb2xEYjsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEYiwgbXVzaWNWb2xEYik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKICAgICAgICAgICAgICAgICAvLyBvbiBBMkRQLCBhbHNvIGVuc3VyZSBub3RpZmljYXRpb24gdm9sdW1lIGlzIG5vdCB0b28gbG93IGNvbXBhcmVkIHRvIG1lZGlhIHdoZW4KICAgICAgICAgICAgICAgICAvLyBpbnRlbmRlZCB0byBiZSBwbGF5ZWQKLSAgICAgICAgICAgICAgICBpZiAoKHZvbHVtZURCID4gLTk2LjBmKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQiA+IHZvbHVtZURCKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBpbmNyZWFzaW5nIHZvbHVtZSBmb3Igc3RyZWFtPSVkIGRldmljZT0weCVYIGZyb20gJWYgdG8gJWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURCLCBtdXNpY1ZvbERCIC0gU09OSUZJQ0FUSU9OX0EyRFBfTUFYX01FRElBX0RJRkZfREIpOwotICAgICAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQjsKKyAgICAgICAgICAgICAgICBpZiAoKHZvbHVtZURiID4gLTk2LjBmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG11c2ljVm9sRGIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQiA+IHZvbHVtZURiKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgaW5jcmVhc2luZyB2b2x1bWUgZm9yIHZvbHVtZSBzb3VyY2U9JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2b2x1bWVTb3VyY2UsIGRldmljZSwgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7CisgICAgICAgICAgICAgICAgICAgIHZvbHVtZURiID0gbXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHx8Ci0gICAgICAgICAgICAgICAgc3RyZWFtX3N0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgdm9sdW1lREIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKKyAgICAgICAgICAgICAgICAgICAoISh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpKSkgeworICAgICAgICAgICAgdm9sdW1lRGIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB2b2x1bWVEQjsKKyAgICByZXR1cm4gdm9sdW1lRGI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIGZyb21Wb2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKQogewotICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAotICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0pOworICAgIGlmIChmcm9tVm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKSB7CisgICAgICAgIHJldHVybiBzcmNJbmRleDsKKyAgICB9CisgICAgYXV0byAmc3JjQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGZyb21Wb2x1bWVTb3VyY2UpOworICAgIGF1dG8gJmRzdEN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyh0b1ZvbHVtZVNvdXJjZSk7CisgICAgZmxvYXQgbWluU3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpOworICAgIGZsb2F0IG1heFNyYyA9IChmbG9hdClzcmNDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKKyAgICBmbG9hdCBtaW5Ec3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4RHN0ID0gKGZsb2F0KWRzdEN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworCisgICAgLy8gcHJlc2VydmUgbXV0ZSByZXF1ZXN0IG9yIGNvcnJlY3QgcmFuZ2UKKyAgICBpZiAoc3JjSW5kZXggPCBtaW5TcmMpIHsKKyAgICAgICAgaWYgKHNyY0luZGV4ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNyY0luZGV4ID0gbWluU3JjOworICAgIH0gZWxzZSBpZiAoc3JjSW5kZXggPiBtYXhTcmMpIHsKKyAgICAgICAgc3JjSW5kZXggPSBtYXhTcmM7CisgICAgfQorICAgIHJldHVybiAoaW50KShtaW5Ec3QgKyAoKHNyY0luZGV4IC0gbWluU3JjKSAqIChtYXhEc3QgLSBtaW5Ec3QpKSAvIChtYXhTcmMgLSBtaW5TcmMpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgYXR0cmlidXRlcyB2b2x1bWUgaWYgdGhlIGF0dHJpYnV0ZXMgaXMgbXV0ZWQKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgIEFMT0dWVigiJXM6IHZvbHVtZSBzb3VyY2UgJWQgbXV0ZWQgY291bnQgJWQgYWN0aXZlPSVkIiwgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmdldE11dGVDb3VudCh2b2x1bWVTb3VyY2UpLCBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KKyAgICBWb2x1bWVTb3VyY2UgY2FsbFZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICBWb2x1bWVTb3VyY2UgYnRTY29Wb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyk7CisgICAgYm9vbCBpc1ZvaWNlVm9sU3JjID0gY2FsbFZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisgICAgYm9vbCBpc0J0U2NvVm9sU3JjID0gYnRTY29Wb2xTcmMgPT0gdm9sdW1lU291cmNlOworCiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZUZvckNvbW0gPQogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKTsKICAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKLSAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBmb3JjZVVzZUZvckNvbW0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKLSAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyAmJiBmb3JjZVVzZUZvckNvbW0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpIHsKLSAgICAgICAgQUxPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAotICAgICAgICAgICAgIHN0cmVhbSwgZm9yY2VVc2VGb3JDb21tKTsKKyAgICAvLyBpZiBzY28gYW5kIGNhbGwgZm9sbG93IHNhbWUgY3VydmVzLCBieXBhc3MgZm9yY2VVc2VGb3JDb21tCisgICAgaWYgKChjYWxsVm9sU3JjICE9IGJ0U2NvVm9sU3JjKSAmJgorICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwgX19mdW5jX18sCisgICAgICAgICAgICAgdm9sdW1lU291cmNlLCBmb3JjZVVzZUZvckNvbW0pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CiAgICAgfQogCi0gICAgZmxvYXQgdm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIGRldmljZSk7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBjb21wdXRlVm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLCBpbmRleCwgZGV2aWNlKTsKICAgICBpZiAob3V0cHV0RGVzYy0+aXNGaXhlZFZvbHVtZShkZXZpY2UpIHx8CiAgICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08KLSAgICAgICAgICAgICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgJiYKLSAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKSkgeworICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjIHx8IGlzQnRTY29Wb2xTcmMpICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApKSB7CiAgICAgICAgIHZvbHVtZURiID0gMC4wZjsKICAgICB9CisgICAgb3V0cHV0RGVzYy0+c2V0Vm9sdW1lKHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKIAotICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSh2b2x1bWVEYiwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKLQotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwKLSAgICAgICAgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgaWYgKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgewogICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKLSAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAotICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBvciBtdXRlIGZvciBCbHVldG9vdGggU0NPIGFzIG90aGVyIGF0dGVudWF0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoaXNWb2ljZVZvbFNyYykgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KWN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IGluZGV4ID09IDAgPyAwLjAgOiAxLjA7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKICAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNTY4OSw2MyArNTg3Niw2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBkZXZpY2UgJTA4eCIsIGRldmljZSk7Ci0KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwIDogbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCkpIHsKKyAgICAgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHRvVm9sdW1lU291cmNlKHZvbHVtZUdyb3VwKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lR3JvdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwgb3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBzb3VyY2VzVG9NdXRlOworICAgIGZvciAoYXV0byBhdHRyaWJ1dGVzOiBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KSkgeworICAgICAgICBBTE9HVlYoIiVzKCkgYXR0cmlidXRlcyAlcywgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLCBvbiwgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgICAgIFZvbHVtZVNvdXJjZSBzb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzb3VyY2VzVG9NdXRlKSwgZW5kKHNvdXJjZXNUb011dGUpLCBzb3VyY2UpID09IGVuZChzb3VyY2VzVG9NdXRlKSkgeworICAgICAgICAgICAgc291cmNlc1RvTXV0ZS5wdXNoX2JhY2soc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gc291cmNlIDogc291cmNlc1RvTXV0ZSkgeworICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKHNvdXJjZSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7CisgICAgfQorCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVTb3VyY2VNdXRlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLAotICAgICAgICAgICBzdHJhdGVneSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOwotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17CiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CiAgICAgfQotCi0gICAgQUxPR1ZWKCJzZXRTdHJlYW1NdXRlKCkgc3RyZWFtICVkLCBtdXRlICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKLSAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0sIGRldmljZSk7Ci0KKyAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXModm9sdW1lU291cmNlKTsKICAgICBpZiAob24pIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pICYmCi0gICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzTXV0ZWQodm9sdW1lU291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnZlcy5jYW5CZU11dGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSAhPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIDAsIG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QgaWdub3JlZAotICAgICAgICBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0rKzsKKyAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QKKyAgICAgICAgLy8gaWdub3JlZAorICAgICAgICBvdXRwdXREZXNjLT5pbmNNdXRlQ291bnQodm9sdW1lU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyB1bm11dGluZyBub24gbXV0ZWQgYXR0cmlidXRlcyEiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgZGV2aWNlKSwKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmRlY011dGVDb3VudCh2b2x1bWVTb3VyY2UpID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CkBAIC01NzUzLDEwNiArNTk0MSw5IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1QcmltYXJ5T3V0cHV0OwotICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKLSAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOwotICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1hdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKLXsKLSAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9UVFM7Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9Ci19Ci0KIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSkKIHsKLSAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJhdGVneT8KKyAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJlYW0gdHlwZT8KICAgICBpZiAoKHBhYS0+ZmxhZ3MgJiAoQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIHwgQVVESU9fRkxBR19TQ08gfCBBVURJT19GTEFHX0JFQUNPTikpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNTg4MywzNyArNTk3NCw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBpZiAoKHN5c1RpbWUgPT0gMCkgJiYgKGluUGFzdE1zICE9IDApKSB7Ci0gICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoKChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgfHwKLSAgICAgICAgICAgICAgICAoTlVNX1NUUkFURUdJRVMgPT0gc3RyYXRlZ3kpKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykKLSAgICAgICAgICAgICYmIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3ksIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQogewogICAgIHJldHVybiBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CkBAIC01OTMyLDEwICs1OTkyLDEwIEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYykKIHsKICAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1NvdXJjZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHNvdXJjZURlc2MtPm1EZXZpY2UtPmVxdWFscyhkZXZpY2VEZXNjKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKS0+ZXF1YWxzKGRldmljZURlc2MpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTk2MSwxMjggKzYwMjEsNjcgQEAKICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjLT5tVWlkKTsKICAgICAgICAgfQogICAgIH0KKworICAgIG1JbnB1dHMuY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGRldmljZURlc2MpOworCisgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZURlc2MpOwogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2Ygc3Vycm91bmQgc291bmQgZm9ybWF0cyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cikgewotICAgIEZvcm1hdFZlY3RvciAmZm9ybWF0cyA9ICpmb3JtYXRzUHRyOwotICAgIC8vIFRPRE8gU2V0IHRoaXMgYmFzZWQgb24gQ29uZmlnIHByb3BlcnRpZXMuCi0gICAgY29uc3QgYm9vbCBhbHdheXNGb3JjZUFDMyA9IHRydWU7Cit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bW9kaWZ5U3Vycm91bmRGb3JtYXRzKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBlbmZvcmNlZFN1cnJvdW5kKAorICAgICAgICAgICAgZGV2RGVzYy0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmVuZCgpKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGFsbFN1cnJvdW5kOyAgLy8gQSBmbGF0IHNldCBvZiBhbGwga25vd24gc3Vycm91bmQgZm9ybWF0cworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgYWxsU3Vycm91bmQuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHBhaXIuc2Vjb25kKSBhbGxTdXJyb3VuZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICB9CiAKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwogICAgIEFMT0dEKCIlczogZm9yY2VkIHVzZSA9ICVkIiwgX19GVU5DVElPTl9fLCBmb3JjZVVzZSk7CisgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0aW5nIHNldCBvZiBmb3JtYXRzIGRlcGVuZGluZyBvbiB0aGUgc3Vycm91bmQgbW9kZToKKyAgICAvLyAgICdhbGwgc3Vycm91bmQnID0gYWxsU3Vycm91bmQKKyAgICAvLyAgICdlbmZvcmNlZCBzdXJyb3VuZCcgPSBlbmZvcmNlZFN1cnJvdW5kIFttYXkgaW5jbHVkZSBJRUM2OTEzNyB3aGljaCBpc24ndCByYXcgc3Vycm91bmQgZm10XQorICAgIC8vICAgJ25vbi1zdXJyb3VuZCcgPSBub3QgaW4gJ2FsbCBzdXJyb3VuZCcgYW5kIG5vdCBpbiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gICAnbWFudWFsIHN1cnJvdW5kJyA9IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMKKyAgICAvLyBBVVRPOiAgIGZvcm1hdHMgdiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gQUxXQVlTOiBmb3JtYXRzIHYgJ2FsbCBzdXJyb3VuZCcgdiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gTkVWRVI6ICBmb3JtYXRzIF4gJ25vbi1zdXJyb3VuZCcKKyAgICAvLyBNQU5VQUw6IGZvcm1hdHMgXiAoJ25vbi1zdXJyb3VuZCcgdiAnbWFudWFsIHN1cnJvdW5kJyB2IChJRUM2OTEzNyBeICdlbmZvcmNlZCBzdXJyb3VuZCcpKQogCi0gICAgLy8gSWYgTUFOVUFMLCBrZWVwIHRoZSBzdXBwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyBhcyBjdXJyZW50IGVuYWJsZWQgb25lcy4KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKKyAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMCisgICAgICAgICAgICB8fCBmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeworICAgICAgICAvLyBmb3JtYXRTZXQgaXMgKGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJykKKyAgICAgICAgZm9yIChhdXRvIGZvcm1hdEl0ZXIgPSBmb3JtYXRzUHRyLT5iZWdpbigpOyBmb3JtYXRJdGVyICE9IGZvcm1hdHNQdHItPmVuZCgpOyArK2Zvcm1hdEl0ZXIpIHsKKyAgICAgICAgICAgIGlmIChhbGxTdXJyb3VuZC5jb3VudCgqZm9ybWF0SXRlcikgPT0gMCAmJiBlbmZvcmNlZFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydCgqZm9ybWF0SXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGZvcm1hdHNQdHItPmJlZ2luKCksIGZvcm1hdHNQdHItPmVuZCgpKTsKKyAgICB9CisgICAgZm9ybWF0c1B0ci0+Y2xlYXIoKTsgIC8vIFJlLWZpbGxlZCBmcm9tIHRoZSBmb3JtYXRTZXQgYXQgdGhlIGVuZC4KKwogICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKLSAgICAgICAgZm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3Vycm91bmRGb3JtYXRzLmJlZ2luKCk7IGl0ICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKCppdCk7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQobU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVuZCgpKTsKKyAgICAgICAgLy8gRW5hYmxlIElFQzYxOTM3IHdoZW4gaW4gTUFOVUFMIG1vZGUgaWYgaXQncyBlbmZvcmNlZCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgIGlmIChlbmZvcmNlZFN1cnJvdW5kLmNvdW50KEFVRElPX0ZPUk1BVF9JRUM2MTkzNykgIT0gMCkgeworICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwogICAgICAgICB9Ci0gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZS4KLSAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICB9IGVsc2UgeyAvLyBORVZFUiwgQVVUTyBvciBBTFdBWVMKLSAgICAgICAgLy8gQW5hbHl6ZSBvcmlnaW5hbCBzdXBwb3J0IGZvciB2YXJpb3VzIGZvcm1hdHMuCi0gICAgICAgIGJvb2wgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7Ci0gICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChzc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCAoc3NpemVfdClmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBBTFdBWVMsIHJlbW92ZSBhbGwgb3RoZXIgc3Vycm91bmQgZm9ybWF0cyBoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdpbGwgYWRkIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsgLy8gQVVUTyBvciBBTFdBWVMKKyAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgeworICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydChhbGxTdXJyb3VuZC5iZWdpbigpLCBhbGxTdXJyb3VuZC5lbmQoKSk7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBNb2RpZnkgZm9ybWF0cyBiYXNlZCBvbiBzdXJyb3VuZCBwcmVmZXJlbmNlcy4KLSAgICAgICAgLy8gSWYgTkVWRVIsIHJlbW92ZSBzdXBwb3J0IGZvciBzdXJyb3VuZCBmb3JtYXRzLgotICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQgfHwgc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdXJyb3VuZCBzb3VuZCByZWxhdGVkIGZvcm1hdHMuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IGZvcm1hdHMuc2l6ZSgpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEluZGV4Kys7IC8vIGtlZXAgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gQVVUTyBvciBBTFdBWVMKLSAgICAgICAgICAgIC8vIE1vc3QgVFZzIHN1cHBvcnQgQUMzIGV2ZW4gaWYgdGhleSBkbyBub3QgcmVwb3J0IGl0IGluIHRoZSBFRElELgotICAgICAgICAgICAgaWYgKChhbHdheXNGb3JjZUFDMyB8fCAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzQUMzKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0FDMyk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBBTFdBWVMsIGFkZCBzdXBwb3J0IGZvciByYXcgc3Vycm91bmQgZm9ybWF0cyBpZiBhbGwgYXJlIG1pc3NpbmcuCi0gICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCBpZiBhbnkgb2YgdGhlc2UgZm9ybWF0cyBhcmUgcmVwb3J0ZWQgYnkgdGhlIEhBTAotICAgICAgICAgICAgLy8gdGhlbiB0aGUgcmVwb3J0IGlzIHZhbGlkIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9FX0FDMyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUUyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUU19IRCk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIElFQzYxOTM3IGlmIGFueSByYXcgc3Vycm91bmQgc3VwcG9ydGVkLgotICAgICAgICAgICAgLy8gVGhlIEhBTCBjb3VsZCBkbyB0aGlzIGJ1dCBhZGQgaXQgaGVyZSwganVzdCBpbiBjYXNlLgotICAgICAgICAgICAgaWYgKChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQpICYmICFzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHJlcG9ydGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgdG8gZW5hYmxlZCBzdXJyb3VuZCBmb3JtYXRzLgotICAgICAgICAgICAgZm9yIChzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IGZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUFDX0xDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzX0pPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChlbmZvcmNlZFN1cnJvdW5kLmJlZ2luKCksIGVuZm9yY2VkU3Vycm91bmQuZW5kKCkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdCA6IGZvcm1hdFNldCkgeworICAgICAgICBmb3JtYXRzUHRyLT5wdXNoKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKICAgICBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwpAQCAtNjExMiwxNiArNjExMSwxNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpCiB7CiAgICAgU3RyaW5nOCByZXBseTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogCiAgICAgLy8gRm9ybWF0IE1VU1QgYmUgY2hlY2tlZCBmaXJzdCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgQXVkaW9Qcm9maWxlCiAgICAgaWYgKHByb2ZpbGVzLmhhc0R5bmFtaWNGb3JtYXQoKSkgewpAQCAtNjEzNSw4ICs2MTM1LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kRm9ybWF0cygmZm9ybWF0cyk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKICAgICAgICAgfQogICAgICAgICBwcm9maWxlcy5zZXRGb3JtYXRzKGZvcm1hdHMpOwogICAgIH0KQEAgLTYxNjgsOCArNjE2OSw5IEBACiAgICAgICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHJlcGx5KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0RldmljZU9mTW9kdWxlKGRldkRlc2MsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjE3Nyw0ICs2MTc5LDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgPworICAgICAgICAgICAgKnBhdGNoSGFuZGxlIDogaW9EZXNjcmlwdG9yLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAorICAgICAgICAgICAgY2FsbGVyLCBpbmRleCwgcGF0Y2hIYW5kbGUsIHBhdGNoLCBkZWxheU1zLCBtVWlkQ2FjaGVkLCAmcGF0Y2hEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlvRGVzY3JpcHRvci0+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+IG1QYXJhbXM7CiAgICAgfTsKIApAQCAtMTgwLDYgKzIyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKIAogICAgIC8vIHByb3RlY3RzIGFjY2VzcyB0byBtSW5wdXRTb3VyY2VzLCBtSW5wdXRTZXNzaW9ucywgbU91dHB1dFN0cmVhbXMsIG1PdXRwdXRTZXNzaW9ucworICAgIC8vIG5ldmVyIGhvbGQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjptTG9jayB3aGVuIGNhbGxpbmcgQXVkaW9Qb2xpY3lFZmZlY3RzIG1ldGhvZHMgYXMKKyAgICAvLyB0aG9zZSBjYW4gY2FsbCBiYWNrIGludG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIG1ldGhvZHMgYW5kIHRyeSB0byBhY3F1aXJlIHRoZSBtdXRleAogICAgIE11dGV4IG1Mb2NrOwogICAgIC8vIEF1dG9tYXRpYyBpbnB1dCBlZmZlY3RzIGFyZSBjb25maWd1cmVkIHBlciBhdWRpb19zb3VyY2VfdAogICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgRWZmZWN0RGVzY1ZlY3RvciogPiBtSW5wdXRTb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDczMzdmMDQuLmZhOGRhODkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE3LDEyICsxNywxMSBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcgKzMxLDggQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDksNyArNDksNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNjYsNyArNjYsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC03OSw3ICs4MCw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC0xNzQsNyArMTc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE4MywxNiArMTg1LDI0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKICAgICB9CisgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkKSkgeworICAgICAgICBhdHRyLT5mbGFncyB8PSBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT047CisgICAgfQorICAgIGlmICgoKGF0dHItPmZsYWdzICYgKEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1l8QVVESU9fRkxBR19CWVBBU1NfTVVURSkpICE9IDApCisgICAgICAgICAgICAmJiAhYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgYXR0ci0+ZmxhZ3MgJj0gfihBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpOworICAgIH0KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvcmlnaW5hbEZsYWdzID0gZmxhZ3M7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKChyZXN1bHQgPT0gTk9fRVJST1IpICYmCkBAIC0yMDAsMTA1ICsyMTAsMTM0IEBACiAgICAgICAgICFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWQsIHVpZCkpIHsKICAgICAgICAgLy8gSWYgdGhlIGFwcCB0cmllcyB0byBwbGF5IG11c2ljIHRocm91Z2ggdGhlIHRlbGVwaG9ueSBkZXZpY2UgYW5kIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uCiAgICAgICAgIC8vIHRoZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpvdXRwdXQsICpzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpwb3J0SWQpOwogICAgICAgICBmbGFncyA9IG9yaWdpbmFsRmxhZ3M7CiAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5jbGVhcigpOworICAgICAgICByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNwIDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoKmF0dHIsICpvdXRwdXQsIHVpZCwgcGlkLCBzZXNzaW9uLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnN0cmVhbSk7CisgICAgICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBjb250ZXh0LCBwb3J0SWQpOworICAgICAgICByZXR1cm47CiAgICAgfQorICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICBlZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICB9CisKKyAgICBnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMocG9ydElkLCBjbGllbnQsIGF1ZGlvUG9saWN5RWZmZWN0cywgX19mdW5jX18pOworCiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0Iik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIH0KKworICAgIGdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhwb3J0SWQsIGNsaWVudCwgYXVkaW9Qb2xpY3lFZmZlY3RzLCBfX2Z1bmNfXyk7CisKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gYXVkaW9Qb2xpY3lFZmZlY3RzOworCisgICAgZ2V0UGxheWJhY2tDbGllbnRBbmRFZmZlY3RzKHBvcnRJZCwgY2xpZW50LCBhdWRpb1BvbGljeUVmZmVjdHMsIF9fZnVuY19fKTsKKworICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCAmJiBjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAvLyBjbGVhbiB1cCBlZmZlY3RzIGlmIG91dHB1dCB3YXMgbm90IHN0b3BwZWQgYmVmb3JlIGJlaW5nIHJlbGVhc2VkCisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CisgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKKwogICAgIC8vIGNhbGxlZCBmcm9tIGludGVybmFsIHRocmVhZDogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKLSAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTMxMywxNCArMzUyLDE3IEBACiAgICAgfQogCiAgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJgotICAgICAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUKQorICAgICAgICAgICAgfHwgKGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUgorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM0MiwxNCArMzg0LDE3IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICBib29sIGNhbkNhcHR1cmVPdXRwdXQgPSBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKTsKICAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8CiAgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSAmJgotICAgICAgICAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIHx8CisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpICYmCisgICAgICAgICFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICBib29sIGNhbkNhcHR1cmVIb3R3b3JkID0gY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhbkNhcHR1cmVIb3R3b3JkKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0zNjIsNyArNDA3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCBzZXNzaW9uLCB1aWQsCisgICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHJpaWQsIHNlc3Npb24sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSwgcG9ydElkKTsKQEAgLTM3MiwxMiArNDE3LDE1IEBACiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIC8vIGVuZm9yY2UgcGVybWlzc2lvbiAoaWYgYW55KSByZXF1aXJlZCBmb3IgZWFjaCB0eXBlIG9mIGlucHV0CiAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSzoKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHVzZSBjYXNlIGhhcyBiZWVuIHZhbGlkYXRlZCBpbiBhdWRpbyBzZXJ2aWNlIHdpdGggYSBNZWRpYVByb2plY3Rpb24gdG9rZW4sCisgICAgICAgICAgICAgICAgLy8gYW5kIGRvZXNuJ3QgcmVseSBvbiByZWd1bGFyIHBlcm1pc3Npb25zCiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTEVHQUNZOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX1RFTEVQSE9OWV9SWDoKICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdXNlIHRoZSBzYW1lIHBlcm1pc3Npb24gYXMgZm9yIHJlbW90ZSBzdWJtaXggZm9yIG5vdy4KICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfQ0FQVFVSRToKLSAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogY2FwdHVyZSBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICB9CkBAIC0zOTgsMTcgKzQ0NiwxNCBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBFUk1JU1NJT05fREVOSUVEKSB7CiAgICAgICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKnBvcnRJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBvcFBhY2thZ2VOYW1lLCBzZXNzaW9uKTsKLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc0NvbmN1cnJlbnQgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2UgPSBmYWxzZTsgLy9UT0RPIDogdXBkYXRlIGZyb20gQVBNLT5nZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBjbGllbnQtPmRldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQsIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQ2FwdHVyZU91dHB1dCwgY2FuQ2FwdHVyZUhvdHdvcmQpOwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KIApAQCAtNDIyLDQ4ICs0NjcsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8vIHRoaXMgaXMgcmVwbGljYXRlZCBmcm9tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCi0vLyBYWFggLS0gZmlndXJlIG91dCBob3cgdG8gcHV0IGl0IGludG8gYSBjb21tb24sIHNoYXJlZCBsb2NhdGlvbgotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBzb3VyY2U7Ci0gICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoCi0gICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kpCi17Ci0gICAgY2hhciBidWZmZXJbNjRdOyAvLyBvdmVyc2l6ZWQKLSAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMlcyVzJXMiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKT8gIixjYWxsIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSk/ICIsY2FwdHVyZSI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQpPyAiLGhvdHdvcmQiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUKT8gIixwcmVlbXB0IjoiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIixub25lIik7Ci0gICAgfQotCi0gICAgcmV0dXJuICZidWZmZXJbMV07Ci19Ci0KIHN0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHI7CiAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwogICAgIHBvcnQuaWQgPSBwb3J0SWQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KCZwb3J0KTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHBvcnQudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZVRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlLCB0eXBlU3RyKTsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlKTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVTdHI7CisgICAgcmV0dXJuIHt9OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODYsMjcgKzUwMCwyNSBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gSWYgVUlEIGluYWN0aXZlIGl0IHJlY29yZHMgc2lsZW5jZSB1bnRpbCBiZWNvbWluZyBhY3RpdmUKLSAgICAqc2lsZW5jZWQgPSAhbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2xpZW50LT51aWQpICYmICFjbGllbnQtPmlzVmlydHVhbERldmljZTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSA9Ci0gICAgICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHsKICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uLCAqc2lsZW5jZWQsICZjb25jdXJyZW5jeSk7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQocG9ydElkKTsKIAogICAgIH0KIAogICAgIC8vIGluY2x1ZGluZyBzdWNjZXNzZXMgZ2V0cyB2ZXJ5IHZlcmJvc2UKKyAgICAvLyBidXQgb25jZSB3ZSBjdXQgb3ZlciB0byB3ZXN0d29ybGQsIGxvZyB0aGVtIGFsbC4KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVtdID0gImF1ZGlvcG9saWN5IjsKIAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UmVhc29uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5yZWFzb24iOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFBrZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5wa2ciOwpAQCAtNTIwLDQyICs1MzIsNDMgQEAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeUFjdGl2ZURldmljZVtdID0KICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuZGV2aWNlIjsKIAotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtBdWRpb1BvbGljeSk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtBdWRpb1BvbGljeSk7CiAgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKIAotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lSZWFzb24sIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoY29uY3VycmVuY3kpLmNfc3RyKCkpOwogICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5U3RhdHVzLCBzdGF0dXMpOwogCiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KGNsaWVudC0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdobyBpcyBhY3RpdmUKLSAgICAgICAgICAgIC8vIE5COiBtaWdodCB0aGUgb3RoZXIgcGFydHkgaGF2ZSBnaXZlbiB1cCB0aGUgbWljcm9waG9uZSBzaW5jZSB0aGVuPyBob3cgc3VyZS4KLSAgICAgICAgICAgIC8vIHBlcmhhcHMgY291bGQgaGF2ZSBnaXZlbiB1cCBvbiBpdC4KLSAgICAgICAgICAgIC8vIHdlIGhvbGQgbUxvY2ssIHNvIHBlcmhhcHMgd2UncmUgc2FmZSBmb3IgdGhpcyBsb29waW5nCi0gICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgIT0gQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKQEAgLTU2NCwyMCArNTc3LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY29uY3VycmVuY3kgJiB+QXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0SW5wdXQoKTogaW52YWxpZCBjb25jdXJyZW5jeSB0eXBlICVkIiwgKGludCljb25jdXJyZW5jeSk7Ci0KLSAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgY29uY3VycmVuY3kKLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGluY2FsbCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY29uY3VycmVudCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKQEAgLTU4OSw2ICs1OTIsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKQEAgLTU5OCwxMSArNjAyLDE0IEBACiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworCisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAogICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC02MjAsNiArNjI3LDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyByZWxlYXNpbmcgYWN0aXZlIGNsaWVudCBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworICAgICAgICB9CisKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgfQogICAgIGlmIChjbGllbnQgPT0gMCkgewpAQCAtNjI3LDE1ICs2NDIsMTUgQEAKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGNsaWVudC0+aW8sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgY2xpZW50LT5pbyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgfQogfQogCkBAIC02OTUsMTQgKzcxMCw2MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKK30KKwogdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CisgICAgLy8gRE8gTk9UIExPQ0ssIG1heSBiZSBjYWxsZWQgZnJvbSBBdWRpb0ZsaW5nZXIgd2l0aCBsb2NrIGhlbGQsIHJlYWNoaW5nIGRlYWRsb2NrCiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKIH0KQEAgLTc0Miw3ICs4MDUsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtRWZmZWN0c0xvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CkBAIC03NTIsNyArODE1LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUVmZmVjdHNMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOwogfQpAQCAtNzYyLDExICs4MjUsMjEgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUVmZmVjdHNMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pOworfQorCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CkBAIC04MDMsMjcgKzg3NiwxMTQgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cygKICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgY2FwdHVyZVBvbGljeSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiJXMoKSBtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICB1aW50X3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAodWlkICE9IGNhbGxpbmdVaWQpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgdWlkIGludmFsaWQgJWQgIT0gJWQiLCBfX2Z1bmNfXywgdWlkLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkLCBjYXB0dXJlUG9saWN5KTsKK30KKwogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC04MzEsMTIgKzk5MSwyMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sZShtRWZmZWN0c0xvY2spOyAvLyBpc09mZmxvYWRTdXBwb3J0ZWQgcXVlcmllcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLW9mZmxvYWRhYmxlIGVmZmVjdHMKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtOTQwLDkgKzExMDksMjIgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisKKyAgICAvLyBsb29wYmFja3xyZW5kZXIgb25seSBuZWVkIGEgTWVkaWFQcm9qZWN0aW9uIChjaGVja2VkIGluIGNhbGxlciBBdWRpb1NlcnZpY2UuamF2YSkKKyAgICBib29sIG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgPSBzdGQ6OmFueV9vZihtaXhlcy5iZWdpbigpLCBtaXhlcy5lbmQoKSwgW10oYXV0byYgbWl4KSB7CisgICAgICAgICAgICByZXR1cm4gIWlzX21peF9sb29wYmFja19yZW5kZXIobWl4Lm1Sb3V0ZUZsYWdzKTsgfSk7CisgICAgaWYgKG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgJiYgIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorCisgICAgYm9vbCBuZWVkQ2FwdHVyZU1lZGlhT3V0cHV0ID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgeworICAgICAgICAgICAgcmV0dXJuIG1peC5tQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlOyB9KTsKKyAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKG5lZWRDYXB0dXJlTWVkaWFPdXRwdXQgJiYgIWNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtOTU0LDI3ICsxMTM2LDUzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCi17CitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBzdGFydEF1ZGlvU291cmNlIHNob3VsZCBiZSBjcmVhdGVkIGFzIHRoZSBjYWxsaW5nIHVpZAorICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwgY2FsbGluZ1VpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTAyNiw2ICsxMjM0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTEwMzYsNCArMTI1NSw3NCBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHByb2R1Y3RTdHJhdGVneSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldFJ0dEVuYWJsZWQoZW5hYmxlZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZjNjZGRjMy4uNzdmNzk5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjIsMTEgKzIyLDExIEBACiAjZGVmaW5lIF9fU1RESU5UX0xJTUlUUwogI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgpAQCAtMzUsMjMgKzM1LDIxIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAKLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGtDbWREZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tUaW1lb3V0TnMgPSAxICogTkFOT1NfUEVSX1NFQ09ORDsKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga0F1ZGlvQ29tbWFuZFRpbWVvdXROcyA9IHNlY29uZHMoMyk7IC8vIDMgc2Vjb25kcwogCkBAIC03MCw4ICs2OCw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAogICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCkBAIC04OSwxMSArODUsMTMgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCiB7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOwogCkBAIC0xMDUsNiArMTAzLDkgQEAKIAogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiAgICAgbVVpZFBvbGljeS5jbGVhcigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kuY2xlYXIoKTsKIH0KIAogLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCkBAIC0xMTgsMTMgKzExOSwxNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCBwaWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodG9rZW4sIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwpAQCAtMTM2LDIyICsxNDEsNDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHVpZCktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworCisgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CiB9CiAKIC8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKQogewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odWlkKTsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh0b2tlbik7CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgYm9vbCBoYXNTYW1lVWlkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBoYXNTYW1lVWlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciAmJiAhaGFzU2FtZVVpZCkgewogICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gYmluZGVyIGRlYXRoIG5vdGlmaWNhdGlvbjogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQpAQCAtMTg0LDYgKzIxNCwxOSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+Y2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQoZ3JvdXAsIGZsYWdzKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewogICAgIEFMT0dWKCJBdWRpb1BvbGljeVNlcnZpY2U6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKCVzLCAlZCkiLApAQCAtMTk5LDIyICsyNDIsMzQgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZChldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMjM5LDkgKzI5NCwxMCBAQAogCiBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKLSAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1QaWQocGlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAorICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpLCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTI1NCw3ICszMTAsNyBAQAogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCk7CisgICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkLCBtUGlkKTsKICAgICB9CiB9CiAKQEAgLTI3MiwyMiArMzI4LDM2IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQpIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgIH0KK30KKworCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMjk2LDIzICszNjYsMjAgQEAKICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZCA9IGVuYWJsZWQ7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQgPSBlbmFibGVkOworfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKIH0KIAotc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCitzdGF0aWMgYm9vbCBkdW1wVHJ5TG9jayhNdXRleCYgbXV0ZXgpCiB7Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOworICAgIHN0YXR1c190IGVyciA9IG11dGV4LnRpbWVkTG9jayhrRHVtcExvY2tUaW1lb3V0TnMpOworICAgIHJldHVybiBlcnIgPT0gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcEludGVybmFscyhpbnQgZmQpCkBAIC0zMjUsMjQgKzM5MiwyMzAgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlcygpCiB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlc19sKCkKK3sKKy8vICAgIEdvIG92ZXIgYWxsIGFjdGl2ZSBjbGllbnRzIGFuZCBhbGxvdyBjYXB0dXJlIChkb2VzIG5vdCBmb3JjZSBzaWxlbmNlKSBpbiB0aGUKKy8vICAgIGZvbGxvd2luZyBjYXNlczoKKy8vICAgIEFub3RoZXIgY2xpZW50IGluIHRoZSBzYW1lIFVJRCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgdG8gY2FwdHVyZQorLy8gICAgT1IgVGhlIGNsaWVudCBpcyB0aGUgYXNzaXN0YW50CisvLyAgICAgICAgQU5EIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKKy8vICAgICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorLy8gICAgICAgIE9SIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gQU5EIGlzIG9uIFRPUAorLy8gICAgICAgICAgICAgICBPUiB1c2VzIEhPVFdPUkQKKy8vICAgICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisvLyAgICBPUiBUaGUgY2xpZW50IGlzIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZQorLy8gICAgICAgIEFORCBpcyBvbiBUT1AKKy8vICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICBPUiB0aGUgY2xpZW50IHNvdXJjZSBpcyB2aXJ0dWFsIChyZW1vdGUgc3VibWl4LCBjYWxsIGF1ZGlvIFRYIG9yIFJYLi4uKQorLy8gICAgT1IgQW55IGNsaWVudAorLy8gICAgICAgIEFORCBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIG9yIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gdG9wQWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKworICAgIG5zZWNzX3QgdG9wU3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSAwOworICAgIGJvb2wgaXNBMTF5T25Ub3AgPSBtVWlkUG9saWN5LT5pc0ExMXlPblRvcCgpOworICAgIGJvb2wgaXNBc3Npc3RhbnRPblRvcCA9IGZhbHNlOworICAgIGJvb2wgaXNTZW5zaXRpdmVBY3RpdmUgPSBmYWxzZTsKKyAgICBib29sIGlzSW5DYWxsID0gbVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMOworICAgIGJvb2wgcnR0Q2FsbEFjdGl2ZSA9CisgICAgICAgICAgICAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTikKKyAgICAgICAgICAgICYmIG1VaWRQb2xpY3ktPmlzUnR0RW5hYmxlZCgpOworCisgICAgLy8gaWYgU2Vuc29yIFByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCByZWNvcmRpbmdzIHNob3VsZCBiZSBzaWxlbmNlZC4KKyAgICBpZiAobVNlbnNvclByaXZhY3lQb2xpY3ktPmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSkgeworICAgICAgICBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0wOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIGlmICghY3VycmVudC0+YWN0aXZlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlID0gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpOworICAgICAgICAvLyBjbGllbnRzIHdoaWNoIGFwcCBpcyBpbiBJRExFIHN0YXRlIGFyZSBub3QgZWxpZ2libGUgZm9yIHRvcCBhY3RpdmUgb3IKKyAgICAgICAgLy8gbGF0ZXN0IGFjdGl2ZQorICAgICAgICBpZiAoYXBwU3RhdGUgPT0gQVBQX1NUQVRFX0lETEUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFwcFN0YXRlID09IEFQUF9TVEFURV9UT1ApIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IHRvcFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICB0b3BBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIHRvcFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U3RhcnROcykgeworICAgICAgICAgICAgbGF0ZXN0QWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgIGxhdGVzdFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcykgeworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNTZW5zaXRpdmVBY3RpdmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgbm8gYWN0aXZlIGNsaWVudCB3aXRoIFVJIG9uIFRvcCwgY29uc2lkZXIgbGF0ZXN0IGFjdGl2ZSBhcyB0b3AKKyAgICBpZiAodG9wQWN0aXZlID09IG51bGxwdHIpIHsKKyAgICAgICAgdG9wQWN0aXZlID0gbGF0ZXN0QWN0aXZlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBlbmFibGVkVWlkczsKKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8ga2VlcCBjYXB0dXJlIGFsbG93ZWQgaWYgYW5vdGhlciBjbGllbnQgd2l0aCB0aGUgc2FtZSBVSUQgaGFzIGFscmVhZHkKKyAgICAgICAgLy8gYmVlbiBhbGxvd2VkIHRvIGNhcHR1cmUKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChlbmFibGVkVWlkcy5iZWdpbigpLCBlbmFibGVkVWlkcy5lbmQoKSwgY3VycmVudC0+dWlkKQorICAgICAgICAgICAgICAgICE9IGVuYWJsZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlOworICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RBY3RpdmUgPSB0b3BBY3RpdmUgPT0gbnVsbHB0ciA/IGZhbHNlIDogY3VycmVudC0+dWlkID09IHRvcEFjdGl2ZS0+dWlkOworICAgICAgICBib29sIGlzTGF0ZXN0U2Vuc2l0aXZlID0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlID09IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgOiBjdXJyZW50LT51aWQgPT0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlLT51aWQ7CisKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBhbGxvdyBjYXB0dXJlIGlmOgorICAgICAgICAvLyAgICAgVGhlIGFzc2lzdGFudCBpcyBub3Qgb24gVE9QCisgICAgICAgIC8vICAgICBBTkQgaXMgb24gVE9QIG9yIGxhdGVzdCBzdGFydGVkCisgICAgICAgIC8vICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAvLyAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorICAgICAgICBib29sIGFsbG93Q2FwdHVyZSA9ICFpc0Fzc2lzdGFudE9uVG9wCisgICAgICAgICAgICAgICAgJiYgKChpc1RvcE9yTGF0ZXN0QWN0aXZlICYmICFpc0xhdGVzdFNlbnNpdGl2ZSkgfHwgaXNMYXRlc3RTZW5zaXRpdmUpCisgICAgICAgICAgICAgICAgJiYgIShpc1NlbnNpdGl2ZUFjdGl2ZSAmJiAhKGlzTGF0ZXN0U2Vuc2l0aXZlIHx8IGN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpKQorICAgICAgICAgICAgICAgICYmICEoaXNJbkNhbGwgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpOworCisgICAgICAgIGlmIChpc1ZpcnR1YWxTb3VyY2Uoc291cmNlKSkgeworICAgICAgICAgICAgLy8gQWxsb3cgY2FwdHVyZSBmb3IgdmlydHVhbCAocmVtb3RlIHN1Ym1peCwgY2FsbCBhdWRpbyBUWCBvciBSWC4uLikgc291cmNlcworICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAvLyBGb3IgYXNzaXN0YW50IGFsbG93IGNhcHR1cmUgaWY6CisgICAgICAgICAgICAvLyAgICAgQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgT1IgaXMgb24gVE9QIEFORCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OCisgICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAorICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIGlmIChpc0ExMXlPblRvcCB8fCBydHRDYWxsQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKChpc0Fzc2lzdGFudE9uVG9wICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIShpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0luQ2FsbCkgfHwgY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgYWxsb3cgY2FwdHVyZSBpZjoKKyAgICAgICAgICAgIC8vICAgICBJcyBvbiBUT1AKKyAgICAgICAgICAgIC8vICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3AgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gfHwgc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkgeworICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsCisgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID8gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBQX1NUQVRFX0lETEUpOworICAgICAgICBpZiAoYWxsb3dDYXB0dXJlKSB7CisgICAgICAgICAgICBlbmFibGVkVWlkcy5wdXNoX2JhY2soY3VycmVudC0+dWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFpc1ZpcnR1YWxTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwgQVBQX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK2FwcF9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6YXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKSB7CisKKyAgICBpZiAoYW1TdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gQVBQX1NUQVRFX0lETEU7CisgICAgfSBlbHNlIGlmIChhbVN0YXRlIDw9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgIC8vIGluY2x1ZGUgcGVyc2lzdGVudCBzZXJ2aWNlcworICAgICAgcmV0dXJuIEFQUF9TVEFURV9UT1A7CisgICAgfQorICAgIHJldHVybiBBUFBfU1RBVEVfRk9SRUdST1VORDsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZikgeworICAgICAgICBib29sIHNpbGVuY2VkID0gc3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7CiAgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKICAgICB9CiB9CkBAIC0zNTIsNyArNjI1LDcgQEAKICAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKICAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogICAgICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0zNjIsMTQgKzYzNSwxMyBAQAogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKICAgICAgICAgfQogCisgICAgICAgIG1QYWNrYWdlTWFuYWdlci5kdW1wKGZkKTsKKwogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTA1LDcgKzc3Nyw4IEBACiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtNTE0LDYgKzc4Nyw3IEBACiAgICAgICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZiBsaW5rVG9EZWF0aCBmYWlsZWQ6ICVkIiwgcmVzKTsKKwogICAgICAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CiAgICAgfQogfQpAQCAtNTMyLDggKzgwNiw3IEBACiAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Y2hlY2tSZWdpc3RlcmVkKCkgewogICAgIGJvb2wgbmVlZFRvUmVyZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTU0MywxMDMgKzgxNiwyMTIgQEAKICAgICAgICAgLy8gTG9va3MgbGlrZSBBY3Rpdml0eU1hbmFnZXIgaGFzIGRpZWQgcHJldmlvdXNseSwgYXR0ZW1wdCB0byByZS1yZWdpc3Rlci4KICAgICAgICAgcmVnaXN0ZXJTZWxmKCk7CiAgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIGNoZWNrUmVnaXN0ZXJlZCgpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCiAgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSk7CiAgICAgfQogICAgIHJldHVybiBhY3RpdmU7CiB9CiAKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0VWlkU3RhdGUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgIH0KKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZCAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgorICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgaW50IHN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBzdGF0ZSA9IGFtLmdldFVpZFByb2Nlc3NTdGF0ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkR29uZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCBmYWxzZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGZhbHNlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7Ci0gICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2VydmljZS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCAhYWN0aXZlKTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwcm9jU3RhdGVTZXEgX191bnVzZWQpIHsKKyAgICBpZiAocHJvY1N0YXRlICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgcHJvY1N0YXRlLCB0cnVlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNPdmVycmlkZGVuID0gZmFsc2UsIHdhc0FjdGl2ZSA9IGZhbHNlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCAmd2FzT3ZlcnJpZGRlbiwgJndhc0FjdGl2ZSk7Ci0gICAgfQotICAgIGlmICghd2FzT3ZlcnJpZGRlbiAmJiBpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBTdGFydGVkIHRvIG92ZXJyaWRlLgotICAgIH0gZWxzZSBpZiAod2FzT3ZlcnJpZGRlbiAmJiAhaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBpc1VpZEFjdGl2ZSh1aWQpKTsgIC8vIE92ZXJyaWRlIGNlYXNlZCwgbm90aWZ5IHdpdGggZ3JvdW5kIHRydXRoLgotICAgIH0gZWxzZSBpZiAod2FzQWN0aXZlICE9IGFjdGl2ZSkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIE92ZXJyaWRlIHVwZGF0ZWQuCisgICAgdXBkYXRlVWlkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGluc2VydCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UoKSB7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+dXBkYXRlVWlkU3RhdGVzKCk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCB3YXNBY3RpdmUgPSBpc1VpZEFjdGl2ZSh1aWQpOworICAgIGludCBwcmV2aW91c1N0YXRlID0gZ2V0VWlkU3RhdGUodWlkKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbUNhY2hlZFVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsIG51bGxwdHIsICZ3YXNBY3RpdmUpOwotICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHNlcnZpY2UgaWYgY3VycmVudGx5IG92ZXJyaWRkZW4uCi0gICAgICAgIGlmIChtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKSAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSByZXR1cm47CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCh1aWRzLCB1aWQsIGFjdGl2ZSwgc3RhdGUsIGluc2VydCk7CiAgICAgfQotICAgIGJvb2wgbm93QWN0aXZlID0gYWN0aXZlICYmIGluc2VydDsKLSAgICBpZiAod2FzQWN0aXZlICE9IG5vd0FjdGl2ZSkgbm90aWZ5U2VydmljZSh1aWQsIG5vd0FjdGl2ZSk7CisgICAgaWYgKHdhc0FjdGl2ZSAhPSBpc1VpZEFjdGl2ZSh1aWQpIHx8IHN0YXRlICE9IHByZXZpb3VzU3RhdGUpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSgpOworICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKSB7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CiAgICAgYXV0byBpdCA9IHVpZHMtPmZpbmQodWlkKTsKICAgICBpZiAoaXQgIT0gdWlkcy0+ZW5kKCkpIHsKLSAgICAgICAgaWYgKHdhc1RoZXJlICE9IG51bGxwdHIpICp3YXNUaGVyZSA9IHRydWU7Ci0gICAgICAgIGlmICh3YXNBY3RpdmUgIT0gbnVsbHB0cikgKndhc0FjdGl2ZSA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChpbnNlcnQpIHsKLSAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBhY3RpdmU7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmZpcnN0ID0gYWN0aXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IHN0YXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWlkcy0+ZXJhc2UoaXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnNlcnQpIHsKLSAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9IGVsc2UgaWYgKGluc2VydCAmJiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSB7CisgICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlPblRvcCgpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnVpZCA6IG1DYWNoZWRVaWRzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZC5maXJzdCk7CisgICAgICAgIGlmIChpdCA9PSBtQTExeVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1aWQuc2Vjb25kLnNlY29uZCA+PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QCisgICAgICAgICAgICAgICAgJiYgdWlkLnNlY29uZC5zZWNvbmQgPD0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0JPVU5EX0ZPUkVHUk9VTkRfU0VSVklDRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVNlcnZpY2UgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQogICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCiB7Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKIH0KIAogCkBAIC02NDksNyArMTAzMSw2IEBACiAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTY3NCw2OCArMTA1NSw1NCBAQAogICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CiAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogewpAQCAtNzQ1LDcgKzExMTIsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPmNyZWF0ZUF1ZGlvUGF0Y2goJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CkBAIC03NTUsNyArMTEyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+cmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BPUlRfTElTVDogewpAQCAtNzc4LDYgKzExNDksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA6IHsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvVm9sdW1lR3JvdXBEYXRhICo+KGNvbW1hbmQtPm1QYXJhbS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyB2b2x1bWUgZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChkYXRhLT5tR3JvdXAsIGRhdGEtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVRElPUE9SVF9DT05GSUc6IHsKICAgICAgICAgICAgICAgICAgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IChTZXRBdWRpb1BvcnRDb25maWdEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcG9ydCBjb25maWciKTsKQEAgLTc4NSw3ICsxMTY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKQEAgLTgxMSwxMCArMTE5NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGRhdGEtPm1FdmVudCwgJmRhdGEtPm1DbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCBkYXRhLT5tQ2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bURldmljZUNvbmZpZywgZGF0YS0+bUVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlLCBkYXRhLT5tU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgU2V0RWZmZWN0U3VzcGVuZGVkRGF0YSAqZGF0YSA9IChTZXRFZmZlY3RTdXNwZW5kZWREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgZWZmZWN0IHN1c3BlbmRlZCIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZi0+c2V0RWZmZWN0U3VzcGVuZGVkKGRhdGEtPm1FZmZlY3RJZCwgZGF0YS0+bVNlc3Npb25JZCwgZGF0YS0+bVN1c3BlbmRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtODcyLDcgKzEyNjksNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAotICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKICAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdDIuc3RyaW5nKCksIHJlc3VsdDIuc2l6ZSgpKTsKQEAgLTkwMCwyNyArMTI5Nyw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIHNwPFRvbmVEYXRhPiBkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC05NjcsMzMgKzEzNDMsNDIgQEAKICAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX0VGRkVDVF9TVVNQRU5ERUQ7CisgICAgc3A8U2V0RWZmZWN0U3VzcGVuZGVkRGF0YT4gZGF0YSA9IG5ldyBTZXRFZmZlY3RTdXNwZW5kZWREYXRhKCk7CisgICAgZGF0YS0+bUVmZmVjdElkID0gZWZmZWN0SWQ7CisgICAgZGF0YS0+bVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBkYXRhLT5tU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgc3VzcGVuZGVkIGVmZmVjdElkICVkIHNlc3Npb25JZCAlZCBzdXNwZW5kZWQgJWQiLAorICAgICAgICBlZmZlY3RJZCwgc2Vzc2lvbklkLCBzdXNwZW5kZWQpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwogICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKICAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCkBAIC0xMDQ4LDYgKzE0MzMsMTkgQEAKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6Y2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA7CisgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGE9IG5ldyBBdWRpb1ZvbHVtZUdyb3VwRGF0YSgpOworICAgIGRhdGEtPm1Hcm91cCA9IGdyb3VwOworICAgIGRhdGEtPm1GbGFncyA9IGZsYWdzOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBhdWRpbyB2b2x1bWUgZ3JvdXAgY2hhbmdlZCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKQogewpAQCAtMTA3Niw5ICsxNDc0LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CkBAIC0xMDg2LDggKzE0ODksMTEgQEAKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKICAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOworICAgIGRhdGEtPm1DbGllbnRFZmZlY3RzID0gY2xpZW50RWZmZWN0czsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKKyAgICBkYXRhLT5tRWZmZWN0cyA9IGVmZmVjdHM7CiAgICAgZGF0YS0+bVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7CisgICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwogICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQgdWlkICV1IiwKICAgICAgICAgICAgIGV2ZW50LCBjbGllbnRJbmZvLT5zb3VyY2UsIGNsaWVudEluZm8tPnVpZCk7CkBAIC0xMjEyLDYgKzE2MTgsNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGF0Y2gsIDAsIHNpemVvZihwYXRjaCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CkBAIC0xMjU2LDggKzE2NjMsNiBAQAogCiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzMwLDMyICsxNzM1LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgfQotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5zZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGVmZmVjdElkLCBzZXNzaW9uSWQsIHN1c3BlbmRlZCk7Cit9CisKKwogZXh0ZXJuICJDIiB7CiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKQEAgLTE0MDYsOSArMTc5OCw2IEBACiBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7Ci1pbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CiBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggNDA3ZDdhNS4uZTQ2N2Y3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zMSwxNSArMzEsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CkBAIC02MiwzOCArNjIsMzYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMTAyLDggKzEwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMTYsNiArMTEzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCk7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMTI3LDYgKzEzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKQEAgLTEzNCw2ICsxNDMsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0xNTksMTAgKzE4MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisgICAgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWludF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xODIsNiArMjA3LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CkBAIC0xOTIsMTAgKzIxOSwxNCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0yMDcsMTQgKzIzOCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yMjQsNyArMjY5LDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwpAQCAtMjMyLDEyICsyNzcsMjggQEAKIAogICAgICAgICAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CisgICAgICAgICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CkBAIC0yNDksNyArMzEwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiBVSUQgcmVjb3JkcyBvbmx5IHNpbGVuY2UKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGVfbCh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKIAogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKQEAgLTI2NSw2ICszMjYsMTggQEAKIAogICAgIHN0ZDo6c3RyaW5nIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cyk7CisKKyAgICBhcHBfc3RhdGVfdCBhcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpOworCisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisKKyAgICB2b2lkIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKworICAgIHN0YXRpYyBib29sIGlzUHJpdmFjeVNlbnNpdGl2ZVNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgIHN0YXRpYyBib29sIGlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCiAgICAgLy8gSWYgcmVjb3JkaW5nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBVSUQgaXMgYWxsb3dlZCB0byBkbyB0aGF0LiBJZiB0aGUgVUlEIGlzIGlkbGUKICAgICAvLyB0aGVuIGl0IGNhbm5vdCByZWNvcmQgYW5kIGdldHMgYnVmZmVycyB3aXRoIHplcm9zIC0gc2lsZW5jZS4gQXMgc29vbiBhcyB0aGUgVUlECiAgICAgLy8gdHJhbnNpdGlvbnMgdG8gYW4gYWN0aXZlIHN0YXRlIHdlIHdpbGwgc3RhcnQgcmVwb3J0aW5nIGJ1ZmZlcnMgd2l0aCBkYXRhLiBUaGlzIGFwcHJvYWNoCkBAIC0yNzQsNyArMzQ3LDggQEAKICAgICBjbGFzcyBVaWRQb2xpY3kgOiBwdWJsaWMgQm5VaWRPYnNlcnZlciwgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgVWlkUG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKLSAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudFVpZCgwKSwgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwpAQCAtMjgzLDM0ICszNTcsNjYgQEAKICAgICAgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIG92ZXJyaWRlOwogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKKyAgICAgICAgaW50IGdldFVpZFN0YXRlKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyBtQXNzaXN0YW50VWlkID0gdWlkOyB9CisgICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IHJldHVybiB1aWQgPT0gbUFzc2lzdGFudFVpZDsgfQorICAgICAgICB2b2lkIHNldEExMXlVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeyBtQTExeVVpZHMuY2xlYXIoKTsgbUExMXlVaWRzID0gdWlkczsgfQorICAgICAgICBib29sIGlzQTExeVVpZCh1aWRfdCB1aWQpOworICAgICAgICBib29sIGlzQTExeU9uVG9wKCk7CisgICAgICAgIHZvaWQgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpIHsgbVJ0dEVuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgaXNSdHRFbmFibGVkKCkgeyByZXR1cm4gbVJ0dEVuYWJsZWQ7IH0KIAogICAgICAgICAvLyBCblVpZE9ic2VydmVyIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlLCB0cnVlKTsgfQogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7Ci0gICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgY2hlY2tSZWdpc3RlcmVkKCk7CiAKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgTXV0ZXggbUxvY2s7CiAgICAgICAgIGJvb2wgbU9ic2VydmVyUmVnaXN0ZXJlZDsKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1DYWNoZWRVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtT3ZlcnJpZGVVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtQ2FjaGVkVWlkczsKKyAgICAgICAgdWlkX3QgbUFzc2lzdGFudFVpZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKKyAgICAgICAgYm9vbCBtUnR0RW5hYmxlZDsKICAgICB9OwogCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gcmVjb3JkaW5nLiBUaGlzIGlzIGhhbmRsZWQgc2ltaWxhciB0byBpZGxlIFVJRHMsIGFueSBhcHAgdGhhdCBhdHRlbXB0cworICAgIC8vIHRvIHJlY29yZCB3aGlsZSBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHdpbGwgcmVjZWl2ZSBidWZmZXJzIHdpdGggemVyb3MuIEFzIHNvb24gYXMKKyAgICAvLyBzZW5zb3IgcHJpdmFjeSBpcyBkaXNhYmxlZCBhY3RpdmUgYXBwcyB3aWxsIHJlY2VpdmUgdGhlIGV4cGVjdGVkIGRhdGEgd2hlbiByZWNvcmRpbmcuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgfTsKKworICAgIC8vIFRocmVhZCB1c2VkIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKICAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCiAgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0zMTksOCArNDI1LDYgQEAKIAogICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAogICAgICAgICAgICAgU0VUX1ZPTFVNRSwKICAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAogICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKQEAgLTMzMCw5ICs0MzQsMTEgQEAKICAgICAgICAgICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QT1JUX0xJU1QsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QQVRDSF9MSVNULAorICAgICAgICAgICAgQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQLAogICAgICAgICAgICAgU0VUX0FVRElPUE9SVF9DT05GSUcsCiAgICAgICAgICAgICBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEUsCi0gICAgICAgICAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKKyAgICAgICAgICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURSwKKyAgICAgICAgICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVELAogICAgICAgICB9OwogCiAgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKQEAgLTM0NSwyMCArNDUxLDEzIEBACiAgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKIAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMzY4LDE1ICs0NjcsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtMzkwLDcgKzQ5Nyw3IEBACiAKICAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKIAotICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTRVRfVk9MVU1FLCBTRVRfUEFSQU1FVEVSUy4uLgogICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKICAgICAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHRvIG1Db25kCiAgICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgpAQCAtNDA2LDEyICs1MTMsNiBAQAogICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CiAgICAgICAgIH07CiAKLSAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgIH07Ci0KICAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwpAQCAtNDMyLDE2ICs1MzMsMTIgQEAKIAogICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CkBAIC00NTUsNiArNTUyLDEyIEBACiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwogICAgICAgICB9OwogCisgICAgICAgIGNsYXNzIEF1ZGlvVm9sdW1lR3JvdXBEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXA7CisgICAgICAgICAgICBpbnQgbUZsYWdzOworICAgICAgICB9OworCiAgICAgICAgIGNsYXNzIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBtQ29uZmlnOwpAQCAtNDcxLDE0ICs1NzQsMjMgQEAKICAgICAgICAgICAgIGludCBtRXZlbnQ7CiAgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBtQ2xpZW50SW5mbzsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ2xpZW50Q29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUNsaWVudEVmZmVjdHM7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IG1FZmZlY3RzOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBTZXRFZmZlY3RTdXNwZW5kZWREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpbnQgbUVmZmVjdElkOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uSWQ7CisgICAgICAgICAgICBib29sIG1TdXNwZW5kZWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgTXV0ZXggICBtTG9jazsKICAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwogICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcwotICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKICAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBtTGFzdENvbW1hbmQ7ICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQogICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcwogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwpAQCAtNTUzLDExICs2NjUsNiBAQAogICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOwogCi0gICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwotCiAgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKIApAQCAtNTY2LDYgKzY3MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CiAKKyAgICAgICAgICAgICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgb3ZlcnJpZGU7CisKICAgICAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtNTgyLDkgKzY5MywxNSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKTsKIApAQCAtNTk3LDE4ICs3MTQsMjkgQEAKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC02MTksMzYgKzc0Nyw3MyBAQAogCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkOworICAgIH07CisKKyAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgaW8oaW8pLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24oc2Vzc2lvbiksIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBQbGF5YmFjay9DYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQogICAgIH07CiAKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKLSAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KLSAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYW5DYXB0dXJlT3V0cHV0LCBib29sIGNhbkNhcHR1cmVIb3R3b3JkKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLAorICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBzdGFydFRpbWVOcygwKSwKKyAgICAgICAgICAgICAgICAgICAgY2FuQ2FwdHVyZU91dHB1dChjYW5DYXB0dXJlT3V0cHV0KSwgY2FuQ2FwdHVyZUhvdHdvcmQoY2FuQ2FwdHVyZUhvdHdvcmQpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgotICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQotICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAotICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAogICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKLSAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCi0gICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnM7CisgICAgICAgIGNvbnN0IGJvb2wgY2FuQ2FwdHVyZU91dHB1dDsKKyAgICAgICAgY29uc3QgYm9vbCBjYW5DYXB0dXJlSG90d29yZDsKICAgICB9OwogCisgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CisgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCisgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOworICAgIH07CisKKyAgICB2b2lkIGdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCk7CisKKwogICAgIC8vIEEgY2xhc3MgYXV0b21hdGljYWxseSBjbGVhcmluZyBhbmQgcmVzdG9yaW5nIGJpbmRlciBjYWxsZXIgaWRlbnRpdHkgaW5zaWRlCiAgICAgLy8gYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpCiAgICAgLy8gRGVjbGFyZSBvbmUgc3lzdGVtYXRpY2FsbHkgYmVmb3JlIGNhbGxpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgc28gdGhhdCB0aGV5IGFyZQpAQCAtNjcxLDI2ICs4MzYsMzEgQEAKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKLSAgICBtdXRhYmxlIE11dGV4IG1FZmZlY3RzTG9jazsgLy8gc2VyaWFsaXplIGFjY2VzcyB0byBFZmZlY3Qgc3RhdGUgd2l0aGluIEFQTS4KICAgICAvLyBOb3RlOiBsb2NrIGFjcXVpc2l0aW9uIG9yZGVyIGlzIGFsd2F5cyBtTG9jayA+IG1FZmZlY3RzTG9jazoKICAgICAvLyBtTG9jayBwcm90ZWN0cyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyB0aGF0IGNhbiBjYWxsIGludG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIGFuZCBwb3NzaWJseSBiYWNrIGluIHRvIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGFuZCBhY3F1aXJlIG1FZmZlY3RzTG9jay4KICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOwogICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CiAKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQ2NF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgTXV0ZXggbU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrOyAgLy8gcHJvdGVjdHMgbU5vdGlmaWNhdGlvbkNsaWVudHMKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICAvLyBuZXZlciBob2xkIEF1ZGlvUG9saWN5U2VydmljZTo6bUxvY2sgd2hlbiBjYWxsaW5nIEF1ZGlvUG9saWN5RWZmZWN0cyBtZXRob2RzIGFzCisgICAgLy8gdGhvc2UgY2FuIGNhbGwgYmFjayBpbnRvIEF1ZGlvUG9saWN5U2VydmljZSBtZXRob2RzIGFuZCB0cnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXgKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOworCisgICAgTWVkaWFQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFsbG93UGxheWJhY2tDYXB0dXJlCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tawppbmRleCBhNDNkYWVhLi5hYjlmNzhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTQsOSArNCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCkBAIC0xOCw2ICsxNiwxMSBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyBcCisgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzCisKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAogCkBAIC0yOSw0ICszMiwzNCBAQAogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cworCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKKyMgc3lzdGVtL2F1ZGlvLmggdXRpbGl0aWVzIHRlc3QKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJiYXNlIFwKKyAgbGlibG9nIFwKKyAgbGlibWVkaWFfaGVscGVyIFwKKyAgbGlidXRpbHMKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgIGxpYm1lZGlhX2hlYWRlcnMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgc3lzdGVtYXVkaW9fdGVzdHMuY3BwIFwKKworTE9DQUxfTU9EVUxFIDo9IHN5c3RlbWF1ZGlvX3Rlc3RzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCisKK0xPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCisKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKaW5kZXggZWI4MjIyYy4uZTRjNjRlNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTYwLDkgKzYwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IH0KICAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9Ci0gICAgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgLyp0b25lKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQotICAgIHN0YXR1c190IHN0b3BUb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IC8qdm9sdW1lKi8sIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCAvKnNlc3Npb24qLywKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKnNyY091dHB1dCovLApAQCAtNzYsMTMgKzczLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CiAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IC8qZ3JvdXAqLywgaW50IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyB9CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgLyp1c2UqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQogICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCAvKnJlZ0lkKi8sIGludDMyX3QgLypzdGF0ZSovKSBvdmVycmlkZSB7IH0KLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgLypldmVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190KiAvKmNsaWVudEluZm8qLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qY2xpZW50Q29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmRldmljZUNvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IC8qcGF0Y2hIYW5kbGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQgX191bnVzZWQpIHt9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhOTU5M2I4Li5kZTU2NzBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTE2LDkgKzE2LDE1IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKwogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdENsaWVudC5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaCIKIApAQCAtMTA2LDEwICsxMTIsMzkgQEAKICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7CiB9OwogCitjbGFzcyBQYXRjaENvdW50Q2hlY2sgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGF0Y2hDb3VudENoZWNrKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgKmNsaWVudCkKKyAgICAgICAgICAgIDogbUNsaWVudHtjbGllbnR9LAorICAgICAgICAgICAgICBtSW5pdGlhbENvdW50e21DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpfSB7fQorICAgIGludCBkZWx0YUZyb21TbmFwc2hvdCgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGN1cnJlbnRDb3VudCA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOworICAgICAgICBpZiAobUluaXRpYWxDb3VudCA8PSBjdXJyZW50Q291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Q291bnQgLSBtSW5pdGlhbENvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0oc3RhdGljX2Nhc3Q8aW50PihtSW5pdGlhbENvdW50IC0gY3VycmVudENvdW50KSk7CisgICAgICAgIH0KKyAgICB9CisgIHByaXZhdGU6CisgICAgY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqbUNsaWVudDsKKyAgICBjb25zdCBzaXplX3QgbUluaXRpYWxDb3VudDsKK307CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7ICh2b2lkKWNvbmZpZzsgfQorCisgICAgdm9pZCBkdW1wVG9Mb2coKTsKKyAgICB2b2lkIGdldE91dHB1dEZvckF0dHIoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBudWxscHRyKTsKKyAgICBQYXRjaENvdW50Q2hlY2sgc25hcHNob3RQYXRjaENvdW50KCkgeyByZXR1cm4gUGF0Y2hDb3VudENoZWNrKG1DbGllbnQuZ2V0KCkpOyB9CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudD4gbUNsaWVudDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXI7CkBAIC0xMTksNiArMTU0LDcgQEAKICAgICBtQ2xpZW50LnJlc2V0KG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7CiAgICAgbU1hbmFnZXItPmdldENvbmZpZygpLnNldERlZmF1bHQoKTsKKyAgICBTZXRVcENvbmZpZygmbU1hbmFnZXItPmdldENvbmZpZygpKTsgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb25maWcuCiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdGlhbGl6ZSgpKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0Q2hlY2soKSk7CiB9CkBAIC0xMjgsMTQgKzE2NCw3MyBAQAogICAgIG1DbGllbnQucmVzZXQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpkdW1wVG9Mb2coKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7fTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbG9jYWxQb3J0SWQ7CisgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKKyAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBBU1NFUlRfRVEoT0ssIG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgICAgICAgICAmYXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCAwIC8qdWlkKi8sICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCB7fSkpOworICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKK30KKworCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgSW5pdFN1Y2Nlc3MpIHsKICAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCiB9CiAKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgewogICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKG51bGxwdHIsICZoYW5kbGUsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsIG51bGxwdHIsIDApKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKQEAgLTE2MiwzNSArMjU3LDE4MCBAQAogICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CiAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGhhbmRsZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICBBU1NFUlRfRVEoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7Ci0gICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGcm9tTWl4KSB7Ci0gICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB1aWRfdCB1aWQgPSA0MjsKLSAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOwotICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNyYyA9IHBhdGNoLnNvdXJjZXNbMF07Ci0gICAgICAgIHNyYy5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKLSAgICAgICAgc3JjLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwotICAgICAgICBzcmMuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0tPmdldElkKCk7Ci0gICAgICAgIC8vIE5vdGU6IHRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgb3V0cHV0IGRldmljZS4KLSAgICAgICAgc3JjLnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICAgIHNyYy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAgICAgc3JjLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICB7Ci0gICAgICAgIGF1dG8mIHNpbmsgPSBwYXRjaC5zaW5rc1swXTsKLSAgICAgICAgc2luay5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgICAgIHNpbmsudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7Ci0gICAgICAgIHNpbmsuaWQgPSBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5nZXRJZCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgdWlkKSk7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXSkuCisgICAgICAgICAgICBhZGRTaW5rKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIHVpZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKLSAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAogLy8gVE9ETzogQWRkIHBhdGNoIGNyZWF0aW9uIHRlc3RzIHRoYXQgaW52b2x2ZSBhbHJlYWR5IGV4aXN0aW5nIHBhdGNoCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOworfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSB7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdXNpbmcgU2VyaWFsaXplciB0byBsb2FkIHBhcnQgb2YgdGhlIGNvbmZpZyBmcm9tIGEgc3RyaW5nLgorICAgIG1Nc2RPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX0JVUyk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBwY21PdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGFjM091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoYWMzT3V0cHV0UHJvZmlsZSk7CisgICAgbU1zZElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVUyk7CisgICAgLy8gTWF0Y2ggb3V0cHV0IHByb2ZpbGUgZnJvbSBBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbUlucHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDQ0MTAwKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIGNvbmZpZy0+YWRkQXZhaWxhYmxlRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWctPmdldEh3TW9kdWxlcygpOworICAgIG1vZHVsZXMuYWRkKG1zZE1vZHVsZSk7CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CisgICAgbU1zZE91dHB1dERldmljZS0+YXR0YWNoKG1zZE1vZHVsZSk7CisgICAgbU1zZElucHV0RGV2aWNlLT5hdHRhY2gobXNkTW9kdWxlKTsKKworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJtc2QgaW5wdXQiKSk7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1zZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUgPQorICAgICAgICAgICAgbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIGNvbXByZXNzZWQgaW5wdXQiKSk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShhYzNPdXRwdXRQcm9maWxlKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+c2V0RmxhZ3MoCisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUpOworCisgICAgc3A8SW5wdXRQcm9maWxlPiBtc2RJbnB1dFByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoIm1zZCBvdXRwdXQiKSk7CisgICAgbXNkSW5wdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtSW5wdXRQcm9maWxlKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkSW5wdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKG1zZElucHV0UHJvZmlsZSk7CisKKyAgICAvLyBBZGQgYSBwcm9maWxlIHdpdGggYW5vdGhlciBlbmNvZGluZyB0byB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gdGVzdCByb3V0aW5nCisgICAgLy8gb2Ygc3RyZWFtcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE1TRC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR0c091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIGNvbmZpZy0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT5hZGRBdWRpb1Byb2ZpbGUoZHRzT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgiZW5jb2RlZCIpKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShkdHNPdXRwdXRQcm9maWxlKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoY29uZmlnLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIGNvbmZpZy0+Z2V0SHdNb2R1bGVzKCkuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpLT4KKyAgICAgICAgICAgIGFkZE91dHB1dFByb2ZpbGUocHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkOjpUZWFyRG93bigpIHsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLmNsZWFyKCk7CisgICAgbU1zZElucHV0RGV2aWNlLmNsZWFyKCk7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CisgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CisgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIFBhdGNoQ3JlYXRpb25PblNldEZvcmNlVXNlKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0clBjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFBsdXNQY21Sb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyVW5zdXBwb3J0ZWRGb3JtYXRCeXBhc3Nlc01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CisgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX05FKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoLTEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYWU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIExPR19UQUcgIlN5c0F1ZGlvX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSW52YWxpZCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYICsgMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAwOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hWYWxpZCkgeworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICAvLyBJdCdzIE9LIG5vdCB0byBoYXZlIHNpbmtzLgorICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSkpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS4KKyAgICAgICAgICAgICAgICAgICAgYWRkU2luayhzaW5rKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoSHdBdlN5bmMpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworICAgIGRldmljZV9zcmNfY2ZnLmZsYWdzLmlucHV0ID0gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgZGV2aWNlX3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworICAgIGRldmljZV9zaW5rX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIG1peF9zaW5rX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKyAgICBtaXhfc2lua19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NyY19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKKyAgICBtaXhfc3JjX2NmZy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hFcXVhbCkgeworICAgIGNvbnN0IGF1ZGlvX3BhdGNoIHBhdGNoMXt9LCBwYXRjaDJ7fTsKKyAgICAvLyBJbnZhbGlkIHBhdGNoZXMgYXJlIG5vdCBlcXVhbC4KKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJnBhdGNoMSwgJnBhdGNoMikpOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNyYyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzaW5rID0geworICAgICAgICAuaWQgPSAyLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rX2h3X2F2X3N5bmMgPSBzaW5rOworICAgIHNpbmtfaHdfYXZfc3luYy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBzaW5rX2h3X2F2X3N5bmMuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMgYi9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTCmluZGV4IDE4YWNmZWUuLmY0OGE5NWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKKysrIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwpAQCAtMSw2ICsxIEBACi1jeWNoZW5AZ29vZ2xlLmNvbQotZXBlZXZAZ29vZ2xlLmNvbQotZXRhbHZhbGFAZ29vZ2xlLmNvbQotc2h1emhlbndhbmdAZ29vZ2xlLmNvbQoteWluY2hpYXllaEBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWY1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTc0IEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLworLy8gbGliY2FtZXJhc2VydmljZQorLy8KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlIiwKKworICAgIC8vIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQorCisgICAgc3JjczogWworICAgICAgICAiQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAiQ2FtZXJhRmxhc2hsaWdodC5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAiLAorICAgICAgICAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmFDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhMkNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJhcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIiwKKyAgICAgICAgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCisgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAorICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJ1dGlscy9UYWdNb25pdG9yLmNwcCIsCisgICAgICAgICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmV4aWYiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnl1diIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRlcHRocGhvdG8iLAorCisgICAgc3JjczogWworICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaW1hZ2VfaW8iLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDk2MjYxYWIuLjRjZmVjZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTQsOTEgKzE0LDkgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgbGliY2FtZXJhc2VydmljZQotIwotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDYW1lcmEgc2VydmljZSBzb3VyY2UKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICBcCi0gICAgQ2FtZXJhU2VydmljZS5jcHAgXAotICAgIENhbWVyYUZsYXNobGlnaHQuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIFwKLSAgICBjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBcCi0gICAgYXBpMS9DYW1lcmFDbGllbnQuY3BwIFwKLSAgICBhcGkxL0NhbWVyYTJDbGllbnQuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKLSAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKLSAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCi0gICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCi0gICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKLSAgICB1dGlscy9UYWdNb25pdG9yLmNwcCBcCi0gICAgdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJ1aSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlsc2NhbGxzdGFjayBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJmbXEgXAotICAgIGxpYmd1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40Ci0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIEJ1aWxkIHRlc3RzIHRvbworIyBCdWlsZCB0ZXN0cwogCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCmluZGV4IDQ3MWM3N2QuLmU2MjljZGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBjYW1lcmFJZHM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldENhbWVyYURldmljZUlkcygpOwogICAgIGludCBudW1iZXJPZkNhbWVyYXMgPSBzdGF0aWNfY2FzdDxpbnQ+KGlkcy5zaXplKCkpOwogICAgIGNhbWVyYUlkcy5yZXNpemUobnVtYmVyT2ZDYW1lcmFzKTsKICAgICAvLyBObyBtb2R1bGUsIG11c3QgYmUgcHJvdmlkZXIKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAgICAgICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBub3RpZnkgdG9yY2ggdW5hdmFpbGFibGUgZm9yIGFsbCBjYW1lcmFzIHdpdGggYSBmbGFzaAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgewogICAgICAgICAgICAgICAgIFN0cmluZzggaWQ4KGlkc1tpXS5jX3N0cigpKTsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiAgICAgaWYgKGlzQmFja3dhcmRDb21wYXRpYmxlTW9kZShjYW1lcmFJZCkpIHsKICAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZHMgPSBtUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcygpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgICAgIGludCBudW1DYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihpZHMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZzggaWQ4KGlkc1tpXS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMmJmNDJiNi4uM2U2MjEwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC00NywxMSArNDgsMTUgQEAKICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlICJoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgpAQCAtNjksNiArNzQsNyBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVHJhY2VzLmgiCiAjaW5jbHVkZSAidXRpbHMvVGFnTW9uaXRvci5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSB7CiAgICAgY29uc3QgY2hhcioga1Blcm1pc3Npb25TZXJ2aWNlTmFtZSA9ICJwZXJtaXNzaW9uIjsKQEAgLTc2LDcgKzgyLDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKQEAgLTExMSw2ICsxMTksMTQgQEAKIAogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0NBTUVSQSIpOwogCisvLyBNYXRjaGVzIHdpdGggUEVSQ0VQVElCTEVfQVBQX0FESiBpbiBQcm9jZXNzTGlzdC5qYXZhCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFNjb3JlID0gMjAwOworLy8gTWF0Y2hlcyB3aXRoIFBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVF9VSSBpbiBBY3Rpdml0eU1hbmFnZXIuamF2YQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWZW5kb3JDbGllbnRTdGF0ZSA9IDE7CisKK011dGV4IENhbWVyYVNlcnZpY2U6OnNQcm94eU11dGV4Oworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2U6OnNDYW1lcmFTZXJ2aWNlUHJveHk7CisKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVNlcnZpY2UoKSA6CiAgICAgICAgIG1FdmVudExvZyhERUZBVUxUX0VWRU5UX0xPR19MRU5HVEgpLAogICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzKDApLApAQCAtMTQxLDYgKzE1NywxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZW51bWVyYXRlUHJvdmlkZXJzKCkgewpAQCAtMTgxLDI1ICsyMDQsMjkgQEAKIAogICAgIGZvciAoYXV0byYgY2FtZXJhSWQgOiBkZXZpY2VJZHMpIHsKICAgICAgICAgU3RyaW5nOCBpZDggPSBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpOwotICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOworICAgICAgICBpZiAoZ2V0Q2FtZXJhU3RhdGUoaWQ4KSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKSB7Ci0gICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBudWxscHRyOwogI2lmbmRlZiBfX0JSSUxMT19fCi0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgYmVjYXVzZSBjYW1lcmFzZXJ2ZXIgbm9ybWFsbHkgc3RhcnRzIGJlZm9yZSB0aGUKLSAgICAvLyBzeXN0ZW0gc2VydmVyIGFuZCB0aGUgcHJveHkgc2VydmljZS4gU28gdGhlIGxvbmcgdGltZW91dCB0aGF0IGdldFNlcnZpY2UKLSAgICAvLyBoYXMgYmVmb3JlIGdpdmluZyB1cCBpcyBpbmFwcHJvcHJpYXRlLgotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYS5wcm94eSIpKTsKLSAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgcHJveHlCaW5kZXIgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzUHJveHlNdXRleCk7CisgICAgaWYgKHNDYW1lcmFTZXJ2aWNlUHJveHkgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgYmVjYXVzZSBjYW1lcmFzZXJ2ZXIgbm9ybWFsbHkgc3RhcnRzIGJlZm9yZSB0aGUKKyAgICAgICAgLy8gc3lzdGVtIHNlcnZlciBhbmQgdGhlIHByb3h5IHNlcnZpY2UuIFNvIHRoZSBsb25nIHRpbWVvdXQgdGhhdCBnZXRTZXJ2aWNlCisgICAgICAgIC8vIGhhcyBiZWZvcmUgZ2l2aW5nIHVwIGlzIGluYXBwcm9wcmlhdGUuCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYS5wcm94eSIpKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzQ2FtZXJhU2VydmljZVByb3h5ID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2VQcm94eT4oYmluZGVyKTsKKyAgICAgICAgfQogICAgIH0KICNlbmRpZgotICAgIHJldHVybiBwcm94eUJpbmRlcjsKKyAgICByZXR1cm4gc0NhbWVyYVNlcnZpY2VQcm94eTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgewpAQCAtMjA4LDkgKzIzNSwxOCBAQAogICAgIHByb3h5QmluZGVyLT5waW5nRm9yVXNlclVwZGF0ZSgpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworCisgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICBpLnNlY29uZC0+Z2V0TGlzdGVuZXIoKS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICB9Cit9CisKIENhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgewogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSB7CkBAIC0yNDYsNiArMjgyLDggQEAKICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKICAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmFkZChpZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKKworICAgICAgICBicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoaWQsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CiAgICAgfQogCiAgICAgdXBkYXRlQ2FtZXJhTnVtQW5kSWRzKCk7CkBAIC0zMjUsNyArMzYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCiAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXN7fSk7CiAgICAgICAgICAgICAvLyBFbnN1cmUgbm90IGluIGJpbmRlciBSUEMgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgICAgICJvbkRldmljZVN0YXR1c0NoYW5nZWQgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FtZXJhIHNlcnZpY2UgcHJvY2VzcyEiKTsKICAgICAgICAgICAgIGNsaWVudFRvRGlzY29ubmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICB9CkBAIC0zOTgsMTIgKzQzNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwotICAgICAgICBmb3IgKGF1dG8mIGkgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShuZXdTdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOwotICAgICAgICB9Ci0gICAgfQorICAgIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjYW1lcmFJZCwgbmV3U3RhdHVzKTsKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcyhpbnQzMl90IHR5cGUsIGludDMyX3QqIG51bUNhbWVyYXMpIHsKQEAgLTQ5MSwxNyArNTI0LDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODIsNyArNjM1LDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC01OTQsNyArNjQ3LDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjA3LDEyICs2NjAsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTYzNiw3ICs2OTAsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzI1LDcgKzc3OSw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTczNSw4ICs3ODksNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03NzUsOSArODI4LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODE3LDYgKzg3MCwyNSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCB1c2VySWQsIC8qaW5vdXQqL3VpZF90JiB1aWQsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodXNlcklkIDwgMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2VyOiAlZCIsIHVzZXJJZCk7CisgICAgICAgIGRwcmludGYoZXJyLCAiSW52YWxpZCB1c2VyOiAlZFxuIiwgdXNlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aWQgPSBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VySWQsIHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgLyppbm91dCovaW50JiBjbGllbnRVaWQsIC8qaW5vdXQqL2ludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewpAQCAtODM0LDcgKzkwNiw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NjgsOCArOTQwLDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTkwOCwxMSArOTgwLDIyIEBACiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIFVJRCBpcyBpbiBhbiBhY3RpdmUgc3RhdGUgdG8gdXNlIHRoZSBjYW1lcmEKICAgICBpZiAoIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNhbGxpbmdVaWQsIFN0cmluZzE2KGNsaWVudE5hbWU4KSkpIHsKKyAgICAgICAgaW50MzJfdCBwcm9jU3RhdGUgPSBtVWlkUG9saWN5LT5nZXRQcm9jU3RhdGUoY2FsbGluZ1VpZCk7CiAgICAgICAgIEFMT0dFKCJBY2Nlc3MgRGVuaWFsOiBjYW4ndCB1c2UgdGhlIGNhbWVyYSBmcm9tIGFuIGlkbGUgVUlEIHBpZD0lZCwgdWlkPSVkIiwKICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCi0gICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIGZyb20gYmFja2dyb3VuZCIsCi0gICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIGZyb20gYmFja2dyb3VuZCAoIgorICAgICAgICAgICAgICAgICJjYWxsaW5nIFVJRCAlZCBwcm9jIHN0YXRlICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBjYWxsaW5nVWlkLCBwcm9jU3RhdGUpOworICAgIH0KKworICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBwcmV2ZW50IGFjY2VzcyB0byB0aGUgY2FtZXJhCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgQUxPR0UoIkFjY2VzcyBEZW5pYWw6IGNhbm5vdCB1c2UgdGhlIGNhbWVyYSB3aGVuIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIHdoZW4gc2Vuc29yIHByaXZhY3kgIgorICAgICAgICAgICAgICAgICJpcyBlbmFibGVkIiwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgfQogCiAgICAgLy8gT25seSB1c2UgcGFzc2VkIGluIGNsaWVudFBpZCB0byBjaGVjayBwZXJtaXNzaW9uLiBVc2UgY2FsbGluZyBQSUQgYXMgdGhlIGNsaWVudCBQSUQgdGhhdCdzCkBAIC05MjMsOCArMTAwNiw5IEBACiAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CiAKICAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCi0gICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MuCi0gICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CisgICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MgT1IgdGhlIGNhbGxlciBpcyB1c2luZyB0aGUgY2FtZXJhc2VydmVyJ3MgSElETCBpbnRlcmZhY2UuCisgICAgaWYgKCFoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpICYmIGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIChtQWxsb3dlZFVzZXJzLmZpbmQoY2xpZW50VXNlcklkKSA9PSBtQWxsb3dlZFVzZXJzLmVuZCgpKSkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW5ub3QgY29ubmVjdCBmcm9tICIKICAgICAgICAgICAgICAgICAiZGV2aWNlIHVzZXIgJWQsIGN1cnJlbnRseSBhbGxvd2VkIGRldmljZSB1c2VyczogJXMpIiwgY2FsbGluZ1BpZCwgY2xpZW50VXNlcklkLAogICAgICAgICAgICAgICAgIHRvU3RyaW5nKG1BbGxvd2VkVXNlcnMpLnN0cmluZygpKTsKQEAgLTkzOCw3ICsxMDIyLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2hlY2tJZkRldmljZUlzVXNhYmxlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdCB7CiAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbWVyYVN0YXRlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmEgSUQgJXMpIiwgY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CkBAIC0xMDQzLDcgKzExMjcsOCBAQAogICAgICAgICBzdGQ6Om1hcDxpbnQscmVzb3VyY2VfcG9saWN5OjpDbGllbnRQcmlvcml0eT4gcGlkVG9Qcmlvcml0eU1hcDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvd25lclBpZHMuc2l6ZSgpIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICBwaWRUb1ByaW9yaXR5TWFwLmVtcGxhY2Uob3duZXJQaWRzW2ldLAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5KHByaW9yaXR5U2NvcmVzW2ldLCBzdGF0ZXNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfcG9saWN5OjpDbGllbnRQcmlvcml0eShwcmlvcml0eVNjb3Jlc1tpXSwgc3RhdGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzVmVuZG9yQ2xpZW50IHdvbid0IGdldCBjb3BpZWQgb3ZlciovIGZhbHNlKSk7CiAgICAgICAgIH0KICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIudXBkYXRlUHJpb3JpdGllcyhwaWRUb1ByaW9yaXR5TWFwKTsKIApAQCAtMTE0Miw3ICsxMjI3LDcgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKQEAgLTExNTAsNyArMTIzNSw3IEBACiAgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CiAgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLApAQCAtMTIwMCwxMSArMTI4NSwxMCBAQAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjI3LDEyICsxMzExLDExIEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIHRydWUsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNDEsNiArMTMyNCwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpIHsKKyAgICAvLyBJZiB0aGUgdGhyZWFkIHNlcnZpbmcgdGhpcyBjYWxsIGlzIG5vdCBhIGh3YmluZGVyIHRocmVhZCBhbmQgdGhlIGNhbGxlcgorICAgIC8vIGlzbid0IHRoZSBjYW1lcmFzZXJ2ZXIgaXRzZWxmLCBhbmQgdGhlIGNhbWVyYSBpZCBiZWluZyByZXF1ZXN0ZWQgaXMgdG8gYmUKKyAgICAvLyBwdWJsaWNhbGx5IGhpZGRlbiwgd2Ugc2hvdWxkIHJlamVjdCB0aGUgY29ubmVjdGlvbi4KKyAgICBpZiAoIWhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkgJiYKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZSgKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLApAQCAtMTI1MywxNSArMTM0OCwxNCBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCiAgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjczLDcgKzEzNjcsNyBAQAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCkBAIC0xMjg2LDYgKzEzODAsMTQgQEAKICAgICAgICAgICAgIChoYWxWZXJzaW9uID09IC0xKSA/ICJkZWZhdWx0IiA6IHN0ZDo6dG9fc3RyaW5nKGhhbFZlcnNpb24pLmNfc3RyKCksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGVmZmVjdGl2ZUFwaUxldmVsKSk7CiAKKyAgICBpZiAoc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjYW1lcmFJZCkpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBzeXN0ZW0tb25seSBjYW1lcmEgaWQgJXMsIGNvbm5lY3Rpb24gcmVqZWN0ZWQiLAorICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgfQogICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCkBAIC0xMzU4LDcgKzE0NjAsNyBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0NDIsNyArMTU0NCw3IEBACiAgICAgfQogCiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyB2ZXJpZnkgaWQgaXMgdmFsaWQuCiAgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKQEAgLTE1NDQsMTggKzE2NDYsNDIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludCBjbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGNoYXIgKmlkX2NzdHIgPSBpZC5jX3N0cigpOworICAgIGNvbnN0IGNoYXIgKnRvcmNoU3RhdGUgPSBlbmFibGVkID8gIm9uIiA6ICJvZmYiOworICAgIEFMT0dJKCJUb3JjaCBmb3IgY2FtZXJhIGlkICVzIHR1cm5lZCAlcyBmb3IgY2xpZW50IFBJRCAlZCIsIGlkX2NzdHIsIHRvcmNoU3RhdGUsIGNsaWVudFBpZCk7CisgICAgbG9nVG9yY2hFdmVudChpZF9jc3RyLCB0b3JjaFN0YXRlICwgY2xpZW50UGlkKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncykgeworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKKyAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcworICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAvLyBFbnN1cmUgd2UncmUgYmVpbmcgY2FsbGVkIGJ5IHN5c3RlbV9zZXJ2ZXIsIG9yIHNpbWlsYXIgcHJvY2VzcyB3aXRoCisgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCisgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMiCisgICAgICAgICAgICAgICAgICAgICIgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBzd2l0Y2goZXZlbnRJZCkgewogICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpFVkVOVF9VU0VSX1NXSVRDSEVEOiB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBwb2xpY3kgdXBkYXRlcywgaW4gY2FzZSB3ZSdyZSByZWNvdmVyaW5nCisgICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBhbmQgc2Vuc29yIHByaXZhY3kgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZwogICAgICAgICAgICAgLy8gZnJvbSBhIHN5c3RlbSBzZXJ2ZXIgY3Jhc2gKICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovIGFyZ3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1NjksOSArMTY5NSw3MiBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5TW9uaXRvcmVkVWlkcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gaXQuc2Vjb25kLT5nZXRMaXN0ZW5lcigpLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdHJpZ2dlciBwZXJtaXNzaW9uIGNhbGxiYWNrOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcmV0LmV4Y2VwdGlvbkNvZGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKKworICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCisgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CisgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKKyAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCisgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgIiBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZXt9OworICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpCQUNLX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6RlJPTlRfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GT0xERUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZPTERFRDsKKyAgICB9CisgICAgLy8gT25seSBtYXAgdmVuZG9yIGJpdHMgZGlyZWN0bHkKKyAgICB1aW50NjRfdCB2ZW5kb3JCaXRzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5ld1N0YXRlKSAmIDB4RkZGRkZGRkYwMDAwMDAwMGw7CisgICAgbmV3RGV2aWNlU3RhdGUgfD0gdmVuZG9yQml0czsKKworICAgIEFMT0dWKCIlczogTmV3IGRldmljZSBzdGF0ZSAweCUiIFBSSXg2NCwgX19GVU5DVElPTl9fLCBuZXdEZXZpY2VTdGF0ZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcykgeworICAgIHJldHVybiBhZGRMaXN0ZW5lckhlbHBlcihsaXN0ZW5lciwgY2FtZXJhU3RhdHVzZXMpOworfQorCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAvKm91dCovCisgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcywKKyAgICAgICAgYm9vbCBpc1ZlbmRvckxpc3RlbmVyKSB7CisKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgQUxPR1YoIiVzOiBBZGQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKQEAgLTE1ODUsMjEgKzE3NzQsMzcgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7Ci0gICAgICAgIGZvciAoYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LnNlY29uZC0+Z2V0TGlzdGVuZXIoKSkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9BTFJFQURZX0VYSVNUUywgIkxpc3RlbmVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOworICAgICAgICBhdXRvIGNsaWVudFVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIHNwPFNlcnZpY2VMaXN0ZW5lcj4gc2VydmljZUxpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lciwgY2xpZW50VWlkKTsKKyAgICAgICAgYXV0byByZXQgPSBzZXJ2aWNlTGlzdGVuZXItPmluaXRpYWxpemUoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBpbml0aWFsaXplIHNlcnZpY2UgbGlzdGVuZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyTGlzdC5lbXBsYWNlX2JhY2soaXNWZW5kb3JMaXN0ZW5lciwgc2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKGNsaWVudFVpZCk7CiAgICAgfQogCiAgICAgLyogQ29sbGVjdCBjdXJyZW50IGRldmljZXMgYW5kIHN0YXR1cyAqLwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBpZiAoIWlzVmVuZG9yTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoaS5maXJzdC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYW5ub3QgYWRkIHB1YmxpYyBsaXN0ZW5lciBmb3IgaGlkZGVuIHN5c3RlbS1vbmx5ICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGkuZmlyc3QuY19zdHIoKSwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYzNCw3ICsxODM5LDkgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyKCkpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyVWlkKCkpOworICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKS0+dW5saW5rVG9EZWF0aChpdC0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgfQpAQCAtMTY5Miw3ICsxODk5LDcgQEAKICAgICB9CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CkBAIC0xNzA5LDYgKzE5MTYsNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKQEAgLTE3MjksNiArMTkzNywxOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgLypvdXQqLyBib29sICppc1N1cHBvcnRlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBjb25zdCBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZCk7CisKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICppc1N1cHBvcnRlZCA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoaWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgewpAQCAtMTg3NiwxMyArMjA5NiwxMyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgewogICAgICAgICBpLT5kaXNjb25uZWN0KCk7CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jawogICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CkBAIC0xOTE1LDYgKzIxMzUsMTIgQEAKICAgICAgICAgICAgIGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlLCBjbGllbnRQaWQsIHJlYXNvbikpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1RvcmNoRXZlbnQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIgKnRvcmNoU3RhdGUsIGludCBjbGllbnRQaWQpIHsKKyAgICAvLyBMb2cgdG9yY2ggZXZlbnQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlRvcmNoIGZvciBjYW1lcmEgaWQgJXMgdHVybmVkICVzIGZvciBjbGllbnQgUElEICVkIiwgY2FtZXJhSWQsCisgICAgICAgICAgICB0b3JjaFN0YXRlLCBjbGllbnRQaWQpKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dVc2VyU3dpdGNoKGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgb2xkVXNlcklkcywKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBuZXdVc2VySWRzKSB7CiAgICAgU3RyaW5nOCBuZXdVc2VycyA9IHRvU3RyaW5nKG5ld1VzZXJJZHMpOwpAQCAtMTk1MCw5ICsyMTc2LDYgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogCi0gICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwotCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CkBAIC0xOTc5LDIwICsyMjAyLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Tk9USUZZU1lTVEVNRVZFTlQ6IHsKLSAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgewotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKLSAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yMDE4LDMxICsyMjI3LDM3IEBACiAgICAgcmV0dXJuIG1wOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OmxvYWRTb3VuZCgpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6aW5jcmVhc2VTb3VuZFJlZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU291bmRMb2NrKTsKKyAgICBtU291bmRSZWYrKzsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmRMb2NrZWQoc291bmRfa2luZCBraW5kKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmxvYWRTb3VuZCByZWY9JWQiLCBtU291bmRSZWYpOwotICAgIGlmIChtU291bmRSZWYrKykgcmV0dXJuOwotCi0gICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9wcm9kdWN0L21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKLSAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKLSAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOwotICAgIH0KLSAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKLSAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gbnVsbHB0cikgewotICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6bG9hZFNvdW5kTG9ja2VkIHJlZj0lZCIsIG1Tb3VuZFJlZik7CisgICAgaWYgKFNPVU5EX1NIVVRURVIgPT0ga2luZCAmJiBtU291bmRQbGF5ZXJbU09VTkRfU0hVVFRFUl0gPT0gTlVMTCkgeworICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfU0hVVFRFUl0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOworICAgICAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Tb3VuZFBsYXllcltTT1VORF9TSFVUVEVSXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoU09VTkRfUkVDT1JESU5HX1NUQVJUID09IGtpbmQgJiYgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gIE5VTEwpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7CisgICAgICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CiAgICAgICAgICAgICAgICAgbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7Ci0gICAgfQotICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9TdG9wLm9nZyIpOwotICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKLSAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvU3RvcC5vZ2ciKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoU09VTkRfUkVDT1JESU5HX1NUT1AgPT0ga2luZCAmJiBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IE5VTEwpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6cmVsZWFzZVNvdW5kKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpkZWNyZWFzZVNvdW5kUmVmKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbGVhc2VTb3VuZCByZWY9JWQiLCBtU291bmRSZWYpOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmRlY3JlYXNlU291bmRSZWYgcmVmPSVkIiwgbVNvdW5kUmVmKTsKICAgICBpZiAoLS1tU291bmRSZWYpIHJldHVybjsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NPVU5EUzsgaSsrKSB7CkBAIC0yMDU4LDYgKzIyNzMsNyBAQAogCiAgICAgTE9HMSgicGxheVNvdW5kKCVkKSIsIGtpbmQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOworICAgIGxvYWRTb3VuZExvY2tlZChraW5kKTsKICAgICBzcDxNZWRpYVBsYXllcj4gcGxheWVyID0gbVNvdW5kUGxheWVyW2tpbmRdOwogICAgIGlmIChwbGF5ZXIgIT0gMCkgewogICAgICAgICBwbGF5ZXItPnNlZWtUbygwKTsKQEAgLTIwODIsMTIgKzIyOTgsMTIgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwogCi0gICAgY2FtZXJhU2VydmljZS0+bG9hZFNvdW5kKCk7CisgICAgY2FtZXJhU2VydmljZS0+aW5jcmVhc2VTb3VuZFJlZigpOwogCiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogfQpAQCAtMjA5Nyw3ICsyMzEzLDcgQEAKICAgICBBTE9HVigifkNsaWVudCIpOwogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgc0NhbWVyYVNlcnZpY2UtPnJlbGVhc2VTb3VuZCgpOworICAgIHNDYW1lcmFTZXJ2aWNlLT5kZWNyZWFzZVNvdW5kUmVmKCk7CiAgICAgLy8gdW5jb25kaXRpb25hbGx5IGRpc2Nvbm5lY3QuIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQKICAgICBDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIH0KQEAgLTIxNTIsNiArMjM2OCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSA9IHBhY2thZ2VzWzBdOwogICAgIH0KKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3JDbGllbnQgPQorICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigidmVuZG9yLmNsaWVudC5waWQ8JWQ+IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSA9IFN0cmluZzE2KHZlbmRvckNsaWVudC5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXBwT3BzTWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8QXBwT3BzTWFuYWdlcj4oKTsKKyAgICB9CiB9CiAKIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Ojp+QmFzaWNDbGllbnQoKSB7CkBAIC0yMTY3LDggKzIzOTAsOSBAQAogICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwogCiAgICAgc0NhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOwotICAgIHNDYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQobUNhbWVyYUlkU3RyLCBtQ2xpZW50UGlkLAotICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bG9nRGlzY29ubmVjdGVkKG1DYW1lcmFJZFN0ciwgbUNsaWVudFBpZCwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+cmVtb3ZlUmVmKENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6RGV2aWNlTW9kZTo6Q0FNRVJBLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyLmNfc3RyKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CiAgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CkBAIC0yMTkxLDcgKzI0MTUsNyBAQAogICAgIC8vIE5vIGR1bXBpbmcgb2YgY2xpZW50cyBkaXJlY3RseSBvdmVyIEJpbmRlciwKICAgICAvLyBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6ZHVtcAogICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKFNOX0VWRU5UX0xPR19JRCwgIjI2MjY1NDAzIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMTYsMzEgKzI0NDAsMzEgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgaW50MzJfdCByZXM7Ci0gICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIG5vdCBhdmFpbGFibGUKLSAgICBtT3BzQ2FsbGJhY2sgPSBuZXcgT3BzQ2FsbGJhY2sodGhpcyk7Ci0KICAgICB7CiAgICAgICAgIEFMT0dWKCIlczogU3RhcnQgY2FtZXJhIG9wcywgcGFja2FnZSBuYW1lID0gJXMsIGNsaWVudCBVSUQgPSAlZCIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBtQ2xpZW50VWlkKTsKICAgICB9CisgICAgaWYgKG1BcHBPcHNNYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgbU9wc0NhbGxiYWNrID0gbmV3IE9wc0NhbGxiYWNrKHRoaXMpOworICAgICAgICBpbnQzMl90IHJlczsKKyAgICAgICAgbUFwcE9wc01hbmFnZXItPnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKKyAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUsIG1PcHNDYWxsYmFjayk7CisgICAgICAgIHJlcyA9IG1BcHBPcHNNYW5hZ2VyLT5zdGFydE9wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCisgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKTsKIAotICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKLSAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgbU9wc0NhbGxiYWNrKTsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5zdGFydE9wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCi0gICAgICAgICAgICBtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpOworICAgICAgICBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfRVJST1JFRCkgeworICAgICAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQogCi0gICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0lHTk9SRUQpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwotICAgICAgICAvLyBSZXR1cm4gdGhlIHNhbWUgZXJyb3IgYXMgZm9yIGRldmljZSBwb2xpY3kgbWFuYWdlciByZWplY3Rpb24KLSAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisgICAgICAgIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7CisgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzYW1lIGVycm9yIGFzIGZvciBkZXZpY2UgcG9saWN5IG1hbmFnZXIgcmVqZWN0aW9uCisgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1PcHNBY3RpdmUgPSB0cnVlOwpAQCAtMjI1Niw2ICsyNDgwLDggQEAKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfT1BFTiwKICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAKKyAgICBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjY1LDEwICsyNDkxLDExIEBACiAgICAgLy8gQ2hlY2sgaWYgc3RhcnRDYW1lcmFPcHMgc3VjY2VlZGVkLCBhbmQgaWYgc28sIGZpbmlzaCB0aGUgY2FtZXJhIG9wCiAgICAgaWYgKG1PcHNBY3RpdmUpIHsKICAgICAgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIGF2YWlsYWJsZSBhZ2FpbgotICAgICAgICBtQXBwT3BzTWFuYWdlci5maW5pc2hPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOwotCisgICAgICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQXBwT3BzTWFuYWdlci0+ZmluaXNoT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CiAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgZGlzY29ubmVjdHMuIFRoaXMgc2hvdWxkCiAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNhbWVyYSwgYnV0IGFjdHVhbGx5IG9ubHkgaWYgaXQgd2FzIGluIGEgcHJvcGVyCiAgICAgICAgIC8vIGZ1bmN0aW9uYWwgc3RhdGUsIGkuZS4gd2l0aCBzdGF0dXMgTk9UX0FWQUlMQUJMRQpAQCAtMjI4OCwyNyArMjUxNSwyOCBAQAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKLSAgICBpZiAobU9wc0NhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BzQ2FsbGJhY2spOworICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLT5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CiAgICAgfQogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCisgICAgc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIFN0cmluZzggbmFtZShwYWNrYWdlTmFtZSk7Ci0gICAgU3RyaW5nOCBteU5hbWUobUNsaWVudFBhY2thZ2VOYW1lKTsKLQorICAgIGlmIChtQXBwT3BzTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKG9wICE9IEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSkgewogICAgICAgICBBTE9HVygiVW5leHBlY3RlZCBhcHAgb3BzIG5vdGlmaWNhdGlvbiByZWNlaXZlZDogJWQiLCBvcCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpbnQzMl90IHJlczsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5jaGVja09wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKKyAgICByZXMgPSBtQXBwT3BzTWFuYWdlci0+Y2hlY2tPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCiAgICAgICAgICAgICBtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgIEFMT0dWKCJjaGVja09wIHJldHVybnM6ICVkLCAlcyAiLCByZXMsCiAgICAgICAgICAgICByZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEID8gIkFMTE9XRUQiIDoKQEAgLTIzMTgsNyArMjU0Niw3IEBACiAKICAgICBpZiAocmVzICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewogICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiByZXZva2VkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgICAgIG15TmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgICAgIGJsb2NrKCk7CiAgICAgfQogfQpAQCAtMjMyOCw3ICsyNTU2LDcgQEAKIAogICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVELCByZXN1bHRFeHRyYXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTIzODMsNyArMjYxMSw3IEBACiAgICAgaWYgKG1SZWdpc3RlcmVkKSByZXR1cm47CiAgICAgYW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUsCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKICAgICAgICAgICAgIFN0cmluZzE2KCJjYW1lcmFzZXJ2ZXIiKSk7CiAgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CkBAIC0yNDI5LDYgKzI2NTcsNTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICBpbnQ2NF90IC8qcHJvY1N0YXRlU2VxKi8pIHsKKyAgICBib29sIHByb2NTdGF0ZUNoYW5nZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgIT0gcHJvY1N0YXRlKSkgeworICAgICAgICAgICAgbU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdCA9IHByb2NTdGF0ZTsKKyAgICAgICAgICAgIHByb2NTdGF0ZUNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY1N0YXRlQ2hhbmdlKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU1vbml0b3JlZFVpZHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiAodWlkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90PiAoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCAxKSkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgYXV0byBpdCA9IG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQtLTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQuc2Vjb25kID09IDApIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHVucmVnaXN0ZXIgdWlkOiAlZCB3aGljaCBpcyBub3QgbW9uaXRvcmVkISIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICB9Cit9CisKIGJvb2wgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKICAgICByZXR1cm4gaXNVaWRBY3RpdmVMb2NrZWQodWlkLCBjYWxsaW5nUGFja2FnZSk7CkBAIC0yNDkxLDYgKzI3NjQsMTkgQEAKICAgICByZXR1cm4gYWN0aXZlOwogfQogCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgcmV0dXJuIGdldFByb2NTdGF0ZUxvY2tlZCh1aWQpOworfQorCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCkgeworICAgIGludDMyX3QgcHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0OworICAgIH0KKyAgICByZXR1cm4gcHJvY1N0YXRlOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6VWlkUG9saWN5OjphZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsCiAgICAgICAgIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSkgewogICAgIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgY2FsbGluZ1BhY2thZ2UsIGFjdGl2ZSwgdHJ1ZSk7CkBAIC0yNTI5LDYgKzI4MTUsNTkgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBTZW5zb3JQcml2YWN5UG9saWN5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBpZiAobVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBzcG0uaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworICAgIHN0YXR1c190IHJlcyA9IHNwbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBzcG0udW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBVbnJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKyAgICAvLyBpZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYmxvY2sgYWxsIGNsaWVudHMgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYQorICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPmJsb2NrQWxsQ2xpZW50cygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFNlbnNvclByaXZhY3lNYW5hZ2VyIGhhcyBkaWVkIik7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICBDYW1lcmFTdGF0ZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNjU1LDggKzI5OTQsMTIgQEAKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLAogICAgICAgICBpbnQzMl90IHN0YXRlKSB7CiAKKyAgICBib29sIGlzVmVuZG9yQ2xpZW50ID0gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKTsKKyAgICBpbnQzMl90IHNjb3JlX2FkaiA9IGlzVmVuZG9yQ2xpZW50ID8ga1ZlbmRvckNsaWVudFNjb3JlIDogc2NvcmU7CisgICAgaW50MzJfdCBzdGF0ZV9hZGogPSBpc1ZlbmRvckNsaWVudCA/IGtWZW5kb3JDbGllbnRTdGF0ZTogc3RhdGU7CisKICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4oCi0gICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlLCBvd25lcklkLCBzdGF0ZSk7CisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlX2Fkaiwgb3duZXJJZCwgc3RhdGVfYWRqLCBpc1ZlbmRvckNsaWVudCk7CiB9CiAKIENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCkBAIC0yNjg5LDggKzMwMzIsOCBAQAogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKQEAgLTI4NjMsNyArMzIwNiw3IEBACiAgICAgICAqIGJpbmRlciBkcml2ZXIKICAgICAgICovCiAgICAgLy8gUElEIGhlcmUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBiZSB3cm9uZy4KLSAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOworICAgIGxvZ0NsaWVudERpZWQoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCiAgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CiAgICAgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKHdobyk7CkBAIC0yOTE5LDcgKzMyNjIsMTQgQEAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpc3RlbmVyIDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTYoY2FtZXJhSWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2tpcHBpbmcgY2FtZXJhIGRpc2NvdmVyeSBjYWxsYmFjayBmb3Igc3lzdGVtLW9ubHkgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZWNvbmQtPmdldExpc3RlbmVyKCktPm9uU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY2FtZXJhSWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiB9CkBAIC0zMDE0LDYgKzMzNjQsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tBbGxDbGllbnRzKCkgeworICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5ibG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uLCBudWxscHRyLCBudWxscHRyKSkgewpAQCAtMzAyMiwxMSArMzM4NCwxMSBAQAogICAgIGlmIChpbiA9PSBCQURfVFlQRSB8fCBvdXQgPT0gQkFEX1RZUEUgfHwgZXJyID09IEJBRF9UWVBFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChhcmdzLnNpemUoKSA9PSAzICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC11aWQtc3RhdGUiKSkgeworICAgIGlmIChhcmdzLnNpemUoKSA+PSAzICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC11aWQtc3RhdGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlU2V0VWlkU3RhdGUoYXJncywgZXJyKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigicmVzZXQtdWlkLXN0YXRlIikpIHsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigicmVzZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVJlc2V0VWlkU3RhdGUoYXJncywgZXJyKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiZ2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlR2V0VWlkU3RhdGUoYXJncywgb3V0LCBlcnIpOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKICAgICAgICAgcHJpbnRIZWxwKG91dCk7CkBAIC0zMDM3LDEzICszMzk5LDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycikgewotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOwotICAgIGludCB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKGFyZ3NbMV0sIDApOwotICAgIGlmICh1aWQgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7Ci0gICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUgPSBhcmdzWzFdOworCiAgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKICAgICBpZiAoYXJnc1syXSA9PSBTdHJpbmcxNigiYWN0aXZlIikpIHsKICAgICAgICAgYWN0aXZlID0gdHJ1ZTsKQEAgLTMwNTEsMzEgKzM0MDgsNTIgQEAKICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGFjdGl2ZSBvciBpZGxlIGJ1dCBnb3Q6ICclcyciLCBTdHJpbmc4KGFyZ3NbMl0pLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgbVVpZFBvbGljeS0+YWRkT3ZlcnJpZGVVaWQodWlkLCBhcmdzWzFdLCBhY3RpdmUpOworCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDUgJiYgYXJnc1szXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbNF0pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1VaWRQb2xpY3ktPmFkZE92ZXJyaWRlVWlkKHVpZCwgcGFja2FnZU5hbWUsIGFjdGl2ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVSZXNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDwgMCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7Ci0gICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZSA9IGFyZ3NbMV07CisKKyAgICBpbnQgdXNlcklkID0gMDsKKyAgICBpZiAoYXJncy5zaXplKCkgPj0gNCAmJiBhcmdzWzJdID09IFN0cmluZzE2KCItLXVzZXIiKSkgeworICAgICAgICB1c2VySWQgPSBhdG9pKFN0cmluZzgoYXJnc1szXSkpOworICAgIH0KKworICAgIHVpZF90IHVpZDsKKyAgICBpZiAoZ2V0VWlkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgdXNlcklkLCB1aWQsIGVycikgPT0gQkFEX1ZBTFVFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIG1VaWRQb2xpY3ktPnJlbW92ZU92ZXJyaWRlVWlkKHVpZCwgYXJnc1sxXSk7CisKKyAgICBtVWlkUG9saWN5LT5yZW1vdmVPdmVycmlkZVVpZCh1aWQsIHBhY2thZ2VOYW1lKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUdldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUgPSBhcmdzWzFdOworCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDQgJiYgYXJnc1syXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbM10pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAobVVpZFBvbGljeS0+aXNVaWRBY3RpdmUodWlkLCBhcmdzWzFdKSkgeworCisgICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKHVpZCwgcGFja2FnZU5hbWUpKSB7CiAgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImFjdGl2ZVxuIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGRwcmludGYob3V0LCAiaWRsZVxuIik7CkBAIC0zMDg0LDkgKzM0NjIsOSBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgewogICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkNhbWVyYSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgotICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKLSAgICAgICAgIiAgc2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gPGFjdGl2ZXxpZGxlPiBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgotICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCisgICAgICAgICIgIGdldC11aWQtc3RhdGUgPFBBQ0tBR0U+IFstLXVzZXIgVVNFUl9JRF0gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCisgICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gWy0tdXNlciBVU0VSX0lEXSBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IFstLXVzZXIgVVNFUl9JRF0gY2xlYXJzIHRoZSB1aWQgc3RhdGUgb3ZlcnJpZGVcbiIKICAgICAgICAgIiAgaGVscCBwcmludCB0aGlzIG1lc3NhZ2VcbiIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggOGQ0YmNkYi4uMDY1MTU3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CiAKQEAgLTE1MywxMiArMTU0LDE5IEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOworCiAgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IGFwaVZlcnNpb24sCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xNjcsNiArMTc1LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgYmluZGVyOjpTdGF0dXMgICAgICBhZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4qIGNhbWVyYVN0YXR1c2VzLCBib29sIGlzVmVuZG9yID0gZmFsc2UpOworCisgICAgLy8gTW9uaXRvcmVkIFVJRHMgYXZhaWxhYmlsaXR5IG5vdGlmaWNhdGlvbgorICAgIHZvaWQgICAgICAgICAgICAgICAgbm90aWZ5TW9uaXRvcmVkVWlkcygpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIApAQCAtMTc3LDEwICsxOTIsMTAgQEAKICAgICAgICAgTlVNX1NPVU5EUwogICAgIH07CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgIGxvYWRTb3VuZCgpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgcGxheVNvdW5kKHNvdW5kX2tpbmQga2luZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICByZWxlYXNlU291bmQoKTsKLQorICAgIHZvaWQgICAgICAgICAgICAgICAgbG9hZFNvdW5kTG9ja2VkKHNvdW5kX2tpbmQga2luZCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBkZWNyZWFzZVNvdW5kUmVmKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBpbmNyZWFzZVNvdW5kUmVmKCk7CiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdGF0ZSBvZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UgKG9wZW4vY2xvc2UvYWN0aXZlL2lkbGUpIHdpdGgKICAgICAgKiB0aGUgY2FtZXJhIHByb3h5IHNlcnZpY2UgaW4gdGhlIHN5c3RlbSBzZXJ2aWNlCkBAIC0yNzgsNyArMjkzLDcgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYW1lcmFPcHMoKTsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIEFwcE9wc01hbmFnZXIgICAgICAgICAgICAgICAgICAgbUFwcE9wc01hbmFnZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBcHBPcHNNYW5hZ2VyPiAgbUFwcE9wc01hbmFnZXIgPSBudWxscHRyOwogCiAgICAgICAgIGNsYXNzIE9wc0NhbGxiYWNrIDogcHVibGljIEJuQXBwT3BzQ2FsbGJhY2sgewogICAgICAgICBwdWJsaWM6CkBAIC01MjcsMjkgKzU0Miw2NCBAQAogICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CiAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKKyAgICAgICAgaW50MzJfdCBnZXRQcm9jU3RhdGUodWlkX3QgdWlkKTsKIAogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOwogICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCk7CiAgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CisgICAgICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSwgaW50NjRfdCBwcm9jU3RhdGVTZXEpOwogCiAgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUpOwogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpOwogCisgICAgICAgIHZvaWQgcmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgdW5yZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKTsKKwogICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKICAgICBwcml2YXRlOgogICAgICAgICBib29sIGlzVWlkQWN0aXZlTG9ja2VkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpOworICAgICAgICBpbnQzMl90IGdldFByb2NTdGF0ZUxvY2tlZCh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CiAKICAgICAgICAgTXV0ZXggbVVpZExvY2s7CiAgICAgICAgIGJvb2wgbVJlZ2lzdGVyZWQ7CiAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IG1BY3RpdmVVaWRzOworICAgICAgICAvLyBNb25pdG9yZWQgdWlkIG1hcCB0byBjYWNoZWQgcHJvY1N0YXRlIGFuZCByZWZDb3VudCBwYWlyCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGludDMyX3QsIHNpemVfdD4+IG1Nb25pdG9yZWRVaWRzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7CiAgICAgfTsgLy8gY2xhc3MgVWlkUG9saWN5CiAKKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIGFwcHMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBhY3RpdmUsIHNob3VsZCBiZQorICAgIC8vIHByZXZlbnRlZCBmcm9tIGFjY2Vzc2luZyB0aGUgY2FtZXJhLgorICAgIGNsYXNzIFNlbnNvclByaXZhY3lQb2xpY3kgOiBwdWJsaWMgaGFyZHdhcmU6OkJuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLAorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1TZW5zb3JQcml2YWN5RW5hYmxlZChmYWxzZSksIG1SZWdpc3RlcmVkKGZhbHNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgTXV0ZXggbVNlbnNvclByaXZhY3lMb2NrOworICAgICAgICAgICAgYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgICAgICAgICBib29sIG1SZWdpc3RlcmVkOworICAgIH07CisKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CiAKKyAgICBzcDxTZW5zb3JQcml2YWN5UG9saWN5PiBtU2Vuc29yUHJpdmFjeVBvbGljeTsKKwogICAgIC8vIERlbGF5LWxvYWQgdGhlIENhbWVyYSBIQUwgbW9kdWxlCiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIApAQCAtNTgxLDEyICs2MzEsMTUgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwogCisgICAgLy8gU2hvdWxkIGFuIG9wZXJhdGlvbiBhdHRlbXB0IG9uIGEgY2FtZXJhSWQgYmUgcmVqZWN0ZWQsIGlmIHRoZSBjYW1lcmEgaWQgaXMKKyAgICAvLyBhZHZlcnRpc2VkIGFzIGEgcHVibGljYWxseSBoaWRkZW4gc2VjdXJlIGNhbWVyYSwgYnkgdGhlIGNhbWVyYSBIQUwgPworICAgIGJvb2wgc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpOworCiAgICAgLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbm5lY3QgY2FsbHMKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtNjk1LDYgKzc0OCwxMSBAQAogICAgICAgICAgICAgY29uc3QgY2hhciogcmVhc29uKTsKIAogICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB3aGVuIGEgY2xpZW50IGNhbGxzIHNldFRvcmNoTW9kZSBzdWNjZXNmdWxseS4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ1RvcmNoRXZlbnQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIgKnRvcmNoU3RhdGUsIGludCBjbGllbnRQaWQpOworCisgICAgLyoqCiAgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgdGhlIGN1cnJlbnQgZGV2aWNlIHVzZXIgaGFzIGJlZW4gc3dpdGNoZWQuCiAgICAgICovCiAgICAgdm9pZCBsb2dVc2VyU3dpdGNoKGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgb2xkVXNlcklkcywKQEAgLTc0Nyw4ICs4MDUsMzQgQEAKIAogICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbUNhbWVyYVByb3ZpZGVyTWFuYWdlcjsKIAorICAgIGNsYXNzIFNlcnZpY2VMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU2VydmljZUxpc3RlbmVyKHNwPENhbWVyYVNlcnZpY2U+IHBhcmVudCwgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgdWlkKSA6IG1QYXJlbnQocGFyZW50KSwgbUxpc3RlbmVyKGxpc3RlbmVyKSwgbUxpc3RlbmVyVWlkKHVpZCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSUludGVyZmFjZTo6YXNCaW5kZXIobUxpc3RlbmVyKS0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICYvKndobyovKSB7CisgICAgICAgICAgICAgICAgYXV0byBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5yZW1vdmVMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGdldExpc3RlbmVyVWlkKCkgeyByZXR1cm4gbUxpc3RlbmVyVWlkOyB9CisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXIoKSB7IHJldHVybiBtTGlzdGVuZXI7IH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVBhcmVudDsKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgICAgICAgICBpbnQgbUxpc3RlbmVyVWlkOworICAgIH07CisKICAgICAvLyBHdWFyZGVkIGJ5IG1TdGF0dXNMaXN0ZW5lck11dGV4Ci0gICAgc3RkOjp2ZWN0b3I8c3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PiBtTGlzdGVuZXJMaXN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxib29sLCBzcDxTZXJ2aWNlTGlzdGVuZXI+Pj4gbUxpc3RlbmVyTGlzdDsKKwogICAgIE11dGV4ICAgICAgIG1TdGF0dXNMaXN0ZW5lckxvY2s7CiAKICAgICAvKioKQEAgLTgyMCw2ICs5MDQsOSBAQAogICAgIC8vIEJsb2NrcyBhbGwgY2xpZW50cyBmcm9tIHRoZSBVSUQKICAgICB2b2lkIGJsb2NrQ2xpZW50c0ZvclVpZCh1aWRfdCB1aWQpOwogCisgICAgLy8gQmxvY2tzIGFsbCBhY3RpdmUgY2xpZW50cy4KKyAgICB2b2lkIGJsb2NrQWxsQ2xpZW50cygpOworCiAgICAgLy8gT3ZlcnJpZGVzIHRoZSBVSUQgc3RhdGUgYXMgaWYgaXQgaXMgaWRsZQogICAgIHN0YXR1c190IGhhbmRsZVNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOwogCkBAIC04MzIsMTAgKzkxOSw2IEBACiAgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKICAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CiAKLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKLQotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOwotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFzIGEgZm9ybWF0dGVkIHN0cmluZy4KICAgICAgKi8KQEAgLTg0NCw3ICs5MjcsNyBAQAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwpAQCAtODU0LDkgKzkzNywxNiBAQAogICAgIHN0YXRpYyBTdGF0dXNJbnRlcm5hbCBtYXBUb0ludGVybmFsKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CiAgICAgc3RhdGljIGludDMyX3QgbWFwVG9JbnRlcmZhY2UoU3RhdHVzSW50ZXJuYWwgc3RhdHVzKTsKIAorICAgIC8vIEd1YXJkIG1DYW1lcmFTZXJ2aWNlUHJveHkKKyAgICBzdGF0aWMgTXV0ZXggc1Byb3h5TXV0ZXg7CisgICAgLy8gQ2FjaGVkIGludGVyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UgcHJveHkgaW4gc3lzdGVtIHNlcnZpY2UKKyAgICBzdGF0aWMgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IHNDYW1lcmFTZXJ2aWNlUHJveHk7CisKICAgICBzdGF0aWMgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOwogICAgIHN0YXRpYyB2b2lkIHBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKTsKIAorICAgIHZvaWQgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRhYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBkNTliMzEzLi4xNjJiNTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTMzLDE3ICszMywxOCBAQAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKICNkZWZpbmUgQUxPRzEoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOwogI2RlZmluZSBBTE9HMiguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAyLCBfX1ZBX0FSR1NfXyk7CiAKKyNpZm5kZWYgRkFMTFRIUk9VR0hfSU5URU5ERUQKKyNkZWZpbmUgRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tmYWxsdGhyb3VnaF1dCisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCkBAIC01NCw4ICs1NSw3IEBACiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLApAQCAtNjUsOCArNjUsNiBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6RElTQ09OTkVDVEVEOwotCi0gICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIHsKQEAgLTQwMSw3ICszOTksNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBjYW1lcmFzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gbUNsaWVudFBpZCAmJiBjYWxsaW5nUGlkICE9IG1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIHJlczsKQEAgLTQ1Niw4ICs0NTQsNiBAQAogCiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwogCi0gICAgbURldmljZS5jbGVhcigpOwotCiAgICAgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCk7CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNDY4LDE0ICs0NjQsMTQgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAotICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgZ2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKKyAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ29ubmVjdGlvbiBhdHRlbXB0IGZyb20gcGlkICVkOyAiCiAgICAgICAgICAgICAgICAgImN1cnJlbnQgbG9ja2VkIHRvIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwogICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MgPSBjbGllbnQ7CkBAIC00ODgsMTYgKzQ4NCwxNiBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBMb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAogICAgIGlmIChtQ2xpZW50UGlkID09IDApIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCAhPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBMb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnRseSBsb2NrZWQgdG8gcGlkICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBFQlVTWTsKICAgICB9CiAKQEAgLTUwOSw5ICs1MDUsOSBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCi0gICAgaWYgKG1DbGllbnRQaWQgPT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgPT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpSRUNPUkQgfHwKICAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CkBAIC01MjUsNyArNTIxLDcgQEAKICAgICB9CiAKICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnRseSBsb2NrZWQgdG8gcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgIHJldHVybiBFQlVTWTsKIH0KIApAQCAtNzgwLDMzICs3NzYsMzUgQEAKICAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOwogICAgIC8vIElmIGpwZWcgc3RyZWFtIHdpbGwgc2xvdyBkb3duIHByZXZpZXcsIG1ha2Ugc3VyZSB3ZSByZW1vdmUgaXQgYmVmb3JlIHN0YXJ0aW5nIHByZXZpZXcKICAgICBpZiAocGFyYW1zLnNsb3dKcGVnTW9kZSkgewotICAgICAgICAvLyBQYXVzZSBwcmV2aWV3IGlmIHdlIGFyZSBzdHJlYW1pbmcKLSAgICAgICAgaW50MzJfdCBhY3RpdmVSZXF1ZXN0SWQgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5nZXRBY3RpdmVSZXF1ZXN0SWQoKTsKLSAgICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT50b2dnbGVQYXVzZVN0cmVhbSgvKnBhdXNlKi90cnVlKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcGF1c2Ugc3RyZWFtaW5nOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKGxhc3RKcGVnU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CisgICAgICAgICAgICAvLyBQYXVzZSBwcmV2aWV3IGlmIHdlIGFyZSBzdHJlYW1pbmcKKyAgICAgICAgICAgIGludDMyX3QgYWN0aXZlUmVxdWVzdElkID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+Z2V0QWN0aXZlUmVxdWVzdElkKCk7CisgICAgICAgICAgICBpZiAoYWN0aXZlUmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT50b2dnbGVQYXVzZVN0cmVhbSgvKnBhdXNlKi90cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBwYXVzZSBzdHJlYW1pbmc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworCisgICAgICAgICAgICByZXMgPSBtSnBlZ1Byb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CisKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogV2FpdGluZyB0byBzdG9wIHN0cmVhbWluZyBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBkZWxldGUgSnBlZyBzdHJlYW0gZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICByZXMgPSBtSnBlZ1Byb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7Ci0KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGRlbGV0ZSBKcGVnIHN0cmVhbSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT50b2dnbGVQYXVzZVN0cmVhbSgvKnBhdXNlKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHVucGF1c2Ugc3RyZWFtaW5nOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnRvZ2dsZVBhdXNlU3RyZWFtKC8qcGF1c2UqL2ZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCB1bnBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC05NTcsNyArOTU1LDcgQEAKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVDoKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpTVElMTF9DQVBUVVJFOgogICAgICAgICAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPndhaXRVbnRpbElkbGUoa1N0b3BDYXB0dXJlVGltZW91dCk7Ci0gICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6UkVDT1JEOgogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlBSRVZJRVc6CiAgICAgICAgICAgICBzeW5jV2l0aERldmljZSgpOwpAQCAtOTg3LDcgKzk4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcCBwcmV2aWV3OiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpXQUlUSU5HX0ZPUl9QUkVWSUVXX1dJTkRPVzogewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpTVE9QUEVEOwpAQCAtMTQ0MSwxMyArMTQzOSwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCAvKm1zZ1R5cGUqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBpbnQgdGFrZVBpY3R1cmVDb3VudGVyOworICAgIGJvb2wgc2hvdWxkU3luY1dpdGhEZXZpY2UgPSB0cnVlOwogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgc3dpdGNoIChsLm1QYXJhbWV0ZXJzLnN0YXRlKSB7CkBAIC0xNTMzLDE0ICsxNTMyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgc3luYyB3aXRoIHRoZSBkZXZpY2UgaW4gY2FzZSBmbGFzaCBpcyB0dXJuZWQgb24sCisgICAgICAgIC8vIHRoZSBjYW1lcmEgZGV2aWNlIHN1Z2dlc3RzIHRoYXQgZmxhc2ggaXMgbmVlZGVkIChBRSBzdGF0ZSBGTEFTSF9SRVFVSVJFRCkKKyAgICAgICAgLy8gb3Igd2UgYXJlIGluIHNvbWUgb3RoZXIgQUUgc3RhdGUgZGlmZmVyZW50IGZyb20gQ09OVkVSR0VEIHRoYXQgbWF5IG5lZWQKKyAgICAgICAgLy8gcHJlY2FwdHVyZSB0cmlnZ2VyLgorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5mbGFzaE1vZGUgIT0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PTiAmJgorICAgICAgICAgICAgICAgIChsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCkpIHsKKyAgICAgICAgICAgIHNob3VsZFN5bmNXaXRoRGV2aWNlICA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKGtUYWtlcGljdHVyZUxhYmVsLCB0YWtlUGljdHVyZUNvdW50ZXIpOwogCi0gICAgLy8gTmVlZCBIQUwgdG8gaGF2ZSBjb3JyZWN0IHNldHRpbmdzIGJlZm9yZSAocG9zc2libHkpIHRyaWdnZXJpbmcgcHJlY2FwdHVyZQotICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgLy8gTWFrZSBzdXJlIEhBTCBoYXMgY29ycmVjdCBzZXR0aW5ncyBpbiBjYXNlIHByZWNhcHR1cmUgdHJpZ2dlciBpcyBuZWVkZWQuCisgICAgaWYgKHNob3VsZFN5bmNXaXRoRGV2aWNlKSB7CisgICAgICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgfQogCi0gICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZShtc2dUeXBlKTsKKyAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHN0YXJ0IGNhcHR1cmU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE1NzcsNyArMTU4Nyw3IEBACiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OlJlYWRMb2NrIGwobVBhcmFtZXRlcnMpOwogCkBAIC0xNjYwLDI3ICsxNjcwLDYgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKLSAgICBpZiAobUxlZ2FjeU1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTE3NzgsNiArMTc2Nyw3IEBACiAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIHJlY292ZXJhYmxlIGVycm9yICVkIGZyb20gSEFMIC0gaWdub3JpbmcsIHJlcXVlc3RJZCAlIiBQUklkMzIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKyAgICAgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKQEAgLTE4MzMsNyArMTgyMyw3IEBACiAgICAgICAgICAgICAgICAgc3dpdGNoIChuZXdTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kQ29tcGxldGVkTWVzc2FnZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLmN1cnJlbnRBZlRyaWdnZXJJZCA9IC0xOwpAQCAtMTg1Nyw3ICsxODQ3LDcgQEAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNlbmQgbm90aWZpY2F0aW9ucyB1cHN0cmVhbSBpZiB0aGV5J3JlIG5vdCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IEFGIHRyaWdnZXIuIEZvciBleGFtcGxlLCBpZiBjYW5jZWwgd2FzCkBAIC0xODg1LDcgKzE4NzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9QQVNTSVZFX1NDQU46CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBwYXNzaXZlIHNjYW4sIGluZm9ybSB1cHN0cmVhbQogICAgICAgICAgICAgICAgICAgICAgICAgYWZJbk1vdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRDoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfUEFTU0lWRV9VTkZPQ1VTRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHBhc3NpdmUgc2NhbiwgaW5mb3JtIHVwc3RyZWFtCkBAIC0xOTI4LDE0ICsxOTE4LDE2IEBACiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSB7CiAgICAgQUxPR1YoIiVzOiBBdXRvZXhwb3N1cmUgc3RhdGUgbm93ICVkLCBsYXN0IHRyaWdnZXIgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKKyAgICB7CisgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICB9CiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUF1dG9FeHBvc3VyZShuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKIH0KIAogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewotICAgICh2b2lkKXJlc3VsdEV4dHJhczsKLSAgICAodm9pZCl0aW1lc3RhbXA7Ci0KICAgICBBTE9HVigiJXM6IFNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZXF1ZXN0IGlkICUiIFBSSWQzMiAiIGF0IHRpbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCB0aW1lc3RhbXApOwogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNDQ5MjljMy4uYTllYTI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTk2LDggKzk2LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKaW5kZXggZjEyMDNmOS4uZDY1YWM3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApAQCAtMjUsMjcgKzI1LDI0IEBACiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogI2RlZmluZSBMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgTE9HMiguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAyLCBfX1ZBX0FSR1NfXyk7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiBDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDbGllbnQoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpLCBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIAogICAgIG1IYXJkd2FyZSA9IE5VTEw7CkBAIC01NywxNCArNTQsMTMgQEAKICAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKDAsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7Ci0gICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyptb25pdG9yVGFncyovKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZSBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7CkBAIC0xMDUsNyArMTAxLDcgQEAKIC8vIHRlYXIgZG93biB0aGUgY2xpZW50CiBDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQoKSB7CiAgICAgbURlc3RydWN0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiAKICAgICBkaXNjb25uZWN0KCk7CkBAIC0xNDgsNyArMTQ0LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZCgpIGNvbnN0IHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgQUxPR1coImF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCkBAIC0xNTgsNyArMTU0LDggQEAKIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZEFuZEhhcmR3YXJlKCkgY29uc3QgewogICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsCisgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CkBAIC0xNjcsNyArMTY0LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpsb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJsb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0xODIsNyArMTc5LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp1bmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoInVubG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMjA0LDcgKzIwMSw3IEBACiAKIC8vIGNvbm5lY3QgYSBuZXcgY2xpZW50IHRvIHRoZSBjYW1lcmEKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNsaWVudCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTI0MCw3ICsyMzcsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImRpc2Nvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMzM0LDcgKzMzMSw3IEBACiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdUYXJnZXQoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikgewogICAgIExPRzEoInNldFByZXZpZXdUYXJnZXQoJXApIChwaWQgJWQpIiwgYnVmZmVyUHJvZHVjZXIuZ2V0KCksCi0gICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwpAQCAtMzUxLDcgKzM0OCw3IEBACiAvLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQogLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KIHZvaWQgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBjYWxsYmFja19mbGFnKSB7Ci0gICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIApAQCAtMzcyLDEzICszNjksMTMgQEAKIAogLy8gc3RhcnQgcHJldmlldyBtb2RlCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UHJldmlldygpIHsKLSAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1BSRVZJRVdfTU9ERSk7CiB9CiAKIC8vIHN0YXJ0IHJlY29yZGluZyBtb2RlCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1JFQ09SRElOR19NT0RFKTsKIH0KIApAQCAtNDYxLDcgKzQ1OCw3IEBACiAKIC8vIHN0b3AgcHJldmlldyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIApAQCAtNDc3LDcgKzQ3NCw3IEBACiAKIC8vIHN0b3AgcmVjb3JkaW5nIG1vZGUKIHZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUmVjb3JkaW5nKCkgewotICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwpAQCAtNTAzLDcgKzUwMCw3IEBACiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogICAgIGlmIChtZW0gPT0gbnVsbHB0cikgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjE2NDI3MiIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjE1LDcgKzYxMiw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpwcmV2aWV3RW5hYmxlZCgpIHsKLSAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MjMsNyArNjIwLDcgQEAKIH0KIAogYm9vbCBDYW1lcmFDbGllbnQ6OnJlY29yZGluZ0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKQEAgLTYzMSw3ICs2MjgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmF1dG9Gb2N1cygpIHsKLSAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY0MSw3ICs2MzgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNhbmNlbEF1dG9Gb2N1cygpIHsKLSAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY1Miw3ICs2NDksNyBAQAogCiAvLyB0YWtlIGEgcGljdHVyZSAtIGltYWdlIGlzIHJldHVybmVkIGluIGNhbGxiYWNrCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7Ci0gICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCk6IDB4JXgiLCBnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOworICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjgxLDcgKzY3OCw3IEBACiAKIC8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgewotICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY5NiwxNiArNjkzLDE4IEBACiBTdHJpbmc4IENhbWVyYUNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgpOworICAgIH0KIAogICAgIFN0cmluZzggcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpLmZsYXR0ZW4oKSk7Ci0gICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAgICAgcmV0dXJuIHBhcmFtczsKIH0KIAogLy8gZW5hYmxlIHNodXR0ZXIgc291bmQKIHN0YXR1c190IENhbWVyYUNsaWVudDo6ZW5hYmxlU2h1dHRlclNvdW5kKGJvb2wgZW5hYmxlKSB7Ci0gICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwpAQCAtNzE1LDMyICs3MTQsMTIgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKLSAgICBpZiAobUxlZ2FjeU1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQotICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoc3RyY21wKHZhbHVlLCAiMCIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpIHsKLSAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBpbnQgb3JpZW50YXRpb247CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCmluZGV4IDE5MTA1MzYuLjk1MzBiNmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApAQCAtNjgsOCArNjgsNyBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAgICAgfkNhbWVyYUNsaWVudCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAppbmRleCBhOWIyZTc1Li44ODc5OWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCkBAIC01MCw4ICs1MCw3IEBACiAgICAgICAgIG1TdGF0ZVRyYW5zaXRpb25Db3VudCgwKSwKICAgICAgICAgbVRyaWdnZXJJZCgwKSwKICAgICAgICAgbVRpbWVvdXRDb3VudCgwKSwKLSAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSwKLSAgICAgICAgbU1zZ1R5cGUoMCkgeworICAgICAgICBtQ2FwdHVyZUlkKENhbWVyYTJDbGllbnQ6OmtDYXB0dXJlUmVxdWVzdElkU3RhcnQpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogfQogCkBAIC02NCw3ICs2Myw3IEBACiAgICAgbVpzbFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKIH0KIAotc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYXB0dXJlU2VxdWVuY2VyOjpzdGFydENhcHR1cmUoKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKQEAgLTczLDcgKzcyLDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAoIW1TdGFydENhcHR1cmUpIHsKLSAgICAgICAgbU1zZ1R5cGUgPSBtc2dUeXBlOwogICAgICAgICBtU3RhcnRDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZVNpZ25hbC5zaWduYWwoKTsKICAgICB9CkBAIC0xMTksNiArMTE3LDMxIEBACiAgICAgfQogfQogCit2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGJvb2wganBlZ0J1ZmZlckxvc3QgPSBmYWxzZTsKKyAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOworICAgICAgICBpZiAoY2xpZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY2FwdHVyZVN0cmVhbUlkID0gY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTdHJlYW1JZCA9PSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCkgeworICAgICAgICAgICAganBlZ0J1ZmZlckxvc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnJvckNvZGUgPT0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCkgeworICAgICAgICBpZiAocmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9PSBtU2h1dHRlckNhcHR1cmVJZCkgeworICAgICAgICAgICAganBlZ0J1ZmZlckxvc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGpwZWdCdWZmZXJMb3N0KSB7CisgICAgICAgIHNwPE1lbW9yeUJhc2U+IGVtcHR5QnVmZmVyOworICAgICAgICBvbkNhcHR1cmVBdmFpbGFibGUoLyp0aW1lc3RhbXAqLzAsIGVtcHR5QnVmZmVyLCAvKmNhcHR1cmVFcnJvciovdHJ1ZSk7CisgICAgfQorfQorCiB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBOZXcgcmVzdWx0IGF2YWlsYWJsZS4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzg2LDcgKzQwOSw3IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JDYXB0dXJlRW5kOwogICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFX1dBSVQ7CkBAIC00OTIsNyArNTE1LDYgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbXM7Ci0gICAgdWludDhfdCBjYXB0dXJlSW50ZW50ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIG91dHB1dCBzdHJlYW1zIGluIHRoZSByZXF1ZXN0CkBAIC01MjIsNyArNTQ0LDYgQEAKIAogICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CiAgICAgICAgIG91dHB1dFN0cmVhbXMucHVzaChjbGllbnQtPmdldFJlY29yZGluZ1N0cmVhbUlkKCkpOwotICAgICAgICBjYXB0dXJlSW50ZW50ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1ZJREVPX1NOQVBTSE9UKTsKICAgICB9CiAKICAgICByZXMgPSBtQ2FwdHVyZVJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKQEAgLTUzMiwxMCArNTUzLDYgQEAKICAgICAgICAgICAgICAgICAmbUNhcHR1cmVJZCwgMSk7CiAgICAgfQogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgcmVzID0gbUNhcHR1cmVSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCi0gICAgICAgICAgICAgICAgJmNhcHR1cmVJbnRlbnQsIDEpOwotICAgIH0KLSAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIHJlcyA9IG1DYXB0dXJlUmVxdWVzdC5zb3J0KCk7CiAgICAgfQogCkBAIC02MTIsNyArNjI5LDcgQEAKICAgICAgICAgaWYgKCFtU2h1dHRlck5vdGlmaWVkKSB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQpOwogICAgICAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgewpAQCAtNjg1LDYgKzcwMiw4IEBACiAgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKKyAgICB1aW50OF90IGNhcHR1cmVJbnRlbnQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSk7CisKICAgICBpZiAobUNhcHR1cmVSZXF1ZXN0LmVudHJ5Q291bnQoKSA9PSAwKSB7CiAgICAgICAgIHJlcyA9IGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCktPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAogICAgICAgICAgICAgICAgIENBTUVSQTJfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwKQEAgLTY5Nyw2ICs3MTYsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChwYXJhbXMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKKyAgICAgICAgY2FwdHVyZUludGVudCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9WSURFT19TTkFQU0hPVCk7CisgICAgfQorICAgIHJlcyA9IG1DYXB0dXJlUmVxdWVzdC51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmY2FwdHVyZUludGVudCwgMSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHVwZGF0ZSBjYXB0dXJlIGludGVudDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHJlcyA9IHBhcmFtcy51cGRhdGVSZXF1ZXN0KCZtQ2FwdHVyZVJlcXVlc3QpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgY29tbW9uIGVudHJpZXMgb2YgY2FwdHVyZSAiCkBAIC03MTcsMTIgKzc0NiwxMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6c2h1dHRlck5vdGlmeUxvY2tlZChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LCBpbnQgbXNnVHlwZSkgeworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAocGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OlNUSUxMX0NBUFRVUkUKLSAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQKLSAgICAgICAgJiYgKG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1NIVVRURVIpKSB7CisgICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kKSB7CiAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhU2VydmljZSgpLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCBmMmUzNzUwLi43MjdkZDUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkIHNldFpzbFByb2Nlc3Nvcihjb25zdCB3cDxac2xQcm9jZXNzb3I+JiBwcm9jZXNzb3IpOwogCiAgICAgLy8gQmVnaW4gc3RpbGwgaW1hZ2UgY2FwdHVyZQotICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSk7CisgICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKCk7CiAKICAgICAvLyBXYWl0IHVudGlsIGN1cnJlbnQgaW1hZ2UgY2FwdHVyZSBjb21wbGV0ZXM7IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8KICAgICAvLyBjYXB0dXJlIGlzIGFjdGl2ZS4gUmV0dXJucyBUSU1FRF9PVVQgaWYgY2FwdHVyZSBkb2VzIG5vdCBjb21wbGV0ZSBkdXJpbmcKQEAgLTY1LDYgKzY1LDkgQEAKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKKyAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IHNodXR0ZXIgKGNhcHR1cmUgc3RhcnQpCisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKwogICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIApAQCAtMTQ1LDcgKzE0OCw2IEBACiAgICAgYm9vbCBtQWVJblByZWNhcHR1cmU7CiAKICAgICBpbnQzMl90IG1DYXB0dXJlSWQ7Ci0gICAgaW50IG1Nc2dUeXBlOwogCiAgICAgLy8gTWFpbiBpbnRlcm5hbCBtZXRob2RzCiAKQEAgLTE3Miw3ICsxNzQsNyBAQAogCiAgICAgLy8gRW1pdCBTaHV0dGVyL1JhdyBjYWxsYmFjayB0byBqYXZhLCBhbmQgbWF5YmUgcGxheSBhIHNodXR0ZXIgc291bmQKICAgICBzdGF0aWMgdm9pZCBzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDBjNzM4ZTcuLjY4M2U4NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtMzMsNyArMzMsMTAgQEAKICAgICBGcmFtZVByb2Nlc3NvckJhc2UoZGV2aWNlKSwKICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgbUxhc3RGcmFtZU51bWJlck9mRmFjZXMoMCksCi0gICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSB7CisgICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFFRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFXQkZyYW1lTnVtYmVyKC0xKSB7CiAKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkID0gZGV2aWNlLnByb21vdGUoKTsKICAgICBtU3ludGhlc2l6ZTNBTm90aWZ5ID0gIShkLT53aWxsTm90aWZ5M0EoKSk7CkBAIC0yNjIsMjQgKzI2NSw3MyBAQAogICAgIGJvb2wgZ290QWxsU3RhdGVzID0gdHJ1ZTsKIAogICAgIC8vIFRPRE86IEFsc28gdXNlIEFFIG1vZGUsIEFFIHRyaWdnZXIgSUQKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBib29sIGdvdEFGU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgYm9vbCBnb3RBV0JTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGJvb2wgZ290QUVTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAorICAgIGdvdEFGU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFXQlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkOwogICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKIAorICAgIGlmIChnb3RBRVN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUVGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlID0gcGVuZGluZ1N0YXRlLmFlU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZVRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUVGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFGU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWZTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSA9IHBlbmRpbmdTdGF0ZS5hZk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QVdCU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBV0JGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlID0gcGVuZGluZ1N0YXRlLmF3Yk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZTsKKyAgICAgICAgICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdvdEFsbFN0YXRlcyAmPSBnb3RBRVN0YXRlICYgZ290QUZTdGF0ZSAmIGdvdEFXQlN0YXRlOwogICAgIGlmICghZ290QWxsU3RhdGVzKSB7CiAgICAgICAgIC8vIElmIG5vdCBhbGwgc3RhdGVzIGFyZSByZWNlaXZlZCwgcHV0IHRoZSBwZW5kaW5nIHN0YXRlIHRvIG1QZW5kaW5nM0FTdGF0ZXMuCiAgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjkwLDQwICszNDIsMTAgQEAKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICAvLyBPbmNlIGFsbCAzQSBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCAzQSBjaGFuZ2VzLgotICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8Ci0gICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgIH0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQogICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBtUGVuZGluZzNBU3RhdGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIH0KIAotICAgIG0zYVN0YXRlID0gcGVuZGluZ1N0YXRlOwogICAgIG1MYXN0M0FGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA2MmE0ZTkxLi44MTgzYzEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtMTA0LDggKzEwNCw3IEBACiAgICAgLy8gVHJhY2sgbW9zdCByZWNlbnQgZnJhbWUgbnVtYmVyIGZvciB3aGljaCAzQSBub3RpZmljYXRpb25zIHdlcmUgc2VudCBmb3IuCiAgICAgLy8gVXNlZCB0byBmaWx0ZXIgYWdhaW5zdCBzZW5kaW5nIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lCiAgICAgLy8gc2V2ZXJhbCB0aW1lcy4KLSAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlcjsKLQorICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyLCBtTGFzdEFFRnJhbWVOdW1iZXIsIG1MYXN0QUZyYW1lTnVtYmVyLCBtTGFzdEFXQkZyYW1lTnVtYmVyOwogICAgIC8vIEVtaXQgRmFjZURldGVjdGlvbiBldmVudCB0byBqYXZhIGlmIGZhY2VzIGNoYW5nZWQKICAgICB2b2lkIGNhbGxiYWNrRmFjZURldGVjdGlvbihjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9mcmFtZV9tZXRhZGF0YSAmbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGI3MDIwZmUuLmRkZmU1ZTMgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTYyLDI2ICs2Miw2IEBACiAgICAgfQogfQogCi12b2lkIEpwZWdQcm9jZXNzb3I6Om9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIHsKLSAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKLX0KLQotdm9pZCBKcGVnUHJvY2Vzc29yOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIGlmIChidWZmZXJJbmZvLm1FcnJvcikgewotICAgICAgICAvLyBPbmx5IGxvY2sgaW4gY2FzZSBvZiBlcnJvciwgc2luY2Ugd2UgZ2V0IG9uZSBvZiB0aGVzZSBmb3IgZWFjaAotICAgICAgICAvLyBvbkZyYW1lQXZhaWxhYmxlIGFzIHdlbGwsIGFuZCBzY2hlZHVsaW5nIG1heSBkZWxheSB0aGlzIGNhbGwgbGF0ZQotICAgICAgICAvLyBlbm91Z2ggdG8gcnVuIGludG8gbGF0ZXIgcHJldmlldyByZXN0YXJ0IG9wZXJhdGlvbnMsIGZvciBub24tZXJyb3IKLSAgICAgICAgLy8gY2FzZXMuCi0gICAgICAgIC8vIGIvMjk1MjQ2NTEKLSAgICAgICAgQUxPR1YoIiVzOiBKUEVHIGJ1ZmZlciBsb3N0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwotICAgICAgICBtQ2FwdHVyZURvbmUgPSB0cnVlOwotICAgICAgICBtQ2FwdHVyZVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgbUNhcHR1cmVEb25lU2lnbmFsLnNpZ25hbCgpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgSnBlZ1Byb2Nlc3Nvcjo6dXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTE3NiwxMyArMTU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gZGV2aWNlLT5hZGRCdWZmZXJMaXN0ZW5lckZvclN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkLCB0aGlzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgYWRkIGJ1ZmZlciBsaXN0ZW5lcmk6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKaW5kZXggNzE4N2FkOS4uOTc3ZjExZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDggKzQyLDcgQEAKICAqIFN0aWxsIGltYWdlIGNhcHR1cmUgb3V0cHV0IGltYWdlIHByb2Nlc3NpbmcKICAqLwogY2xhc3MgSnBlZ1Byb2Nlc3NvcjoKLSAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciwKLSAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIFRocmVhZCwgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKICAgcHVibGljOgogICAgIEpwZWdQcm9jZXNzb3Ioc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5KcGVnUHJvY2Vzc29yKCk7CkBAIC01MCwxNSArNTAsMTQgQEAKICAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKIAotICAgIC8vIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgotICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKICAgICBpbnQgZ2V0U3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworCisgICAgc3RhdGljIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOworCiAgIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcwogICAgIHdwPENhbWVyYURldmljZUJhc2U+IG1EZXZpY2U7CkBAIC04Miw3ICs4MSw2IEBACiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAogICAgIHN0YXR1c190IHByb2Nlc3NOZXdDYXB0dXJlKGJvb2wgY2FwdHVyZVN1Y2Nlc3MpOwotICAgIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggMjhkMTg2YS4uMThhZGRiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNjksNyArNjksNyBAQAogICAgIHJlcyA9IGJ1aWxkUXVpcmtzKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIFNpemUgbWF4UHJldmlld1NpemUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAgICAgVmVjdG9yPHZpZGVvX2VuY29kZXI+IGVuY29kZXJzID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlcnMoKTsKQEAgLTkwLDExICs5MCwxNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCi0gICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIG1heFByZXZpZXdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CisgICAgfQorCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0yOTYsOSArMzAxLDEzIEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOwogICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KICAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CiAgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBTaXplIHN1Z2dlc3RlZEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSk7CisgICAgICAgIHBpY3R1cmVXaWR0aCA9IHN1Z2dlc3RlZEpwZWdTaXplLndpZHRoOworICAgICAgICBwaWN0dXJlSGVpZ2h0ID0gc3VnZ2VzdGVkSnBlZ1NpemUuaGVpZ2h0OworICAgIH0KICAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOwogICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKICAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwpAQCAtNzU3LDYgKzc2Niw3IEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKKyAgICBhZVN0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0lOQUNUSVZFOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAogICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CiAgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKQEAgLTEwMTAsNiArMTAyMCw5IEBACiAgICAgICAgIGFycmF5SGVpZ2h0ID0gYWN0aXZlQXJyYXlTaXplLmRhdGEuaTMyWzNdOwogICAgIH0gZWxzZSByZXR1cm4gTk9fSU5JVDsKIAorICAgIGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncyA9CisgICAgICAgIGluZm8tPmV4aXN0cyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKwogICAgIC8vIFdlJ2xsIHNldCB0aGUgdGFyZ2V0IEZQUyByYW5nZSBmb3Igc3RpbGwgY2FwdHVyZXMgdG8gYmUgYXMgd2lkZQogICAgIC8vIGFzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIEhBTCBtYXhpbXVtIGxhdGl0dWRlIGZvciBleHBvc3VyZSBzZWxlY3Rpb24KICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtMTAyMSw4ICsxMDM0LDExIEBACiAgICAgLy8gR2V0IHN1cHBvcnRlZCBwcmV2aWV3IGZwcyByYW5nZXMsIHVwIHRvIGRlZmF1bHQgbWF4aW11bS4KICAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxGcHNSYW5nZT4gc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlczsKLSAgICBjb25zdCBTaXplIFBSRVZJRVdfU0laRV9CT1VORCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoUFJFVklFV19TSVpFX0JPVU5ELCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBTaXplIHByZXZpZXdTaXplQm91bmQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMzEwNiw2ICszMTIyLDY3IEBACiAgICAgcmV0dXJuIGpwZWdTaXplczsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBpbnQzMl90IHVzZWNhc2VJZCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9IHN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmICgxIDw8IHVzZWNhc2VJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgICAgICAgICAgc2NzLmFkZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQpIGNvbnN0IHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKHVzZWNhc2VJZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHNjcykgeworICAgICAgICBpZiAoaXQuZm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgc2l6ZXMuYWRkKHtpdC53aWR0aCwgaXQuaGVpZ2h0fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9ULAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDQyZTdhNDcuLjNhNzA5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgIGludDMyX3QgaGlnaDsKICAgICB9OwogCisgICAgdWludDhfdCBhZVN0YXRlOyAvL2xhdGVzdCBBRSBzdGF0ZSBmcm9tIEhhbAogICAgIGludDMyX3QgZXhwb3N1cmVDb21wZW5zYXRpb247CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9ja0F2YWlsYWJsZTsKQEAgLTI0Nyw2ICsyNDgsNyBAQAogICAgICAgICBib29sIHVzZUZsZXhpYmxlWXV2OwogICAgICAgICBTaXplIG1heEpwZWdTaXplOwogICAgICAgICBTaXplIG1heFpzbFNpemU7CisgICAgICAgIGJvb2wgc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC00MTcsNiArNDE5LDkgQEAKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgc3VnZ2VzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyhpbnQzMl90IHVzZWNhc2VJZCkgY29uc3Q7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAogICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOwpAQCAtNDM4LDYgKzQ0MywxNSBAQAogICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgogICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaWx0ZXIgYW5kIHNvcnQgc3VnZ2VzdGVkIHNpemVzCisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsIGludDMyX3QgZm9ybWF0KSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgcHJldmlldyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OworCiAgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDk4ZDA1MzQuLmM3YTRmMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0yNiwxMCArMjcsMTUgQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAorI2luY2x1ZGUgIkRlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCiAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgYmluZGVyOjpTdGF0dXMgb2JqZWN0cyBmb3IgZXJyb3IgcmV0dXJucwogCiAjZGVmaW5lIFNUQVRVU19FUlJPUihlcnJvckNvZGUsIGVycm9yU3RyaW5nKSBcCkBAIC0xMjIsNiArMTI4LDcgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMzksNiArMTQ2LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjppbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgU3VyZmFjZU1hcCogb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiBvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgKmN1cnJlbnRTdHJlYW1JZCkgeworICAgIGludCBjb21wb3NpdGVJZHg7CiAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKIAogICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZApAQCAtMTQ4LDYgKzE1NiwxMSBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgU3VyZmFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGN1cnJlbnQgY2FwdHVyZSBzZXNzaW9uIik7CisgICAgfSBlbHNlIGlmICgoY29tcG9zaXRlSWR4ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpKQorICAgICAgICAgICAgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGNvbXBvc2l0ZUlkeCktPmluc2VydEdicChvdXRTdXJmYWNlTWFwLCBvdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgY3VycmVudFN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIAogICAgIGNvbnN0IFN0cmVhbVN1cmZhY2VJZCYgc3RyZWFtU3VyZmFjZUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7CkBAIC0yNTIsNyArMjY1LDcgQEAKICAgICAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcXVlc3RlZFBoeXNpY2FsSWRzOwogICAgICAgICBpZiAocmVxdWVzdC5tU3VyZmFjZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChzcDxTdXJmYWNlPiBzdXJmYWNlIDogcmVxdWVzdC5tU3VyZmFjZUxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UgOiByZXF1ZXN0Lm1TdXJmYWNlTGlzdCkgewogICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IDApIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZDsKQEAgLTQ2OSw2ICs0ODIsNzkgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAorICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgZXJyID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5jb25maWd1cmVTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgY29tcG9zaXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW1zOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAorICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgY29uc3QgeworICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPiBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSkgeworICAgICAgICBBTE9HRSgiJXM6IEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3VudCAlenUgZm9yIHN0cmVhbSBleGNlZWRzIGxpbWl0IG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG51bUJ1ZmZlclByb2R1Y2VycywgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7CisgICAgfSBlbHNlIGlmICgobnVtQnVmZmVyUHJvZHVjZXJzID09IDApICYmICghZGVmZXJyZWRDb25zdW1lcikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOdW1iZXIgb2YgY29uc3VtZXJzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIk5vIHZhbGlkIGNvbnN1bWVycy4iKTsKKyAgICB9CisKKyAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8CisgICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOworCisgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBoYXMgaW52YWxpZCBzdXJmYWNlVHlwZSA9ICVkLiIsIF9fRlVOQ1RJT05fXywgc3VyZmFjZVR5cGUpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJUYXJnZXQgU3VyZmFjZSBpcyBpbnZhbGlkIik7CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KKyAgICAgICAgICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IENhbWVyYSBkb2Vzbid0IHN1cHBvcnQgcGh5c2ljYWxDYW1lcmFJZCAlcy4iLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja09wZXJhdGluZ01vZGVMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIGNvbnN0IHsKICAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCiAgICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CkBAIC00NzcsNyArNTYzLDYgQEAKICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOwogICAgIH0KIAotICAgIC8vIFNhbml0aXplIHRoZSBoaWdoIHNwZWVkIHNlc3Npb24gYWdhaW5zdCBuZWNlc3NhcnkgY2FwYWJpbGl0eSBiaXQuCiAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7CiAgICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKQEAgLTUwMCwxNyArNTg1LDIwNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJlYW0tPnYzXzIuc3RyZWFtVHlwZSA9IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6T1VUUFVUOworICAgIHN0cmVhbS0+djNfMi53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgc3RyZWFtLT52M18yLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgIHN0cmVhbS0+djNfMi5mb3JtYXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHN0cmVhbUluZm8uZm9ybWF0KTsKKyAgICBhdXRvIHUgPSBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2U7CisgICAgY2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbTo6YXBwbHlaU0xVc2FnZVF1aXJrKHN0cmVhbUluZm8uZm9ybWF0LCAmdSk7CisgICAgc3RyZWFtLT52M18yLnVzYWdlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+djNfMi5kYXRhU3BhY2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0hpZGxEYXRhc3BhY2Uoc3RyZWFtSW5mby5kYXRhU3BhY2UpOworICAgIHN0cmVhbS0+djNfMi5yb3RhdGlvbiA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtUm90YXRpb24ocm90YXRpb24pOworICAgIHN0cmVhbS0+djNfMi5pZCA9IC0xOyAvLyBJbnZhbGlkIHN0cmVhbSBpZAorICAgIHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCA9IHN0ZDo6c3RyaW5nKHBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLCBib29sICpzdGF0dXMgLypvdXQqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXM7CisgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKKyAgICB9CisKKyAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CisgICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKG9wZXJhdGluZ01vZGUpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gbnVsbHB0cikgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogSW52YWxpZCBzdGF0dXMhIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRXJyb3IgY29uZmlndXJpbmcgc3RyZWFtczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgIGF1dG8gcmV0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90PiAob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAvKm91dCovICZzdHJlYW1Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgbWFwcGluZyBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQ6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBvcGVyYXRpbmdNb2RlLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBib29sIGlzSW5wdXRWYWxpZCA9IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkgPiAwKSAmJgorICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkgPiAwKTsKKyAgICBhdXRvIG91dHB1dENvbmZpZ3MgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IG91dHB1dENvbmZpZ3Muc2l6ZSgpOworICAgIHN0cmVhbUNvdW50ID0gaXNJbnB1dFZhbGlkID8gc3RyZWFtQ291bnQgKyAxIDogc3RyZWFtQ291bnQ7CisgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7CisgICAgaWYgKGlzSW5wdXRWYWxpZCkgeworICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0ge3svKnN0cmVhbUlkKi8wLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCisgICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKKyAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAorICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH07CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7CisgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKyAgICAgICAgc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycyA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7CisgICAgICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOworCisgICAgICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLCBpdC5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGFuZHJvaWRfZGF0YXNwYWNlX3Q6OkhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAgICAgICAgIGF1dG8gc3VyZmFjZVR5cGUgPSBpdC5nZXRTdXJmYWNlVHlwZSgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKKyAgICAgICAgICAgIGlmIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCk7CisKKyAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOworICAgICAgICAgICAgICAgIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGluIHRvIGFjY291bnQgdGhhdCBjb21wb3NpdGUgc3RyZWFtcyBjYW4gaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBjb21wb3NpdGVTdHJlYW1zOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBhZGRpbmcgY29tcG9zaXRlIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBpbnRlcm5hbCBzdHJlYW1zIG1lYW5zIGNvbXBvc2l0ZSBzdHJlYW0gbm90CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpzdGF0dXMgPSBmYWxzZTsKKyAgICByZXQgPSBtUHJvdmlkZXJNYW5hZ2VyLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBFcnJvcjogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC01MzIsNiArODA1LDcgQEAKICAgICBib29sIGlzSW5wdXQgPSBmYWxzZTsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gc3VyZmFjZXM7CiAgICAgc3NpemVfdCBkSW5kZXggPSBOQU1FX05PVF9GT1VORDsKKyAgICBzc2l6ZV90IGNvbXBvc2l0ZUluZGV4ICA9IE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgaWYgKG1JbnB1dFN0cmVhbS5jb25maWd1cmVkICYmIG1JbnB1dFN0cmVhbS5pZCA9PSBzdHJlYW1JZCkgewogICAgICAgICBpc0lucHV0ID0gdHJ1ZTsKQEAgLTU1MSw2ICs4MjUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Z2V0U3RyZWFtSWQoKSkgeworICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdXJmYWNlcy5lbXB0eSgpICYmIGRJbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN1Y2giCiAgICAgICAgICAgICAgICAgICAgICIgc3RyZWFtIGNyZWF0ZWQgeWV0IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlYW1JZCk7CkBAIC01ODAsNiArODYxLDE5IEBACiAgICAgICAgICAgICBpZiAoZEluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5yZW1vdmVJdGVtc0F0KGRJbmRleCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb21wb3NpdGVJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IHJldDsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJbmRleCktPmRlbGV0ZVN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5leHBlY3RlZCBlcnJvciAlcyAoJWQpIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBjb21wb3NpdGUgc3RyZWFtICVkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoY29tcG9zaXRlSW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC02MDMsNDEgKzg5NywyMyBAQAogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCgpOwogICAgIGJvb2wgaXNTaGFyZWQgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzU2hhcmVkKCk7CiAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7Ci0KLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzLnNpemUoKSwgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJTdXJmYWNlIGNvdW50IGlzIHRvbyBoaWdoIik7Ci0gICAgfQogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lck9ubHkgPSBkZWZlcnJlZENvbnN1bWVyICYmIG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwOwotICAgIGludCBzdXJmYWNlVHlwZSA9IG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKTsKLSAgICBib29sIHZhbGlkU3VyZmFjZVR5cGUgPSAoKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHx8Ci0gICAgICAgICAgICAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVEVYVFVSRSkpOwogCi0gICAgaWYgKGRlZmVycmVkQ29uc3VtZXIgJiYgIXZhbGlkU3VyZmFjZVR5cGUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUYXJnZXQgc3VyZmFjZSBpcyBpbnZhbGlkOiBidWZmZXJQcm9kdWNlciA9ICVwLCBzdXJmYWNlVHlwZSA9ICVkLiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJQcm9kdWNlcnNbMF0uZ2V0KCksIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlVHlwZSgpKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbElkKHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQotICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKG1EZXZpY2UtPmluZm8oKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8Ci0gICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbElkKSA9PQotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorCiAgICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+IHN1cmZhY2VzOwogICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiBiaW5kZXJzOwogICAgIHN0YXR1c190IGVycjsKQEAgLTY2MSw3ICs5MzcsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyKTsKKyAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQpOwogCiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC02NzYsMTEgKzk1MywzMiBAQAogCiAgICAgaW50IHN0cmVhbUlkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN1cmZhY2VJZHM7Ci0gICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAotICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCi0gICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAotICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKKyAgICBib29sIGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcGlzaXRlU3RyZWFtKSB7CisgICAgICAgIHNwPENvbXBvc2l0ZVN0cmVhbT4gY29tcG9zaXRlU3RyZWFtOworICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtKG1EZXZpY2UsIGdldFJlbW90ZUNhbGxiYWNrKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW0obURldmljZSwgZ2V0UmVtb3RlQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb21wb3NpdGVTdHJlYW0tPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZXNbMF0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCisgICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SX0ZNVChDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTg4OSw2ICsxMTg3LDggQEAKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4mIGJ1ZmZlclByb2R1Y2VycyA9CiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworCiAgICAgYXV0byBwcm9kdWNlckNvdW50ID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKICAgICBpZiAocHJvZHVjZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXJzIG11c3Qgbm90IGJlIGVtcHR5IiwgX19GVU5DVElPTl9fKTsKQEAgLTk0Miw3ICsxMjQyLDcgQEAKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBvdXRJbmZvOwogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChvdXRJbmZvLCAvKmlzU3RyZWFtSW5mb1ZhbGlkKi8gZmFsc2UsIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbmV3T3V0cHV0c01hcC52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgICAgICBuZXdPdXRwdXRzTWFwLnZhbHVlQXQoaSksIHBoeXNpY2FsQ2FtZXJhSWQpOwogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwogCkBAIC0xMDIxLDcgKzEzMjEsOCBAQAogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKAogICAgICAgICBPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAotICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCkgeworICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgewogCiAgICAgLy8gYnVmZmVyUHJvZHVjZXIgbXVzdCBiZSBub24tbnVsbAogICAgIGlmIChnYnAgPT0gbnVsbHB0cikgewpAQCAtMTA5OCw3ICsxMzk5LDcgQEAKICAgICAvLyBSb3VuZCBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IGRpbWVuc2lvbnMgYXZhaWxhYmxlIGZvciB0aGlzIGZvcm1hdAogICAgIGlmIChmbGV4aWJsZUNvbnN1bWVyICYmIGlzUHVibGljRm9ybWF0KGZvcm1hdCkgJiYKICAgICAgICAgICAgICFDYW1lcmFEZXZpY2VDbGllbnQ6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdCh3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIG1EZXZpY2UtPmluZm8oKSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7CisgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgbURldmljZS0+aW5mbyhwaHlzaWNhbElkKSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IE5vIHN1cHBvcnRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aCAiCiAgICAgICAgICAgICAgICAgImZvcm1hdCAlI3ggZGVmaW5lZCwgZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIiwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGZvcm1hdCk7CkBAIC0xMTU5LDYgKzE0NjAsOCBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdHJlYW1Db25maWdzID0KICAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgPwogICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgorICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKSkgPworICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKIAogICAgIGludDMyX3QgYmVzdFdpZHRoID0gLTE7CkBAIC0xNDY4LDYgKzE3NzEsNyBAQAogCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiYgYnVmZmVyUHJvZHVjZXJzID0KICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgIFN0cmluZzggcGh5c2ljYWxJZChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAKICAgICBpZiAoYnVmZmVyUHJvZHVjZXJzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXJzIG11c3Qgbm90IGJlIGVtcHR5IiwgX19GVU5DVElPTl9fKTsKQEAgLTE1MjEsNyArMTgyNSw3IEBACiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAobVN0cmVhbUluZm9NYXBbc3RyZWFtSWRdLCB0cnVlIC8qaXNTdHJlYW1JbmZvVmFsaWQqLywKLSAgICAgICAgICAgICAgICBzdXJmYWNlLCBidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICAgICAgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsIHBoeXNpY2FsSWQpOwogCiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC0xNjEwLDcgKzE5MTQsMTQgQEAKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAotICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7CisgICAgLy8gQ29tcG9zaXRlcyBjYW4gaGF2ZSBtdWx0aXBsZSBpbnRlcm5hbCBzdHJlYW1zLiBFcnJvciBub3RpZmljYXRpb25zIGNvbWluZyBmcm9tIHN1Y2ggaW50ZXJuYWwKKyAgICAvLyBzdHJlYW1zIG1heSBuZWVkIHRvIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCisgICAgYm9vbCBza2lwQ2xpZW50Tm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNraXBDbGllbnROb3RpZmljYXRpb24gfD0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vbkVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKKyAgICB9CisKKyAgICBpZiAoKHJlbW90ZUNiICE9IDApICYmICghc2tpcENsaWVudE5vdGlmaWNhdGlvbikpIHsKICAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KQEAgLTE2NDQsNiArMTk1NSwxMCBAQAogICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAgICAgfQogICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uU2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSB7CkBAIC0xNjc3LDkgKzE5OTIsMTIgQEAKIAogICAgIC8vIFdPUktBUk9VTkQ6IEhBTCByZWZ1c2VzIHRvIGRpc2Nvbm5lY3Qgd2hpbGUgdGhlcmUncyBzdHJlYW1zIGluIGZsaWdodAogICAgIHsKLSAgICAgICAgbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7Ci0KKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CiAgICAgICAgIHN0YXR1c190IGNvZGU7CisgICAgICAgIGlmICgoY29kZSA9IG1EZXZpY2UtPmZsdXNoKCZsYXN0RnJhbWVOdW1iZXIpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBmbHVzaCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgiLCBfX0ZVTkNUSU9OX18sIGNvZGUpOworICAgICAgICB9CisKICAgICAgICAgaWYgKChjb2RlID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpKSAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0VW50aWxEcmFpbmVkIGZhaWxlZCB3aXRoIGNvZGUgMHgleCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgIGNvZGUpOwpAQCAtMTcwMCw2ICsyMDE4LDEwIEBACiAgICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tTWV0YWRhdGEsIHJlc3VsdC5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CisgICAgfQogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pIHsKQEAgLTE3MTYsNyArMjAzOCw3IEBACiAvLyBUT0RPOiBtb3ZlIHRvIENhbWVyYTJDbGllbnRCYXNlCiBib29sIENhbWVyYURldmljZUNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKIAotICAgIGNvbnN0IGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKIApAQCAtMTc1NSw3ICsyMDc3LDcgQEAKICAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvblN0cmluZyA9CiAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9ESVNBQkxFX1RSQU5TTUlUX0xFRCIpOwogICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24ocGVybWlzc2lvblN0cmluZykpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgogICAgICAgICAgICAgICAgICAgImNhbid0IGRpc2FibGUgdHJhbnNtaXQgTEVEIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggNWFhZjVhYS4uMWM1YWJiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yMCwxMyArMjAsMTYgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q29tcG9zaXRlU3RyZWFtOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg5LDYgKzkyLDEyIEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMpIG92ZXJyaWRlOwogCisgICAgLy8gVmVyaWZ5IHNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sKiBzdHJlYW1TdGF0dXMpIG92ZXJyaWRlOworCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlIG9yIGluIGVycm9yIHN0YXRlCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIApAQCAtMjMwLDYgKzIzOSwxMyBAQAogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3Q7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCk7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLCBib29sIGRlZmVycmVkQ29uc3VtZXIsCisgICAgICAgICAgICBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CiAgICAgYm9vbCBlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKICAgICAvLyBGaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKQEAgLTI1OCw3ICsyNzQsOCBAQAogICAgIC8vIENyZWF0ZSBhIFN1cmZhY2UgZnJvbSBhbiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLiBSZXR1cm5zIGVycm9yIGlmCiAgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcidzIHByb3BlcnR5IGRvZXNuJ3QgbWF0Y2ggd2l0aCBzdHJlYW1JbmZvCiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlU3VyZmFjZUZyb21HYnAoT3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKLSAgICAgICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCk7CiAKIAogICAgIC8vIFV0aWxpdHkgbWV0aG9kIHRvIGluc2VydCB0aGUgc3VyZmFjZSBpbnRvIFN1cmZhY2VNYXAKQEAgLTI5OSw3ICszMTYsMTAgQEAKICAgICAvLyBzdHJlYW0gSUQgLT4gb3V0cHV0U3RyZWFtSW5mbyBtYXBwaW5nCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIE91dHB1dFN0cmVhbUluZm8+IG1TdHJlYW1JbmZvTWFwOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSAyOworICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBzcDxDb21wb3NpdGVTdHJlYW0+PiBtQ29tcG9zaXRlU3RyZWFtTWFwOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ZWFmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1Db21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYURldmljZUNsaWVudC5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0NvbXBvc2l0ZVN0cmVhbTo6Q29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrKGNiKSwKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAorICAgICAgICBtRXJyb3JTdGF0ZShmYWxzZSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqIGlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICogc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSB7CisgICAgaWYgKGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lcnMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtU2V0SWQgIT0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN1cmZhY2UgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCIlczogU2hhcmVkIHN1cmZhY2VzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdW1lcnMsIGhhc0RlZmVycmVkQ29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcm90YXRpb24sIGlkLAorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcywgc3RyZWFtU2V0SWQsIGlzU2hhcmVkKTsKK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVTdHJlYW0oKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmNsZWFyKCk7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5jbGVhcigpOworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgbUVycm9yRnJhbWVOdW1iZXJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGV0ZUludGVybmFsU3RyZWFtcygpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIC8qc2V0dGluZ3MqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKCFtRXJyb3JTdGF0ZSAmJiAoc3RyZWFtSWQgPT0gZ2V0U3RyZWFtSWQoKSkpIHsKKyAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmICghbUVycm9yU3RhdGUgJiYgIWJ1ZmZlckluZm8ubUVycm9yKSB7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lbXBsYWNlKGJ1ZmZlckluZm8ubUZyYW1lTnVtYmVyLCBidWZmZXJJbmZvLm1UaW1lc3RhbXApOworICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjplcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgIGlmIChpdCA9PSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CisgICAgYm9vbCByZXN1bHRFcnJvciA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdC5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgICAgICBib29sIHJlc3VsdFJlYWR5ID0gZmFsc2U7CisgICAgICAgIGF1dG8gaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmZpbmQoZnJhbWVOdW1iZXIpOworICAgICAgICBpZiAoaXQgIT0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbmQoKSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC5hcHBlbmQocmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID49IG1OdW1QYXJ0aWFsUmVzdWx0cykgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBpdC0+c2Vjb25kLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHRzID0gZW50cnkuZGF0YS5pNjRbMF07CisgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lbXBsYWNlKHRzLCBzdGQ6Om1ha2VfdHVwbGUoZnJhbWVOdW1iZXIsIGl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZXN0YW1wIG1ldGFkYXRhIGVudHJ5IG1pc3NpbmcgZm9yIGZyYW1lTnVtYmVyOiAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0UmVhZHkpIHsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdEVycm9yKSB7CisgICAgICAgIG9uUmVzdWx0RXJyb3IocmVzdWx0Lm1SZXN1bHRFeHRyYXMpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06OmZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgbUVycm9yRnJhbWVOdW1iZXJzLmVtcGxhY2UoZnJhbWVOdW1iZXIpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OnJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJldCA9IGRldmljZS0+YWRkQnVmZmVyTGlzdGVuZXJGb3JTdHJlYW0oc3RyZWFtSWQsIHRoaXMpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgY29tcG9zaXRlIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQ29tcG9zaXRlU3RyZWFtOjpvbkVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBhdXRvIHJldCA9IGZhbHNlOworICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgICAgICBvblJlc3VsdEVycm9yKHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldCA9IG9uU3RyZWFtQnVmZmVyRXJyb3IocmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIC8vIEludmFsaWQgcmVxdWVzdCwgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IGNvbXBvc2l0ZSBzdHJlYW1zLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVucmVjb3ZlcmFibGUgZXJyb3I6ICVkIGRldGVjdGVkISIsIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgICAgICBtRXJyb3JTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6bm90aWZ5RXJyb3IoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay5wcm9tb3RlKCk7CisKKyAgICBpZiAoKGZyYW1lTnVtYmVyID49IDApICYmIChyZW1vdGVDYi5nZXQoKSAhPSBudWxscHRyKSkgeworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhczsKKyAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBnZXRTdHJlYW1JZCgpOworICAgICAgICBleHRyYXMuZnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMWE4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYURldmljZUNsaWVudDsKK2NsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgU3VyZmFjZTsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIHsKKworcHVibGljOgorICAgIENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgdmlydHVhbCB+Q29tcG9zaXRlU3RyZWFtKCkge30KKworICAgIHN0YXR1c190IGNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpOworCisgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHJlZ2lzdGVyIGFsbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpID0gMDsKKworICAgIC8vIFJlbGVhc2UgYWxsIGludGVybmFsIHN0cmVhbXMgYW5kIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgPSAwOworCisgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gY29tcGxldGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgPSAwOworCisgICAgLy8gSW5zZXJ0IHRoZSBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtIGlkIGluIHRoZSB1c2VyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbXBvc2l0ZSBzdHJlYW0gaWQuCisgICAgdmlydHVhbCBpbnQgZ2V0U3RyZWFtSWQoKSA9IDA7CisKKyAgICAvLyBOb3RpZnkgd2hlbiBzaHV0dGVyIG5vdGlmeSBpcyB0cmlnZ2VyZWQKKyAgICB2aXJ0dWFsIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIC8qcmVzdWx0RXh0cmFzKi8sIG5zZWNzX3QgLyp0aW1lc3RhbXAqLykge30KKworICAgIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKKyAgICBib29sIG9uRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICAvLyBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKyAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIG92ZXJyaWRlIHsgLypFbXB0eSBmb3Igbm93ICovIH0KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCBQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7CisgICAgICAgIC8vIFByb2R1Y2VyTGlzdGVuZXIgaW1wZW1lbnRhdGlvbgorICAgICAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZSB7IC8qTm8gaW1wbC4gZm9yIG5vdyovIH07CisgICAgfTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoaW50MzJfdCBzdHJlYW1JZCk7CisgICAgdm9pZCBlcmFzZVJlc3VsdChpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKworICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIGZvciBidWZmZXIgZXJyb3JzIGZyb20gaW50ZXJuYWwgc3RyZWFtcyBhbmQgcmV0dXJuICd0cnVlJyBpbgorICAgIC8vIGNhc2UgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiBzaG91bGQgcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICB2aXJ0dWFsIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIFN1YmNsYXNzZXMgY2FuIGRlY2lkZSBob3cgdG8gaGFuZGxlIHJlc3VsdCBlcnJvcnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZQorICAgIC8vIGludGVybmFsIHByb2Nlc3NpbmcgbmVlZHMgcmVzdWx0IGRhdGEuCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CisKKyAgICAvLyBEZXZpY2UgYW5kL29yIHNlcnZpY2UgaXMgaW4gdW5yZWNvdmVyYWJsZSBlcnJvciBzdGF0ZS4KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgYmVoYXZlIGFjY29yZGluZ2x5LgorICAgIHZvaWQgZW5hYmxlRXJyb3JTdGF0ZSgpOworCisgICAgd3A8Q2FtZXJhRGV2aWNlQmFzZT4gICBtRGV2aWNlOworICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgIG1NdXRleDsKKyAgICBDb25kaXRpb24gICAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbUVycm9yU3RhdGU7CisKKyAgICAvLyBGcmFtZSBudW1iZXIgdG8gY2FwdHVyZSByZXN1bHQgbWFwIG9mIHBhcnRpYWwgcGVuZGluZyByZXF1ZXN0IHJlc3VsdHMuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4gbVBlbmRpbmdDYXB0dXJlUmVzdWx0czsKKworICAgIC8vIFRpbWVzdGFtcCB0byBjYXB0dXJlIChmcmFtZSBudW1iZXIsIHJlc3VsdCkgbWFwIG9mIGNvbXBsZXRlZCBwZW5kaW5nIHJlcXVlc3QgcmVzdWx0cy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgc3RkOjp0dXBsZTxpbnQ2NF90LCBDYW1lcmFNZXRhZGF0YT4+IG1DYXB0dXJlUmVzdWx0czsKKworICAgIC8vIEZyYW1lIG51bWJlciB0byB0aW1lc3RhbXAgbWFwCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIGludDY0X3Q+IG1GcmFtZU51bWJlck1hcDsKKworICAgIC8vIEtlZXBzIGEgc2V0IGJ1ZmZlci9yZXN1bHQgZnJhbWUgbnVtYmVycyBmb3IgYW55IGVycm9ycyBkZXRlY3RlZCBkdXJpbmcgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnNldDxpbnQ2NF90PiBtRXJyb3JGcmFtZU51bWJlcnM7CisKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGxmY24uaCIKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJEZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjpEZXB0aENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCisgICAgICAgIG1CbG9iU3RyZWFtSWQoLTEpLAorICAgICAgICBtQmxvYlN1cmZhY2VJZCgtMSksCisgICAgICAgIG1EZXB0aFN0cmVhbUlkKC0xKSwKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbUJsb2JXaWR0aCgwKSwKKyAgICAgICAgbUJsb2JIZWlnaHQoMCksCisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAorICAgICAgICBtTWF4SnBlZ1NpemUoLTEpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1EZXB0aFBob3RvUHJvY2VzcyhudWxscHRyKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGNhbWVyYURldmljZS0+aW5mbygpOworICAgICAgICBhdXRvIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBNYXhpbXVtIGpwZWcgc2l6ZSBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gNSkgeworICAgICAgICAgICAgbUludHJpbnNpY0NhbGlicmF0aW9uLnJlc2VydmUoNSk7CisgICAgICAgICAgICBtSW50cmluc2ljQ2FsaWJyYXRpb24uaW5zZXJ0KG1JbnRyaW5zaWNDYWxpYnJhdGlvbi5lbmQoKSwgZW50cnkuZGF0YS5mLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmYgKyA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW50cmluc2ljIGNhbGlicmF0aW9uIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19ESVNUT1JUSU9OKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbi5yZXNlcnZlKDUpOworICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uLmluc2VydChtTGVuc0Rpc3RvcnRpb24uZW5kKCksIGVudHJ5LmRhdGEuZiwgZW50cnkuZGF0YS5mICsgNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IExlbnMgZGlzdG9ydGlvbiBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKHN0YXRpY0luZm8sICZtU3VwcG9ydGVkRGVwdGhTaXplcyk7CisKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBkbG9wZW4oY2FtZXJhMzo6a0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbURlcHRoUGhvdG9Qcm9jZXNzID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzOjpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lPiAoCisgICAgICAgICAgICAgICAgICAgIGRsc3ltKG1EZXB0aFBob3RvTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbikpOworICAgICAgICAgICAgaWYgKG1EZXB0aFBob3RvUHJvY2VzcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGluayB0byBkZXB0aCBwaG90byBwcm9jZXNzIGZ1bmN0aW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsaW5rIHRvIGRlcHRoIHBob3RvIGxpYnJhcnk6ICVzIiwgX19GVU5DVElPTl9fLCBkbGVycm9yKCkpOworICAgICAgICB9CisKKyAgICB9Cit9CisKK0RlcHRoQ29tcG9zaXRlU3RyZWFtOjp+RGVwdGhDb21wb3NpdGVTdHJlYW0oKSB7CisgICAgbUJsb2JDb25zdW1lci5jbGVhcigpLAorICAgIG1CbG9iU3VyZmFjZS5jbGVhcigpLAorICAgIG1CbG9iU3RyZWFtSWQgPSAtMTsKKyAgICBtQmxvYlN1cmZhY2VJZCA9IC0xOworICAgIG1EZXB0aENvbnN1bWVyLmNsZWFyKCk7CisgICAgbURlcHRoU3VyZmFjZS5jbGVhcigpOworICAgIG1EZXB0aENvbnN1bWVyID0gbnVsbHB0cjsKKyAgICBtRGVwdGhTdXJmYWNlID0gbnVsbHB0cjsKKyAgICBpZiAobURlcHRoUGhvdG9MaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBkbGNsb3NlKG1EZXB0aFBob3RvTGliSGFuZGxlKTsKKyAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVwdGhQaG90b1Byb2Nlc3MgPSBudWxscHRyOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworCisgICAgd2hpbGUgKCFtSW5wdXRKcGVnQnVmZmVycy5lbXB0eSgpICYmICFtQmxvYkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRKcGVnQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1CbG9iQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgbG9ja2luZyBibG9iIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIGpwZWcgYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmpwZWdCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXREZXB0aEJ1ZmZlcnMuZW1wdHkoKSAmJiAhbURlcHRoQnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dERlcHRoQnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1EZXB0aENvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbiBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJlY2VpdmluZyBkZXB0aCBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcgZGVwdGggYnVmZmVyIHdpdGggdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgcmVjZWl2ZWQgYnVmZmVyIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAidGltZSBzdGFtcDogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbURlcHRoQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5kZXB0aEJ1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNhcHR1cmVSZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DYXB0dXJlUmVzdWx0cy5iZWdpbigpOworICAgICAgICAvLyBOZWdhdGl2ZSB0aW1lc3RhbXAgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBjYXB0dXJlIHJlc3VsdAorICAgICAgICAvLyBjb2xsZWN0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChpdC0+Zmlyc3QgPj0gMCkgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID0gc3RkOjpnZXQ8MD4oaXQtPnNlY29uZCk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0ucmVzdWx0ID0gc3RkOjpnZXQ8MT4oaXQtPnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1GcmFtZU51bWJlck1hcC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtRnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+c2Vjb25kXS5mcmFtZU51bWJlciA9IGl0LT5maXJzdDsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBhdXRvIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1FcnJvckZyYW1lTnVtYmVycy5lbmQoKSkgeworICAgICAgICBib29sIGZyYW1lRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvICZpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09ICppdCkgeworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuc2Vjb25kLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcmFtZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZUZvdW5kKSB7CisgICAgICAgICAgICBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vdCBhYmxlIHRvIGZpbmQgZmFpbGluZyBpbnB1dCB3aXRoIGZyYW1lIG51bWJlcjogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICppdCk7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKSB7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKCghaXQuc2Vjb25kLmVycm9yKSAmJiAoaXQuc2Vjb25kLmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoaXQuc2Vjb25kLmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld0lucHV0QXZhaWxhYmxlOworfQorCitpbnQ2NF90IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pIHsKKyAgICBpbnQ2NF90IHJldCA9IC0xOworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZXJyb3IgJiYgIWl0LnNlY29uZC5lcnJvck5vdGlmaWVkICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICByZXQgPSBpdC5zZWNvbmQuZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0lucHV0RnJhbWUoY29uc3QgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIHN0YXR1c190IHJlczsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICphbmI7CisgICAgaW50IGZlbmNlRmQ7CisgICAgdm9pZCAqZHN0QnVmZmVyOworCisgICAgYXV0byBqcGVnU2l6ZSA9IGFuZHJvaWQ6OmNhbWVyYTI6OkpwZWdQcm9jZXNzb3I6OmZpbmRKcGVnU2l6ZShpbnB1dEZyYW1lLmpwZWdCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aCk7CisgICAgaWYgKGpwZWdTaXplID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gZmluZCBpbnB1dCBqcGVnIHNpemUsIGRlZmF1bHQgdG8gdXNpbmcgZW50aXJlIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBqcGVnU2l6ZSA9IGlucHV0RnJhbWUuanBlZ0J1ZmZlci53aWR0aDsKKyAgICB9CisKKyAgICBzaXplX3QgbWF4RGVwdGhKcGVnU2l6ZTsKKyAgICBpZiAobU1heEpwZWdTaXplID4gMCkgeworICAgICAgICBtYXhEZXB0aEpwZWdTaXplID0gbU1heEpwZWdTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIG1heERlcHRoSnBlZ1NpemUgPSBzdGQ6Om1heDxzaXplX3Q+IChqcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLndpZHRoICogaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5oZWlnaHQgKiAzIC8gMik7CisgICAgfQorICAgIHVpbnQ4X3QganBlZ1F1YWxpdHkgPSAxMDA7CisgICAgYXV0byBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAganBlZ1F1YWxpdHkgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKworICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byB3aWxsIGNvbnNpc3Qgb2YgdGhlIG1haW4ganBlZyBidWZmZXIsIHRoZSBkZXB0aCBtYXAgYnVmZmVyIChhbHNvIGluCisgICAgLy8ganBlZyBmb3JtYXQpIGFuZCBjb25maWRlbmNlIG1hcCAoanBlZyBhcyB3ZWxsKS4gQXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBhbGwgMyBqcGVnIG5lZWQKKyAgICAvLyBtYXgganBlZyBzaXplLgorICAgIHNpemVfdCBmaW5hbEpwZWdCdWZmZXJTaXplID0gbWF4RGVwdGhKcGVnU2l6ZSAqIDM7CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtT3V0cHV0U3VyZmFjZS5nZXQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMSkpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICIgJXp1eCV1IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDFVLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPmRlcXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksICZhbmIsICZmZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmV0cmlldmluZyBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpOworICAgIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBsb2NrIG91dHB1dCBidWZmZXIgZmVuY2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChnYi0+Z2V0V2lkdGgoKSA8IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHx8IChnYi0+Z2V0SGVpZ2h0KCkgIT0gMSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCbG9iIGJ1ZmZlciBzaXplIG1pc21hdGNoLCBleHBlY3RlZCAlZHglZCByZWNlaXZlZCAlenV4JXUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ2ItPmdldFdpZHRoKCksIGdiLT5nZXRIZWlnaHQoKSwgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMVUpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGRlcHRoUGhvdG87CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoaW5wdXRGcmFtZS5qcGVnQnVmZmVyLmRhdGEpOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnV2lkdGggPSBtQmxvYldpZHRoOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnSGVpZ2h0ID0gbUJsb2JIZWlnaHQ7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdTaXplID0ganBlZ1NpemU7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4gKGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuZGF0YSk7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIud2lkdGg7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBIZWlnaHQgPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmhlaWdodDsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFN0cmlkZSA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuc3RyaWRlOworICAgIGRlcHRoUGhvdG8ubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgZGVwdGhQaG90by5tSXNMb2dpY2FsID0gbUlzTG9naWNhbENhbWVyYTsKKyAgICBkZXB0aFBob3RvLm1NYXhKcGVnU2l6ZSA9IG1heERlcHRoSnBlZ1NpemU7CisgICAgLy8gVGhlIGNhbWVyYSBpbnRyaW5zaWMgY2FsaWJyYXRpb24gbGF5b3V0IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgaWYgKG1JbnRyaW5zaWNDYWxpYnJhdGlvbi5zaXplKCkgPT0gNSkgeworICAgICAgICBtZW1jcHkoZGVwdGhQaG90by5tSW50cmluc2ljQ2FsaWJyYXRpb24sIG1JbnRyaW5zaWNDYWxpYnJhdGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUludHJpbnNpY0NhbGlicmF0aW9uKSk7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzSW50cmluc2ljQ2FsaWJyYXRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnRyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgIC8vIFtrYXBwYV8xLCBrYXBwYV8yLCBrYXBwYV8zIGthcHBhXzQsIGthcHBhXzVdCisgICAgaWYgKG1MZW5zRGlzdG9ydGlvbi5zaXplKCkgPT0gNSkgeworICAgICAgICBtZW1jcHkoZGVwdGhQaG90by5tTGVuc0Rpc3RvcnRpb24sIG1MZW5zRGlzdG9ydGlvbi5kYXRhKCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGRlcHRoUGhvdG8ubUxlbnNEaXN0b3J0aW9uKSk7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNMZW5zRGlzdG9ydGlvblZhbGlkID0gMDsKKyAgICB9CisgICAgZW50cnkgPSBpbnB1dEZyYW1lLnJlc3VsdC5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGpwZWcgb3JpZW50YXRpb24gdmFsdWVzIG11c3QgYmUgd2l0aGluIFswLCA5MCwgMTgwLCAyNzBdLgorICAgICAgICBzd2l0Y2ggKGVudHJ5LmRhdGEuaTMyWzBdKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvLm1PcmllbnRhdGlvbiA9IHN0YXRpY19jYXN0PERlcHRoUGhvdG9PcmllbnRhdGlvbj4gKGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGpwZWcgb3JpZW50YXRpb24gdmFsdWU6ICVkLCBkZWZhdWx0IHRvIDAgZGVncmVlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVudHJ5LmRhdGEuaTMyWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBhY3R1YWxKcGVnU2l6ZSA9IDA7CisgICAgcmVzID0gbURlcHRoUGhvdG9Qcm9jZXNzKGRlcHRoUGhvdG8sIGZpbmFsSnBlZ0J1ZmZlclNpemUsIGRzdEJ1ZmZlciwgJmFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBwcm9jZXNzaW5nIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IGZpbmFsSnBlZ1NpemUgPSBhY3R1YWxKcGVnU2l6ZSArIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IpOworICAgIGlmIChmaW5hbEpwZWdTaXplID4gZmluYWxKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IEZpbmFsIGpwZWcgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZSBqcGVnIGJsb2IgaGVhZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEZpbmFsIGpwZWcgc2l6ZTogJXp1IiwgX19mdW5jX18sIGZpbmFsSnBlZ1NpemUpOworICAgIHVpbnQ4X3QqIGhlYWRlciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4gKGRzdEJ1ZmZlcikgKworICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKSk7CisgICAgc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iICpibG9iID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IqPiAoaGVhZGVyKTsKKyAgICBibG9iLT5qcGVnX2Jsb2JfaWQgPSBDQU1FUkEzX0pQRUdfQkxPQl9JRDsKKyAgICBibG9iLT5qcGVnX3NpemUgPSBhY3R1YWxKcGVnU2l6ZTsKKyAgICBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pIHsKKyAgICBpZiAoaW5wdXRGcmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1EZXB0aENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5kZXB0aEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUJsb2JDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5qcGVnQnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChpbnB1dEZyYW1lLT5lcnJvciB8fCBtRXJyb3JTdGF0ZSkgJiYgIWlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQpIHsKKyAgICAgICAgbm90aWZ5RXJyb3IoaW5wdXRGcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcykgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA8PSBjdXJyZW50VHMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjp0aHJlYWRMb29wKCkgeworICAgIGludDY0X3QgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSBnZXROZXh0UmVhZHlJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgIGlmICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZhaWxpbmdGcmFtZU51bWJlciA9IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICAgICAgaWYgKGZhaWxpbmdGcmFtZU51bWJlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBlcmFzZSAnbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdJyBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHR3byBpbnRlcm5hbCBzdHJlYW0gYnVmZmVycyB0byBmYWlsLiBJbiBzdWNoIHNjZW5hcmlvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgc3RyZWFtIHNob3VsZCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCBhIHN0cmVhbSBidWZmZXIgZXJyb3Igb25seQorICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFuZCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgd2l0aGluICdlcnJvck5vdGlmaWVkJy4KKyAgICAgICAgICAgICAgICAgICAgLy8gQW55IHByZXNlbnQgZmFpbGVkIGlucHV0IGZyYW1lcyB3aWxsIGJlIHJlbW92ZWQgb24gYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gJ3JlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpJy4KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJm1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHJldCA9IG1JbnB1dFJlYWR5Q29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIGtXYWl0RHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgd2FpdCBvbiBjb25kaXRpb24gZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBwcm9jZXNzSW5wdXRGcmFtZShtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RZTkFNSUNfREVQVEgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKyAgICBpZiAobVN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRoaXMgY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IGRlcHRoIG1hcCBzdHJlYW1zISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZSh3aWR0aCwgaGVpZ2h0LCBtU3VwcG9ydGVkRGVwdGhTaXplcywgJmRlcHRoV2lkdGgsICZkZXB0aEhlaWdodCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGRlcHRoIHN0cmVhbSBzaXplISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQmxvYkNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLzEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQmxvYkNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSnBlZ0NvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtQmxvYlN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQmxvYlN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwga0pwZWdEYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbUJsb2JTdHJlYW1JZCA9ICppZDsKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgICAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbURlcHRoQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIC8qbWF4TG9ja2VkQnVmZmVycyovIDEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtRGVwdGhTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gZGVwdGhTdXJmYWNlSWQ7CisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obURlcHRoU3VyZmFjZSwgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQsIGtEZXB0aE1hcFBpeGVsRm9ybWF0LAorICAgICAgICAgICAga0RlcHRoTWFwRGF0YVNwYWNlLCByb3RhdGlvbiwgJm1EZXB0aFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmZGVwdGhTdXJmYWNlSWQpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkID0gZGVwdGhTdXJmYWNlSWRbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgYmxvYiBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKG1EZXB0aFN0cmVhbUlkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlcHRoIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1CbG9iV2lkdGggPSB3aWR0aDsKKyAgICBtQmxvYkhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKChtRGVwdGhQaG90b0xpYkhhbmRsZSA9PSBudWxscHRyKSB8fCAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gbGlicmFyeSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnM7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gbUJsb2JTdXJmYWNlLmdldCgpOworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heFByb2R1Y2VyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkRlcHRoQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIC8vIFRoZSAnQ2FtZXJhRGV2aWNlQ2xpZW50JyBwYXJlbnQgd2lsbCBkZWxldGUgdGhlIGJsb2Igc3RyZWFtCisgICAgcmVxdWVzdEV4aXQoKTsKKworICAgIGF1dG8gcmV0ID0gam9pbigpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtRGVwdGhTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHJldCA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1EZXB0aFN0cmVhbUlkKTsKKyAgICAgICAgbURlcHRoU3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0pwZWdEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKcGVnIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0RlcHRoTWFwRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGVwdGggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4gKiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobURlcHRoU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtRGVwdGhTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdLnB1c2hfYmFjayhtRGVwdGhTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUJsb2JTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQmxvYlN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUJsb2JTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0ucHVzaF9iYWNrKG1CbG9iU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbUJsb2JTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gUHJvY2Vzc2luZyBjYW4gY29udGludWUgZXZlbiBpbiBjYXNlIG9mIHJlc3VsdCBlcnJvcnMuCisgICAgLy8gQXQgdGhlIG1vbWVudCBkZXB0aCBjb21wb3NpdGUgc3RyZWFtIHByb2Nlc3NpbmcgcmVsaWVzIG1haW5seSBvbiBzdGF0aWMgY2FtZXJhCisgICAgLy8gY2hhcmFjdGVyaXN0aWNzIGRhdGEuIFRoZSBhY3R1YWwgcmVzdWx0IGRhdGEgY2FuIGJlIHVzZWQgZm9yIHRoZSBqcGVnIHF1YWxpdHkgYnV0CisgICAgLy8gaW4gY2FzZSBpdCBpcyBhYnNlbnQgd2UgY2FuIGRlZmF1bHQgdG8gbWF4aW11bS4KKyAgICBlcmFzZVJlc3VsdChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbURlcHRoU3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUJsb2JTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGggLypvdXQqLywgc2l6ZV90ICpkZXB0aEhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChkZXB0aFdpZHRoID09IG51bGxwdHIpIHx8IChkZXB0aEhlaWdodCA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZsb2F0IGFyVG9sID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZTsKKyAgICAqZGVwdGhXaWR0aCA9ICpkZXB0aEhlaWdodCA9IDA7CisKKyAgICBmbG9hdCBhc3BlY3RSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAod2lkdGgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChoZWlnaHQpOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3JlZERlcHRoU2l6ZXMpIHsKKyAgICAgICAgYXV0byBjdXJyZW50V2lkdGggPSBzdGQ6OmdldDwwPihpdCk7CisgICAgICAgIGF1dG8gY3VycmVudEhlaWdodCA9IHN0ZDo6Z2V0PDE+KGl0KTsKKyAgICAgICAgaWYgKChjdXJyZW50V2lkdGggPT0gd2lkdGgpICYmIChjdXJyZW50SGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgICpkZXB0aFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAqZGVwdGhIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudFdpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudEhlaWdodCk7CisgICAgICAgICAgICBhdXRvIGN1cnJlbnRTaXplID0gY3VycmVudFdpZHRoICogY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIGF1dG8gb2xkU2l6ZSA9ICgqZGVwdGhXaWR0aCkgKiAoKmRlcHRoSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICgoZmFicyhhc3BlY3RSYXRpbyAtIGN1cnJlbnRSYXRpbykgPD0gYXJUb2wpICYmIChjdXJyZW50U2l6ZSA+IG9sZFNpemUpKSB7CisgICAgICAgICAgICAgICAgKmRlcHRoV2lkdGggPSBjdXJyZW50V2lkdGg7CisgICAgICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoKCpkZXB0aFdpZHRoID4gMCkgJiYgKCpkZXB0aEhlaWdodCA+IDApKSA/IE9LIDogQkFEX1ZBTFVFOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZGVwdGhTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVudHJ5ID0gY2guZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRGVwdGggc3RyZWFtIGRpbWVuc2lvbnMgaGF2ZSBmb3VyIGludDMyX3QgY29tcG9uZW50cworICAgICAgICAvLyAocGl4ZWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHR5cGUpCisgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gZW50cnkuY291bnQgLyA0OworICAgICAgICBkZXB0aFNpemVzLT5yZXNlcnZlKGVudHJ5Q291bnQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoZW50cnkuZGF0YS5pMzJbaV0gPT0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChlbnRyeS5kYXRhLmkzMltpKzNdID09CisgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICBkZXB0aFNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGVudHJ5LmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gZGVwdGhTaXplczsKKyAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNoLCAmZGVwdGhTaXplcyk7CisgICAgaWYgKGRlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBwcmVzZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgZGVwdGhTaXplcywgJmRlcHRoV2lkdGgsCisgICAgICAgICAgICAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSnBlZy9CbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtKcGVnRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gRGVwdGggc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBkZXB0aFdpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBkZXB0aEhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtEZXB0aE1hcERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YzU5YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvaW1hZ2luZ19tb2RlbC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGVwdGhfbWFwLmg+CisKKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWw7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIERlcHRoQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKKworcHVibGljOgorICAgIERlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8vIENvbXBvc2l0ZVN0cmVhbSBvdmVycmlkZXMKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1CbG9iU3RyZWFtSWQ7IH0KKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgZGVwdGhCdWZmZXI7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIganBlZ0J1ZmZlcjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICByZXN1bHQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBlcnJvcihmYWxzZSksIGVycm9yTm90aWZpZWQoZmFsc2UpLCBmcmFtZU51bWJlcigtMSkgeyB9CisgICAgfTsKKworICAgIC8vIEhlbHBlciBtZXRob2RzCisgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4qIGRlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLyk7CisKKyAgICAvLyBEeW5hbWljIGRlcHRoIHByb2Nlc3NpbmcKKyAgICBzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhPdXRTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LCBzaXplX3QgJmFjdHVhbFNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAmZGVwdGhNYXBCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgbWF4SnBlZ1NpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+KiBpdGVtcyAvKm91dCovKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2luZ01vZGVsPiBnZXRJbWFnaW5nTW9kZWwoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIC8vIEJ1ZmZlci9SZXN1bHRzIGhhbmRsaW5nCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKTsKKworICAgIC8vIEZpbmQgZmlyc3QgY29tcGxldGUgYW5kIHZhbGlkIGZyYW1lIHdpdGggc21hbGxlc3QgdGltZXN0YW1wCisgICAgYm9vbCBnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTY7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0RlcHRoTWFwRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9ERVBUSDsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKworICAgIGludCAgICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQsIG1CbG9iU3VyZmFjZUlkLCBtRGVwdGhTdHJlYW1JZCwgbURlcHRoU3VyZmFjZUlkOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CbG9iV2lkdGgsIG1CbG9iSGVpZ2h0OworICAgIHNwPENwdUNvbnN1bWVyPiAgICAgIG1CbG9iQ29uc3VtZXIsIG1EZXB0aENvbnN1bWVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkLCBtQmxvYkJ1ZmZlckFjcXVpcmVkOworICAgIHNwPFN1cmZhY2U+ICAgICAgICAgIG1EZXB0aFN1cmZhY2UsIG1CbG9iU3VyZmFjZSwgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IG1TdXBwb3J0ZWREZXB0aFNpemVzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbiwgbUxlbnNEaXN0b3J0aW9uOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgdm9pZCogICAgICAgICAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGU7CisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBtRGVwdGhQaG90b1Byb2Nlc3M7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBEZXB0aCBidWZmZXIgdGltZXN0YW1wcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXREZXB0aEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBKcGVnL0Jsb2IgYnVmZmVyIHRpbWVzdGFtcHMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0SnBlZ0J1ZmZlcnM7CisKKyAgICAvLyBNYXAgb2YgYWxsIGlucHV0IGZyYW1lcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg3MTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDE3MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAidXRpbHMvRXhpZlV0aWxzLmgiCisjaW5jbHVkZSAiSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIgorI2luY2x1ZGUgIkhlaWNDb21wb3NpdGVTdHJlYW0uaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpDYW1lcmFCbG9iSWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworSGVpY0NvbXBvc2l0ZVN0cmVhbTo6SGVpY0NvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBDb21wb3NpdGVTdHJlYW0oZGV2aWNlLCBjYiksCisgICAgICAgIG1Vc2VIZWljKGZhbHNlKSwKKyAgICAgICAgbU51bU91dHB1dFRpbGVzKDEpLAorICAgICAgICBtT3V0cHV0V2lkdGgoMCksCisgICAgICAgIG1PdXRwdXRIZWlnaHQoMCksCisgICAgICAgIG1NYXhIZWljQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbUdyaWRXaWR0aChIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZFdpZHRoKSwKKyAgICAgICAgbUdyaWRIZWlnaHQoSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRIZWlnaHQpLAorICAgICAgICBtR3JpZFJvd3MoMSksCisgICAgICAgIG1HcmlkQ29scygxKSwKKyAgICAgICAgbVVzZUdyaWQoZmFsc2UpLAorICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkKC0xKSwKKyAgICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQoLTEpLAorICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkKC0xKSwKKyAgICAgICAgbU1haW5JbWFnZVN1cmZhY2VJZCgtMSksCisgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBQcm9kdWNlckxpc3RlbmVyKCkpLAorICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnRlcigwKSwKKyAgICAgICAgbUdyaWRUaW1lc3RhbXBVcygwKSB7Cit9CisKK0hlaWNDb21wb3NpdGVTdHJlYW06On5IZWljQ29tcG9zaXRlU3RyZWFtKCkgeworICAgIC8vIENhbGwgZGVpbml0Q29kZWMgaW4gY2FzZSBzdHJlYW0gaGFzbid0IGJlZW4gZGVsZXRlZCB5ZXQgdG8gYXZvaWQgYW55CisgICAgLy8gbWVtb3J5L3Jlc291cmNlIGxlYWsuCisgICAgZGVpbml0Q29kZWMoKTsKKworICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5jbGVhcigpOworCisgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCA9IC0xOworICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gLTE7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci5jbGVhcigpOworICAgIG1BcHBTZWdtZW50U3VyZmFjZS5jbGVhcigpOworCisgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gLTE7CisgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IC0xOworICAgIG1NYWluSW1hZ2VDb25zdW1lci5jbGVhcigpOworICAgIG1NYWluSW1hZ2VTdXJmYWNlLmNsZWFyKCk7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50IGZvcm1hdDsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFzcGFjZTsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLCAmZGF0YXNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSAmJiAoZGF0YXNwYWNlID09IEhBTF9EQVRBU1BBQ0VfSEVJRikpOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8sIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXMgPSBpbml0aWFsaXplQ29kZWMod2lkdGgsIGhlaWdodCwgZGV2aWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgSEVJQy9IRVZDIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtQXBwU2VnbWVudFN0cmVhbSIpKTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICBtU3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOworCisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUFwcFNlZ21lbnRTdXJmYWNlLCBtQXBwU2VnbWVudE1heFNpemUsIDEsIGZvcm1hdCwKKyAgICAgICAgICAgIGtBcHBTZWdtZW50RGF0YVNwYWNlLCByb3RhdGlvbiwgJm1BcHBTZWdtZW50U3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBKUEVHIEFwcCBzZWdtZW50IHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZwcm9kdWNlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBzdXJmYWNlIGZvciBIZWljIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtSGV2Y0lucHV0WVVWU3RyZWFtIikpOworICAgIH0KKyAgICBtTWFpbkltYWdlU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIHJlcyA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IGNvZGVjOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludD4gc291cmNlU3VyZmFjZUlkOworICAgIC8vVXNlIFlVVl84ODggZm9ybWF0IGlmIGZyYW1ld29yayB0aWxpbmcgaXMgbmVlZGVkLgorICAgIGludCBzcmNTdHJlYW1GbXQgPSBtVXNlR3JpZCA/IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCA6CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obU1haW5JbWFnZVN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIHNyY1N0cmVhbUZtdCwga0hlaWZEYXRhU3BhY2UsCisgICAgICAgICAgICByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzb3VyY2VTdXJmYWNlSWQpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IHNvdXJjZVN1cmZhY2VJZFswXTsKKyAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gKmlkOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBtYWluIGltYWdlIHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICByZXMgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSEFMIG1haW4gaW1hZ2Ugc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpbml0Q29weVJvd0Z1bmN0aW9uKHdpZHRoKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSB7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBhdXRvIHJlcyA9IGpvaW4oKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGpvaW4gd2l0aCB0aGUgbWFpbiBwcm9jZXNzaW5nIHRocmVhZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBkZWluaXRDb2RlYygpOworCisgICAgaWYgKG1BcHBTZWdtZW50U3RyZWFtSWQgPj0gMCkgeworICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1BcHBTZWdtZW50U3RyZWFtSWQpOworICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaWYgKGJ1ZmZlckluZm8ubUVycm9yKSByZXR1cm47CisKKyAgICBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnB1c2goYnVmZmVySW5mby5tVGltZXN0YW1wKTsKK30KKworLy8gV2UgbmVlZCB0byBnZXQgdGhlIHNldHRpbmdzIGVhcmx5IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29kZWMgb3V0cHV0CisvLyBhcnJpdmVzIGVhcmxpZXIgdGhhbiByZXN1bHQgbWV0YWRhdGEuCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiSEVJQyBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAobUVycm9yU3RhdGUgfHwgKHN0cmVhbUlkICE9IGdldFN0cmVhbUlkKCkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVtcGxhY2UoZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpOworCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5OworCisgICAgaW50MzJfdCBvcmllbnRhdGlvbiA9IDA7CisgICAgZW50cnkgPSBzZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgb3JpZW50YXRpb24gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBpbnQzMl90IHF1YWxpdHkgPSBrRGVmYXVsdEpwZWdRdWFsaXR5OworICAgIGVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfUVVBTElUWSk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgcXVhbGl0eSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIG1TZXR0aW5nc0J5RnJhbWVOdW1iZXJbZnJhbWVOdW1iZXJdID0gc3RkOjptYWtlX3BhaXIob3JpZW50YXRpb24sIHF1YWxpdHkpOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGtBcHBTZWdtZW50RGF0YVNwYWNlKSkgeworICAgICAgICBBTE9HVigiJXM6IEpQRUcgQVBQIHNlZ21lbnRzIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0hlaWZEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBZVVZfODg4IGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFlVVl84ODggaW50ZXJuYWwgc3RyZWFtIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBIRVZDIHRpbGluZyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0WXV2QnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+KiBjb21wb3NpdGVPdXRwdXQgLypvdXQqLykgeworICAgIGlmIChjb21wb3NpdGVPdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+Y2xlYXIoKTsKKworICAgIGJvb2wgdXNlR3JpZCwgdXNlSGVpYzsKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZCA9IGlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoCisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgJnVzZUhlaWMsICZ1c2VHcmlkLCBudWxscHRyKTsKKyAgICBpZiAoIWlzU2l6ZVN1cHBvcnRlZCkgeworICAgICAgICAvLyBTaXplIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZWl0aGVyIGVuY29kZXIuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmluc2VydChjb21wb3NpdGVPdXRwdXQtPmVuZCgpLCAyLCBzdHJlYW1JbmZvKTsKKworICAgIC8vIEpQRUcgQVBQUyBzZWdtZW50cyBCbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLndpZHRoID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNoKTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uaGVpZ2h0ID0gMTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9COworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5kYXRhU3BhY2UgPSBrQXBwU2VnbWVudERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIC8vIFlVVi9JTVBMRU1FTlRBVElPTl9ERUZJTkVEIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmZvcm1hdCA9IHVzZUdyaWQgPyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODggOgorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5kYXRhU3BhY2UgPSBrSGVpZkRhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IHVzZUhlaWMgPyBHUkFMTE9DX1VTQUdFX0hXX0lNQUdFX0VOQ09ERVIgOgorICAgICAgICAgICAgdXNlR3JpZCA/IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCwgQVN0cmluZyogaGV2Y05hbWUpIHsKKyAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciYgaGVpY01hbmFnZXIgPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIHJldHVybiBoZWljTWFuYWdlci5pc1NpemVTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCwgdXNlSGVpYywgdXNlR3JpZCwgc3RhbGwsIGhldmNOYW1lKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKSB7CisgICAgaW50IG1lbWZkID0gc3lzY2FsbChfX05SX21lbWZkX2NyZWF0ZSwgIkhFSUYtdHJ5LW1lbWZkIiwgTUZEX0NMT0VYRUMpOworICAgIGlmIChtZW1mZCA9PSAtMSkgeworICAgICAgICBpZiAoZXJybm8gIT0gRU5PU1lTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgdG1wZnMgZmlsZS4gZXJybm8gJWQiLCBfX0ZVTkNUSU9OX18sIGVycm5vKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNsb3NlKG1lbWZkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNPdXRwdXRGcmFtZUF2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBvdXRwdXRCdWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIEFMT0dWKCIlczogaW5kZXggJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCwgdGltZSAlIiBQUklkNjQgIiwgZmxhZ3MgMHgleCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dEJ1ZmZlckluZm8uaW5kZXgsIG91dHB1dEJ1ZmZlckluZm8ub2Zmc2V0LAorICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby5zaXplLCBvdXRwdXRCdWZmZXJJbmZvLnRpbWVVcywgb3V0cHV0QnVmZmVySW5mby5mbGFncyk7CisKKyAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgIGlmICgob3V0cHV0QnVmZmVySW5mby5zaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoKG91dHB1dEJ1ZmZlckluZm8uZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgPT0gMCkpIHsKKyAgICAgICAgICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKG91dHB1dEJ1ZmZlckluZm8pOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySW5mby5pbmRleCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySW5mby5pbmRleCk7CisgICAgfQorfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29kZWMgWVVWIGlucHV0IG1vZGUgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIEhldmMgdGlsaW5nIG1vZGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvZGVjSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbmRleCk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljRm9ybWF0Q2hhbmdlZChzcDxBTWVzc2FnZT4mIG5ld0Zvcm1hdCkgeworICAgIGlmIChuZXdGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG5ld0Zvcm1hdCBtdXN0IG5vdCBiZSBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIEFTdHJpbmcgbWltZUhlaWMoTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBuZXdGb3JtYXQtPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAobWltZSAhPSBtaW1lSGVpYykgeworICAgICAgICAvLyBGb3IgSEVWQyBjb2RlYywgYmVsb3cga2V5cyBuZWVkIHRvIGJlIGZpbGxlZCBvdXQgb3Igb3ZlcndyaXR0ZW4gc28gdGhhdCB0aGUKKyAgICAgICAgLy8gbXV4ZXIgY2FuIGhhbmRsZSB0aGVtIGFzIEhFSUMgb3V0cHV0IGltYWdlLgorICAgICAgICBuZXdGb3JtYXQtPnNldFN0cmluZyhLRVlfTUlNRSwgbWltZUhlaWMpOworICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwgbU91dHB1dFdpZHRoKTsKKyAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBtT3V0cHV0SGVpZ2h0KTsKKyAgICAgICAgaWYgKG1Vc2VHcmlkKSB7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX1dJRFRILCBtR3JpZFdpZHRoKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfSEVJR0hULCBtR3JpZEhlaWdodCk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIG1HcmlkUm93cyk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX0NPTFVNTlMsIG1HcmlkQ29scyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfSVNfREVGQVVMVCwgMSAvKmlzUHJpbWFyeSovKTsKKworICAgIGludDMyX3QgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgIGlmIChuZXdGb3JtYXQtPmZpbmRJbnQzMihLRVlfR1JJRF9ST1dTLCAmZ3JpZFJvd3MpICYmCisgICAgICAgICAgICBuZXdGb3JtYXQtPmZpbmRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCAmZ3JpZENvbHMpKSB7CisgICAgICAgIG1OdW1PdXRwdXRUaWxlcyA9IGdyaWRSb3dzICogZ3JpZENvbHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU51bU91dHB1dFRpbGVzID0gMTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IG1OdW1PdXRwdXRUaWxlcyBpcyAlenUiLCBfX0ZVTkNUSU9OX18sIG1OdW1PdXRwdXRUaWxlcyk7CisgICAgbUZvcm1hdCA9IG5ld0Zvcm1hdDsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNDb2RlY0Vycm9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgbUVycm9yU3RhdGUgPSB0cnVlOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBvdXRwdXQgc3VyZmFjZSBzZXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXMgPSBtT3V0cHV0U3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIG1Qcm9kdWNlckxpc3RlbmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ2Fubm90IHVzZSBTb3VyY2VTdXJmYWNlIGJ1ZmZlciBjb3VudCBzaW5jZSBpdCBjb3VsZCBiZSBjb2RlYydzIDUxMio1MTIgdGlsZQorICAgIC8vIGJ1ZmZlciBjb3VudC4KKyAgICBpbnQgbWF4UHJvZHVjZXJCdWZmZXJzID0gMTsKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYW53Q29uc3VtZXIsIG1heFByb2R1Y2VyQnVmZmVycyArIG1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhbndDb25zdW1lciwgbU1heEhlaWNCdWZmZXJTaXplLCAxKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBkaW1lbnNpb24gJXp1IHggMSBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1NYXhIZWljQnVmZmVyU2l6ZSwgbU1haW5JbWFnZVN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkhlaWNDb21wb3NpdGVTdHJlYW1Qcm9jIik7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06Omluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUFwcFNlZ21lbnRTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQXBwU2VnbWVudFN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUFwcFNlZ21lbnRTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUFwcFNlZ21lbnRTdHJlYW1JZF0ucHVzaF9iYWNrKG1BcHBTZWdtZW50U3VyZmFjZUlkKTsKKworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1NYWluSW1hZ2VTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttTWFpbkltYWdlU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtTWFpbkltYWdlU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21NYWluSW1hZ2VTdHJlYW1JZF0ucHVzaF9iYWNrKG1NYWluSW1hZ2VTdXJmYWNlSWQpOworCisgICAgaWYgKGN1cnJlbnRTdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpjdXJyZW50U3RyZWFtSWQgPSBtTWFpbkltYWdlU3RyZWFtSWQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmZpbmQocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSAhPSBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmVuZCgpKSB7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lbXBsYWNlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdGltZXN0YW1wKTsKKyAgICAgICAgbVNldHRpbmdzQnlUaW1lc3RhbXBbdGltZXN0YW1wXSA9IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXJbcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyXTsKKyAgICAgICAgbVNldHRpbmdzQnlGcmFtZU51bWJlci5lcmFzZShyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpIHsKKyAgICB3aGlsZSAoIW1TZXR0aW5nc0J5VGltZXN0YW1wLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1TZXR0aW5nc0J5VGltZXN0YW1wLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5vcmllbnRhdGlvbiA9IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5xdWFsaXR5ID0gaXQtPnNlY29uZC5zZWNvbmQ7CisgICAgICAgIG1TZXR0aW5nc0J5VGltZXN0YW1wLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVtcHR5KCkgJiYgIW1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1BcHBTZWdtZW50Q29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2Fub3Qgbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKChyZXMgIT0gT0spIHx8ICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgSlBFR19BUFBfU0VHTUVOVFMgaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0aW5nIEpQRUdfQVBQX1NFR01FTlRTIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmFwcFNlZ21lbnRCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXRZdXZCdWZmZXJzLmVtcHR5KCkgJiYgIW1ZdXZCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dFl1dkJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtTWFpbkltYWdlQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2Fub3Qgbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIFlVVl84ODggaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBZVVZfODg4IGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0ueXV2QnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1Db2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICAvLyBCaXRzdHJlYW0gYnVmZmVyIHRpbWVzdGFtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRpcmVjdGx5IGNvcnJlbGF0ZSB3aXRoIGlucHV0CisgICAgICAgIC8vIGJ1ZmZlciB0aW1lc3RhbXAuIEFzc3VtZSBlbmNvZGVyIGlucHV0IHRvIG91dHB1dCBpcyBGSUZPLCB1c2UgYSBxdWV1ZQorICAgICAgICAvLyB0byBsb29rIHVwIHRpbWVzdGFtcC4KKyAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lID0gLTE7CisgICAgICAgIGlmIChtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgYnVmZmVyIHRpbWVzdGFtcCBmb3IgY29kZWMgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGlyZWN0IG1hcHBpbmcgYmV0d2VlbiBjYW1lcmEgdGltZXN0YW1wIChpbiBucykgYW5kIGNvZGVjIHRpbWVzdGFtcCAoaW4gdXMpLgorICAgICAgICAgICAgYnVmZmVyVGltZSA9IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMuZnJvbnQoKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyKys7CisgICAgICAgICAgICBpZiAobU91dHB1dEJ1ZmZlckNvdW50ZXIgPT0gbU51bU91dHB1dFRpbGVzKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbYnVmZmVyVGltZV0uY29kZWNPdXRwdXRCdWZmZXJzLnB1c2hfYmFjaygqaXQpOworICAgICAgICB9CisgICAgICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUZyYW1lTnVtYmVyTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1GcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5zZWNvbmRdLmZyYW1lTnVtYmVyID0gaXQtPmZpcnN0OworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNhcHR1cmVSZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DYXB0dXJlUmVzdWx0cy5iZWdpbigpOworICAgICAgICAvLyBOZWdhdGl2ZSB0aW1lc3RhbXAgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBjYXB0dXJlIHJlc3VsdAorICAgICAgICAvLyBjb2xsZWN0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChpdC0+Zmlyc3QgPj0gMCkgeworICAgICAgICAgICAgaWYgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5mcmFtZU51bWJlciA9PSBzdGQ6OmdldDwwPihpdC0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYW1lcmFNZXRhZGF0YT4oc3RkOjpnZXQ8MT4oaXQtPnNlY29uZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhcHR1cmUgcmVzdWx0IGZyYW1lTnVtYmVyL3RpbWVzdGFtcCBtYXBwaW5nIGNoYW5nZWQgYmV0d2VlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2h1dHRlciBhbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgIH0KKworICAgIC8vIG1FcnJvckZyYW1lTnVtYmVycyBzdG9yZXMgZnJhbWUgbnVtYmVyIG9mIGRyb3BwZWQgYnVmZmVycy4KKyAgICBhdXRvIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1FcnJvckZyYW1lTnVtYmVycy5lbmQoKSkgeworICAgICAgICBib29sIGZyYW1lRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvICZpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09ICppdCkgeworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuc2Vjb25kLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcmFtZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZUZvdW5kKSB7CisgICAgICAgICAgICBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vdCBhYmxlIHRvIGZpbmQgZmFpbGluZyBpbnB1dCB3aXRoIGZyYW1lIG51bWJlcjogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICppdCk7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGlzdHJpYnV0ZSBjb2RlYyBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBvdXQgZnJvbSBZVVYgb3V0cHV0CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSAmJiBtQ29kZWNJbnB1dEJ1ZmZlcnMuc2l6ZSgpID4gMDsgaXQrKykgeworICAgICAgICBJbnB1dEZyYW1lJiBpbnB1dEZyYW1lKGl0LT5zZWNvbmQpOworICAgICAgICBpZiAoaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlciA8IG1HcmlkUm93cyAqIG1HcmlkQ29scykgeworICAgICAgICAgICAgLy8gQXZhaWxhYmxlIGlucHV0IHRpbGVzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCBpbnB1dAorICAgICAgICAgICAgLy8gaW1hZ2UuCisgICAgICAgICAgICBzaXplX3QgbmV3SW5wdXRUaWxlcyA9IHN0ZDo6bWluKG1Db2RlY0lucHV0QnVmZmVycy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIG1HcmlkUm93cyAqIG1HcmlkQ29scyAtIGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdJbnB1dFRpbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb2RlY0lucHV0QnVmZmVySW5mbyBpbnB1dEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgeyBtQ29kZWNJbnB1dEJ1ZmZlcnNbMF0sIG1HcmlkVGltZXN0YW1wVXMrKywgaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlciB9OworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGlucHV0SW5mbyk7CisKKyAgICAgICAgICAgICAgICBtQ29kZWNJbnB1dEJ1ZmZlcnMuZXJhc2UobUNvZGVjSW5wdXRCdWZmZXJzLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKSB7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgYm9vbCBhcHBTZWdtZW50UmVhZHkgPSAoaXQuc2Vjb25kLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgICFpdC5zZWNvbmQuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaXQuc2Vjb25kLnJlc3VsdCAhPSBudWxscHRyOworICAgICAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSAhaXQuc2Vjb25kLmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpOworICAgICAgICBib29sIGNvZGVjSW5wdXRSZWFkeSA9IChpdC5zZWNvbmQueXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoIWl0LnNlY29uZC5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKCghaXQuc2Vjb25kLmVycm9yKSAmJgorICAgICAgICAgICAgICAgIChpdC5maXJzdCA8ICpjdXJyZW50VHMpICYmCisgICAgICAgICAgICAgICAgKGFwcFNlZ21lbnRSZWFkeSB8fCBjb2RlY091dHB1dFJlYWR5IHx8IGNvZGVjSW5wdXRSZWFkeSkpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld0lucHV0QXZhaWxhYmxlOworfQorCitpbnQ2NF90IEhlaWNDb21wb3NpdGVTdHJlYW06OmdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pIHsKKyAgICBpbnQ2NF90IHJlcyA9IC0xOworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZXJyb3IgJiYgIWl0LnNlY29uZC5lcnJvck5vdGlmaWVkICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICByZXMgPSBpdC5zZWNvbmQuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGJvb2wgYXBwU2VnbWVudFJlYWR5ID0gaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgIWlucHV0RnJhbWUuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaW5wdXRGcmFtZS5yZXN1bHQgIT0gbnVsbHB0cjsKKyAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5zaXplKCkgPiAwOworICAgIGJvb2wgY29kZWNJbnB1dFJlYWR5ID0gaW5wdXRGcmFtZS55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICFpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCk7CisKKyAgICBpZiAoIWFwcFNlZ21lbnRSZWFkeSAmJiAhY29kZWNPdXRwdXRSZWFkeSAmJiAhY29kZWNJbnB1dFJlYWR5KSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gdmFsaWQgYXBwU2VnbWVudEJ1ZmZlci9jb2RlYyBpbnB1dC9vdXRwdXRCdWZmZXIgYXZhaWxhYmxlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgaW5wdXRzIGZvciBIZXZjIHRpbGluZworICAgIGlmIChjb2RlY0lucHV0UmVhZHkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBpbnB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBhbmQgc3RhcnQgbXV4ZXIgaWYgbm90IHlldCBkb25lIHNvCisgICAgaWYgKGlucHV0RnJhbWUubXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXMgPSBzdGFydE11eGVyRm9ySW5wdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgYW5kIHN0YXJ0IG11eGVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBKUEVHIEFQUCBzZWdtZW50cyBkYXRhIHRvIHRoZSBtdXhlci4KKyAgICBpZiAoYXBwU2VnbWVudFJlYWR5ICYmIGlucHV0RnJhbWUubXV4ZXIgIT0gbnVsbHB0cikgeworICAgICAgICByZXMgPSBwcm9jZXNzQXBwU2VnbWVudCh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIEpQRUcgQVBQIHNlZ21lbnRzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBtZWRpYSBjb2RlYyBiaXRzdHJlYW0gYnVmZmVycyB0byBtdXhlci4KKyAgICB3aGlsZSAoIWlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBvdXRwdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuICYmIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID09IDApIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb21wbGV0ZWQgaW5wdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgaWYgKGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIE5vIHNpbmdsZSBjb2RlYyBvdXRwdXQgYnVmZmVyIGhhcyBiZWVuIGdlbmVyYXRlZC4gQ29udGludWUgdG8KKyAgICAgICAgLy8gd2FpdC4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGF1dG8gcmVzID0gb3V0cHV0QU5XLT5kZXF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCAmaW5wdXRGcmFtZS5hbmIsICZpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZXRyaWV2aW5nIG91dHB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ29tYmluZSBjdXJyZW50IHRocmVhZCBpZCwgc3RyZWFtIGlkIGFuZCB0aW1lc3RhbXAgdG8gdW5pcXVlbHkgaWRlbnRpZnkgaW1hZ2UuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRlbXBPdXRwdXRGaWxlOworICAgIHRlbXBPdXRwdXRGaWxlIDw8ICJIRUlGLSIgPDwgcHRocmVhZF9zZWxmKCkgPDwgIi0iCisgICAgICAgICAgICA8PCBnZXRTdHJlYW1JZCgpIDw8ICItIiA8PCB0aW1lc3RhbXA7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCB0ZW1wT3V0cHV0RmlsZS5zdHIoKS5jX3N0cigpLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKGlucHV0RnJhbWUuZmlsZUZkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgZmlsZSAlcy4gRXJyb3Igbm8gaXMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgdGVtcE91dHB1dEZpbGUuc3RyKCkuY19zdHIoKSwgZXJybm8pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5tdXhlciA9IG5ldyBNZWRpYU11eGVyKGlucHV0RnJhbWUuZmlsZUZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgIGlmIChpbnB1dEZyYW1lLm11eGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIE1lZGlhTXV4ZXIgZm9yIGZpbGUgZmQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5wdXRGcmFtZS5maWxlRmQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoaW5wdXRGcmFtZS5vcmllbnRhdGlvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXRPcmllbnRhdGlvbkhpbnQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIFNldCBlbmNvZGVyIHF1YWxpdHkKKyAgICB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBxdWFsaXR5UGFyYW1zID0gbmV3IEFNZXNzYWdlOworICAgICAgICBxdWFsaXR5UGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsIGlucHV0RnJhbWUucXVhbGl0eSk7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+c2V0UGFyYW1ldGVycyhxdWFsaXR5UGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHF1YWxpdHk6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNzaXplX3QgdHJhY2tJZCA9IGlucHV0RnJhbWUubXV4ZXItPmFkZFRyYWNrKG1Gb3JtYXQpOworICAgIGlmICh0cmFja0lkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGRUcmFjayB0byB0aGUgbXV4ZXI6ICV6ZCIsIF9fRlVOQ1RJT05fXywgdHJhY2tJZCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlucHV0RnJhbWUudHJhY2tJbmRleCA9IHRyYWNrSWQ7CisgICAgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPSBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgTWVkaWFNdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NBcHBTZWdtZW50KG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc2l6ZV90IGFwcDFTaXplID0gMDsKKyAgICBhdXRvIGFwcFNlZ21lbnRTaXplID0gZmluZEFwcFNlZ21lbnRzU2l6ZShpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5oZWlnaHQsCisgICAgICAgICAgICAmYXBwMVNpemUpOworICAgIEFMT0dWKCIlczogYXBwU2VnbWVudFNpemUgaXMgJXp1LCB3aWR0aCAlZCwgaGVpZ2h0ICVkLCBhcHAxU2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgYXBwU2VnbWVudFNpemUsIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci53aWR0aCwKKyAgICAgICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuaGVpZ2h0LCBhcHAxU2l6ZSk7CisgICAgaWYgKGFwcFNlZ21lbnRTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBKUEVHIEFQUCBzZWdtZW50IHNpemUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZlV0aWxzPiBleGlmVXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgYXV0byBleGlmUmVzID0gZXhpZlV0aWxzLT5pbml0aWFsaXplKGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhLCBhcHAxU2l6ZSk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgRXhpZlV0aWxzIG9iamVjdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5zZXRGcm9tTWV0YWRhdGEoKmlucHV0RnJhbWUucmVzdWx0LCBtU3RhdGljSW5mbywKKyAgICAgICAgICAgIG1PdXRwdXRXaWR0aCwgbU91dHB1dEhlaWdodCk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBFeGlmIHRhZ3MgdXNpbmcgbWV0YWRhdGEgYW5kIG1haW4gaW1hZ2Ugc2l6ZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5zZXRPcmllbnRhdGlvbihpbnB1dEZyYW1lLm9yaWVudGF0aW9uKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFeGlmVXRpbHMgZmFpbGVkIHRvIHNldCBvcmllbnRhdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPmdlbmVyYXRlQXBwMSgpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEV4aWZVdGlscyBmYWlsZWQgdG8gZ2VuZXJhdGUgQVBQMSBzZWdtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQgbmV3QXBwMUxlbmd0aCA9IGV4aWZVdGlscy0+Z2V0QXBwMUxlbmd0aCgpOworICAgIGNvbnN0IHVpbnQ4X3QgKm5ld0FwcDFTZWdtZW50ID0gZXhpZlV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisKKyAgICAvL0Fzc2VtYmxlIHRoZSBBUFAxIG1hcmtlciBidWZmZXIgcmVxdWlyZWQgYnkgTWVkaWFDb2RlYworICAgIHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweEZGLCAweEUxLCAweDAwLCAweDAwfTsKKyAgICBrRXhpZkFwcDFNYXJrZXJbNl0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihuZXdBcHAxTGVuZ3RoID4+IDgpOworICAgIGtFeGlmQXBwMU1hcmtlcls3XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG5ld0FwcDFMZW5ndGggJiAweEZGKTsKKyAgICBzaXplX3QgYXBwU2VnbWVudEJ1ZmZlclNpemUgPSBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArCisgICAgICAgICAgICBhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplICsgbmV3QXBwMUxlbmd0aDsKKyAgICB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyID0gbmV3IHVpbnQ4X3RbYXBwU2VnbWVudEJ1ZmZlclNpemVdOworICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyLCBrRXhpZkFwcDFNYXJrZXIsIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpKTsKKyAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpLCBuZXdBcHAxU2VnbWVudCwgbmV3QXBwMUxlbmd0aCk7CisgICAgaWYgKGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUgPiAwKSB7CisgICAgICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyBuZXdBcHAxTGVuZ3RoLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICsgYXBwMVNpemUsIGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihhcHBTZWdtZW50QnVmZmVyLCBhcHBTZWdtZW50QnVmZmVyU2l6ZSk7CisgICAgYXV0byByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT53cml0ZVNhbXBsZURhdGEoYUJ1ZmZlciwgaW5wdXRGcmFtZS50cmFja0luZGV4LAorICAgICAgICAgICAgdGltZXN0YW1wLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19NVVhFUl9EQVRBKTsKKyAgICBkZWxldGVbXSBhcHBTZWdtZW50QnVmZmVyOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBKUEVHIEFQUCBzZWdtZW50cyB0byBtdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NDb2RlY0lucHV0RnJhbWUoSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIGZvciAoYXV0byYgaW5wdXRCdWZmZXIgOiBpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzKSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgYXV0byByZXMgPSBtQ29kZWMtPmdldElucHV0QnVmZmVyKGlucHV0QnVmZmVyLmluZGV4LCAmYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBnZXR0aW5nIGNvZGVjIGlucHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBvbmUgdGlsZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KKyAgICAgICAgc2l6ZV90IHRpbGVYID0gaW5wdXRCdWZmZXIudGlsZUluZGV4ICUgbUdyaWRDb2xzOworICAgICAgICBzaXplX3QgdGlsZVkgPSBpbnB1dEJ1ZmZlci50aWxlSW5kZXggLyBtR3JpZENvbHM7CisgICAgICAgIHNpemVfdCB0b3AgPSBtR3JpZEhlaWdodCAqIHRpbGVZOworICAgICAgICBzaXplX3QgbGVmdCA9IG1HcmlkV2lkdGggKiB0aWxlWDsKKyAgICAgICAgc2l6ZV90IHdpZHRoID0gKHRpbGVYID09IHN0YXRpY19jYXN0PHNpemVfdD4obUdyaWRDb2xzKSAtIDEpID8KKyAgICAgICAgICAgICAgICBtT3V0cHV0V2lkdGggLSB0aWxlWCAqIG1HcmlkV2lkdGggOiBtR3JpZFdpZHRoOworICAgICAgICBzaXplX3QgaGVpZ2h0ID0gKHRpbGVZID09IHN0YXRpY19jYXN0PHNpemVfdD4obUdyaWRSb3dzKSAtIDEpID8KKyAgICAgICAgICAgICAgICBtT3V0cHV0SGVpZ2h0IC0gdGlsZVkgKiBtR3JpZEhlaWdodCA6IG1HcmlkSGVpZ2h0OworICAgICAgICBBTE9HVigiJXM6IGlucHV0QnVmZmVyIHRpbGVJbmRleCBbJXp1LCAlenVdLCB0b3AgJXp1LCBsZWZ0ICV6dSwgd2lkdGggJXp1LCBoZWlnaHQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbGVYLCB0aWxlWSwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICByZXMgPSBjb3B5T25lWXV2VGlsZShidWZmZXIsIGlucHV0RnJhbWUueXV2QnVmZmVyLCB0b3AsIGxlZnQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb3B5IFlVViB0aWxlICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlci5pbmRleCwgMCwgYnVmZmVyLT5jYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLnRpbWVVcywgMCwgbnVsbHB0ciAvKmVycm9yRGV0YWlsTXNnKi8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWV1ZUlucHV0QnVmZmVyIHRvIENvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzT25lQ29kZWNPdXRwdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcihpdC0+aW5kZXgsICZidWZmZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBnZXR0aW5nIEhlaWMgY29kZWMgb3V0cHV0IGJ1ZmZlciBhdCBpbmRleCAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhlaWMgY29kZWMgb3V0cHV0IGJ1ZmZlciBhdCBpbmRleCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPndyaXRlU2FtcGxlRGF0YSgKKyAgICAgICAgICAgIGFCdWZmZXIsIGlucHV0RnJhbWUudHJhY2tJbmRleCwgdGltZXN0YW1wLCAwIC8qZmxhZ3MqLyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBidWZmZXIgaW5kZXggJWQgdG8gbXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaXQtPmluZGV4KTsKKyAgICBpZiAoaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IENvZGVjIGdlbmVyYXRlZCBtb3JlIHRpbGVzIHRoYW4gZXhwZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcy0tOworICAgIH0KKworICAgIGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBpbnB1dEZyYW1lLm11eGVyLT5zdG9wKCk7CisKKyAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIG1lbW9yeS4KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oaW5wdXRGcmFtZS5hbmIpOworICAgIHZvaWQqIGRzdEJ1ZmZlcjsKKyAgICBhdXRvIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgaW5wdXRGcmFtZS5mZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBvZmZfdCBmU2l6ZSA9IGxzZWVrKGlucHV0RnJhbWUuZmlsZUZkLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oZlNpemUpID4gbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IE1lZGlhTXV4ZXIgb3V0cHV0IHNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplciAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZlNpemUsIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbHNlZWsoaW5wdXRGcmFtZS5maWxlRmQsIDAsIFNFRUtfU0VUKTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IHJlYWQoaW5wdXRGcmFtZS5maWxlRmQsIGRzdEJ1ZmZlciwgZlNpemUpOworICAgIGlmIChieXRlc1JlYWQgPCBmU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IE9ubHkgJXpkIG9mICVsZCBieXRlcyByZWFkIiwgX19GVU5DVElPTl9fLCBieXRlc1JlYWQsIGZTaXplKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjbG9zZShpbnB1dEZyYW1lLmZpbGVGZCk7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSAtMTsKKworICAgIC8vIEZpbGwgaW4gSEVJQyBoZWFkZXIKKyAgICB1aW50OF90ICpoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZHN0QnVmZmVyKSArIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKTsKKyAgICBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYkhlYWRlciA9IChzdHJ1Y3QgQ2FtZXJhQmxvYiAqKWhlYWRlcjsKKyAgICAvLyBNdXN0IGJlIGluIHN5bmMgd2l0aCBDQU1FUkEzX0hFSUNfQkxPQl9JRCBpbiBhbmRyb2lkX21lZGlhX1V0aWxzLmNwcAorICAgIGJsb2JIZWFkZXItPmJsb2JJZCA9IHN0YXRpY19jYXN0PENhbWVyYUJsb2JJZD4oMHgwMEZFKTsKKyAgICBibG9iSGVhZGVyLT5ibG9iU2l6ZSA9IGZTaXplOworCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU91dHB1dFN1cmZhY2UuZ2V0KCksIHRpbWVzdGFtcCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXRTdHJlYW1JZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXVlQnVmZmVyIHRvIEhlaWMgc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnB1dEZyYW1lLmFuYiA9IG51bGxwdHI7CisKKyAgICBBVFJBQ0VfQVNZTkNfRU5EKCJIRUlDIGNhcHR1cmUiLCBpbnB1dEZyYW1lLmZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pIHsKKyAgICBpZiAoaW5wdXRGcmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKCFpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIEFMT0dWKCIlczogcmVsZWFzZU91dHB1dEJ1ZmZlciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4KTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGl0LT5pbmRleCk7CisgICAgICAgIGlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPnl1dkJ1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+eXV2QnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+eXV2QnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIWlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IGlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0RnJhbWUtPmVycm9yIHx8IG1FcnJvclN0YXRlKSAmJiAhaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCkgeworICAgICAgICBub3RpZnlFcnJvcihpbnB1dEZyYW1lLT5mcmFtZU51bWJlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5maWxlRmQgPj0gMCkgeworICAgICAgICBjbG9zZShpbnB1dEZyYW1lLT5maWxlRmQpOworICAgICAgICBpbnB1dEZyYW1lLT5maWxlRmQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+YW5iICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLT5hbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIGlucHV0RnJhbWUtPmFuYiA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcykgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA8PSBjdXJyZW50VHMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbml0aWFsaXplQ29kZWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBib29sIHVzZUdyaWQgPSBmYWxzZTsKKyAgICBBU3RyaW5nIGhldmNOYW1lOworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkID0gaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2Rlcih3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgJm1Vc2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0ciwgJmhldmNOYW1lKTsKKyAgICBpZiAoIWlzU2l6ZVN1cHBvcnRlZCkgeworICAgICAgICBBTE9HRSgiJXM6IEVuY29kZXIgZG9lc250JyBzdXBwb3J0IHNpemUgJXUgeCAldSEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIExvb3BlciBmb3IgTWVkaWFDb2RlYy4KKyAgICBhdXRvIGRlc2lyZWRNaW1lID0gbVVzZUhlaWMgPyBNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgOiBNSU1FVFlQRV9WSURFT19IRVZDOworICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLU1lZGlhQ29kZWNMb29wZXIiKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWNMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICBmYWxzZSwgICAgLy8gY2FuQ2FsbEphdmEKKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IGNvZGVjIGxvb3BlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIEhFSUMvSEVWQyBjb2RlYy4KKyAgICBpZiAobVVzZUhlaWMpIHsKKyAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1Db2RlY0xvb3BlciwgZGVzaXJlZE1pbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtQ29kZWNMb29wZXIsIGhldmNOYW1lKTsKKyAgICB9CisgICAgaWYgKG1Db2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGRlc2lyZWRNaW1lKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIExvb3BlciBhbmQgaGFuZGxlciBmb3IgQ29kZWMgY2FsbGJhY2suCisgICAgbUNvZGVjQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIGlmIChtQ29kZWNDYWxsYmFja0hhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgY2FsbGJhY2sgaGFuZGxlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1DYWxsYmFja0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYWxsYmFja0xvb3Blci0+c2V0TmFtZSgiQ2FtZXJhMy1IZWljQ29tcG9zaXRlLU1lZGlhQ29kZWNDYWxsYmFja0xvb3BlciIpOworICAgIHJlcyA9IG1DYWxsYmFja0xvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAgICAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgbWVkaWEgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbUNhbGxiYWNrTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjQ2FsbGJhY2tIYW5kbGVyKTsKKworICAgIG1Bc3luY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENhbGxiYWNrTm90aWZ5LCBtQ29kZWNDYWxsYmFja0hhbmRsZXIpOworICAgIHJlcyA9IG1Db2RlYy0+c2V0Q2FsbGJhY2sobUFzeW5jTm90aWZ5KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBNZWRpYUNvZGVjIGNhbGxiYWNrOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIENyZWF0ZSBvdXRwdXQgZm9ybWF0IGFuZCBjb25maWd1cmUgdGhlIENvZGVjLgorICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldFN0cmluZyhLRVlfTUlNRSwgZGVzaXJlZE1pbWUpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0JJVFJBVEVfTU9ERSwgQklUUkFURV9NT0RFX0NRKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9RVUFMSVRZLCBrRGVmYXVsdEpwZWdRdWFsaXR5KTsKKyAgICAvLyBBc2sgY29kZWMgdG8gc2tpcCB0aW1lc3RhbXAgY2hlY2sgYW5kIGVuY29kZSBhbGwgZnJhbWVzLgorICAgIG91dHB1dEZvcm1hdC0+c2V0SW50NjQoS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVIsIGtOb0ZyYW1lRHJvcE1heFB0c0dhcCk7CisKKyAgICBpbnQzMl90IGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgIGlmICh1c2VHcmlkIHx8IG1Vc2VIZWljKSB7CisgICAgICAgIGdyaWRXaWR0aCA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkV2lkdGg7CisgICAgICAgIGdyaWRIZWlnaHQgPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZEhlaWdodDsKKyAgICAgICAgZ3JpZFJvd3MgPSAoaGVpZ2h0ICsgZ3JpZEhlaWdodCAtIDEpL2dyaWRIZWlnaHQ7CisgICAgICAgIGdyaWRDb2xzID0gKHdpZHRoICsgZ3JpZFdpZHRoIC0gMSkvZ3JpZFdpZHRoOworCisgICAgICAgIGlmIChtVXNlSGVpYykgeworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9XSURUSCwgZ3JpZFdpZHRoKTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfSEVJR0hULCBncmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgZ3JpZENvbHMpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9ST1dTLCBncmlkUm93cyk7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGdyaWRXaWR0aCA9IHdpZHRoOworICAgICAgICBncmlkSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBncmlkUm93cyA9IDE7CisgICAgICAgIGdyaWRDb2xzID0gMTsKKyAgICB9CisKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwgIXVzZUdyaWQgPyB3aWR0aCA6IGdyaWRXaWR0aCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCAhdXNlR3JpZCA/IGhlaWdodCA6IGdyaWRIZWlnaHQpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0lfRlJBTUVfSU5URVJWQUwsIDApOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgIHVzZUdyaWQgPyBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA6IENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0ZSQU1FX1JBVEUsIGdyaWRSb3dzICogZ3JpZENvbHMpOworICAgIC8vIFRoaXMgb25seSBzZXJ2ZXMgYXMgYSBoaW50IHRvIGVuY29kZXIgd2hlbiBlbmNvZGluZyBpcyBub3QgcmVhbC10aW1lLgorICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX09QRVJBVElOR19SQVRFLCB1c2VHcmlkID8ga0dyaWRPcFJhdGUgOiBrTm9HcmlkT3BSYXRlKTsKKworICAgIHJlcyA9IG1Db2RlYy0+Y29uZmlndXJlKG91dHB1dEZvcm1hdCwgbnVsbHB0ciAvKm5hdGl2ZVdpbmRvdyovLAorICAgICAgICAgICAgbnVsbHB0ciAvKmNyeXB0byovLCBDT05GSUdVUkVfRkxBR19FTkNPREUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIGNvZGVjOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1HcmlkV2lkdGggPSBncmlkV2lkdGg7CisgICAgbUdyaWRIZWlnaHQgPSBncmlkSGVpZ2h0OworICAgIG1HcmlkUm93cyA9IGdyaWRSb3dzOworICAgIG1HcmlkQ29scyA9IGdyaWRDb2xzOworICAgIG1Vc2VHcmlkID0gdXNlR3JpZDsKKyAgICBtT3V0cHV0V2lkdGggPSB3aWR0aDsKKyAgICBtT3V0cHV0SGVpZ2h0ID0gaGVpZ2h0OworICAgIG1BcHBTZWdtZW50TWF4U2l6ZSA9IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjYW1lcmFEZXZpY2UtPmluZm8oKSk7CisgICAgbU1heEhlaWNCdWZmZXJTaXplID0gbU91dHB1dFdpZHRoICogbU91dHB1dEhlaWdodCAqIDMgLyAyICsgbUFwcFNlZ21lbnRNYXhTaXplOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OmRlaW5pdENvZGVjKCkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKG1Db2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db2RlYy0+c3RvcCgpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0xvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db2RlY0xvb3Blci0+c3RvcCgpOworICAgICAgICBtQ29kZWNMb29wZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbGxiYWNrTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1DYWxsYmFja0xvb3Blci5jbGVhcigpOworICAgIH0KKworICAgIG1Bc3luY05vdGlmeS5jbGVhcigpOworICAgIG1Gb3JtYXQuY2xlYXIoKTsKK30KKworLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFwcCBzZWdtZW50LCAwIGluZGljYXRlcyBmYWlsdXJlCitzaXplX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZmluZEFwcFNlZ21lbnRzU2l6ZShjb25zdCB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyLAorICAgICAgICBzaXplX3QgbWF4U2l6ZSwgc2l6ZV90ICphcHAxU2VnbWVudFNpemUpIHsKKyAgICBpZiAoYXBwU2VnbWVudEJ1ZmZlciA9PSBudWxscHRyIHx8IGFwcDFTZWdtZW50U2l6ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dCBhcHBTZWdtZW50QnVmZmVyICVwLCBhcHAxU2VnbWVudFNpemUgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYXBwU2VnbWVudEJ1ZmZlciwgYXBwMVNlZ21lbnRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IDA7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEVYSUYgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICBjb25zdCB1aW50OF90ICpoZWFkZXIgPSBhcHBTZWdtZW50QnVmZmVyICsgKG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKTsKKyAgICBjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYiA9IChjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiopKGhlYWRlcik7CisgICAgaWYgKGJsb2ItPmJsb2JJZCAhPSBDYW1lcmFCbG9iSWQ6OkpQRUdfQVBQX1NFR01FTlRTKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBFWElGIGJsb2JJZCAlaHUiLCBfX0ZVTkNUSU9OX18sIGJsb2ItPmJsb2JJZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGV4cGVjdGVkU2l6ZSA9IGJsb2ItPmJsb2JTaXplOworICAgIGlmIChleHBlY3RlZFNpemUgPT0gMCB8fCBleHBlY3RlZFNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgYmxvYlNpemUgJXp1LiIsIF9fRlVOQ1RJT05fXywgZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgdG90YWxTaXplID0gMDsKKworICAgIC8vIFZlcmlmeSBBUFAxIG1hcmtlciAobWFuZGF0b3J5KQorICAgIHVpbnQ4X3QgYXBwMU1hcmtlcltdID0gezB4RkYsIDB4RTF9OworICAgIGlmIChtZW1jbXAoYXBwU2VnbWVudEJ1ZmZlciwgYXBwMU1hcmtlciwgc2l6ZW9mKGFwcDFNYXJrZXIpKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgQVBQMSBtYXJrZXI6ICV4LCAleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyWzBdLCBhcHBTZWdtZW50QnVmZmVyWzFdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRvdGFsU2l6ZSArPSBzaXplb2YoYXBwMU1hcmtlcik7CisKKyAgICB1aW50MTZfdCBhcHAxU2l6ZSA9IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdKSA8PCA4KSArCisgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXTsKKyAgICB0b3RhbFNpemUgKz0gYXBwMVNpemU7CisKKyAgICBBTE9HVigiJXM6IEV4cGVjdGVkIEFQUCBzZWdtZW50cyBzaXplICV6dSwgQVBQMSBzZWdtZW50IHNpemUgJXUiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUsIGFwcDFTaXplKTsKKyAgICB3aGlsZSAodG90YWxTaXplIDwgZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIGlmIChhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0gIT0gMHhGRiB8fAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdIDw9IDB4RTEgfHwKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSA+IDB4RUYpIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgQVBQbiBtYXJrZXIKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBBUFBuIG1hcmtlcjogJXgsICV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0sIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHRvdGFsU2l6ZSArPSAyOworCisgICAgICAgIHVpbnQxNl90IGFwcG5TaXplID0gKHN0YXRpY19jYXN0PHVpbnQxNl90PihhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXTsKKyAgICAgICAgdG90YWxTaXplICs9IGFwcG5TaXplOworICAgIH0KKworICAgIGlmICh0b3RhbFNpemUgIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBKUEVHIEFQUCBzZWdtZW50czogdG90YWxTaXplICV1IHZzIGV4cGVjdGVkIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRvdGFsU2l6ZSwgZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKmFwcDFTZWdtZW50U2l6ZSA9IGFwcDFTaXplICsgc2l6ZW9mKGFwcDFNYXJrZXIpOworICAgIHJldHVybiBleHBlY3RlZFNpemU7Cit9CisKK2ludDY0X3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZmluZFRpbWVzdGFtcEluTnNMb2NrZWQoaW50NjRfdCB0aW1lSW5VcykgeworICAgIGZvciAoY29uc3QgYXV0byYgZm4gOiBtRnJhbWVOdW1iZXJNYXApIHsKKyAgICAgICAgaWYgKHRpbWVJblVzID09IG5zMnVzKGZuLnNlY29uZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmbi5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAodGltZUluVXMgPT0gbnMydXMoaW5wdXRGcmFtZS5maXJzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dEZyYW1lLmZpcnN0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29weU9uZVl1dlRpbGUoc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGNvZGVjQnVmZmVyLAorICAgICAgICBjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyJiB5dXZCdWZmZXIsCisgICAgICAgIHNpemVfdCB0b3AsIHNpemVfdCBsZWZ0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgLy8gR2V0IHN0cmlkZSBpbmZvcm1hdGlvbiBmb3IgY29kZWNCdWZmZXIKKyAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgaWYgKCFjb2RlY0J1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb2RlYyBpbnB1dCBidWZmZXIgaXMgbm90IGZvciBpbWFnZSBkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChpbWFnZURhdGEtPnNpemUoKSAhPSBzaXplb2YoTWVkaWFJbWFnZTIpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb2RlYyBpbnB1dCBpbWFnZSBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGltYWdlRGF0YS0+c2l6ZSgpLCBzaXplb2YoTWVkaWFJbWFnZTIpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTWVkaWFJbWFnZTIqIGltYWdlSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFJbWFnZTIqPihpbWFnZURhdGEtPmRhdGEoKSk7CisgICAgaWYgKGltYWdlSW5mby0+bVR5cGUgIT0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWIHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aCAhPSA4IHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aEFsbG9jYXRlZCAhPSA4IHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1OdW1QbGFuZXMgIT0gMykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29kZWMgaW5wdXQgaW1hZ2UgaW5mbzogbVR5cGUgJWQsIG1CaXREZXB0aCAlZCwgIgorICAgICAgICAgICAgICAgICJtQml0RGVwdGhBbGxvY2F0ZWQgJWQsIG1OdW1QbGFuZXMgJWQhIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVR5cGUsIGltYWdlSW5mby0+bUJpdERlcHRoLAorICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoQWxsb2NhdGVkLCBpbWFnZUluZm8tPm1OdW1QbGFuZXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCIlczogeXV2QnVmZmVyIGNocm9tYVN0ZXAgJWQsIGNocm9tYVN0cmlkZSAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHl1dkJ1ZmZlci5jaHJvbWFTdGVwLCB5dXZCdWZmZXIuY2hyb21hU3RyaWRlKTsKKyAgICBBTE9HVigiJXM6IFUgb2Zmc2V0ICV1LCBWIG9mZnNldCAldSwgVSByb3dJbmMgJWQsIFYgcm93SW5jICVkLCBVIGNvbEluYyAlZCwgViBjb2xJbmMgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0LAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMpOworCisgICAgLy8gWQorICAgIGZvciAoYXV0byByb3cgPSB0b3A7IHJvdyA8IHRvcCtoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6WV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldLm1Sb3dJbmMgKiAocm93IC0gdG9wKTsKKyAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YStyb3cqeXV2QnVmZmVyLnN0cmlkZStsZWZ0LCBkc3QsIHdpZHRoKTsKKyAgICB9CisKKyAgICAvLyBVIGlzIENiLCBWIGlzIENyCisgICAgYm9vbCBjb2RlY1VQbGFuZUZpcnN0ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgPgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQ7CisgICAgdWludDMyX3QgY29kZWNVdk9mZnNldERpZmYgPSBjb2RlY1VQbGFuZUZpcnN0ID8KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0IC0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgOgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgLSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldDsKKyAgICBib29sIGlzQ29kZWNVdlNlbWlwbGFubmFyID0gKGNvZGVjVXZPZmZzZXREaWZmID09IDEpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgPT0KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jID09IDIpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgPT0gMik7CisgICAgYm9vbCBpc0NvZGVjVXZQbGFubmFyID0KKyAgICAgICAgICAgICgoY29kZWNVUGxhbmVGaXJzdCAmJiBjb2RlY1V2T2Zmc2V0RGlmZiA+PQorICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIGltYWdlSW5mby0+bUhlaWdodC8yKSB8fAorICAgICAgICAgICAgKCghY29kZWNVUGxhbmVGaXJzdCAmJiBjb2RlY1V2T2Zmc2V0RGlmZiA+PQorICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIGltYWdlSW5mby0+bUhlaWdodC8yKSkpICYmCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyA9PSAxICYmCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyA9PSAxOworICAgIGJvb2wgY2FtZXJhVVBsYW5lRmlyc3QgPSB5dXZCdWZmZXIuZGF0YUNyID4geXV2QnVmZmVyLmRhdGFDYjsKKworICAgIGlmIChpc0NvZGVjVXZTZW1pcGxhbm5hciAmJiB5dXZCdWZmZXIuY2hyb21hU3RlcCA9PSAyICYmCisgICAgICAgICAgICAoY29kZWNVUGxhbmVGaXJzdCA9PSBjYW1lcmFVUGxhbmVGaXJzdCkpIHsKKyAgICAgICAgLy8gVVYgc2VtaXBsYW5uYXIKKyAgICAgICAgLy8gVGhlIGNocm9tZSBwbGFuZSBjb3VsZCBiZSBlaXRoZXIgQ2IgZmlyc3QsIG9yIENyIGZpcnN0LiBUYWtlIHRoZQorICAgICAgICAvLyBzbWFsbGVyIGFkZHJlc3MuCisgICAgICAgIHVpbnQ4X3QgKnNyYyA9IHN0ZDo6bWluKHl1dkJ1ZmZlci5kYXRhQ2IsIHl1dkJ1ZmZlci5kYXRhQ3IpOworICAgICAgICBNZWRpYUltYWdlMjo6UGxhbmVJbmRleCBkc3RQbGFuZSA9IGNvZGVjVXZPZmZzZXREaWZmID4gMCA/IE1lZGlhSW1hZ2UyOjpVIDogTWVkaWFJbWFnZTI6OlY7CisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbZHN0UGxhbmVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtkc3RQbGFuZV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHNyYytyb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LCBkc3QsIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNDb2RlY1V2UGxhbm5hciAmJiB5dXZCdWZmZXIuY2hyb21hU3RlcCA9PSAxKSB7CisgICAgICAgIC8vIFUgcGxhbmUKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGFDYityb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LzIsIGRzdCwgd2lkdGgvMik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWIHBsYW5lCisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhQ3Ircm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdC8yLCBkc3QsIHdpZHRoLzIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIHNlbWlwbGFubmFyIGFuZCBwbGFubmFyLCBvciB3aGVuIFVWIG9yZGVycyBhcmUKKyAgICAgICAgLy8gZGlmZmVyZW50LgorICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpOworICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbCA9IGxlZnQvMjsgY29sIDwgKGxlZnQrd2lkdGgpLzI7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgLy8gVS9DYgorICAgICAgICAgICAgICAgIGludDMyX3QgZHN0SW5kZXggPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMikgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgKiAoY29sIC0gbGVmdC8yKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNyY0luZGV4ID0gcm93ICogeXV2QnVmZmVyLmNocm9tYVN0cmlkZSArIHl1dkJ1ZmZlci5jaHJvbWFTdGVwICogY29sOworICAgICAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSB5dXZCdWZmZXIuZGF0YUNiW3NyY0luZGV4XTsKKworICAgICAgICAgICAgICAgIC8vIFYvQ3IKKyAgICAgICAgICAgICAgICBkc3RJbmRleCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyAqIChjb2wgLSBsZWZ0LzIpOworICAgICAgICAgICAgICAgIHNyY0luZGV4ID0gcm93ICogeXV2QnVmZmVyLmNocm9tYVN0cmlkZSArIHl1dkJ1ZmZlci5jaHJvbWFTdGVwICogY29sOworICAgICAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSB5dXZCdWZmZXIuZGF0YUNyW3NyY0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aW5pdENvcHlSb3dGdW5jdGlvbihpbnQzMl90IHdpZHRoKQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBsaWJ5dXY7CisKKyAgICBtRm5Db3B5Um93ID0gQ29weVJvd19DOworI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfU1NFMikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc1NTRTIpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCAzMikgPyBDb3B5Um93X1NTRTIgOiBDb3B5Um93X0FueV9TU0UyOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfQVZYKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzQVZYKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgNjQpID8gQ29weVJvd19BVlggOiBDb3B5Um93X0FueV9BVlg7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19FUk1TKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzRVJNUykpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfRVJNUzsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX05FT04pCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNORU9OKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgMzIpID8gQ29weVJvd19ORU9OIDogQ29weVJvd19BbnlfTkVPTjsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX01JUFMpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNNSVBTKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gQ29weVJvd19NSVBTOworICAgIH0KKyNlbmRpZgorfQorCitzaXplX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y2FsY0FwcFNlZ21lbnRNYXhTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBpbmZvLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UKTsKKyAgICBzaXplX3QgbWF4QXBwc1NlZ21lbnQgPSAxOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgbWF4QXBwc1NlZ21lbnQgPSBlbnRyeS5kYXRhLnU4WzBdIDwgMSA/IDEgOgorICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPiAxNiA/IDE2IDogZW50cnkuZGF0YS51OFswXTsKKyAgICB9CisgICAgcmV0dXJuIG1heEFwcHNTZWdtZW50ICogKDIgKyAweEZGRkYpICsgc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjp0aHJlYWRMb29wKCkgeworICAgIGludDY0X3QgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGxhbmRlZCBpbiBlcnJvciBzdGF0ZSwgcmV0dXJuIGFueSBwZW5kaW5nIGJ1ZmZlcnMgYW5kCisgICAgICAgICAgICAvLyBoYWx0IGFsbCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgd2hpbGUgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSBnZXROZXh0UmVhZHlJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKworICAgICAgICAgICAgaWYgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGF1dG8gZmFpbGluZ0ZyYW1lTnVtYmVyID0gZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGluZ0ZyYW1lTnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGVyYXNlICdtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcworICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgdHdvIGludGVybmFsIHN0cmVhbSBidWZmZXJzIHRvIGZhaWwuIEluIHN1Y2ggc2NlbmFyaW8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvc2l0ZSBzdHJlYW0gc2hvdWxkIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IGEgc3RyZWFtIGJ1ZmZlciBlcnJvciBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCB3aXRoaW4gJ2Vycm9yTm90aWZpZWQnLgorICAgICAgICAgICAgICAgICAgICAvLyBBbnkgcHJlc2VudCBmYWlsZWQgaW5wdXQgZnJhbWVzIHdpbGwgYmUgcmVtb3ZlZCBvbiBhIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICAgICAgICAgICAgICAgICAvLyAncmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKCknLgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF1dG8gcmV0ID0gbUlucHV0UmVhZHlDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1NdXRleCwga1dhaXREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lZCB3YWl0IG9uIGNvbmRpdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IHByb2Nlc3NJbnB1dEZyYW1lKGN1cnJlbnRUcywgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcHJvY2Vzc2luZyBmcmFtZSB3aXRoIHRpbWVzdGFtcDogJSIgUFJJdTY0ICI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY3VycmVudFRzLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yIHx8CisgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmFwcFNlZ21lbnRXcml0dGVuICYmCisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10ucGVuZGluZ091dHB1dFRpbGVzID09IDApKSB7CisgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgYm9vbCByZXMgPSBmYWxzZTsKKyAgICAvLyBCdWZmZXIgZXJyb3JzIGNvbmNlcm5pbmcgaW50ZXJuYWwgY29tcG9zaXRlIHN0cmVhbXMgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlIHRvCisgICAgLy8gY2FtZXJhIGNsaWVudHMuIFRoZXkgbXVzdCBvbmx5IHJlY2VpdmUgYSBzaW5nbGUgYnVmZmVyIGVycm9yIHdpdGggdGhlIHB1YmxpYyBjb21wb3NpdGUKKyAgICAvLyBzdHJlYW0gaWQuCisgICAgaWYgKChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtQXBwU2VnbWVudFN0cmVhbUlkKSB8fAorICAgICAgICAgICAgKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1NYWluSW1hZ2VTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXMgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAvLyBGb3IgcmVzdWx0IGVycm9yLCBzaW5jZSB0aGUgQVBQU19TRUdNRU5UIGJ1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIEVYSUYsCisgICAgLy8gc2ltcGx5IHNraXAgdXNpbmcgdGhlIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHRvIG92ZXJyaWRlIEVYSUYuCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGludDY0X3QgdGltZXN0YW1wID0gLTE7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbiA6IG1GcmFtZU51bWJlck1hcCkgeworICAgICAgICBpZiAoZm4uZmlyc3QgPT0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSBmbi5zZWNvbmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZXN0YW1wID09IC0xKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lLnNlY29uZC5mcmFtZU51bWJlciA9PSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBpbnB1dEZyYW1lLmZpcnN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHNodXR0ZXIgdGltZXN0YW1wIGZvciByZXN1bHQgZXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYXB0dXJlUmVzdWx0cy5lbXBsYWNlKHRpbWVzdGFtcCwgc3RkOjptYWtlX3R1cGxlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSkpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OkNvZGVjQ2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgcmV0dXJuOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q2FsbGJhY2tOb3RpZnk6IHsKKyAgICAgICAgICAgICBpbnQzMl90IGNiSUQ7CisgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2FsbGJhY2tJRCIsICZjYklEKSkgeworICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRDYWxsYmFja05vdGlmeTogY2FsbGJhY2tJRCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgQUxPR1YoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNiSUQgPSAlZCIsIGNiSUQpOworCisgICAgICAgICAgICAgc3dpdGNoIChjYklEKSB7CisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfSU5QVVRfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0lOUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgib2Zmc2V0IiwgJm9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogb2Zmc2V0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHNpemUgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiB0aW1lVXMgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogZmxhZ3MgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIENvZGVjT3V0cHV0QnVmZmVySW5mbyBidWZmZXJJbmZvID0geworICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZmxhZ3N9OworCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKGJ1ZmZlckluZm8pOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDogeworICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiBmb3JtYXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljRm9ybWF0Q2hhbmdlZChmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0VSUk9SOiB7CisgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGRldGFpbDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBlcnIgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhY3Rpb24iLCAmYWN0aW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGFjdGlvbiBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZmluZFN0cmluZygiZGV0YWlsIiwgJmRldGFpbCk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyb3IoMHgleCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljQ29kZWNFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRDYWxsYmFja05vdGlmeTogY2FsbGJhY2tJRCglZCkgaXMgdW5leHBlY3RlZC4iLCBjYklEKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzaG91bGRuJ3QgYmUgaGVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYzY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIEhlaWNDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgQ29tcG9zaXRlU3RyZWFtLCBwdWJsaWMgVGhyZWFkLAorICAgICAgICBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgeworcHVibGljOgorICAgIEhlaWNDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKTsKKyAgICB+SGVpY0NvbXBvc2l0ZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1NYWluSW1hZ2VTdHJlYW1JZDsgfQorCisgICAgLy8gVXNlIG9uU2h1dHRlciB0byBrZWVwIHRyYWNrIG9mIGZyYW1lIG51bWJlciA8LT4gdGltZXN0YW1wIG1hcHBpbmcuCisgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOworICAgIHZvaWQgb25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKKyAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybiBzdHJlYW0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIGNhbWVyYSBzdHJlYW1zCisgICAgc3RhdGljIHN0YXR1c190IGdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKTsKKworICAgIHN0YXRpYyBib29sIGlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCwgQVN0cmluZyogaGV2Y05hbWUgPSBudWxscHRyKTsKKyAgICBzdGF0aWMgYm9vbCBpc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKTsKK3Byb3RlY3RlZDoKKworICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworICAgIGJvb2wgb25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8vCisgICAgLy8gSEVJQy9IRVZDIENvZGVjIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMsIGFuZCBjYWxsYmFja3MKKyAgICAvLworICAgIHN0cnVjdCBDb2RlY091dHB1dEJ1ZmZlckluZm8geworICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgfTsKKworICAgIHN0cnVjdCBDb2RlY0lucHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBzaXplX3QgdGlsZUluZGV4OworICAgIH07CisKKyAgICBjbGFzcyBDb2RlY0NhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDb2RlY0NhbGxiYWNrSGFuZGxlcih3cDxIZWljQ29tcG9zaXRlU3RyZWFtPiBwYXJlbnQpIHsKKyAgICAgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxIZWljQ29tcG9zaXRlU3RyZWFtPiBtUGFyZW50OworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDYWxsYmFja05vdGlmeSwKKyAgICB9OworCisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUhlaWM7CisgICAgc3A8TWVkaWFDb2RlYz4gICAgbUNvZGVjOworICAgIHNwPEFMb29wZXI+ICAgICAgIG1Db2RlY0xvb3BlciwgbUNhbGxiYWNrTG9vcGVyOworICAgIHNwPENvZGVjQ2FsbGJhY2tIYW5kbGVyPiBtQ29kZWNDYWxsYmFja0hhbmRsZXI7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUFzeW5jTm90aWZ5OworICAgIHNwPEFNZXNzYWdlPiAgICAgIG1Gb3JtYXQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU51bU91dHB1dFRpbGVzOworCisgICAgaW50MzJfdCAgICAgICAgICAgbU91dHB1dFdpZHRoLCBtT3V0cHV0SGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1NYXhIZWljQnVmZmVyU2l6ZTsKKyAgICBpbnQzMl90ICAgICAgICAgICBtR3JpZFdpZHRoLCBtR3JpZEhlaWdodDsKKyAgICBzaXplX3QgICAgICAgICAgICBtR3JpZFJvd3MsIG1HcmlkQ29sczsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlR3JpZDsgLy8gV2hldGhlciB0byB1c2UgZnJhbWV3b3JrIFlVViBmcmFtZSB0aWxpbmcuCisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTm9GcmFtZURyb3BNYXhQdHNHYXAgPSAtMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTm9HcmlkT3BSYXRlID0gMzA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0dyaWRPcFJhdGUgPSAxMjA7CisKKyAgICB2b2lkIG9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKGNvbnN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyYgYnVmZmVySW5mbyk7CisgICAgdm9pZCBvbkhlaWNJbnB1dEZyYW1lQXZhaWxhYmxlKGludDMyX3QgaW5kZXgpOyAgLy8gT25seSBjYWxsZWQgZm9yIFlVViBpbnB1dCBtb2RlLgorICAgIHZvaWQgb25IZWljRm9ybWF0Q2hhbmdlZChzcDxBTWVzc2FnZT4mIG5ld0Zvcm1hdCk7CisgICAgdm9pZCBvbkhlaWNDb2RlY0Vycm9yKCk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplQ29kZWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBjYW1lcmFEZXZpY2UpOworICAgIHZvaWQgZGVpbml0Q29kZWMoKTsKKworICAgIC8vCisgICAgLy8gQ29tcG9zaXRlIHN0cmVhbSByZWxhdGVkIHN0cnVjdHVyZXMsIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjYWxsYmFja3MuCisgICAgLy8KKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb247CisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgcXVhbGl0eTsKKworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gY29kZWNPdXRwdXRCdWZmZXJzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhTWV0YWRhdGE+ICAgIHJlc3VsdDsKKworICAgICAgICAvLyBGaWVsZHMgdGhhdCBhcmUgb25seSBhcHBsaWNhYmxlIHRvIEhFVkMgdGlsaW5nLgorICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyICAgICAgICAgIHl1dkJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNJbnB1dEJ1ZmZlckluZm8+ICBjb2RlY0lucHV0QnVmZmVyczsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm90aWZpZWQ7CisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXI7CisKKyAgICAgICAgc3A8TWVkaWFNdXhlcj4gICAgICAgICAgICBtdXhlcjsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUZkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZpbGVGZDsKKyAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICB0cmFja0luZGV4OworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICAgICAgICphbmI7CisKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBhcHBTZWdtZW50V3JpdHRlbjsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXM7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgY29kZWNJbnB1dENvdW50ZXI7CisKKyAgICAgICAgSW5wdXRGcmFtZSgpIDogb3JpZW50YXRpb24oMCksIHF1YWxpdHkoa0RlZmF1bHRKcGVnUXVhbGl0eSksIGVycm9yKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZChmYWxzZSksIGZyYW1lTnVtYmVyKC0xKSwgZmVuY2VGZCgtMSksIGZpbGVGZCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXgoLTEpLCBhbmIobnVsbHB0ciksIGFwcFNlZ21lbnRXcml0dGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ091dHB1dFRpbGVzKDApLCBjb2RlY0lucHV0Q291bnRlcigwKSB7IH0KKyAgICB9OworCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgLy8gRmluZCBmaXJzdCBjb21wbGV0ZSBhbmQgdmFsaWQgZnJhbWUgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAKKyAgICBib29sIGdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKyAgICAvLyBGaW5kIG5leHQgZmFpbGluZyBmcmFtZSBudW1iZXIgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAgYW5kIHJldHVybiByZXNwZWN0aXZlIGZyYW1lIG51bWJlcgorICAgIGludDY0X3QgZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLyk7CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBzdGFydE11eGVyRm9ySW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0FwcFNlZ21lbnQobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLyk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpOworCisgICAgc2l6ZV90IGZpbmRBcHBTZWdtZW50c1NpemUoY29uc3QgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciwgc2l6ZV90IG1heFNpemUsCisgICAgICAgICAgICBzaXplX3QqIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgaW50NjRfdCBmaW5kVGltZXN0YW1wSW5Oc0xvY2tlZChpbnQ2NF90IHRpbWVJblVzKTsKKyAgICBzdGF0dXNfdCBjb3B5T25lWXV2VGlsZShzcDxNZWRpYUNvZGVjQnVmZmVyPiYgY29kZWNCdWZmZXIsCisgICAgICAgICAgICBjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyJiB5dXZCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgdG9wLCBzaXplX3QgbGVmdCwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGluaXRDb3B5Um93RnVuY3Rpb24oaW50MzJfdCB3aWR0aCk7CisgICAgc3RhdGljIHNpemVfdCBjYWxjQXBwU2VnbWVudE1heFNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0SnBlZ1F1YWxpdHkgPSA5OTsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2Uga0FwcFNlZ21lbnREYXRhU3BhY2UgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrSGVpZkRhdGFTcGFjZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKTsKKworICAgIGludCAgICAgICAgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQsIG1BcHBTZWdtZW50U3VyZmFjZUlkOworICAgIHNwPENwdUNvbnN1bWVyPiAgIG1BcHBTZWdtZW50Q29uc3VtZXI7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlOworICAgIGJvb2wgICAgICAgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbUFwcFNlZ21lbnRNYXhTaXplOworICAgIENhbWVyYU1ldGFkYXRhICAgIG1TdGF0aWNJbmZvOworCisgICAgaW50ICAgICAgICAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkLCBtTWFpbkltYWdlU3VyZmFjZUlkOworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlOworICAgIHNwPENwdUNvbnN1bWVyPiAgIG1NYWluSW1hZ2VDb25zdW1lcjsgLy8gT25seSBhcHBsaWNhYmxlIGZvciBIRVZDIGNvZGVjLgorICAgIGJvb2wgICAgICAgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZDsgLy8gT25seSBhcHBsaWNhYmxlIHRvIEhFVkMgY29kZWMKKworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1PdXRwdXRTdXJmYWNlOworICAgIHNwPFByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisKKyAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXI7CisgICAgLy8gTWFwIGZyb20gdGltZXN0YW1wIHRvIEpQRUcgc2V0dGluZyBvZiBvcmllbnRhdGlvbitxdWFsaXR5CisgICAgc3RkOjptYXA8aW50NjRfdCwgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBtU2V0dGluZ3NCeVRpbWVzdGFtcDsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEFQUCBzZWdtZW50IEJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgSEVJQyBibG9iIGJ1ZmZlciBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxDb2RlY091dHB1dEJ1ZmZlckluZm8+IG1Db2RlY091dHB1dEJ1ZmZlcnM7CisgICAgc3RkOjpxdWV1ZTxpbnQ2NF90PiBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnRlcjsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIFl1diBidWZmZXIgcGVuZGluZyB0aWxpbmcgYW5kIGVuY29kaW5nIChmb3IgSEVWQyBZVVYgdGlsaW5nIG9ubHkpCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0WXV2QnVmZmVyczsKKyAgICAvLyBLZWVwIGFsbCBjb2RlYyBpbnB1dCBidWZmZXJzIHJlYWR5IHRvIGJlIGZpbGxlZCBvdXQgKGZvciBIRVZDIFlVViB0aWxpbmcgb25seSkKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtQ29kZWNJbnB1dEJ1ZmZlcnM7CisKKyAgICAvLyBBcnRpZmljaWFsIHN0cmljdGx5IGluY3JlbWVudGFsIFlVViBncmlkIHRpbWVzdGFtcCB0byBtYWtlIGVuY29kZXIgaGFwcHkuCisgICAgaW50NjRfdCBtR3JpZFRpbWVzdGFtcFVzOworCisgICAgLy8gSW4gbW9zdCBjb21tb24gdXNlIGNhc2UsIGVudHJpZXMgYXJlIGFjY2Vzc2VkIGluIG9yZGVyLgorICAgIHN0ZDo6bWFwPGludDY0X3QsIElucHV0RnJhbWU+IG1QZW5kaW5nSW5wdXRGcmFtZXM7CisKKyAgICAvLyBGdW5jdGlvbiBwb2ludGVyIG9mIGxpYnl1diByb3cgY29weS4KKyAgICB2b2lkICgqbUZuQ29weVJvdykoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCB3aWR0aCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2NjMmJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSGVpY0VuY29kZXJJbmZvTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8cmVnZXg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2dfbWFpbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCisjaW5jbHVkZSAiSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6OkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKSA6CisgICAgICAgIG1Jc0luaXRlZChmYWxzZSksCisgICAgICAgIG1NaW5TaXplSGVpYygwLCAwKSwKKyAgICAgICAgbU1heFNpemVIZWljKElOVDMyX01BWCwgSU5UMzJfTUFYKSwKKyAgICAgICAgbUhhc0hFVkMoZmFsc2UpLAorICAgICAgICBtSGFzSEVJQyhmYWxzZSksCisgICAgICAgIG1EaXNhYmxlR3JpZChmYWxzZSkgeworICAgIGlmIChpbml0aWFsaXplKCkgPT0gT0spIHsKKyAgICAgICAgbUlzSW5pdGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6On5IZWljRW5jb2RlckluZm9NYW5hZ2VyKCkgeworfQorCitib29sIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmlzU2l6ZVN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgYm9vbCogdXNlSGVpYywKKyAgICAgICAgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwsIEFTdHJpbmcqIGhldmNOYW1lKSBjb25zdCB7CisgICAgaWYgKHVzZUhlaWMgPT0gbnVsbHB0ciB8fCB1c2VHcmlkID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHBhcmFtZXRlcnM6IHVzZUhlaWMgJXAsIHVzZUdyaWQgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdXNlSGVpYywgdXNlR3JpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFtSXNJbml0ZWQpIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgY2hvb3NlSGVpYyA9IGZhbHNlLCBlbmFibGVHcmlkID0gdHJ1ZTsKKyAgICBpZiAobUhhc0hFSUMgJiYgd2lkdGggPj0gbU1pblNpemVIZWljLmZpcnN0ICYmCisgICAgICAgICAgICBoZWlnaHQgPj0gbU1pblNpemVIZWljLnNlY29uZCAmJiB3aWR0aCA8PSBtTWF4U2l6ZUhlaWMuZmlyc3QgJiYKKyAgICAgICAgICAgIGhlaWdodCA8PSBtTWF4U2l6ZUhlaWMuc2Vjb25kKSB7CisgICAgICAgIGNob29zZUhlaWMgPSB0cnVlOworICAgICAgICBlbmFibGVHcmlkID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChtSGFzSEVWQykgeworICAgICAgICBib29sIGZ1bGxTaXplU3VwcG9ydGVkQnlIZXZjID0gKHdpZHRoID49IG1NaW5TaXplSGV2Yy5maXJzdCAmJgorICAgICAgICAgICAgICAgIGhlaWdodCA+PSBtTWluU2l6ZUhldmMuc2Vjb25kICYmCisgICAgICAgICAgICAgICAgd2lkdGggPD0gbU1heFNpemVIZXZjLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0IDw9IG1NYXhTaXplSGV2Yy5zZWNvbmQpOworICAgICAgICBpZiAoZnVsbFNpemVTdXBwb3J0ZWRCeUhldmMgJiYgKG1EaXNhYmxlR3JpZCB8fAorICAgICAgICAgICAgICAgICh3aWR0aCA8PSAxOTIwICYmIGhlaWdodCA8PSAxMDgwKSkpIHsKKyAgICAgICAgICAgIGVuYWJsZUdyaWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGV2Y05hbWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmhldmNOYW1lID0gbUhldmNOYW1lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gZW5jb2RlciBhdmFpbGFibGUgZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGFsbCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIEZpbmQgcHJlZmVycmVkIGVuY29kZXIgd2hpY2ggYWR2ZXJ0aXNlCisgICAgICAgIC8vICJtZWFzdXJlZC1mcmFtZS1yYXRlLVdJRFRIeEhFSUdIVC1yYW5nZSIga2V5LgorICAgICAgICBjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzID0KKyAgICAgICAgICAgICAgICAoY2hvb3NlSGVpYyAmJiBtSGVpY0ZyYW1lUmF0ZU1hcHMuc2l6ZSgpID4gMCkgPworICAgICAgICAgICAgICAgIG1IZWljRnJhbWVSYXRlTWFwcyA6IG1IZXZjRnJhbWVSYXRlTWFwczsKKyAgICAgICAgY29uc3QgYXV0byYgY2xvc2VzdFNpemUgPSBmaW5kQ2xvc2VzdFNpemUobWFwcywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChjbG9zZXN0U2l6ZSA9PSBtYXBzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBUaGUgIm1lYXN1cmVkLWZyYW1lLXJhdGUtV0lEVEh4SEVJR0hULXJhbmdlIiBrZXkgaXMgb3B0aW9uYWwuCisgICAgICAgICAgICAvLyBIYXJkY29kZSB0byBzb21lIGRlZmF1bHQgdmFsdWUgKDMuMzNtcyAqIHRpbGUgY291bnQpIGJhc2VkIG9uIHJlc29sdXRpb24uCisgICAgICAgICAgICAqc3RhbGwgPSAzMzMzMzMzTEwgKiB3aWR0aCAqIGhlaWdodCAvIChrR3JpZFdpZHRoICoga0dyaWRIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXJpdmUgc3RhbGwgZHVyYXRpb25zIGJhc2VkIG9uIGF2ZXJhZ2UgZnBzIG9mIHRoZSBjbG9zZXN0IHNpemUuCisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IE5TRUNfUEVSX1NFQyA9IDEwMDAwMDAwMDBMTDsKKyAgICAgICAgaW50MzJfdCBhdmdGcHMgPSAoY2xvc2VzdFNpemUtPnNlY29uZC5maXJzdCArIGNsb3Nlc3RTaXplLT5zZWNvbmQuc2Vjb25kKS8yOworICAgICAgICBmbG9hdCByYXRpbyA9IDEuMGYgKiB3aWR0aCAqIGhlaWdodCAvCisgICAgICAgICAgICAgICAgKGNsb3Nlc3RTaXplLT5maXJzdC5maXJzdCAqIGNsb3Nlc3RTaXplLT5maXJzdC5zZWNvbmQpOworICAgICAgICAqc3RhbGwgPSByYXRpbyAqIE5TRUNfUEVSX1NFQyAvIGF2Z0ZwczsKKyAgICB9CisKKyAgICAqdXNlSGVpYyA9IGNob29zZUhlaWM7CisgICAgKnVzZUdyaWQgPSBlbmFibGVHcmlkOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjppbml0aWFsaXplKCkgeworICAgIG1EaXNhYmxlR3JpZCA9IHByb3BlcnR5X2dldF9ib29sKCJjYW1lcmEuaGVpYy5kaXNhYmxlX2dyaWQiLCBmYWxzZSk7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKGNvZGVjc0xpc3QgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBObyBtZWRpYSBjb2RlYyBhdmFpbGFibGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gaGVpY0RldGFpbHMgPSBnZXRDb2RlY0RldGFpbHMoY29kZWNzTGlzdCwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKworICAgIGlmICghZ2V0SGV2Y0NvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBpZiAoaGVpY0RldGFpbHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2UgbXVzdCBzdXBwb3J0IEhFVkMgY29kZWMgaWYgSEVJQyBjb2RlYyBpcyBhdmFpbGFibGUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtSGFzSEVWQyA9IHRydWU7CisKKyAgICAvLyBIRUlDIHNpemUgcmFuZ2UKKyAgICBpZiAoaGVpY0RldGFpbHMgIT0gbnVsbHB0cikgeworICAgICAgICBhdXRvIHJlcyA9IGdldENvZGVjU2l6ZVJhbmdlKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKKyAgICAgICAgICAgICAgICBoZWljRGV0YWlscywgJm1NaW5TaXplSGVpYywgJm1NYXhTaXplSGVpYywgJm1IZWljRnJhbWVSYXRlTWFwcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBIRUlDIGNvZGVjIHNpemUgcmFuZ2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtSGFzSEVJQyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRGcmFtZVJhdGVNYXBzKHNwPEFNZXNzYWdlPiBkZXRhaWxzLCBGcmFtZVJhdGVNYXBzKiBtYXBzKSB7CisgICAgaWYgKGRldGFpbHMgPT0gbnVsbHB0ciB8fCBtYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBkZXRhaWxzOiAlcCwgbWFwczogJXAiLCBfX0ZVTkNUSU9OX18sIGRldGFpbHMuZ2V0KCksIG1hcHMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV0YWlscy0+Y291bnRFbnRyaWVzKCk7IGkrKykgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyKiBlbnRyeU5hbWUgPSBkZXRhaWxzLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIGlmICh0eXBlICE9IEFNZXNzYWdlOjprVHlwZVN0cmluZykgY29udGludWU7CisgICAgICAgIHN0ZDo6cmVnZXggZnJhbWVSYXRlTmFtZVBhdHRlcm4oIm1lYXN1cmVkLWZyYW1lLXJhdGUtKFswLTldKylbKnhdKFswLTldKyktcmFuZ2UiLAorICAgICAgICAgICAgICAgIHN0ZDo6cmVnZXhfY29uc3RhbnRzOjppY2FzZSk7CisgICAgICAgIHN0ZDo6Y21hdGNoIHNpemVNYXRjaDsKKyAgICAgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goZW50cnlOYW1lLCBzaXplTWF0Y2gsIGZyYW1lUmF0ZU5hbWVQYXR0ZXJuKSAmJgorICAgICAgICAgICAgICAgIHNpemVNYXRjaC5zaXplKCkgPT0gMykgeworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW0gPSBkZXRhaWxzLT5nZXRFbnRyeUF0KGkpOworICAgICAgICAgICAgQVN0cmluZyBmcHNSYW5nZVN0cjsKKyAgICAgICAgICAgIGlmIChpdGVtLmZpbmQoJmZwc1JhbmdlU3RyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMiLCBlbnRyeU5hbWUsIGZwc1JhbmdlU3RyLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6cmVnZXggZnJhbWVSYXRlUGF0dGVybigiKFswLTldKyktKFswLTldKykiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmNtYXRjaCBmcHNNYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChmcHNSYW5nZVN0ci5jX3N0cigpLCBmcHNNYXRjaCwgZnJhbWVSYXRlUGF0dGVybikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwc01hdGNoLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcHMtPmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RvaShzaXplTWF0Y2hbMV0pLCBzdG9pKHNpemVNYXRjaFsyXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0b2koZnBzTWF0Y2hbMV0pLCBzdG9pKGZwc01hdGNoWzJdKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0Q29kZWNTaXplUmFuZ2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvZGVjTmFtZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGRldGFpbHMsCisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWluU2l6ZSwKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtYXhTaXplLAorICAgICAgICBGcmFtZVJhdGVNYXBzKiBmcmFtZVJhdGVNYXBzKSB7CisgICAgaWYgKGNvZGVjTmFtZSA9PSBudWxscHRyIHx8IG1pblNpemUgPT0gbnVsbHB0ciB8fCBtYXhTaXplID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIGRldGFpbHMgPT0gbnVsbHB0ciB8fCBmcmFtZVJhdGVNYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBU3RyaW5nIHNpemVSYW5nZTsKKyAgICBhdXRvIGhhc0l0ZW0gPSBkZXRhaWxzLT5maW5kU3RyaW5nKCJzaXplLXJhbmdlIiwgJnNpemVSYW5nZSk7CisgICAgaWYgKCFoYXNJdGVtKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXJ5IHNpemUgcmFuZ2UgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBjb2RlY05hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzIGNvZGVjJ3Mgc2l6ZSByYW5nZSBpcyAlcyIsIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lLCBzaXplUmFuZ2UuY19zdHIoKSk7CisgICAgc3RkOjpyZWdleCBwYXR0ZXJuKCIoWzAtOV0rKVsqeF0oWzAtOV0rKS0oWzAtOV0rKVsqeF0oWzAtOV0rKSIpOworICAgIHN0ZDo6Y21hdGNoIG1hdGNoOworICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKHNpemVSYW5nZS5jX3N0cigpLCBtYXRjaCwgcGF0dGVybikpIHsKKyAgICAgICAgaWYgKG1hdGNoLnNpemUoKSA9PSA1KSB7CisgICAgICAgICAgICBtaW5TaXplLT5maXJzdCA9IHN0b2kobWF0Y2hbMV0pOworICAgICAgICAgICAgbWluU2l6ZS0+c2Vjb25kID0gc3RvaShtYXRjaFsyXSk7CisgICAgICAgICAgICBtYXhTaXplLT5maXJzdCA9IHN0b2kobWF0Y2hbM10pOworICAgICAgICAgICAgbWF4U2l6ZS0+c2Vjb25kID0gc3RvaShtYXRjaFs0XSk7CisgICAgICAgICAgICBpZiAobWluU2l6ZS0+Zmlyc3QgPiBtYXhTaXplLT5maXJzdCB8fAorICAgICAgICAgICAgICAgICAgICBtaW5TaXplLT5zZWNvbmQgPiBtYXhTaXplLT5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMgY29kZSBzaXplIHJhbmdlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSwgc2l6ZVJhbmdlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byByZXMgPSBnZXRGcmFtZVJhdGVNYXBzKGRldGFpbHMsIGZyYW1lUmF0ZU1hcHMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK0hlaWNFbmNvZGVySW5mb01hbmFnZXI6OkZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmZpbmRDbG9zZXN0U2l6ZSgKKyAgICAgICAgY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcywgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICBpbnQzMl90IG1pbkRpZmYgPSBJTlQzMl9NQVg7CisgICAgRnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgY2xvc2VzdEl0ZXIgPSBtYXBzLmJlZ2luKCk7CisgICAgZm9yIChhdXRvIGl0ZXIgPSBtYXBzLmJlZ2luKCk7IGl0ZXIgIT0gbWFwcy5lbmQoKTsgaXRlcisrKSB7CisgICAgICAgIC8vIFVzZSBhcmVhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2l6ZXMgdG8gYXBwcm94aW1hdGUgc2l6ZQorICAgICAgICAvLyBkaWZmZXJlbmNlLgorICAgICAgICBpbnQzMl90IGRpZmYgPSBhYnMoaXRlci0+Zmlyc3QuZmlyc3QgKiBpdGVyLT5maXJzdC5zZWNvbmQgLSB3aWR0aCAqIGhlaWdodCk7CisgICAgICAgIGlmIChkaWZmIDwgbWluRGlmZikgeworICAgICAgICAgICAgY2xvc2VzdEl0ZXIgPSBpdGVyOworICAgICAgICAgICAgbWluRGlmZiA9IGRpZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsb3Nlc3RJdGVyOworfQorCitzcDxBTWVzc2FnZT4gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0Q29kZWNEZXRhaWxzKAorICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGlkeCA9IGNvZGVjc0xpc3QtPmZpbmRDb2RlY0J5VHlwZShuYW1lLCB0cnVlIC8qZW5jb2RlciovKTsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGNvZGVjc0xpc3QtPmdldENvZGVjSW5mbyhpZHgpOworICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGNvZGVjIGluZm8gZm9yICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPQorICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG5hbWUpOworICAgIGlmIChjYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdGllcyBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBjYXBzLT5nZXREZXRhaWxzKCk7CisgICAgaWYgKGRldGFpbHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgZGV0YWlscyBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gZGV0YWlsczsKK30KKworYm9vbCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRIZXZjQ29kZWNEZXRhaWxzKAorICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG1pbWUpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgc3NpemVfdCBpZHggPSAwOworICAgIHdoaWxlICgoaWR4ID0gY29kZWNzTGlzdC0+ZmluZENvZGVjQnlUeXBlKG1pbWUsIHRydWUgLyplbmNvZGVyKi8sIGlkeCkpID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBjb2RlY3NMaXN0LT5nZXRDb2RlY0luZm8oaWR4KyspOworICAgICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY29kZWMgaW5mbyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG1pbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWx0ZXIgb3V0IHNvZnR3YXJlIG9uZXMgYXMgdGhleSBtYXkgYmUgdG9vIHNsb3cKKyAgICAgICAgaWYgKCEoaW5mby0+Z2V0QXR0cmlidXRlcygpICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0KKyAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZSk7CisgICAgICAgIGlmIChjYXBzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWyVzXSBGYWlsZWQgdG8gZ2V0IGNhcGFiaWxpdGllcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGRldGFpbHMgPSBjYXBzLT5nZXREZXRhaWxzKCk7CisgICAgICAgIGlmIChkZXRhaWxzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWyVzXSBGYWlsZWQgdG8gZ2V0IGRldGFpbHMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgQ1EgbW9kZQorICAgICAgICBBU3RyaW5nIGJpdHJhdGVNb2RlczsKKyAgICAgICAgYXV0byBoYXNJdGVtID0gZGV0YWlscy0+ZmluZFN0cmluZygiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgJmJpdHJhdGVNb2Rlcyk7CisgICAgICAgIGlmICghaGFzSXRlbSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBbJXNdIEZhaWxlZCB0byBxdWVyeSBiaXRyYXRlIG1vZGVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IFslc10gZmVhdHVyZS1iaXRyYXRlLW1vZGVzIHZhbHVlIGlzICVkLCAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbmZvLT5nZXRDb2RlY05hbWUoKSwgaGFzSXRlbSwgYml0cmF0ZU1vZGVzLmNfc3RyKCkpOworICAgICAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIihefCwpQ1EoJHwsKSIsIHN0ZDo6cmVnZXhfY29uc3RhbnRzOjppY2FzZSk7CisgICAgICAgIGlmICghc3RkOjpyZWdleF9zZWFyY2goYml0cmF0ZU1vZGVzLmNfc3RyKCksIHBhdHRlcm4pKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSBvbiB0byBuZXh0IGVuY29kZXIKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBtaW5TaXplSGV2YywgbWF4U2l6ZUhldmM7CisgICAgICAgIEZyYW1lUmF0ZU1hcHMgaGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICAgICBkZXRhaWxzLCAmbWluU2l6ZUhldmMsICZtYXhTaXplSGV2YywgJmhldmNGcmFtZVJhdGVNYXBzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBbJXNdIEZhaWxlZCB0byBnZXQgc2l6ZSByYW5nZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtHcmlkV2lkdGggPCBtaW5TaXplSGV2Yy5maXJzdAorICAgICAgICAgICAgICAgIHx8IGtHcmlkV2lkdGggPiBtYXhTaXplSGV2Yy5maXJzdAorICAgICAgICAgICAgICAgIHx8IGtHcmlkSGVpZ2h0IDwgbWluU2l6ZUhldmMuc2Vjb25kCisgICAgICAgICAgICAgICAgfHwga0dyaWRIZWlnaHQgPiBtYXhTaXplSGV2Yy5zZWNvbmQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIG9uIHRvIG5leHQgZW5jb2RlcgorICAgICAgICB9CisKKyAgICAgICAgLy8gRm91bmQ6IHNhdmUgbmFtZSwgc2l6ZSwgZnJhbWUgcmF0ZQorICAgICAgICBtSGV2Y05hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICAgICAgbU1pblNpemVIZXZjID0gbWluU2l6ZUhldmM7CisgICAgICAgIG1NYXhTaXplSGV2YyA9IG1heFNpemVIZXZjOworICAgICAgICBtSGV2Y0ZyYW1lUmF0ZU1hcHMgPSBoZXZjRnJhbWVSYXRlTWFwczsKKworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmb3VuZDsKK30KKworfSAvL25hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZWRiYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0VuY29kZXJJbmZvTWFuYWdlciB7CitwdWJsaWM6CisgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXImIGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciBpbnN0YW5jZTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwsIEFTdHJpbmcqIGhldmNOYW1lKSBjb25zdDsKKworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtHcmlkV2lkdGggPSA1MTI7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRIZWlnaHQgPSA1MTI7Citwcml2YXRlOgorICAgIHN0cnVjdCBTaXplUGFpckhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvciAoKSAoY29uc3Qgc3RkOjpwYWlyPGludDMyX3QsaW50MzJfdD4gJnApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwLmZpcnN0ICogMzEgKyBwLnNlY29uZDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4sCisgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4sIFNpemVQYWlySGFzaD4gRnJhbWVSYXRlTWFwczsKKworICAgIEhlaWNFbmNvZGVySW5mb01hbmFnZXIoKTsKKyAgICB2aXJ0dWFsIH5IZWljRW5jb2RlckluZm9NYW5hZ2VyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisgICAgc3RhdHVzX3QgZ2V0RnJhbWVSYXRlTWFwcyhzcDxBTWVzc2FnZT4gZGV0YWlscywgRnJhbWVSYXRlTWFwcyogbWFwcyk7CisgICAgc3RhdHVzX3QgZ2V0Q29kZWNTaXplUmFuZ2UoY29uc3QgY2hhciogY29kZWNOYW1lLCBzcDxBTWVzc2FnZT4gZGV0YWlscywKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWluU2l6ZSwgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtYXhTaXplLAorICAgICAgICAgICAgRnJhbWVSYXRlTWFwcyogZnJhbWVSYXRlTWFwcyk7CisgICAgRnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgZmluZENsb3Nlc3RTaXplKGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMsCisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldENvZGVjRGV0YWlscyhzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG5hbWUpOworICAgIGJvb2wgZ2V0SGV2Y0NvZGVjRGV0YWlscyhzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QsIGNvbnN0IGNoYXIqIG1pbWUpOworCisgICAgYm9vbCBtSXNJbml0ZWQ7CisgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1NaW5TaXplSGVpYywgbU1heFNpemVIZWljOworICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBtTWluU2l6ZUhldmMsIG1NYXhTaXplSGV2YzsKKyAgICBib29sIG1IYXNIRVZDLCBtSGFzSEVJQzsKKyAgICBBU3RyaW5nIG1IZXZjTmFtZTsKKyAgICBGcmFtZVJhdGVNYXBzIG1IZWljRnJhbWVSYXRlTWFwcywgbUhldmNGcmFtZVJhdGVNYXBzOworICAgIGJvb2wgbURpc2FibGVHcmlkOworCit9OworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCBjZTAwNmE3Li43OGZlYjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTMyLDE0ICszMiwxMSBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtNTcsMTMgKzU0LDEzIEBACiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKKyAgICAgICAgbURldmljZShuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCkpLAogICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKSwgbUFwaTFDYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgQUxPR0koIkNhbWVyYSAlczogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZC5zdHJpbmcoKSwKICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAKICAgICBtSW5pdGlhbENsaWVudFBpZCA9IGNsaWVudFBpZDsKLSAgICBtRGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CiB9CiAKQEAgLTcxLDcgKzY4LDcgQEAKIHN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Y2hlY2tQaWQoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbikKICAgICAgICAgY29uc3QgewogCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HRSgiJXM6IGF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCkBAIC0xODYsNyArMTgzLDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgbWVkaWEgc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICYmCiAgICAgICAgIGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCkBAIC0yMDYsOCArMjAzLDYgQEAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47CiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwogCi0gICAgbURldmljZS5jbGVhcigpOwotCiAgICAgQUxPR1YoIkNhbWVyYSAlczogRGV0YWNoIGNvbXBsZXRlIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiB9CiAKQEAgLTIxOSwxOCArMjE0LDE4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCiAgICAgaWYgKFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICE9IDAgJiYKLSAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CisgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKIAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogQ29ubmVjdGlvbiBhdHRlbXB0IGZyb20gcGlkICVkOyAiCiAgICAgICAgICAgICAgICAgImN1cnJlbnQgbG9ja2VkIHRvIHBpZCAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIFRDbGllbnRCYXNlOjptUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggZTc0ZmJkZi4uNjY5Mzg0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTEzMCw3ICsxMzAsMTAgQEAKICAgICAvKiogQ2FtZXJhRGV2aWNlQmFzZSBpbnN0YW5jZSB3cmFwcGluZyBIQUwzKyBlbnRyeSAqLwogCiAgICAgY29uc3QgaW50IG1EZXZpY2VWZXJzaW9uOwotICAgIHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOworCisgICAgLy8gU2V0IHRvIGNvbnN0IHRvIGF2b2lkIG1EZXZpY2UgYmVpbmcgdXBkYXRlZCAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nCisgICAgLy8gZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UpCisgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IDBiYTc0MDMuLjk4YzFiNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtNjksNiArNjksMTAgQEAKICAgICAgKiBUaGUgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKICAgICAgKi8KICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3QgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIGNvbnN0ID0gMDsKIAogICAgIHN0cnVjdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzIHsKICAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDQzZjFhOTEuLjA5NjM4ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMCwyNyArMjAsNDIgQEAKIAogI2luY2x1ZGUgIkNhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwordXNpbmcgc3RkOjpsaXRlcmFsczo6Y2hyb25vX2xpdGVyYWxzOjpvcGVyYXRvciIiczsKIAogbmFtZXNwYWNlIHsKIC8vIEhhcmRjb2RlZCBuYW1lIGZvciB0aGUgcGFzc3Rocm91Z2ggSEFMIGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCBjYW4ndCBiZSBkaXNjb3ZlcmVkIHZpYSB0aGUKIC8vIHNlcnZpY2UgbWFuYWdlcgogY29uc3Qgc3RkOjpzdHJpbmcga0xlZ2FjeVByb3ZpZGVyTmFtZSgibGVnYWN5LzAiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtFeHRlcm5hbFByb3ZpZGVyTmFtZSgiZXh0ZXJuYWwvMCIpOwotCitjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7CiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIAorY29uc3QgZmxvYXQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZSA9IC4xZjsKKwogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5CiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5e307CiAKQEAgLTU2LDYgKzcxLDggQEAKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgbVNlcnZpY2VQcm94eSA9IHByb3h5OworICAgIG1EZXZpY2VTdGF0ZSA9IHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4+KAorICAgICAgICBwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU6Ok5PUk1BTCk7CiAKICAgICAvLyBSZWdpc3RlcmluZyB3aWxsIHRyaWdnZXIgbm90aWZpY2F0aW9ucyBmb3IgYWxsIGFscmVhZHkta25vd24gcHJvdmlkZXJzCiAgICAgYm9vbCBzdWNjZXNzID0gbVNlcnZpY2VQcm94eS0+cmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKApAQCAtNzEsNiArODgsOCBAQAogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtMZWdhY3lQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CiAgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0V4dGVybmFsUHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMDEsOCArMTIwLDggQEAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHByb3ZpZGVyRGV2aWNlSWRzID0gcHJvdmlkZXItPm1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKIAogICAgICAgICAvLyBBUEkxIGFwcCBkb2Vzbid0IGhhbmRsZSBsb2dpY2FsIGFuZCBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlcyB3ZWxsLiBTbwotICAgICAgICAvLyBmb3IgZWFjaCBbbG9naWNhbCwgcGh5c2ljYWwxLCBwaHlzaWNhbDIsIC4uLl0gaWQgY29tYm8sIG9ubHkgdGFrZSB0aGUKLSAgICAgICAgLy8gZmlyc3QgaWQgYWR2ZXJ0aXNlZCBieSBIQUwsIGFuZCBmaWx0ZXIgb3V0IHRoZSByZXN0LgorICAgICAgICAvLyBmb3IgZWFjaCBjYW1lcmEgZmFjaW5nLCBvbmx5IHRha2UgdGhlIGZpcnN0IGlkIGFkdmVydGlzZWQgYnkgSEFMIGluCisgICAgICAgIC8vIGFsbCBbbG9naWNhbCwgcGh5c2ljYWwxLCBwaHlzaWNhbDIsIC4uLl0gaWQgY29tYm9zLCBhbmQgZmlsdGVyIG91dCB0aGUgcmVzdC4KICAgICAgICAgZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZChwcm92aWRlckRldmljZUlkcyk7CiAKICAgICAgICAgZGV2aWNlSWRzLmluc2VydChkZXZpY2VJZHMuZW5kKCksIHByb3ZpZGVyRGV2aWNlSWRzLmJlZ2luKCksIHByb3ZpZGVyRGV2aWNlSWRzLmVuZCgpKTsKQEAgLTE3NCw2ICsxOTMsMTkgQEAKICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhSW5mbyhpbmZvKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZUluZm8tPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwgc3RhdHVzKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKQEAgLTIwMywyNiArMjM1LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0gICAgYm9vbCBzdXBwb3J0ID0gZmFsc2U7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBhdXRvIHJldCA9IHByb3ZpZGVyLT5tSW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBbJnN1cHBvcnRdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gc3VwcG9ydDsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgYm9vbCBlbmFibGVkKSB7CkBAIC0yMzEsNiArMjUyLDE1IEBACiAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAorICAgIC8vIFBhc3MgdGhlIGNhbWVyYSBJRCB0byBzdGFydCBpbnRlcmZhY2Ugc28gdGhhdCBpdCB3aWxsIHNhdmUgaXQgdG8gdGhlIG1hcCBvZiBJQ2FtZXJhUHJvdmlkZXJzCisgICAgLy8gdGhhdCBhcmUgY3VycmVudGx5IGluIHVzZS4KKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgZGV2aWNlSW5mby0+bUlkLCBpbnRlcmZhY2UpOworCiAgICAgcmV0dXJuIGRldmljZUluZm8tPnNldFRvcmNoTW9kZShlbmFibGVkKTsKIH0KIApAQCAtMjM4LDM3ICsyNjgsNyBAQAogICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CiAKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOwotICAgICAgICBTdGF0dXMgc3RhdHVzOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICAgICAgcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCi0gICAgICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCi0gICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL2Rlc2MpKQotICAgICAgICAgICAgICAgICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKLSAgICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKLSAgICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIGRlc2MpOworICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIHByb3ZpZGVyLT5tVmVuZG9yVGFnRGVzY3JpcHRvcik7CiAgICAgfQogCiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0NhY2hlKHRhZ0NhY2hlKTsKQEAgLTI3NiwxMCArMjc2LDMwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld1N0YXRlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKyAgICBtRGV2aWNlU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBBTE9HVigiJXM6IE5vdGlmeWluZyAlcyBmb3IgbmV3IHN0YXRlIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgbmV3U3RhdGUpOworICAgICAgICBzdGF0dXNfdCBzaW5nbGVSZXMgPSBwcm92aWRlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgaWYgKHNpbmdsZVJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbm90aWZ5IHByb3ZpZGVyICVzIGFib3V0IGRldmljZSBzdGF0ZSBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmVzID0gc2luZ2xlUmVzOworICAgICAgICAgICAgLy8gY29udGludWUgdG8gZG8gdGhlIHJlc3Qgb2YgdGhlIHByb3ZpZGVycyBpbnN0ZWFkIG9mIHJldHVybmluZyBub3cKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMjg4LDEwICszMDgsMjIgQEAKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKICAgICBhdXRvICpkZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOwogCiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBkZXZpY2VJbmZvMy0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjaywgWyZzdGF0dXMsICZzZXNzaW9uXQorICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCiAgICAgICAgICAgICAoU3RhdHVzIHMsIGNvbnN0IHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+JiBjYW1lcmFTZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKQEAgLTI5OSw2ICszMzEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CkBAIC0zMDcsOSArMzQwLDkgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIGNvbnN0IHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zMTgsMjQgKzM1MSw5MSBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8xID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMSo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOworICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzEtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAqc2Vzc2lvbiA9IGRldmljZUluZm8xLT5tSW50ZXJmYWNlOworICAgICAgICAqc2Vzc2lvbiA9IGludGVyZmFjZTsKICAgICB9CiAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogfQogCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcikgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiU2F2aW5nIGNhbWVyYSBwcm92aWRlciAlcyBmb3IgY2FtZXJhIGRldmljZSAlcyIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmltYXJ5TWFwID0gJm1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfQorICAgIGF1dG8gaWQgPSBjYW1lcmFJZC5jX3N0cigpOworICAgICgqcHJpbWFyeU1hcClbaWRdID0gcHJvdmlkZXI7CisgICAgYXV0byBzZWFyY2ggPSBhbHRlcm5hdGVNYXAtPmZpbmQoaWQpOworICAgIGlmIChzZWFyY2ggIT0gYWx0ZXJuYXRlTWFwLT5lbmQoKSkgeworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBkZXZpY2UgJXMgaXMgdXNpbmcgYm90aCB0b3JjaCBtb2RlIGFuZCBjYW1lcmEgbW9kZSBzaW11bHRhbmVvdXNseS4gIgorICAgICAgICAgICAgICAgICJUaGF0IHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgZGV2aWNlICVzIGNvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXywgaWQpOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6cmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpIHsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIlJlbW92aW5nIGNhbWVyYSBkZXZpY2UgJXMiLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJvdmlkZXJNYXA7CisgICAgaWYgKHVzYWdlVHlwZSA9PSBEZXZpY2VNb2RlOjpUT1JDSCkgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdmlkZXJNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7CisgICAgYXV0byBzZWFyY2ggPSBwcm92aWRlck1hcC0+ZmluZChjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBpZiAoc2VhcmNoICE9IHByb3ZpZGVyTWFwLT5lbmQoKSkgeworICAgICAgICAvLyBEcm9wIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBJQ2FtZXJhUHJvdmlkZXIuIFRoaXMgaXMgc2FmZSB0byBkbyBpbW1lZGlhdGVseSAod2l0aG91dCBhbgorICAgICAgICAvLyBhZGRlZCBkZWxheSkgYmVjYXVzZSBod3NlcnZpY2VtYW5hZ2VyIGd1YXJhbnRlZXMgdG8gaG9sZCB0aGUgcmVmZXJlbmNlIGZvciBhdCBsZWFzdCBmaXZlCisgICAgICAgIC8vIG1vcmUgc2Vjb25kcy4gIFdlIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW9yIHNvIHRoYXQgaWYgdGhlIHByb3ZpZGVyIGlzIHVucmVmZXJlbmNlZCBhbmQKKyAgICAgICAgLy8gdGhlbiByZWZlcmVuY2VkIGFnYWluIHF1aWNrbHksIHdlIGRvIG5vdCBsZXQgdGhlIEhBTCBleGl0IGFuZCB0aGVuIG5lZWQgdG8gaW1tZWRpYXRlbHkKKyAgICAgICAgLy8gcmVzdGFydCBpdC4gQW4gZXhhbXBsZSB3aGVuIHRoaXMgY291bGQgaGFwcGVuIGlzIHN3aXRjaGluZyBmcm9tIGEgZnJvbnQtZmFjaW5nIHRvIGEKKyAgICAgICAgLy8gcmVhci1mYWNpbmcgY2FtZXJhLiBJZiB0aGUgSEFMIHdlcmUgdG8gZXhpdCBkdXJpbmcgdGhlIGNhbWVyYSBzd2l0Y2gsIHRoZSBjYW1lcmEgY291bGQKKyAgICAgICAgLy8gYXBwZWFyIGphbmt5IHRvIHRoZSB1c2VyLgorICAgICAgICBwcm92aWRlck1hcC0+ZXJhc2UoY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEFza2VkIHRvIHJlbW92ZSByZWZlcmVuY2UgZm9yIGNhbWVyYSAlcywgYnV0IG5vIHJlZmVyZW5jZSB0byBpdCB3YXMgZm91bmQuIFRoaXMgIgorICAgICAgICAgICAgICAgICJjb3VsZCBtZWFuIHJlbW92ZVJlZiB3YXMgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBjYW1lcmEgSUQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIH0KK30KIAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9uUmVnaXN0cmF0aW9uKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIC8qZnFOYW1lKi8sCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgYm9vbCAvKnByZWV4aXN0aW5nKi8pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMzQ3LDYgKzQ0Nyw4IEBACiAgICAgICAgIGxpc3RlbmVyLT5vbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpOwogICAgIH0KIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+KCk7CiB9CiAKQEAgLTM5MiwzNSArNDk0LDU5NyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKLSAgICBib29sIGlzTG9naWNhbENhbSA9IGZhbHNlOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CiAKLSAgICBlbnRyeUNhcCA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDYXAuY291bnQ7ICsraSkgewogICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeUNhcC5kYXRhLnU4W2ldOwogICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgewotICAgICAgICAgICAgaXNMb2dpY2FsQ2FtID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFpc0xvZ2ljYWxDYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghbUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlJZHMgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5SWRzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKAorICAgICAgICAgICAgQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOwogICAgIGNvbnN0IHVpbnQ4X3QqIGlkcyA9IGVudHJ5SWRzLmRhdGEudTg7CiAgICAgc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5SWRzLmNvdW50OyArK2kpIHsKICAgICAgICAgaWYgKGlkc1tpXSA9PSAnXDAnKSB7CiAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gaSkgewotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLT5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CisgICAgICAgICAgICAgICAgbVBoeXNpY2FsSWRzLnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXJ0ID0gaSsxOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCkgeworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5Q2FwOworICAgIGVudHJ5Q2FwID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBpZiAoZW50cnlDYXAuY291bnQgIT0gMSkgeworICAgICAgICAvLyBEbyBOT1QgaGlkZSB0aGlzIGNhbWVyYSBkZXZpY2UgaWYgdGhlIGNhcGFiaWxpdGllcyBzcGVjaWZ5IGFueXRoaW5nIG1vcmUKKyAgICAgICAgLy8gdGhhbiBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZW50cnlDYXAuZGF0YS51OFswXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQTsKK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZFNpemVzKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqc2l6ZXMvKm91dCovKSB7CisgICAgaWYgKHNpemVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2NhbGVyRGltcyA9IGNoLmZpbmQodGFnKTsKKyAgICBpZiAoc2NhbGVyRGltcy5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gU2NhbGVyIGVudHJ5IGNvbnRhaW5zIDQgZWxlbWVudHMgKGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgdHlwZSkKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY2FsZXJEaW1zLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoc2NhbGVyRGltcy5kYXRhLmkzMltpXSA9PSBmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChzY2FsZXJEaW1zLmRhdGEuaTMyW2krM10gPT0KKyAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSkgeworICAgICAgICAgICAgICAgIHNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHNjYWxlckRpbXMuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXJEaW1zLmRhdGEuaTMyW2krMl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER1cmF0aW9ucygKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHNpemVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHVyYXRpb25zLypvdXQqLykgeworICAgIGlmIChkdXJhdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBhdmFpbGFibGVEdXJhdGlvbnMgPSBjaC5maW5kKHRhZyk7CisgICAgaWYgKGF2YWlsYWJsZUR1cmF0aW9ucy5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRHVyYXRpb24gZW50cnkgY29udGFpbnMgNCBlbGVtZW50cyAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkdXJhdGlvbikKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVEdXJhdGlvbnMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzaXplIDogc2l6ZXMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHdpZHRoID0gc3RkOjpnZXQ8MD4oc2l6ZSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBoZWlnaHQgPSBzdGQ6OmdldDwxPihzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpXSA9PSBmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2krMV0gPT0gd2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2krMl0gPT0gaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMtPnB1c2hfYmFjayhhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSszXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKSB7CisgICAgaWYgKChkeW5hbWljRGVwdGhEdXJhdGlvbnMgPT0gbnVsbHB0cikgfHwgKGRlcHRoRHVyYXRpb25zLnNpemUoKSAhPSBibG9iRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZGlyZWN0IHdheSB0byBjYWxjdWxhdGUgdGhlIGR5bmFtaWMgZGVwdGggc3RyZWFtIGR1cmF0aW9uLgorICAgIC8vIFByb2Nlc3NpbmcgdGltZSBvbiBjYW1lcmEgc2VydmljZSBzaWRlIGNhbiB2YXJ5IGdyZWF0bHkgZGVwZW5kaW5nIG9uIG11bHRpcGxlCisgICAgLy8gdmFyaWFibGVzIHdoaWNoIGFyZSBub3QgdW5kZXIgb3VyIGNvbnRyb2wuIE1ha2UgYSBndWVzc3RpbWF0ZSBieSB0YWtpbmcgdGhlIG1heGltdW0KKyAgICAvLyBjb3JyZXNwb25kaW5nIGR1cmF0aW9uIHZhbHVlIGZyb20gZGVwdGggYW5kIGJsb2IuCisgICAgYXV0byBkZXB0aER1cmF0aW9uID0gZGVwdGhEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBhdXRvIGJsb2JEdXJhdGlvbiA9IGJsb2JEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBkeW5hbWljRGVwdGhEdXJhdGlvbnMtPnJlc2VydmUoZGVwdGhEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICB3aGlsZSAoKGRlcHRoRHVyYXRpb24gIT0gZGVwdGhEdXJhdGlvbnMuZW5kKCkpICYmIChibG9iRHVyYXRpb24gIT0gYmxvYkR1cmF0aW9ucy5lbmQoKSkpIHsKKyAgICAgICAgZHluYW1pY0RlcHRoRHVyYXRpb25zLT5wdXNoX2JhY2soc3RkOjptYXgoKmRlcHRoRHVyYXRpb24sICpibG9iRHVyYXRpb24pKTsKKyAgICAgICAgZGVwdGhEdXJhdGlvbisrOyBibG9iRHVyYXRpb24rKzsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBibG9iU2l6ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgZGVwdGhTaXplcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpkeW5hbWljRGVwdGhTaXplcyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmludGVybmFsRGVwdGhTaXplcyAvKm91dCovKSB7CisgICAgaWYgKGR5bmFtaWNEZXB0aFNpemVzID09IG51bGxwdHIgfHwgaW50ZXJuYWxEZXB0aFNpemVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZSBkeW5hbWljIGRlcHRoIHNwZWMuIGRvZXMgbm90IG1lbnRpb24gaG93IGNsb3NlIHRoZSBBUiByYXRpbyBzaG91bGQgYmUuCisgICAgLy8gVHJ5IHVzaW5nIHNvbWV0aGluZyBhcHByb3ByaWF0ZS4KKyAgICBmbG9hdCBBUlRvbGVyYW5jZSA9IGtEZXB0aEFSVG9sZXJhbmNlOworCisgICAgZm9yIChjb25zdCBhdXRvJiBibG9iU2l6ZSA6IGJsb2JTaXplcykgeworICAgICAgICBmbG9hdCBqcGVnQVIgPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHN0ZDo6Z2V0PDA+KGJsb2JTaXplKSkgLworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OmdldDwxPihibG9iU2l6ZSkpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGVwdGhTaXplIDogZGVwdGhTaXplcykgeworICAgICAgICAgICAgaWYgKGRlcHRoU2l6ZSA9PSBibG9iU2l6ZSkgeworICAgICAgICAgICAgICAgIGludGVybmFsRGVwdGhTaXplcy0+cHVzaF9iYWNrKGRlcHRoU2l6ZSk7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBkZXB0aEFSID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChzdGQ6OmdldDwwPihkZXB0aFNpemUpKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OmdldDwxPihkZXB0aFNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmYWJzKGpwZWdBUiAtIGRlcHRoQVIpIDw9IEFSVG9sZXJhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsRGVwdGhTaXplcy0+cHVzaF9iYWNrKGRlcHRoU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBkeW5hbWljRGVwdGhTaXplcy0+cHVzaF9iYWNrKGJsb2JTaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCkgeworICAgIHN0YXRpYyBib29sIGxpYnJhcnlQcmVzZW50ID0gZmFsc2U7CisgICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuIGxpYnJhcnlQcmVzZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkKiBkZXB0aExpYkhhbmRsZSA9IGRsb3BlbihjYW1lcmEzOjprRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgaWYgKGRlcHRoTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gcHJvY2Vzc0Z1bmMgPSBkbHN5bShkZXB0aExpYkhhbmRsZSwgY2FtZXJhMzo6a0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pOworICAgIGlmIChwcm9jZXNzRnVuYyAhPSBudWxscHRyKSB7CisgICAgICAgIGxpYnJhcnlQcmVzZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaWJyYXJ5UHJlc2VudCA9IGZhbHNlOworICAgIH0KKyAgICBkbGNsb3NlKGRlcHRoTGliSGFuZGxlKTsKKworICAgIHJldHVybiBsaWJyYXJ5UHJlc2VudDsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjphZGREeW5hbWljRGVwdGhUYWdzKCkgeworICAgIHVpbnQzMl90IGRlcHRoRXhjbFRhZyA9IEFORFJPSURfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFOworICAgIHVpbnQzMl90IGRlcHRoU2l6ZXNUYWcgPSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKKyAgICAgICAgICAgIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCBpbnRlcm5hbERlcHRoU2l6ZXM7CisgICAgYXV0byBjaFRhZ3MgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgaWYgKGNoVGFncy5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogU3VwcG9ydGVkIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaXMgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBib29sIGlzRGVwdGhFeGNsdXNpdmVQcmVzZW50ID0gc3RkOjpmaW5kKGNoVGFncy5kYXRhLmkzMiwgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50LAorICAgICAgICAgICAgZGVwdGhFeGNsVGFnKSAhPSAoY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50KTsKKyAgICBib29sIGlzRGVwdGhTaXplUHJlc2VudCA9IHN0ZDo6ZmluZChjaFRhZ3MuZGF0YS5pMzIsIGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCwKKyAgICAgICAgICAgIGRlcHRoU2l6ZXNUYWcpICE9IChjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIGlmICghKGlzRGVwdGhFeGNsdXNpdmVQcmVzZW50ICYmIGlzRGVwdGhTaXplUHJlc2VudCkpIHsKKyAgICAgICAgLy8gTm8gZGVwdGggc3VwcG9ydCwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYXV0byBkZXB0aEV4Y2x1c2l2ZUVudHJ5ID0gYy5maW5kKGRlcHRoRXhjbFRhZyk7CisgICAgaWYgKGRlcHRoRXhjbHVzaXZlRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGlmIChkZXB0aEV4Y2x1c2l2ZUVudHJ5LmRhdGEudThbMF0gIT0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkVfRkFMU0UpIHsKKyAgICAgICAgICAgIC8vIERlcHRoIHN1cHBvcnQgaXMgZXhjbHVzaXZlLCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEFkdmVydGlzZWQgZGVwdGggZXhjbHVzaXZlIHRhZyBidXQgdmFsdWUgaXMgbm90IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWRTaXplcyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBIQUxfUElYRUxfRk9STUFUX0JMT0IsCisgICAgICAgICAgICAmc3VwcG9ydGVkQmxvYlNpemVzKTsKKyAgICBnZXRTdXBwb3J0ZWRTaXplcyhjLCBkZXB0aFNpemVzVGFnLCBIQUxfUElYRUxfRk9STUFUX1kxNiwgJnN1cHBvcnRlZERlcHRoU2l6ZXMpOworICAgIGlmIChzdXBwb3J0ZWRCbG9iU2l6ZXMuZW1wdHkoKSB8fCBzdXBwb3J0ZWREZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpbiB0aGlzIGNhc2UuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcyhzdXBwb3J0ZWRCbG9iU2l6ZXMsIHN1cHBvcnRlZERlcHRoU2l6ZXMsCisgICAgICAgICAgICAmc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZpbnRlcm5hbERlcHRoU2l6ZXMpOworICAgIGlmIChzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmKCFpc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpKSB7CisgICAgICAgIC8vIERlcHRoIHBob3RvIHByb2Nlc3NpbmcgbGlicmFyeSBpcyBub3QgcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZHluYW1pY0RlcHRoRW50cmllczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMpIHsKKyAgICAgICAgaW50MzJfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPihpdCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwxPihpdCkpLAorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUIH07CisgICAgICAgIGR5bmFtaWNEZXB0aEVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aEVudHJpZXMuZW5kKCksIGVudHJ5LCBlbnRyeSArIDQpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGRlcHRoTWluRHVyYXRpb25zLCBkZXB0aFN0YWxsRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGJsb2JNaW5EdXJhdGlvbnMsIGJsb2JTdGFsbER1cmF0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMsIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zOworCisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwgaW50ZXJuYWxEZXB0aFNpemVzLCAmZGVwdGhNaW5EdXJhdGlvbnMpOworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZibG9iTWluRHVyYXRpb25zKTsKKyAgICBpZiAoYmxvYk1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8IGRlcHRoTWluRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkZXB0aE1pbkR1cmF0aW9ucy5zaXplKCkgIT0gYmxvYk1pbkR1cmF0aW9ucy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBudW1iZXIgb2YgYXZhaWxhYmxlIGRlcHRoIG1pbiBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlcHRoTWluRHVyYXRpb25zLnNpemUoKSwgYmxvYk1pbkR1cmF0aW9ucy5zaXplKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwgaW50ZXJuYWxEZXB0aFNpemVzLCAmZGVwdGhTdGFsbER1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYlN0YWxsRHVyYXRpb25zKTsKKyAgICBpZiAoYmxvYlN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhTdGFsbER1cmF0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAoZGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCkgIT0gYmxvYlN0YWxsRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggc3RhbGwgZHVyYXRpb25zISAlenUgdnMuICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSwgYmxvYlN0YWxsRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGRlcHRoTWluRHVyYXRpb25zLCBibG9iTWluRHVyYXRpb25zLAorICAgICAgICAgICAgJmR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGRlcHRoU3RhbGxEdXJhdGlvbnMsIGJsb2JTdGFsbER1cmF0aW9ucywKKyAgICAgICAgICAgICZkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucyk7CisgICAgaWYgKGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpICE9IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBkeW5hbWljIGRlcHRoIHN0YWxsL21pbiBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5zaXplKCksIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzOworICAgIGF1dG8gaXREdXJhdGlvbiA9IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5iZWdpbigpOworICAgIGF1dG8gaXRTaXplID0gc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXREdXJhdGlvbiAhPSBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaW50NjRfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPigqaXRTaXplKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KCppdFNpemUpKSwgKml0RHVyYXRpb259OworICAgICAgICBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5lbmQoKSwgZW50cnksCisgICAgICAgICAgICAgICAgZW50cnkgKyA0KTsKKyAgICAgICAgaXREdXJhdGlvbisrOyBpdFNpemUrKzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllczsKKyAgICBpdER1cmF0aW9uID0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBpdFNpemUgPSBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5iZWdpbigpOworICAgIHdoaWxlIChpdER1cmF0aW9uICE9IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLmVuZCgpKSB7CisgICAgICAgIGludDY0X3QgZW50cnlbNF0gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MD4oKml0U2l6ZSkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwxPigqaXRTaXplKSksICppdER1cmF0aW9ufTsKKyAgICAgICAgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuaW5zZXJ0KGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLmVuZCgpLCBlbnRyeSwKKyAgICAgICAgICAgICAgICBlbnRyeSArIDQpOworICAgICAgICBpdER1cmF0aW9uKys7IGl0U2l6ZSsrOworICAgIH0KKworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aEVudHJpZXMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuc2l6ZSgpKTsKKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN1cHBvcnRlZENoVGFnczsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucmVzZXJ2ZShjaFRhZ3MuY291bnQgKyAzKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MuaW5zZXJ0KHN1cHBvcnRlZENoVGFncy5lbmQoKSwgY2hUYWdzLmRhdGEuaTMyLAorICAgICAgICAgICAgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50KTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgc3VwcG9ydGVkQ2hUYWdzLmRhdGEoKSwKKyAgICAgICAgICAgIHN1cHBvcnRlZENoVGFncy5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICAvLyBPdmVycmlkZSBzdGF0aWMgbWV0YWRhdGEgZm9yIE1PTk9DSFJPTUUgY2FtZXJhIHdpdGggb2xkZXIgZGV2aWNlIHZlcnNpb24KKyAgICBpZiAobVZlcnNpb24uZ2V0X21ham9yKCkgPT0gMyAmJiBtVmVyc2lvbi5nZXRfbWlub3IoKSA8IDUpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNhcCA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjYXAuZGF0YS51OFtpXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKKyAgICAgICAgICAgICAgICB1aW50OF90IGNmYSA9IEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk87CisgICAgICAgICAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQsICZjZmEsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIENPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHNLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVxS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVxS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHJlc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9HUkVFTl9TUExJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHJlc0tleXMsIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IGMuZmluZChBTkRST0lEX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMTsgaiA8IGJsRW50cnkuY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBibEVudHJ5LmRhdGEuaTMyW2pdID0gYmxFbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpyZW1vdmVBdmFpbGFibGVLZXlzKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgYywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBrZXlzLCB1aW50MzJfdCBrZXlUYWcpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBrZXlzRW50cnkgPSBjLmZpbmQoa2V5VGFnKTsKKyAgICBpZiAoa2V5c0VudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCB0YWcgJXU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIGtleVRhZywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHZLZXlzOworICAgIHZLZXlzLnJlc2VydmUoa2V5c0VudHJ5LmNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXNFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoa2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpLCBrZXlzRW50cnkuZGF0YS5pMzJbaV0pID09IGtleXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHZLZXlzLnB1c2hfYmFjayhrZXlzRW50cnkuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IGMudXBkYXRlKGtleVRhZywgdktleXMuZGF0YSgpLCB2S2V5cy5zaXplKCkpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZmlsbEhlaWNTdHJlYW1Db21iaW5hdGlvbnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRwdXRzLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogZHVyYXRpb25zLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogc3RhbGxEdXJhdGlvbnMsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpIHsKKyAgICBpZiAob3V0cHV0cyA9PSBudWxscHRyIHx8IGR1cmF0aW9ucyA9PSBudWxscHRyIHx8IHN0YWxsRHVyYXRpb25zID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBzdXBwb3J0SW5NZW1vcnlUZW1wRmlsZSA9CisgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKTsKKyAgICBpZiAoIXN1cHBvcnRJbk1lbW9yeVRlbXBGaWxlKSB7CisgICAgICAgIEFMT0dJKCIlczogTm8gSEVJQyBzdXBwb3J0IGR1ZSB0byBhYnNlbmNlIG9mIGluIG1lbW9yeSB0ZW1wIGZpbGUgc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsU3RyZWFtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpXTsKKyAgICAgICAgLy8gT25seSBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGFuZCBZVVZfODg4IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIEhFSUMKKyAgICAgICAgLy8gaW1hZ2UuCisgICAgICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAgICAgZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNpemVBdmFpbCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG91dHB1dHMtPnNpemUoKTsgais9IDQpIHsKKyAgICAgICAgICAgIGlmICgoKm91dHB1dHMpW2orMV0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdICYmCisgICAgICAgICAgICAgICAgICAgICgqb3V0cHV0cylbaisyXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0pIHsKKyAgICAgICAgICAgICAgICBzaXplQXZhaWwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaXplQXZhaWwpIGNvbnRpbnVlOworCisgICAgICAgIGludDY0X3Qgc3RhbGwgPSAwOworICAgICAgICBib29sIHVzZUhlaWMsIHVzZUdyaWQ7CisgICAgICAgIGlmIChjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKAorICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLAorICAgICAgICAgICAgICAgICZ1c2VIZWljLCAmdXNlR3JpZCwgJnN0YWxsKSkgeworICAgICAgICAgICAgaWYgKHVzZUdyaWQgIT0gKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhFSUMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaW50MzJfdCBjb25maWdbXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCAwIC8qaXNJbnB1dCovfTsKKyAgICAgICAgICAgIG91dHB1dHMtPmluc2VydChvdXRwdXRzLT5lbmQoKSwgY29uZmlnLCBjb25maWcgKyA0KTsKKworICAgICAgICAgICAgLy8gSEVJQyBtaW5GcmFtZUR1cmF0aW9uCisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhhbFN0cmVhbUR1cmF0aW9ucy5jb3VudDsgaiArPSA0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqXSA9PSBmb3JtYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqKzFdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orMl0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25bXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqKzNdfTsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25zLT5pbnNlcnQoZHVyYXRpb25zLT5lbmQoKSwgZHVyYXRpb24sIGR1cmF0aW9uKzQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhFSUMgc3RhbGxEdXJhdGlvbgorICAgICAgICAgICAgaW50NjRfdCBzdGFsbER1cmF0aW9uW10gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgc3RhbGx9OworICAgICAgICAgICAgc3RhbGxEdXJhdGlvbnMtPmluc2VydChzdGFsbER1cmF0aW9ucy0+ZW5kKCksIHN0YWxsRHVyYXRpb24sIHN0YWxsRHVyYXRpb24rNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmRlcml2ZUhlaWNUYWdzKCkgeworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGhhbEhlaWNTdXBwb3J0ID0gYy5maW5kKEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCk7CisgICAgaWYgKGhhbEhlaWNTdXBwb3J0LmNvdW50ID4gMSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgZW50cnkgY291bnQgJXp1IGZvciBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURUQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGFsSGVpY1N1cHBvcnQuY291bnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoaGFsSGVpY1N1cHBvcnQuY291bnQgPT0gMCB8fAorICAgICAgICAgICAgaGFsSGVpY1N1cHBvcnQuZGF0YS51OFswXSA9PSBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURURfRkFMU0UpIHsKKyAgICAgICAgLy8gQ2FtZXJhIEhBTCBkb2Vzbid0IHN1cHBvcnQgbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgZm9yIEhFSUMuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWF4SnBlZ0FwcHNTZWdtZW50cyA9CisgICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UKTsKKyAgICBpZiAobWF4SnBlZ0FwcHNTZWdtZW50cy5jb3VudCAhPSAxIHx8IG1heEpwZWdBcHBzU2VnbWVudHMuZGF0YS51OFswXSA9PSAwIHx8CisgICAgICAgICAgICBtYXhKcGVnQXBwc1NlZ21lbnRzLmRhdGEudThbMF0gPiAxNikgeworICAgICAgICBBTE9HRSgiJXM6IEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCBtdXN0IGJlIHdpdGhpbiBbMSwgMTZdIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFBvcHVsYXRlIEhFSUMgb3V0cHV0IGNvbmZpZ3VyYXRpb25zIGFuZCBpdHMgcmVsYXRlZCBtaW4gZnJhbWUgZHVyYXRpb24KKyAgICAvLyBhbmQgc3RhbGwgZHVyYXRpb24uCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaGVpY091dHB1dHM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaGVpY0R1cmF0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBoZWljU3RhbGxEdXJhdGlvbnM7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1pbkZyYW1lRHVyYXRpb25zID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucygmaGVpY091dHB1dHMsICZoZWljRHVyYXRpb25zLCAmaGVpY1N0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncywgbWluRnJhbWVEdXJhdGlvbnMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmlsbCBIRUlDIHN0cmVhbSBjb21iaW5hdGlvbnM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgaGVpY091dHB1dHMuZGF0YSgpLCBoZWljT3V0cHV0cy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgaGVpY0R1cmF0aW9ucy5kYXRhKCksIGhlaWNEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgaGVpY1N0YWxsRHVyYXRpb25zLmRhdGEoKSwgaGVpY1N0YWxsRHVyYXRpb25zLnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSAmJiBwaHlzaWNhbENhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICpwaHlzaWNhbENhbWVyYUlkcyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmE7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmE7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgeworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBjYW1lcmFJZCkgeworICAgICAgICAgICAgICAgIC8vIGNhbWVyYUlkIGlzIGZvdW5kIGluIHB1YmxpYyBjYW1lcmEgSURzIGFkdmVydGlzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZpbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIGlkICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsSWRzOworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5iZWdpbigpLCBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCkgIT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogV3JvbmcgZGV2aWNlVmVyc2lvbiAleCBmb3IgaGlkZGVuUGh5c2ljYWxDYW1lcmFJZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbiwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsIGJvb2wgZXhwZWN0ZWQpIHsKQEAgLTQ0NSw5ICsxMTA5LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0KLSAgICAgICAgICAgIG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIGludGVyZmFjZSwgdGhpcyk7Ci0gICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKCk7CisgICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPSBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCB0aGlzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBwcm92aWRlckluZm8tPmluaXRpYWxpemUoaW50ZXJmYWNlLCBtRGV2aWNlU3RhdGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC00NTgsNiArMTEyMSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6cmVtb3ZlUHJvdmlkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiByZW1vdmVkRGV2aWNlSWRzOwogICAgIHN0YXR1c190IHJlcyA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtNDk4LDI3ICsxMTYyLDM2IEBACiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpQcm92aWRlckluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCiAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcikgOgogICAgICAgICBtUHJvdmlkZXJOYW1lKHByb3ZpZGVyTmFtZSksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKICAgICAgICAgbVByb3ZpZGVyVGFnaWQoZ2VuZXJhdGVWZW5kb3JUYWdJZChwcm92aWRlck5hbWUpKSwKICAgICAgICAgbVVuaXF1ZURldmljZUNvdW50KDApLAogICAgICAgICBtTWFuYWdlcihtYW5hZ2VyKSB7CiAgICAgKHZvaWQpIG1NYW5hZ2VyOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgpIHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplKAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IGN1cnJlbnREZXZpY2VTdGF0ZSkgewogICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisKKyAgICAvLyBEZXRlcm1pbmUgbWlub3IgdmVyc2lvbgorICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIG1NaW5vclZlcnNpb24gPSA1OworICAgIH0gZWxzZSB7CisgICAgICAgIG1NaW5vclZlcnNpb24gPSA0OworICAgIH0KKwogICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCiAgICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbUludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igc2V0dGluZyB1cCBjYWxsYmFja3Mgd2l0aCBjYW1lcmEgcHJvdmlkZXIgJyVzJzogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTUzMCw3ICsxMjAzLDcgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAotICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gbUludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOworICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CiAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTU0MCwxNSArMTIxMyw0MiBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKICAgICB9CiAKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIC8vIFNhdmUgSEFMIHJlZmVyZW5jZSBpbmRlZmluaXRlbHkKKyAgICAgICAgbVNhdmVkSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRldmljZSBzdGF0ZSBmb3IgJXM6IDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoY3VycmVudERldmljZVN0YXRlKTsKKworICAgIHJlcyA9IHNldFVwVmVuZG9yVGFncygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIC8vIEdldCBpbml0aWFsIGxpc3Qgb2YgY2FtZXJhIGRldmljZXMsIGlmIGFueQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCAmZGV2aWNlc10oCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgdGhpcywgJmRldmljZXNdKAogICAgICAgICAgICAgU3RhdHVzIGlkU3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKSB7CiAgICAgICAgIHN0YXR1cyA9IGlkU3RhdHVzOwogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FtZXJhRGV2aWNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhjYW1lcmFEZXZpY2VOYW1lc1tpXSk7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG5hbWUgOiBjYW1lcmFEZXZpY2VOYW1lcykgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZURldmljZU5hbWUobmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBwYXJzaW5nIGRldmljZU5hbWU6ICVzOiAlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CkBAIC01NjIsMTEgKzEyNjIsMjQgQEAKICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KIAorICAgIHJldCA9IGludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCisgICAgICAgIFt0aGlzXShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbUlzUmVtb3RlID0gaW50ZXJmYWNlLT5pc1JlbW90ZSgpOworCiAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CiAgICAgZm9yIChhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGlkOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5ULCAmaWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhZGREZXZpY2UoZGV2aWNlLCBjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZW51bWVyYXRlIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNTgxLDYgKzEyOTQsNTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2NvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnRQcm92aWRlckludGVyZmFjZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCJSZXF1ZXN0IHRvIHN0YXJ0IGNhbWVyYSBwcm92aWRlcjogJXMiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIGlmIChtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbVNhdmVkSW50ZXJmYWNlOworICAgIH0KKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIEFMT0dFKCJCYWQgcHJvdmlkZXIgc3RhdGUhIFNob3VsZCBub3QgYmUgaGVyZSBvbiBhIG5vbi1sYXp5IEhBTCEiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBpbnRlcmZhY2UgPSBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSBIQUwgcHJvdmlkZXIgbmVlZHMgcmVzdGFydCwgY2FsbGluZyBnZXRTZXJ2aWNlKCVzKSIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIGludGVyZmFjZSA9IG1NYW5hZ2VyLT5tU2VydmljZVByb3h5LT5nZXRTZXJ2aWNlKG1Qcm92aWRlck5hbWUpOworICAgICAgICBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOworICAgICAgICBpZiAoIWxpbmtlZC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gbGlua2luZyB0byBjYW1lcmEgcHJvdmlkZXIgJyVzJyBkZWF0aDogJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmICghbGlua2VkKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBsaW5rIHRvIHByb3ZpZGVyICclcycgZGVhdGggbm90aWZpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogSW5pdGlhbCBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCAlIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZUludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQ2FtZXJhIHByb3ZpZGVyICglcykgYWxyZWFkeSBpbiB1c2UuIFJlLXVzaW5nIGluc3RhbmNlLiIsIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKIGNvbnN0IHN0ZDo6c3RyaW5nJiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0VHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbVR5cGU7CiB9CkBAIC02MzEsNyArMTM5MSwxMiBAQAogCiAgICAgbVVuaXF1ZUNhbWVyYUlkcy5pbnNlcnQoaWQpOwogICAgIGlmIChpc0FQSTFDb21wYXRpYmxlKSB7Ci0gICAgICAgIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAvLyBhZGREZXZpY2UgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBmb3IgdGhlIHNhbWUgY2FtZXJhIGlkIGlmIEhBTAorICAgICAgICAvLyBzdXBwb3J0cyBvcGVuTGVnYWN5LgorICAgICAgICBpZiAoc3RkOjpmaW5kKG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5iZWdpbigpLCBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgaWQpID09IG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocGFyc2VkSWQgIT0gbnVsbHB0cikgewpAQCAtNjU2LDggKzE0MjEsMTAgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgY29uc3QgewotICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi40LCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKKyAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuJWQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgIG1Jc1JlbW90ZSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKICAgICAgICAgICAgIG1EZXZpY2VzLnNpemUoKSk7CiAKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CkBAIC02OTgsNiArMTQ2NSwyNCBAQAogICAgICAgICAgICAgaW5mbzIuZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBEdW1wIGNoYXJhY3RlcmlzdGljcyBvZiBub24tc3RhbmRhbG9uZSBwaHlzaWNhbCBjYW1lcmEKKyAgICAgICAgaWYgKGRldmljZS0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZS0+bVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBwaHlzaWNhbCBpZCBpcyBhbiBpbmRlcGVuZGVudCBjYW1lcmEKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsSW5mbzsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2UtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCAmcGh5c2ljYWxJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIgIFBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6XG4iLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJbmZvLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgSEFMIGRldmljZSAlcyAodiVkLiVkKSBkdW1wU3RhdGU6ID09XG4iLCBkZXZpY2UtPm1OYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+ZHVtcFN0YXRlKGZkKTsKQEAgLTc2Nyw2ICsxNTUyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRvcmNoU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTiAhPSBuZXdTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzk1LDE1ICsxNTgzLDc1IEBACiAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIGlmIChtVmVuZG9yVGFnRGVzY3JpcHRvciAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gT0s7CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKKyAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOworICAgICAgICAgICAgfQorICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCisgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgorICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZSkgeworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld0RldmljZVN0YXRlOworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgogICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgewogICAgIFN0YXR1cyBzdGF0dXM7CiAKICAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9Ci0gICAgICAgICAgICBnZXREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOworICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOwogICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CiAKICAgICBDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OwpAQCAtODMwLDEzICsxNjc4LDEzIEBACiAgICAgfQogCiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPigKLSAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlKSk7CisgICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCB0aGlzLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7CiB9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzcDxJbnRlcmZhY2VUPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBJbnRlcmZhY2VUOjp2ZXJzaW9uLmdldF9tYWpvcigpKTsKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTg0NCwxMiArMTY5MiwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC04NjksMTIgKzE3MjEsMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtODk1LDYgKzE3NTEsMTggQEAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjp+RGV2aWNlSW5mbygpIHt9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CitzcDxJbnRlcmZhY2VUPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoKSB7CisgICAgc3A8SW50ZXJmYWNlVD4gZGV2aWNlOworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIGRldmljZSA9IG1QYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4obU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IChJbnRlcmZhY2VUICopIG1TYXZlZEludGVyZmFjZS5nZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLAogICAgICAgICBib29sIGVuYWJsZWQpIHsKICAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOwpAQCAtOTA1LDMwICsxNzczLDMxIEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MSwgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICAvLyBSZXF1aXJlcyBwb3dlcmluZyBvbiB0aGUgY2FtZXJhIGRldmljZQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvcGVuIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CiAgICAgICAgICAgICAgICAgbURlZmF1bHRQYXJhbWV0ZXJzLnVuZmxhdHRlbihTdHJpbmc4KHBhcm1zLmNfc3RyKCkpKTsKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHJlYWRpbmcgY2FtZXJhIGRldmljZSAlcyBwYXJhbXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29uc3QgY2hhciAqZmxhc2hNb2RlID0KQEAgLTkzNywyNyArMTgwNiw0MyBAQAogICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKICAgICB9CiAKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgIHN0YXR1c190IHJlcyA9IGNhY2hlQ2FtZXJhSW5mbyhpbnRlcmZhY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY2FjaGUgQ2FtZXJhSW5mbyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPmNsb3NlKCk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2xvc2luZyBjYW1lcmEgZGV2aWNlICVzIGFmdGVyIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiAgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6On5EZXZpY2VJbmZvMSgpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpnZXRDYW1lcmFJbmZvKAogICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgewogICAgIGlmIChpbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgKmluZm8gPSBtSW5mbzsKKyAgICByZXR1cm4gT0s7Cit9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Y2FjaGVDYW1lcmFJbmZvKAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+IGludGVyZmFjZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNJbmZvOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY0luZm8gPSBjYW1JbmZvOwogICAgICAgICAgICAgfSk7CkBAIC05NzIsMjcgKzE4NTcsMzEgQEAKIAogICAgIHN3aXRjaChjSW5mby5mYWNpbmcpIHsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6QkFDSzoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkVYVEVSTkFMOgogICAgICAgICAgICAgLy8gTWFwIGV4dGVybmFsIHRvIGZyb250IGZvciBsZWdhY3kgQVBJCiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkZST05UOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIiVzOiBEZXZpY2UgJXM6IFVua25vd24gY2FtZXJhIGZhY2luZzogJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBjSW5mby5mYWNpbmcpOwotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgfQotICAgIGluZm8tPm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CisgICAgbUluZm8ub3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CiAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgIGlmICghcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTAwNCwxNCArMTg5MywxNSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCiAgICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKQEAgLTEwMzAsMTUgKzE5MjAsMzUgQEAKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgotICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gc3RhdCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCisgICAgICAgICAgICAgICAgc3RhdCk7CisgICAgfQorICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CiAgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKQEAgLTEwNDcsMTIgKzE5NTcsNzEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtSGFzRmxhc2hVbml0ID0gZmFsc2U7CiAgICAgfQorCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoIWNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dWKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byB2ZXJzaW9uIDMuNSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29udmVydGVkIElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGhpZGxJZChpZCk7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaWQsIHRoaXNdKFN0YXR1cyBzLCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0gPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6On5EZXZpY2VJbmZvMygpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFJbmZvKApAQCAtMTEwMywxMCArMjA3MiwxNCBAQAogICAgIHJldHVybiBpc0JhY2t3YXJkQ29tcGF0aWJsZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CiAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgYXV0byByZXQgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMTIyLDYgKzIwOTUsNjEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLCBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgaWYgKGNoYXJhY3RlcmlzdGljcyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChwaHlzaWNhbENhbWVyYUlkKSA9PQorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmF0KHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSB7CisKKyAgICBjb25zdCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+IGludGVyZmFjZSA9CisgICAgICAgICAgICB0aGlzLT5zdGFydERldmljZUludGVyZmFjZTxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzOworICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgIGF1dG8gcmV0ID0gIGludGVyZmFjZV8zXzUtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBzdGQ6OnN0cmluZyAqdHlwZSwgdWludDMyX3QgKmlkKSB7CiAgICAgLy8gRm9ybWF0IG11c3QgYmUgIjx0eXBlPi88aWQ+IgpAQCAtMTM2NCw3ICsyMzkyLDcgQEAKIAogCiBzdGF0dXNfdCBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKSB7CiAKQEAgLTEzOTIsNyArMjQyMCw3IEBACiAKICAgICBpbnQgaWR4ID0gMDsKICAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CisgICAgICAgIGNvbnN0IGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKICAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CiAgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CkBAIC0xNDUzLDQ5ICsyNDgxLDY5IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezQsMH0pOwotICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs1LDB9KTsKKyAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICB9CiAKLSAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgLy8gRmluZCBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsIGNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE5BTUVfTk9UX0ZPVU5EKSByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZCgKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZXZpY2VJZHMpIGNvbnN0CiB7Ci0gICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiByZW1vdmVkSWRzOworICAgIC8vIE1hcCBiZXR3ZWVuIGNhbWVyYSBmYWNpbmcgYW5kIGNhbWVyYSBJRHMgcmVsYXRlZCB0byBsb2dpY2FsIGNhbWVyYS4KKyAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4+IGlkQ29tYm9zOwogCisgICAgLy8gQ29sbGVjdCBhbGwgbG9naWNhbCBhbmQgaXRzIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhIElEcyBmb3IgZWFjaAorICAgIC8vIGZhY2luZy4KICAgICBmb3IgKGF1dG8mIGRldmljZUlkIDogZGV2aWNlSWRzKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIGluZm87Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChkZXZpY2VJZCwgJmluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIGlkICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChkZXZpY2VJZCk7CisgICAgICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIGNvbnRpbnVlOwogCi0gICAgICAgIC8vIGlkQ29tYm8gY29udGFpbnMgdGhlIGlkcyBvZiBhIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgY2FtZXJhcwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRDb21ibzsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoaW5mbywgJmlkQ29tYm8pOwotICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZENvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CiAKKyAgICAgICAgLy8gY29tYm8gY29udGFpbnMgdGhlIGlkcyBvZiBhIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tYm8gPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHM7CisgICAgICAgIGNvbWJvLnB1c2hfYmFjayhkZXZpY2VJZCk7CisKKyAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gaW5mbzsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhSW5mbygmaW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmVhZGluZyBjYW1lcmEgaW5mbzogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZENvbWJvc1tpbmZvLmZhY2luZ10uaW5zZXJ0KGNvbWJvLmJlZ2luKCksIGNvbWJvLmVuZCgpKTsKKyAgICB9CisKKyAgICAvLyBPbmx5IGV4cG9zZSBvbmUgY2FtZXJhIElEIHBlciBmYWNpbmcgZm9yIGFsbCBsb2dpY2FsIGFuZCB1bmRlcmx5aW5nCisgICAgLy8gcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICBmb3IgKGF1dG8mIHIgOiBpZENvbWJvcykgeworICAgICAgICBhdXRvJiByZW1vdmVkSWRzID0gci5zZWNvbmQ7CiAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2VJZHMpIHsKLSAgICAgICAgICAgIGF1dG8gZm91bmRJZCA9IHN0ZDo6ZmluZChpZENvbWJvLmJlZ2luKCksIGlkQ29tYm8uZW5kKCksIGlkKTsKLSAgICAgICAgICAgIGlmIChmb3VuZElkID09IGlkQ29tYm8uZW5kKCkpIHsKKyAgICAgICAgICAgIGF1dG8gZm91bmRJZCA9IHN0ZDo6ZmluZChyZW1vdmVkSWRzLmJlZ2luKCksIHJlbW92ZWRJZHMuZW5kKCksIGlkKTsKKyAgICAgICAgICAgIGlmIChmb3VuZElkID09IHJlbW92ZWRJZHMuZW5kKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWRDb21iby5lcmFzZShmb3VuZElkKTsKLSAgICAgICAgICAgIHJlbW92ZWRJZHMuaW5zZXJ0KGlkQ29tYm8uYmVnaW4oKSwgaWRDb21iby5lbmQoKSk7CisgICAgICAgICAgICByZW1vdmVkSWRzLmVyYXNlKGZvdW5kSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgZGV2aWNlSWRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGRldmljZUlkcy5iZWdpbigpLCBkZXZpY2VJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgWyZyZW1vdmVkSWRzXShjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVkSWRzLmZpbmQocykgIT0gcmVtb3ZlZElkcy5lbmQoKTt9KSwKKyAgICAgICAgICAgICAgICBkZXZpY2VJZHMuZW5kKCkpOwogICAgIH0KLQotICAgIGRldmljZUlkcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihkZXZpY2VJZHMuYmVnaW4oKSwgZGV2aWNlSWRzLmVuZCgpLAotICAgICAgICAgICAgWyZyZW1vdmVkSWRzXShjb25zdCBzdGQ6OnN0cmluZyYgcykge3JldHVybiByZW1vdmVkSWRzLmZpbmQocykgIT0gcmVtb3ZlZElkcy5lbmQoKTt9KSwKLSAgICAgICAgICAgIGRldmljZUlkcy5lbmQoKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAppbmRleCBiOGI4YjhjLi5hNDJmYjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSAogCiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0yNyw4ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi40L0lDYW1lcmFQcm92aWRlci5oPgotLy8jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi40L0lDYW1lcmFQcm92aWRlckNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNS9JQ2FtZXJhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTm90aWZpY2F0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIApAQCAtMTEwLDYgKzExMSwxNCBAQAogICAgIH07CiAKICAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBtb2RlIGEgY2FtZXJhIGRldmljZSBpcyBjdXJyZW50bHkgaW4KKyAgICAgKi8KKyAgICBlbnVtIGNsYXNzIERldmljZU1vZGUgeworICAgICAgICBUT1JDSCwKKyAgICAgICAgQ0FNRVJBCisgICAgfTsKKworICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgdGhlIG1hbmFnZXIgYW5kIGdpdmUgaXQgYSBzdGF0dXMgbGlzdGVuZXI7IG9wdGlvbmFsbHkgYWNjZXB0cyBhIHNlcnZpY2UKICAgICAgKiBpbnRlcmFjdGlvbiBwcm94eS4KICAgICAgKgpAQCAtMTY2LDYgKzE3NSwxMyBAQAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgorICAgICAqLworICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBkZXZpY2UgaW50ZXJmYWNlIHZlcnNpb24gZm9yIHRoaXMgSUQKICAgICAgKi8KICAgICBzdGF0dXNfdCBnZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCkBAIC0xNzQsNyArMTkwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydCBzZXRUb3JjaE1vZGUgQVBJLgogICAgICAqLwotICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpOworICAgIGJvb2wgc3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNobGlnaHQgb24gYSBnaXZlbiBjYW1lcmEgZGV2aWNlLgpAQCAtMTg5LDYgKzIwNSwxMiBAQAogICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOwogCiAgICAgLyoqCisgICAgICogSW5mb3JtIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIGFib3V0IGEgZGV2aWNlIHN0YXRlIGNoYW5nZSwgc3VjaCBhcyBmb2xkaW5nIG9yIHVuZm9sZGluZworICAgICAqLworICAgIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld1N0YXRlKTsKKworICAgIC8qKgogICAgICAqIE9wZW4gYW4gYWN0aXZlIHNlc3Npb24gdG8gYSBjYW1lcmEgZGV2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBmdWxseSBwb3dlcnMgb24gdGhlIGNhbWVyYSBkZXZpY2UgaGFyZHdhcmUsIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEKQEAgLTIwNSw2ICsyMjcsMTcgQEAKICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pOwogCiAgICAgLyoqCisgICAgICogU2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgb3IgdG9yY2ggY2xpZW50CisgICAgICovCisgICAgdm9pZCBzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcik7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhhdCB0aGUgY2FtZXJhIG9yIHRvcmNoIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIGNsaWVudAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCisgICAgLyoqCiAgICAgICogSVNlcnZpY2VOb3RpZmljYXRpb246Om9uUmVnaXN0cmF0aW9uCiAgICAgICogSW52b2tlZCBieSB0aGUgaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIHdoZW4gYSBuZXcgY2FtZXJhIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKICAgICAgKi8KQEAgLTIzMSwxMiArMjY0LDE1IEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEwMDAsMH0pIGNvbnN0OwogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSB3aXRoIHN0YXRpY0luZm8gaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCisgICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCiAgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMuCiAgICAgICovCi0gICAgc3RhdGljIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIGJvb2wgaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7CisgICAgYm9vbCBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQga0RlcHRoQVJUb2xlcmFuY2U7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwpAQCAtMjQ2LDIyICsyODIsNTcgQEAKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OwogCisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgLy8gbVByb3ZpZGVyTGlmZWN5Y2xlTG9jayBpcyBsb2NrZWQgZHVyaW5nIG9uUmVnaXN0cmF0aW9uIGFuZCByZW1vdmVQcm92aWRlcgorICAgIG11dGFibGUgc3RkOjptdXRleCBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrOworCiAgICAgc3RhdGljIEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk7CiAKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIGNhbWVyYQorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciB0b3JjaAorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCisgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOworCiAgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6CiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKICAgICB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1JbnRlcmZhY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOworICAgICAgICBpbnQgbU1pbm9yVmVyc2lvbjsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gbVZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGJvb2wgbVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgYm9vbCBtSXNSZW1vdGU7CisKKyAgICAgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG1EZXZpY2VTdGF0ZTsKKworICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtU2F2ZWRJbnRlcmZhY2U7CiAKICAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOwogICAgICAgICB+UHJvdmlkZXJJbmZvKCk7CiAKLSAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKIAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZSgpIGNvbnN0OwogCkBAIC0yODMsODQgKzM1NCwxNzMgQEAKICAgICAgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgb3ZlcnJpZGU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciB0aGlzIHByb3ZpZGVyCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5IHByb3ZpZGVyIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VTdGF0ZSk7CisKICAgICAgICAgLy8gQmFzaWMgZGV2aWNlIGluZm9ybWF0aW9uLCBjb21tb24gdG8gYWxsIGNhbWVyYSBkZXZpY2VzCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgLy8gRnVsbCBpbnN0YW5jZSBuYW1lCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uOwogICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgICAgICBib29sIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOworICAgICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gbUluZm87CisgICAgICAgICAgICBzcDxJQmFzZT4gbVNhdmVkSW50ZXJmYWNlOworICAgICAgICAgICAgYm9vbCBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhID0gZmFsc2U7CiAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7CiAKKyAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gbVBhcmVudFByb3ZpZGVyOworCiAgICAgICAgICAgICBib29sIGhhc0ZsYXNoVW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGbGFzaFVuaXQ7IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqIC8qc3RhdHVzKi8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0KSA6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyKSA6CiAgICAgICAgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtSWQoaWQpLCBtVmVyc2lvbih2ZXJzaW9uKSwgbVByb3ZpZGVyVGFnaWQodGFnSWQpLAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCisgICAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLCBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAotICAgICAgICAgICAgICAgICAgICBtSGFzRmxhc2hVbml0KGZhbHNlKSB7fQorICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtSGFzRmxhc2hVbml0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCk7CiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGJvb2wgbUhhc0ZsYXNoVW5pdDsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbVB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KICAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLCBib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlRm9yRGV2aWNlKGJvb2wgZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHNhdmUgdGhlIElDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2FzCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoKSwgd2hpY2ggZG9lcyBzYXZlIGl0LgorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShpbnRlcmZhY2UsIGVuYWJsZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4+IG1EZXZpY2VzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIC8vIFRoZSBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzIHB1Ymxpc2hlZCBieSB0aGUgY2FtZXJhIHByb3ZpZGVyLgorICAgICAgICAvLyBDdXJyZW50bHkgbG9naWNhbCBtdWx0aS1jYW1lcmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWcgY2FtZXJhLgorICAgICAgICAvLyBBbmQgd2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMKKyAgICAgICAgLy8gYWR2ZXJ0aXNlZCBieSB0aGUgcHJvdmlkZXIsIGFuZCB0byBkaXN0aW5ndWlzaCBhZ2FpbnN0ICJoaWRkZW4iCisgICAgICAgIC8vIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgLy8gSEFMdjEtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzEgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzMiBtRGVmYXVsdFBhcmFtZXRlcnM7CisgICAgICAgICAgICBzdGF0dXNfdCBjYWNoZUNhbWVyYUluZm8oc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMygpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHZvaWQgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBkZXB0aER1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGJsb2JEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkeW5hbWljRGVwdGhEdXJhdGlvbnMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0aWMgYm9vbCBpc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgYmxvYlNpemVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGRlcHRoU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqZHluYW1pY0RlcHRoU2l6ZXMgLypvdXQqLywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICppbnRlcm5hbERlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdmFpbGFibGVLZXlzKENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleVRhZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucyhzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIGR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIHN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtRHVyYXRpb25zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlcml2ZUhlaWNUYWdzKCk7CiAgICAgICAgIH07CiAKICAgICBwcml2YXRlOgpAQCAtMzc4LDExICs1MzgsMTEgQEAKICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPiBpbml0aWFsaXplRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKTsKIAogICAgICAgICAvLyBIZWxwZXIgZm9yIGluaXRpYWxpemVEZXZpY2VJbmZvIHRvIHVzZSB0aGUgcmlnaHQgQ2FtZXJhUHJvdmlkZXIgZ2V0IG1ldGhvZC4KICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgc3A8SW50ZXJmYWNlVD4gZ2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKyAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOwogCiAgICAgICAgIC8vIFBhcnNlIHByb3ZpZGVyIGluc3RhbmNlIG5hbWUgZm9yIHR5cGUgYW5kIGlkCiAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKQEAgLTQxNiw2ICs1NzYsMTQgQEAKIAogICAgIHN0ZDo6dmVjdG9yPHNwPFByb3ZpZGVySW5mbz4+IG1Qcm92aWRlcnM7CiAKKyAgICB2b2lkIGFkZFByb3ZpZGVyVG9NYXAoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciwKKyAgICAgICAgICAgIGJvb2wgaXNUb3JjaFVzYWdlKTsKKyAgICB2b2lkIHJlbW92ZUNhbWVyYUlkRnJvbU1hcCgKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gJm1hcCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZXZpY2VTdGF0dXNUb1N0cmluZygKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMmKTsKICAgICBzdGF0aWMgY29uc3QgY2hhciogdG9yY2hTdGF0dXNUb1N0cmluZygKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzkwZGUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLURlcHRoUGhvdG9Qcm9jZXNzb3IiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vCisKKyNpbmNsdWRlICJEZXB0aFBob3RvUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2NhbWVyYS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhcy5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RpbWVuc2lvbi5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZHluYW1pY19kZXB0aC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9pbnQuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Bvc2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGVzLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLXN5c3RlbS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0V4aWZVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX2RhdGEuaD4KKyNpbmNsdWRlIDx4bXBtZXRhL3htcF93cml0ZXIuaD4KKwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNvbnRhaW5lcjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoRm9ybWF0OwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXA7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoVW5pdHM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2VQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEaW1lbnNpb247Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQb3NlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlByb2ZpbGVzOworCit0ZW1wbGF0ZTw+CitzdHJ1Y3Qgc3RkOjpkZWZhdWx0X2RlbGV0ZTxqcGVnX2NvbXByZXNzX3N0cnVjdD4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoanBlZ19jb21wcmVzc19zdHJ1Y3QqIGNpbmZvKSBjb25zdCB7CisgICAgICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcyhjaW5mbyk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvLyBEZXB0aCBzYW1wbGVzIHdpdGggbG93IGNvbmZpZGVuY2UgY2FuIHNrZXcgdGhlCisvLyBuZWFyL2ZhciB2YWx1ZXMgYW5kIGltcGFjdCB0aGUgcmFuZ2UgaW52ZXJzZSBjb2RpbmcuCitzdGF0aWMgY29uc3QgZmxvYXQgQ09ORklERU5DRV9USFJFU0hPTEQgPSAuMTVmOworCitFeGlmT3JpZW50YXRpb24gZ2V0RXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSkgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlclNpemUgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgIH0KKworICAgIGF1dG8gZXhpZkRhdGEgPSBleGlmX2RhdGFfbmV3KCk7CisgICAgZXhpZl9kYXRhX2xvYWRfZGF0YShleGlmRGF0YSwganBlZ0J1ZmZlciwganBlZ0J1ZmZlclNpemUpOworICAgIEV4aWZFbnRyeSAqb3JpZW50YXRpb24gPSBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sCisgICAgICAgICAgICBFWElGX1RBR19PUklFTlRBVElPTik7CisgICAgaWYgKChvcmllbnRhdGlvbiA9PSBudWxscHRyKSB8fCAob3JpZW50YXRpb24tPnNpemUgIT0gc2l6ZW9mKEV4aWZTaG9ydCkpKSB7CisgICAgICAgIEFMT0dWKCIlczogT3JpZW50YXRpb24gRVhJRiBlbnRyeSBpbnZhbGlkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICB9CisKKyAgICBhdXRvIG9yaWVudGF0aW9uVmFsdWUgPSBleGlmX2dldF9zaG9ydChvcmllbnRhdGlvbi0+ZGF0YSwgZXhpZl9kYXRhX2dldF9ieXRlX29yZGVyKGV4aWZEYXRhKSk7CisgICAgRXhpZk9yaWVudGF0aW9uIHJldDsKKyAgICBzd2l0Y2ggKG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgcmV0ID0gc3RhdGljX2Nhc3Q8RXhpZk9yaWVudGF0aW9uPiAob3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBFWElGIG9yaWVudGF0aW9uIHZhbHVlOiAlZCwgZGVmYXVsdGluZyB0byAwIGRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZEYXRhKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IGVuY29kZUdyYXlzY2FsZUpwZWcoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCB1aW50OF90ICppbiwgdm9pZCAqb3V0LAorICAgICAgICBjb25zdCBzaXplX3QgbWF4T3V0U2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwKKyAgICAgICAgc2l6ZV90ICZhY3R1YWxTaXplKSB7CisgICAgc3RhdHVzX3QgcmV0OworICAgIC8vIGxpYmpwZWcgaXMgYSBDIGxpYnJhcnkgc28gd2UgdXNlIEMtc3R5bGUgImluaGVyaXRhbmNlIiBieQorICAgIC8vIHB1dHRpbmcgbGlianBlZydzIGpwZWdfZGVzdGluYXRpb25fbWdyIGZpcnN0IGluIG91ciBjdXN0b20KKyAgICAvLyBzdHJ1Y3QuIFRoaXMgYWxsb3dzIHVzIHRvIGNhc3QganBlZ19kZXN0aW5hdGlvbl9tZ3IqIHRvCisgICAgLy8gQ3VzdG9tSnBlZ0Rlc3RNZ3IqIHdoZW4gd2UgZ2V0IGl0IHBhc3NlZCB0byB1cyBpbiBhIGNhbGxiYWNrLgorICAgIHN0cnVjdCBDdXN0b21KcGVnRGVzdE1nciA6IHB1YmxpYyBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgICAgICAgIEpPQ1RFVCAqbUJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IG1CdWZmZXJTaXplOworICAgICAgICBzaXplX3QgbUVuY29kZWRTaXplOworICAgICAgICBib29sIG1TdWNjZXNzOworICAgIH0gZG1ncjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxqcGVnX2NvbXByZXNzX3N0cnVjdD4gY2luZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPGpwZWdfY29tcHJlc3Nfc3RydWN0PigpOworICAgIGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsaW5nIHdpdGggc3RhbmRhcmQgY2FsbGJhY2tzLCBidXQKKyAgICAvLyB0aGVuIG92ZXJyaWRlIG91dHB1dF9tZXNzYWdlICh0byBwcmludCB0byBBTE9HKSBhbmQKKyAgICAvLyBlcnJvcl9leGl0IHRvIHNldCBhIGZsYWcgYW5kIHByaW50IGEgbWVzc2FnZSBpbnN0ZWFkCisgICAgLy8gb2Yga2lsbGluZyB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICBjaW5mby0+ZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworCisgICAgY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKworICAgICAgICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sIGJ1ZmZlcik7CisgICAgICAgIEFMT0dFKCJsaWJqcGVnIGVycm9yOiAlcyIsIGJ1ZmZlcik7CisgICAgfTsKKworICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkoY2luZm8pOworICAgICAgICBpZihjaW5mby0+Y2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGF1dG8gJiBkbWdyID0gKnN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyKj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgICAgICAgICAgIGRtZ3IubVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBpbml0aWFsaXplZCBzb21lIGNhbGxiYWNrcywgbGV0J3MgY3JlYXRlIG91ciBjb21wcmVzc29yCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoY2luZm8uZ2V0KCkpOworICAgIGRtZ3IubUJ1ZmZlciA9IHN0YXRpY19jYXN0PEpPQ1RFVCo+KG91dCk7CisgICAgZG1nci5tQnVmZmVyU2l6ZSA9IG1heE91dFNpemU7CisgICAgZG1nci5tRW5jb2RlZFNpemUgPSAwOworICAgIGRtZ3IubVN1Y2Nlc3MgPSB0cnVlOworICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmZG1ncik7CisKKyAgICAvLyBUaGVzZSBsYW1iZGFzIGJlY29tZSBDLXN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcyBwZXIgQysrMTEgc3BlYworICAgIC8vIG1heSBub3QgY2FwdHVyZSBhbnl0aGluZy4KKyAgICBkbWdyLmluaXRfZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5uZXh0X291dHB1dF9ieXRlID0gZG1nci5tQnVmZmVyOworICAgICAgICBkbWdyLmZyZWVfaW5fYnVmZmVyID0gZG1nci5tQnVmZmVyU2l6ZTsKKyAgICAgICAgQUxPR1YoIiVzOiVkIGpwZWcgc3RhcnQ6ICVwIFslenVdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tQnVmZmVyLCBkbWdyLm1CdWZmZXJTaXplKTsKKyAgICB9OworCisgICAgZG1nci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gW10oal9jb21wcmVzc19wdHIgY2luZm8gX191bnVzZWQpIHsKKyAgICAgICAgQUxPR1YoIiVzOiVkIE91dCBvZiBidWZmZXIiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIGRtZ3IudGVybV9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IGRtZ3IubUJ1ZmZlclNpemUgLSBkbWdyLmZyZWVfaW5fYnVmZmVyOworICAgICAgICBBTE9HVigiJXM6JWQgRG9uZSB3aXRoIGpwZWc6ICV6dSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUVuY29kZWRTaXplKTsKKyAgICB9OworICAgIGNpbmZvLT5kZXN0ID0gc3RhdGljX2Nhc3Q8c3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyKj4oJmRtZ3IpOworICAgIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHRzIGFuZCB0aGVuIG92ZXJyaWRlIHdoYXQgd2Ugd2FudAorICAgIGpwZWdfc2V0X2RlZmF1bHRzKGNpbmZvLmdldCgpKTsKKworICAgIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8uZ2V0KCksIGpwZWdRdWFsaXR5LCAxKTsKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLmdldCgpLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICBjaW5mby0+cmF3X2RhdGFfaW4gPSAwOworICAgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKworICAgIGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLT5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworCisgICAganBlZ19zdGFydF9jb21wcmVzcyhjaW5mby5nZXQoKSwgVFJVRSk7CisKKyAgICBpZiAoZXhpZk9yaWVudGF0aW9uICE9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgICAgICB1dGlscy0+aW5pdGlhbGl6ZUVtcHR5KCk7CisgICAgICAgIHV0aWxzLT5zZXRJbWFnZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlSGVpZ2h0KGhlaWdodCk7CisgICAgICAgIHV0aWxzLT5zZXRPcmllbnRhdGlvblZhbHVlKGV4aWZPcmllbnRhdGlvbik7CisKKyAgICAgICAgaWYgKHV0aWxzLT5nZW5lcmF0ZUFwcDEoKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogZXhpZkJ1ZmZlciA9IHV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplX3QgZXhpZkJ1ZmZlclNpemUgPSB1dGlscy0+Z2V0QXBwMUxlbmd0aCgpOworICAgICAgICAgICAganBlZ193cml0ZV9tYXJrZXIoY2luZm8uZ2V0KCksIEpQRUdfQVBQMCArIDEsIHN0YXRpY19jYXN0PGNvbnN0IEpPQ1RFVCo+KGV4aWZCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBleGlmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBBcHAxIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IGkrKykgeworICAgICAgICBhdXRvIGN1cnJlbnRSb3cgID0gc3RhdGljX2Nhc3Q8SlNBTVBST1c+KGluICsgaSp3aWR0aCk7CisgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKGNpbmZvLmdldCgpLCAmY3VycmVudFJvdywgLypudW1fbGluZXMqLzEpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKGNpbmZvLmdldCgpKTsKKworICAgIGFjdHVhbFNpemUgPSBkbWdyLm1FbmNvZGVkU2l6ZTsKKyAgICBpZiAoZG1nci5tU3VjY2VzcykgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2lubGluZSB2b2lkIHVucGFja0RlcHRoMTYodWludDE2X3QgdmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICAvLyBBbmRyb2lkIGRlbnNlbHkgcGFja2VkIGRlcHRoIG1hcC4gVGhlIHVuaXRzIGZvciB0aGUgcmFuZ2UgYXJlIGluCisgICAgLy8gbWlsbGltZXRlcnMgYW5kIG5lZWQgdG8gYmUgc2NhbGVkIHRvIG1ldGVycy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSAzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSBkYXRhIG5lZWRzIHRvIGJlIGFkZGl0aW9uYWxseSBub3JtYWxpemVkIHdpdGgKKyAgICAvLyB2YWx1ZXMgMS4wZiwgMC4wZiByZXByZXNlbnRpbmcgbWF4aW11bSBhbmQgbWluaW11bSBjb25maWRlbmNlCisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIGF1dG8gcG9pbnQgPSBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUgJiAweDFGRkYpIC8gMTAwMC5mOworICAgIHBvaW50cy0+cHVzaF9iYWNrKHBvaW50KTsKKworICAgIGF1dG8gY29uZiA9ICh2YWx1ZSA+PiAxMykgJiAweDc7CisgICAgZmxvYXQgbm9ybUNvbmZpZGVuY2UgPSAoY29uZiA9PSAwKSA/IDEuZiA6IChzdGF0aWNfY2FzdDxmbG9hdD4oY29uZikgLSAxKSAvIDcuZjsKKyAgICBjb25maWRlbmNlLT5wdXNoX2JhY2sobm9ybUNvbmZpZGVuY2UpOworICAgIGlmIChub3JtQ29uZmlkZW5jZSA8IENPTkZJREVOQ0VfVEhSRVNIT0xEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKm5lYXIgPiBwb2ludCkgeworICAgICAgICAqbmVhciA9IHBvaW50OworICAgIH0KKyAgICBpZiAoKmZhciA8IHBvaW50KSB7CisgICAgICAgICpmYXIgPSBwb2ludDsKKyAgICB9Cit9CisKKy8vIFRyaXZpYWwgY2FzZSwgcmVhZCBmb3J3YXJkIGZyb20gdG9wLGxlZnQgY29ybmVyLgordm9pZCByb3RhdGUwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaSppbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGpdLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDkwIGRlZ3JlZXMgQ1cgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBmcm9tIGJvdHRvbSwgbGVmdCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTkwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7IGkrKykgeworICAgICAgICBmb3IgKHNzaXplX3QgaiA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0LTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2oqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBpXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAxODAgQ1cgZGVncmVlcyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGJhY2t3YXJkcyBmcm9tIGJvdHRvbSwgcmlnaHQgY29ybmVyLgordm9pZCByb3RhdGUxODBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc3NpemVfdCBpID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGogPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2kqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBqXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAyNzAgZGVncmVlcyBDVyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGZyb20gdG9wLCByaWdodCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTI3MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7IGorKykgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltqKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgaV0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCByb3RhdGVBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIHN3aXRjaCAoaW5wdXRGcmFtZS5tT3JpZW50YXRpb24pIHsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTkwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUxODBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUyNzBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuc3VwcG9ydGVkIGRlcHRoIHBob3RvIHJvdGF0aW9uOiAlZCwgZGVmYXVsdCB0byAwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1PcmllbnRhdGlvbik7CisgICAgICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxkeW5hbWljX2RlcHRoOjpEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwKKyAgICAgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiAqaXRlbXMgLypvdXQqLywKKyAgICAgICAgYm9vbCAqc3dpdGNoRGltZW5zaW9ucyAvKm91dCovKSB7CisgICAgaWYgKChpdGVtcyA9PSBudWxscHRyKSB8fCAoc3dpdGNoRGltZW5zaW9ucyA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcG9pbnRzLCBjb25maWRlbmNlOworCisgICAgc2l6ZV90IHBvaW50Q291bnQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoICogaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgcG9pbnRzLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgY29uZmlkZW5jZS5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGZsb2F0IG5lYXIgPSBVSU5UMTZfTUFYOworICAgIGZsb2F0IGZhciA9IC4wZjsKKyAgICAqc3dpdGNoRGltZW5zaW9ucyA9IGZhbHNlOworICAgIC8vIFBoeXNpY2FsIHJvdGF0aW9uIG9mIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgbWF5IGJlIG5lZWRlZCBpbiBjYXNlCisgICAgLy8gdGhlIEVYSUYgb3JpZW50YXRpb24gaXMgc2V0IHRvIDAgZGVncmVlcyBhbmQgdGhlIGRlcHRoIHBob3RvIG9yaWVudGF0aW9uCisgICAgLy8gKHNvdXJjZSBjb2xvciBpbWFnZSkgaGFzIHNvbWUgZGlmZmVyZW50IHZhbHVlLgorICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpIHsKKyAgICAgICAgKnN3aXRjaERpbWVuc2lvbnMgPSByb3RhdGVBbmRVbnBhY2soaW5wdXRGcmFtZSwgJnBvaW50cywgJmNvbmZpZGVuY2UsICZuZWFyLCAmZmFyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsICZwb2ludHMsICZjb25maWRlbmNlLCAmbmVhciwgJmZhcik7CisgICAgfQorCisgICAgc2l6ZV90IHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsKKyAgICBzaXplX3QgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgaWYgKCpzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgICAgIGhlaWdodCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7CisgICAgfQorCisgICAgaWYgKG5lYXIgPT0gZmFyKSB7CisgICAgICAgIEFMT0dFKCIlczogTmVhciBhbmQgZmFyIHJhbmdlIHZhbHVlcyBtdXN0IG5vdCBtYXRjaCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwb2ludHNRdWFudGl6ZWQsIGNvbmZpZGVuY2VRdWFudGl6ZWQ7CisgICAgcG9pbnRzUXVhbnRpemVkLnJlc2VydmUocG9pbnRDb3VudCk7IGNvbmZpZGVuY2VRdWFudGl6ZWQucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBhdXRvIHBvaW50SXQgPSBwb2ludHMuYmVnaW4oKTsKKyAgICBhdXRvIGNvbmZpZGVuY2VJdCA9IGNvbmZpZGVuY2UuYmVnaW4oKTsKKyAgICB3aGlsZSAoKHBvaW50SXQgIT0gcG9pbnRzLmVuZCgpKSAmJiAoY29uZmlkZW5jZUl0ICE9IGNvbmZpZGVuY2UuZW5kKCkpKSB7CisgICAgICAgIGF1dG8gcG9pbnQgPSAqcG9pbnRJdDsKKyAgICAgICAgaWYgKCgqY29uZmlkZW5jZUl0KSA8IENPTkZJREVOQ0VfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICBwb2ludCA9IHN0ZDo6Y2xhbXAocG9pbnQsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnRzUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKChmYXIgKiAocG9pbnQgLSBuZWFyKSkgLworICAgICAgICAgICAgICAgIChwb2ludCAqIChmYXIgLSBuZWFyKSkpICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VRdWFudGl6ZWQucHVzaF9iYWNrKGZsb29yZigqY29uZmlkZW5jZUl0ICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VJdCsrOyBwb2ludEl0Kys7CisgICAgfQorCisgICAgRGVwdGhNYXBQYXJhbXMgZGVwdGhQYXJhbXMoRGVwdGhGb3JtYXQ6OmtSYW5nZUludmVyc2UsIG5lYXIsIGZhciwgRGVwdGhVbml0czo6a01ldGVycywKKyAgICAgICAgICAgICJhbmRyb2lkL2RlcHRobWFwIik7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV91cmkgPSAiYW5kcm9pZC9jb25maWRlbmNlbWFwIjsKKyAgICBkZXB0aFBhcmFtcy5taW1lID0gImltYWdlL2pwZWciOworICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemU7CisgICAgYXV0byByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIHBvaW50c1F1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBjb21wcmVzc2lvbiBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldCA9IGVuY29kZUdyYXlzY2FsZUpwZWcod2lkdGgsIGhlaWdodCwgY29uZmlkZW5jZVF1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEuZGF0YSgpLCBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIGFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29uZmlkZW5jZSBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldHVybiBEZXB0aE1hcDo6RnJvbURhdGEoZGVwdGhQYXJhbXMsIGl0ZW1zKTsKK30KKworZXh0ZXJuICJDIiBpbnQgcHJvY2Vzc0RlcHRoUGhvdG9GcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzaXplX3QgZGVwdGhQaG90b0J1ZmZlclNpemUsCisgICAgICAgIHZvaWQqIGRlcHRoUGhvdG9CdWZmZXIgLypvdXQqLywgc2l6ZV90KiBkZXB0aFBob3RvQWN0dWFsU2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyID09IG51bGxwdHIpIHx8IChkZXB0aFBob3RvQWN0dWFsU2l6ZSA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gaXRlbXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENhbWVyYT4+IGNhbWVyYUxpc3Q7CisgICAgYXV0byBpbWFnZSA9IEltYWdlOjpGcm9tRGF0YUZvclByaW1hcnlJbWFnZSgiYW5kcm9pZC9tYWluaW1hZ2UiLCAmaXRlbXMpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFQYXJhbXM+IGNhbWVyYVBhcmFtcyhuZXcgQ2FtZXJhUGFyYW1zKHN0ZDo6bW92ZShpbWFnZSkpKTsKKyAgICBpZiAoY2FtZXJhUGFyYW1zID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgcGFyYW1ldGVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiA9IGdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciksCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUpOworICAgIGJvb2wgc3dpdGNoRGltZW5zaW9uczsKKyAgICBjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9IHByb2Nlc3NEZXB0aE1hcEZyYW1lKGlucHV0RnJhbWUsIGV4aWZPcmllbnRhdGlvbiwgJml0ZW1zLAorICAgICAgICAgICAgJnN3aXRjaERpbWVuc2lvbnMpOworICAgIGlmIChjYW1lcmFQYXJhbXMtPmRlcHRoX21hcCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggbWFwIHByb2Nlc3NpbmcgZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGdlbmVyYXRlIGFuIGltYWdpbmcgbW9kZWwgd2l0aG91dCBpbnRyaW5zaWMgY2FsaWJyYXRpb24uCisgICAgaWYgKGlucHV0RnJhbWUubUlzSW50cmluc2ljQ2FsaWJyYXRpb25WYWxpZCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGludHJpbnNpYyBjYWxpYnJhdGlvbiBsYXlvdXQgaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgICAgIGNvbnN0IGR5bmFtaWNfZGVwdGg6OlBvaW50PGRvdWJsZT4gZm9jYWxMZW5ndGgoaW5wdXRGcmFtZS5tSW50cmluc2ljQ2FsaWJyYXRpb25bMF0sCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tSW50cmluc2ljQ2FsaWJyYXRpb25bMV0pOworICAgICAgICBzaXplX3Qgd2lkdGggPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoOworICAgICAgICBzaXplX3QgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQ7CisgICAgICAgIGlmIChzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgICAgICB3aWR0aCA9IGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0OworICAgICAgICAgICAgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEaW1lbnNpb24gaW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBJbWFnaW5nTW9kZWxQYXJhbXMgaW1hZ2luZ1BhcmFtcyhmb2NhbExlbmd0aCwgaW1hZ2VTaXplKTsKKyAgICAgICAgaW1hZ2luZ1BhcmFtcy5wcmluY2lwYWxfcG9pbnQueCA9IGlucHV0RnJhbWUubUludHJpbnNpY0NhbGlicmF0aW9uWzJdOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC55ID0gaW5wdXRGcmFtZS5tSW50cmluc2ljQ2FsaWJyYXRpb25bM107CisgICAgICAgIGltYWdpbmdQYXJhbXMuc2tldyA9IGlucHV0RnJhbWUubUludHJpbnNpY0NhbGlicmF0aW9uWzRdOworCisgICAgICAgIC8vIFRoZSBjYW1lcmEgbGVucyBkaXN0b3J0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVucyBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cy4KKyAgICAgICAgLy8gW2thcHBhXzEsIGthcHBhXzIsIGthcHBhXzMga2FwcGFfNCwga2FwcGFfNV0KKyAgICAgICAgaWYgKGlucHV0RnJhbWUubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCkgeworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24gdGhlIGxlbnMgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMgc2hvdWxkIGJlIG9yZGVyZWQKKyAgICAgICAgICAgIC8vIGFzIFsxLCBrYXBwYV80LCBrYXBwYV8xLCBrYXBwYV81LCBrYXBwYV8yLCAwLCBrYXBwYV8zLCAwXQorICAgICAgICAgICAgZmxvYXQgZGlzdG9ydGlvbkRhdGFbXSA9IHsxLmYsIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzNdLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblswXSwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bNF0sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzFdLCAwLmYsIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzJdLCAwLmZ9OworICAgICAgICAgICAgYXV0byBkaXN0b3J0aW9uRGF0YUxlbmd0aCA9IHNpemVvZihkaXN0b3J0aW9uRGF0YSkgLyBzaXplb2YoZGlzdG9ydGlvbkRhdGFbMF0pOworICAgICAgICAgICAgaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLnJlc2VydmUoZGlzdG9ydGlvbkRhdGFMZW5ndGgpOworICAgICAgICAgICAgaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLmluc2VydChpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24uZW5kKCksIGRpc3RvcnRpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uRGF0YSArIGRpc3RvcnRpb25EYXRhTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYVBhcmFtcy0+aW1hZ2luZ19tb2RlbCA9IEltYWdpbmdNb2RlbDo6RnJvbURhdGEoaW1hZ2luZ1BhcmFtcyk7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUubUlzTG9naWNhbCkgeworICAgICAgICBjYW1lcmFQYXJhbXMtPnRyYWl0ID0gZHluYW1pY19kZXB0aDo6Q2FtZXJhVHJhaXQ6OkxPR0lDQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhUGFyYW1zLT50cmFpdCA9IGR5bmFtaWNfZGVwdGg6OkNhbWVyYVRyYWl0OjpQSFlTSUNBTDsKKyAgICB9CisKKyAgICBjYW1lcmFMaXN0LmVtcGxhY2VfYmFjayhDYW1lcmE6OkZyb21EYXRhKHN0ZDo6bW92ZShjYW1lcmFQYXJhbXMpKSk7CisKKyAgICBhdXRvIGRldmljZVBhcmFtcyA9IHN0ZDo6bWFrZV91bmlxdWU8RGV2aWNlUGFyYW1zPiAoQ2FtZXJhczo6RnJvbUNhbWVyYUFycmF5KCZjYW1lcmFMaXN0KSk7CisgICAgZGV2aWNlUGFyYW1zLT5jb250YWluZXIgPSBDb250YWluZXI6OkZyb21JdGVtcygmaXRlbXMpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlPj4gcHJvZmlsZUxpc3Q7CisgICAgcHJvZmlsZUxpc3QuZW1wbGFjZV9iYWNrKFByb2ZpbGU6OkZyb21EYXRhKCJEZXB0aFBob3RvIiwgezB9KSk7CisgICAgZGV2aWNlUGFyYW1zLT5wcm9maWxlcyA9IFByb2ZpbGVzOjpGcm9tUHJvZmlsZUFycmF5KCZwcm9maWxlTGlzdCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZT4gZGV2aWNlID0gRGV2aWNlOjpGcm9tRGF0YShzdGQ6Om1vdmUoZGV2aWNlUGFyYW1zKSk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgY2FtZXJhIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjppc3RyaW5nc3RyZWFtIGlucHV0SnBlZ1N0cmVhbSgKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyLCBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUpKTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0cHV0SnBlZ1N0cmVhbTsKKyAgICBpZiAoIVdyaXRlSW1hZ2VBbmRNZXRhZGF0YUFuZENvbnRhaW5lcigmaW5wdXRKcGVnU3RyZWFtLCBkZXZpY2UuZ2V0KCksICZvdXRwdXRKcGVnU3RyZWFtKSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB3cml0aW5nIGRlcHRoIG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKmRlcHRoUGhvdG9BY3R1YWxTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PiAob3V0cHV0SnBlZ1N0cmVhbS50ZWxscCgpKTsKKyAgICBpZiAoKmRlcHRoUGhvdG9BY3R1YWxTaXplID4gZGVwdGhQaG90b0J1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBvdXRwdXQgYnVmZmVyIG5vdCBzdWZmaWNpZW50LCBuZWVkZWQgJXp1IGFjdHVhbCAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgKmRlcHRoUGhvdG9BY3R1YWxTaXplLCBkZXB0aFBob3RvQnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtY3B5KGRlcHRoUGhvdG9CdWZmZXIsIG91dHB1dEpwZWdTdHJlYW0uc3RyKCkuY19zdHIoKSwgKmRlcHRoUGhvdG9BY3R1YWxTaXplKTsKKworICAgIHJldHVybiAwOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWNhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9QUk9DRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2VudW0gRGVwdGhQaG90b09yaWVudGF0aW9uIHsKKyAgICBERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVMgICA9IDAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUyAgPSA5MCwKKyAgICBERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUyA9IDE4MCwKKyAgICBERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUyA9IDI3MCwKK307CisKK3N0cnVjdCBEZXB0aFBob3RvSW5wdXRGcmFtZSB7CisgICAgY29uc3QgY2hhciogICAgICAgICAgIG1NYWluSnBlZ0J1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1haW5KcGVnU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1haW5KcGVnV2lkdGgsIG1NYWluSnBlZ0hlaWdodDsKKyAgICB1aW50MTZfdCogICAgICAgICAgICAgbURlcHRoTWFwQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtRGVwdGhNYXBXaWR0aCwgbURlcHRoTWFwSGVpZ2h0LCBtRGVwdGhNYXBTdHJpZGU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYXhKcGVnU2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUpwZWdRdWFsaXR5OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSXNMb2dpY2FsOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBtSW50cmluc2ljQ2FsaWJyYXRpb25bNV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0ludHJpbnNpY0NhbGlicmF0aW9uVmFsaWQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZDsKKyAgICBEZXB0aFBob3RvT3JpZW50YXRpb24gbU9yaWVudGF0aW9uOworCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUoKSA6CisgICAgICAgICAgICBtTWFpbkpwZWdCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtTWFpbkpwZWdTaXplKDApLAorICAgICAgICAgICAgbU1haW5KcGVnV2lkdGgoMCksCisgICAgICAgICAgICBtTWFpbkpwZWdIZWlnaHQoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgICBtRGVwdGhNYXBXaWR0aCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcEhlaWdodCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcFN0cmlkZSgwKSwKKyAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSgwKSwKKyAgICAgICAgICAgIG1KcGVnUXVhbGl0eSgxMDApLAorICAgICAgICAgICAgbUlzTG9naWNhbCgwKSwKKyAgICAgICAgICAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbnswLmZ9LAorICAgICAgICAgICAgbUlzSW50cmluc2ljQ2FsaWJyYXRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbnswLmZ9LAorICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1PcmllbnRhdGlvbihEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUykge30KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b0xpYnJhcnkgPSAibGliZGVwdGhwaG90by5zbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24gPSAicHJvY2Vzc0RlcHRoUGhvdG9GcmFtZSI7Cit0eXBlZGVmIGludCAoKnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUpIChEZXB0aFBob3RvSW5wdXRGcmFtZSAvKmlucHV0RnJhbWUqLywKKyAgICAgICAgc2l6ZV90IC8qZGVwdGhQaG90b0J1ZmZlclNpemUqLywgdm9pZCogLypkZXB0aFBob3RvQnVmZmVyIG91dCovLAorICAgICAgICBzaXplX3QqIC8qZGVwdGhQaG90b0FjdHVhbFNpemUgb3V0Ki8pOworCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IDQxYzk1M2IuLjNkNTZjZDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC04OSwxMiArODksMjcgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIENhbWVyYU1ldGFkYXRhIGxhc3RGcmFtZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IGxhc3RQaHlzaWNhbEZyYW1lczsKICAgICB7CiAgICAgICAgIC8vIERvbid0IHJhY2Ugd2hpbGUgZHVtcGluZyBtZXRhZGF0YQogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhc3RGcmFtZU11dGV4KTsKICAgICAgICAgbGFzdEZyYW1lID0gQ2FtZXJhTWV0YWRhdGEobUxhc3RGcmFtZSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwaHlzaWNhbEZyYW1lIDogbUxhc3RQaHlzaWNhbEZyYW1lcykgeworICAgICAgICAgICAgbGFzdFBoeXNpY2FsRnJhbWVzLmVtcGxhY2UoU3RyaW5nOChwaHlzaWNhbEZyYW1lLm1QaHlzaWNhbENhbWVyYUlkKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxGcmFtZS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIH0KICAgICB9Ci0gICAgbGFzdEZyYW1lLmR1bXAoZmQsIDIsIDYpOworICAgIGxhc3RGcmFtZS5kdW1wKGZkLCAvKnZlcmJvc2l0eSovMiwgLyppbmRlbnRhdGlvbiovNik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBoeXNpY2FsRnJhbWUgOiBsYXN0UGh5c2ljYWxGcmFtZXMpIHsKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICBMYXRlc3QgcmVjZWl2ZWQgZnJhbWUgZm9yIHBoeXNpY2FsIGNhbWVyYSAlczpcbiIsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxGcmFtZS5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGxhc3RQaHlzaWNhbE1ldGFkYXRhID0gQ2FtZXJhTWV0YWRhdGEocGh5c2ljYWxGcmFtZS5zZWNvbmQpOworICAgICAgICBsYXN0UGh5c2ljYWxNZXRhZGF0YS5zb3J0KCk7CisgICAgICAgIGxhc3RQaHlzaWNhbE1ldGFkYXRhLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi82KTsKKyAgICB9CiB9CiAKIGJvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjp0aHJlYWRMb29wKCkgewpAQCAtMTQ1LDYgKzE2MCw4IEBACiAgICAgICAgIGlmICghcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwogICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOworCisgICAgICAgICAgICBtTGFzdFBoeXNpY2FsRnJhbWVzID0gc3RkOjptb3ZlKHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKaW5kZXggMDA3NjNhNC4uYWU2ZDE1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaApAQCAtODMsNiArODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdEZyYW1lOworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1MYXN0UGh5c2ljYWxGcmFtZXM7CisKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAppbmRleCA4YzhiOTdhLi5kNmJmODNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcApAQCAtMjM3LDcgKzIzNyw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpnZXRCdWZmZXJGb3JTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkKSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLCBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMjUzLDE0ICsyNTMsMTkgQEAKICAgICBTdHJlYW1TZXQgJnN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldElkKTsKICAgICBCdWZmZXJDb3VudE1hcCYgaGFuZE91dEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5oYW5kb3V0QnVmZmVyQ291bnRNYXA7CiAgICAgc2l6ZV90JiBidWZmZXJDb3VudCA9IGhhbmRPdXRCdWZmZXJDb3VudHMuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKKyAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKKyAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOworCisgICAgaWYgKG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKKyAgICAgICAgYXR0YWNoZWRCdWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50OworICAgIH0KKwogICAgIGlmIChidWZmZXJDb3VudCA+PSBzdHJlYW1TZXQubWF4QWxsb3dlZEJ1ZmZlckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyQ291bnQgKCV6dSkgZXhjZWVkcyB0aGUgbWF4IGFsbG93ZWQgYnVmZmVyIGNvdW50ICglenUpIG9mIHRoaXMgc3RyZWFtIHNldCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJDb3VudCwgc3RyZWFtU2V0Lm1heEFsbG93ZWRCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKLSAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwogICAgIGlmIChhdHRhY2hlZEJ1ZmZlckNvdW50ID4gYnVmZmVyQ291bnQpIHsKICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBhdHRhY2hlZCBtb3JlIGJ1ZmZlcnMgdG8gdGhpcyBzdHJlYW0gdGhhbiB3ZSBjdXJyZW50bHkgaGF2ZQogICAgICAgICAvLyBvdXRzdGFuZGluZywgc28gaGF2ZSB0aGUgc3RyZWFtIGp1c3QgdXNlIGFuIGFscmVhZHktYXR0YWNoZWQgYnVmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgKaW5kZXggMDI1MDYyZS4uZjBkZTFjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaApAQCAtMTEyLDYgKzExMiwxMCBAQAogICAgICAqCiAgICAgICogQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgY2xpZW50IHRha2VzIG92ZXIgdGhlIG93bmVyc2hpcCBvZiB0aGlzIGJ1ZmZlciBpZiBpdCBpcyBub3QgZnJlZWQuCiAgICAgICoKKyAgICAgKiBTb21ldGltZXMgZnJlZSBidWZmZXJzIGFyZSBkaXNjYXJkZWQgZnJvbSBjb25zdW1lciBzaWRlIGFuZCB0aGUgZGVxdWV1ZUJ1ZmZlciBjYWxsIHJldHVybnMKKyAgICAgKiBUSU1FRF9PVVQsIGluIHRoaXMgY2FzZSBjYWxsaW5nIGdldEJ1ZmZlckZvclN0cmVhbSBhZ2FpbiB3aXRoIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIgc2V0IHRvCisgICAgICogdHJ1ZSB3aWxsIG5vdGlmeSBidWZmZXIgbWFuYWdlciB0byB1cGRhdGUgaXRzIHN0YXRlcyBhbmQgYWxzbyB0cmllcyB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgICAgICoKICAgICAgKiBSZXR1cm4gdmFsdWVzOgogICAgICAqCiAgICAgICogIE9LOiAgICAgICAgR2V0dGluZyBidWZmZXIgZm9yIHRoaXMgc3RyZWFtIHdhcyBzdWNjZXNzZnVsLgpAQCAtMTIyLDcgKzEyNiw5IEBACiAgICAgICogICAgICAgICAgICAgdG8gdGhpcyBidWZmZXIgbWFuYWdlciBiZWZvcmUuCiAgICAgICogIE5PX01FTU9SWTogVW5hYmxlIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIHN0cmVhbSBhdCB0aGlzIHRpbWUuCiAgICAgICovCi0gICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCk7CisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKAorICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLAorICAgICAgICAgICAgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyID0gZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIG1hbmFnZXIgdGhhdCBhIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZCBieSB0aGUgY29uc3VtZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCBmYjgxYjg4Li5lMzQ3MTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU2LDYgKzU2LDkgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorCisjaW5jbHVkZSA8dHVwbGU+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+c3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3Qgc3RhcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgICBjYW5jZWxTdHJlYW1zQ29uZmlndXJhdGlvbkxvY2tlZCgpOwpAQCAtMjQ2OCwxOSArMjg1NywyNyBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbXMuYWRkKG91dHB1dFN0cmVhbSk7CiAKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICAgICAgc2l6ZV90IGsgPSBpICsgKChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyAxIDogMCk7IC8vIElucHV0IHN0cmVhbSBpZiBwcmVzZW50IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBvY2N1cHkgdGhlIGluaXRpYWwgZW50cnkuCi0gICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBvdXRwdXRTdHJlYW0tPndpZHRoICogb3V0cHV0U3RyZWFtLT5oZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQmxvYiBkYXRhU3BhY2UgJWQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjb25maWcuc3RyZWFtcyA9IHN0cmVhbXMuZWRpdEFycmF5KCk7CiAKICAgICAvLyBEbyB0aGUgSEFMIGNvbmZpZ3VyYXRpb247IHdpbGwgcG90ZW50aWFsbHkgdG91Y2ggc3RyZWFtCi0gICAgLy8gbWF4X2J1ZmZlcnMsIHVzYWdlLCBwcml2IGZpZWxkcy4KKyAgICAvLyBtYXhfYnVmZmVycywgdXNhZ2UsIGFuZCBwcml2IGZpZWxkcywgYXMgd2VsbCBhcyBkYXRhX3NwYWNlIGFuZCBmb3JtYXQKKyAgICAvLyBmaWVsZHMgZm9yIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0cy4KIAogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uQnVmZmVyID0gc2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCk7CiAgICAgcmVzID0gbUludGVyZmFjZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uQnVmZmVyLCAmY29uZmlnLCBidWZmZXJTaXplcyk7CkBAIC0yNTA1LDcgKzI5MDIsOCBAQAogICAgIC8vIGZhc3RlcgogCiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIG1JbnB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7Ci0gICAgICAgIHJlcyA9IG1JbnB1dFN0cmVhbS0+ZmluaXNoQ29uZmlndXJhdGlvbigpOworICAgICAgICBib29sIHN0cmVhbVJlQ29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICByZXMgPSBtSW5wdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oJnN0cmVhbVJlQ29uZmlndXJlZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBmaW5pc2ggY29uZmlndXJpbmcgaW5wdXQgc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI1MTUsMTMgKzI5MTMsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbVJlQ29uZmlndXJlZCkgeworICAgICAgICAgICAgbUludGVyZmFjZS0+b25TdHJlYW1SZUNvbmZpZ3VyZWQobUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpICYmICFvdXRwdXRTdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKSkgewotICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5maW5pc2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBib29sIHN0cmVhbVJlQ29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5maW5pc2hDb25maWd1cmF0aW9uKCZzdHJlYW1SZUNvbmZpZ3VyZWQpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBmaW5pc2ggY29uZmlndXJpbmcgb3V0cHV0IHN0cmVhbSAlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmdldElkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjUzMSw2ICsyOTMyLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJlYW1SZUNvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgICAgICBtSW50ZXJmYWNlLT5vblN0cmVhbVJlQ29uZmlndXJlZChvdXRwdXRTdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTgyLDYgKzI5ODYsMTAgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAorICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNjI2LDE1ICszMDM0LDEyIEBACiAgICAgLy8gT2ssIGhhdmUgYSBkdW1teSBzdHJlYW0gYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG90aGVyIG91dHB1dCBzdHJlYW0sCiAgICAgLy8gc28gcmVtb3ZlIHRoZSBkdW1teQogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobUR1bW15U3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAoZGVsZXRlZFN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQotICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKyAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUobUR1bW15U3RyZWFtSWQpOwogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KICAgICByZXMgPSBkZWxldGVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CkBAIC0yNzA4LDE4ICszMTEzLDIxIEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCi0gICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsIGJvb2wgaXNTdGlsbENhcHR1cmUsCisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcykpOworICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtSW5GbGlnaHRTdGF0dXNJZCk7CiAgICAgICAgIH0KQEAgLTI3MzEsMTYgKzMxMzksNjggQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpyZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcykgeworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspCiAgICAgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KG91dHB1dEJ1ZmZlcnNbaV0uc3RyZWFtKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIob3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBXaXRoIEhBTCBidWZmZXIgbWFuYWdlbWVudCBBUEksIEhBTCBzb21ldGltZXMgd2lsbCBoYXZlIHRvIHJldHVybiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBoYXMgbm90IGdvdCBhIG91dHB1dCBidWZmZXIgaGFuZGxlIGZpbGxlZCB5ZXQuIFRoaXMgaXMgdGhvdWdoIGlsbGVnYWwgaWYgSEFMCisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIG1hbmFnZW1lbnQgQVBJIGlzIG5vdCBiZWluZyB1c2VkLgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIG51bGwgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYTNTdHJlYW1JbnRlcmZhY2UgKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgICAgIGNvbnN0IGF1dG8mIGl0ID0gb3V0cHV0U3VyZmFjZXMuZmluZChzdHJlYW1JZCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIGl0LT5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzCiAgICAgICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBpdC4KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW4ndCByZXR1cm4gYnVmZmVyIHRvIGl0cyBzdHJlYW06ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyIHRvIGl0cyBzdHJlYW06ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvbmcgcHJvY2Vzc2luZyBjb25zdW1lcnMgY2FuIGNhdXNlIHJldHVybkJ1ZmZlciB0aW1lb3V0IGZvciBzaGFyZWQgc3RyZWFtCisgICAgICAgIC8vIElmIHRoYXQgaGFwcGVucywgY2FuY2VsIHRoZSBidWZmZXIgYW5kIHNlbmQgYSBidWZmZXIgZXJyb3IgdG8gY2xpZW50CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSAmJiByZXMgPT0gVElNRURfT1VUICYmCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXS5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOworICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICBpblJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgYnVmZmVyIGVycm9yCisgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOworICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcyA9IGluUmVzdWx0RXh0cmFzOworICAgICAgICAgICAgICAgIGV4dHJhcy5lcnJvclN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjc1Miw4ICszMjEyLDEwIEBACiAKICAgICAvLyBJbmRpY2F0ZSBpZGxlIGluRmxpZ2h0TWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlcgogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbkluZmxpZ2h0TWFwRW1wdHkoKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobUluRmxpZ2h0U3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgIH0KQEAgLTI3NzgsNiArMzI0MCwxMCBAQAogICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDAgJiYKICAgICAgICAgICAgIChyZXF1ZXN0LnNraXBSZXN1bHRNZXRhZGF0YSB8fAogICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkpKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnN0aWxsQ2FwdHVyZSkgeworICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgic3RpbGwgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIC0gaWYgc2Vuc29yIHRpbWVzdGFtcCBtYXRjaGVzIHNodXR0ZXIgdGltZXN0YW1wIGluIHRoZQpAQCAtMjc5NCw3ICszMjYwLDggQEAKICAgICAgICAgYXNzZXJ0KHJlcXVlc3QucmVxdWVzdFN0YXR1cyAhPSBPSyB8fAogICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCkgPT0gMCk7CiAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKIAogICAgICAgICByZW1vdmVJbkZsaWdodE1hcEVudHJ5TG9ja2VkKGlkeCk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlbW92ZWQgZnJhbWUgJWQgZnJvbSBJbkZsaWdodE1hcCIsIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIpOwpAQCAtMjgxOCw3ICszMjg1LDkgQEAKICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaWR4KyspIHsKICAgICAgICAgICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLAorICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogICAgICAgICBtSW5GbGlnaHRNYXAuY2xlYXIoKTsKICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA9IDA7CkBAIC0yODI4LDcgKzMyOTcsMTUgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0S2V5czsKICAgICBtSW50ZXJmYWNlLT5nZXRJbmZsaWdodEJ1ZmZlcktleXMoJmluZmxpZ2h0S2V5cyk7CiAKLSAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7CisgICAgLy8gSW5mbGlnaHQgYnVmZmVycyBmb3IgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXM7CisgICAgbUludGVyZmFjZS0+Z2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cygmaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cyk7CisKKyAgICAvLyAoc3RyZWFtSWQsIGZyYW1lTnVtYmVyLCBidWZmZXJfaGFuZGxlX3QqKSB0dXBsZSBmb3IgYWxsIGluZmxpZ2h0IGJ1ZmZlcnMuCisgICAgLy8gZnJhbWVOdW1iZXIgd2lsbCBiZSAtMSBmb3IgYnVmZmVycyBmcm9tIEhBTCBidWZmZXIgbWFuYWdlcgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdCwgYnVmZmVyX2hhbmRsZV90Kj4+IGluZmxpZ2h0QnVmZmVyczsKKyAgICBpbmZsaWdodEJ1ZmZlcnMucmVzZXJ2ZShpbmZsaWdodEtleXMuc2l6ZSgpICsgaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cy5zaXplKCkpOworCiAgICAgZm9yIChhdXRvJiBwYWlyIDogaW5mbGlnaHRLZXlzKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBwYWlyLmZpcnN0OwogICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gcGFpci5zZWNvbmQ7CkBAIC0yODM5LDYgKzMzMTYsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgc3RyZWFtSWQpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaW5mbGlnaHRCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc3RyZWFtSWQsIGZyYW1lTnVtYmVyLCBidWZmZXIpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGJ1ZmZlcklkIDogaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gLTE7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCAmYnVmZmVyLCAmc3RyZWFtSWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0LCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZmxpZ2h0QnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0cmVhbUlkLCAvKmZyYW1lTnVtYmVyKi8tMSwgYnVmZmVyKSk7CisgICAgfQorCisgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIGZvciAoYXV0byYgdHVwbGUgOiBpbmZsaWdodEJ1ZmZlcnMpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBzdGQ6OmdldDwwPih0dXBsZSk7CisgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBzdGQ6OmdldDwxPih0dXBsZSk7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyID0gc3RkOjpnZXQ8Mj4odHVwbGUpOwogCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKICAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKQEAgLTI4NTYsNyArMzM1Myw4IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IGhhbFN0cmVhbTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhbFN0cmVhbS0+c3RyZWFtX3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gJWQ6ICVzICglZCkiLCAgX19GVU5DVElPTl9fLApAQCAtMjg5MywxMiArMzM5MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOwogICAgICAgICB9CiAgICAgfQpAQCAtMjkyNCw2ICszNDIyLDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBVcGRhdGUgdmVuZG9yIHRhZyBpZCBmb3IgcGh5c2ljYWwgbWV0YWRhdGEKKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiByZXN1bHQtPm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcG1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+KAorICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQocG1ldGEsIG1WZW5kb3JUYWdJZCk7CisgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEudW5sb2NrKHBtZXRhKTsKKyAgICB9CisKICAgICAvLyBWYWxpZCByZXN1bHQsIGluc2VydCBpbnRvIHF1ZXVlCiAgICAgTGlzdDxDYXB0dXJlUmVzdWx0Pjo6aXRlcmF0b3IgcXVldWVkUmVzdWx0ID0KICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYXB0dXJlUmVzdWx0KCpyZXN1bHQpKTsKQEAgLTI5NDYsNiArMzQ1MiwxMyBAQAogICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IHBhcnRpYWxSZXN1bHQ7CiAKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBzdGF0dXNfdCByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnNlcnRSZXN1bHRMb2NrZWQoJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKIH0KIApAQCAtMjk1NCw3ICszNDY3LDcgQEAKICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgIGJvb2wgcmVwcm9jZXNzLAorICAgICAgICBib29sIHJlcHJvY2VzcywgYm9vbCB6c2xTdGlsbENhcHR1cmUsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbE1ldGFkYXRhcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHBlbmRpbmdNZXRhZGF0YS5pc0VtcHR5KCkpCkBAIC0yOTcxLDYgKzM0ODQsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOworICAgIH0gZWxzZSBpZiAoenNsU3RpbGxDYXB0dXJlKSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIFpTTCBzdGlsbCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKKyAgICAgICAgICAgICAgICAiKGdvdCBmcmFtZSBudW1iZXIgJWQsIGV4cGVjdGluZyAlZCkiLAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCkBAIC0zMDAwLDcgKzM1MjEsNiBAQAogICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLQogICAgIG5zZWNzX3Qgc2Vuc29yVGltZXN0YW1wID0gdGltZXN0YW1wLmRhdGEuaTY0WzBdOwogCiAgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKQEAgLTMwMTQsMTUgKzM1MzQsNTEgQEAKICAgICB9CiAKICAgICAvLyBGaXggdXAgc29tZSByZXN1bHQgbWV0YWRhdGEgdG8gYWNjb3VudCBmb3IgSEFMLWxldmVsIGRpc3RvcnRpb24gY29ycmVjdGlvbgotICAgIHN0YXR1c190IHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyLmNvcnJlY3RDYXB0dXJlUmVzdWx0KCZjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVyc1ttSWQuY19zdHIoKV0uY29ycmVjdENhcHR1cmVSZXN1bHQoJmNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlIoIlVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBmcmFtZSAlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKHJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmIChtRGlzdG9ydGlvbk1hcHBlcnMuZmluZChjYW1lcmFJZDguY19zdHIoKSkgPT0gbURpc3RvcnRpb25NYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbY2FtZXJhSWQ4LmNfc3RyKCldLmNvcnJlY3RDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgICAgICZwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUigiVW5hYmxlIHRvIGNvcnJlY3QgcGh5c2ljYWwgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgZm9yIGZyYW1lICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobVBoeXNpY2FsRGV2aWNlSW5mb01hcC5hdChjYW1lcmFJZDguY19zdHIoKSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1vbml0b3JlZFBoeXNpY2FsTWV0YWRhdGE7CisgICAgZm9yIChhdXRvJiBtIDogcGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgbW9uaXRvcmVkUGh5c2ljYWxNZXRhZGF0YS5lbXBsYWNlKFN0cmluZzgobS5tUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEobS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkpOworICAgIH0KICAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVTVUxULAotICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHNlbnNvclRpbWVzdGFtcCwgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHNlbnNvclRpbWVzdGFtcCwgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEsCisgICAgICAgICAgICBtb25pdG9yZWRQaHlzaWNhbE1ldGFkYXRhKTsKIAogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQpAQCAtMzE3Nyw4ICszNzMzLDEwIEBACiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFwcGVuZEFycmF5KHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCiAgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyZXF1ZXN0LnpzbENhcHR1cmUgfHwgcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXApOworICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzLCBzaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKQEAgLTMxOTEsMTIgKzM3NDksMTMgQEAKICAgICAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wID09IDApIHsKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdNZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdCA9IGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCwgcmVxdWVzdC5waHlzaWNhbE1ldGFkYXRhcyk7CisgICAgICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0LCByZXF1ZXN0LnpzbENhcHR1cmUgJiYgcmVxdWVzdC5zdGlsbENhcHR1cmUsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMyNzYsMTAgKzM4MzUsMTIgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjsKIAogICAgIGludCBzdHJlYW1JZCA9IDA7CisgICAgU3RyaW5nMTYgcGh5c2ljYWxDYW1lcmFJZDsKICAgICBpZiAobXNnLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CiAgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChtc2cuZXJyb3Jfc3RyZWFtKTsKICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmcxNihzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAgICAgfQogICAgIEFMT0dWKCJDYW1lcmEgJXM6ICVzOiBIQUwgZXJyb3IsIGZyYW1lICVkLCBzdHJlYW0gJWQ6ICVkIiwKICAgICAgICAgICAgIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBtc2cuZnJhbWVfbnVtYmVyLApAQCAtMzMwMSwxNiArMzg2MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgci5yZXF1ZXN0U3RhdHVzID0gbXNnLmVycm9yX2NvZGU7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQgPT0gZXJyb3JDb2RlCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9naWNhbERldmljZVJlc3VsdEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIucGh5c2ljYWxDYW1lcmFJZHMuZmluZChjYW1lcmFJZCkgPT0gci5waHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcG9ydGVkIHJlc3VsdCBmYWlsdXJlIGZvciBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlOiAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgcmVzcGVjdGl2ZSByZXF1ZXN0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbERldmljZVJlc3VsdEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLnNraXBSZXN1bHRNZXRhZGF0YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgbWlzc2luZyByZXN1bHQgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVycwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQuIElmIHRoZXkgcmV0dXJuZWQsIHRoZW4gcmVtb3ZlIGluZmxpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNhbGwgdGhpcyBmb3IgRVJST1JfQ0FNRVJBX1JFUVVFU1QgYXMgd2VsbD8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG90aGVyd2lzZSB3ZSBhcmUgZGVwZW5kaW5nIG9uIEhBTCB0byBzZW5kIHRoZSBidWZmZXJzIGJhY2sgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNhbGxpbmcgbm90aWZ5RXJyb3IuIE5vdCBzdXJlIGlmIHRoYXQncyBpbiB0aGUgc3BlYy4KICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluRmxpZ2h0UmVxdWVzdElmUmVhZHlMb2NrZWQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zMzUzLDEyICszOTMzLDIwIEBACiAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlci4KICAgICAgICAgICAgICAgICBpZiAoci5oYXNJbnB1dEJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmZyYW1lX251bWJlciA8IG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcHJvY2VzcyBzaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXIgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci56c2xDYXB0dXJlICYmIHIuc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZnJhbWVfbnVtYmVyIDwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiWlNMIHN0aWxsIGNhcHR1cmUgc2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyID0gbXNnLmZyYW1lX251bWJlciArIDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCkBAIC0zMzgyLDEwICszOTcwLDEzIEBACiAgICAgICAgICAgICAgICAgLy8gc2VuZCBwZW5kaW5nIHJlc3VsdCBhbmQgYnVmZmVycwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KHIucGVuZGluZ01ldGFkYXRhLCByLnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgci5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyLCByLnBoeXNpY2FsTWV0YWRhdGFzKTsKKyAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci56c2xDYXB0dXJlICYmIHIuc3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgICAgICByLnBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEoci56c2xDYXB0dXJlIHx8IHIuaGFzSW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgIHIub3V0cHV0U3VyZmFjZXMsIHIucmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKIAogICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwpAQCAtMzQxMSw4ICs0MDAyLDExIEBACiAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjptb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6ZXZlbnRTb3VyY2Ugc291cmNlLAotICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7Ci0gICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbWV0YWRhdGEpOworICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSkgeworCisgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbWV0YWRhdGEsCisgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhKTsKIH0KIAogLyoqCkBAIC0zNDIxLDExICs0MDE1LDE4IEBACiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSkgewogICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCiAgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM181LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM181ID0gY2FzdFJlc3VsdF8zXzU7CisgICAgfQogICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwogICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKICAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwpAQCAtMzQzNiwyNiArNDAzNywyNCBAQAogICAgIH0KIH0KIAotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6IG1Vc2VIYWxCdWZNYW5hZ2VyKGZhbHNlKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihvdGhlci5tSGlkbFNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob3RoZXIubVVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKICAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzUuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM180LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfMy5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbi5jbGVhcigpOwogfQogCi1ib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c3VwcG9ydEJhdGNoUmVxdWVzdCgpIHsKLSAgICByZXR1cm4gbUhpZGxTZXNzaW9uICE9IG51bGxwdHI7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKICAgICAgICAgY2FtZXJhM19yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgewpAQCAtMzUyMyw2ICs0MTIyLDUyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7CisgICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7CisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIGlmICgobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSAmJiBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gb2xkUGFyYW1zLCBuZXdQYXJhbXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBvbGRQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvTWV0YSkpOworICAgICAgICBuZXdQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvTWV0YSkpOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBib29sIHJlcXVpcmVkOworICAgICAgICBhdXRvIGhpZGxDYiA9IFsmY2FsbFN0YXR1cywgJnJlcXVpcmVkXSAoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkRmxhZykgeworICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVkRmxhZzsKKyAgICAgICAgfTsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCBoaWRsQ2IpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9NZXRhKTsKKyAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvTWV0YSk7CisgICAgICAgIGlmIChlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgewogICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKQEAgLTM1NjAsMTAgKzQyMDUsMTkgQEAKICAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOwogICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKICAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7CiAgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICAvLyBGb3IgSGlkbFNlc3Npb24gdmVyc2lvbiAzLjUgb3IgbmV3ZXIsIHRoZSBmb3JtYXQgYW5kIGRhdGFTcGFjZSBzZW50CisgICAgICAgIC8vIHRvIEhBTCBhcmUgb3JpZ2luYWwsIG5vdCB0aGUgb3ZlcnJpZGVuIG9uZXMuCisgICAgICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KGNhbTNzdHJlYW0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpID8KKyAgICAgICAgICAgICAgICAgICAgY2FtM3N0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSA6IHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2UoY2FtM3N0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpIDogc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfQogICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKICAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKICAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKQEAgLTM2MDIsMjYgKzQyNTYsNDggQEAKIAogICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwogICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9OworCisgICAgLy8gU2VlIHdoaWNoIHZlcnNpb24gb2YgSEFMIHdlIGhhdmUKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNSBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+Y29uZmlndXJlU3RyZWFtc18zXzUoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfMyAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuMyBmb3IgdGhlIGNhbGwKQEAgLTM2NzEsMTIgKzQzNDcsMTMgQEAKICAgICAgICAgLy8gU3RhcnQgc2NhbiBhdCBpLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHN0cmVhbSBvcmRlciBtYXRjaGVzCiAgICAgICAgIHNpemVfdCByZWFsSWR4ID0gaTsKICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCk7IGlkeCsrKSB7CisgICAgICAgIHNpemVfdCBoYWxTdHJlYW1Db3VudCA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgaGFsU3RyZWFtQ291bnQ7IGlkeCsrKSB7CiAgICAgICAgICAgICBpZiAoZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF0udjNfMi5pZCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWxJZHggPSAocmVhbElkeCA+PSBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5zaXplKCkpID8gMCA6IHJlYWxJZHggKyAxOworICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGhhbFN0cmVhbUNvdW50IC0gMSkgPyAwIDogcmVhbElkeCArIDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKQEAgLTM2ODYsMTIgKzQzNjMsMTIgQEAKICAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOwogCiAgICAgICAgIENhbWVyYTNTdHJlYW0qIGRzdFN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KTsKLSAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShmYWxzZSk7Ci0gICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOwogICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7CiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKIAotICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgIGlmIChkc3RTdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOwogICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZvcm1hdCBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwpAQCAtMzcwMSwxMCArNDM3OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIGRzdC0+Zm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoKGRzdC0+Zm9ybWF0ICE9IG92ZXJyaWRlRm9ybWF0KSA/IHRydWUgOiBmYWxzZSk7Ci0gICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKChkc3QtPmRhdGFfc3BhY2UgIT0gb3ZlcnJpZGVEYXRhU3BhY2UpID8gdHJ1ZSA6IGZhbHNlKTsKLQorICAgICAgICAgICAgYm9vbCBuZWVkRm9ybWF0T3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZm9ybWF0ICE9IHNyYy52M18yLm92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgYm9vbCBuZWVkRGF0YXNwYWNlT3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV0uZGF0YVNwYWNlICE9IHNyYy5vdmVycmlkZURhdGFTcGFjZTsKICAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFsbG93ZWQgd2l0aCBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKG5lZWRGb3JtYXRPdmVycmlkZSk7CisgICAgICAgICAgICBkc3RTdHJlYW0tPnNldERhdGFTcGFjZU92ZXJyaWRlKG5lZWREYXRhc3BhY2VPdmVycmlkZSk7CiAgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OwogICAgICAgICAgICAgZHN0LT5kYXRhX3NwYWNlID0gb3ZlcnJpZGVEYXRhU3BhY2U7CiAgICAgICAgIH0KQEAgLTM3MzMsMTQgKzQ0MTMsMTUgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKICAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAotICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKSB7CisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIgfHwgaW5mbGlnaHRCdWZmZXJzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApLCBoYW5kbGVzQ3JlYXRlZCAoJXApLCBhbmQgaW5mbGlnaHRCdWZmZXJzKCVwKSAiCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCwgaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CkBAIC0zNzY5LDggKzQ0NTAsOCBAQAogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CiAKICAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5idWZmZXIpOworICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPmlucHV0QnVmZmVyLnN0cmVhbUlkID0gLTE7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOwpAQCAtMzc4MSwyNiArNDQ2Miw1NyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7Ci0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7Ci0gICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7Ci0gICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdXRvIHBhaXIgPSBnZXRCdWZmZXJJZChidWYsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNyYy0+YWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIEhBTCBidWZmZXIgbWFuYWdlbWVudCBwYXRoCisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gQlVGRkVSX0lEX05PX0JVRkZFUjsKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3Qgc2VuZCBhIG51bGwgYnVmZmVyIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QuYWNxdWlyZUZlbmNlID0gYWNxdWlyZUZlbmNlOworICAgICAgICAgICAgZHN0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBkc3Quc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKICAgICAgICAgICAgIGRzdC5yZWxlYXNlRmVuY2UgPSBudWxscHRyOwogCi0gICAgICAgICAgICBwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAgICAgc3JjLT5idWZmZXIsIHNyYy0+YWNxdWlyZV9mZW5jZSk7CisgICAgICAgICAgICAvLyBPdXRwdXQgYnVmZmVycyBhcmUgZW1wdHkgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGluZmxpZ2h0QnVmZmVycy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhbnVwTmF0aXZlSGFuZGxlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCkgeworICAgIGlmIChoYW5kbGVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY2xvc2VGZCkgeworICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6ICpoYW5kbGVzKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBoYW5kbGUgOiAqaGFuZGxlcykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIH0KKyAgICBoYW5kbGVzLT5jbGVhcigpOworICAgIHJldHVybjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCkBAIC0zODIzLDEzICs0NTM1LDIxIEBACiAgICAgICAgIGNhcHR1cmVSZXF1ZXN0cy5yZXNpemUoYmF0Y2hTaXplKTsKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlc0NyZWF0ZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEJ1ZmZlcnM7CiAKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAotICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMiwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLCAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5MTEsNDYgKzQ2MzEsNDMgQEAKICAgICB9CiAKICAgICBoYXJkd2FyZTo6ZGV0YWlsczo6cmV0dXJuX3N0YXR1cyBlcnI7CisgICAgYXV0byByZXN1bHRDYWxsYmFjayA9CisgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOworICAgICAgICB9OwogICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewogICAgICAgICBlcnIgPSBoaWRsU2Vzc2lvbl8zXzQtPnByb2Nlc3NDYXB0dXJlUmVxdWVzdF8zXzQoY2FwdHVyZVJlcXVlc3RzXzNfNCwgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGVyciA9IG1IaWRsU2Vzc2lvbi0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGNhcHR1cmVSZXF1ZXN0cywgY2FjaGVzVG9SZW1vdmUsCi0gICAgICAgICAgICBbJnN0YXR1cywgJm51bVJlcXVlc3RQcm9jZXNzZWRdIChhdXRvIHMsIHVpbnQzMl90IG4pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfQogICAgIGlmICghZXJyLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OkNBTUVSQV9ESVNDT05ORUNURUQ7CiAgICAgfQorCiAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0sgJiYgKm51bVJlcXVlc3RQcm9jZXNzZWQgIT0gYmF0Y2hTaXplKSB7CiAgICAgICAgIEFMT0dFKCIlczogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IHJldHVybnMgT0sgYnV0IHByb2Nlc3NlZCAlZC8lenUgcmVxdWVzdHMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm51bVJlcXVlc3RQcm9jZXNzZWQsIGJhdGNoU2l6ZSk7CiAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKICAgICB9CiAKLSAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXNDcmVhdGVkKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIGlmIChtSGlkbFNlc3Npb24tPmlzUmVtb3RlKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY2xvc2UgYWNxdWlyZSBmZW5jZSBGRHMgd2hlbiB0aGUgSElETCB0cmFuc2FjdGlvbiBzdWNjZWVkcyAoc28gdGhlIEZEcyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIHNlbnQgdG8gY2FtZXJhIEhBTCBwcm9jZXNzZXMpCisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQsIC8qY2xvc2VGZCovdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbiBwYXNzdGhyb3VnaCBtb2RlIHRoZSBGRHMgYXJlIG5vdyBvd25lZCBieSBIQUwKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwb3BJbmZsaWdodEJ1ZmZlcnMoaW5mbGlnaHRCdWZmZXJzKTsKKyAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKICAgICB9Ci0gICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KAotICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0KSB7Ci0gICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0Iik7Ci0gICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzID0gT0s7Ci0KLSAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKLSAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoMSk7Ci0gICAgcmVxdWVzdHNbMF0gPSByZXF1ZXN0OwotICAgIHJlcyA9IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOwotCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMzk5Myw2ICs0NzEwLDIwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6c2lnbmFsUGlwZWxpbmVEcmFpbiIpOworICAgIGlmICghdmFsaWQoKSB8fCBtSGlkbFNlc3Npb25fM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBvbiBpbnZhbGlkIGNhbWVyYSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5zaWduYWxTdHJlYW1GbHVzaChzdHJlYW1JZHMsIG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciAtIDEpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodEJ1ZmZlcktleXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbmZsaWdodExvY2spOwpAQCAtNDAwNywxMSArNDczOCwyMSBAQAogICAgIHJldHVybjsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90Piogb3V0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBvdXQtPmNsZWFyKCk7CisgICAgb3V0LT5yZXNlcnZlKG1SZXF1ZXN0ZWRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChhdXRvJiBwYWlyIDogbVJlcXVlc3RlZEJ1ZmZlcnMpIHsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2socGFpci5maXJzdCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoCi0gICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCBpbnQgYWNxdWlyZUZlbmNlKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7CiAgICAgdWludDY0X3Qga2V5ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZyYW1lTnVtYmVyKSA8PCAzMiB8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdHJlYW1JZCk7Ci0gICAgYXV0byBwYWlyID0gc3RkOjptYWtlX3BhaXIoYnVmZmVyLCBhY3F1aXJlRmVuY2UpOwotICAgIG1JbmZsaWdodEJ1ZmZlck1hcFtrZXldID0gcGFpcjsKKyAgICBtSW5mbGlnaHRCdWZmZXJNYXBba2V5XSA9IGJ1ZmZlcjsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTQwMjMsMTYgKzQ3NjQsNTggQEAKICAgICB1aW50NjRfdCBrZXkgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZnJhbWVOdW1iZXIpIDw8IDMyIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0cmVhbUlkKTsKICAgICBhdXRvIGl0ID0gbUluZmxpZ2h0QnVmZmVyTWFwLmZpbmQoa2V5KTsKICAgICBpZiAoaXQgPT0gbUluZmxpZ2h0QnVmZmVyTWFwLmVuZCgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgYXV0byBwYWlyID0gaXQtPnNlY29uZDsKLSAgICAqYnVmZmVyID0gcGFpci5maXJzdDsKLSAgICBpbnQgYWNxdWlyZUZlbmNlID0gcGFpci5zZWNvbmQ7Ci0gICAgaWYgKGFjcXVpcmVGZW5jZSA+IDApIHsKLSAgICAgICAgOjpjbG9zZShhY3F1aXJlRmVuY2UpOworICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAqYnVmZmVyID0gaXQtPnNlY29uZDsKICAgICB9CiAgICAgbUluZmxpZ2h0QnVmZmVyTWFwLmVyYXNlKGl0KTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwb3BJbmZsaWdodEJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4mIGJ1ZmZlcnMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBidWZmZXJzKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBwYWlyLmZpcnN0OworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gcGFpci5zZWNvbmQ7CisgICAgICAgIHBvcEluZmxpZ2h0QnVmZmVyKGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgbnVsbHB0cik7CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBwYWlyID0gbVJlcXVlc3RlZEJ1ZmZlcnMuaW5zZXJ0KHtidWZmZXJJZCwge3N0cmVhbUlkLCBidWZ9fSk7CisgICAgaWYgKCFwYWlyLnNlY29uZCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIGFscmVhZHkgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBGaW5kIGFuZCBwb3AgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwKKyAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgIC8qb3B0aW9uYWwgb3V0Ki8gaW50MzJfdCogc3RyZWFtSWQpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZmZXIgKCVwKSBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fLCBidWZmZXIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gaXQgPSBtUmVxdWVzdGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBpZiAoaXQgPT0gbVJlcXVlc3RlZEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBub3QgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmJ1ZmZlciA9IGl0LT5zZWNvbmQuc2Vjb25kOworICAgIGlmIChzdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW1JZCA9IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgfQorICAgIG1SZXF1ZXN0ZWRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRCdWZmZXJJZCgKICAgICAgICAgY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwpAQCAtNDA2Nyw3ICs0ODUwLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbmRsZSwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVySWQgPSAgaXQtPnNlY29uZDsKKyAgICAgICAgYnVmZmVySWQgPSBpdC0+c2Vjb25kOwogICAgICAgICBiSWRNYXAuZXJhc2UoaXQpOwogICAgICAgICBBTE9HVigiJXM6IHN0cmVhbSAlZCBub3cgaGF2ZSAlenUgYnVmZmVyIGNhY2hlcyBhZnRlciByZW1vdmluZyBidWYgJXAiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGJJZE1hcC5zaXplKCksIGhhbmRsZSk7CkBAIC00MDc1LDEzICs0ODU4LDMwIEBACiAgICAgbUZyZWVkQnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIGJ1ZmZlcklkKSk7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpvblN0cmVhbVJlQ29uZmlndXJlZChpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVySWRNYXBMb2NrKTsKKyAgICBhdXRvIG1hcEl0ID0gbUJ1ZmZlcklkTWFwcy5maW5kKHN0cmVhbUlkKTsKKyAgICBpZiAobWFwSXQgPT0gbUJ1ZmZlcklkTWFwcy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbUlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ1ZmZlcklkTWFwJiBiSWRNYXAgPSBtYXBJdC0+c2Vjb25kOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBiSWRNYXApIHsKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBpdC5zZWNvbmQ7CisgICAgICAgIG1GcmVlZEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHN0cmVhbUlkLCBidWZmZXJJZCkpOworICAgIH0KKyAgICBiSWRNYXAuY2xlYXIoKTsKK30KKwogLyoqCiAgKiBSZXF1ZXN0VGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKICAqLwogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cykgOgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTQwOTEsNiArNDg5MSw3IEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQoZmFsc2UpLAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluKGZhbHNlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKQEAgLTQxMDEsNyArNDkwMiw4IEBACiAgICAgICAgIG1Db25zdHJhaW5lZE1vZGUoZmFsc2UpLAogICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSksCiAgICAgICAgIG1TZXNzaW9uUGFyYW1LZXlzKHNlc3Npb25QYXJhbUtleXMpLAotICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSkgeworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtNDM5MSwyOCArNTE5Myw3IEBACiAgICAgICAgIE5leHRSZXF1ZXN0JiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgbmV4dFJlcXVlc3Quc3VibWl0dGVkID0gdHJ1ZTsKIAotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKLSAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgeyAvLyBEb24ndCB1cGRhdGUgaWYgdGhleSB3ZXJlIHVuY2hhbmdlZAotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOwotCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOwotICAgICAgICAgICAgbUxhdGVzdFJlcXVlc3QuYWNxdWlyZShjbG9uZWQpOwotCi0gICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBhcmVudC0+bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKLSAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOworICAgICAgICB1cGRhdGVOZXh0UmVxdWVzdChuZXh0UmVxdWVzdCk7CiAKICAgICAgICAgaWYgKCF0cmlnZ2VyUmVtb3ZlRmFpbGVkKSB7CiAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzbHkgcXVldWVkIHRyaWdnZXJzIChhZnRlciB1bmxvY2spCkBAIC00NDQ1LDYyICs1MjI2LDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZW5kUmVxdWVzdHNPbmVCeU9uZSgpIHsKLSAgICBzdGF0dXNfdCByZXM7Ci0KLSAgICBmb3IgKGF1dG8mIG5leHRSZXF1ZXN0IDogbU5leHRSZXF1ZXN0cykgewotICAgICAgICAvLyBTdWJtaXQgcmVxdWVzdCBhbmQgYmxvY2sgdW50aWwgcmVhZHkgZm9yIG5leHQgb25lCi0gICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiZnJhbWUgY2FwdHVyZSIsIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KCZuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0KTsKLQotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgb25seSBnZXQgYSBmYWlsdXJlIGhlcmUgZm9yIG1hbGZvcm1lZCByZXF1ZXN0cyBvciBkZXZpY2UtbGV2ZWwKLSAgICAgICAgICAgIC8vIGVycm9ycywgc28gY29uc2lkZXIgYWxsIGVycm9ycyBmYXRhbC4gIEJhZCBtZXRhZGF0YSBmYWlsdXJlcyBzaG91bGQKLSAgICAgICAgICAgIC8vIGNvbWUgdGhyb3VnaCBub3RpZnkuCi0gICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gc3VibWl0IGNhcHR1cmUgcmVxdWVzdCAlZCB0byBIQUwiCi0gICAgICAgICAgICAgICAgICAgICIgZGV2aWNlOiAlcyAoJWQpIiwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLAotICAgICAgICAgICAgICAgICAgICByZXMpOwotICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3RzKC8qc2VuZFJlcXVlc3RFcnJvciovIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseS4KLSAgICAgICAgbmV4dFJlcXVlc3Quc3VibWl0dGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxhdGVzdCByZXF1ZXN0IHNlbnQgdG8gSEFMCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsgLy8gRG9uJ3QgdXBkYXRlIGlmIHRoZXkgd2VyZSB1bmNoYW5nZWQKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKLQotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIGNsb25lZCA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKLSAgICAgICAgICAgIG1MYXRlc3RSZXF1ZXN0LmFjcXVpcmUoY2xvbmVkKTsKLQotICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQtPm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVFVRVNULCBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKLSAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKLSAgICAgICAgcmVzID0gcmVtb3ZlVHJpZ2dlcnMobVByZXZSZXF1ZXN0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlbW92ZSB0cmlnZ2VycyAiCi0gICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdHMoLypzZW5kUmVxdWVzdEVycm9yKi8gZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlcXVlc3QpIHsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb247CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZSA9IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90KCk7CkBAIC00NTQ4LDEzICs1MjczLDQ1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVwZGF0ZU5leHRSZXF1ZXN0KE5leHRSZXF1ZXN0JiBuZXh0UmVxdWVzdCkgeworICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKKyAgICBpZiAobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7IC8vIERvbid0IHVwZGF0ZSBpZiB0aGV5IHdlcmUgdW5jaGFuZ2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKKworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgICAgICBtTGF0ZXN0UmVxdWVzdC5hY3F1aXJlKGNsb25lZCk7CisKKyAgICAgICAgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdC5jbGVhcigpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5udW1fcGh5c2NhbV9zZXR0aW5nczsgaSsrKSB7CisgICAgICAgICAgICBjbG9uZWQgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5waHlzY2FtX3NldHRpbmdzW2ldKTsKKyAgICAgICAgICAgIG1MYXRlc3RQaHlzaWNhbFJlcXVlc3QuZW1wbGFjZShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnBoeXNjYW1faWRbaV0sCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKGNsb25lZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgcGFyZW50LT5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0LCBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKKyAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKAorICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgIH0KKworICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdCk7Cit9CisKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBib29sIHVwZGF0ZXNEZXRlY3RlZCA9IGZhbHNlOwogCisgICAgQ2FtZXJhTWV0YWRhdGEgdXBkYXRlZFBhcmFtcyhtTGF0ZXN0U2Vzc2lvblBhcmFtcyk7CiAgICAgZm9yIChhdXRvIHRhZyA6IG1TZXNzaW9uUGFyYW1LZXlzKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHNldHRpbmdzLmZpbmQodGFnKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IG1MYXRlc3RTZXNzaW9uUGFyYW1zLmZpbmQodGFnKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IHVwZGF0ZWRQYXJhbXMuZmluZCh0YWcpOwogCiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKQEAgLTQ1ODMsMTcgKzUzNDAsMjYgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNraXBIRlJUYXJnZXRGUFNVcGRhdGUodGFnLCBlbnRyeSwgbGFzdEVudHJ5KSkgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMudXBkYXRlKGVudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgICBBTE9HVigiJXM6IFNlc3Npb24gcGFyYW1ldGVyIHRhZyBpZCAlZCByZW1vdmVkIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMuZXJhc2UodGFnKTsKKyAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMuZXJhc2UodGFnKTsKICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdXBkYXRlc0RldGVjdGVkOworICAgIGJvb2wgcmVjb25maWd1cmVSZXF1aXJlZDsKKyAgICBpZiAodXBkYXRlc0RldGVjdGVkKSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBtSW50ZXJmYWNlLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG1MYXRlc3RTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMpOworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjb25maWd1cmVSZXF1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZWNvbmZpZ3VyZVJlcXVpcmVkOwogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnRocmVhZExvb3AoKSB7CkBAIC00NzA2LDEzICs1NDcyLDE1IEBACiAgICAgQUxPR1ZWKCIlczogJWQ6IHN1Ym1pdHRpbmcgJXp1IHJlcXVlc3RzIGluIGEgYmF0Y2guIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKICAgICAgICAgICAgIG1OZXh0UmVxdWVzdHMuc2l6ZSgpKTsKIAorICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25TdWJtaXR0aW5nUmVxdWVzdCgpOworICAgIH0KKwogICAgIGJvb2wgc3VibWl0UmVxdWVzdFN1Y2Nlc3MgPSBmYWxzZTsKICAgICBuc2Vjc190IHRSZXF1ZXN0U3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgaWYgKG1JbnRlcmZhY2UtPnN1cHBvcnRCYXRjaFJlcXVlc3QoKSkgewotICAgICAgICBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IHNlbmRSZXF1ZXN0c0JhdGNoKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3VibWl0UmVxdWVzdFN1Y2Nlc3MgPSBzZW5kUmVxdWVzdHNPbmVCeU9uZSgpOwotICAgIH0KKyAgICBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IHNlbmRSZXF1ZXN0c0JhdGNoKCk7CisKICAgICBuc2Vjc190IHRSZXF1ZXN0RW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgIG1SZXF1ZXN0TGF0ZW5jeS5hZGQodFJlcXVlc3RTdGFydCwgdFJlcXVlc3RFbmQpOwogCkBAIC00NzMyLDYgKzU1MDAsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cHJlcGFyZUhhbFJlcXVlc3RzKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKKyAgICBib29sIGJhdGNoZWRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV4dFJlcXVlc3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGF1dG8mIG5leHRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpOwogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3QgPSBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdDsKQEAgLTQ3NTUsNyArNTUyNCwxMCBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBsYXN0IHRpbWUKLSAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gbVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbjsKKyAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gKG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW4pICYmCisgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBzZXR0aW5ncyBhcmUgYWxsIHRoZSBzYW1lIHdpdGhpbiBvbmUgYmF0Y2gsIHNvIG9ubHkgdHJlYXQgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBpbiBhIGJhdGNoIGFzIG5ldworICAgICAgICAgICAgICAgICEoYmF0Y2hlZFJlcXVlc3QgJiYgaSA+IDApOwogICAgICAgICBpZiAobmV3UmVxdWVzdCkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBIQUwgd29ya2Fyb3VuZDoKQEAgLTQ3NzMsMTMgKzU1NDUsMjEgQEAKICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IG1ldGFkYXRhIHJlZ2lvbnMgZm9yIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpZiBlbmFibGVkCiAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXIuY29ycmVjdENhcHR1cmVSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgJihjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBsZW5zIGRpc3RvcnRpb24gZm9yIHJlcXVlc3QgJWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBMaXN0PFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+OjppdGVyYXRvciBpdDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpdCA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQtPm1EaXN0b3J0aW9uTWFwcGVycy5maW5kKGl0LT5jYW1lcmFJZCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzW2l0LT5jYW1lcmFJZF0uY29ycmVjdENhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaXQtPm1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGNvcnJlY3QgY2FwdHVyZSByZXF1ZXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlbnMgZGlzdG9ydGlvbiBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ4NDcsMTUgKzU2MjcsMjggQEAKICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKICAgICAgICAgaGFsUmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLT5hcnJheSgpOwogICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXM7CisKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4sIGFuZCBub3doZXJlIHRvIHNlbmQgZXJyb3JzIHRvLCBzbyBqdXN0IGxvZyBpdAorICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RUaHJlYWQ6IFBhcmVudCBpcyBnb25lIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSBrQmFzZUdldEJ1ZmZlcldhaXQgKyBwYXJlbnQtPmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOworCisgICAgICAgIFN1cmZhY2VNYXAgdW5pcXVlU3VyZmFjZUlkTWFwOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IG91dHB1dFN0cmVhbS0+Z2V0SWQoKTsKIAogICAgICAgICAgICAgLy8gUHJlcGFyZSB2aWRlbyBidWZmZXJzIGZvciBoaWdoIHNwZWVkIHJlY29yZGluZyBvbiB0aGUgZmlyc3QgdmlkZW8gcmVxdWVzdC4KICAgICAgICAgICAgIGlmIChtUHJlcGFyZVZpZGVvU3RyZWFtICYmIG91dHB1dFN0cmVhbS0+aXNWaWRlb1N0cmVhbSgpKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gcHJlcGFyZSB2aWRlbyBzdHJlYW0gb24gdGhlIGZpcnN0IHZpZGVvIHJlcXVlc3QuCiAgICAgICAgICAgICAgICAgbVByZXBhcmVWaWRlb1N0cmVhbSA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5zdGFydFByZXBhcmUoQ2FtZXJhM1N0cmVhbUludGVyZmFjZTo6QUxMT0NBVEVfUElQRUxJTkVfTUFYKTsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPnN0YXJ0UHJlcGFyZShDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOjpBTExPQ0FURV9QSVBFTElORV9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKmJsb2NrUmVxdWVzdCovKTsKICAgICAgICAgICAgICAgICB3aGlsZSAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgewogICAgICAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPnByZXBhcmVOZXh0QnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDg2NiwxNiArNTY1OSw2MSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbal0pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAotICAgICAgICAgICAgICAgIC8vIGVycm9yCi0gICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiB1bmlxdWVTdXJmYWNlSWRzOworICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSwKKyAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZVN1cmZhY2VJZHMpOworICAgICAgICAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaXMgbm9ybWFsIG91dHB1dCBmb3Igc3RyZWFtcyBub3Qgc3VwcG9ydGluZyBzdXJmYWNlSWRzCisgICAgICAgICAgICBpZiAocmVzICE9IE9LICYmIHJlcyAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHF1ZXJ5IHN0cmVhbSAlZCB1bmlxdWUgc3VyZmFjZSBJRHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB1bmlxdWVTdXJmYWNlSWRNYXAuaW5zZXJ0KHtzdHJlYW1JZCwgc3RkOjptb3ZlKHVuaXF1ZVN1cmZhY2VJZHMpfSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHN0cmVhbSAlZCBpcyBhYmFuZG9uZWQsIHNraXBwaW5nIHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSEFMIHdpbGwgcmVxdWVzdCBidWZmZXIgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBidWZmZXIgPSBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJlYW0gPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN0cmVhbUNhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2V0dGluZ3MgOiBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1DYW1lcmFJZC5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5nZXRJZCgpID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNhbWVyYUlkID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CkBAIC00ODkzLDI2ICs1NzMxLDM2IEBACiAgICAgICAgIHRvdGFsTnVtQnVmZmVycyArPSBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7CiAKICAgICAgICAgLy8gTG9nIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCBxdWV1ZQotICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYW5kIG5vd2hlcmUgdG8gc2VuZCBlcnJvcnMgdG8sIHNvIGp1c3QgbG9nIGl0Ci0gICAgICAgICAgICBDTE9HRSgiUmVxdWVzdFRocmVhZDogUGFyZW50IGlzIGdvbmUiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIElmIHRoaXMgcmVxdWVzdCBsaXN0IGlzIGZvciBjb25zdHJhaW5lZCBoaWdoIHNwZWVkIHJlY29yZGluZyAobm90CiAgICAgICAgIC8vIHByZXZpZXcpLCBhbmQgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBub3QgdGhlIGxhc3Qgb25lIGluIHRoZSBiYXRjaCwKICAgICAgICAgLy8gZG8gbm90IHNlbmQgY2FsbGJhY2sgdG8gdGhlIGFwcC4KICAgICAgICAgYm9vbCBoYXNDYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIGlmIChtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMSAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKKyAgICAgICAgaWYgKGJhdGNoZWRSZXF1ZXN0ICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgewogICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGlmICghbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICBpc1N0aWxsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdGlsbCBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1tpXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgeworICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIChtVXNlSGFsQnVmTWFuYWdlcikgPyB1bmlxdWVTdXJmYWNlSWRNYXAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30pOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTQ5ODgsNyArNTgzNiw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDk5OSw3ICs1ODQ3LDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDA4LDYgKzU4NTYsMjIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgZm9yIGNhbWVyYSBkZXZpY2Ugbm90IHN1cHBvcnRpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBwbChtUGF1c2VMb2NrKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgcmVxdWVzdCB0aHJlYWQgaXMgc3RpbGwgYnVzeSwgd2FpdCB1bnRpbCBwYXVzZWQgdGhlbiBub3RpZnkgSEFMCisgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSB0cnVlOworICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKK30KKwogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CkBAIC01MDY1LDE2ICs1OTI5LDIxIEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKLSAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKLSAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KLSAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UgPSAoKm91dHB1dEJ1ZmZlcnMpW2ldLmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKLSAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOwotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAvLyBObyBvdXRwdXQgYnVmZmVyIGNhbiBiZSByZXR1cm5lZCB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy9CdWZmZXJzIHRoYXQgZmFpbGVkIHByb2Nlc3NpbmcgY291bGQgc3RpbGwgaGF2ZQorICAgICAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KKyAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGFjcXVpcmVGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDApOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0RXJyb3IpIHsKQEAgLTUxODAsMTEgKzYwNDksMjAgQEAKICAgICAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBHb2luZyBpZGxlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0b3Agd2FpdGluZyBmb3Igbm93IGFuZCBsZXQgdGhyZWFkIG1hbmFnZW1lbnQgaGFwcGVuCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUyNjQsMTEgKzYxNDIsMjAgQEAKICAgICAgICAgaWYgKG1QYXVzZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBQYXVzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBMZXQgdGhlIHRyYWNrZXIga25vdwogICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IG1Eb1BhdXNlU2lnbmFsLndhaXRSZWxhdGl2ZShtUGF1c2VMb2NrLCBrUmVxdWVzdFRpbWVvdXQpOwpAQCAtNTUyNiw3ICs2NDEzLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKIAotICAgIHJlcyA9IHN0cmVhbS0+c3RhcnRQcmVwYXJlKG1heENvdW50KTsKKyAgICByZXMgPSBzdHJlYW0tPnN0YXJ0UHJlcGFyZShtYXhDb3VudCwgdHJ1ZSAvKmJsb2NrUmVxdWVzdCovKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIC8vIE5vIHByZXBhcmF0aW9uIG5lZWRlZCwgZmlyZSBsaXN0ZW5lciByaWdodCBvZmYKICAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgYWxyZWFkeSBwcmVwYXJlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXRJZCgpKTsKQEAgLTU2MTQsNyArNjUwMSw3IEBACiAKICAgICBhdXRvIGl0ID0gbVBlbmRpbmdTdHJlYW1zLmJlZ2luKCk7CiAgICAgZm9yICg7IGl0ICE9IG1QZW5kaW5nU3RyZWFtcy5lbmQoKTspIHsKLSAgICAgICAgcmVzID0gaXQtPnNlY29uZC0+c3RhcnRQcmVwYXJlKGl0LT5maXJzdCk7CisgICAgICAgIHJlcyA9IGl0LT5zZWNvbmQtPnN0YXJ0UHJlcGFyZShpdC0+Zmlyc3QsIHRydWUgLypibG9ja1JlcXVlc3QqLyk7CiAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeVByZXBhcmVkKGl0LT5zZWNvbmQtPmdldElkKCkpOwpAQCAtNTcyNCwyMyArNjYxMSwxNzQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLyoqCi0gKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gKi8KK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmluaXRpYWxpemUoCisgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhdHVzVHJhY2tlciBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c1Byb2Nlc3NDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLQotICAgIGQtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXNUcmFja2VyID0gc3RhdHVzVHJhY2tlcjsKKyAgICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNOb3RpZnkoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZykgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0gICAgZC0+bm90aWZ5KG1zZyk7Citib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OnN0YXJ0UmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1JFQURZIHx8IG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSB0cnVlOworICAgICAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi90cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjplbmRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIHdpdGhvdXQgYSBzdWNjZXNzZnVsIHN0YXJ0UmVxdWVzdEJ1ZmZlciBjYWxsIGZpcnN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi9mYWxzZSk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdHJlYW1zQ29uZmlndXJlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdWJtaXR0aW5nUmVxdWVzdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSBmYWxzZTsKKyAgICAvLyBpbmZsaWdodCBtYXAgcmVnaXN0ZXIgYWN0dWFsbHkgaGFwcGVucyBpbiBwcmVwYXJlSGFsUmVxdWVzdCBub3csIGJ1dCBpdCBpcyBjbG9zZSBlbm91Z2gKKyAgICAvLyBhcHByb3hpbWF0aW9uLgorICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1NUT1BQRUQpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uUmVxdWVzdFRocmVhZFBhdXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uSW5mbGlnaHRNYXBFbXB0eSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uV2FpdFVudGlsSWRsZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUEVORElOR19TVE9QOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6bm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSkgeworICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpIHsKKyAgICBpZiAobUluZmxpZ2h0TWFwRW1wdHkgJiYgbVJlcXVlc3RUaHJlYWRQYXVzZWQgJiYgIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgaW50MzJfdCB0YWdzVG9SZW1vdmVbXSA9IHsKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgfTsKKyAgICBmb3IgKGF1dG8gdGFnIDogdGFnc1RvUmVtb3ZlKSB7CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLmVyYXNlKHRhZyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlbW92ZSB0YWcgJWQgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBibEVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgYmxFbnRyeS5kYXRhLmZbaV0gPSBibEVudHJ5LmRhdGEuZlswXTsKKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG5wRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUpOworICAgIGlmIChucEVudHJ5LmNvdW50ID4gMCAmJiBucEVudHJ5LmNvdW50ICUgMiA9PSAwKSB7CisgICAgICAgIGRvdWJsZSBucFtdID0ge25wRW50cnkuZGF0YS5kWzBdLCBucEVudHJ5LmRhdGEuZFsxXX07CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFLCBucCwgMik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgU0VOU09SX05PSVNFX1BST0ZJTEU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGxzU2l6ZUVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsc0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCk7CisgICAgaWYgKGxzU2l6ZUVudHJ5LmNvdW50ID09IDIgJiYgbHNFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIChpbnQzMl90KWxzRW50cnkuY291bnQgPT0gNCAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV0pIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXTsgaSsrKSB7CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMV0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzJdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSszXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRQorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTgorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNiRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNnRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTik7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjckVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKTsKKyAgICBpZiAodGNiRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y2dFbnRyeS5jb3VudAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNyRW50cnkuY291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0Y2JFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICB0Y2JFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgICAgICB0Y2dFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCBkOGZlMTlmLi42ZThhYzg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMzMsMTAgKzMzLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCkBAIC01MCwyMCArNTEsNiBAQAogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogCi0vKioKLSAqIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgd2l0aCBDIGNhbGxpbmcgY29udmVudGlvbiB0bwotICogdXNlIGZvciBIQUwgY2FsbGJhY2sgZnVuY3Rpb25zLgotICovCi1leHRlcm4gIkMiIHsKLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90ICopOwotCi0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3Nfbm90aWZ5X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnX3QgKik7Ci19Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtODAsOCArNjcsNyBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBwcml2YXRlIGNhbWVyYTNfY2FsbGJhY2tfb3BzIHsKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrIHsKICAgcHVibGljOgogCiAgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCk7CkBAIC0xMDEsNiArODcsNyBAQAogICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgb3ZlcnJpZGU7CiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oKSBjb25zdCBvdmVycmlkZTsKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbyhjb25zdCBTdHJpbmc4JiBwaHlzaWNhbElkKSBjb25zdCBvdmVycmlkZTsKIAogICAgIC8vIENhcHR1cmUgYW5kIHNldFN0cmVhbWluZ1JlcXVlc3Qgd2lsbCBjb25maWd1cmUgc3RyZWFtcyBpZiBjdXJyZW50bHkgaW4KICAgICAvLyBpZGxlIHN0YXRlCkBAIC0yMDcsOCArMTk0LDMyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisgICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisgICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKwogICBwcml2YXRlOgogCisgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKwogICAgIC8vIGludGVybmFsIHR5cGVkZWZzCiAgICAgdXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKICAgICB1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlICA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwpAQCAtMjIwLDYgKzIzMSw3IEBACiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkID0gMjU2OyAvLyBiYXRjaCBzaXplIDMyICogcGlwZSBkZXB0aCA4CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uID0gMTAwMDAwMDAwOyAvLyAxMDAgbXMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrTWluSW5mbGlnaHREdXJhdGlvbiA9IDUwMDAwMDAwMDA7IC8vIDUgcworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtCYXNlR2V0QnVmZmVyV2FpdCA9IDMwMDAwMDAwMDA7IC8vIDMgc2VjLgogICAgIC8vIFNDSEVEX0ZJRk8gcHJpb3JpdHkgZm9yIHJlcXVlc3Qgc3VibWlzc2lvbiB0aHJlYWQgaW4gSEZSIG1vZGUKICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICAgICBrUmVxdWVzdFRocmVhZFByaW9yaXR5ID0gMTsKIApAQCAtMjY2LDcgKzI3OCw4IEBACiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyIHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIApAQCAtMjc2LDkgKzI4OSw2IEBACiAgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQogICAgICAgICB2b2lkIGNsZWFyKCk7CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgSGFsSW50ZXJmYWNlIHN1cHBvcnQgc2VuZGluZyByZXF1ZXN0cyBpbiBiYXRjaAotICAgICAgICBib29sIHN1cHBvcnRCYXRjaFJlcXVlc3QoKTsKLQogICAgICAgICAvLyBDYWxscyBpbnRvIHRoZSBIQUwgaW50ZXJmYWNlCiAKICAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKQEAgLTI4Nyw3ICsyOTcsMTEgQEAKICAgICAgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKICAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpOwotICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CisKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlIG93bmVyc2hpcCBvZiBhY3F1aXJlIGZlbmNlcyBpbiByZXF1ZXN0cyBpcyB0cmFuc2ZlcnJlZCB0bworICAgICAgICAvLyBIYWxJbnRlcmZhY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgdGhlIGZlbmNlIHRvCisgICAgICAgIC8vIEhBTCBwcm9jZXNzIGFuZCBjbG9zZSB0aGUgRkQgaW4gY2FtZXJhc2VydmVyIHByb2Nlc3MuIFdoZW4gdGhlIGNhbGwgZmFpbHMsIHRoZSBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIGFjcXVpcmUgZmVuY2Ugc3RpbGwgYmVsb25ncyB0byB0aGUgY2FsbGVyLgogICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpOwpAQCAtMjk1LDE0ICszMDksMzcgQEAKICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOwogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworICAgICAgICBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpOworCisgICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAorICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKIAorICAgICAgICAvLyBSZWdpc3RlciBhIGJ1ZklkIChzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90KSB0byBpbmZsaWdodCByZXF1ZXN0IGJ1ZmZlcgorICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCk7CisKKyAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgICAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCA9IG51bGxwdHIpOworCiAgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiAoZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSBwYWlyIG9mIGN1cnJlbnRseSBpbmZsaWdodAogICAgICAgICAvLyBidWZmZXJzCiAgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCk7CiAKKyAgICAgICAgLy8gR2V0IGEgdmVjdG9yIG9mIGJ1ZmZlcklkIG9mIGN1cnJlbnRseSBpbmZsaWdodCBidWZmZXJzCisgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cyhzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG91dCk7CisKKyAgICAgICAgdm9pZCBvblN0cmVhbVJlQ29uZmlndXJlZChpbnQgc3RyZWFtSWQpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTAsNiArMzQ3LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMxNywxNSArMzU2LDIzIEBACiAKICAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90CiAgICAgICAgIC8vIERvIG5vdCBmcmVlIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKLSAgICAgICAgdm9pZCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCiAgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKLSAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOwogCiAgICAgICAgIHN0YXR1c190IHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAotICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCBpbnQgYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7CisKKyAgICAgICAgLy8gUG9wIGluZmxpZ2h0IGJ1ZmZlcnMgYmFzZWQgb24gcGFpcnMgb2YgKGZyYW1lTnVtYmVyLHN0cmVhbUlkKQorICAgICAgICB2b2lkIHBvcEluZmxpZ2h0QnVmZmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+JiBidWZmZXJzKTsKKwogICAgICAgICAvLyBDYWNoZSBvZiBidWZmZXIgaGFuZGxlcyBrZXllZCBvZmYgKGZyYW1lTnVtYmVyIDw8IDMyIHwgc3RyZWFtSWQpCi0gICAgICAgIC8vIHZhbHVlIGlzIGEgcGFpciBvZiAoYnVmZmVyX2hhbmRsZV90KiwgYWNxdWlyZV9mZW5jZSBGRCkKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8YnVmZmVyX2hhbmRsZV90KiwgaW50Pj4gbUluZmxpZ2h0QnVmZmVyTWFwOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGJ1ZmZlcl9oYW5kbGVfdCo+IG1JbmZsaWdodEJ1ZmZlck1hcDsKKworICAgICAgICAvLyBEZWxldGUgYW5kIG9wdGlvbmFsbHkgY2xvc2UgbmF0aXZlIGhhbmRsZXMgYW5kIGNsZWFyIHRoZSBpbnB1dCB2ZWN0b3IgYWZ0ZXJ3YXJkCisgICAgICAgIHN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ICpoYW5kbGVzLCBib29sIGNsb3NlRmQgPSBmYWxzZSk7CiAKICAgICAgICAgc3RydWN0IEJ1ZmZlckhhc2hlciB7CiAgICAgICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZikgY29uc3QgewpAQCAtMzYxLDI0ICs0MDgsMjUgQEAKICAgICAgICAgLy8gc3RyZWFtIElEIC0+IHBlciBzdHJlYW0gYnVmZmVyIElEIG1hcAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBCdWZmZXJJZE1hcD4gbUJ1ZmZlcklkTWFwczsKICAgICAgICAgdWludDY0X3QgbU5leHRCdWZmZXJJZCA9IDE7IC8vIDAgbWVhbnMgbm8gYnVmZmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKLSAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHN3aXRjaCB0byB1c2UgZ3JhbGxvYyBtYXBwZXIncyBnZXRCYWNraW5nU3RvcmUgQVBJCi0gICAgICAgIC8vICAgICAgIG9uY2Ugd2UgcmFuIGluIGJpbmRlcml6ZWQgZ3JhbGxvYyBtb2RlLCBidXQgYmVmb3JlIHRoYXQgaXMgcmVhZHksCi0gICAgICAgIC8vICAgICAgIHdlIG5lZWQgdG8gcmVseSBvbiB0aGUgY29udmVudGlvbmFsIGJ1ZmZlciBxdWV1ZSBiZWhhdmlvciB3aGVyZQotICAgICAgICAvLyAgICAgICBidWZmZXJfaGFuZGxlX3QncyBGRCB3b24ndCBjaGFuZ2UuCi0gICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKLSAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJGcmVlZChpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCB1aW50NjRfdD4+IG1GcmVlZEJ1ZmZlcnM7CisKKyAgICAgICAgLy8gQnVmZmVycyBnaXZlbiB0byBIQUwgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0ZWRCdWZmZXJzTG9jazsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgYnVmZmVyX2hhbmRsZV90Kj4+IG1SZXF1ZXN0ZWRCdWZmZXJzOworCisgICAgICAgIHVpbnQzMl90IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciA9IDE7CisKKyAgICAgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKyAgICAgICAgYm9vbCBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZDsKICAgICB9OwogCiAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW50ZXJmYWNlOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbURldmljZUluZm87CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbVBoeXNpY2FsRGV2aWNlSW5mb01hcDsKIAogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVtDQU1FUkEzX1RFTVBMQVRFX0NPVU5UXTsKIApAQCAtNDA3LDkgKzQ1NSwyMiBAQAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgIG1FcnJvckNhdXNlOwogCi0gICAgLy8gTWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKLSAgICB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgotICAgICAgICAgICAgU3RyZWFtU2V0OworICAgIC8vIFN5bmNocm9uaXplZCBtYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcworICAgIGNsYXNzIFN0cmVhbVNldCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGFkZChpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+KTsKKyAgICAgICAgc3NpemVfdCByZW1vdmUoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZ2V0KGludCBzdHJlYW1JZCk7CisgICAgICAgIC8vIGdldCBieSAodW5kZXJseWluZykgdmVjdG9yIGluZGV4CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCk7CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+PiBtRGF0YTsKKyAgICB9OwogCiAgICAgU3RyZWFtU2V0ICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gbUlucHV0U3RyZWFtOwpAQCAtNDc4LDggKzUzOSw5IEBACiAKIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKICAgICAgKi8KKwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKQEAgLTQ5MCwxMSArNTUyLDIwIEBACiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CiAKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMpOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKICAgICBzdGF0dXNfdCByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQodWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KTsKQEAgLTY1MCwyNyArNzIxLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgbnNlY3NfdCBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKLSAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KLSAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLQogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CiAgICAgICAgIC8vIE1ldGFkYXRhIHRhZyBudW1iZXIsIGUuZy4gYW5kcm9pZC5jb250cm9sLmFlUHJlY2FwdHVyZVRyaWdnZXIKICAgICAgICAgdWludDMyX3QgbWV0YWRhdGFUYWc7CkBAIC02OTcsNyArNzQ3LDkgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC03ODUsNiArODM3LDggQEAKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTg1MCw5ICs5MDQsNiBAQAogICAgICAgICAvLyBDbGVhciByZXBlYXRpbmcgcmVxdWVzdHMuIE11c3QgYmUgY2FsbGVkIHdpdGggbVJlcXVlc3RMb2NrIGhlbGQuCiAgICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoLypvdXQqLyBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICAvLyBzZW5kIHJlcXVlc3QgaW4gbU5leHRSZXF1ZXN0cyB0byBIQUwgb25lIGJ5IG9uZS4gUmV0dXJuIHRydWUgPSBzdWNzc2VzcwotICAgICAgICBib29sIHNlbmRSZXF1ZXN0c09uZUJ5T25lKCk7Ci0KICAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGluIG1OZXh0UmVxdWVzdHMgdG8gSEFMIGluIGEgYmF0Y2guIFJldHVybiB0cnVlID0gc3Vjc3Nlc3MKICAgICAgICAgYm9vbCBzZW5kUmVxdWVzdHNCYXRjaCgpOwogCkBAIC04NjcsOCArOTE4LDggQEAKICAgICAgICAgYm9vbCBza2lwSEZSVGFyZ2V0RlBTVXBkYXRlKGludDMyX3QgdGFnLCBjb25zdCBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCYgbmV3RW50cnksCiAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QmIGN1cnJlbnRFbnRyeSk7CiAKLSAgICAgICAgLy8gUmUtY29uZmlndXJlIGNhbWVyYSB1c2luZyB0aGUgbGF0ZXN0IHNlc3Npb24gcGFyYW1ldGVycy4KLSAgICAgICAgYm9vbCByZWNvbmZpZ3VyZUNhbWVyYSgpOworICAgICAgICAvLyBVcGRhdGUgbmV4dCByZXF1ZXN0IHNlbnQgdG8gSEFMCisgICAgICAgIHZvaWQgdXBkYXRlTmV4dFJlcXVlc3QoTmV4dFJlcXVlc3QmIG5leHRSZXF1ZXN0KTsKIAogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwpAQCAtODk0LDEyICs5NDUsMTMgQEAKIAogICAgICAgICBib29sICAgICAgICAgICAgICAgbVJlY29uZmlndXJlZDsKIAotICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCBhbmQgd2FpdFVudGlsUGF1c2VkCisgICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIHdhaXRVbnRpbFBhdXNlZCwgYW5kIHNpZ25hbFBpcGVsaW5lRHJhaW4KICAgICAgICAgTXV0ZXggICAgICAgICAgICAgIG1QYXVzZUxvY2s7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtRG9QYXVzZTsKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1Eb1BhdXNlU2lnbmFsOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbVBhdXNlZDsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1QYXVzZWRTaWduYWw7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZDsKIAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbVByZXZSZXF1ZXN0OwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbVByZXZUcmlnZ2VyczsKQEAgLTkxMSw2ICs5NjMsNyBAQAogICAgICAgICAvLyBhbmRyb2lkLnJlcXVlc3QuaWQgZm9yIGxhdGVzdCBwcm9jZXNzX2NhcHR1cmVfcmVxdWVzdAogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZDsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgIG1MYXRlc3RSZXF1ZXN0OworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0OwogCiAgICAgICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8dWludDMyX3QvKnRhZyovLCBSZXF1ZXN0VHJpZ2dlcj4gVHJpZ2dlck1hcDsKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgIG1UcmlnZ2VyTXV0ZXg7CkBAIC05MzIsNiArOTg1LDggQEAKIAogICAgICAgICBWZWN0b3I8aW50MzJfdD4gICAgbVNlc3Npb25QYXJhbUtleXM7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtczsKKworICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtOTkyLDYgKzEwNDcsMTUgQEAKICAgICAgICAgLy8gTWFwIG9mIHBoeXNpY2FsQ2FtZXJhSWQgPC0+IE1ldGFkYXRhCiAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsTWV0YWRhdGFzOwogCisgICAgICAgIC8vIEluZGljYXRlcyBhIHN0aWxsIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgYm9vbCBzdGlsbENhcHR1cmU7CisKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBib29sIHpzbENhcHR1cmU7CisKKyAgICAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bworICAgICAgICBTdXJmYWNlTWFwIG91dHB1dFN1cmZhY2VzOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtMTAwMiwxMiArMTA2NiwxNiBAQAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCkgOgorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xMDE4LDcgKzEwODYsMTAgQEAKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGlzU3RpbGxDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTEwMzIsMTAgKzExMDMsMTEgQEAKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0U3RhdHVzSWQ7CiAKLQogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtMTEyMCwxMCArMTE5MiwxNCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcjsKICAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgcmVwcm9jZXNzIHJlc3VsdAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcjsKKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgWlNMIHN0aWxsIGNhcHR1cmUgcmVzdWx0CisgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IG5vbi1yZXByb2Nlc3Mgc2h1dHRlcgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXI7CiAgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IHJlcHJvY2VzcyBzaHV0dGVyCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlcjsKKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgWlNMIHN0aWxsIGNhcHR1cmUgc2h1dHRlcgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlcjsKICAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKICAgICB3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gIG1MaXN0ZW5lcjsKQEAgLTExNDUsNyArMTIyMSwxMSBAQAogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIHN0cmVhbXMuCiAgICAgdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAorICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKIAogICAgIC8vIFNlbmQgYSBwYXJ0aWFsIGNhcHR1cmUgcmVzdWx0LgogICAgIHZvaWQgc2VuZFBhcnRpYWxDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogcGFydGlhbFJlc3VsdCwKQEAgLTExNTYsNyArMTIzNiw4IEBACiAgICAgdm9pZCBzZW5kQ2FwdHVyZVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcGVuZGluZ01ldGFkYXRhLAogICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgYm9vbCByZXByb2Nlc3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbE1ldGFkYXRhcyk7CisgICAgICAgICAgICBib29sIHJlcHJvY2VzcywgYm9vbCB6c2xTdGlsbENhcHR1cmUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxNZXRhZGF0YXMpOwogCiAgICAgYm9vbCBpc0xhc3RGdWxsUmVzdWx0KGNvbnN0IEluRmxpZ2h0UmVxdWVzdCYgaW5GbGlnaHRSZXF1ZXN0KTsKIApAQCAtMTE4Myw4ICsxMjY0LDEwIEBACiAgICAgLyoqCiAgICAgICogRGlzdG9ydGlvbiBjb3JyZWN0aW9uIHN1cHBvcnQKICAgICAgKi8KLQotICAgIGNhbWVyYTM6OkRpc3RvcnRpb25NYXBwZXIgbURpc3RvcnRpb25NYXBwZXI7CisgICAgLy8gTWFwIGZyb20gY2FtZXJhIElEcyB0byBpdHMgY29ycmVzcG9uZGluZyBkaXN0b3J0aW9uIG1hcHBlci4gT25seSBjb250YWlucworICAgIC8vIDEgSUQgaWYgdGhlIGRldmljZSBpc24ndCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLiBPdGhlcndpc2UgY29udGFpbnMgYm90aAorICAgIC8vIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgc3ViY2FtZXJhcy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6OkRpc3RvcnRpb25NYXBwZXI+IG1EaXN0b3J0aW9uTWFwcGVyczsKIAogICAgIC8vIERlYnVnIHRyYWNrZXIgZm9yIG1ldGFkYXRhIHRhZyB2YWx1ZSBjaGFuZ2VzCiAgICAgLy8gLSBFbmFibGVkIHdpdGggdGhlIC1tIDx0YWdsaXN0PiBvcHRpb24gdG8gZHVtcHN5cywgc3VjaCBhcwpAQCAtMTE5NCwyMCArMTI3Nyw5NiBAQAogICAgIFRhZ01vbml0b3IgbVRhZ01vbml0b3I7CiAKICAgICB2b2lkIG1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CiAKICAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtVmVuZG9yVGFnSWQ7CiAKICAgICAvLyBDYWNoZWQgbGFzdCByZXF1ZXN0ZWQgdGVtcGxhdGUgaWQKICAgICBpbnQgbUxhc3RUZW1wbGF0ZUlkOwogCi0gICAgLyoqCi0gICAgICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICAgICAqLwotICAgIHN0YXRpYyBjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90IHNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKKyAgICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHN0YXR1cyB0cmFja2VyIGJldHdlZW4gaW5mbGlnaHQgdXBkYXRlcyBhbmQgZGlzY29ubmVjdC4KKyAgICAvLyBiLzc5OTcyODY1CisgICAgTXV0ZXggbVRyYWNrZXJMb2NrOwogCi0gICAgc3RhdGljIGNhbGxiYWNrc19ub3RpZnlfdCBzTm90aWZ5OworICAgIC8vIFdoZXRoZXIgSEFMIHJlcXVlc3QgYnVmZmVycyB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXJzIEFQSQorICAgIGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZTsKIAorICAgIC8vIExvY2sgdG8gZW5zdXJlIHJlcXVlc3RTdHJlYW1CdWZmZXJzKCkgY2FsbGJhY2tzIGFyZSBzZXJpYWxpemVkCisgICAgc3RkOjptdXRleCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2s7CisKKyAgICAvLyBUaGUgc3RhdGUgbWFjaGluZSB0byBjb250cm9sIHdoZW4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgc2hvdWxkIGFsbG93CisgICAgLy8gSEFMIHRvIHJlcXVlc3QgYnVmZmVycy4KKyAgICBlbnVtIFJlcXVlc3RCdWZmZXJTdGF0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcmV0dXJuIEZBSUxFRF9DT05GSUdVUklORyBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaWxsIHN3aXRjaCB0byBSQl9TVEFUVVNfUkVBRFkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbmZpZ3VyZVN0cmVhbXMgb3IKKyAgICAgICAgICogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IGNhbGwuCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfU1RPUFBFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2hlbiBkZXZpY2UgaXMgYXNrZWQgdG8gc3RheSBpZGxlIHZpYSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKSBjYWxsOgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgaWYgdGhlcmUgaXMgbm8gaW5mbGlnaHQgcmVxdWVzdHMgYW5kCisgICAgICAgICAqICAgICAgIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19QRU5ESU5HX1NUT1Agb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCB3aGVuIGFsbCBpbmZsaWdodCByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkCisgICAgICAgICAqIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19QRU5ESU5HX1NUT1AsCisgICAgfTsKKworICAgIGNsYXNzIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpOworCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc3RhdGUgbWFjaGluZSBjdXJyZW50bHkgYWxsb3dzIGZvciByZXF1ZXN0QnVmZmVycworICAgICAgICAvLyBJZiB0aGUgc3RhdGUgYWxsb3dzIGZvciBpdCwgbVJlcXVlc3RCdWZmZXJPbmdvaW5nIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgLy8gYW5kIGNhbGxlciBtdXN0IGNhbGwgZW5kUmVxdWVzdEJ1ZmZlcigpIGxhdGVyIHRvIHVuc2V0IHRoZSBmbGFnCisgICAgICAgIGJvb2wgc3RhcnRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgIHZvaWQgZW5kUmVxdWVzdEJ1ZmZlcigpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgYXBwbGljYXRpb24gQVBJIGNhbGwKKyAgICAgICAgdm9pZCBvblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgICAgIHZvaWQgb25XYWl0VW50aWxJZGxlKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IGh3QmluZGVyIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBCdXQgY2FuIGFsc28gYmUgdHJpZ2dlcmVkIG9uIHJlcXVlc3QgdGhyZWFkIGZvciBmYWlsZWQgcmVxdWVzdCwgb3Igb24KKyAgICAgICAgLy8gaHdiaW5kZXIgbm90aWZ5IGNhbGxiYWNrIHRocmVhZCBmb3Igc2h1dHRlci9lcnJvciBjYWxsYmFja3MKKyAgICAgICAgdm9pZCBvbkluZmxpZ2h0TWFwRW1wdHkoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IFJlcXVlc3RUaHJlYWQKKyAgICAgICAgdm9pZCBvblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgICAgIHZvaWQgb25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSk7CisKKyAgICAgICAgLy8gU3dpdGNoIHRvIFNUT1BQRUQgc3RhdGUgYW5kIHJldHVybiB0cnVlIGlmIGFsbCBjb25kaXRpb25zIGFsbG93cyBmb3IgaXQuCisgICAgICAgIC8vIE90aGVyd2lzZSBkbyBub3RoaW5nIGFuZCByZXR1cm4gZmFsc2UuCisgICAgICAgIGJvb2wgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBSZXF1ZXN0QnVmZmVyU3RhdGUgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworCisgICAgICAgIGJvb2wgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgICAgICBib29sIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSBmYWxzZTsKKworICAgICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKKyAgICAgICAgaW50ICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkOworICAgIH0gbVJlcXVlc3RCdWZmZXJTTTsKKworICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGJvb2wgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzOworICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSk7CiB9OyAvLyBjbGFzcyBDYW1lcmEzRGV2aWNlCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKaW5kZXggZmIxZmY3Ny4uYjYzNzE2MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC01OCw2ICs1OCw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKICAgICAgICAgICAgIG5zZWNzX3QsCiAgICAgICAgICAgICBib29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4qKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDQ2Mjc1NDguLjRiNjdlYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtODcsNiArODcsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTA0LDYgKzEwNyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMTI4LDcgKzEzMiw3IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IDNjMWU0M2QuLmVmMGQ5MTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtODIsNiArODIsOSBAQAogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICV6dVxuIiwgbU1heFNpemUpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICUiIFBSSXU2NCAiLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAogICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICBpZiAoc3RybGVuKGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpID4gMCkgeworICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFBoeXNpY2FsIGNhbWVyYSBpZDogJXNcbiIsIGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpOworICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLApAQCAtMTE2LDcgKzExOSw3IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCi1zaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKIH0KIApAQCAtMjE5LDcgKzIyMiw4IEBACiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpyZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgLy8gcmV0dXJuQnVmZmVyIG1heSBiZSBjYWxsZWQgZnJvbSBhIHJhdyBwb2ludGVyLCBub3QgYSBzcDw+LCBhbmQgd2UnbGwgYmUKQEAgLTIzNSw3ICsyMzksNyBAQAogICAgIH0KIAogICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2U7Ci0gICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LAorICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIG91dHB1dCwgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZUZlbmNlKTsKICAgICAvLyBSZXMgbWF5IGJlIGFuIGVycm9yLCBidXQgd2Ugc3RpbGwgd2FudCB0byBkZWNyZW1lbnQgb3VyIG93bmVkIGNvdW50CiAgICAgLy8gdG8gZW5hYmxlIGNsZWFuIHNodXRkb3duLiBTbyB3ZSdsbCBqdXN0IHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCAwYTMxZDQ0Li43NTBmNjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtNjYsMTIgKzY2LDE0IEBACiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSA9IDA7CiAKQEAgLTgyLDcgKzg0LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDAxN2Q3YmUuLmZjODM2ODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggMDczMjQ2NC4uOTdhNjI3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC02Miw2ICs2Miw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMmMwMjBhMi4uYWNiOGIzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0xODcsMTYgKzE4NywxNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIHJldHVybiBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgLypvdXRwdXQqL3RydWUpOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgLypvdXRwdXQqL3RydWUsIHN1cmZhY2VfaWRzKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTIxMiw2ICsyMTMsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCkBAIC0yMzEsMjQgKzIzMywyNyBAQAogICAgICAqIHF1ZXVlQnVmZmVyCiAgICAgICovCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gY3VycmVudENvbnN1bWVyID0gbUNvbnN1bWVyOworICAgIFN0cmVhbVN0YXRlIHN0YXRlID0gbVN0YXRlOwogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW53QnVmZmVyID0gY29udGFpbmVyX29mKGJ1ZmZlci5idWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSk7CiAgICAgLyoqCiAgICAgICogUmV0dXJuIGJ1ZmZlciBiYWNrIHRvIEFOYXRpdmVXaW5kb3cKICAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogQSBmcmFtZSBpcyBkcm9wcGVkIGZvciBzdHJlYW0gJWQgZHVlIHRvIGJ1ZmZlciBlcnJvci4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wIHNob3VsZG4ndCBiZSAwIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICB9CiAKICAgICAgICAgcmVzID0gY3VycmVudENvbnN1bWVyLT5jYW5jZWxCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgICAgIGFud0J1ZmZlciwKICAgICAgICAgICAgICAgICBhbndSZWxlYXNlRmVuY2UpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIHN0YXRlKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIGNhbmNlbGxpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6IgogICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CkBAIC0yNzksMTAgKzI4NCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiAiCi0gICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKKyAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWVpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6IgorICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CiAgICAgfQogICAgIG1Mb2NrLmxvY2soKTsKQEAgLTM1NSw3ICszNjAsMTggQEAKICAgICAvLyBTZXQgZGVxdWV1ZUJ1ZmZlci9hdHRhY2hCdWZmZXIgdGltZW91dCBpZiB0aGUgY29uc3VtZXIgaXMgbm90IGh3IGNvbXBvc2VyIG9yIGh3IHRleHR1cmUuCiAgICAgLy8gV2UgbmVlZCBza2lwIHRoZXNlIGNhc2VzIGFzIHRpbWVvdXQgd2lsbCBkaXNhYmxlIHRoZSBub24tYmxvY2tpbmcgKGFzeW5jKSBtb2RlLgogICAgIGlmICghKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8fCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSkpIHsKLSAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gYnVmZmVyIG1hbmFnZXIgaXMgaGFuZGxpbmcgdGhlIGJ1ZmZlciwgd2Ugc2hvdWxkIGhhdmUgYXZhaWxhYmxlIGJ1ZmZlcnMgaW4KKyAgICAgICAgICAgIC8vIGJ1ZmZlciBxdWV1ZSBiZWZvcmUgd2UgY2FsbHMgaW50byBkZXF1ZXVlQnVmZmVyIGJlY2F1c2UgYnVmZmVyIG1hbmFnZXIgaXMgdHJhY2tpbmcKKyAgICAgICAgICAgIC8vIGZyZWUgYnVmZmVycy4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBob3dldmVyIHNvbWUgY29uc3VtZXIgc2lkZSBmZWF0dXJlIChJbWFnZVJlYWRlcjo6ZGlzY2FyZEZyZWVCdWZmZXJzKSB0aGF0CisgICAgICAgICAgICAvLyBjYW4gZGlzY2FyZCBmcmVlIGJ1ZmZlcnMgd2l0aG91dCBub3RpZnlpbmcgYnVmZmVyIG1hbmFnZXIuIFdlIHdhbnQgdGhlIHRpbWVvdXQgdG8KKyAgICAgICAgICAgIC8vIGhhcHBlbiBpbW1lZGlhdGVseSBoZXJlIHNvIGJ1ZmZlciBtYW5hZ2VyIGNhbiB0cnkgdG8gdXBkYXRlIGl0cyBpbnRlcm5hbCBzdGF0ZSBhbmQKKyAgICAgICAgICAgIC8vIHRyeSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBpbnN0ZWFkIG9mIHdhaXRpbmcuCisgICAgICAgICAgICBtQ29uc3VtZXItPnNldERlcXVldWVUaW1lb3V0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNDc1LDggKzQ5MSwxMSBAQAogICAgICAqIHNldHMgdGhlIG1CdWZmZXJNYW5hZ2VyIGlmIGRldmljZSB2ZXJzaW9uIGlzID4gSEFMMy4yLCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlIGJ1ZmZlcgogICAgICAqIG1hbmFnZXIgc2V0dXAgaXMgc2tpcHBlZCBpbiBiZWxvdyBjb2RlLiBOb3RlIHRoYXQgSEFMMy4yIGlzIGFsc28gZXhjbHVkZWQgaGVyZSwgYXMgc29tZQogICAgICAqIEhBTDMuMiBkZXZpY2VzIG1heSBub3Qgc3VwcG9ydCB0aGUgZHluYW1pYyBidWZmZXIgcmVnaXN0ZXJhdGlvbi4KKyAgICAgKiBBbHNvIENhbWVyYTNCdWZmZXJNYW5hZ2VyIGRvZXMgbm90IHN1cHBvcnQgZGlzcGxheS90ZXh0dXJlIHN0cmVhbXMgYXMgdGhleSBoYXZlIGl0cyBvd24KKyAgICAgKiBidWZmZXIgbWFuYWdlbWVudCBsb2dpYy4KICAgICAgKi8KLSAgICBpZiAobUJ1ZmZlck1hbmFnZXIgIT0gMCAmJiBtU2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgeworICAgIGlmIChtQnVmZmVyTWFuYWdlciAhPSAwICYmIG1TZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEICYmCisgICAgICAgICAgICAhKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8fCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSkpIHsKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgICAgIGdldEVuZHBvaW50VXNhZ2UoJmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICBTdHJlYW1JbmZvIHN0cmVhbUluZm8oCkBAIC01MTksOSArNTM4LDEyIEBACiAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHJldHVybi4KICAgICAgICAgICAgICphbmIgPSBnYi5nZXQoKTsKICAgICAgICAgICAgIHJlcyA9IG1Db25zdW1lci0+YXR0YWNoQnVmZmVyKCphbmIpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhpcyBzdXJmYWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RCdWZmZXJGcm9tTWFuYWdlciA9IHRydWU7CkBAIC01NTgsMzUgKzU4MCw4MiBAQAogICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3kuYWRkKGRlcXVldWVTdGFydCwgZGVxdWV1ZUVuZCk7CiAKICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZGVxdWV1ZSBuZXh0IG91dHB1dCBidWZmZXI6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAKLSAgICAgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICAgICAgaWYgKChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZCgpOworCisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYjsKKyAgICAgICAgICAgIHJlcyA9IG1CdWZmZXJNYW5hZ2VyLT5nZXRCdWZmZXJGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksICZnYiwgZmVuY2VGZCwgLypub0ZyZWVCdWZmZXIqL3RydWUpOworCisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRoaXMgYnVmZmVyIHRvIHRoZSBidWZmZXJRdWV1ZTogdGhlIGJ1ZmZlciB3aWxsIGJlIGluIGRlcXVldWUgc3RhdGUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgcmV0dXJuLgorICAgICAgICAgICAgICAgICphbmIgPSBnYi5nZXQoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigqYW5iKTsKKyAgICAgICAgICAgICAgICBnb3RCdWZmZXJGcm9tTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSAlZDogQXR0YWNoZWQgbmV3IGJ1ZmZlciIsIGdldElkKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBtU3RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgYXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoaXMgc3VyZmFjZToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBuZXh0IG91dHB1dCBidWZmZXIgZnJvbSBidWZmZXIgbWFuYWdlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0KLQorICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBkZXF1ZXVlIG5leHQgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IHJlbW92ZWRCdWZmZXJzOwotICAgICAgICByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7Ci0KLSAgICAgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlciAmJiByZW1vdmVkQnVmZmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKGJvb2wgbm90aWZ5QnVmZmVyTWFuYWdlcikgeworICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChub3RpZnlCdWZmZXJNYW5hZ2VyICYmIG1Vc2VCdWZmZXJNYW5hZ2VyICYmIHJlbW92ZWRCdWZmZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlcnNSZW1vdmVkKGdldElkKCksIGdldFN0cmVhbVNldElkKCksIHJlbW92ZWRCdWZmZXJzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQoc3RhdHVzX3QgcmVzKSB7CisgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcworICAgIC8vIFNUQVRFX1BSRVBBUklORywgbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgIGlmICgocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgfQorfQorCitib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OnNob3VsZExvZ0Vycm9yKHN0YXR1c190IHJlcywgU3RyZWFtU3RhdGUgc3RhdGUpIHsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChyZXMgPT0gREVBRF9PQkpFQ1QgfHwgcmVzID09IE5PX0lOSVQpICYmIHN0YXRlID09IFNUQVRFX0FCQU5ET05FRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlczsKIApAQCAtNjU5LDEyICs3MjgsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHVpbnQ2NF90IHUgPSAwOwordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKSB7CisgICAgaWYgKGNvbnN1bWVyVXNhZ2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CiAgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCiAgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCiAgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCkBAIC02NzMsMTIgKzc0MSwyMCBAQAogICAgIC8vICAgICAyLiBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUgogICAgIC8vICAgICAzLiBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCiAgICAgLy8gICAgIDQuIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUgotICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgKHUgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAorICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAoKmNvbnN1bWVyVXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikpID09IDApIHsKLSAgICAgICAgdSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CisgICAgICAgICpjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKICAgICB9Cit9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgdWludDY0X3QgdSA9IDA7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKKyAgICBhcHBseVpTTFVzYWdlUXVpcmsoY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgJnUpOwogICAgICp1c2FnZSA9IHU7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTc3OSw3ICs4NTUsOSBAQAogICAgICAgICBBTE9HVygiJXM6IHRoZSByZWxlYXNlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBmcmVlZCBieSB0aGUgYnVmZmVyIHF1ZXVlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgLy8gVHJlYXQgb3RoZXIgZXJyb3JzIGFzIGFiYW5kb25tZW50Ci0gICAgICAgIEFMT0dFKCIlczogZGV0YWNoIG5leHQgYnVmZmVyIGZhaWxlZDogJXMgKCVkKS4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBtU3RhdGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGRldGFjaCBuZXh0IGJ1ZmZlciBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNzkyLDExICs4NzAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IHJlbW92ZWRCdWZmZXJzOwotICAgIHJlcyA9IG1Db25zdW1lci0+Z2V0QW5kRmx1c2hSZW1vdmVkQnVmZmVycygmcmVtb3ZlZEJ1ZmZlcnMpOwotICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7Ci0gICAgfQorICAgIC8vIEhlcmUgd2UgYXNzdW1lIGRldGFjaEJ1ZmZlciBpcyBjYWxsZWQgYnkgYnVmZmVyIG1hbmFnZXIgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIG5vdGlmaWVkCisgICAgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZCgvKm5vdGlmeUJ1ZmZlck1hbmFnZXIqL2ZhbHNlKTsKICAgICByZXR1cm4gcmVzOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDZmMzZmOTIuLjcyOWM2NTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC0xOTAsNiArMTkwLDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KQEAgLTE5OCw2ICsyMDEsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pOwogCisgICAgLyoqCisgICAgICogQXBwbHkgWlNMIHJlbGF0ZWQgY29uc3VtZXIgdXNhZ2UgcXVpcmsuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYXBwbHlaU0xVc2FnZVF1aXJrKGludCBmb3JtYXQsIHVpbnQ2NF90ICpjb25zdW1lclVzYWdlIC8qaW5vdXQqLyk7CisKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCkBAIC0yMTMsNiArMjIxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0yODUsMTAgKzI5NCwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCkBAIC0yOTksNiArMzA5LDE3IEBACiAgICAgICovCiAgICAgdm9pZCBvbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiYpOwogICAgIHN0YXR1c190IGRldGFjaEJ1ZmZlckxvY2tlZChzcDxHcmFwaGljQnVmZmVyPiogYnVmZmVyLCBpbnQqIGZlbmNlRmQpOworICAgIC8vIENhbGwgdGhpcyBhZnRlciBlYWNoIGRlcXVldWVCdWZmZXIvYXR0YWNoQnVmZmVyL2RldGFjaE5leHRCdWZmZXIgY2FsbCB0byBnZXQgdXBkYXRlIG9uCisgICAgLy8gcmVtb3ZlZCBidWZmZXJzLiBTZXQgbm90aWZ5QnVmZmVyTWFuYWdlciB0byBmYWxzZSB3aGVuIHRoZSBjYWxsIGlzIGluaXRpYXRlZCBieSBidWZmZXIKKyAgICAvLyBtYW5hZ2VyIHNvIGJ1ZmZlciBtYW5hZ2VyIGRvZXNuJ3QgbmVlZCB0byBiZSBub3RpZmllZC4KKyAgICB2b2lkIGNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoYm9vbCBub3RpZnlCdWZmZXJNYW5hZ2VyID0gdHJ1ZSk7CisKKyAgICAvLyBDaGVjayByZXR1cm4gc3RhdHVzIG9mIElHQlAgY2FsbHMgYW5kIHNldCBhYmFuZG9uZWQgc3RhdGUgYWNjb3JkaW5nbHkKKyAgICB2b2lkIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHN0YXR1c190IHJlcyk7CisKKyAgICAvLyBJZiB0aGUgc3RhdHVzIGluZGljYXRlcyBhYmFuZG9uZGVkIHN0cmVhbSwgb25seSBsb2cgd2hlbiBzdGF0ZSBoYXNuJ3QgYmVlbiB1cGRhdGVkIHRvCisgICAgLy8gU1RBVEVfQUJBTkRPTkVECisgICAgc3RhdGljIGJvb2wgc2hvdWxkTG9nRXJyb3Ioc3RhdHVzX3QgcmVzLCBTdHJlYW1TdGF0ZSBzdGF0ZSk7CiAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVxdWV1ZUxhdGVuY3lCaW5TaXplID0gNTsgLy8gaW4gbXMKICAgICBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggYTcxMWE2ZC4uMmJkZTk0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgKQEAgLTY3LDYgKzY3LDE4IEBACiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhbmQgb25seSBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiBzdXJmYWNlIHNoYXJpbmcuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDJiYjlmZjcuLjg2YjQ1Y2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1TaGFyZWRPdVN0cm0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgIkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjgsMTYgKzMyLDE3IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGludCBzZXRJZCkgOgorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gc3RkOjptaW4oc3VyZmFjZXMuc2l6ZSgpLCBrTWF4T3V0cHV0cyk7CiAgICAgaWYgKHN1cmZhY2VzLnNpemUoKSA+IGNvbnN1bWVyQ291bnQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gYWRkIG1vcmUgY29uc3VtZXJzIHRoYW4gdGhlIG1heGltdW0gIiwgX19mdW5jX18pOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN1bWVyQ291bnQ7IGkrKykgewotICAgICAgICBtU3VyZmFjZXNbaV0gPSBzdXJmYWNlc1tpXTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaV0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlc1tpXSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogfQogCkBAIC00OCwyMSArNTMsMjAgQEAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKTsKKyAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKG1Vc2VIYWxCdWZNYW5hZ2VyKTsKIAotICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gaW5pdGlhbFN1cmZhY2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGluaXRpYWxTdXJmYWNlcy5lbXBsYWNlKGksIG1TdXJmYWNlc1tpXSk7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQgPSBpc0Zvcm1hdE92ZXJyaWRkZW4oKSA/IGdldE9yaWdpbmFsRm9ybWF0KCkgOiBnZXRGb3JtYXQoKTsKICAgICByZXMgPSBtU3RyZWFtU3BsaXR0ZXItPmNvbm5lY3QoaW5pdGlhbFN1cmZhY2VzLCB1c2FnZSwgbVVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMsCi0gICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZm9ybWF0LCAmbUNvbnN1bWVyKTsKKyAgICAgICAgICAgIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBnZXRGb3JtYXQoKSwgJm1Db25zdW1lcik7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25uZWN0IHRvIHN0cmVhbSBzcGxpdHRlcjogJXMoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNzIsNiArNzYsMzEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjphdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKAorICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgorICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKKyAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCisgICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKKyAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06Om5vdGlmeUJ1ZmZlclJlbGVhc2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFud0J1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKQEAgLTkwLDcgKzExOSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiAobVN1cmZhY2VzW3N1cmZhY2VfaWRdID09IG51bGxwdHIpOworICAgIHJldHVybiAobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZV9pZF0uZmlyc3QgPT0gbnVsbHB0cik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzKSB7CkBAIC0xMTMsNyArMTQyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KIAotICAgICAgICBtU3VyZmFjZXNbaWRdID0gc3VyZmFjZTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaWRdID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAKICAgICAgICAgLy8gT25seSBjYWxsIGFkZE91dHB1dCBpZiB0aGUgc3BsaXR0ZXIgaGFzIGJlZW4gY29ubmVjdGVkLgogICAgICAgICBpZiAobVN0cmVhbVNwbGl0dGVyICE9IG51bGxwdHIpIHsKQEAgLTEyOSw3ICsxNTgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMpIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CiAgICAgaW50IGZlbmNlRmQgPSAtMTsKIApAQCAtMTM5LDIzICsxNjgsMTEgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvLyBBdHRhY2ggdGhlIGJ1ZmZlciB0byB0aGUgc3BsaXR0ZXIgb3V0cHV0IHF1ZXVlcy4gVGhpcyBjb3VsZCBibG9jayBpZgotICAgIC8vIHRoZSBvdXRwdXQgcXVldWUgZG9lc24ndCBoYXZlIGFueSBlbXB0eSBzbG90LiBTbyB1bmxvY2sgZHVyaW5nIHRoZSBjb3Vyc2UKLSAgICAvLyBvZiBhdHRhY2hCdWZmZXJUb091dHB1dHMuCi0gICAgc3A8Q2FtZXJhM1N0cmVhbVNwbGl0dGVyPiBzcGxpdHRlciA9IG1TdHJlYW1TcGxpdHRlcjsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXMgPSBzcGxpdHRlci0+YXR0YWNoQnVmZmVyVG9PdXRwdXRzKGFuYiwgc3VyZmFjZV9pZHMpOwotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW5ub3QgYXR0YWNoIHN0cmVhbSBzcGxpdHRlciBidWZmZXIgdG8gb3V0cHV0czogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYW5iLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjksOCArMTg2LDM4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgaWYgKHVuaXF1ZVN1cmZhY2VJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5pcXVlU3VyZmFjZUlkcyBtdXN0IG5vdCBiZSBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3VyZmFjZUlkczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB1bmlxdWVJZCA6IHVuaXF1ZVN1cmZhY2VJZHMpIHsKKyAgICAgICAgICAgIGJvb2wgdW5pcXVlSWRGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLnNlY29uZCA9PSB1bmlxdWVJZCkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlSWRzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdW5pcXVlSWRGb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogdW5rbm93biB1bmlxdWUgc3VyZmFjZSBJRCAlenUgZm9yIHN0cmVhbSAlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1bmlxdWVJZCwgbUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGJ1ZmZlciwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBjb25zdW1lci0+cXVldWVCdWZmZXIoY29uc3VtZXIuZ2V0KCksIGJ1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKIAogICAgIC8vIEFmdGVyIHF1ZXVpbmcgYnVmZmVyIHRvIHRoZSBpbnRlcm5hbCBjb25zdW1lciBxdWV1ZSwgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVyIGlzCiAgICAgLy8gc3VjY2Vzc2Z1bGx5IHF1ZXVlZCB0byB0aGUgb3V0cHV0IHF1ZXVlcy4KQEAgLTIyOSw4ICsyNzYsOCBAQAogICAgICAgICAqdXNhZ2UgPSBnZXRQcmVzZXRDb25zdW1lclVzYWdlKCk7CiAKICAgICAgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGtNYXhPdXRwdXRzOyBpZCsrKSB7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VzW2lkXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlc1tpZF0pOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIG1TdXJmYWNlVW5pcXVlSWRzW2lkXS5maXJzdCk7CiAgICAgICAgICAgICAgICAgKnVzYWdlIHw9IHU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI0Niw3ICsyOTMsNyBAQAogc3NpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCkgewogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjU5LDcgKzMwNiw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNzaXplX3QgaWQgPSAtMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBzdXJmYWNlKSB7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCA9PSBzdXJmYWNlKSB7CiAgICAgICAgICAgICBpZCA9IGk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjY4LDYgKzMxNSwyNiBAQAogICAgIHJldHVybiBpZDsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0VW5pcXVlU3VyZmFjZUlkcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAob3V0VW5pcXVlSWRzID09IG51bGxwdHIgfHwgc3VyZmFjZUlkcy5zaXplKCkgPiBrTWF4T3V0cHV0cykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG91dFVuaXF1ZUlkcy0+Y2xlYXIoKTsKKyAgICBvdXRVbmlxdWVJZHMtPnJlc2VydmUoc3VyZmFjZUlkcy5zaXplKCkpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBzdXJmYWNlSWQgOiBzdXJmYWNlSWRzKSB7CisgICAgICAgIGlmIChzdXJmYWNlSWQgPj0ga01heE91dHB1dHMpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgb3V0VW5pcXVlSWRzLT5wdXNoX2JhY2sobVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXS5zZWNvbmQpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OnJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQoCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZXMsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICZhdHRhY2hlZFN1cmZhY2VzKSB7CkBAIC0yODEsNyArMzQ4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gbnVsbHB0cjsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkU3VyZmFjZXMuc2l6ZSgpOyBpKyspIHsKQEAgLTI5Miw3ICszNTksOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKSwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKQEAgLTM0NCw4ICs0MTIsOCBAQAogCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2l0XSA9IG51bGxwdHI7Ci0gICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VzW2l0XSwgaXQpOworICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlVW5pcXVlSWRzW2l0XS5maXJzdCwgaXQpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpdF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICAvL05leHQgYWRkIHRoZSBuZXcgb3V0cHV0cwpAQCAtMzcwLDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbc3VyZmFjZUlkXSA9IGl0OworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdID0gc3RkOjptYWtlX3BhaXIoaXQsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgICAgICBvdXRwdXRNYXAtPmFkZChpdCwgc3VyZmFjZUlkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKaW5kZXggMDJiMWMwOS4uYjVlMzdjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAKKyNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCIKICNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAKQEAgLTM3LDcgKzM4LDggQEAKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpOwogCkBAIC00OSw2ICs1MSwxNSBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKQEAgLTU4LDggKzY5LDE3IEBACiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRzID0gNDsKIAotICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gb3V0cHV0IHN1cmZhY2VzCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2VzW2tNYXhPdXRwdXRzXTsKKyAgICAvLyBXaGV0aGVyIEhBTCBpcyBpbiBjb250cm9sIGZvciBidWZmZXIgbWFuYWdlbWVudC4gU3VyZmFjZSBzaGFyaW5nIGJlaGF2aW9yCisgICAgLy8gZGVwZW5kcyBvbiB0aGlzIGZsYWcuCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKworICAgIC8vIFBhaXIgb2YgYW4gb3V0cHV0IFN1cmZhY2UgYW5kIGl0cyB1bmlxdWUgSUQKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiBTdXJmYWNlVW5pcXVlSWQ7CisKKyAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IChvdXRwdXQgc3VyZmFjZSwgdW5pcXVlIHN1cmZhY2UgSUQpCisgICAgc3RkOjphcnJheTxTdXJmYWNlVW5pcXVlSWQsIGtNYXhPdXRwdXRzPiBtU3VyZmFjZVVuaXF1ZUlkczsKKworICAgIHNpemVfdCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCA9IDA7CiAKICAgICBzc2l6ZV90IGdldE5leHRTdXJmYWNlSWRMb2NrZWQoKTsKIApAQCAtNzgsMTMgKzk4LDI0IEBACiAgICAgc3RhdHVzX3QgY29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCk7CiAKICAgICAvKioKKyAgICAgKiBBdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gc3RyZWFtIHNwbGl0dGVyLgorICAgICAqIFdoZW4gY2FtZXJhIHNlcnZpY2UgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCisgICAgICogYmVmb3JlIHRoZSBidWZmZXIgaXMgaGFuZGVkIG91dCB0byBIQUwgaW4gcmVxdWVzdCB0aHJlYWQuCisgICAgICogV2hlbiBIQUwgaXMgZG9pbmcgYnVmZmVyIG1hbmFnZW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4KKyAgICAgKiB0aGUgYnVmZmVyIGlzIHJldHVybmVkIGZyb20gSEFMIGluIGh3YmluZGVyIGNhbGxiYWNrIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKKworICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDYwMzBkMTUuLmZkOWI0YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNjAsMTMgKzYwLDE5IEBACiAgICAgbVVzYWdlKDApLAogICAgIG1PbGRVc2FnZSgwKSwKICAgICBtT2xkTWF4QnVmZmVycygwKSwKKyAgICBtT2xkRm9ybWF0KC0xKSwKKyAgICBtT2xkRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksCiAgICAgbVByZXBhcmVkKGZhbHNlKSwKKyAgICBtUHJlcGFyZUJsb2NrUmVxdWVzdCh0cnVlKSwKICAgICBtUHJlcGFyZWRCdWZmZXJJZHgoMCksCiAgICAgbUxhc3RNYXhDb3VudChDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOjpBTExPQ0FURV9QSVBFTElORV9NQVgpLAogICAgIG1CdWZmZXJMaW1pdExhdGVuY3koa0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUpLAogICAgIG1Gb3JtYXRPdmVycmlkZGVuKGZhbHNlKSwKLSAgICBtT3JpZ2luYWxGb3JtYXQoLTEpLAotICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBtT3JpZ2luYWxGb3JtYXQoZm9ybWF0KSwKKyAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbihmYWxzZSksCisgICAgbU9yaWdpbmFsRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksCisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksCisgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCiAgICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKQEAgLTExOSw3ICsxMjUsNiBAQAogCiB2b2lkIENhbWVyYTNTdHJlYW06OnNldEZvcm1hdE92ZXJyaWRlKGJvb2wgZm9ybWF0T3ZlcnJpZGRlbikgewogICAgIG1Gb3JtYXRPdmVycmlkZGVuID0gZm9ybWF0T3ZlcnJpZGRlbjsKLSAgICBpZiAoZm9ybWF0T3ZlcnJpZGRlbikgbU9yaWdpbmFsRm9ybWF0ID0gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKIH0KIAogYm9vbCBDYW1lcmEzU3RyZWFtOjppc0Zvcm1hdE92ZXJyaWRkZW4oKSBjb25zdCB7CkBAIC0xMzIsNyArMTM3LDkgQEAKIAogdm9pZCBDYW1lcmEzU3RyZWFtOjpzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRkZW4pIHsKICAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbiA9IGRhdGFTcGFjZU92ZXJyaWRkZW47Ci0gICAgaWYgKGRhdGFTcGFjZU92ZXJyaWRkZW4pIG1PcmlnaW5hbERhdGFTcGFjZSA9IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOworICAgIGlmIChkYXRhU3BhY2VPdmVycmlkZGVuICYmIG1PcmlnaW5hbERhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX1VOS05PV04pIHsKKyAgICAgICAgbU9yaWdpbmFsRGF0YVNwYWNlID0gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2U7CisgICAgfQogfQogCiBib29sIENhbWVyYTNTdHJlYW06OmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0IHsKQEAgLTI0OCw2ICsyNTUsOCBAQAogCiAgICAgbU9sZFVzYWdlID0gbVVzYWdlOwogICAgIG1PbGRNYXhCdWZmZXJzID0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzOworICAgIG1PbGRGb3JtYXQgPSBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0OworICAgIG1PbGREYXRhU3BhY2UgPSBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKIAogICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJm1Vc2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjg1LDggKzI5NCwxMSBAQAogICAgIHJldHVybiAobVN0YXRlID09IFNUQVRFX0lOX0NPTkZJRykgfHwgKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyk7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTdHJlYW06OmZpbmlzaENvbmZpZ3VyYXRpb24oKSB7CitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpmaW5pc2hDb25maWd1cmF0aW9uKC8qb3V0Ki9ib29sKiBzdHJlYW1SZWNvbmZpZ3VyZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzdHJlYW1SZWNvbmZpZ3VyZWQgIT0gbnVsbHB0cikgeworICAgICAgICAqc3RyZWFtUmVjb25maWd1cmVkID0gZmFsc2U7CisgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgpAQCAtMzExLDcgKzMyMyw3IEBACiAKICAgICAvLyBSZWdpc3RlciBmb3IgaWRsZSB0cmFja2luZwogICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7Ci0gICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgeworICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDAgJiYgbVN0YXR1c0lkID09IFN0YXR1c1RyYWNrZXI6Ok5PX1NUQVRVU19JRCkgewogICAgICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKICAgICB9CiAKQEAgLTMxOSw3ICszMzEsOSBAQAogICAgIC8vIHNvLiBBcyBkb2N1bWVudGVkIGluIGhhcmR3YXJlL2NhbWVyYTMuaDpjb25maWd1cmVfc3RyZWFtcygpLgogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcgJiYKICAgICAgICAgICAgIG1PbGRVc2FnZSA9PSBtVXNhZ2UgJiYKLSAgICAgICAgICAgIG1PbGRNYXhCdWZmZXJzID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgeworICAgICAgICAgICAgbU9sZE1heEJ1ZmZlcnMgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzICYmCisgICAgICAgICAgICBtT2xkRGF0YVNwYWNlID09IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlICYmCisgICAgICAgICAgICBtT2xkRm9ybWF0ID09IGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09ORklHVVJFRDsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTMyNyw4ICszNDEsMTAgQEAKICAgICAvLyBSZXNldCBwcmVwYXJlZCBzdGF0ZSwgc2luY2UgYnVmZmVyIGNvbmZpZyBoYXMgY2hhbmdlZCwgYW5kIGV4aXN0aW5nCiAgICAgLy8gYWxsb2NhdGlvbnMgYXJlIG5vIGxvbmdlciB2YWxpZAogICAgIG1QcmVwYXJlZCA9IGZhbHNlOworICAgIG1QcmVwYXJlQmxvY2tSZXF1ZXN0ID0gdHJ1ZTsKICAgICBtU3RyZWFtVW5wcmVwYXJhYmxlID0gZmFsc2U7CiAKKyAgICBib29sIHJlY29uZmlndXJpbmcgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgcmVzID0gY29uZmlndXJlUXVldWVMb2NrZWQoKTsKICAgICAvLyBjb25maWd1cmVRdWV1ZUxvY2tlZCBjb3VsZCByZXR1cm4gZXJyb3IgaW4gY2FzZSBvZiBhYmFuZG9uZWQgc3VyZmFjZS4KQEAgLTM0NSw2ICszNjEsOSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIGlmIChyZWNvbmZpZ3VyaW5nICYmIHN0cmVhbVJlY29uZmlndXJlZCAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW1SZWNvbmZpZ3VyZWQgPSB0cnVlOworICAgIH0KICAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTM4OCw3ICs0MDcsNyBAQAogICAgIHJldHVybiBtU3RyZWFtVW5wcmVwYXJhYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzdGFydFByZXBhcmUoaW50IG1heENvdW50KSB7CitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzdGFydFByZXBhcmUoaW50IG1heENvdW50LCBib29sIGJsb2NrUmVxdWVzdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC00MjAsOCArNDM5LDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotCi0KICAgICBzaXplX3QgcGlwZWxpbmVNYXggPSBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogICAgIHNpemVfdCBjbGFtcGVkQ291bnQgPSAocGlwZWxpbmVNYXggPCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heENvdW50KSkgPwogICAgICAgICAgICAgcGlwZWxpbmVNYXggOiBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heENvdW50KTsKQEAgLTQyOSw2ICs0NDYsNyBAQAogICAgICAgICAgICAgcGlwZWxpbmVNYXggOiBjbGFtcGVkQ291bnQ7CiAKICAgICBtUHJlcGFyZWQgPSBidWZmZXJDb3VudCA8PSBtTGFzdE1heENvdW50OworICAgIG1QcmVwYXJlQmxvY2tSZXF1ZXN0ID0gYmxvY2tSZXF1ZXN0OwogCiAgICAgaWYgKG1QcmVwYXJlZCkgcmV0dXJuIE9LOwogCkBAIC00NDIsOSArNDYwLDkgQEAKICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogfQogCi1ib29sIENhbWVyYTNTdHJlYW06OmlzUHJlcGFyaW5nKCkgY29uc3QgeworYm9vbCBDYW1lcmEzU3RyZWFtOjppc0Jsb2NrZWRCeVByZXBhcmUoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSSU5HOworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSSU5HICYmIG1QcmVwYXJlQmxvY2tSZXF1ZXN0OwogfQogCiBib29sIENhbWVyYTNTdHJlYW06OmlzQWJhbmRvbmVkKCkgY29uc3QgewpAQCAtNTc2LDYgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgbnNlY3NfdCB3YWl0QnVmZmVyVGltZW91dCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTU4NSw3ICs2MDQsMTEgQEAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQkFORE9ORUQpIHsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KQEAgLTU5MywxMyArNjE2LDE2IEBACiAgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggb3V0cHV0IGJ1ZmZlcnMgKCVkKSwgd2FpdCBmb3IgbmV4dCByZXR1cm5lZCBvbmUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICAgICAgbnNlY3NfdCB3YWl0U3RhcnQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgIHJlcyA9IG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAod2FpdEJ1ZmZlclRpbWVvdXQgPCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKSB7CisgICAgICAgICAgICB3YWl0QnVmZmVyVGltZW91dCA9IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb247CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdEJ1ZmZlclRpbWVvdXQpOwogICAgICAgICBuc2Vjc190IHdhaXRFbmQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgICAgIG1CdWZmZXJMaW1pdExhdGVuY3kuYWRkKHdhaXRTdGFydCwgd2FpdEVuZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBvdXRwdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIChtYXhfYnVmZmVycyAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uIC8gMTAwMDAwMExMLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3YWl0QnVmZmVyVGltZW91dCAvIDEwMDAwMDBMTCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtNjQ5LDcgKzY3NSw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC02NjEsNiArNjg4LDE1IEBACiAKICAgICByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihidWZmZXIpOwogCisgICAgLy8gQnVmZmVyIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCwgc28gbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmVhbV9idWZmZXIgc3RydWN0LgorICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciBiID0gYnVmZmVyOworICAgIGlmICh0aW1lc3RhbXBJbmNyZWFzaW5nICYmIHRpbWVzdGFtcCAhPSAwICYmIHRpbWVzdGFtcCA8PSBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIGlzIG5vdCBpbmNyZWFzaW5nLiBQcmV2IHRpbWVzdGFtcCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVzdGFtcCwgbUxhc3RUaW1lc3RhbXApOworICAgICAgICBiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKICAgICAvKioKICAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KICAgICAgKgpAQCAtNjY5LDkgKzcwNSw5IEBACiAgICAgICoKICAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHN1cmZhY2VfaWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOworICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CiAgICAgfQogCiAgICAgLy8gRXZlbiBpZiByZXR1cm5pbmcgdGhlIGJ1ZmZlciBmYWlsZWQsIHdlIHN0aWxsIHdhbnQgdG8gc2lnbmFsIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgdGhlCkBAIC03NDcsOCArNzgzLDIyIEBACiAgICAgcmV0dXJuIGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQocHJvZHVjZXIpOwogfQogCit2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgZm9yIChhdXRvICZpdCA6IG1CdWZmZXJMaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lciA9IGl0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcihmcmFtZU51bWJlciwgZ2V0SWQoKSwgc2V0dGluZ3MpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCkgeworICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+OjppdGVyYXRvciBpdCwgZW5kOwogCiAgICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGluZwpAQCAtNzU3LDYgKzgwNyw4IEBACiAgICAgICAgIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcjo6QnVmZmVySW5mbygpOwogICAgIGluZm8ubU91dHB1dCA9IG91dHB1dDsKICAgICBpbmZvLm1FcnJvciA9IChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUik7CisgICAgaW5mby5tRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICBpbmZvLm1UaW1lc3RhbXAgPSB0aW1lc3RhbXA7CiAgICAgLy8gVE9ETzogcmVzdCBvZiBmaWVsZHMKIAogICAgIGZvciAoaXQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmJlZ2luKCksIGVuZCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuZW5kKCk7CkBAIC03ODAsNiArODMyLDEyIEBACiAgICAgcmV0dXJuIGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpOwogfQogCitzaXplX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzZXRTdGF0dXNUcmFja2VyKHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gb2xkVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKQEAgLTgyMiw3ICs4ODAsNyBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggNGRkY2YxYS4uNjdhZmQwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTE5Nyw2ICsxOTcsOCBAQAogICAgICAqIGFmdGVyIHRoaXMgY2FsbCwgYnV0IGNhbiBzdGlsbCBiZSByZWFkIHVudGlsIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUKICAgICAgKiBzdHJlYW0uCiAgICAgICoKKyAgICAgKiBzdHJlYW1SZWNvbmZpZ3VyZWQ6IHNldCB0byB0cnVlIHdoZW4gYSBzdHJlYW0gaXMgYmVpbmcgcmVjb25maWd1cmVkLgorICAgICAqCiAgICAgICogUmV0dXJuczoKICAgICAgKiAgIE9LIG9uIGEgc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uCiAgICAgICogICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKQEAgLTIwNCw3ICsyMDYsNyBAQAogICAgICAqICAgSU5WQUxJRF9PUEVSQVRJT04gaW4gY2FzZSBjb25uZWN0aW5nIHRvIHRoZSBjb25zdW1lciBmYWlsZWQgb3IgY29uc3VtZXIKICAgICAgKiAgICAgICBkb2Vzbid0IGV4aXN0IHlldC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCAgICAgICAgIGZpbmlzaENvbmZpZ3VyYXRpb24oKTsKKyAgICBzdGF0dXNfdCAgICAgICAgIGZpbmlzaENvbmZpZ3VyYXRpb24oLypvdXQqL2Jvb2wqIHN0cmVhbVJlY29uZmlndXJlZCA9IG51bGxwdHIpOwogCiAgICAgLyoqCiAgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCkBAIC0yMzIsNiArMjM0LDExIEBACiAgICAgICoKICAgICAgKiBUaGlzIGNhbGwgcGVyZm9ybXMgbm8gYWxsb2NhdGlvbiwgc28gaXMgcXVpY2sgdG8gY2FsbC4KICAgICAgKgorICAgICAqIGJsb2NrUmVxdWVzdCBzcGVjaWZpZXMgd2hldGhlciBwcmVwYXJlIHdpbGwgYmxvY2sgdXBjb21pbmcgY2FwdHVyZQorICAgICAqIHJlcXVlc3QuIFRoaXMgZmxhZyBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlIGNhbGxlciBndWFyYW50ZWVzCisgICAgICogdGhlIHdob2xlIGJ1ZmZlciBwcmVwYXJhdGlvbiBwcm9jZXNzIGlzIGRvbmUgYmVmb3JlIGNhcHR1cmUgcmVxdWVzdAorICAgICAqIGNvbWVzIGluLgorICAgICAqCiAgICAgICogUmV0dXJuczoKICAgICAgKiAgICBPSyBpZiBubyBtb3JlIGJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVhbGxvY2F0ZWQKICAgICAgKiAgICBOT1RfRU5PVUdIX0RBVEEgaWYgY2FsbHMgdG8gcHJlcGFyZU5leHRCdWZmZXIgYXJlIG5lZWRlZCB0byBmaW5pc2gKQEAgLTI0MCwxMiArMjQ3LDEyIEBACiAgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgY2FsbGVkIHdoZW4gbm90IGluIENPTkZJR1VSRUQgc3RhdGUsIG9yIGEKICAgICAgKiAgICAgICAgdmFsaWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBzdGFydFByZXBhcmUoaW50IG1heENvdW50KTsKKyAgICBzdGF0dXNfdCAgICAgICAgIHN0YXJ0UHJlcGFyZShpbnQgbWF4Q291bnQsIGJvb2wgYmxvY2tSZXF1ZXN0KTsKIAogICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBzdHJlYW0gaXMgbWlkLXByZXBhcmluZy4KKyAgICAgKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBvbiBhIHN0cmVhbSBpcyBibG9ja2VkIGJ5IHByZXBhcmUuCiAgICAgICovCi0gICAgYm9vbCAgICAgICAgICAgICBpc1ByZXBhcmluZygpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICAgaXNCbG9ja2VkQnlQcmVwYXJlKCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBDb250aW51ZSBzdHJlYW0gYnVmZmVyIHByZXBhcmF0aW9uIGJ5IGFsbG9jYXRpbmcgdGhlIG5leHQKQEAgLTMxMSwxNiArMzE4LDI0IEBACiAgICAgICoKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIGdldEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3Qgd2FpdEJ1ZmZlclRpbWVvdXQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMzU0LDYgKzM2OSwxMSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGJ1ZmZlcnMgY3VycmVudGx5IGhhbmRlZCBvdXQgdG8gSEFMCisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICBnZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpIGNvbnN0OworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC00MTMsNiArNDMzLDEyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXN0b3JlQ29uZmlndXJlZFN0YXRlKCk7CiAKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYnVmZmVyIHN0cmVhbSBsaXN0ZW5lcnMgYWJvdXQgaW5jb21pbmcgcmVxdWVzdCB3aXRoIHBhcnRpY3VsYXIgZnJhbWUgbnVtYmVyLgorICAgICAqLworICAgIHZvaWQgZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKICAgcHJvdGVjdGVkOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgLyoqCkBAIC00MzQsNyArNDYwLDcgQEAKICAgICAvLyBaZXJvIGZvciBmb3JtYXRzIHdpdGggZml4ZWQgYnVmZmVyIHNpemUgZm9yIGdpdmVuIGRpbWVuc2lvbnMuCiAgICAgY29uc3Qgc2l6ZV90IG1NYXhTaXplOwogCi0gICAgZW51bSB7CisgICAgZW51bSBTdHJlYW1TdGF0ZSB7CiAgICAgICAgIFNUQVRFX0VSUk9SLAogICAgICAgICBTVEFURV9DT05TVFJVQ1RFRCwKICAgICAgICAgU1RBVEVfSU5fQ09ORklHLApAQCAtNDY3LDcgKzQ5Myw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOwpAQCAtNDg5LDcgKzUxNiw3IEBACiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKIAogICAgIC8vIEdldCBoYW5kb3V0IG91dHB1dCBidWZmZXIgY291bnQuCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdCA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBpbnB1dCBidWZmZXIgY291bnQuCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKQEAgLTUxMywxNCArNTQwLDE4IEBACiAgICAgdWludDY0X3QgbVVzYWdlOwogCiAgIHByaXZhdGU6CisgICAgLy8gUHJldmlvdXNseSBjb25maWd1cmVkIHN0cmVhbSBwcm9wZXJ0aWVzIChwb3N0IEhBTCBvdmVycmlkZSkKICAgICB1aW50NjRfdCBtT2xkVXNhZ2U7CiAgICAgdWludDMyX3QgbU9sZE1heEJ1ZmZlcnM7CisgICAgaW50IG1PbGRGb3JtYXQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbU9sZERhdGFTcGFjZTsKKwogICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CiAgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIHZvaWQgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCwgbnNlY3NfdCB0aW1lc3RhbXAgPSAwLCB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApOwogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+IG1CdWZmZXJMaXN0ZW5lckxpc3Q7CiAKICAgICBzdGF0dXNfdCAgICAgICAgY2FuY2VsUHJlcGFyZUxvY2tlZCgpOwpAQCAtNTM0LDYgKzU2NSw3IEBACiAgICAgLy8gaGFzIGJlZW4gY2FsbGVkIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHRpbWVzLCBvciBzdHJlYW0gY29uZmlndXJhdGlvbgogICAgIC8vIGhhZCB0byByZWdpc3RlciBidWZmZXJzIHdpdGggdGhlIEhBTAogICAgIGJvb2wgbVByZXBhcmVkOworICAgIGJvb2wgbVByZXBhcmVCbG9ja1JlcXVlc3Q7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG1QcmVwYXJlZEJ1ZmZlcnM7CiAgICAgc2l6ZV90IG1QcmVwYXJlZEJ1ZmZlcklkeDsKQEAgLTU1MCwxNSArNTgyLDE2IEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUgPSAzMzsgLy9pbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbUJ1ZmZlckxpbWl0TGF0ZW5jeTsKIAotICAgIC8vS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBmb3JtYXQgaW4gY2FzZSBpdCBnZXRzIG92ZXJyaWRkZW4KKyAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZm9ybWF0IHdoZW4gdGhlIHN0cmVhbSBpcyBjcmVhdGVkIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCiAgICAgYm9vbCBtRm9ybWF0T3ZlcnJpZGRlbjsKLSAgICBpbnQgbU9yaWdpbmFsRm9ybWF0OworICAgIGNvbnN0IGludCBtT3JpZ2luYWxGb3JtYXQ7CiAKICAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZGF0YVNwYWNlIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCiAgICAgYm9vbCBtRGF0YVNwYWNlT3ZlcnJpZGRlbjsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAppbmRleCAyZGIzMzNkLi5kMGFlZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtNDEsNiArNDIsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKICAgICAvLyBCdWZmZXIgd2FzIHJlbGVhc2VkIGJ5IHRoZSBIQUwKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CisgICAgLy8gTm90aWZ5IGFib3V0IGluY29taW5nIGJ1ZmZlciByZXF1ZXN0IGZyYW1lIG51bWJlcgorICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9OyAvL25hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDllZDcxODQuLjczZjUwMWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+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+Pihjb25mbGljdGluZ0tleXMpfSwKLSAgICAgICAgbVByaW9yaXR5KHNjb3JlLCBzdGF0ZSksIG1Pd25lcklke293bmVySWR9IHt9CisgICAgICAgIG1Qcmlvcml0eShzY29yZSwgc3RhdGUsIGlzVmVuZG9yQ2xpZW50KSwgbU93bmVySWR7b3duZXJJZH0ge30KIAogdGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46On5DbGllbnREZXNjcmlwdG9yKCkge30KQEAgLTIwNCw3ICsyMzQsMTMgQEAKIAogdGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KIHZvaWQgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6c2V0UHJpb3JpdHkoY29uc3QgQ2xpZW50UHJpb3JpdHkmIHByaW9yaXR5KSB7Ci0gICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHRoZSB1c3VhbCBjb3B5IGNvbnN0cnVjdG9yIGhlcmUgc2luY2Ugd2Ugd2FudCB0byByZW1lbWJlcgorICAgIC8vIHdoZXRoZXIgYSBjbGllbnQgaXMgYSB2ZW5kb3IgY2xpZW50IG9yIG5vdC4gVGhpcyBjb3VsZCBoYXZlIGJlZW4gd2lwZWQKKyAgICAvLyBvZmYgaW4gdGhlIGluY29taW5nIHByaW9yaXR5IGFyZ3VtZW50IHNpbmNlIGFuIEFJREwgdGhyZWFkIG1pZ2h0IGhhdmUKKyAgICAvLyBjYWxsZWQgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSBhZnRlciByZWZyZXNoaW5nCisgICAgLy8gcHJpb3JpdGllcyBmb3Igb2xkIGNsaWVudHMgdGhyb3VnaCBQcm9jZXNzSW5mb1NlcnZpY2U6OmdldFByb2Nlc3NTdGF0ZXNTY29yZXNGcm9tUGlkcygpLgorICAgIG1Qcmlvcml0eS5zZXRTY29yZShwcmlvcml0eS5nZXRTY29yZSgpKTsKKyAgICBtUHJpb3JpdHkuc2V0U3RhdGUocHJpb3JpdHkuZ2V0U3RhdGUoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAzMDNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApAQCAtMCwwICsxLDExMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZlckV4aWZVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+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+KHQudG1fc2VjKSwgMX0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0lNQUdFX0xFTkdUSCwgbGVuZ3RoKTsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19QSVhFTF9ZX0RJTUVOU0lPTiwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0lNQUdFX1dJRFRILCB3aWR0aCk7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfUElYRUxfWF9ESU1FTlNJT04sIHdpZHRoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncykgeworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19JU09fU1BFRURfUkFUSU5HUywgaXNvX3NwZWVkX3JhdGluZ3MpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSB7CisgICAgZmxvYXQgbWF4QXBlcnR1cmUgPSBjb252ZXJ0VG9BcGV4KGFwZXJ0dXJlKTsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfTUFYX0FQRVJUVVJFX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQobWF4QXBlcnR1cmUgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKSB7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYUE9TVVJFX0JJQVNfVkFMVUUsCisgICAgICAgICAgICBldiAqIGV2X3N0ZXBfbnVtZXJhdG9yLCBldl9zdGVwX2Rlbm9taW5hdG9yKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRPcmllbnRhdGlvbih1aW50MTZfdCBkZWdyZWVzKSB7CisgICAgRXhpZk9yaWVudGF0aW9uIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgc3dpdGNoIChkZWdyZWVzKSB7CisgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzZXRPcmllbnRhdGlvblZhbHVlKHZhbHVlKTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEXzAsIEVYSUZfVEFHX09SSUVOVEFUSU9OLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSkgeworICAgIGZsb2F0IHNodXR0ZXJTcGVlZCA9IC1sb2cyZihleHBvc3VyZV90aW1lKTsKKyAgICBTRVRfU1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NIVVRURVJfU1BFRURfVkFMVUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2h1dHRlclNwZWVkICoga1JhdGlvbmFsUHJlY2lzaW9uKSwga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpIHsKKyAgICBjb25zdCBzdGF0aWMgZmxvYXQga0luZmluaXR5RGlvcHRlcnMgPSAxLjBlLTY7CisgICAgdWludDMyX3QgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKKyAgICB1aW50MTZfdCBkaXN0YW5jZVJhbmdlOworICAgIGlmIChkaW9wdGVycyA+IGtJbmZpbml0eURpb3B0ZXJzKSB7CisgICAgICAgIGZsb2F0IGZvY3VzRGlzdGFuY2UgPSAxLjBmIC8gZGlvcHRlcnM7CisgICAgICAgIG51bWVyYXRvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZvY3VzRGlzdGFuY2UgKiBrUmF0aW9uYWxQcmVjaXNpb24pKTsKKyAgICAgICAgZGVub21pbmF0b3IgPSBrUmF0aW9uYWxQcmVjaXNpb247CisKKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2UgPCAxLjBmKSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMTsgLy8gTWFjcm8KKyAgICAgICAgfSBlbHNlIGlmIChmb2N1c0Rpc3RhbmNlIDwgMy4wZikgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDI7IC8vIENsb3NlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMzsgLy8gRGlzdGFudAorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtZXJhdG9yID0gMHhGRkZGRkZGRjsKKyAgICAgICAgZGVub21pbmF0b3IgPSAxOworICAgICAgICBkaXN0YW5jZVJhbmdlID0gMzsgLy8gRGlzdGFudAorICAgIH0KKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCSkVDVF9ESVNUQU5DRSwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQkpFQ1RfRElTVEFOQ0VfUkFOR0UsIGRpc3RhbmNlUmFuZ2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKSB7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUUsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUVfT1JJR0lOQUwsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUVfRElHSVRJWkVELCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JhbGFuY2UpIHsKKyAgICB1aW50MTZfdCB3aGl0ZUJhbGFuY2UgPSAod2hpdGVfYmFsYW5jZSA9PSBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfQVVUTykgPyAwIDogMTsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfV0hJVEVfQkFMQU5DRSwgd2hpdGVCYWxhbmNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpnZW5lcmF0ZUFwcDEoKSB7CisgICAgZGVzdHJveUFwcDEoKTsKKyAgICAvLyBTYXZlIHRoZSByZXN1bHQgaW50byB8YXBwMV9idWZmZXJffC4KKyAgICBleGlmX2RhdGFfc2F2ZV9kYXRhKGV4aWZfZGF0YV8sICZhcHAxX2J1ZmZlcl8sICZhcHAxX2xlbmd0aF8pOworICAgIGlmICghYXBwMV9sZW5ndGhfKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBhcHAxX2J1ZmZlcl8gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKgorICAgICAqIFRoZSBKUEVHIHNlZ21lbnQgc2l6ZSBpcyAxNiBiaXRzIGluIHNwZWMuIFRoZSBzaXplIG9mIEFQUDEgc2VnbWVudCBzaG91bGQKKyAgICAgKiBiZSBzbWFsbGVyIHRoYW4gNjU1MzMgYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGJ5dGVzIGZvciBzZWdtZW50IHNpemUgZmllbGQuCisgICAgICovCisgICAgaWYgKGFwcDFfbGVuZ3RoXyA+IDY1NTMzKSB7CisgICAgICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgICAgIEFMT0dFKCIlczogVGhlIHNpemUgb2YgQVBQMSBzZWdtZW50IGlzIHRvbyBsYXJnZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIEV4aWZVdGlsc0ltcGw6OmdldEFwcDFCdWZmZXIoKSB7CisgICAgcmV0dXJuIGFwcDFfYnVmZmVyXzsKK30KKwordW5zaWduZWQgaW50IEV4aWZVdGlsc0ltcGw6OmdldEFwcDFMZW5ndGgoKSB7CisgICAgcmV0dXJuIGFwcDFfbGVuZ3RoXzsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeGlmVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhpZl92ZXJzaW9uKSB7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWElGX1ZFUlNJT04sIEVYSUZfRk9STUFUX1VOREVGSU5FRCwgZXhpZl92ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFeGlmVXRpbHNJbXBsOjpyZXNldCgpIHsKKyAgICBkZXN0cm95QXBwMSgpOworICAgIGlmIChleGlmX2RhdGFfKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpbmNlIHdlIGRlY2lkZWQgdG8gaWdub3JlIHRoZSBvcmlnaW5hbCBBUFAxLCB3ZSBhcmUgc3VyZSB0aGF0IHRoZXJlIGlzCisgICAgICAgICAqIG5vIHRodW1ibmFpbCBhbGxvY2F0ZWQgYnkgbGliZXhpZi4gfGV4aWZfZGF0YV8tPmRhdGF8IGlzIGFjdHVhbGx5CisgICAgICAgICAqIGFsbG9jYXRlZCBieSBKcGVnQ29tcHJlc3Nvci4gc2V0cyB8ZXhpZl9kYXRhXy0+ZGF0YXwgdG8gbnVsbHB0ciB0bworICAgICAgICAgKiBwcmV2ZW50IGV4aWZfZGF0YV91bnJlZigpIGRlc3Ryb3kgaXQgaW5jb3JyZWN0bHkuCisgICAgICAgICAqLworICAgICAgICBleGlmX2RhdGFfLT5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgZXhpZl9kYXRhXy0+c2l6ZSA9IDA7CisgICAgICAgIGV4aWZfZGF0YV91bnJlZihleGlmX2RhdGFfKTsKKyAgICAgICAgZXhpZl9kYXRhXyA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBFeGlmVXRpbHNJbXBsOjphZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEV4aWZJZmQgaWZkLAorICAgICAgICBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsIHVpbnQ2NF90IGNvbXBvbmVudHMsIHVuc2lnbmVkIGludCBzaXplKSB7CisgICAgLy8gUmVtb3ZlIG9sZCBlbnRyeSBpZiBleGlzdHMuCisgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwKKyAgICAgICAgICAgIGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIHRhZykpOworICAgIEV4aWZNZW0qIG1lbSA9IGV4aWZfbWVtX25ld19kZWZhdWx0KCk7CisgICAgaWYgKCFtZW0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5KGV4aWZfZW50cnlfbmV3X21lbShtZW0pKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB2b2lkKiB0bXBCdWZmZXIgPSBleGlmX21lbV9hbGxvYyhtZW0sIHNpemUpOworICAgIGlmICghdG1wQnVmZmVyKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGVudHJ5LT5kYXRhID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KHRtcEJ1ZmZlcik7CisgICAgZW50cnktPnRhZyA9IHRhZzsKKyAgICBlbnRyeS0+Zm9ybWF0ID0gZm9ybWF0OworICAgIGVudHJ5LT5jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgICBlbnRyeS0+c2l6ZSA9IHNpemU7CisKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCBlbnRyeS5nZXQoKSk7CisgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKworICAgIHJldHVybiBlbnRyeTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gRXhpZlV0aWxzSW1wbDo6YWRkRW50cnkoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkoZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgdGFnKSk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgICAgIC8vIGV4aWZfY29udGVudF9nZXRfZW50cnkoKSB3b24ndCByZWYgdGhlIGVudHJ5LCBzbyB3ZSByZWYgaGVyZS4KKyAgICAgICAgZXhpZl9lbnRyeV9yZWYoZW50cnkuZ2V0KCkpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorICAgIGVudHJ5LnJlc2V0KGV4aWZfZW50cnlfbmV3KCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGVudHJ5LT50YWcgPSB0YWc7CisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgZW50cnkuZ2V0KCkpOworICAgIGV4aWZfZW50cnlfaW5pdGlhbGl6ZShlbnRyeS5nZXQoKSwgdGFnKTsKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U2hvcnQoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MTZfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9zaG9ydChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0TG9uZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X2xvbmcoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFJhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICB1aW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7bnVtZXJhdG9yLCBkZW5vbWluYXRvcn0pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIGludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3NyYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7bnVtZXJhdG9yLCBkZW5vbWluYXRvcn0pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN0cmluZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc2l6ZV90IGVudHJ5X3NpemUgPSBidWZmZXIubGVuZ3RoKCk7CisgICAgLy8gU2luY2UgdGhlIGV4aWYgZm9ybWF0IGlzIHVuZGVmaW5lZCwgTlVMTCB0ZXJtaW5hdGlvbiBpcyBub3QgbmVjZXNzYXJ5LgorICAgIGlmIChmb3JtYXQgPT0gRVhJRl9GT1JNQVRfQVNDSUkpIHsKKyAgICAgICAgZW50cnlfc2l6ZSsrOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KGlmZCwgdGFnLCBmb3JtYXQsIGVudHJ5X3NpemUsIGVudHJ5X3NpemUpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoZW50cnktPmRhdGEsIGJ1ZmZlci5jX3N0cigpLCBlbnRyeV9zaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFeGlmVXRpbHNJbXBsOjpkZXN0cm95QXBwMSgpIHsKKyAgICAvKgorICAgICAqIFNpbmNlIHRoZXJlIGlzIG5vIEFQSSB0byBhY2Nlc3MgRXhpZk1lbSBpbiBFeGlmRGF0YS0+cHJpdiwgd2UgdXNlIGZyZWUKKyAgICAgKiBoZXJlLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmcmVlIGZ1bmN0aW9uIGluIGxpYmV4aWYuIFNlZQorICAgICAqIGV4aWZfZGF0YV9zYXZlX2RhdGEoKSBmb3IgZGV0YWlsLgorICAgICAqLworICAgIGZyZWUoYXBwMV9idWZmZXJfKTsKKyAgICBhcHAxX2J1ZmZlcl8gPSBudWxscHRyOworICAgIGFwcDFfbGVuZ3RoXyA9IDA7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLCBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpIHsKKyAgICBpZiAoIXNldEltYWdlV2lkdGgoaW1hZ2VXaWR0aCkgfHwKKyAgICAgICAgICAgICFzZXRJbWFnZUhlaWdodChpbWFnZUhlaWdodCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGltYWdlIHJlc29sdXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHA7CisgICAgc3RydWN0IHRtIHRpbWVfaW5mbzsKKyAgICBib29sIHRpbWVfYXZhaWxhYmxlID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRwKSAhPSAtMTsKKyAgICBsb2NhbHRpbWVfcigmdHAudHZfc2VjLCAmdGltZV9pbmZvKTsKKyAgICBpZiAoIXNldERhdGVUaW1lKHRpbWVfaW5mbykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGRhdGEgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZsb2F0IGZvY2FsX2xlbmd0aDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19GT0NBTF9MRU5HVEgpOworICAgIGlmIChlbnRyeS5jb3VudCkgeworICAgICAgICBmb2NhbF9sZW5ndGggPSBlbnRyeS5kYXRhLmZbMF07CisKKyAgICAgICAgaWYgKCFzZXRGb2NhbExlbmd0aChmb2NhbF9sZW5ndGgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZm9jYWwgbGVuZ3RoIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNvclNpemVFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSk7CisgICAgICAgIGlmIChzZW5zb3JTaXplRW50cnkuY291bnQgPT0gMikgeworICAgICAgICAgICAgaWYgKCFzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oCisgICAgICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCwgc2Vuc29yU2l6ZUVudHJ5LmRhdGEuZlswXSwgc2Vuc29yU2l6ZUVudHJ5LmRhdGEuZlsxXSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZm9jYWwgbGVuZ3RoIGluIDM1bW0gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiBDYW5ub3QgZmluZCBmb2NhbCBsZW5ndGggaW4gbWV0YWRhdGEuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKSAmJgorICAgICAgICAgICAgc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFjdGl2ZUFycmF5RW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKTsKKworICAgICAgICBpZiAoIXNldERpZ2l0YWxab29tUmF0aW8oZW50cnkuZGF0YS5pMzJbMl0sIGVudHJ5LmRhdGEuaTMyWzNdLAorICAgICAgICAgICAgICAgIGFjdGl2ZUFycmF5RW50cnkuZGF0YS5pMzJbMl0sIGFjdGl2ZUFycmF5RW50cnkuZGF0YS5pMzJbM10pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZGlnaXRhbCB6b29tIHJhdGlvIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA8IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogR3BzIGNvb3JkaW5hdGVzIGluIG1ldGFkYXRhIGlzIG5vdCBjb21wbGV0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzTGF0aXR1ZGUoZW50cnkuZGF0YS5kWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBsYXRpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0xvbmdpdHVkZShlbnRyeS5kYXRhLmRbMV0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGxvbmdpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0FsdGl0dWRlKGVudHJ5LmRhdGEuZFsyXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgYWx0aXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX3N0cihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihlbnRyeS5kYXRhLnU4KSk7CisgICAgICAgIGlmICghc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChtZXRob2Rfc3RyKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBwcm9jZXNzaW5nIG1ldGhvZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lX2F2YWlsYWJsZSAmJiBtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVApKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCk7CisgICAgICAgIHRpbWVfdCB0aW1lc3RhbXAgPSBzdGF0aWNfY2FzdDx0aW1lX3Q+KGVudHJ5LmRhdGEuaTY0WzBdKTsKKyAgICAgICAgaWYgKGdtdGltZV9yKCZ0aW1lc3RhbXAsICZ0aW1lX2luZm8pKSB7CisgICAgICAgICAgICBpZiAoIXNldEdwc1RpbWVzdGFtcCh0aW1lX2luZm8pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyB0aW1lc3RhbXAgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lIHRyYW5mb3JtYXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9TVEVQKSAmJgorICAgICAgICAgICAgbWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04pKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0ZXBFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fU1RFUCk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVCaWFzKGVudHJ5LmRhdGEuaTMyWzBdLCBzdGVwRW50cnkuZGF0YS5yWzBdLm51bWVyYXRvciwKKyAgICAgICAgICAgICAgICBzdGVwRW50cnkuZGF0YS5yWzBdLmRlbm9taW5hdG9yKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIGJpYXMgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19PUklFTlRBVElPTikpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgICAgIGlmICghc2V0T3JpZW50YXRpb24oZW50cnkuZGF0YS5pMzJbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgb3JpZW50YXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKTsKKyAgICAgICAgZmxvYXQgZXhwb3N1cmVfdGltZSA9IDEuMGYgKiBlbnRyeS5kYXRhLmk2NFswXSAvIDFlOTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZVRpbWUoZXhwb3N1cmVfdGltZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXRTaHV0dGVyU3BlZWQoZXhwb3N1cmVfdGltZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzaHV0dGVyIHNwZWVkIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UpOworICAgICAgICBpZiAoIXNldFN1YmplY3REaXN0YW5jZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc3ViamVjdCBkaXN0YW5jZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSk7CisgICAgICAgIGludDMyX3QgaXNvID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBwb3N0UmF3U2Vuc0VudHJ5ID0KKyAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCk7CisgICAgICAgIGlmIChwb3N0UmF3U2Vuc0VudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgaXNvID0gaXNvICogcG9zdFJhd1NlbnNFbnRyeS5kYXRhLmkzMlswXSAvIDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2V0SXNvU3BlZWRSYXRpbmcoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGlzbykpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgaXNvIHJhdGluZyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9MRU5TX0FQRVJUVVJFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0FQRVJUVVJFKTsKKyAgICAgICAgaWYgKCFzZXRGTnVtYmVyKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBGIG51bWJlciBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEFwZXJ0dXJlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBhcGVydHVyZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBrU1JHQkNvbG9yU3BhY2UgPSAxOworICAgIGlmICghc2V0Q29sb3JTcGFjZShrU1JHQkNvbG9yU3BhY2UpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBjb2xvciBzcGFjZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfQVBFUlRVUkVTKSkgeworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfQVBFUlRVUkVTKTsKKyAgICAgICAgaWYgKCFzZXRNYXhBcGVydHVyZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgbWF4IGFwZXJ0dXJlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpKSB7CisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZmxhc2hTdGF0ZUVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0ZMQVNIX1NUQVRFKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFlTW9kZUVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERSk7CisgICAgICAgIHVpbnQ4X3QgZmxhc2hTdGF0ZSA9IGZsYXNoU3RhdGVFbnRyeS5jb3VudCA+IDAgPworICAgICAgICAgICAgICAgIGZsYXNoU3RhdGVFbnRyeS5kYXRhLnU4WzBdIDogQU5EUk9JRF9GTEFTSF9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICAgICAgdWludDhfdCBhZU1vZGUgPSBhZU1vZGVFbnRyeS5jb3VudCA+IDAgPworICAgICAgICAgICAgICAgIGFlTW9kZUVudHJ5LmRhdGEudThbMF0gOiBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkY7CisKKyAgICAgICAgaWYgKCFzZXRGbGFzaChlbnRyeS5kYXRhLnU4WzBdLCBmbGFzaFN0YXRlLCBhZU1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZmxhc2ggZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSk7CisgICAgICAgIGlmICghc2V0V2hpdGVCYWxhbmNlKGVudHJ5LmRhdGEudThbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgd2hpdGUgYmFsYW5jZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERSk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVNb2RlKGVudHJ5LmRhdGEudThbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgbW9kZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZV9hdmFpbGFibGUpIHsKKyAgICAgICAgY2hhciBzdHJbNF07CisgICAgICAgIGlmIChzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJTAzbGQiLCB0cC50dl9uc2VjIC8gMTAwMDAwMCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN1YnNlYyBpcyBpbnZhbGlkOiAlbGQiLCBfX0ZVTkNUSU9OX18sIHRwLnR2X25zZWMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0U3Vic2VjVGltZShzdGQ6OnN0cmluZyhzdHIpKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHN1YnNlYyB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMDIwNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSAorCisjaW5jbHVkZSAiQ2FtZXJhTWV0YWRhdGEuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKgorICogT3JpZW50YXRpb24gdmFsdWU6CisgKiAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICAgICAgNiAgICAgICAgICA3ICAgICAgICAgIDgKKyAqCisgKiAgODg4ODg4IDg4ODg4OCAgICAgODggODggICAgIDg4ODg4ODg4ODggODggICAgICAgICAgICAgICAgIDg4IDg4ODg4ODg4ODgKKyAqICA4OCAgICAgICAgIDg4ICAgICA4OCA4OCAgICAgODggIDg4ICAgICA4OCAgODggICAgICAgICA4OCAgODggICAgIDg4ICA4OAorICogIDg4ODggICAgIDg4ODggICA4ODg4IDg4ODggICA4OCAgICAgICAgIDg4ODg4ODg4ODggODg4ODg4ODg4OCAgICAgICAgIDg4CisgKiAgODggICAgICAgICA4OCAgICAgODggODgKKyAqICA4OCAgICAgICAgIDg4IDg4ODg4OCA4ODg4ODgKKyAqLworZW51bSBFeGlmT3JpZW50YXRpb24gOiB1aW50MTZfdCB7CisgICAgT1JJRU5UQVRJT05fVU5ERUZJTkVEICAgPSAweDAsCisgICAgT1JJRU5UQVRJT05fMF9ERUdSRUVTICAgPSAweDEsCisgICAgT1JJRU5UQVRJT05fOTBfREVHUkVFUyAgPSAweDYsCisgICAgT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMgPSAweDMsCisgICAgT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgPSAweDgsCit9OworCisvLyBUaGlzIGlzIGJhc2VkIG9uIHRoZSBjYW1lcmEgSElETCBzaGltIGltcGxlbWVudGF0aW9uLCB3aGljaCB3YXMgaW4gdHVybmVkCisvLyBiYXNlZCBvbiBvcmlnaW5hbCBDaHJvbWVPUyBBUkMgaW1wbGVtZW50YXRpb24gb2YgYSBWNEwyIEhBTAorCisvLyBFeGlmVXRpbHMgY2FuIG92ZXJyaWRlIEFQUDEgc2VnbWVudCB3aXRoIHRhZ3Mgd2hpY2ggY2FsbGVyIHNldC4gRXhpZlV0aWxzIGNhbgorLy8gYWxzbyBhZGQgYSB0aHVtYm5haWwgaW4gdGhlIEFQUDEgc2VnbWVudCBpZiB0aHVtYm5haWwgc2l6ZSBpcyBzcGVjaWZpZWQuCisvLyBFeGlmVXRpbHMgY2FuIGJlIHJldXNlZCB3aXRoIGRpZmZlcmVudCBpbWFnZXMgYnkgY2FsbGluZyBpbml0aWFsaXplKCkuCisvLworLy8gRXhhbXBsZSBvZiB1c2luZyB0aGlzIGNsYXNzIDoKKy8vICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZlV0aWxzPiB1dGlscyhFeGlmVXRpbHM6OkNyZWF0ZSgpKTsKKy8vICB1dGlscy0+aW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyKiBhcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSk7CisvLyAgLi4uCisvLyAgLy8gQ2FsbCBFeGlmVXRpbHMgZnVuY3Rpb25zIHRvIHNldCBFeGlmIHRhZ3MuCisvLyAgLi4uCisvLyAgdXRpbHMtPkdlbmVyYXRlQXBwMSgpOworLy8gIHVuc2lnbmVkIGludCBhcHAxTGVuZ3RoID0gdXRpbHMtPkdldEFwcDFMZW5ndGgoKTsKKy8vICB1aW50OF90KiBhcHAxQnVmZmVyID0gbmV3IHVpbnQ4X3RbYXBwMUxlbmd0aF07CisvLyAgbWVtY3B5KGFwcDFCdWZmZXIsIHV0aWxzLT5HZXRBcHAxQnVmZmVyKCksIGFwcDFMZW5ndGgpOworY2xhc3MgRXhpZlV0aWxzIHsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkV4aWZVdGlscygpOworCisgICAgc3RhdGljIEV4aWZVdGlscyogY3JlYXRlKCk7CisKKyAgICAvLyBJbml0aWFsaXplKCkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHNldHRpbmcgb2YgRXhpZiB0YWdzIHdpbGwgYmUKKyAgICAvLyBjbGVhcmVkLgorICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemVFbXB0eSgpID0gMDsKKworICAgIC8vIFNldCBhbGwga25vd24gZmllbGRzIGZyb20gYSBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsIGNvbnN0IHNpemVfdCBpbWFnZUhlaWdodCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbGVuIGFwZXJ0dXJlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSA9IDA7CisKKyAgICAvLyBzZXRzIHRoZSBjb2xvciBzcGFjZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGltYWdlIGxhc3QgbW9kaWZpZWQuIEl0IHRha2VzIGxvY2FsIHRpbWUuIFRoZQorICAgIC8vIG5hbWUgb2YgdGhlIHRhZyBpcyBEYXRlVGltZSBpbiBJRkQwLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERhdGVUaW1lKGNvbnN0IHN0cnVjdCB0bSYgdCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGlnaXRhbCB6b29tIHJhdGlvLiBJZiB0aGUgbnVtZXJhdG9yIGlzIDAsIGl0IG1lYW5zIGRpZ2l0YWwgem9vbQorICAgIC8vIHdhcyBub3QgdXNlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREaWdpdGFsWm9vbVJhdGlvKHVpbnQzMl90IGNyb3Bfd2lkdGgsIHVpbnQzMl90IGNyb3BfaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBiaWFzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlQmlhcyhpbnQzMl90IGV2LAorICAgICAgICAgICAgdWludDMyX3QgZXZfc3RlcF9udW1lcmF0b3IsIHVpbnQzMl90IGV2X3N0ZXBfZGVub21pbmF0b3IpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIHRpbWUsIGdpdmVuIGluIHNlY29uZHMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHN0YXR1cyBvZiBmbGFzaC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGbGFzaCh1aW50OF90IGZsYXNoX2F2YWlsYWJsZSwgdWludDhfdCBmbGFzaF9zdGF0ZSwgdWludDhfdCBhZV9tb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBGIG51bWJlci4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgZm9yIDM1bW0gZmlsbSB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbShmbG9hdCBmb2NhbF9sZW5ndGgsCisgICAgICAgICAgICBmbG9hdCBzZW5zb3Jfc2l6ZV94LCBmbG9hdCBzZW5zb3Jfc2l6ZV95KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsYXRpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxvbmdpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMb25naXR1ZGUoZG91YmxlIGxvbmdpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyBHUFMgcHJvY2Vzc2luZyBtZXRob2QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKSA9IDA7CisKKyAgICAvLyBTZXRzIEdQUyBkYXRlIHN0YW1wIGFuZCB0aW1lIHN0YW1wIChhdG9taWMgY2xvY2spLiBJdCB0YWtlcyBVVEMgdGltZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNUaW1lc3RhbXAoY29uc3Qgc3RydWN0IHRtJiB0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBoZWlnaHQgKG51bWJlciBvZiByb3dzKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlSGVpZ2h0KHVpbnQzMl90IGxlbmd0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgd2lkdGggKG51bWJlciBvZiBjb2x1bW5zKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIElTTyBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncykgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc21hbGxlc3QgRiBudW1iZXIgb2YgdGhlIGxlbnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0TWF4QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpID0gMDsKKworICAgIC8vIFNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcykgPSAwOworCisgICAgLy8gU2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzaHV0dGVyIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFNodXR0ZXJTcGVlZChmbG9hdCBleHBvc3VyZV90aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkaXN0YW5jZSB0byB0aGUgc3ViamVjdCwgZ2l2ZW4gaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycykgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZnJhY3Rpb25zIG9mIHNlY29uZHMgZm9yIHRoZSA8RGF0ZVRpbWU+IHRhZy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRXaGl0ZUJhbGFuY2UodWludDhfdCB3aGl0ZV9ibGFuYWNlKSA9IDA7CisKKyAgICAvLyBHZW5lcmF0ZXMgQVBQMSBzZWdtZW50LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZ2VuZXJhdGluZyBBUFAxIHNlZ21lbnQgZmFpbHMuCisgICAgdmlydHVhbCBib29sIGdlbmVyYXRlQXBwMSgpID0gMDsKKworICAgIC8vIEdldHMgYnVmZmVyIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcHAxQnVmZmVyKCkgPSAwOworCisgICAgLy8gR2V0cyBsZW5ndGggb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRBcHAxTGVuZ3RoKCkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCmluZGV4IDUzOGJiNmUuLmUyYmRjNDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwCkBAIC00Niw3ICs0Niw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhTGF0ZW5jeUhpc3RvZ3JhbTo6cmVzZXQoKSB7Ci0gICAgbUJpbnMuY2xlYXIoKTsKKyAgICBtZW1zZXQobUJpbnMuZGF0YSgpLCAwLCBtQmlucy5zaXplKCkgKiBzaXplb2YoaW50NjRfdCkpOwogICAgIG1Ub3RhbENvdW50ID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBjMGEzNTNmLi40MDM3YTY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtNDksNyArNDksOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwogCiAgICAgLy8gRXhwYW5kIHNob3J0aGFuZHMKLSAgICBpZiAoc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpICE9IC0xKSB7CisgICAgc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpOworICAgIGlmIChpZHggIT0gLTEpIHsKICAgICAgICAgc3NpemVfdCBlbmQgPSB0YWdOYW1lcy5maW5kKCIsIiwgaWR4KTsKICAgICAgICAgY2hhciogc3RhcnQgPSB0YWdOYW1lcy5sb2NrQnVmZmVyKHRhZ05hbWVzLnNpemUoKSk7CiAgICAgICAgIHN0YXJ0W2lkeF0gPSAnXDAnOwpAQCAtOTksMTAgKzEwMCwxMyBAQAogICAgIG1Nb25pdG9yaW5nRW5hYmxlZCA9IGZhbHNlOwogICAgIG1MYXN0TW9uaXRvcmVkUmVxdWVzdFZhbHVlcy5jbGVhcigpOwogICAgIG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzLmNsZWFyKCk7CisgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmNsZWFyKCk7CisgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXMuY2xlYXIoKTsKIH0KIAogdm9pZCBUYWdNb25pdG9yOjptb25pdG9yTWV0YWRhdGEoZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEpIHsKICAgICBpZiAoIW1Nb25pdG9yaW5nRW5hYmxlZCkgcmV0dXJuOwogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CkBAIC0xMTEsNjIgKzExNSw3NyBAQAogICAgICAgICB0aW1lc3RhbXAgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICB9CiAKKyAgICBzdGQ6OnN0cmluZyBlbXB0eUlkOwogICAgIGZvciAoYXV0byB0YWcgOiBtTW9uaXRvcmVkVGFnTGlzdCkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKHRhZyk7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhICZsYXN0VmFsdWVzID0gKHNvdXJjZSA9PSBSRVFVRVNUKSA/Ci0gICAgICAgICAgICAgICAgbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzIDogbUxhc3RNb25pdG9yZWRSZXN1bHRWYWx1ZXM7Ci0gICAgICAgIGlmIChsYXN0VmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbGFzdFZhbHVlcyA9IENhbWVyYU1ldGFkYXRhKG1Nb25pdG9yZWRUYWdMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqbWV0YUJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZXMuZ2V0QW5kTG9jaygpOwotICAgICAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QgKj4gKG1ldGFCdWZmZXIpLCBtVmVuZG9yVGFnSWQpOwotICAgICAgICAgICAgbGFzdFZhbHVlcy51bmxvY2sobWV0YUJ1ZmZlcik7CisgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVtcHR5SWQsIHRhZywgbWV0YWRhdGEpOworCisgICAgICAgIGZvciAoYXV0byYgbSA6IHBoeXNpY2FsTWV0YWRhdGEpIHsKKyAgICAgICAgICAgIG1vbml0b3JTaW5nbGVNZXRhZGF0YShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIG0uZmlyc3QsIHRhZywgbS5zZWNvbmQpOwogICAgICAgICB9CisgICAgfQorfQogCi0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSBsYXN0VmFsdWVzLmZpbmQodGFnKTsKK3ZvaWQgVGFnTW9uaXRvcjo6bW9uaXRvclNpbmdsZU1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwgdWludDMyX3QgdGFnLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKIAotICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICBib29sIGlzRGlmZmVyZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIEhhdmUgYSBsYXN0IHZhbHVlLCBjb21wYXJlIHRvIHNlZSBpZiBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKGxhc3RFbnRyeS50eXBlID09IGVudHJ5LnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbnRyeS5jb3VudCA9PSBlbnRyeS5jb3VudCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHR5cGUgYW5kIGNvdW50LCBjb21wYXJlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJWYWx1ZSA9IGNhbWVyYV9tZXRhZGF0YV90eXBlX3NpemVbbGFzdEVudHJ5LnR5cGVdOwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW50cnlCeXRlcyA9IGJ5dGVzUGVyVmFsdWUgKiBsYXN0RW50cnkuY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjbXAgPSBtZW1jbXAoZW50cnkuZGF0YS51OCwgbGFzdEVudHJ5LmRhdGEudTgsIGVudHJ5Qnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY21wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvdW50IG9yIHR5cGUgaGFzIGNoYW5nZWQKKyAgICBDYW1lcmFNZXRhZGF0YSAmbGFzdFZhbHVlcyA9IChzb3VyY2UgPT0gUkVRVUVTVCkgPworICAgICAgICAgICAgKGNhbWVyYUlkLmVtcHR5KCkgPyBtTGFzdE1vbml0b3JlZFJlcXVlc3RWYWx1ZXMgOgorICAgICAgICAgICAgICAgICAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXNbY2FtZXJhSWRdKSA6CisgICAgICAgICAgICAoY2FtZXJhSWQuZW1wdHkoKSA/IG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzIDoKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXNbY2FtZXJhSWRdKTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQodGFnKTsKKyAgICBpZiAobGFzdFZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbGFzdFZhbHVlcyA9IENhbWVyYU1ldGFkYXRhKG1Nb25pdG9yZWRUYWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICptZXRhQnVmZmVyID0KKyAgICAgICAgICAgICAgICBsYXN0VmFsdWVzLmdldEFuZExvY2soKTsKKyAgICAgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCAqPiAobWV0YUJ1ZmZlciksIG1WZW5kb3JUYWdJZCk7CisgICAgICAgIGxhc3RWYWx1ZXMudW5sb2NrKG1ldGFCdWZmZXIpOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSBsYXN0VmFsdWVzLmZpbmQodGFnKTsKKworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgYm9vbCBpc0RpZmZlcmVudCA9IGZhbHNlOworICAgICAgICBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gSGF2ZSBhIGxhc3QgdmFsdWUsIGNvbXBhcmUgdG8gc2VlIGlmIGNoYW5nZWQKKyAgICAgICAgICAgIGlmIChsYXN0RW50cnkudHlwZSA9PSBlbnRyeS50eXBlICYmCisgICAgICAgICAgICAgICAgICAgIGxhc3RFbnRyeS5jb3VudCA9PSBlbnRyeS5jb3VudCkgeworICAgICAgICAgICAgICAgIC8vIFNhbWUgdHlwZSBhbmQgY291bnQsIGNvbXBhcmUgdmFsdWVzCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyVmFsdWUgPSBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW2xhc3RFbnRyeS50eXBlXTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZW50cnlCeXRlcyA9IGJ5dGVzUGVyVmFsdWUgKiBsYXN0RW50cnkuY291bnQ7CisgICAgICAgICAgICAgICAgaW50IGNtcCA9IG1lbWNtcChlbnRyeS5kYXRhLnU4LCBsYXN0RW50cnkuZGF0YS51OCwgZW50cnlCeXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE5vIGxhc3QgZW50cnksIHNvIGFsd2F5cyBjb25zaWRlciB0byBiZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyBDb3VudCBvciB0eXBlIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gbGFzdCBlbnRyeSwgc28gYWx3YXlzIGNvbnNpZGVyIHRvIGJlIGRpZmZlcmVudAorICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpc0RpZmZlcmVudCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogVGFnICVzIGNoYW5nZWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZV92ZW5kb3JfaWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIG1WZW5kb3JUYWdJZCkpOwotICAgICAgICAgICAgICAgIGxhc3RWYWx1ZXMudXBkYXRlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgIC8vIFZhbHVlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAgICAgICAgIEFMT0dWKCIlczogVGFnICVzIHJlbW92ZWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIGlmIChpc0RpZmZlcmVudCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBUYWcgJXMgY2hhbmdlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWVfdmVuZG9yX2lkKAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIG1WZW5kb3JUYWdJZCkpOwotICAgICAgICAgICAgbGFzdFZhbHVlcy5lcmFzZSh0YWcpOwotICAgICAgICAgICAgZW50cnkudGFnID0gdGFnOwotICAgICAgICAgICAgZW50cnkudHlwZSA9IGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX3R5cGVfdmVuZG9yX2lkKHRhZywKLSAgICAgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKTsKLSAgICAgICAgICAgIGVudHJ5LmNvdW50ID0gMDsKLSAgICAgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSk7CisgICAgICAgICAgICBsYXN0VmFsdWVzLnVwZGF0ZShlbnRyeSk7CisgICAgICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnksIGNhbWVyYUlkKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgIEFMT0dWKCIlczogVGFnICVzIHJlbW92ZWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWVfdmVuZG9yX2lkKAorICAgICAgICAgICAgICAgICAgICAgIHRhZywgbVZlbmRvclRhZ0lkKSk7CisgICAgICAgIGxhc3RWYWx1ZXMuZXJhc2UodGFnKTsKKyAgICAgICAgZW50cnkudGFnID0gdGFnOworICAgICAgICBlbnRyeS50eXBlID0gZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfdHlwZV92ZW5kb3JfaWQodGFnLAorICAgICAgICAgICAgICAgIG1WZW5kb3JUYWdJZCk7CisgICAgICAgIGVudHJ5LmNvdW50ID0gMDsKKyAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCk7CiAgICAgfQogfQogCkBAIC0xODksOCArMjA4LDkgQEAKICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgTW9uaXRvcmVkIHRhZyBldmVudCBsb2c6XG4iKTsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBldmVudCA6IG1Nb25pdG9yaW5nRXZlbnRzKSB7CiAgICAgICAgICAgICBpbnQgaW5kZW50YXRpb24gPSAoZXZlbnQuc291cmNlID09IFJFUVVFU1QpID8gMTUgOiAzMDsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgICAgIGYlZDolIiBQUklkNjQgIm5zOiAlKnMlcy4lczogIiwKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgICAgIGYlZDolIiBQUklkNjQgIm5zOiUqcyUqcyVzLiVzOiAiLAogICAgICAgICAgICAgICAgICAgICBldmVudC5mcmFtZU51bWJlciwgZXZlbnQudGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAyLCBldmVudC5jYW1lcmFJZC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlID09IFJFUVVFU1QgPyAiUkVROiIgOiAiUkVTOiIsCiAgICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9uYW1lX3ZlbmRvcl9pZChldmVudC50YWcsCkBAIC0yOTUsMTMgKzMxNSwxNCBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogVGFnTW9uaXRvcjo6TW9uaXRvckV2ZW50OjpNb25pdG9yRXZlbnQoZXZlbnRTb3VyY2Ugc3JjLCB1aW50MzJfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGNvbnN0IFQgJnZhbHVlKSA6CisgICAgICAgIGNvbnN0IFQgJnZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpIDoKICAgICAgICAgc291cmNlKHNyYyksCiAgICAgICAgIGZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSwKICAgICAgICAgdGltZXN0YW1wKHRpbWVzdGFtcCksCiAgICAgICAgIHRhZyh2YWx1ZS50YWcpLAogICAgICAgICB0eXBlKHZhbHVlLnR5cGUpLAotICAgICAgICBuZXdEYXRhKHZhbHVlLmRhdGEudTgsIHZhbHVlLmRhdGEudTggKyBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW3ZhbHVlLnR5cGVdICogdmFsdWUuY291bnQpIHsKKyAgICAgICAgbmV3RGF0YSh2YWx1ZS5kYXRhLnU4LCB2YWx1ZS5kYXRhLnU4ICsgY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt2YWx1ZS50eXBlXSAqIHZhbHVlLmNvdW50KSwKKyAgICAgICAgY2FtZXJhSWQoY2FtZXJhSWQpIHsKIH0KIAogVGFnTW9uaXRvcjo6TW9uaXRvckV2ZW50Ojp+TW9uaXRvckV2ZW50KCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCmluZGV4IDJkZWNlNjIuLjFiN2IwMzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNjIsNyArNjMsOCBAQAogCiAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBtZXRhZGF0YSBhbmQgdXBkYXRlIHRoZSBtb25pdG9yaW5nIGluZm9ybWF0aW9uCiAgICAgdm9pZCBtb25pdG9yTWV0YWRhdGEoZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4mIHBoeXNpY2FsTWV0YWRhdGEpOwogCiAgICAgLy8gRHVtcCBjdXJyZW50IGV2ZW50IGxvZyB0byB0aGUgcHJvdmlkZWQgZmQKICAgICB2b2lkIGR1bXBNb25pdG9yZWRNZXRhZGF0YShpbnQgZmQpOwpAQCAtNzIsNiArNzQsMTAgQEAKICAgICBzdGF0aWMgdm9pZCBwcmludERhdGEoaW50IGZkLCBjb25zdCB1aW50OF90ICpkYXRhX3B0ciwgdWludDMyX3QgdGFnLAogICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb3VudCwgaW50IGluZGVudGF0aW9uKTsKIAorICAgIHZvaWQgbW9uaXRvclNpbmdsZU1ldGFkYXRhKFRhZ01vbml0b3I6OmV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CisKICAgICBzdGQ6OmF0b21pYzxib29sPiBtTW9uaXRvcmluZ0VuYWJsZWQ7CiAgICAgc3RkOjptdXRleCBtTW9uaXRvck11dGV4OwogCkBAIC04Miw2ICs4OCw5IEBACiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzOwogICAgIENhbWVyYU1ldGFkYXRhIG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzOwogCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlcXVlc3RLZXlzOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXN1bHRLZXlzOworCiAgICAgLyoqCiAgICAgICogQSBtb25pdG9yaW5nIGV2ZW50CiAgICAgICogU3RvcmVzIGEgbmV3IG1ldGFkYXRhIGZpZWxkIHZhbHVlIGFuZCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIGl0IGNoYW5nZWQuCkBAIC05MCw3ICs5OSw3IEBACiAgICAgc3RydWN0IE1vbml0b3JFdmVudCB7CiAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgIE1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgY29uc3QgVCAmbmV3VmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CiAgICAgICAgIH5Nb25pdG9yRXZlbnQoKTsKIAogICAgICAgICBldmVudFNvdXJjZSBzb3VyY2U7CkBAIC05OSw2ICsxMDgsNyBAQAogICAgICAgICB1aW50MzJfdCB0YWc7CiAgICAgICAgIHVpbnQ4X3QgdHlwZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbmV3RGF0YTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CiAgICAgfTsKIAogICAgIC8vIEEgcmluZyBidWZmZXIgZm9yIHRyYWNraW5nIHRoZSBsYXN0IGtNYXhNb25pdG9yRXZlbnRzIG1ldGFkYXRhIGNoYW5nZXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjRiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjggQEAKKy8vIE1lZGlhIFN0YXRpc3RpY3Mgc2VydmljZQorLy8KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFtZXRyaWNzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1haW5fbWVkaWFtZXRyaWNzLmNwcCIsCisgICAgICAgICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIiwKKyAgICAgICAgImlmYWNlX3N0YXRzZC5jcHAiLAorICAgICAgICAic3RhdHNkX2F1ZGlvcG9saWN5LmNwcCIsCisgICAgICAgICJzdGF0c2RfYXVkaW9yZWNvcmQuY3BwIiwKKyAgICAgICAgInN0YXRzZF9hdWRpb3RocmVhZC5jcHAiLAorICAgICAgICAic3RhdHNkX2F1ZGlvdHJhY2suY3BwIiwKKyAgICAgICAgInN0YXRzZF9jb2RlYy5jcHAiLAorICAgICAgICAic3RhdHNkX2RybS5jcHAiLAorICAgICAgICAic3RhdHNkX2V4dHJhY3Rvci5jcHAiLAorICAgICAgICAic3RhdHNkX251cGxheWVyLmNwcCIsCisgICAgICAgICJzdGF0c2RfcmVjb3JkZXIuY3BwIiwKKyAgICBdLAorCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhdHNsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGxhdGZvcm1wcm90b3MiLAorICAgICAgICAibGlicmVnaXN0ZXJtc2V4dCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0iLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9jYW1lcmEiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAorICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJtZWRpYW1ldHJpY3MucmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICBdLAorICAgIGNsYW5nOiB0cnVlLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlYjdmYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBNZWRpYSBTdGF0aXN0aWNzIHNlcnZpY2UKLSMKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIG1haW5fbWVkaWFtZXRyaWNzLmNwcCAgICAgICAgICAgICAgXAotICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmRsICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhdXRpbHMgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWFtZXRyaWNzICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnV0aWxzCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJyZWdpc3Rlcm1zZXh0Ci0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0gICAgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL2NhbWVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggICAgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgICAgICAgICAgICAgICAgIFwKLSAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmNvcmUvaW5jbHVkZQotCi0KLUxPQ0FMX01PRFVMRTo9IG1lZGlhbWV0cmljcwotCi1MT0NBTF9JTklUX1JDIDo9IG1lZGlhbWV0cmljcy5yYwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbCAtV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zCi1MT0NBTF9DTEFORyA6PSB0cnVlCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uMGU3ZWRmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTAsNyArNTEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTc2LDE1ICs3NiwyNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07Ci0KIC8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50Ci0vLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGFnZTogPD0gMjggaG91cnMgKDEgMS82IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKIC8vICgwIGZvciBlaXRoZXIgb2YgdGhlc2UgZGlzYWJsZXMgdGhhdCB0aHJlc2hvbGQpCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMzYgKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisvLworc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAyOCAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CisvLyAyMDE5LzY6IGF2ZXJhZ2UgZGFpbHkgcGVyIGRldmljZSBpcyBjdXJyZW50bHkgMzc1LWlzaDsKKy8vIHNldHRpbmcgdGhpcyB0byAyMDAwIGlzIGxhcmdlIGVub3VnaCB0byBjYXRjaCBtb3N0IGRldmljZXMKKy8vIHdlJ2xsIGxvc2Ugc29tZSBkYXRhIG9uIHZlcnkgdmVyeSBtZWRpYS1hY3RpdmUgZGV2aWNlcywgYnV0IG9ubHkgZm9yCisvLyB0aGUgZ21zIGNvbGxlY3Rpb247IHN0YXRzZCB3aWxsIGhhdmUgYWxyZWFkeSBjb3ZlcmVkIHRob3NlIGZvciB1cy4KKy8vIFRoaXMgYWxzbyByZXRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0byBoZWxwIHdpdGggYnVncmVwb3J0cworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJlY29yZHMgICAgPSAyMDAwOworCisvLyBtYXggd2UgZXhwaXJlIGluIGEgc2luZ2xlIGNhbGwsIHRvIGNvbnN0cmFpbiBob3cgbG9uZyB3ZSBob2xkIHRoZQorLy8gbXV0ZXgsIHdoaWNoIGFsc28gY29uc3RyYWlucyBob3cgbG9uZyBhIGNsaWVudCBtaWdodCB3YWl0Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEV4cGlyZWRBdE9uY2UgPSA1MDsKKworLy8gVE9ETzogbmVlZCB0byBsb29rIGF0IHR1bmluZyBrTWF4UmVjb3JkcyBhbmQgZnJpZW5kcyBmb3IgbG93LW1lbW9yeSBkZXZpY2VzCiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKQEAgLTk2LDYgKzEwNSw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAogICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAorICAgICAgICAgIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZShrTWF4RXhwaXJlZEF0T25jZSksCiAgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSwKICAgICAgICAgICBtRHVtcFByb3RvRGVmYXVsdChNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSB7CiAKQEAgLTIwNSwyMSArMjE1LDI0IEBACiAKICAgICAvLyBYWFg6IGlmIHdlIGhhdmUgYSBzZXNzaW9uaWQgaW4gdGhlIG5ldyByZWNvcmQsIGxvb2sgdG8gbWFrZQogICAgIC8vIHN1cmUgaXQgZG9lc24ndCBhcHBlYXIgaW4gdGhlIGZpbmFsaXplZCBsaXN0LgotICAgIC8vIFhYWDogdGhpcyBpcyBmb3Igc2VjdXJpdHkgLyBET1MgcHJldmVudGlvbi4KLSAgICAvLyBtYXkgYWxzbyByZXF1aXJlIHRoYXQgd2UgcGVyc2lzdCB0aGUgdW5pcXVlIHNlc3Npb25JRHMKLSAgICAvLyBhY3Jvc3MgYm9vdHMgW2luc3RlYWQgb2Ygd2l0aGluIGEgc2luZ2xlIGJvb3RdCiAKICAgICBpZiAoaXRlbS0+Y291bnQoKSA9PSAwKSB7Ci0gICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcworICAgICAgICBBTE9HVigiZHJvcHBpbmcgZW1wdHkgcmVjb3JkLi4uIik7CiAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICBpdGVtID0gTlVMTDsKICAgICAgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklESW52YWxpZDsKICAgICB9CiAKICAgICAvLyBzYXZlIHRoZSBuZXcgcmVjb3JkCisgICAgLy8KKyAgICAvLyBzZW5kIGEgY29weSB0byBzdGF0c2QKKyAgICBkdW1wMlN0YXRzZChpdGVtKTsKKworICAgIC8vIGFuZCBrZWVwIG91ciBjb3B5IGZvciBkdW1wc3lzCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBpZCA9IGl0ZW0tPmdldFNlc3Npb25JRCgpOwogICAgIHNhdmVJdGVtKGl0ZW0pOwogICAgIG1JdGVtc0ZpbmFsaXplZCsrOworCiAgICAgcmV0dXJuIGlkOwogfQogCkBAIC00MzIsMjMgKzQ0NSwyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NzUsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0OTAsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCkBAIC01ODEsNyArNjU0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+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+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1pZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2lmcmFtZV9pbnRlcnZhbChpRnJhbWVJbnRlcnZhbCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIHJlY29yZGVyIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfUkVDT1JERVJfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgLy8gbXVzdCBmcmVlIHRoZSBzdHJpbmdzIHRoYXQgd2Ugd2VyZSBnaXZlbgorICAgIGZyZWUoYXVkaW9fbWltZSk7CisgICAgZnJlZSh2aWRlb19taW1lKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2NhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWwiXSwKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIl0sCisgICAgICAgIH0sCisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsibWVkaWFzd2NvZGVjLnJjIl0sCisKKyAgICByZXF1aXJlZDogWyJtZWRpYXN3Y29kZWMucG9saWN5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnBvbGljeSIsCisgICAgc3ViX2RpcjogInNlY2NvbXBfcG9saWN5IiwKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kiLAorICAgICAgICB9LAorICAgIH0sCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImNyYXNoX2R1bXAucG9saWN5IiwKKyAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IDg2MzFjMzkuLjE1YmM1MDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTIyLDE4ICsyMiwxNyBAQAogICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIFwKICAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYyBcCiAgICAgbGlic3RhZ2VmcmlnaHRfc29mdF92cHhlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRvbXhfcGx1Z2luIFwKIAogIyBzZXJ2aWNlIGV4ZWN1dGFibGUKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogIyBzZWNjb21wIGlzIG5vdCByZXF1aXJlZCBmb3IgY292ZXJhZ2UgYnVpbGQuCiBpZm5lcSAoJChOQVRJVkVfQ09WRVJBR0UpLHRydWUpCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGNyYXNoX2R1bXAucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBtZWRpYWNvZGVjLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIGVuZGlmCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9jb2RlY3NlcnZpY2UuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJtZWRpYV9vbXggXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCkBAIC00MSw2ICs0MCw3IEBACiAgICAgbGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGliaHdiaW5kZXIgXAorICAgIGxpYmhpZGxiYXNlIFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBsaWJzdGFnZWZyaWdodF9vbXggXAogICAgIGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciBcCkBAIC02NCwxMiArNjQsMTUgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMgc2VydmljZSBzZWNjb21wIHBvbGljeQogaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBtZWRpYWNvZGVjLnBvbGljeQogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwogTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgY29kZV9jb3ZlcmFnZS5wb2xpY3kKICMgbWVkaWFjb2RlYyBydW5zIGluIDMyLWJpdCBjb21iYXRpYmlsaXR5IG1vZGUuIEZvciA2NCBiaXQgYXJjaGl0ZWN0dXJlcywKICMgdXNlIHRoZSAzMiBiaXQgcG9saWN5CiBpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKQEAgLTg0LDQgKzg3LDcgQEAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIGVuZGlmCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKaW5kZXggNTE2MTlmNi4uZjY2OGMzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTQ4LDM3ICs0NywyMSBAQAogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwogCi0gICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKLSAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAotICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAotICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICBpZiAocmVnaXN0cmFudExpYikgewotICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKLSAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOwotICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7Ci0gICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgotICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKLSAgICAgICAgfQorICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwotICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CisgICAgfQorICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKG9teCk7CisgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKICAgICB9CiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxYjc4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAKQEAgLTAsMCArMSw0OCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKy8vIGZyb20gTE9DQUxfQ19JTkNMVURFUworI2luY2x1ZGUgIm1pbmlqYWlsLmgiCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8ga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoIHBvaW50cyB0byB0aGUgcG9saWN5IGZvciB0aGUgc3djb2RlY3MgdGhlbXNlbHZlcyBhbmQKKy8vIGlzIHBhcnQgb2YgdGhlIHVwZGF0ZXMuIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aCBwb2ludHMgdG8gYW55IGFkZGl0aW9uYWwKKy8vIHBvbGljaWVzIHRoYXQgdGhlIHZlbmRvciBtYXkgbmVlZCBmb3IgdGhlIGRldmljZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy5wb2xpY3kiOworc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLnBvbGljeSI7CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKworaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KQoreworICAgIExPRyhJTkZPKSA8PCAibWVkaWEgc3djb2RlYyBzZXJ2aWNlIHN0YXJ0aW5nIjsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgU2V0VXBNaW5pamFpbChrU3lzdGVtU2VjY29tcFBvbGljeVBhdGgsIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aCk7CisgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5zd2NvZGVjIik7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDY0LCBmYWxzZSk7CisKKyAgICBSZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDk2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvc3lzdGVtL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIHVwZGF0YWJsZQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MyZTAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICAvLyBDb2RlY3MKKyAgICBydW50aW1lX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJ3YmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wM2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYXYxZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDllbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAorICAgIF0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKworZXh0ZXJuICJDIiB2b2lkIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgc29mdHdhcmUgQ29kZWMyIHNlcnZpY2UuLi4iOworICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmUgPQorICAgICAgICBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgic29mdHdhcmUiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwKKyAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQppbmRleCA2ZWM4ODk1Li44MzVmOGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQpAQCAtMTMsNiArMTMsOSBAQAogcHBvbGw6IDEKIG1tYXAyOiAxCiBnZXRyYW5kb206IDEKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQogCiAjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAogIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CkBAIC01NiwzICs1OSw1IEBACiBnZXRyYW5kb206IDEKIAogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtLnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQppbmRleCBiYmJlNTUyLi5hOWQzMmQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQpAQCAtMTgsMTQgKzE4LDIwIEBACiBvcGVuYXQ6IDEKIG9wZW46IDEKIGdldHVpZDMyOiAxCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQogd3JpdGV2OiAxCiBpb2N0bDogMQogY2xvc2U6IDEKIG1tYXAyOiAxCittbWFwOiAxCiBmc3RhdDY0OiAxCitmc3RhdDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCituZXdmc3RhdGF0OiAxCiBmdXRleDogMQogbXVubWFwOiAxCiBmYWNjZXNzYXQ6IDEKQEAgLTM5LDE1ICs0NSwyMiBAQAogZXhpdF9ncm91cDogMQogcnRfc2lncmV0dXJuOiAxCiB1Z2V0cmxpbWl0OiAxCityZWFkbGluazogMQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQogZnN0YXRmczY0OiAxCitmc3RhdGZzOiAxCiBwcmVhZDY0OiAxCiBtcmVtYXA6IDEKIGR1cDogMQogc2V0X3RpZF9hZGRyZXNzOiAxCiB3cml0ZTogMQogbmFub3NsZWVwOiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK3VuYW1lOiAxCittZW1mZF9jcmVhdGU6IDEKK2Z0cnVuY2F0ZTogMQorZnRydW5jYXRlNjQ6IDEKIAogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKQEAgLTU2LDMgKzY5LDQgQEAKIGdldHRpZDogMQogCiBAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNDg1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKQEAgLTAsMCArMSw4OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnV0ZXg6IDEKKyMgaW9jdGwgY2FsbHMgYXJlIGZpbHRlcmVkIHZpYSB0aGUgc2VsaW51eCBwb2xpY3kuCitpb2N0bDogMQorc2NoZWRfeWllbGQ6IDEKK2Nsb3NlOiAxCitkdXA6IDEKK3Bwb2xsOiAxCittcHJvdGVjdDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21tYXAyOiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKK2Z0cnVuY2F0ZTY0OiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK3ByY3RsOiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK2V4aXQ6IDEKK2xzZWVrOiAxCitydF9zaWdwcm9jbWFzazogMQorb3BlbmF0OiAxCitvcGVuOiAxCitmc3RhdDY0OiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCitzZXRwcmlvcml0eTogMQorc2V0X3RpZF9hZGRyZXNzOiAxCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCityZWFkbGluazogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZnN0YXRmczY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitleGl0X2dyb3VwOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK3J0X3NpZ3JldHVybjogMQorZ2V0cmFuZG9tOiAxCittYWR2aXNlOiAxCisKKyMgY3Jhc2ggZHVtcCBwb2xpY3kgYWRkaXRpb25zCitzaWdyZXR1cm46IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2Z1dGV4OiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorcGlwZTI6IDEKK3JlY3Ztc2c6IDEKK3Byb2Nlc3Nfdm1fcmVhZHY6IDEKK3Rna2lsbDogMQorcnRfc2lnYWN0aW9uOiAxCitydF90Z3NpZ3F1ZXVlaW5mbzogMQorI3ByY3RsOiBhcmcwID09IFBSX0dFVF9OT19ORVdfUFJJVlMgfHwgYXJnMCA9PSAweDUzNTY0ZDQxCisjbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgorI21tYXAyOiBhcmcyIGluIDB4MXwweDIKK2dldGV1aWQzMjogMQorZ2V0Z2lkMzI6IDEKK2dldGVnaWQzMjogMQorZ2V0Z3JvdXBzMzI6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY29kZV9jb3ZlcmFnZS5hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNTc3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQpAQCAtMCwwICsxLDgyIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK2dldHVpZDogMQorZ2V0cmxpbWl0OiAxCitmc3RhdDogMQorbmV3ZnN0YXRhdDogMQorZnN0YXRmczogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorcHJjdGw6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorcnRfc2lncmV0dXJuOiAxCitnZXRyYW5kb206IDEKK21hZHZpc2U6IDEKKworIyBjcmFzaCBkdW1wIHBvbGljeSBhZGRpdGlvbnMKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCitwaXBlMjogMQorcmVjdm1zZzogMQorcHJvY2Vzc192bV9yZWFkdjogMQordGdraWxsOiAxCitydF9zaWdhY3Rpb246IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCisjbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgorbXVubWFwOiAxCisjbW1hcDogYXJnMiBpbiAweDF8MHgyCitnZXRldWlkOiAxCitnZXRnaWQ6IDEKK2dldGVnaWQ6IDEKK2dldGdyb3VwczogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLmFybTY0LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWIyNTkyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSBAQAorbWVkaWFjb2RlYy14ODYucG9saWN5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWIyNTkyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kKQEAgLTAsMCArMSBAQAorbWVkaWFjb2RlYy14ODYucG9saWN5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggZTg3MDk2NS4uMjI3YTI5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgbGliaGlkbG1lbW9yeSBcCiAgICAgbGliaGlkbHRyYW5zcG9ydCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMgogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWRybS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmY3Mzk5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IERybVNlc3Npb25NYW5hZ2VyX3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlEcm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmxvZyBcCi0JbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAotCi1MT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWRybS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzNTBhMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEcm1TZXNzaW9uTWFuYWdlcl90ZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIkRybS5oIgotI2luY2x1ZGUgIkRybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJEcm1TZXNzaW9uTWFuYWdlci5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRmFrZVByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKLSAgICBGYWtlUHJvY2Vzc0luZm8oKSB7fQotICAgIHZpcnR1YWwgfkZha2VQcm9jZXNzSW5mbygpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgewotICAgICAgICAvLyBGb3IgdGVzdGluZywgdXNlIHBpZCBhcyBwcmlvcml0eS4KLSAgICAgICAgLy8gTG93ZXIgdGhlIHZhbHVlIGhpZ2hlciB0aGUgcHJpb3JpdHkuCi0gICAgICAgICpwcmlvcml0eSA9IHBpZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VQcm9jZXNzSW5mbyk7Ci19OwotCi1zdHJ1Y3QgRmFrZURybSA6IHB1YmxpYyBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlIHsKLSAgICBGYWtlRHJtKCkge30KLSAgICB2aXJ0dWFsIH5GYWtlRHJtKCkge30KLQotICAgIHZpcnR1YWwgYm9vbCByZWNsYWltU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgewotICAgICAgICBtUmVjbGFpbWVkU2Vzc2lvbnMucHVzaF9iYWNrKHNlc3Npb25JZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNvbnN0IFZlY3RvcjxWZWN0b3I8dWludDhfdD4gPiYgcmVjbGFpbWVkU2Vzc2lvbnMoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVjbGFpbWVkU2Vzc2lvbnM7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFZlY3RvcjxWZWN0b3I8dWludDhfdD4gPiBtUmVjbGFpbWVkU2Vzc2lvbnM7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGYWtlRHJtKTsKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RQaWQxID0gMzA7Ci1zdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMiA9IDIwOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3RTZXNzaW9uSWQxW10gPSB7MSwgMiwgM307Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdFNlc3Npb25JZDJbXSA9IHs0LCA1LCA2LCA3LCA4fTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0U2Vzc2lvbklkM1tdID0gezksIDB9OwotCi1jbGFzcyBEcm1TZXNzaW9uTWFuYWdlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXB1YmxpYzoKLSAgICBEcm1TZXNzaW9uTWFuYWdlclRlc3QoKQotICAgICAgICA6IG1Ecm1TZXNzaW9uTWFuYWdlcihuZXcgRHJtU2Vzc2lvbk1hbmFnZXIobmV3IEZha2VQcm9jZXNzSW5mbygpKSksCi0gICAgICAgICAgbVRlc3REcm0xKG5ldyBGYWtlRHJtKCkpLAotICAgICAgICAgIG1UZXN0RHJtMihuZXcgRmFrZURybSgpKSB7Ci0gICAgICAgIEdldFNlc3Npb25JZChrVGVzdFNlc3Npb25JZDEsIEFSUkFZX1NJWkUoa1Rlc3RTZXNzaW9uSWQxKSwgJm1TZXNzaW9uSWQxKTsKLSAgICAgICAgR2V0U2Vzc2lvbklkKGtUZXN0U2Vzc2lvbklkMiwgQVJSQVlfU0laRShrVGVzdFNlc3Npb25JZDIpLCAmbVNlc3Npb25JZDIpOwotICAgICAgICBHZXRTZXNzaW9uSWQoa1Rlc3RTZXNzaW9uSWQzLCBBUlJBWV9TSVpFKGtUZXN0U2Vzc2lvbklkMyksICZtU2Vzc2lvbklkMyk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHZvaWQgR2V0U2Vzc2lvbklkKGNvbnN0IHVpbnQ4X3QqIGlkcywgc2l6ZV90IG51bSwgVmVjdG9yPHVpbnQ4X3Q+KiBzZXNzaW9uSWQpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgICAgICAgICAgc2Vzc2lvbklkLT5wdXNoX2JhY2soaWRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIEV4cGVjdEVxU2Vzc2lvbkluZm8oY29uc3QgU2Vzc2lvbkluZm8mIGluZm8sIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBpbnQ2NF90IHRpbWVTdGFtcCkgewotICAgICAgICBFWFBFQ1RfRVEoZHJtLCBpbmZvLmRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQoc2Vzc2lvbklkLCBpbmZvLnNlc3Npb25JZCkpOwotICAgICAgICBFWFBFQ1RfRVEodGltZVN0YW1wLCBpbmZvLnRpbWVTdGFtcCk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRTZXNzaW9uKCkgewotICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQxLCBtVGVzdERybTEsIG1TZXNzaW9uSWQxKTsKLSAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMik7Ci0gICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMpOwotICAgICAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKLSAgICAgICAgc3NpemVfdCBpbmRleDEgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDEpOwotICAgICAgICBBU1NFUlRfR0UoaW5kZXgxLCAwKTsKLSAgICAgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXBbaW5kZXgxXTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKLSAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczFbMF0sIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEsIDApOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXgyID0gbWFwLmluZGV4T2ZLZXkoa1Rlc3RQaWQyKTsKLSAgICAgICAgQVNTRVJUX0dFKGluZGV4MiwgMCk7Ci0gICAgICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwW2luZGV4Ml07Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgaW5mb3MyLnNpemUoKSk7Ci0gICAgICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQyLCAxKTsKLSAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMV0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMsIDIpOwotICAgIH0KLQotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgc2Vzc2lvbk1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm1TZXNzaW9uTWFuYWdlci0+bVNlc3Npb25NYXA7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0R2V0TG93ZXN0UHJpb3JpdHkoKSB7Ci0gICAgICAgIGludCBwaWQ7Ci0gICAgICAgIGludCBwcmlvcml0eTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TG93ZXN0UHJpb3JpdHlfbCgmcGlkLCAmcHJpb3JpdHkpKTsKLQotICAgICAgICBhZGRTZXNzaW9uKCk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TG93ZXN0UHJpb3JpdHlfbCgmcGlkLCAmcHJpb3JpdHkpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQxLCBwaWQpOwotICAgICAgICBGYWtlUHJvY2Vzc0luZm8gcHJvY2Vzc0luZm87Ci0gICAgICAgIGludCBwcmlvcml0eTE7Ci0gICAgICAgIHByb2Nlc3NJbmZvLmdldFByaW9yaXR5KGtUZXN0UGlkMSwgJnByaW9yaXR5MSk7Ci0gICAgICAgIEVYUEVDVF9FUShwcmlvcml0eTEsIHByaW9yaXR5KTsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RHZXRMZWFzdFVzZWRTZXNzaW9uKCkgewotICAgICAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm07Ci0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDEsICZkcm0sICZzZXNzaW9uSWQpKTsKLQotICAgICAgICBhZGRTZXNzaW9uKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQxLCAmZHJtLCAmc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdERybTEsIGRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDEsIHNlc3Npb25JZCkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMiwgJmRybSwgJnNlc3Npb25JZCkpOwotICAgICAgICBFWFBFQ1RfRVEobVRlc3REcm0yLCBkcm0pOwotICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQyLCBzZXNzaW9uSWQpKTsKLQotICAgICAgICAvLyBtU2Vzc2lvbklkMiBpcyBubyBsb25nZXIgdGhlIGxlYXN0IHVzZWQgc2Vzc2lvbi4KLSAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1TZXNzaW9uSWQyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQyLCAmZHJtLCAmc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdERybTIsIGRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDMsIHNlc3Npb25JZCkpOwotICAgIH0KLQotICAgIHNwPERybVNlc3Npb25NYW5hZ2VyPiBtRHJtU2Vzc2lvbk1hbmFnZXI7Ci0gICAgc3A8RmFrZURybT4gbVRlc3REcm0xOwotICAgIHNwPEZha2VEcm0+IG1UZXN0RHJtMjsKLSAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDE7Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQyOwotICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkMzsKLX07Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIGFkZFNlc3Npb24pIHsKLSAgICBhZGRTZXNzaW9uKCk7Ci19Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHVzZVNlc3Npb24pIHsKLSAgICBhZGRTZXNzaW9uKCk7Ci0KLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnVzZVNlc3Npb24obVNlc3Npb25JZDEpOwotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+dXNlU2Vzc2lvbihtU2Vzc2lvbklkMyk7Ci0KLSAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKLSAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMSA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDEpOwotICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMik7Ci0gICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczFbMF0sIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEsIDMpOwotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzFdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCA0KTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgcmVtb3ZlU2Vzc2lvbikgewotICAgIGFkZFNlc3Npb24oKTsKLQotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkMik7Ci0KLSAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKLSAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOwotICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MxID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMSk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKLSAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MyLnNpemUoKSk7Ci0gICAgLy8gbVNlc3Npb25JZDIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlswXSwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMywgMik7Ci19Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHJlbW92ZURybSkgewotICAgIGFkZFNlc3Npb24oKTsKLQotICAgIHNwPEZha2VEcm0+IGRybSA9IG5ldyBGYWtlRHJtOwotICAgIGNvbnN0IHVpbnQ4X3QgaWRzW10gPSB7MTIzfTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOwotICAgIEdldFNlc3Npb25JZChpZHMsIEFSUkFZX1NJWkUoaWRzKSwgJnNlc3Npb25JZCk7Ci0gICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgZHJtLCBzZXNzaW9uSWQpOwotCi0gICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVEcm0obVRlc3REcm0yKTsKLQotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOwotICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMik7Ci0gICAgRVhQRUNUX0VRKDF1LCBpbmZvczIuc2l6ZSgpKTsKLSAgICAvLyBtVGVzdERybTIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlswXSwgZHJtLCBzZXNzaW9uSWQsIDMpOwotfQotCi1URVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZWNsYWltU2Vzc2lvbikgewotICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKGtUZXN0UGlkMSkpOwotICAgIGFkZFNlc3Npb24oKTsKLQotICAgIC8vIGNhbGxpbmcgcGlkIHByaW9yaXR5IGlzIHRvbyBsb3cKLSAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbig1MCkpOwotCi0gICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbigxMCkpOwotICAgIEVYUEVDVF9FUSgxdSwgbVRlc3REcm0xLT5yZWNsYWltZWRTZXNzaW9ucygpLnNpemUoKSk7Ci0gICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMSwgbVRlc3REcm0xLT5yZWNsYWltZWRTZXNzaW9ucygpWzBdKSk7Ci0KLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZDEpOwotCi0gICAgLy8gYWRkIGEgc2Vzc2lvbiBmcm9tIGEgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MuCi0gICAgc3A8RmFrZURybT4gZHJtID0gbmV3IEZha2VEcm07Ci0gICAgY29uc3QgdWludDhfdCBpZHNbXSA9IHsxLCAzLCA1fTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOwotICAgIEdldFNlc3Npb25JZChpZHMsIEFSUkFZX1NJWkUoaWRzKSwgJnNlc3Npb25JZCk7Ci0gICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKDE1LCBkcm0sIHNlc3Npb25JZCk7Ci0KLSAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDE4KSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBtVGVzdERybTItPnJlY2xhaW1lZFNlc3Npb25zKCkuc2l6ZSgpKTsKLSAgICAvLyBtU2Vzc2lvbklkMiBpcyByZWNsYWltZWQuCi0gICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMiwgbVRlc3REcm0yLT5yZWNsYWltZWRTZXNzaW9ucygpWzBdKSk7Ci19Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIGdldExvd2VzdFByaW9yaXR5KSB7Ci0gICAgdGVzdEdldExvd2VzdFByaW9yaXR5KCk7Ci19Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIGdldExlYXN0VXNlZFNlc3Npb25fbCkgewotICAgIHRlc3RHZXRMZWFzdFVzZWRTZXNzaW9uKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzAxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIHNlcnZpY2UgbGlicmFyeQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzcmNzOiBbIk1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKKy8vIHNlcnZpY2UgZXhlY3V0YWJsZQorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFleHRyYWN0b3IiLAorCisgICAgc3JjczogWyJtYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yc2VydmljZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWwiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCisgICAgaW5pdF9yYzogWyJtZWRpYWV4dHJhY3Rvci5yYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFleHRyYWN0b3IucG9saWN5IiwKKyAgICBzdWJfZGlyOiAic2VjY29tcF9wb2xpY3kiLAorICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgYXJtNjQ6IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4Nl82NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgfSwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiY3Jhc2hfZHVtcC5wb2xpY3kiLAorICAgICAgICAiY29kZV9jb3ZlcmFnZS5wb2xpY3kiLAorICAgIF0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY1MjdmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgc2VydmljZSBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgXAotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLSMgc2VydmljZSBleGVjdXRhYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLSMgc2VjY29tcCBmaWx0ZXJzIGFyZSBkZWZpbmVkIGZvciB0aGUgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXM6Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGNyYXNoX2R1bXAucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gbWVkaWFleHRyYWN0b3IucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIGxpYmJpbmRlciBsaWJ1dGlscyBcCi0gICAgbGlibG9nIGxpYmJhc2UgbGliaWN1dWMgbGliYXZzZXJ2aWNlc19taW5pamFpbAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJpY3VhbmRyb2lkX3V0aWxzCi1MT0NBTF9NT0RVTEU6PSBtZWRpYWV4dHJhY3RvcgotTE9DQUxfSU5JVF9SQyA6PSBtZWRpYWV4dHJhY3Rvci5yYwotTE9DQUxfQ19JTkNMVURFUyA6PSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMgc2VydmljZSBzZWNjb21wIGZpbHRlcgotaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBhcm0gYXJtNjQgeDg2IHg4Nl82NCkpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVCkvZXRjL3NlY2NvbXBfcG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItJChUQVJHRVRfQVJDSCkucG9saWN5Ci1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZjBmNDRmNS4uMzZlMDg0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CkBAIC0zMCw2ICsyOSwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK01lZGlhRXh0cmFjdG9yU2VydmljZTo6TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKKyAgICAgICAgOiBCbk1lZGlhRXh0cmFjdG9yU2VydmljZSgpIHsKKyAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRFeHRyYWN0b3JzKCk7Cit9CisKIHNwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yKAogICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnJlbW90ZVNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewogICAgIEFMT0dWKCJAQEAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yIGZvciAlcyIsIG1pbWUpOwpAQCAtNTUsNiArNTksMTAgQEAKICAgICByZXR1cm4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogfQogCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHJldHVybiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoZmQsIGFyZ3MpIHx8IGR1bXBFeHRyYWN0b3JzKGZkLCBhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggOWRmM2VjZC4uYzljZWJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclNlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAorICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2E2OTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgotCi0jaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6bG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIEFMT0dWKCJsb2FkUGx1Z2lucyAlcyIsIGFwa1BhdGguY19zdHIoKSk7Ci0gICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhhcGtQYXRoKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNWY2ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+OwotcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KLSAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKLX07Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCmluZGV4IDhkMzM1OWEuLjNjNDEyNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcApAQCAtMjksMTYgKzI5LDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQotICAgICAgICAiL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKKyAgICAgICAgIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci5wb2xpY3kiOwogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIApAQCAtNTksMTggKzU3LDExIEBACiAKICAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKIAotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOwotCiAgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5leHRyYWN0b3IiKTsKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAKLSAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKLSAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKLSAgICAgICAgbWVkaWE6Ok1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICB9Ci0KICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CmluZGV4IDg3MDE4ZWQuLjM4ZjliZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQpAQCAtMTQsNiArMTQsNyBAQAogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCiBvcGVuYXQ6IDEKK29wZW46IDEKIGNsb25lOiAxCiByZWFkOiAxCiBjbG9ja19nZXR0aW1lOiAxCkBAIC00OSwzICs1MCw0IEBACiBfbGxzZWVrOiAxCiAKIEBpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY29kZV9jb3ZlcmFnZS5hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKaW5kZXggZDcwZTI3Yi4uOGZkODc4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQpAQCAtNDAsNCArNDAsOCBAQAogcHJlYWQ2NDogMQogbXJlbWFwOiAxCiAKKyMgUmVxdWlyZWQgYnkgU2FuaXRpemVycworc2NoZWRfeWllbGQ6IDEKKwogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm02NC5wb2xpY3kKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVfY292ZXJhZ2UuYXJtNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeQppbmRleCBkNzM5YmExLi4wNTkxNWQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kKQEAgLTExLDYgKzExLDcgQEAKIG1tYXAyOiAxCiBtYWR2aXNlOiAxCiBvcGVuYXQ6IDEKK29wZW46IDEKIGNsb2NrX2dldHRpbWU6IDEKIHdyaXRldjogMQogYnJrOiAxCkBAIC01NiwzICs1Nyw0IEBACiBnZXR0aWQ6IDEKIAogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLng4Ni5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjNjNzc4MC4uZTZhNTVkMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTExLDYgKzExLDcgQEAKIG1tYXA6IDEKIG1hZHZpc2U6IDEKIG9wZW5hdDogMQorb3BlbjogMQogY2xvY2tfZ2V0dGltZTogMQogd3JpdGV2OiAxCiBicms6IDEKQEAgLTIxLDYgKzIyLDggQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdDogMQorZnN0YXRmczogMQogbmV3ZnN0YXRhdDogMQogcmVzdGFydF9zeXNjYWxsOiAxCiBleGl0OiAxCkBAIC0zMCwyOCArMzMsMjIgQEAKIHNjaGVkX3NldHNjaGVkdWxlcjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQorCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotdGdraWxsOiAxCi1zb2NrZXQ6IGFyZzAgPT0gMQotY29ubmVjdDogMQotZmNudGw6IDEKLXJ0X3NpZ3Byb2NtYXNrOiAxCi1ydF9zaWdhY3Rpb246IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkOiAxCi1nZXRnaWQ6IDEKLWdldGVnaWQ6IDEKLWdldGdyb3VwczogMQotZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi0KICMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgogZ2V0dGlkOiAxCiBzY2hlZF95aWVsZDogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlX2NvdmVyYWdlLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLmJlZTVkMjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMTAsNyArMTAsNyBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCAxYmU1NTQ0Li45MDJhZjY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTIwLDggKzIwLDkgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MywyNyArNTQsMjggQEAKIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwIHx8CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwIHx8CiAgICAgICAgICAgICBzaXplIDwga01pblNpemUgfHwgc2l6ZSA+IGtNYXhTaXplIHx8IG5hbWUgPT0gTlVMTCB8fAogICAgICAgICAgICAgc2hhcmVkLT5zaXplKCkgPCBOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplKSk7Ci0gICAgTkJMb2c6Ok5hbWVkUmVhZGVyIG5hbWVkUmVhZGVyKHJlYWRlciwgbmFtZSk7CisgICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBSZWFkZXIgaGFuZGxlZCBieSBtZXJnZXIKKyAgICBzcDxOQkxvZzo6RHVtcFJlYWRlcj4gZHVtcFJlYWRlcihuZXcgTkJMb2c6OkR1bXBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIGZvciBkdW1wc3lzCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTmFtZWRSZWFkZXJzLmFkZChuYW1lZFJlYWRlcik7Ci0gICAgbU1lcmdlci5hZGRSZWFkZXIobmFtZWRSZWFkZXIpOworICAgIG1EdW1wUmVhZGVycy5hZGQoZHVtcFJlYWRlcik7CisgICAgbU1lcmdlci5hZGRSZWFkZXIocmVhZGVyKTsKIH0KIAogdm9pZCBNZWRpYUxvZ1NlcnZpY2U6OnVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmFtZWRSZWFkZXJzLnNpemUoKTsgKSB7Ci0gICAgICAgIGlmIChtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5pc0lNZW1vcnkoc2hhcmVkKSkgewotICAgICAgICAgICAgbU5hbWVkUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EdW1wUmVhZGVycy5zaXplKCk7ICkgeworICAgICAgICBpZiAobUR1bXBSZWFkZXJzW2ldLT5pc0lNZW1vcnkoc2hhcmVkKSkgeworICAgICAgICAgICAgbUR1bXBSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgLy8gVE9ETyBtTWVyZ2VyLnJlbW92ZVJlYWRlcnMoc2hhcmVkKQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaSsrOwogICAgICAgICB9CkBAIC05NSwxMCArOTcsOCBAQAogCiBzdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBidXQgbm90IGlkZW50aWNhbCBjb2RlIGF0IHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICBpZiAoIShJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX0FVRElPU0VSVkVSIHx8Ci0gICAgICAgICAgICBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApKSkgeworICAgIGlmICghKGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkKKyAgICAgICAgICAgIHx8IGR1bXBBbGxvd2VkKCkpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgIGlmIChhcmdzLnNpemUoKSA+IDApIHsKICAgICAgICAgY29uc3QgU3RyaW5nOCBhcmcwKGFyZ3NbMF0pOwogICAgICAgICBpZiAoIXN0cmNtcChhcmcwLnN0cmluZygpLCAiLXIiKSkgewotICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbU5hbWVkUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1SZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jawogICAgICAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gTWVkaWFMb2dTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKQEAgLTExOSwyMSArMTE5LDIyIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiIsIHJlc3VsdC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGluc3RlYWQgcHJvY2VlZCB0byBtTWVyZ2VSZWFkZXIuZHVtcD8gZG9lcyBpdCBuZWVkIGxvY2s/CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWVkUmVhZGVyIDogbU5hbWVkUmVhZGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkdW1wUmVhZGVyIDogbUR1bXBSZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFJlYWRlci0+ZHVtcChmZCwgMCAvKmluZGVudCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIGR1bXBSZWFkZXItPm5hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCmluZGV4IGM5NDVkMWYuLjIxZGY4OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01NSw3ICs1Niw3IEBACiAKICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwogCi0gICAgVmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBWZWN0b3I8c3A8TkJMb2c6OkR1bXBSZWFkZXI+PiBtRHVtcFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKICAgICAvLyBGSVhNRSBOZWVkIGNvbW1lbnRzIG9uIGFsbCBvZiB0aGVzZSwgZXNwZWNpYWxseSBhYm91dCBsb2NraW5nCiAgICAgTkJMb2c6OlNoYXJlZCAqbU1lcmdlclNoYXJlZDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzM5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjYgQEAKKworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAiLAorICAgICAgICAiU2VydmljZUxvZy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyMzAzNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIFNlcnZpY2VMb2cuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlibWVkaWF1dGlscyBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UKLQotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlODgzMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQxIEBACisvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KK2NjX3Rlc3QgeworICAgIG5hbWU6ICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QiLAorICAgIHNyY3M6IFsiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlNlcnZpY2VMb2dfdGVzdCIsCisgICAgc3JjczogWyJTZXJ2aWNlTG9nX3Rlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYmNmOTIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICBsaWJiaW5kZXIgXAotICBsaWJsb2cgXAotICBsaWJtZWRpYSBcCi0gIGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAotICBsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIFwKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gU2VydmljZUxvZ190ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gIFNlcnZpY2VMb2dfdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgbGlibG9nIFwKLSAgbGlibWVkaWEgXAotICBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIFwKLSAgbGlidXRpbHMgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcAppbmRleCA3MjY0YTliLi44NTcyNTYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcApAQCAtNjcsNiArNjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgewogICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpLCBjYWxsaW5nIHBpZCA9ICVkLCBnZXRwaWQoKSA9ICVkXG4iLCBwaWQsIGdldHBpZCgpKTsKIAorICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6JXMoKSBjbGllbnQgaXMgTlVMTCEiLCBfX2Z1bmNfXyk7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE2MjMwNDUzIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICB9CisKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmNvdW50KHBpZCkgPT0gMCkgewogICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQocGlkKTsKQEAgLTEwMSw3ICsxMDcsNyBAQAogYWF1ZGlvX3Jlc3VsdF90CiBBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudFN0cmVhbShwaWRfdCBwaWQsIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBBTE9HVigicmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICBBTE9HVigicmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKVxuIiwgcGlkKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBtTm90aWZpY2F0aW9uQ2xpZW50c1twaWRdOwogICAgIGlmIChub3RpZmljYXRpb25DbGllbnQgPT0gMCkgewpAQCAtMTE4LDI3ICsxMjQsMjMgQEAKIGFhdWRpb19yZXN1bHRfdAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6dW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7Ci0gICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwpXG4iLCBwaWQpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICBhdXRvIGl0ID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuZmluZChwaWQpOwogICAgIGlmIChpdCAhPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5lbmQoKSkgewotICAgICAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApIGZvdW5kIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwKLSAgICAgICAgICAgICAgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICAgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKSBmb3VuZCBOb3RpZmljYXRpb25DbGllbnRcbiIsIHBpZCk7CiAgICAgICAgIGl0LT5zZWNvbmQtPnVucmVnaXN0ZXJDbGllbnRTdHJlYW0oc2VydmljZVN0cmVhbSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKSBtaXNzaW5nIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwKLSAgICAgICAgICAgICAgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKSBtaXNzaW5nIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwgcGlkKTsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQogICAgICAgICA6IG1Qcm9jZXNzSWQocGlkKSB7Ci0gICAgLy9BTE9HRCgiTm90aWZpY2F0aW9uQ2xpZW50KCVkKSBjcmVhdGVkICVwXG4iLCBwaWQsIHRoaXMpOwogfQogCiBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6On5Ob3RpZmljYXRpb25DbGllbnQoKSB7Ci0gICAgLy9BTE9HRCgifk5vdGlmaWNhdGlvbkNsaWVudCgpIGRlc3Ryb3llZCAlcFxuIiwgdGhpcyk7CiB9CiAKIGludDMyX3QgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpnZXRTdHJlYW1Db3VudCgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCmluZGV4IDA0ZmVlMTMuLmExZmMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50OwogICAgIG1FeGNsdXNpdmVTZWFyY2hDb3VudCsrOwotICAgIGZvciAoY29uc3QgYXV0byBlcCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBlcCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CiAgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgewogICAgICAgICAgICAgbUV4Y2x1c2l2ZUZvdW5kQ291bnQrKzsKICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbikgewogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQ7CiAgICAgbVNoYXJlZFNlYXJjaENvdW50Kys7Ci0gICAgZm9yIChjb25zdCBhdXRvIGVwICA6IG1TaGFyZWRTdHJlYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBlcCAgOiBtU2hhcmVkU3RyZWFtcykgewogICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgIG1TaGFyZWRGb3VuZENvdW50Kys7CiAgICAgICAgICAgICBlbmRwb2ludCA9IGVwOwpAQCAtMTQwLDkgKzE0MCw4IEBACiB9CiAKIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CiAgICAgICAgIHJldHVybiBvcGVuRXhjbHVzaXZlRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gb3BlblNoYXJlZEVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CkBAIC0xNzMsNyArMTcyLDcgQEAKIAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CisgICAgICAgICAgICBBTE9HVigib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCksIG9wZW4gZmFpbGVkIik7CiAgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMucHVzaF9iYWNrKGVuZHBvaW50TU1hcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IDE5M2JkZWUuLmJhMTc4NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC01Niw4ICs1Niw3IEBACiAgICAgICogQHJldHVybiBlbmRwb2ludCBvciBudWxsCiAgICAgICovCiAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCk7CiAKICAgICB2b2lkIGNsb3NlRW5kcG9pbnQoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBzZXJ2aWNlRW5kcG9pbnQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKaW5kZXggYjAzMTg4OC4uMWMwM2I3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcApAQCAtOTksNyArOTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHBhcnRJbmRleCsrOwogICAgIH0KLSAgICBmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKKyAgICBmaWZvLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0VORCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA2YTcyZTViLi44NmUyNmE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHNzdHJlYW0+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtNTgsNyArNTcsNyBAQAogCiAgICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgICAgICBzcyA8PCAiUGVybWlzc2lvbiBkZW5pYWw6IGNhbid0IGR1bXAgQUF1ZGlvU2VydmljZSBmcm9tIHBpZD0iCisgICAgICAgIHNzIDw8ICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBBQXVkaW9TZXJ2aWNlIGZyb20gcGlkPSIKICAgICAgICAgICAgICAgICA8PCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgPDwgIiwgdWlkPSIKICAgICAgICAgICAgICAgICA8PCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgPDwgIlxuIjsKICAgICAgICAgcmVzdWx0ID0gc3Muc3RyKCk7CkBAIC0xMTgsMjEgKzExNywyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCi0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgLy8gVHJ5IFNIQVJFRCBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQuCisgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwogICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOworICAgIH0gZWxzZSBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpIHsKKyAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0IG1vZGlmaWVkUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgRVhDTFVTSVZFIG1vZGUgd2l0aCBTSEFSRUQuCisgICAgICAgIG1vZGlmaWVkUmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3Blbihtb2RpZmllZFJlcXVlc3QpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCi0gICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKLSAgICAgICAgQUxPR0QoIm9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKKyAgICAgICAgQUxPR1YoIm9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKQEAgLTE0MSwyOCArMTQzLDYgQEAKICAgICB9CiB9CiAKLS8vIElmIGEgY2xvc2UgcmVxdWVzdCBpcyBwZW5kaW5nIHRoZW4gY2xvc2UgdGhlIHN0cmVhbQotYm9vbCBBQXVkaW9TZXJ2aWNlOjpyZWxlYXNlU3RyZWFtKGNvbnN0IHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiAmc2VydmljZVN0cmVhbSkgewotICAgIGJvb2wgY2xvc2VkID0gZmFsc2U7Ci0gICAgLy8gZGVjcmVtZW50QW5kUmVtb3ZlU3RyZWFtQnlIYW5kbGUoKSB1c2VzIGEgbG9jayBzbyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gc2ltdWx0YW5lb3VzIGNsb3NlcwotICAgIC8vIHRoZW4gb25seSBvbmUgd2lsbCBnZXQgdGhlIHBvaW50ZXIgYW5kIGRvIHRoZSBjbG9zZS4KLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gZm91bmRTdHJlYW0gPSBtU3RyZWFtVHJhY2tlci5kZWNyZW1lbnRBbmRSZW1vdmVTdHJlYW1CeUhhbmRsZSgKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0tPmdldEhhbmRsZSgpKTsKLSAgICBpZiAoZm91bmRTdHJlYW0uZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBmb3VuZFN0cmVhbS0+Y2xvc2UoKTsKLSAgICAgICAgcGlkX3QgcGlkID0gZm91bmRTdHJlYW0tPmdldE93bmVyUHJvY2Vzc0lkKCk7Ci0gICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkudW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIGZvdW5kU3RyZWFtKTsKLSAgICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGNsb3NlZDsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmNoZWNrRm9yUGVuZGluZ0Nsb3NlKAotICAgICAgICBjb25zdCBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gJnNlcnZpY2VTdHJlYW0sCi0gICAgICAgIGFhdWRpb19yZXN1bHRfdCBkZWZhdWx0UmVzdWx0KSB7Ci0gICAgcmV0dXJuIHJlbGVhc2VTdHJlYW0oc2VydmljZVN0cmVhbSkgPyBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSA6IGRlZmF1bHRSZXN1bHQ7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgLy8gQ2hlY2sgcGVybWlzc2lvbiBhbmQgb3duZXJzaGlwIGZpcnN0LgogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwpAQCAtMTcxLDE3ICsxNTEsMjAgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiAKKyAgICAvLyBUaGlzIGlzIHByb3RlY3RlZCBieSBhIGxvY2sgaW4gQUF1ZGlvQ2xpZW50VHJhY2tlci4KKyAgICAvLyBJdCBpcyBzYWZlIHRvIHVucmVnaXN0ZXIgdGhlIHNhbWUgc3RyZWFtIHR3aWNlLgogICAgIHBpZF90IHBpZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyUHJvY2Vzc0lkKCk7CiAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7CisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYnkgYSBsb2NrIGluIG1TdHJlYW1UcmFja2VyLgorICAgIC8vIEl0IGlzIHNhZmUgdG8gcmVtb3ZlIHRoZSBzYW1lIHN0cmVhbSB0d2ljZS4KKyAgICBtU3RyZWFtVHJhY2tlci5yZW1vdmVTdHJlYW1CeUhhbmRsZShzdHJlYW1IYW5kbGUpOwogCi0gICAgc2VydmljZVN0cmVhbS0+bWFya0Nsb3NlTmVlZGVkKCk7Ci0gICAgKHZvaWQpIHJlbGVhc2VTdHJlYW0oc2VydmljZVN0cmVhbSk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+Y2xvc2UoKTsKIH0KIAogc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1NlcnZpY2U6OmNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oCiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IG1TdHJlYW1UcmFja2VyLmdldFN0cmVhbUJ5SGFuZGxlQW5kSW5jcmVtZW50KAorICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gbVN0cmVhbVRyYWNrZXIuZ2V0U3RyZWFtQnlIYW5kbGUoCiAgICAgICAgICAgICBzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gT25seSBhbGxvdyBvd25lciBvciB0aGUgYWF1ZGlvIHNlcnZpY2UgdG8gYWNjZXNzIHRoZSBzdHJlYW0uCkBAIC0xOTQsOCArMTc3LDYgQEAKICAgICAgICAgaWYgKCFhbGxvd2VkKSB7CiAgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTogY2FsbGluZyB1aWQgJWQgY2Fubm90IGFjY2VzcyBzdHJlYW0gMHglMDhYIG93bmVkIGJ5ICVkIiwKICAgICAgICAgICAgICAgICAgIGNhbGxpbmdVc2VySWQsIHN0cmVhbUhhbmRsZSwgb3duZXJVc2VySWQpOwotICAgICAgICAgICAgLy8gV2UgaW5jcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudCBzbyB3ZSBtdXN0IGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIGNsb3NlZC4KLSAgICAgICAgICAgIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIEFBVURJT19PSyk7CiAgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTAsOTQgKzE5MSw2NCBAQAogICAgICAgICBBTE9HRSgiZ2V0U3RyZWFtRGVzY3JpcHRpb24oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLQotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5nZXREZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKLSAgICAvLyBwYXJjZWxhYmxlLmR1bXAoKTsKLSAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+Z2V0RGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgic3RhcnRTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLQotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOwotICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOworICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInBhdXNlU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnBhdXNlKCk7Ci0gICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CisgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPnBhdXNlKCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJzdG9wU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnN0b3AoKTsKLSAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RvcCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Zmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImZsdXNoU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPmZsdXNoKCk7Ci0gICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CisgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPmZsdXNoKCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBwZXJpb2ROYW5vc2Vjb25kcyAqLykgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICBpZiAoc2VydmljZVN0cmVhbS0+Z2V0UmVnaXN0ZXJlZFRocmVhZCgpICE9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpJTExFR0FMX1RIUkVBRF9JRCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB0aHJlYWQgYWxyZWFkeSByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHBpZF90IG93bmVyUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOyAvLyBUT0RPIHJldmlldwotICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKGNsaWVudFRocmVhZElkKTsKLSAgICAgICAgaW50IGVyciA9IGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eShvd25lclBpZCwgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9BVURJT19QUklPUklUWSwgdHJ1ZSAvKiBpc0ZvckFwcCAqLyk7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoJWQpIGZhaWxlZCwgZXJybm8gPSAlZCwgcHJpb3JpdHkgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCwgZXJybm8sIERFRkFVTFRfQVVESU9fUFJJT1JJVFkpOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOworICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkLCBERUZBVUxUX0FVRElPX1BSSU9SSVRZKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0tPmdldFJlZ2lzdGVyZWRUaHJlYWQoKSAhPSBjbGllbnRUaHJlYWRJZCkgewotICAgICAgICBBTE9HRSgiJXMoKSwgd3JvbmcgdGhyZWFkIiwgX19mdW5jX18pOwotICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKDApOwotICAgIH0KLSAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKKyAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0YXJ0Q2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCkBAIC0zMDUsMjIgKzI1NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydENsaWVudChjbGllbnQsIGNsaWVudEhhbmRsZSk7Ci0gICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CisgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPnN0YXJ0Q2xpZW50KGNsaWVudCwgY2xpZW50SGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0b3BDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wQ2xpZW50KHBvcnRIYW5kbGUpOwotICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOworICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5zdG9wQ2xpZW50KHBvcnRIYW5kbGUpOwogfQogCiAvLyBUaGlzIGlzIG9ubHkgY2FsbGVkIGludGVybmFsbHkgd2hlbiBBdWRpb0ZsaW5nZXIgd2FudHMgdG8gdGVhciBkb3duIGEgc3RyZWFtLgpAQCAtMzI4LDEyICsyNzcsMTMgQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpkaXNjb25uZWN0U3RyZWFtQnlQb3J0SGFuZGxlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIEFMT0dEKCIlcyglZCkgY2FsbGVkIiwgX19mdW5jX18sIHBvcnRIYW5kbGUpOwogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0KLSAgICAgICAgICAgIG1TdHJlYW1UcmFja2VyLmZpbmRTdHJlYW1CeVBvcnRIYW5kbGVBbmRJbmNyZW1lbnQocG9ydEhhbmRsZSk7CisgICAgICAgICAgICBtU3RyZWFtVHJhY2tlci5maW5kU3RyZWFtQnlQb3J0SGFuZGxlKHBvcnRIYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCksIGNvdWxkIG5vdCBmaW5kIHN0cmVhbSB3aXRoIHBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYnkgYSBsb2NrIGFuZCB3aWxsIGp1c3QgcmV0dXJuIGlmIGFscmVhZHkgc3RvcHBlZC4KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+c3RvcCgpOwogICAgIHNlcnZpY2VTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKLSAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCmluZGV4IGQyMWIxY2QuLjE4YmMzM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKQEAgLTk1LDEzICs5NSw2IEBACiAgICAgc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKICAgICAgICAgICAgIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CiAKLQotCi0gICAgYm9vbCByZWxlYXNlU3RyZWFtKGNvbnN0IHNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+ICZzZXJ2aWNlU3RyZWFtKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBjaGVja0ZvclBlbmRpbmdDbG9zZShjb25zdCBzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiAmc2VydmljZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGRlZmF1bHRSZXN1bHQpOwotCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgICAgICAgICBtQXVkaW9DbGllbnQ7CiAKICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVRyYWNrZXIgICAgIG1TdHJlYW1UcmFja2VyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggMDM0OTAzNC4uMWNmZmUwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zOCwxMCArMzgsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKQEAgLTU5LDYgKzU1LDcgQEAKICAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgU2FtcGxlIFJhdGU6ICAgICAgICAgICIgPDwgZ2V0U2FtcGxlUmF0ZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ2hhbm5lbCBDb3VudDogICAgICAgICIgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFVzYWdlOiAgICAgICAgICAgICAgICAiIDw8IGdldFVzYWdlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDb250ZW50VHlwZTogICAgICAgICAgIiA8PCBnZXRDb250ZW50VHlwZSgpIDw8ICJcbiI7CkBAIC02OCw3ICs2NSw3IEBACiAgICAgcmVzdWx0IDw8ICIgICAgQ29ubmVjdGVkOiAgICAgICAgICAgICIgPDwgbUNvbm5lY3RlZC5sb2FkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBSZWdpc3RlcmVkIFN0cmVhbXM6IiA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgcmVzdWx0IDw8IHN0cmVhbS0+ZHVtcCgpIDw8ICJcbiI7CiAgICAgfQogCkBAIC04MSw3ICs3OCw3IEBACiAvLyBAcmV0dXJuIHRydWUgaWYgc3RyZWFtIGZvdW5kCiBib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6aXNTdHJlYW1SZWdpc3RlcmVkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgIGlmIChzdHJlYW0tPmdldFBvcnRIYW5kbGUoKSA9PSBwb3J0SGFuZGxlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtOTAsMTQgKzg3LDI2IEBACiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IHN0cmVhbXNUb0Rpc2Nvbm5lY3Q7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgICAgICBtUmVnaXN0ZXJlZFN0cmVhbXMuc3dhcChzdHJlYW1zVG9EaXNjb25uZWN0KTsKKyAgICB9CisgICAgLy8gU3RvcCBhbmQgZGlzY29ubmVjdCBvdXRzaWRlIG1Mb2NrU3RyZWFtcyB0byBhdm9pZCByZXZlcnNlCisgICAgLy8gb3JkZXJpbmcgb2YgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om1Mb2NrIGFuZCBtTG9ja1N0cmVhbXMKICAgICBtQ29ubmVjdGVkLnN0b3JlKGZhbHNlKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgIEFMT0dEKCJkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSBzdG9wIGFuZCBkaXNjb25uZWN0ICVwIiwgc3RyZWFtLmdldCgpKTsKKyAgICAvLyBXZSBuZWVkIHRvIHN0b3AgYWxsIHRoZSBzdHJlYW1zIGJlZm9yZSB3ZSBkaXNjb25uZWN0IHRoZW0uCisgICAgLy8gT3RoZXJ3aXNlIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIGZpcnN0IGRpc2Nvbm5lY3RlZCBhcHAKKyAgICAvLyB0cmllcyB0byByZW9wZW4gYSBzdHJlYW0gYXMgTU1BUCBidXQgaXMgYmxvY2tlZCBieSB0aGUgc2Vjb25kIHN0cmVhbSwKKyAgICAvLyB3aGljaCBoYXNuJ3Qgc3RvcHBlZCB5ZXQuIFRoZW4gdGhlIGZpcnN0IGFwcCBlbmRzIHVwIHdpdGggYSBMZWdhY3kgc3RyZWFtLgorICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtc1RvRGlzY29ubmVjdCkgeworICAgICAgICBBTE9HRCgiJXMoKSAtIHN0b3AoKSwgcG9ydCA9ICVkIiwgX19mdW5jX18sIHN0cmVhbS0+Z2V0UG9ydEhhbmRsZSgpKTsKICAgICAgICAgc3RyZWFtLT5zdG9wKCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtc1RvRGlzY29ubmVjdCkgeworICAgICAgICBBTE9HRCgiJXMoKSAtIGRpc2Nvbm5lY3QoKSwgcG9ydCA9ICVkIiwgX19mdW5jX18sIHN0cmVhbS0+Z2V0UG9ydEhhbmRsZSgpKTsKICAgICAgICAgc3RyZWFtLT5kaXNjb25uZWN0KCk7CiAgICAgfQotICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5jbGVhcigpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpyZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT5zdHJlYW0pIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggMjUzZjI5MC4uYTJmNjZhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgLCBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIApAQCAtNjEsNyArNjEsNyBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKLSAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRDbGllbnQoJXAsIC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIiwgJmNsaWVudCk7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0Q2xpZW50KC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCkBAIC03Nyw2ICs3NywxMyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOwogCisgICAgLyoqCisgICAgICogU2V0IHRpbWUgdGhhdCB0aGUgYXNzb2NpYXRlZCBmcmFtZSB3YXMgcHJlc2VudGVkIHRvIHRoZSBoYXJkd2FyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcyByZWNlaXZlIHBvc2l0aW9uLCBpbnB1dCB2YWx1ZSBpcyBpZ25vcmVkCisgICAgICogQHBhcmFtIHRpbWVOYW5vcyByZWNlaXZlIHRpbWUsIGlucHV0IHZhbHVlIGlzIGlnbm9yZWQKKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgb3Igb3RoZXIgbmVnYXRpdmUgZXJyb3IKKyAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOwogCiAgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpIGNvbnN0IHsKQEAgLTExNCw3ICsxMjEsNyBAQAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CiAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0VuZHBvaW50VGltZXN0YW1wOwogCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgIG1NbWFwQ2xpZW50OyAgIC8vIHNldCBpbiBvcGVuLCB1c2VkIGluIG9wZW4gYW5kIHN0YXJ0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggZWZhYzc4OC4uMzdkMTA1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTgxLDkgKzgxLDEwIEBACiAgICAgICAgIHsgLy8gYnJhY2tldHMgYXJlIGZvciBsb2NrX2d1YXJkCiAKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpICYmICFjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKwogICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGUgYnVmZmVyIHRvbyBmdWxsIHRvIHdyaXRlIGEgYnVyc3Q/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKaW5kZXggZjllMjFmYi4uYjA1YmFhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAKQEAgLTc3LDkgKzc3LDYgQEAKICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOwogCi0gICAgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKLSAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKLQogICAgIGNvcHlGcm9tKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkpOwogCiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOwpAQCAtOTMsMTYgKzkwLDE2IEBACiAgICAgY29uc3QgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKQogICAgICAgICAgICAgPyBBQXVkaW9Db252ZXJ0X2lucHV0UHJlc2V0VG9BdWRpb1NvdXJjZShnZXRJbnB1dFByZXNldCgpKQogICAgICAgICAgICAgOiBBVURJT19TT1VSQ0VfREVGQVVMVDsKKyAgICBjb25zdCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZIHwKKyAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKIAogICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gewogICAgICAgICAgICAgLmNvbnRlbnRfdHlwZSA9IGNvbnRlbnRUeXBlLAogICAgICAgICAgICAgLnVzYWdlID0gdXNhZ2UsCiAgICAgICAgICAgICAuc291cmNlID0gc291cmNlLAotICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIC5mbGFncyA9IGZsYWdzLAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07Ci0gICAgQUxPR0QoIiVzKCVwKSBNTUFQIGF0dHJpYnV0ZXMudXNhZ2UgPSAlZCwgY29udGVudF90eXBlID0gJWQsIHNvdXJjZSA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMuc291cmNlKTsKIAogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKQEAgLTExMSwxMSArMTA4LDExIEBACiAgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogCiAgICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCB8fCBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBjb25maWcuZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZVJhdGUgPSBnZXRTYW1wbGVSYXRlKCk7CiAgICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CkBAIC0xNjMsMTIgKzE2MCwxNCBAQAogICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSByZXNvdXJjZSBpcyBidXN5IG9yIHRoZSBjb25maWcgZG9lcworICAgICAgICAvLyBub3QgbWF0Y2ggdGhlIGhhcmR3YXJlLgorICAgICAgICBBTE9HRCgiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAogICAgIGlmIChkZXZpY2VJZCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCkBAIC0xODksMzQgKzE4OCwyNyBAQAogICAgICAgICBtaW5TaXplRnJhbWVzID0gQUFVRElPX0JVRkZFUl9DQVBBQ0lUWV9NSU47CiAgICAgfQogICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOworICAgIGJvb2wgaXNCdWZmZXJTaGFyZWFibGUgPSBtTW1hcEJ1ZmZlcmluZm8uZmxhZ3MgJiBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIC0gY3JlYXRlTW1hcEJ1ZmZlcigpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCAlcyIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSByZXR1cm5lZCA9ICVkLCBidWZmZXJfc2l6ZSA9ICVkLCBidXJzdF9zaXplICVkIgorICAgICAgICBBTE9HRCgiJXMoKSBjcmVhdGVNbWFwQnVmZmVyKCkgYnVmZmVyX3NpemUgPSAlZCBmciwgYnVyc3Rfc2l6ZSAlZCBmciIKICAgICAgICAgICAgICAgICAgICAgICAiLCBTaGFyYWJsZSBGRDogJXMiLAotICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLAotICAgICAgICAgICAgICBhYnMobU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyksCisgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzLAogICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCi0gICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwID8gIlllcyIgOiAiTm8iKTsKKyAgICAgICAgICAgICAgaXNCdWZmZXJTaGFyZWFibGUgPyAiWWVzIiA6ICJObyIpOwogICAgIH0KIAogICAgIHNldEJ1ZmZlckNhcGFjaXR5KG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpOwotICAgIC8vIFRoZSBhdWRpbyBIQUwgaW5kaWNhdGVzIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGZkIGNhbiBiZSBzaGFyZWQgb3V0c2lkZSBvZiBhdWRpb3NlcnZlcgotICAgIC8vIGJ5IHJldHVybmluZyBhIG5lZ2F0aXZlIGJ1ZmZlciBzaXplCi0gICAgaWYgKGdldEJ1ZmZlckNhcGFjaXR5KCkgPCAwKSB7Ci0gICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBvciBzZXJ2aWNlLgotICAgICAgICBzZXRCdWZmZXJDYXBhY2l0eSgtZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIWlzQnVmZmVyU2hhcmVhYmxlKSB7CiAgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KICAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7CiAgICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CiAgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjM3LDI2ICsyMjksMTYgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOwotICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCkpOworICAgIHNldEZvcm1hdChjb25maWcuZm9ybWF0KTsKICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZy5zYW1wbGVfcmF0ZSk7CiAKLSAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgotICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKLSAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KLSAgICBkbyB7Ci0gICAgICAgIGlmIChidXJzdE1pY3JvcyA+IDApIHsgIC8vIHNraXAgZmlyc3QgbG9vcAotICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ICo9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgYnVyc3RNaWNyb3MgPSBtRnJhbWVzUGVyQnVyc3QgKiBzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICB9IHdoaWxlIChidXJzdE1pY3JvcyA8IGJ1cnN0TWluTWljcm9zKTsKLQotICAgIEFMT0dEKCIlcygpIG9yaWdpbmFsIGJ1cnN0ID0gJWQsIG1pbk1pY3JvcyA9ICVkLCB0byBidXJzdCA9ICVkXG4iLAotICAgICAgICAgIF9fZnVuY19fLCBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsIGJ1cnN0TWluTWljcm9zLCBtRnJhbWVzUGVyQnVyc3QpOwotCiAgICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCIKICAgICAgICAgICAiLCBkZXZpY2VJZCA9ICVkLCBjYXBhY2l0eSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKKyAgICBBTE9HRCgiJXMoKSBmb3JtYXQgPSAweCUwOHgsIGZyYW1lIHNpemUgPSAlZCwgYnVyc3Qgc2l6ZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCksIGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSwgbUZyYW1lc1BlckJ1cnN0KTsKKwogICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgpAQCAtMjY2LDcgKzI0OCw2IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpjbG9zZSgpIHsKICAgICBpZiAobU1tYXBTdHJlYW0gIT0gMCkgewotICAgICAgICBBTE9HRCgiJXMoKSBjbGVhcigpIGVuZHBvaW50IiwgX19mdW5jX18pOwogICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IGNsZWFyZWQgb3IgQ1RTIHdpbGwgZmFpbCBidXQgaXQgaXMgbm90IGNsZWFyIHdoeS4KICAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsKICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgYWJvdmUgY2xvc2UgaXMgYXN5bmNocm9ub3VzLiBBbiBhdHRlbXB0IHRvIG9wZW4gYSBuZXcgZGV2aWNlCkBAIC0yODgsNyArMjY5LDcgQEAKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRlbXBIYW5kbGUgIT0gbVBvcnRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSBwb3J0IGhhbmRsZSBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SGFuZGxlLCB0ZW1wSGFuZGxlKTsKLSAgICBBTE9HVigiJXMoJXApIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgc3RyZWFtLmdldCgpLCBtUG9ydEhhbmRsZSk7CisgICAgQUxPR1YoIiVzKCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBtUG9ydEhhbmRsZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzAzLDI2ICsyODQsMjAgQEAKICAgICBtRnJhbWVzVHJhbnNmZXJyZWQucm91bmRVcDY0KGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCiAgICAgLy8gVXNlIHRoZSBwb3J0IGhhbmRsZSB0aGF0IHdhcyBwcm92aWRlZCBieSBvcGVuTW1hcFN0cmVhbSgpLgotICAgIEFMT0dWKCIlcyglcCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBzdHJlYW0uZ2V0KCksIG1Qb3J0SGFuZGxlKTsKKyAgICBBTE9HVigiJXMoKSBtUG9ydEhhbmRsZSA9ICVkIiwgX19mdW5jX18sIG1Qb3J0SGFuZGxlKTsKICAgICByZXR1cm4gc3RvcENsaWVudChtUG9ydEhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgQUxPR0QoIiVzKCVwKHVpZD0lZCwgcGlkPSVkKSkiLCBfX2Z1bmNfXywgJmNsaWVudCwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCk7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBvcmlnaW5hbEhhbmRsZSA9ICAqY2xpZW50SGFuZGxlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5zdGFydChjbGllbnQsIGNsaWVudEhhbmRsZSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7Ci0gICAgQUxPR0QoIiVzKCkgLCBwb3J0SGFuZGxlICVkID0+ICVkLCByZXR1cm5zICVkIiwgX19mdW5jX18sIG9yaWdpbmFsSGFuZGxlLCAqY2xpZW50SGFuZGxlLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7Ci0gICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCksIGNhbGxlZCIsIF9fZnVuY19fLCBjbGllbnRIYW5kbGUpOwogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOwotICAgIEFMT0dEKCIlcyhwb3J0SGFuZGxlID0gJWQpLCByZXR1cm5zICVkIiwgX19mdW5jX18sIGNsaWVudEhhbmRsZSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zNzUsMTUgKzM1MCwxNSBAQAogICAgIC8vIFRPRE8gRG8gd2UgcmVhbGx5IG5lZWQgYSBkaWZmZXJlbnQgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWw/CiAgICAgLy8gV2UgZ2V0IGNhbGxlZCB3aXRoIGFuIGFycmF5IGZpbGxlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIQogICAgIGZsb2F0IHZvbHVtZSA9IHZhbHVlc1swXTsKLSAgICBBTE9HRCgiJXMoJXApIHZvbHVtZVswXSA9ICVmIiwgX19mdW5jX18sIHRoaXMsIHZvbHVtZSk7CisgICAgQUxPR0QoIiVzKCkgdm9sdW1lWzBdID0gJWYiLCBfX2Z1bmNfXywgdm9sdW1lKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgIGZvcihjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgIGZvcihjb25zdCBhdXRvJiBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgc3RyZWFtLT5vblZvbHVtZUNoYW5nZWQodm9sdW1lKTsKICAgICB9CiB9OwogCiB2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIHdpdGggZGV2ICVkLCBvbGQgPSAlZCIsIF9fZnVuY19fLCB0aGlzLCBkZXZpY2VJZCwgZ2V0RGV2aWNlSWQoKSk7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIHdpdGggZGV2ICVkLCBvbGQgPSAlZCIsIF9fZnVuY19fLCBkZXZpY2VJZCwgZ2V0RGV2aWNlSWQoKSk7CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAgJiYgZ2V0RGV2aWNlSWQoKSAhPSBkZXZpY2VJZCkgewogICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IGEyNzQ0NjYuLmJkYTRiOTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC00MywxNCArNDMsOSBAQAogCiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtU3RyZWFtSW50ZXJuYWxQbGF5KGF1ZGlvU2VydmljZSwgdHJ1ZSkgewotICAgIEFMT0dEKCIlcyglcCkgY3JlYXRlZCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAotQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKQEAgLTg0LDEwICs3OSwxNCBAQAogICAgICAgICAgICAgaW50NjRfdCBtbWFwRnJhbWVzV3JpdHRlbiA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1dyaXR0ZW4oKTsKIAogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewogICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzUmVhZCA9IDA7CiAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1VuZGVyZmxvdyA9IHRydWU7CiAKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkZWFkIHN0cmVhbQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYTBhMzgzYy4uOTgxZTQzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMzksNyArMzksNiBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCA2M2I5OTgzLi4wZDc5Y2RkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKICAgICBzZXRTZXNzaW9uSWQobVN0cmVhbUludGVybmFsLT5nZXRTZXNzaW9uSWQoKSk7CisgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOyAvLyBmb3JjZSBmb3IgbWl4ZXIKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTY1LDEzICsxNjYsMTEgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2hhcmVkU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgewotICAgIC8vIERvbid0IGxvY2sgaGVyZSBiZWNhdXNlIHRoZSBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMgYWxzbyB1c2VzIHRoZSBsb2NrLgotCiAgICAgLy8gSWdub3JlIHJlc3VsdC4KICAgICAodm9pZCkgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOwogCiAgICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAwKSB7IC8vIGF0b21pYwotICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOyAvLyB0aGUgc2hhcmluZyB0aHJlYWQgbG9ja3MgbUxvY2tTdHJlYW1zCiAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xODAsOCArMTc5LDggQEAKIC8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgcmVhbC10aW1lIHNlcnZpY2UgdGhyZWFkLCBlZy4gbWl4ZXIuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0VuZHBvaW50VGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0VuZHBvaW50VGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTE5Miw1ICsxOTEsMTMgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotICAgIHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldFRpbWVzdGFtcChDTE9DS19NT05PVE9OSUMsIHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtU3RyZWFtSW50ZXJuYWwtPmdldFRpbWVzdGFtcChDTE9DS19NT05PVE9OSUMsIHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUpIHsKKyAgICAgICAgLy8gZ2V0VGltZXN0YW1wKCkgY2FuIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSBpZiB0aGUgc3RyZWFtIGhhcworICAgICAgICAvLyBub3QgY29tcGxldGVseSBzdGFydGVkLiBUaGlzIGNhbiBjYXVzZSBhIHJhY2UgY29uZGl0aW9uIHRoYXQga2lsbHMgdGhlCisgICAgICAgIC8vIHRpbWVzdGFtcCBzZXJ2aWNlIHRocmVhZC4gIFNvIHdlIHJlZHVjZSB0aGUgZXJyb3IgdG8gYSBsZXNzIHNlcmlvdXMgb25lCisgICAgICAgIC8vIHRoYXQgYWxsb3dzIHRoZSB0aW1lc3RhbXAgdGhyZWFkIHRvIGNvbnRpbnVlLgorICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGQ2NzE3MTAuLmJmYzE3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC01Miw4ICs1Miw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKLQorICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLjg1ZDk0OTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtdXRleD4KIAorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKwogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCkBAIC00Myw3ICs0NSw3IEBACiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQogICAgICAgICA6IG1VcE1lc3NhZ2VRdWV1ZShudWxscHRyKQogICAgICAgICAsIG1UaW1lc3RhbXBUaHJlYWQoIkFBVGltZSIpCi0gICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCisgICAgICAgICwgbUF0b21pY1N0cmVhbVRpbWVzdGFtcCgpCiAgICAgICAgICwgbUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHsKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSAtMTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSAtMTsKQEAgLTUxLDcgKzUzLDYgQEAKIH0KIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6On5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIHsKLSAgICBBTE9HRCgifkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgZGVzdHJveWluZyAlcCIsIHRoaXMpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECkBAIC04MSw4ICs4Miw3IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtMTA5LDEwICsxMDksOCBAQAogICAgICAgICAvLyByZWZlcmVuY2VkIHVudGlsIHRoZSBzZXJ2aWNlIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGNsaWVudC4KICAgICAgICAgLy8gU28gb25seSBvbmUgdGhyZWFkIGNhbiBvcGVuIGEgc3RyZWFtLgogICAgICAgICBtU2VydmljZUVuZHBvaW50ID0gbUVuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQobUF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KTsKICAgICAgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzKCkgb3BlbkVuZHBvaW50KCkgZmFpbGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMTMwLDEyICsxMjgsMTcgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGNsb3NlX2woKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZV9sKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKLSAgICBzdG9wKCk7CisgICAgc3RvcF9sKCk7CiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7CkBAIC0xNDYsNyArMTQ5LDcgQEAKICAgICAgICAgZW5kcG9pbnRNYW5hZ2VyLmNsb3NlRW5kcG9pbnQoZW5kcG9pbnQpOwogCiAgICAgICAgIC8vIEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKCkgcHJldmVudHMgdHdvIHRocmVhZHMgZnJvbSBjbG9zaW5nIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQuY2xlYXIoKTsgLy8gZW5kcG9pbnQgd2lsbCBob2xkIHRoZSBwb2ludGVyIHVudGlsIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQuY2xlYXIoKTsgLy8gZW5kcG9pbnQgd2lsbCBob2xkIHRoZSBwb2ludGVyIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCiAgICAgfQogCiAgICAgewpAQCAtMTc2LDE5ICsxNzksMjcgQEAKICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydCgpIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChhdXRvIHN0YXRlID0gZ2V0U3RhdGUoKTsKKyAgICAgICAgc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQgfHwgc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgYWxyZWFkeSBDTE9TRUQsIHJldHVybnMgSU5WQUxJRF9TVEFURSwgaGFuZGxlID0gJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRIYW5kbGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CiAKICAgICBpZiAoaXNSdW5uaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKICAgICBzZXRGbG93aW5nKGZhbHNlKTsKKyAgICBzZXRTdXNwZW5kZWQoZmFsc2UpOwogCiAgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5jbGVhcigpOwogCiAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgcmVzdWx0ID0gc3RhcnREZXZpY2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RhcnREZXZpY2UoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgZ290byBlcnJvcjsKIAogICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBzdGFydC4KQEAgLTIwMSwyMyArMjEyLDI0IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6Ci0gICAgZGlzY29ubmVjdCgpOworICAgIGRpc2Nvbm5lY3RfbCgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBwYXVzZV9sKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2VfbCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGlmICghaXNSdW5uaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICAvLyBTZW5kIGl0IG5vdyBiZWNhdXNlIHRoZSB0aW1lc3RhbXAgZ2V0cyByb3VuZGVkIHVwIHdoZW4gc3RvcFN0cmVhbSgpIGlzIGNhbGxlZCBiZWxvdy4KLSAgICAvLyBBbHNvIHdlIGRvbid0IG5lZWQgdGhlIHRpbWVzdGFtcHMgd2hpbGUgd2UgYXJlIHNodXR0aW5nIGRvd24uCi0gICAgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKLQogICAgIHJlc3VsdCA9IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgIGRpc2Nvbm5lY3RfbCgpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMjI5LDcgKzI0MSw3IEBACiAgICAgcmVzdWx0ID0gZW5kcG9pbnQtPnN0b3BTdHJlYW0odGhpcywgbUNsaWVudEhhbmRsZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCwgJXMiLCBfX2Z1bmNfXywgcmVzdWx0LCBnZXRUeXBlVGV4dCgpKTsKLSAgICAgICAgZGlzY29ubmVjdCgpOyAvLyBUT0RPIHNob3VsZCB3ZSByZXR1cm4gb3IgcGF1c2UgQmFzZSBmaXJzdD8KKyAgICAgICAgZGlzY29ubmVjdF9sKCk7IC8vIFRPRE8gc2hvdWxkIHdlIHJldHVybiBvciBwYXVzZSBCYXNlIGZpcnN0PwogICAgIH0KIAogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEKTsKQEAgLTIzOCw2ICsyNTAsMTEgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc3RvcF9sKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RvcF9sKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaWYgKCFpc1J1bm5pbmcoKSkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMjQ1LDEyICsyNjIsMTQgQEAKIAogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogCi0gICAgLy8gU2VuZCBpdCBub3cgYmVjYXVzZSB0aGUgdGltZXN0YW1wIGdldHMgcm91bmRlZCB1cCB3aGVuIHN0b3BTdHJlYW0oKSBpcyBjYWxsZWQgYmVsb3cuCi0gICAgLy8gQWxzbyB3ZSBkb24ndCBuZWVkIHRoZSB0aW1lc3RhbXBzIHdoaWxlIHdlIGFyZSBzaHV0dGluZyBkb3duLgotICAgIHNlbmRDdXJyZW50VGltZXN0YW1wKCk7IC8vIHdhcm5pbmcgLSB0aGlzIGNhbGxzIGEgdmlydHVhbCBmdW5jdGlvbgorICAgIC8vIFRlbXBvcmFyaWx5IHVubG9jayBiZWNhdXNlIHdlIGFyZSBqb2luaW5nIHRoZSB0aW1lc3RhbXAgdGhyZWFkIGFuZCBpdCBtYXkgdHJ5CisgICAgLy8gdG8gYWNxdWlyZSBtTG9jay4KKyAgICBtTG9jay51bmxvY2soKTsKICAgICByZXN1bHQgPSBzdG9wVGltZXN0YW1wVGhyZWFkKCk7CisgICAgbUxvY2subG9jaygpOworCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICBkaXNjb25uZWN0X2woKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTI2Myw3ICsyODIsNyBAQAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIHN0b3BTdHJlYW0gcmV0dXJuZWQgJWQsICVzIiwgX19mdW5jX18sIHJlc3VsdCwgZ2V0VHlwZVRleHQoKSk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgZGlzY29ubmVjdF9sKCk7CiAgICAgICAgIC8vIFRPRE8gd2hhdCB0byBkbyB3aXRoIHJlc3VsdCBoZXJlPwogICAgIH0KIApAQCAtMjgyLDYgKzMwMSw3IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9faXNGbHVzaEFsbG93ZWQoZ2V0U3RhdGUoKSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTI5NCwxNiArMzE0LDIxIEBACiB9CiAKIC8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewogICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgVGltZXN0YW1wU2NoZWR1bGVyIHRpbWVzdGFtcFNjaGVkdWxlcjsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOwogICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBpbnQ2NF90IG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICB3aGlsZShtVGhyZWFkRW5hYmxlZC5sb2FkKCkpIHsKKyAgICAgICAgbG9vcENvdW50Kys7CiAgICAgICAgIGlmIChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpID49IG5leHRUaW1lKSB7Ci0gICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHRpbWVzdGFtcCB0aHJlYWQgZ290IHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CkBAIC0zMTMsMTYgKzMzOCw3MCBAQAogICAgICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBVbnRpbE5hbm9UaW1lKG5leHRUaW1lKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CisgICAgLy8gVGhpcyB3YXMgbW92ZWQgZnJvbSB0aGUgY2FsbHMgaW4gc3RvcF9sKCkgYW5kIHBhdXNlX2woKSwgd2hpY2ggY291bGQgY2F1c2UgYSBkZWFkbG9jaworICAgIC8vIGlmIGl0IHJlc3VsdGVkIGluIGEgY2FsbCB0byBkaXNjb25uZWN0LgorICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICh2b2lkKSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOworICAgIH0KKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpLCBsb29wQ291bnQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGRpc2Nvbm5lY3RfbCgpOworfQorCit2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0X2woKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQKKyAgICAgICAgJiYgZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewogICAgICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICB9CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChwaWRfdCBjbGllbnRUaHJlYWRJZCwKKyAgICAgICAgaW50IHByaW9yaXR5KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGdldFJlZ2lzdGVyZWRUaHJlYWQoKSAhPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6SUxMRUdBTF9USFJFQURfSUQpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgdGhyZWFkIGFscmVhZHkgcmVnaXN0ZXJlZCIpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKKyAgICAgICAgc2V0UmVnaXN0ZXJlZFRocmVhZChjbGllbnRUaHJlYWRJZCk7CisgICAgICAgIGludCBlcnIgPSBhbmRyb2lkOjpyZXF1ZXN0UHJpb3JpdHkob3duZXJQaWQsIGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LCB0cnVlIC8qIGlzRm9yQXBwICovKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCglZCkgZmFpbGVkLCBlcnJubyA9ICVkLCBwcmlvcml0eSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZElkLCBlcnJubywgcHJpb3JpdHkpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGdldFJlZ2lzdGVyZWRUaHJlYWQoKSAhPSBjbGllbnRUaHJlYWRJZCkgeworICAgICAgICBBTE9HRSgiJXMoKSwgd3JvbmcgdGhyZWFkIiwgX19mdW5jX18pOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRSZWdpc3RlcmVkVGhyZWFkKDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICAvLyBDTE9TRUQgaXMgYSBmaW5hbCBzdGF0ZS4KKyAgICBpZiAobVN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXX0lGKG1TdGF0ZSAhPSBzdGF0ZSwgIiVzKCVkKSB3aGVuIGFscmVhZHkgQ0xPU0VEIiwgX19mdW5jX18sIHN0YXRlKTsKKyAgICB9Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZGF0YURvdWJsZSkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CkBAIC0zNDEsNiArNDIwLDIwIEBACiAgICAgcmV0dXJuIHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOwogfQogCitib29sIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjppc1VwTWVzc2FnZVF1ZXVlQnVzeSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKKyAgICBpZiAobVVwTWVzc2FnZVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gbVVwTWVzc2FnZVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCkKKyAgICAgICAgLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgaW50MzJfdCBjYXBhY2l0eSA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpCisgICAgICAgIC0+Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgIC8vIElzIGl0IGhhbGYgZnVsbCBvciBtb3JlCisgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZSA+PSAoY2FwYWNpdHkgLyAyKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CkBAIC0zNDksNyArNDQyLDkgQEAKICAgICB9CiAgICAgaW50MzJfdCBjb3VudCA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpLT53cml0ZShjb21tYW5kLCAxKTsKICAgICBpZiAoY291bnQgIT0gMSkgewotICAgICAgICBBTE9HRSgiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/ICVzIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgICAgICBBTE9HVygiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBzdG9wPyBTdXNwZW5kaW5nIHN0cmVhbS4gd2hhdCA9ICV1LCAlcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjb21tYW5kLT53aGF0LCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgc2V0U3VzcGVuZGVkKHRydWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0zNjIsNiArNDU3LDEzIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZEN1cnJlbnRUaW1lc3RhbXAoKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKKyAgICAvLyBJdCBpcyBub3Qgd29ydGggZmlsbGluZyB1cCB0aGUgcXVldWUgd2l0aCB0aW1lc3RhbXBzLgorICAgIC8vIFRoYXQgY2FuIGNhdXNlIHRoZSBzdHJlYW0gdG8gZ2V0IHN1c3BlbmRlZC4KKyAgICAvLyBTbyBqdXN0IGRyb3AgdGhlIHRpbWVzdGFtcCBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBmdWxsLgorICAgIGlmIChpc1VwTWVzc2FnZVF1ZXVlQnVzeSgpKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfQorCiAgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKQEAgLTM5Nyw2ICs0OTksNyBAQAogICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgogICovCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmdldERlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggYTE4MTVkMC4uMzJkYjcyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgpAQCAtODIsNyArODIsNyBAQAogICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KICAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKTsKIAogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCiAgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpOworICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpOwogCiAgICAgLyoqCiAgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIGFmdGVyIHRoZSBjdXJyZW50bHkgcXVldWVkIGRhdGEgaGFzIGZpbmlzaGVkIHBsYXlpbmcuCkBAIC05OSwxNyArOTksMTQgQEAKICAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgICoKICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFRpbWVzdGFtcFRocmVhZCgpOworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCk7CiAKICAgICAvKioKICAgICAgKiBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCiAgICAgICoKICAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKTsKLQorICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaCgpOwogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKQEAgLTEyMiwyOSArMTE5LDE5IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQsIGludCBwcmlvcml0eSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkKTsKKwogICAgIGJvb2wgaXNSdW5uaW5nKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDsKICAgICB9CiAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50IHdpdGggYW4gaW50NjRfdCBkYXRhIHZhbHVlLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kU2VydmljZUV2ZW50KGFhdWRpb19zZXJ2aWNlX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkYXRhTG9uZyA9IDApOwotICAgIC8qKgotICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQgd2l0aCBhbiBkb3VibGUgZGF0YSB2YWx1ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZGF0YURvdWJsZSk7Ci0KICAgICAvKioKICAgICAgKiBGaWxsIGluIGEgcGFyY2VsYWJsZSBkZXNjcmlwdGlvbiBvZiBzdHJlYW0uCiAgICAgICovCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldERlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKIAotCiAgICAgdm9pZCBzZXRSZWdpc3RlcmVkVGhyZWFkKHBpZF90IHBpZCkgewogICAgICAgICBtUmVnaXN0ZXJlZENsaWVudFRocmVhZCA9IHBpZDsKICAgICB9CkBAIC0yMDQsNiArMTkxLDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IGZhbHNlIHdoZW4gdGhlIHN0cmVhbSBzaG91bGQgbm90IGxvbmdlciBiZSBwcm9jZXNzZWQuCisgICAgICogVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgbWVzc2FnZSBxdWV1ZSBvdmVyZmxvdy4KKyAgICAgKiBTZXQgdHJ1ZSB3aGVuIHN0cmVhbSBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkgeworICAgICAgICBtU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIH0KKworICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3VzcGVuZGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMgdG8gdGhlIHN0cmVhbSBieSBBQXVkaW9TZXJ2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgpAQCAtMjQ0LDkgKzI0NSwxMyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOwogCi0gICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKLSAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgfQorICAgIC8vIFRoZXNlIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1Mb2NrCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2VfbCgpOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlX2woKTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wX2woKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpOworCisgICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgLyoqCiAgICAgICogRGV2aWNlIHNwZWNpZmljIHN0YXJ0dXAuCkBAIC0yNzgsNiArMjgzLDEwIEBACiAgICAgU2hhcmVkUmluZ0J1ZmZlciogICAgICAgbVVwTWVzc2FnZVF1ZXVlOwogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1VcE1lc3NhZ2VRdWV1ZUxvY2s7CiAKKyAgICAvLyBMb2NraW5nIG9yZGVyIGlzIGltcG9ydGFudC4KKyAgICAvLyBBbHdheXMgYWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbUxvY2s7IC8vIFByZXZlbnQgc3RhcnQvc3RvcC9jbG9zZSBldGNldGVyYSBmcm9tIGNvbGxpZGluZworCiAgICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbVRpbWVzdGFtcFRocmVhZDsKICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgb25lIHRocmVhZCB0byB0ZWxsIGFub3RoZXIgdGhyZWFkIHRvIGV4aXQuIFNvIGl0IG11c3QgYmUgYXRvbWljLgogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1UaHJlYWRFbmFibGVke2ZhbHNlfTsKQEAgLTI4Nyw3ICsyOTYsNyBAQAogICAgIC8vIFRPRE8gcmVuYW1lIG1DbGllbnRIYW5kbGUgdG8gbVBvcnRIYW5kbGUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggQXVkaW9GbGluZ2VyLgogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNTdHJlYW1UaW1lc3RhbXA7CiAKICAgICBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZtQXVkaW9TZXJ2aWNlOwogCkBAIC0yOTgsMTMgKzMwNywzNyBAQAogICAgIGFuZHJvaWQ6OndwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gbVNlcnZpY2VFbmRwb2ludFdlYWs7CiAKIHByaXZhdGU6CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFRpbWVzdGFtcFRocmVhZCgpOworCisgICAgLyoqCisgICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudCB3aXRoIGFuIGludDY0X3QgZGF0YSB2YWx1ZS4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGF0YUxvbmcgPSAwKTsKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50IHdpdGggYSBkb3VibGUgZGF0YSB2YWx1ZS4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkYXRhRG91YmxlKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBmdWxsLgorICAgICAqLworICAgIGJvb2wgaXNVcE1lc3NhZ2VRdWV1ZUJ1c3koKTsKKwogICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgIG1IYW5kbGUgPSAtMTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRmxvd2luZyA9IGZhbHNlOwogCiAgICAgLy8gVGhpcyBpcyBtb2RpZmllZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUNhbGxpbmdDb3VudCA9IDA7CiAKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgc3RyZWFtIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBieSBhIGJpbmRlciBjYWxsIG5lZWRzIHRvIGNsb3NlZC4KICAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtQ2xvc2VOZWVkZWR7ZmFsc2V9OworCisgICAgLy8gVGhpcyBpbmRpY2F0ZSB0aGF0IGEgcnVubmluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwKKyAgICAvLyBmb3IgZXhhbXBsZSBhIGZ1bGwgbWVzc2FnZSBxdWV1ZS4gTm90ZSB0aGF0IHRoaXMgYXRvbWljIGlzIHVucmVsYXRlZCB0byBtQ2xvc2VOZWVkZWQuCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVN1c3BlbmRlZHtmYWxzZX07CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCBjODQ1MzA5Li44ZTQyMTdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC00OSwyMyArNDksMTggQEAKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkgewogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmNsb3NlKCkgewotICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotCi0gICAgc3RvcCgpOwotCi0gICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpOwotfQotCiAvLyBPcGVuIHN0cmVhbSBvbiBIQUwgYW5kIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGJhY2sgdG8gdGhlIGNsaWVudC4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtOTcsMTEgKzkyLDExIEBACiB9CiAKIC8vIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGggbG9zcyBvZiBkYXRhLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpwYXVzZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6cGF1c2VfbCgpIHsKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlX2woKTsKICAgICAvLyBUT0RPIHB1dCBiZWZvcmUgYmFzZTo6cGF1c2UoKT8KICAgICBpZiAoIW1JblNlcnZpY2UpIHsKICAgICAgICAgKHZvaWQpIHN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7CkBAIC0xMDksMTEgKzEwNCwxMSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RvcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RvcF9sKCkgewogICAgIGlmICghaXNSdW5uaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wX2woKTsKICAgICAvLyBUT0RPIHB1dCBiZWZvcmUgYmFzZTo6c3RvcCgpPwogICAgIGlmICghbUluU2VydmljZSkgewogICAgICAgICAodm9pZCkgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKQEAgLTE1Nyw3ICsxNTIsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRGcmVlUnVubmluZ1Bvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoKnBvc2l0aW9uRnJhbWVzLCAqdGltZU5hbm9zKTsKLSAgICAgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgICAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CkBAIC0xNzksOCArMTc0LDggQEAKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCkgKyBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKaW5kZXggMTUwOWY3ZC4uMTQxMTc0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCkBAIC01MiwyNiArNTIsMjQgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIk1NQVAiOyB9CisKK3Byb3RlY3RlZDoKKwogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KICAgICAgKgogICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KICAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZV9sKCkgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpIG92ZXJyaWRlOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKLQotICAgIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIk1NQVAiOyB9Ci0KLXByb3RlY3RlZDoKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcF9sKCkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDA1YzU3MzUuLjAxYjFjMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgTUFYX0ZSQU1FU19QRVJfQlVGRkVSKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQotICAgIEFMT0dEKCJjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIHJlcXVlc3RlZCAlZCBmcmFtZXMsIGFjdHVhbCA9ICVkIiwKKyAgICBBTE9HVigiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSByZXF1ZXN0ZWQgJWQgZnJhbWVzLCBhY3R1YWwgPSAlZCIsCiAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIHJldHVybiBjYXBhY2l0eUluRnJhbWVzOwogfQpAQCAtMTIwLDkgKzEyMCwxNCBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM2LDEwICsxNDEsMTAgQEAKIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwogICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7Ci0gICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRCgiJXMoKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgYXVkaW9fZm9ybWF0X3QgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTg1LDkgKzE5MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKLQogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjAxLDkgKzIwMyw4IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Y2xvc2UoKSAgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKTsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjbG9zZV9sKCkgIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlX2woKTsKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CkBAIC0yMjIsNyArMjIzLDcgQEAKIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKICAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIH0KICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUuCkBAIC0yMzMsMTUgKzIzNCwxNSBAQAogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om1hcmtUcmFuc2ZlclRpbWUoVGltZXN0YW1wICZ0aW1lc3RhbXApIHsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogfQogCiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgbWl4ZXIgb3IgZGlzdHJpYnV0b3IuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewogICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMjU3LDcgKzI1OCw3IEBACiAgICAgaW50NjRfdCBwb3NpdGlvbiA9IDA7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnRXZWFrLnByb21vdGUoKTsKICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCmluZGV4IDYxNzY5YjUuLmFiY2I3ODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKQEAgLTUyLDcgKzUyLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2VfbCgpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtdXN0IGJlIGxvY2tlZCB3aGVuIGNhbGxpbmcgZ2V0QXVkaW9EYXRhRmlmb0J1ZmZlcl9sKCkgYW5kIHdoaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCmluZGV4IDMzMjgxNTkuLjhlNjZiOTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCkBAIC0zMCwzMiArMzAsMjAgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmRlY3JlbWVudEFuZFJlbW92ZVN0cmVhbUJ5SGFuZGxlKAoraW50MzJfdCBBQXVkaW9TdHJlYW1UcmFja2VyOjpyZW1vdmVTdHJlYW1CeUhhbmRsZSgKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKLSAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5maW5kKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKLSAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHRlbXBTdHJlYW0gPSBpdC0+c2Vjb25kOwotICAgICAgICAvLyBEb2VzIHRoZSBjYWxsZXIgbmVlZCB0byBjbG9zZSB0aGUgc3RyZWFtPwotICAgICAgICAvLyBUaGUgcmVmZXJlbmNlIGNvdW50IHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZS4KLSAgICAgICAgLy8gQnV0IGl0IGlzIHNhZmVyIHRvIGNoZWNrIGZvciA8PSAwIHRoYW4gPT0gMC4KLSAgICAgICAgaWYgKCh0ZW1wU3RyZWFtLT5kZWNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpIDw9IDApICYmIHRlbXBTdHJlYW0tPmlzQ2xvc2VOZWVkZWQoKSkgewotICAgICAgICAgICAgc2VydmljZVN0cmVhbSA9IHRlbXBTdHJlYW07IC8vIE9ubHkgcmV0dXJuIHN0cmVhbSBpZiByZWFkeSB0byBiZSBjbG9zZWQuCi0gICAgICAgICAgICBtU3RyZWFtc0J5SGFuZGxlLmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKKyAgICBhdXRvIGNvdW50ID0gbVN0cmVhbXNCeUhhbmRsZS5lcmFzZShzdHJlYW1IYW5kbGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pihjb3VudCk7CiB9CiAKLXNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpnZXRTdHJlYW1CeUhhbmRsZUFuZEluY3JlbWVudCgKK3NwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TdHJlYW1UcmFja2VyOjpnZXRTdHJlYW1CeUhhbmRsZSgKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IYW5kbGVMb2NrKTsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbTsKICAgICBhdXRvIGl0ID0gbVN0cmVhbXNCeUhhbmRsZS5maW5kKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHNlcnZpY2VTdHJlYW0tPmluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCk7CiAgICAgfQogICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOwogfQpAQCAtNjMsNyArNTEsNyBAQAogLy8gVGhlIHBvcnQgaGFuZGxlIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIHN0cmVhbSBpcyBzdGFydGVkLgogLy8gU28gd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSBzdHJlYW1zLgogLy8gTHVja2lseSB0aGlzIHJhcmVseSBoYXBwZW5zLgotc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1N0cmVhbVRyYWNrZXI6OmZpbmRTdHJlYW1CeVBvcnRIYW5kbGVBbmRJbmNyZW1lbnQoCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6ZmluZFN0cmVhbUJ5UG9ydEhhbmRsZSgKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhhbmRsZUxvY2spOwogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtOwpAQCAtNzIsNyArNjAsNiBAQAogICAgICAgICBhdXRvIGNhbmRpZGF0ZSA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChjYW5kaWRhdGUtPmdldFBvcnRIYW5kbGUoKSA9PSBwb3J0SGFuZGxlKSB7CiAgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+aW5jcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGl0Kys7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKaW5kZXggNTdlYzQyNi4uZDEzMDFhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaApAQCAtMzIsMjUgKzMyLDIwIEBACiAKIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICogRGVjcmVtZW50IGl0cyByZWZlcmVuY2UgY291bnRlci4gSWYgemVybyBhbmQgdGhlIHN0cmVhbSBuZWVkcwotICAgICAqIHRvIGJlIGNsb3NlZCB0aGVuIHJlbW92ZSB0aGUgc3RyZWFtIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJlYW0uCi0gICAgICogT3RoZXJ3aXNlIHJldHVybiBudWxsIGlmIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgY2xvc2VkLgorICAgICAqIFJlbW92ZSBhbnkgc3RyZWFtcyB3aXRoIHRoZSBtYXRjaGluZyBoYW5kbGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlCi0gICAgICogQHJldHVybiBzdHJvbmcgcG9pbnRlciB0byB0aGUgc3RyZWFtIGlmIGl0IG5lZWRzIHRvIGJlIGNsb3NlZCwgb3IgbnVsbHB0cgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHN0cmVhbXMgcmVtb3ZlZAogICAgICAqLwotICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBkZWNyZW1lbnRBbmRSZW1vdmVTdHJlYW1CeUhhbmRsZSgKLSAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGludDMyX3QgcmVtb3ZlU3RyZWFtQnlIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CiAKICAgICAvKioKICAgICAgKiBMb29rIHVwIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBoYW5kbGUuCi0gICAgICogSW5jcmVtZW50IGl0cyBzZXJ2aWNlIHJlZmVyZW5jZSBjb3VudCBpZiBmb3VuZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKICAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQsIG9yIG51bGxwdHIKICAgICAgKi8KLSAgICBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBnZXRTdHJlYW1CeUhhbmRsZUFuZEluY3JlbWVudCgKKyAgICBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBnZXRTdHJlYW1CeUhhbmRsZSgKICAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOwogCiAgICAgLyoqCkBAIC02MCw3ICs1NSw3IEBACiAgICAgICogQHBhcmFtIHBvcnRIYW5kbGUKICAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQsIG9yIG51bGxwdHIKICAgICAgKi8KLSAgICBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBmaW5kU3RyZWFtQnlQb3J0SGFuZGxlQW5kSW5jcmVtZW50KAorICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGZpbmRTdHJlYW1CeVBvcnRIYW5kbGUoCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRIYW5kbGUpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1ODRiMmVmLi4zZDVmMTQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTUzLDcgKzUzLDYgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjAyZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAiLAorICAgICAgICAiU291bmRUcmlnZ2VySGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlic291bmR0cmlnZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzY2NmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotaWZlcSAoJChTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRSksIDEpCi0gICAgaWZuZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLCB0cnVlKQotICAgICAgICAkKGVycm9yIFJlcXVpcmVzIGJ1aWxkaW5nIHdpdGggVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUw9dHJ1ZSkKLSAgICBlbmRpZgotICAgIExPQ0FMX0NGTEFHUyArPSAtRFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi1lbmRpZgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJzb3VuZHRyaWdnZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eQotCi0KLWlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLHRydWUpCi0jIGxpYmhhcmR3YXJlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsbWVtb3J5IFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgbGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAKLWVuZGlmCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2Vyc2VydmljZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggYWRmMjUyZS4uNjhkNTRjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMTY4LDE4ICsxNjgsMjMgQEAKICAgICBpbnQgcmV0OwogICAgIFNvdW5kTW9kZWxIYW5kbGUgaGFsSGFuZGxlOwogICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKICAgICBpZiAoc291bmRfbW9kZWwtPnR5cGUgPT0gU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0UpIHsKLSAgICAgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKLSAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKLSAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRQaHJhc2VTb3VuZE1vZGVsKAotICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgeworICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+bG9hZFBocmFzZVNvdW5kTW9kZWxfMl8xKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMTkzLDE4ICsxOTgsMzIgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7Ci0gICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKKyAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOwogICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5sb2FkU291bmRNb2RlbF8yXzEoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMjE3LDYgKzIzNiwxNSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yODIsMTYgKzMxMCwyMCBAQAogICAgIG1vZGVsLT5tUmVjb2duaXRpb25Db29raWUgPSBjb29raWU7CiAKICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CiAgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CiAKLSAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7Ci0gICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgIHsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24obW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5zdGFydFJlY29nbml0aW9uXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOwogICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTMwMSw2ICszMzMsMTMgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgewpAQCAtMzU2LDYgKzM5NSwzOCBAQAogICAgIHJldHVybiBoaWRsUmV0dXJuOwogfQogCitpbnQgU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXIgPSBnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNvdW5kdHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBtb2RlbCBub3QgZm91bmQgZm9yIGhhbmRsZSAldSIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmdldE1vZGVsU3RhdGUobW9kZWwtPm1IYWxIYW5kbGUpOworICAgIH0KKyAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kVHJpZ2dlckhhbEhpZGwoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKICAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtTmV4dFVuaXF1ZUlkKDEpCiB7CkBAIC0zODgsNiArNDU5LDEyIEBACiAgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKIH0KIAorc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzIgPSBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8yLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzIpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBiNDRhZTAuLmZiOWUzOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjIvSVNvdW5kVHJpZ2dlckh3Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAKQEAgLTQ2LDYgKzQ3LDggQEAKIHVzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sgPQogICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzE6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyBWMl8yX0lTb3VuZFRyaWdnZXJIdyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMjo6SVNvdW5kVHJpZ2dlckh3OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrCkBAIC05Miw2ICs5NSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAvLyBJU291bmRUcmlnZ2VySHdDYWxsYmFjawogICAgICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZWNvZ25pdGlvbkNhbGxiYWNrKAogICAgICAgICAgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpOwpAQCAtMTgyLDYgKzE5Myw3IEBACiAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogICAgICAgICBzcDxJU291bmRUcmlnZ2VySHc+IGdldFNlcnZpY2UoKTsKICAgICAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKKyAgICAgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gcmVtb3ZlTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCmluZGV4IGMwODMxOTUuLjAxODNlY2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCkgPSAwOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICAgICAgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjc4ODE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsTGVnYWN5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotewotICAgIHJldHVybiBuZXcgU291bmRUcmlnZ2VySGFsTGVnYWN5KG1vZHVsZU5hbWUpOwotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6OlNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1Id0RldmljZShOVUxMKQotewotfQotCi12b2lkIFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6b25GaXJzdFJlZigpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAobU1vZHVsZU5hbWUgPT0gTlVMTCkgewotICAgICAgICBtTW9kdWxlTmFtZSA9ICJwcmltYXJ5IjsKLSAgICB9Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCAmbW9kKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCBzb3VuZCB0cmlnZ2VyIG1vZHVsZSAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByYyA9IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX29wZW4obW9kLCAmbUh3RGV2aWNlKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA8IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCB8fAotICAgICAgICAgICAgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKLSAgICAgICAgQUxPR0UoIndyb25nIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6On5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKQotewotICAgIGlmIChtSHdEZXZpY2UgIT0gTlVMTCkgewotICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6Z2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6bG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgc291bmRfbW9kZWwsIGNhbGxiYWNrLCBjb29raWUsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdGFydF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSwgY29uZmlnLCBjYWxsYmFjaywgY29va2llKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wQWxsUmVjb2duaXRpb25zKCkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSAmJgotICAgICBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucykgewotICAgICAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMobUh3RGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ODhkZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlCi0KLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+U291bmRUcmlnZ2VySGFsTGVnYWN5KCk7Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBMb2FkIGEgc291bmQgbW9kZWwuIE9uY2UgbG9hZGVkLCByZWNvZ25pdGlvbiBvZiB0aGlzIG1vZGVsIGNhbiBiZSBzdGFydGVkIGFuZCBzdG9wcGVkLgotICAgICAgICAgKiBPbmx5IG9uZSBhY3RpdmUgcmVjb2duaXRpb24gcGVyIG1vZGVsIGF0IGEgdGltZS4gVGhlIFNvdW5kVHJpZ2dlciBzZXJ2aWNlIHdpbGwgaGFuZGxlCi0gICAgICAgICAqIGNvbmN1cnJlbnQgcmVjb2duaXRpb24gcmVxdWVzdHMgYnkgZGlmZmVyZW50IHVzZXJzL2FwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSB1bmlxdWUgaGFuZGxlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zICh1bmxvYWRfc291bmRfbW9kZWwoKSwKLSAgICAgICAgICogc3RhcnRfcmVjb2duaXRpb24oKSwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVW5sb2FkIGEgc291bmQgbW9kZWwuIEEgc291bmQgbW9kZWwgY2FuIGJlIHVubG9hZGVkIHRvIG1ha2Ugcm9vbSBmb3IgYSBuZXcgb25lIHRvIG92ZXJjb21lCi0gICAgICAgICAqIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0YXJ0IHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuIE9ubHkgb25lIHJlY29nbml0aW9uIGFjdGl2ZSBhdCBhIHRpbWUgcGVyIG1vZGVsLgotICAgICAgICAgKiBPbmNlIHJlY29nbml0aW9uIHN1Y2NlZWRzIG9mIGZhaWxzLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLgotICAgICAgICAgKiBUT0RPOiBncm91cCByZWNvZ25pdGlvbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW50byBvbmUgc3RydWN0IGFuZCBhZGQga2V5IHBocmFzZSBvcHRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBzdG9wcGVkIHZpYSB0aGlzIG1ldGhvZC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYWxsIG1vZGVscy4KLSAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xIG9yIGFib3ZlLgotICAgICAgICAgKiBJZiBubyBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCwgc3RvcF9yZWNvZ25pdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBydW5uaW5nIG1vZGVsLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKLQotICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLQotcHJpdmF0ZToKLQotICAgICAgICBmcmllbmQgY2xhc3MgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOwotCi0gICAgICAgIGV4cGxpY2l0IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lID0gTlVMTCk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbU1vZHVsZU5hbWU7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogICAgICAgIG1Id0RldmljZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCBhN2Q2ZTgzLi4zNzdkMzBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMjIsMjUgKzIyLDIyIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgotI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAotI2lmZGVmIFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi0jZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInN0dWIiCi0jZWxzZQogI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJwcmltYXJ5IgotI2VuZGlmCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKQEAgLTg1LDExICs4MiwxMyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6bGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKIHsKICAgICBBTE9HVigibGlzdE1vZHVsZXMiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQob3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMTA2LDEyICsxMDUsMTQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6YXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6YXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGVJbnRlcmZhY2UpCiB7CiAgICAgQUxPR1YoImF0dGFjaCBtb2R1bGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0xMjcsNyArMTI4LDcgQEAKICAgICB9CiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKIAotICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50ID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50KTsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudCA9IG1vZHVsZS0+YWRkQ2xpZW50KGNsaWVudCwgb3BQYWNrYWdlTmFtZSk7CiAgICAgaWYgKG1vZHVsZUNsaWVudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTE1MCwyMCArMTUxLDEyIEBACiB9CiAKIAotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwID0gNjAwMDA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1RpbWVvdXROcyA9IDEgKiBOQU5PU19QRVJfU0VDT05EOwogCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3N0YXRpYyBib29sIGR1bXBUcnlMb2NrKE11dGV4JiBtdXRleCkKIHsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOworICAgIHN0YXR1c190IGVyciA9IG11dGV4LnRpbWVkTG9jayhrRHVtcExvY2tUaW1lb3V0TnMpOworICAgIHJldHVybiBlcnIgPT0gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKQEAgLTE3Miw3ICsxNjUsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTb3VuZFRyaWdnZXJId1NlcnZpY2UiKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobVNlcnZpY2VMb2NrKTsKICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBTb3VuZFRyaWdnZXJId1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAogICAgICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiU291bmRUcmlnZ2VySHdTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKQEAgLTQ5MCw3ICs0ODMsOCBAQAogfQogCiBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudD4KLVNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCkKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjphZGRDbGllbnQoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50OwpAQCAtNTAxLDcgKzQ5NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xpZW50OwogICAgICAgICB9CiAgICAgfQotICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50KTsKKyAgICBtb2R1bGVDbGllbnQgPSBuZXcgTW9kdWxlQ2xpZW50KHRoaXMsIGNsaWVudCwgb3BQYWNrYWdlTmFtZSk7CiAKICAgICBBTE9HVigiYWRkQ2xpZW50KCkgY2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKICAgICBtTW9kdWxlQ2xpZW50cy5hZGQobW9kdWxlQ2xpZW50KTsKQEAgLTU2MiwxMCArNTU2LDcgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBtb2RlbE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImxvYWRTb3VuZE1vZGVsKCkgbW9kZWxNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICopbW9kZWxNZW1vcnktPnBvaW50ZXIoKTsKIApAQCAtNjU5LDExICs2NTAsNiBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChkYXRhTWVtb3J5ID09IDAgfHwgZGF0YU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UmVjb2duaXRpb24oKSBkYXRhTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICB9CiAKICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZyA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICopZGF0YU1lbW9yeS0+cG9pbnRlcigpOwpAQCAtNzI1LDYgKzcxMSwyNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJnZXRNb2RlbFN0YXRlKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtSGFsSW50ZXJmYWNlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCiB7CiAgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKQEAgLTkxMyw4ICs5MTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudCIKIAogU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Ok1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpCi0gOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKKyA6IG1Nb2R1bGUobW9kdWxlKSwgbUNsaWVudChjbGllbnQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogfQogCkBAIC05MzgsNyArOTQ0LDggQEAKIAogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZGV0YWNoKCkgewogICAgIEFMT0dWKCJkZXRhY2goKSIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTYyLDEwICs5NjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBBTE9HVigibG9hZFNvdW5kTW9kZWwoKSBoYW5kbGUiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KG1vZGVsTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC05NzcsNyArOTg4LDggQEAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50Ojp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBTE9HVigidW5sb2FkU291bmRNb2RlbCgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC05OTMsMTAgKzEwMDUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQogewogICAgIEFMT0dWKCJzdGFydFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KGRhdGFNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTEwMDgsNyArMTAyNCw4IEBACiBzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBTE9HVigic3RvcFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTEwMjAsNiArMTAzNywyMiBAQAogICAgIHJldHVybiBtb2R1bGUtPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKIHsKICAgICBBTE9HVigiTW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggNzA4ZmM5OC4uNDNhZDYxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtNDcsMTAgKzQ3LDEyIEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CiAKICAgICAvLyBJU291bmRUcmlnZ2VySHdTZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSk7CiAKQEAgLTEyMiw2ICsxMjQsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBoYWxJbnRlcmZhY2UoKSBjb25zdCB7IHJldHVybiBtSGFsSW50ZXJmYWNlOyB9CiAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcigpIHsgcmV0dXJuIG1EZXNjcmlwdG9yOyB9CkBAIC0xMzIsNyArMTM1LDggQEAKIAogICAgICAgIHZvaWQgc2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpOwogCi0gICAgICAgc3A8TW9kdWxlQ2xpZW50PiBhZGRDbGllbnQoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCk7CisgICAgICAgc3A8TW9kdWxlQ2xpZW50PiBhZGRDbGllbnQoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CiAKICAgICAgICB2b2lkIGRldGFjaChjb25zdCBzcDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpOwogCkBAIC0xNTUsNyArMTU5LDggQEAKICAgICBwdWJsaWM6CiAKICAgICAgICBNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KTsKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgdmlydHVhbCB+TW9kdWxlQ2xpZW50KCk7CiAKQEAgLTE2OSw2ICsxNzQsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTE4OCw2ICsxOTQsNyBAQAogICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHdwPE1vZHVsZT4gICAgICAgICAgICAgICAgICBtTW9kdWxlOwogICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiAgICAgbUNsaWVudDsKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lOwogICAgIH07IC8vIGNsYXNzIE1vZHVsZUNsaWVudAogCiAgICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAppbmRleCAyNTMzMmE0Li5mNWI0YjU5IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAgICAgVU5MT0FEX1NPVU5EX01PREVMLAogICAgIFNUQVJUX1JFQ09HTklUSU9OLAogICAgIFNUT1BfUkVDT0dOSVRJT04sCisgICAgR0VUX01PREVMX1NUQVRFLAogfTsKIAogY2xhc3MgQnBTb3VuZFRyaWdnZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPgpAQCAtMTEzLDYgKzExNCwxOCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01PREVMX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXIiKTsKQEAgLTE2OSw2ICsxODIsMTcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTU9ERUxfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldE1vZGVsU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCBkNDRmNWNiLi5iZDEwN2I0IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC01MCw3ICs1MCw4IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCiAgICAgewogICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIG1vZHVsZXMgPT0gTlVMTCkpIHsKQEAgLTU4LDYgKzU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gKG1vZHVsZXMgPT0gTlVMTCkgPyAwIDogKm51bU1vZHVsZXM7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Nb2R1bGVzUmVxKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTU9EVUxFUywgZGF0YSwgJnJlcGx5KTsKQEAgLTc3LDEyICs3OSwxNCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNILCBkYXRhLCAmcmVwbHkpOwpAQCAtMTIwLDYgKzEyNCwxMSBAQAogICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOwpAQCAtMTMzLDcgKzE0Miw3IEBACiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMobW9kdWxlcywgJm51bU1vZHVsZXMpOworICAgICAgICAgICAgc3RhdHVzID0gbGlzdE1vZHVsZXMob3BQYWNrYWdlTmFtZSwgbW9kdWxlcywgJm51bU1vZHVsZXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOwogICAgICAgICAgICAgQUxPR1YoIkxJU1RfTU9EVUxFUyBzdGF0dXMgJWQgZ290IG51bU1vZHVsZXMgJWQiLCBzdGF0dXMsIG51bU1vZHVsZXMpOwpAQCAtMTUxLDEyICsxNjAsMTcgQEAKIAogICAgICAgICBjYXNlIEFUVEFDSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCA9CiAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+IG1vZHVsZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgbW9kdWxlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGF0dGFjaChvcFBhY2thZ2VOYW1lLCBoYW5kbGUsIGNsaWVudCwgbW9kdWxlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAobW9kdWxlICE9IDApIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjg5YjdiMS4uOTcwOGVhNyAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTgwLDE5ICs4MCwyMSBAQAogfQogCiAvLyBTdGF0aWMgbWV0aG9kcwotc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQorc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQogewogICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7CiAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhtb2R1bGVzLCBudW1Nb2R1bGVzKTsKKyAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMob3BQYWNrYWdlTmFtZSwgbW9kdWxlcywgbnVtTW9kdWxlcyk7CiB9CiAKLXNwPFNvdW5kVHJpZ2dlcj4gU291bmRUcmlnZ2VyOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQorc3A8U291bmRUcmlnZ2VyPiBTb3VuZFRyaWdnZXI6OmF0dGFjaChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIEFMT0dWKCJhdHRhY2goKSIpOwogICAgIHNwPFNvdW5kVHJpZ2dlcj4gc291bmRUcmlnZ2VyOwpAQCAtMTAxLDcgKzEwMyw4IEBACiAgICAgICAgIHJldHVybiBzb3VuZFRyaWdnZXI7CiAgICAgfQogICAgIHNvdW5kVHJpZ2dlciA9IG5ldyBTb3VuZFRyaWdnZXIobW9kdWxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKG1vZHVsZSwgc291bmRUcmlnZ2VyLCBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2gob3BQYWNrYWdlTmFtZSwgbW9kdWxlLCBzb3VuZFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyICE9IDApIHsKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciktPmxpbmtUb0RlYXRoKHNvdW5kVHJpZ2dlcik7CkBAIC0xODgsNiArMTkxLDE1IEBACiAgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKIHZvaWQgU291bmRUcmlnZ2VyOjpvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQogewo=